From a96c80190a07d05b6ad4f71607a08346446727f7 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Thu, 6 Jun 2024 00:29:54 +0800 Subject: [PATCH 01/29] Creaet Unit test --- .../tagBox.tests.js | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js index 74a700e7fc4f..ba5cf88ef3a9 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js @@ -6822,6 +6822,31 @@ QUnit.module('performance', () => { assert.ok($.isFunction(filter), 'filter is function'); }); + QUnit.test('subsequent added values should be correctly displayed when valueExpr is function and hideSelectedItems is enabled (T1234032)', function(assert) { + const load = sinon.stub().returns([{ id: 1, name: 'item1' }, { id: 2, name: 'item2' }]); + + const $tagBox = $('#tagBox').dxTagBox({ + dataSource: { + load + }, + valueExpr() { + return 'id'; + }, + displayExpr: 'name', + hideSelectedItems: true, + opened: true, + }); + + const tagBox = $tagBox.dxTagBox('instance'); + const $item = $(getList(tagBox).find('.dx-list-item').eq(0)); + + $item.trigger('dxclick'); + + const $tagContainer = $tagBox.find(`.${TAGBOX_TAG_CONTAINER_CLASS}`); + + assert.strictEqual($.trim($tagContainer.text()), 'item1item2', 'selected values are displayed correctly'); + }); + QUnit.test('loadOptions.filter should be correct when user filter is also used', function(assert) { const load = sinon.stub().returns([{ id: 1, text: 'item 1' }, { id: 2, text: 'item 2' }]); From c8ad3b7c9456df7c301cf6877b3f7f70e618e4f1 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Thu, 6 Jun 2024 03:29:53 +0800 Subject: [PATCH 02/29] Apply fix --- packages/devextreme/js/__internal/ui/m_tag_box.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/devextreme/js/__internal/ui/m_tag_box.ts b/packages/devextreme/js/__internal/ui/m_tag_box.ts index 76a6f954a577..9a879ba38446 100644 --- a/packages/devextreme/js/__internal/ui/m_tag_box.ts +++ b/packages/devextreme/js/__internal/ui/m_tag_box.ts @@ -977,6 +977,10 @@ const TagBox = (SelectBox as any).inherit({ if (needFilterPlainItems) { const plainItems = this._getPlainItems(); selectedItems = this._filterSelectedItems(plainItems, values); + + if (this.option('hideSelectedItems')) { + return this.option('selectedItems').concat(selectedItems); + } } return selectedItems; From 92018f7848031768226b2300f281eca5643f7b9f Mon Sep 17 00:00:00 2001 From: Joshua Victoria <133762589+jdvictoria@users.noreply.github.com> Date: Thu, 6 Jun 2024 03:40:00 +0800 Subject: [PATCH 03/29] Create TestCafe test --- .../tests/editors/tagBox/tags.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts diff --git a/e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts b/e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts new file mode 100644 index 000000000000..6d9edf81fcef --- /dev/null +++ b/e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts @@ -0,0 +1,45 @@ +import { createScreenshotsComparer } from 'devextreme-screenshot-comparer'; +import TagBox from 'devextreme-testcafe-models/tagBox'; +import { Selector as $ } from 'testcafe'; +import { testScreenshot } from '../../../helpers/themeUtils'; +import url from '../../../helpers/getPageUrl'; +import { createWidget } from '../../../helpers/createWidget'; + +fixture.disablePageReloads`TagBox` + .page(url(__dirname, '../../container.html')); + +const LIST_ITEM_CLASS = 'dx-list-item'; + +test('Tags should be displayed correctly when valueExpr is a function and hideSelectedItems is enabled (T1234032)', async (t) => { + const { takeScreenshot, compareResults } = createScreenshotsComparer(t); + + const tagBox = new TagBox('#container'); + + await t + .click(tagBox.element) + .click($(`.${LIST_ITEM_CLASS}`).nth(0)); + + await t + .click(tagBox.element) + .click($(`.${LIST_ITEM_CLASS}`).nth(0)); + + await t + .click(tagBox.element) + .click($(`.${LIST_ITEM_CLASS}`).nth(0)); + + await testScreenshot(t, takeScreenshot, 'Tag label values are displayed correctly.png', { element: '#container' }); + + await t + .expect(compareResults.isValid()) + .ok(compareResults.errorMessages()); +}).before(async () => createWidget('dxTagBox', { + dataSource: [ + { id: 1, scheme: 'schema 1', name: 'item1' }, + { id: 2, scheme: 'schema 2', name: 'item2' }, + { id: 3, scheme: 'schema 3', name: 'item3' }], + valueExpr(x) { + return x && `${x.name} ${x.scheme}`; + }, + hideSelectedItems: true, + displayExpr: 'name', +})); From b98b6791c9f6f57d649aaabae11b8e2daa8a77f3 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Thu, 6 Jun 2024 05:06:22 +0800 Subject: [PATCH 04/29] Refactor solution and tests --- .../tests/editors/tagBox/tags.ts | 45 ------------------- .../devextreme/js/__internal/ui/m_tag_box.ts | 4 ++ .../tagBox.tests.js | 35 +++++++++++---- 3 files changed, 30 insertions(+), 54 deletions(-) delete mode 100644 e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts diff --git a/e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts b/e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts deleted file mode 100644 index 6d9edf81fcef..000000000000 --- a/e2e/testcafe-devextreme/tests/editors/tagBox/tags.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { createScreenshotsComparer } from 'devextreme-screenshot-comparer'; -import TagBox from 'devextreme-testcafe-models/tagBox'; -import { Selector as $ } from 'testcafe'; -import { testScreenshot } from '../../../helpers/themeUtils'; -import url from '../../../helpers/getPageUrl'; -import { createWidget } from '../../../helpers/createWidget'; - -fixture.disablePageReloads`TagBox` - .page(url(__dirname, '../../container.html')); - -const LIST_ITEM_CLASS = 'dx-list-item'; - -test('Tags should be displayed correctly when valueExpr is a function and hideSelectedItems is enabled (T1234032)', async (t) => { - const { takeScreenshot, compareResults } = createScreenshotsComparer(t); - - const tagBox = new TagBox('#container'); - - await t - .click(tagBox.element) - .click($(`.${LIST_ITEM_CLASS}`).nth(0)); - - await t - .click(tagBox.element) - .click($(`.${LIST_ITEM_CLASS}`).nth(0)); - - await t - .click(tagBox.element) - .click($(`.${LIST_ITEM_CLASS}`).nth(0)); - - await testScreenshot(t, takeScreenshot, 'Tag label values are displayed correctly.png', { element: '#container' }); - - await t - .expect(compareResults.isValid()) - .ok(compareResults.errorMessages()); -}).before(async () => createWidget('dxTagBox', { - dataSource: [ - { id: 1, scheme: 'schema 1', name: 'item1' }, - { id: 2, scheme: 'schema 2', name: 'item2' }, - { id: 3, scheme: 'schema 3', name: 'item3' }], - valueExpr(x) { - return x && `${x.name} ${x.scheme}`; - }, - hideSelectedItems: true, - displayExpr: 'name', -})); diff --git a/packages/devextreme/js/__internal/ui/m_tag_box.ts b/packages/devextreme/js/__internal/ui/m_tag_box.ts index 9a879ba38446..7e12581789b3 100644 --- a/packages/devextreme/js/__internal/ui/m_tag_box.ts +++ b/packages/devextreme/js/__internal/ui/m_tag_box.ts @@ -967,6 +967,10 @@ const TagBox = (SelectBox as any).inherit({ }, _shouldGetItemsFromPlain(values) { + if (this.option('hideSelectedItems')) { + return values && this._dataController.isLoaded(); + } + return values && this._dataController.isLoaded() && values.length <= this._getPlainItems().length; }, diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js index ba5cf88ef3a9..5fd80fd366fb 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js @@ -6823,14 +6823,18 @@ QUnit.module('performance', () => { }); QUnit.test('subsequent added values should be correctly displayed when valueExpr is function and hideSelectedItems is enabled (T1234032)', function(assert) { - const load = sinon.stub().returns([{ id: 1, name: 'item1' }, { id: 2, name: 'item2' }]); + const dataSource = [ + { id: 1, scheme: 'schema 1', name: 'item1' }, + { id: 2, scheme: 'schema 2', name: 'item2' }, + { id: 3, scheme: 'schema 3', name: 'item3' }, + { id: 4, scheme: 'schema 4', name: 'item4' }, + { id: 5, scheme: 'schema 5', name: 'item5' }, + ]; const $tagBox = $('#tagBox').dxTagBox({ - dataSource: { - load - }, - valueExpr() { - return 'id'; + dataSource, + valueExpr(x) { + return x && x.name + ' ' + x.scheme; }, displayExpr: 'name', hideSelectedItems: true, @@ -6838,13 +6842,26 @@ QUnit.module('performance', () => { }); const tagBox = $tagBox.dxTagBox('instance'); - const $item = $(getList(tagBox).find('.dx-list-item').eq(0)); + const list = tagBox._list; + const $list = list.$element(); - $item.trigger('dxclick'); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + + tagBox.open(); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + + tagBox.open(); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + + tagBox.open(); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + + tagBox.open(); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); const $tagContainer = $tagBox.find(`.${TAGBOX_TAG_CONTAINER_CLASS}`); - assert.strictEqual($.trim($tagContainer.text()), 'item1item2', 'selected values are displayed correctly'); + assert.strictEqual($.trim($tagContainer.text()), 'item1item2item3item4item5', 'selected values are displayed correctly'); }); QUnit.test('loadOptions.filter should be correct when user filter is also used', function(assert) { From f5810dcf2ac06871df797fff22282db424eae3f1 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Thu, 6 Jun 2024 05:10:28 +0800 Subject: [PATCH 05/29] Fix labels --- .../tests/DevExpress.ui.widgets.editors/tagBox.tests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js index 5fd80fd366fb..377b78c53ab5 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js @@ -6822,7 +6822,7 @@ QUnit.module('performance', () => { assert.ok($.isFunction(filter), 'filter is function'); }); - QUnit.test('subsequent added values should be correctly displayed when valueExpr is function and hideSelectedItems is enabled (T1234032)', function(assert) { + QUnit.test('Tag labels should be correctly displayed with valueExpr as function and hideSelectedItems enabled (T1234032)', function(assert) { const dataSource = [ { id: 1, scheme: 'schema 1', name: 'item1' }, { id: 2, scheme: 'schema 2', name: 'item2' }, @@ -6861,7 +6861,7 @@ QUnit.module('performance', () => { const $tagContainer = $tagBox.find(`.${TAGBOX_TAG_CONTAINER_CLASS}`); - assert.strictEqual($.trim($tagContainer.text()), 'item1item2item3item4item5', 'selected values are displayed correctly'); + assert.strictEqual($.trim($tagContainer.text()), 'item1item2item3item4item5', 'label values are displayed correctly'); }); QUnit.test('loadOptions.filter should be correct when user filter is also used', function(assert) { From 10dc0f638976d85ca7b15ce74c4c09a297617c4e Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Thu, 6 Jun 2024 17:28:00 +0800 Subject: [PATCH 06/29] Fix label --- .../testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js index 377b78c53ab5..873ed939c170 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js @@ -6822,7 +6822,7 @@ QUnit.module('performance', () => { assert.ok($.isFunction(filter), 'filter is function'); }); - QUnit.test('Tag labels should be correctly displayed with valueExpr as function and hideSelectedItems enabled (T1234032)', function(assert) { + QUnit.test('tag labels should be correctly displayed with valueExpr as function and hideSelectedItems enabled (T1234032)', function(assert) { const dataSource = [ { id: 1, scheme: 'schema 1', name: 'item1' }, { id: 2, scheme: 'schema 2', name: 'item2' }, From 9227c7176ed9a46a00358285d3e197af042eaaf9 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Fri, 7 Jun 2024 14:05:34 +0800 Subject: [PATCH 07/29] Refactor solution --- packages/devextreme/js/__internal/ui/m_tag_box.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/m_tag_box.ts b/packages/devextreme/js/__internal/ui/m_tag_box.ts index 7e12581789b3..02a16a084cfc 100644 --- a/packages/devextreme/js/__internal/ui/m_tag_box.ts +++ b/packages/devextreme/js/__internal/ui/m_tag_box.ts @@ -967,11 +967,15 @@ const TagBox = (SelectBox as any).inherit({ }, _shouldGetItemsFromPlain(values) { + if (!values || !this._dataController.isLoaded()) { + return false; + } + if (this.option('hideSelectedItems')) { - return values && this._dataController.isLoaded(); + return true; } - return values && this._dataController.isLoaded() && values.length <= this._getPlainItems().length; + return values.length <= this._getPlainItems().length; }, _getItemsFromPlain(values) { @@ -980,11 +984,9 @@ const TagBox = (SelectBox as any).inherit({ if (needFilterPlainItems) { const plainItems = this._getPlainItems(); - selectedItems = this._filterSelectedItems(plainItems, values); + const filteredItems = this._filterSelectedItems(plainItems, values); - if (this.option('hideSelectedItems')) { - return this.option('selectedItems').concat(selectedItems); - } + selectedItems = this.option('hideSelectedItems') ? this.option('selectedItems').concat(filteredItems) : filteredItems; } return selectedItems; From 875d1f5dad71b09a9bfe80286d68cbc533e78732 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Tue, 11 Jun 2024 15:06:55 +0800 Subject: [PATCH 08/29] reduce unnecessary data --- .../DevExpress.ui.widgets.editors/tagBox.tests.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js index 873ed939c170..c574bafdbf4a 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js @@ -6827,8 +6827,6 @@ QUnit.module('performance', () => { { id: 1, scheme: 'schema 1', name: 'item1' }, { id: 2, scheme: 'schema 2', name: 'item2' }, { id: 3, scheme: 'schema 3', name: 'item3' }, - { id: 4, scheme: 'schema 4', name: 'item4' }, - { id: 5, scheme: 'schema 5', name: 'item5' }, ]; const $tagBox = $('#tagBox').dxTagBox({ @@ -6853,15 +6851,9 @@ QUnit.module('performance', () => { tagBox.open(); $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); - tagBox.open(); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); - - tagBox.open(); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); - const $tagContainer = $tagBox.find(`.${TAGBOX_TAG_CONTAINER_CLASS}`); - assert.strictEqual($.trim($tagContainer.text()), 'item1item2item3item4item5', 'label values are displayed correctly'); + assert.strictEqual($.trim($tagContainer.text()), 'item1item2item3', 'label values are displayed correctly'); }); QUnit.test('loadOptions.filter should be correct when user filter is also used', function(assert) { From dfd8a8227485d7087a12fcc939aa5d36762d5f56 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Tue, 11 Jun 2024 16:07:38 +0800 Subject: [PATCH 09/29] add runtime change test --- .../tagBox.tests.js | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js index c574bafdbf4a..58d0ea7f1c3a 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js @@ -6822,38 +6822,43 @@ QUnit.module('performance', () => { assert.ok($.isFunction(filter), 'filter is function'); }); - QUnit.test('tag labels should be correctly displayed with valueExpr as function and hideSelectedItems enabled (T1234032)', function(assert) { - const dataSource = [ - { id: 1, scheme: 'schema 1', name: 'item1' }, - { id: 2, scheme: 'schema 2', name: 'item2' }, - { id: 3, scheme: 'schema 3', name: 'item3' }, - ]; + [false, true].forEach(changeAtRuntime => { + QUnit.test(`tag labels should be correctly displayed with valueExpr as function and hideSelectedItems enabled ${changeAtRuntime ? 'at runtime' : ''} (T1234032)`, function(assert) { + const dataSource = [ + { id: 1, scheme: 'schema 1', name: 'item1' }, + { id: 2, scheme: 'schema 2', name: 'item2' }, + { id: 3, scheme: 'schema 3', name: 'item3' }, + ]; - const $tagBox = $('#tagBox').dxTagBox({ - dataSource, - valueExpr(x) { - return x && x.name + ' ' + x.scheme; - }, - displayExpr: 'name', - hideSelectedItems: true, - opened: true, - }); + const $tagBox = $('#tagBox').dxTagBox({ + dataSource, + valueExpr(x) { + return x && x.name + ' ' + x.scheme; + }, + displayExpr: 'name', + hideSelectedItems: !changeAtRuntime, + opened: true, + }); - const tagBox = $tagBox.dxTagBox('instance'); - const list = tagBox._list; - const $list = list.$element(); + const tagBox = $tagBox.dxTagBox('instance'); + const $list = tagBox._list.$element(); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + if(changeAtRuntime) { + tagBox.option('hideSelectedItems', true); + } - tagBox.open(); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); - tagBox.open(); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + tagBox.open(); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); - const $tagContainer = $tagBox.find(`.${TAGBOX_TAG_CONTAINER_CLASS}`); + tagBox.open(); + $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); - assert.strictEqual($.trim($tagContainer.text()), 'item1item2item3', 'label values are displayed correctly'); + const $tagContainer = $tagBox.find(`.${TAGBOX_TAG_CONTAINER_CLASS}`); + + assert.strictEqual($.trim($tagContainer.text()), 'item1item2item3', 'label values are displayed correctly'); + }); }); QUnit.test('loadOptions.filter should be correct when user filter is also used', function(assert) { From d66f35bc7c4fa23dd30f6d01d8a41748040bce4e Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Tue, 11 Jun 2024 18:42:27 +0800 Subject: [PATCH 10/29] refactor fix --- packages/devextreme/js/__internal/ui/m_tag_box.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/m_tag_box.ts b/packages/devextreme/js/__internal/ui/m_tag_box.ts index 02a16a084cfc..eb0534463b8d 100644 --- a/packages/devextreme/js/__internal/ui/m_tag_box.ts +++ b/packages/devextreme/js/__internal/ui/m_tag_box.ts @@ -984,9 +984,11 @@ const TagBox = (SelectBox as any).inherit({ if (needFilterPlainItems) { const plainItems = this._getPlainItems(); - const filteredItems = this._filterSelectedItems(plainItems, values); + selectedItems = this._filterSelectedItems(plainItems, values); - selectedItems = this.option('hideSelectedItems') ? this.option('selectedItems').concat(filteredItems) : filteredItems; + if (this.option('hideSelectedItems')) { + selectedItems = (selectedItems || []).concat(this.option('selectedItems') || []); + } } return selectedItems; From 2287059c7056fd3746f1324771c856ad216da817 Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Fri, 14 Jun 2024 13:57:44 +0800 Subject: [PATCH 11/29] revert fix --- packages/devextreme/js/__internal/ui/m_tag_box.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/m_tag_box.ts b/packages/devextreme/js/__internal/ui/m_tag_box.ts index ac324d19a46d..3ec7377138c2 100644 --- a/packages/devextreme/js/__internal/ui/m_tag_box.ts +++ b/packages/devextreme/js/__internal/ui/m_tag_box.ts @@ -967,15 +967,7 @@ const TagBox = (SelectBox as any).inherit({ }, _shouldGetItemsFromPlain(values) { - if (!values || !this._dataController.isLoaded()) { - return false; - } - - if (this.option('hideSelectedItems')) { - return true; - } - - return values.length <= this._getPlainItems().length; + return values && this._dataController.isLoaded() && values.length <= this._getPlainItems().length; }, _getItemsFromPlain(values) { @@ -985,10 +977,6 @@ const TagBox = (SelectBox as any).inherit({ if (needFilterPlainItems) { const plainItems = this._getPlainItems(); selectedItems = this._filterSelectedItems(plainItems, values); - - if (this.option('hideSelectedItems')) { - selectedItems = (selectedItems || []).concat(this.option('selectedItems') || []); - } } return selectedItems; From 4ab4efcce98bc3c526952b65a9b0adbd1dcfcc5e Mon Sep 17 00:00:00 2001 From: Joshua Victoria Date: Fri, 14 Jun 2024 13:57:53 +0800 Subject: [PATCH 12/29] refactor tests --- .../DevExpress.ui.widgets.editors/tagBox.tests.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js index a99358e2c85d..3e054cd73df3 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.editors/tagBox.tests.js @@ -6843,17 +6843,15 @@ QUnit.module('performance', () => { const tagBox = $tagBox.dxTagBox('instance'); const $list = tagBox._list.$element(); - if(changeAtRuntime) { - tagBox.option('hideSelectedItems', true); - } + tagBox.option('hideSelectedItems', true); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + $($list.find(`.${LIST_ITEM_CLASS}`).eq(0)).trigger('dxclick'); tagBox.open(); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + $($list.find(`.${LIST_ITEM_CLASS}`).eq(0)).trigger('dxclick'); tagBox.open(); - $($list.find('.dx-list-item').eq(0)).trigger('dxclick'); + $($list.find(`.${LIST_ITEM_CLASS}`).eq(0)).trigger('dxclick'); const $tagContainer = $tagBox.find(`.${TAGBOX_TAG_CONTAINER_CLASS}`); From 159d863b209fafd45f49778517e2911654d10c08 Mon Sep 17 00:00:00 2001 From: Alex Lavrov <36633600+alexslavr@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:59:47 +0400 Subject: [PATCH 13/29] CI: Branch 24_2 (#27607) --- .github/workflows/codeql.yml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/packages_publishing_scheduler.yml | 2 +- .github/workflows/paths.yml | 2 +- .github/workflows/playgrounds_tests.yml | 2 +- .github/workflows/qunit_tests-additional-renovation.yml | 2 +- .github/workflows/qunit_tests-renovation.yml | 2 +- .github/workflows/renovation.yml | 2 +- .github/workflows/styles.yml | 2 +- .github/workflows/testcafe_tests.yml | 2 +- .github/workflows/themebuilder_tests.yml | 2 +- .github/workflows/ts_declarations.yml | 2 +- .github/workflows/wrapper_tests.yml | 2 +- apps/demos/menuMeta.json | 7 +------ packages/devextreme/ports.json | 4 ++-- 15 files changed, 16 insertions(+), 21 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ca6fff5a9761..8cee6837275e 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - branch: [ '22_1', '22_2', '23_1', '23_2', '24_1' ] + branch: [ '22_2', '23_1', '23_2', '24_1', '24_2' ] language: [ 'csharp', 'javascript' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ab830ad0ff81..d7f4661f3f8b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/packages_publishing_scheduler.yml b/.github/workflows/packages_publishing_scheduler.yml index 5d3695f239ce..656ef6bd8030 100644 --- a/.github/workflows/packages_publishing_scheduler.yml +++ b/.github/workflows/packages_publishing_scheduler.yml @@ -12,7 +12,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} strategy: matrix: - branch: ['23_2', '24_1'] + branch: ['23_2', '24_1', '24_2'] name: Run Packages Publishing workflow steps: diff --git a/.github/workflows/paths.yml b/.github/workflows/paths.yml index 2b9fa1620bfc..a2a0539386fb 100644 --- a/.github/workflows/paths.yml +++ b/.github/workflows/paths.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: MAX_LENGTH: 170 diff --git a/.github/workflows/playgrounds_tests.yml b/.github/workflows/playgrounds_tests.yml index 77200ed5dd36..ee06f91b0069 100644 --- a/.github/workflows/playgrounds_tests.yml +++ b/.github/workflows/playgrounds_tests.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/qunit_tests-additional-renovation.yml b/.github/workflows/qunit_tests-additional-renovation.yml index 5705f6a1e536..5d69d103a228 100644 --- a/.github/workflows/qunit_tests-additional-renovation.yml +++ b/.github/workflows/qunit_tests-additional-renovation.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/qunit_tests-renovation.yml b/.github/workflows/qunit_tests-renovation.yml index aadbca641f50..c9d1e0c98e0b 100644 --- a/.github/workflows/qunit_tests-renovation.yml +++ b/.github/workflows/qunit_tests-renovation.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/renovation.yml b/.github/workflows/renovation.yml index 30d77607e93e..be3f1286502e 100644 --- a/.github/workflows/renovation.yml +++ b/.github/workflows/renovation.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/styles.yml b/.github/workflows/styles.yml index 960f27314c7a..8de3b42d4f4a 100644 --- a/.github/workflows/styles.yml +++ b/.github/workflows/styles.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/testcafe_tests.yml b/.github/workflows/testcafe_tests.yml index 8d7cca54bec4..a03b6906f166 100644 --- a/.github/workflows/testcafe_tests.yml +++ b/.github/workflows/testcafe_tests.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/themebuilder_tests.yml b/.github/workflows/themebuilder_tests.yml index 887f31941f26..12fe6e6098e7 100644 --- a/.github/workflows/themebuilder_tests.yml +++ b/.github/workflows/themebuilder_tests.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/.github/workflows/ts_declarations.yml b/.github/workflows/ts_declarations.yml index 16112ce748e1..293272236b24 100644 --- a/.github/workflows/ts_declarations.yml +++ b/.github/workflows/ts_declarations.yml @@ -7,7 +7,7 @@ concurrency: on: pull_request: push: - branches: [24_1] + branches: [24_2] jobs: check-ts-bundle: diff --git a/.github/workflows/wrapper_tests.yml b/.github/workflows/wrapper_tests.yml index 02386c6f5c68..64f58d1d3985 100644 --- a/.github/workflows/wrapper_tests.yml +++ b/.github/workflows/wrapper_tests.yml @@ -3,7 +3,7 @@ name: DevExtreme Wrappers Tests on: pull_request: push: - branches: [24_1] + branches: [24_2] env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} diff --git a/apps/demos/menuMeta.json b/apps/demos/menuMeta.json index 2b0e16dd5687..fd9aeff95527 100644 --- a/apps/demos/menuMeta.json +++ b/apps/demos/menuMeta.json @@ -3821,7 +3821,6 @@ "Title": "Scrolling", "Name": "Scrolling", "Widget": "Menu", - "Badge": "New", "DemoType": "Web" } ] @@ -4170,7 +4169,6 @@ "Title": "Overview", "Name": "Overview", "Widget": "Splitter", - "Badge": "New", "DemoType": "Web" } ] @@ -4727,8 +4725,7 @@ { "Title": "Grouped Fields", "Name": "GroupedFields", - "Widget": "Form", - "Badge": "Updated" + "Widget": "Form" }, { "Title": "Columns Adaptability", @@ -5194,7 +5191,6 @@ { "Title": "Overview", "Name": "Overview", - "Badge": "Updated", "DocUrl": "", "Widget": "DropDownButton", "DemoType": "Web", @@ -5224,7 +5220,6 @@ "Title": "Scrolling", "Name": "Scrolling", "Widget": "ContextMenu", - "Badge": "New", "DemoType": "Web" }, { diff --git a/packages/devextreme/ports.json b/packages/devextreme/ports.json index 1b762e33b264..729287722a58 100644 --- a/packages/devextreme/ports.json +++ b/packages/devextreme/ports.json @@ -1,4 +1,4 @@ { - "qunit": "20030", - "vectormap-utils-tester": "20031" + "qunit": "20040", + "vectormap-utils-tester": "20041" } From 7af7685640881145fb3bd794248f72c29170a53f Mon Sep 17 00:00:00 2001 From: EugeniyKiyashko Date: Tue, 18 Jun 2024 17:36:27 +0400 Subject: [PATCH 14/29] revert: Fix modules relative paths after moving Demos (#27563) (#27612) (#27613) --- apps/demos/utils/bundle/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/demos/utils/bundle/index.js b/apps/demos/utils/bundle/index.js index 940bef0f9b8e..4e8f7184674d 100644 --- a/apps/demos/utils/bundle/index.js +++ b/apps/demos/utils/bundle/index.js @@ -9,6 +9,7 @@ const url = require('url'); // https://stackoverflow.com/questions/42412965/how-to-load-named-exports-with-systemjs/47108328 const prepareModulesToNamedImport = () => { const modules = [ + 'time_zone_utils.js', 'localization.js', 'viz/export.js', 'viz/core/export.js', @@ -22,9 +23,8 @@ const prepareModulesToNamedImport = () => { ]; const paths = [ - '../npm-scripts/npm-devextreme/cjs', // un-used / legacy? - 'node_modules/devextreme/cjs', // 24.1+ migrated from devextreme-demos, kept as is / likely un-used, but works ok in mono repo - '../../node_modules/devextreme/cjs', // 24.1+ wg / individual em modules are not discovered + '../npm-scripts/npm-devextreme/cjs', + 'node_modules/devextreme/cjs', ]; const esModuleExport = 'exports.__esModule = true;'; From 78b84258de1cd490278e43ccea9bdbde96784ed9 Mon Sep 17 00:00:00 2001 From: dxrobot Date: Tue, 18 Jun 2024 18:08:39 +0400 Subject: [PATCH 15/29] Bump devextreme version (24.2.0) (#27608) Co-authored-by: alexlavrov --- apps/angular/package.json | 6 +- apps/demos/package.json | 12 +-- apps/react-storybook/package.json | 6 +- apps/react/package.json | 6 +- apps/vue/package.json | 6 +- e2e/bundlers/package.json | 2 +- e2e/compilation-cases/package.json | 2 +- e2e/testcafe-devextreme/package.json | 4 +- package-lock.json | 80 +++++++++---------- package.json | 4 +- packages/devextreme-angular/package.json | 4 +- .../devextreme-monorepo-tools/package.json | 2 +- packages/devextreme-react/package.json | 4 +- packages/devextreme-themebuilder/package.json | 2 +- packages/devextreme-vue/package.json | 4 +- .../npm/devextreme-dist/package.json | 2 +- .../artifacts/npm/devextreme/package.json | 2 +- packages/devextreme/js/core/version.js | 4 +- packages/devextreme/package.json | 2 +- packages/testcafe-models/package.json | 2 +- 20 files changed, 78 insertions(+), 78 deletions(-) diff --git a/apps/angular/package.json b/apps/angular/package.json index 395ef4f32b03..9cc3c4ef4f2d 100644 --- a/apps/angular/package.json +++ b/apps/angular/package.json @@ -2,7 +2,7 @@ "name": "devextreme-angular-playground", "description": "DevExtreme Angular UI and Visualization Components", "private": true, - "version": "24.1.3", + "version": "24.2.0", "author": "Developer Express Inc.", "license": "MIT", "dependencies": { @@ -16,8 +16,8 @@ "@angular/platform-browser-dynamic": "~16.2.12", "@angular/router": "~16.2.12", "core-js": "^2.6.12", - "devextreme": "~24.1.3", - "devextreme-angular": "~24.1.3", + "devextreme": "~24.2.0", + "devextreme-angular": "~24.2.0", "rxjs": "^6.6.7", "tslib": "^2.6.1", "zone.js": "0.13.0" diff --git a/apps/demos/package.json b/apps/demos/package.json index 787350ce17b6..8a0b762c204c 100644 --- a/apps/demos/package.json +++ b/apps/demos/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-demos", - "version": "24.1.3", + "version": "24.2.0", "description": "", "repository": { "type": "git", @@ -8,11 +8,11 @@ }, "author": "Developer Express Inc.", "peerDependencies": { - "devextreme": "~24.1.3", - "devextreme-angular": "~24.1.3", - "devextreme-dist": "~24.1.3", - "devextreme-react": "~24.1.3", - "devextreme-vue": "~24.1.3" + "devextreme": "~24.2.0", + "devextreme-angular": "~24.2.0", + "devextreme-dist": "~24.2.0", + "devextreme-react": "~24.2.0", + "devextreme-vue": "~24.2.0" }, "dependencies": { "@angular/common": "~16.2.12", diff --git a/apps/react-storybook/package.json b/apps/react-storybook/package.json index cb489ac9bb16..ed615b567e87 100644 --- a/apps/react-storybook/package.json +++ b/apps/react-storybook/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-react-storybook", - "version": "24.1.3", + "version": "24.2.0", "description": "", "main": "index.js", "scripts": { @@ -11,8 +11,8 @@ "author": "", "license": "ISC", "dependencies": { - "devextreme": "~24.1.3", - "devextreme-react": "~24.1.3" + "devextreme": "~24.2.0", + "devextreme-react": "~24.2.0" }, "devDependencies": { "@storybook/addon-essentials": "^7.6.9", diff --git a/apps/react/package.json b/apps/react/package.json index 9a463f97fe5b..7472df37b3f3 100644 --- a/apps/react/package.json +++ b/apps/react/package.json @@ -2,15 +2,15 @@ "author": "Developer Express Inc.", "name": "devextreme-react-playground", "private": true, - "version": "24.1.3", + "version": "24.2.0", "description": "DevExtreme React UI and Visualization Components Sandbox", "repository": { "type": "git", "url": "https://github.com/DevExpress/devextreme-react.git" }, "dependencies": { - "devextreme": "~24.1.3", - "devextreme-react": "~24.1.3", + "devextreme": "~24.2.0", + "devextreme-react": "~24.2.0", "react": "~18.0.0", "react-dom": "~18.0.0" }, diff --git a/apps/vue/package.json b/apps/vue/package.json index 809fb7f8a14d..fb1effe1ba7d 100644 --- a/apps/vue/package.json +++ b/apps/vue/package.json @@ -2,7 +2,7 @@ "name": "devextreme-vue-playground", "description": "DevExtreme Vue UI and Visualization Components", "private": true, - "version": "24.1.3", + "version": "24.2.0", "author": "Developer Express Inc.", "license": "MIT", "repository": { @@ -10,8 +10,8 @@ "url": "https://github.com/DevExpress/devextreme-vue.git" }, "dependencies": { - "devextreme": "~24.1.3", - "devextreme-vue": "~24.1.3", + "devextreme": "~24.2.0", + "devextreme-vue": "~24.2.0", "vue": "3.2.47" }, "devDependencies": { diff --git a/e2e/bundlers/package.json b/e2e/bundlers/package.json index 94e9ce83b53d..af7ddc3e6cba 100644 --- a/e2e/bundlers/package.json +++ b/e2e/bundlers/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-modules-test", - "version": "1.0.0", + "version": "24.2.0", "devDependencies": { "@rollup/plugin-alias": "3.1.9", "@rollup/plugin-commonjs": "19.0.2", diff --git a/e2e/compilation-cases/package.json b/e2e/compilation-cases/package.json index b5aef66c7939..61268a69c386 100644 --- a/e2e/compilation-cases/package.json +++ b/e2e/compilation-cases/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "devextreme-compilation-cases", - "version": "24.1.3", + "version": "24.2.0", "author": "Developer Express Inc.", "scripts": { "test": "tsc --noEmit" diff --git a/e2e/testcafe-devextreme/package.json b/e2e/testcafe-devextreme/package.json index 7976bd77d6e0..5d9b9255f366 100644 --- a/e2e/testcafe-devextreme/package.json +++ b/e2e/testcafe-devextreme/package.json @@ -1,13 +1,13 @@ { "name": "devextreme-testcafe-tests", - "version": "24.1.3", + "version": "24.2.0", "scripts": { "test": "node ./runner.js", "lint": "eslint --ext .js,.ts .", "update-failed-etalons": "node update_failed_etalons.mjs" }, "devDependencies": { - "devextreme": "~24.1.3", + "devextreme": "~24.2.0", "testcafe": "2.5.0" } } diff --git a/package-lock.json b/package-lock.json index bc0a761a4b06..fe09eb66d6f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "devextreme-monorepo", - "version": "24.1.3", + "version": "24.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "devextreme-monorepo", - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "workspaces": [ "apps/*", @@ -41,7 +41,7 @@ "@types/yargs": "^17.0.32", "cheerio": "1.0.0-rc.10", "codelyzer": "^6.0.2", - "devextreme-internal-tools": "14.0.0-beta.5", + "devextreme-internal-tools": "14.0.0-beta.6", "eslint": "8.57.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-typescript": "17.1.0", @@ -81,7 +81,7 @@ }, "apps/angular": { "name": "devextreme-angular-playground", - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "dependencies": { "@angular/animations": "~16.2.12", @@ -94,8 +94,8 @@ "@angular/platform-browser-dynamic": "~16.2.12", "@angular/router": "~16.2.12", "core-js": "^2.6.12", - "devextreme": "~24.1.3", - "devextreme-angular": "~24.1.3", + "devextreme": "~24.2.0", + "devextreme-angular": "~24.2.0", "rxjs": "^6.6.7", "tslib": "^2.6.1", "zone.js": "0.13.0" @@ -1810,7 +1810,7 @@ }, "apps/demos": { "name": "devextreme-demos", - "version": "24.1.3", + "version": "24.2.0", "license": "SEE LICENSE IN README.md", "dependencies": { "@angular/cli": "~16.2.12", @@ -1905,11 +1905,11 @@ "ts-node": "10.9.2" }, "peerDependencies": { - "devextreme": "~24.1.3", - "devextreme-angular": "~24.1.3", - "devextreme-dist": "~24.1.3", - "devextreme-react": "~24.1.3", - "devextreme-vue": "~24.1.3" + "devextreme": "~24.2.0", + "devextreme-angular": "~24.2.0", + "devextreme-dist": "~24.2.0", + "devextreme-react": "~24.2.0", + "devextreme-vue": "~24.2.0" } }, "apps/demos/node_modules/@angular-devkit/core": { @@ -3703,11 +3703,11 @@ }, "apps/react": { "name": "devextreme-react-playground", - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "dependencies": { - "devextreme": "~24.1.3", - "devextreme-react": "~24.1.3", + "devextreme": "~24.2.0", + "devextreme-react": "~24.2.0", "react": "~18.0.0", "react-dom": "~18.0.0" }, @@ -3726,11 +3726,11 @@ }, "apps/react-storybook": { "name": "devextreme-react-storybook", - "version": "24.1.3", + "version": "24.2.0", "license": "ISC", "dependencies": { - "devextreme": "~24.1.3", - "devextreme-react": "~24.1.3" + "devextreme": "~24.2.0", + "devextreme-react": "~24.2.0" }, "devDependencies": { "@storybook/addon-essentials": "^7.6.9", @@ -4581,11 +4581,11 @@ }, "apps/vue": { "name": "devextreme-vue-playground", - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "dependencies": { - "devextreme": "~24.1.3", - "devextreme-vue": "~24.1.3", + "devextreme": "~24.2.0", + "devextreme-vue": "~24.2.0", "vue": "3.2.47" }, "devDependencies": { @@ -5791,7 +5791,7 @@ }, "e2e/bundlers": { "name": "devextreme-modules-test", - "version": "1.0.0", + "version": "24.2.0", "devDependencies": { "@rollup/plugin-alias": "3.1.9", "@rollup/plugin-commonjs": "19.0.2", @@ -6056,7 +6056,7 @@ }, "e2e/compilation-cases": { "name": "devextreme-compilation-cases", - "version": "24.1.3", + "version": "24.2.0", "devDependencies": { "@angular/common": "^11.2.14", "@types/jquery": "3.5.29", @@ -6123,9 +6123,9 @@ }, "e2e/testcafe-devextreme": { "name": "devextreme-testcafe-tests", - "version": "24.1.3", + "version": "24.2.0", "devDependencies": { - "devextreme": "~24.1.3", + "devextreme": "~24.2.0", "testcafe": "2.5.0" } }, @@ -28736,9 +28736,9 @@ "link": true }, "node_modules/devextreme-internal-tools": { - "version": "14.0.0-beta.5", - "resolved": "https://registry.npmjs.org/devextreme-internal-tools/-/devextreme-internal-tools-14.0.0-beta.5.tgz", - "integrity": "sha512-HuswhGy8ZwCNmafGw5M+DlUvTSloNR2QK006Kvy7kOBdw814O81XG8lw4XlUJN5SZ6hq+Mi8ls1NLLoQtpbbDQ==", + "version": "14.0.0-beta.6", + "resolved": "https://registry.npmjs.org/devextreme-internal-tools/-/devextreme-internal-tools-14.0.0-beta.6.tgz", + "integrity": "sha512-9f3U1jWL0RdegUvo2mciVA4EOI9aCsPaKMk9VByRYIUGL6iQLPnlSkjpnn4Yd4CIuuoYpKEH1vNIyKC3HCffcQ==", "dev": true, "dependencies": { "dasherize": "2.0.0", @@ -65642,7 +65642,7 @@ }, "packages/devextreme": { "name": "devextreme-main", - "version": "24.1.3", + "version": "24.2.0", "hasInstallScript": true, "license": "SEE LICENSE IN README.md", "dependencies": { @@ -65785,7 +65785,7 @@ } }, "packages/devextreme-angular": { - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "dependencies": { "@angular-devkit/schematics": "16.2.14", @@ -65833,7 +65833,7 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@angular/forms": ">=16.0.0", - "devextreme": "~24.1.3" + "devextreme": "~24.2.0" } }, "packages/devextreme-angular/node_modules/@angular-devkit/core": { @@ -67768,7 +67768,7 @@ } }, "packages/devextreme-monorepo-tools": { - "version": "24.1.3", + "version": "24.2.0", "devDependencies": { "ts-jest": "^29.1.2" } @@ -67882,7 +67882,7 @@ } }, "packages/devextreme-react": { - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "dependencies": { "prop-types": "^15.8.1" @@ -67904,7 +67904,7 @@ "typescript": "~4.9" }, "peerDependencies": { - "devextreme": "~24.1.3", + "devextreme": "~24.2.0", "react": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -68166,7 +68166,7 @@ } }, "packages/devextreme-themebuilder": { - "version": "24.1.3", + "version": "24.2.0", "license": "SEE LICENSE IN README.md", "dependencies": { "autoprefixer": "^10.4.7", @@ -68382,7 +68382,7 @@ } }, "packages/devextreme-vue": { - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "devDependencies": { "@vue/compiler-sfc": "^3.0.0", @@ -68399,7 +68399,7 @@ "vue-router": "^4.0.16" }, "peerDependencies": { - "devextreme": "~24.1.3", + "devextreme": "~24.2.0", "vue": "^3.0.0" } }, @@ -68698,7 +68698,7 @@ } }, "packages/devextreme/artifacts/npm/devextreme": { - "version": "24.1.3", + "version": "24.2.0", "license": "SEE LICENSE IN README.md", "dependencies": { "@babel/runtime": "^7.12.1", @@ -68719,7 +68719,7 @@ } }, "packages/devextreme/artifacts/npm/devextreme-dist": { - "version": "24.1.3" + "version": "24.2.0" }, "packages/devextreme/js/__internal/.eslint-tmp-local-plugin": { "name": "eslint-plugin-forbidden-imports", @@ -68961,7 +68961,7 @@ }, "packages/testcafe-models": { "name": "devextreme-testcafe-models", - "version": "24.1.3", + "version": "24.2.0", "peerDependencies": { "testcafe": "*" } diff --git a/package.json b/package.json index c43facec9d41..a07898d70f8a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-monorepo", - "version": "24.1.3", + "version": "24.2.0", "license": "MIT", "author": "Developer Express Inc.", "scripts": { @@ -54,7 +54,7 @@ "@types/yargs": "^17.0.32", "cheerio": "1.0.0-rc.10", "codelyzer": "^6.0.2", - "devextreme-internal-tools": "14.0.0-beta.5", + "devextreme-internal-tools": "14.0.0-beta.6", "eslint": "8.57.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-typescript": "17.1.0", diff --git a/packages/devextreme-angular/package.json b/packages/devextreme-angular/package.json index 63176be6d47f..54a626c7675a 100644 --- a/packages/devextreme-angular/package.json +++ b/packages/devextreme-angular/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-angular", - "version": "24.1.3", + "version": "24.2.0", "description": "Angular UI and visualization components based on DevExtreme widgets", "repository": { "type": "git", @@ -21,7 +21,7 @@ "@angular/common": ">=16.0.0", "@angular/core": ">=16.0.0", "@angular/forms": ">=16.0.0", - "devextreme": "~24.1.3" + "devextreme": "~24.2.0" }, "devDependencies": { "@webcomponents/custom-elements": "^1.6.0", diff --git a/packages/devextreme-monorepo-tools/package.json b/packages/devextreme-monorepo-tools/package.json index 8dda91307ad3..500fe4e7b529 100644 --- a/packages/devextreme-monorepo-tools/package.json +++ b/packages/devextreme-monorepo-tools/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-monorepo-tools", - "version": "24.1.3", + "version": "24.2.0", "devDependencies": { "ts-jest": "^29.1.2" } diff --git a/packages/devextreme-react/package.json b/packages/devextreme-react/package.json index ab449f24fafe..b5e0e9ab70df 100644 --- a/packages/devextreme-react/package.json +++ b/packages/devextreme-react/package.json @@ -1,7 +1,7 @@ { "author": "Developer Express Inc.", "name": "devextreme-react", - "version": "24.1.3", + "version": "24.2.0", "description": "DevExtreme React UI and Visualization Components", "repository": { "type": "git", @@ -24,7 +24,7 @@ ], "license": "MIT", "peerDependencies": { - "devextreme": "~24.1.3", + "devextreme": "~24.2.0", "react": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.2.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, diff --git a/packages/devextreme-themebuilder/package.json b/packages/devextreme-themebuilder/package.json index 230261aee6d8..63ea41b2b9a1 100644 --- a/packages/devextreme-themebuilder/package.json +++ b/packages/devextreme-themebuilder/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-themebuilder", - "version": "24.1.3", + "version": "24.2.0", "description": "DevExtreme ThemeBuilder", "keywords": [ "devextreme", diff --git a/packages/devextreme-vue/package.json b/packages/devextreme-vue/package.json index c0a13acf64df..4d3147bae012 100644 --- a/packages/devextreme-vue/package.json +++ b/packages/devextreme-vue/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-vue", - "version": "24.1.3", + "version": "24.2.0", "description": "DevExtreme Vue UI and Visualization Components", "repository": { "type": "git", @@ -24,7 +24,7 @@ "author": "Developer Express Inc.", "license": "MIT", "peerDependencies": { - "devextreme": "~24.1.3", + "devextreme": "~24.2.0", "vue": "^3.0.0" }, "devDependencies": { diff --git a/packages/devextreme/artifacts/npm/devextreme-dist/package.json b/packages/devextreme/artifacts/npm/devextreme-dist/package.json index 0c75f03ee64f..2127b02e27b0 100644 --- a/packages/devextreme/artifacts/npm/devextreme-dist/package.json +++ b/packages/devextreme/artifacts/npm/devextreme-dist/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-dist", - "version": "24.1.3", + "version": "24.2.0", "description": "HTML5 JavaScript Component Suite for Responsive Web Development", "keywords": [ "html5", diff --git a/packages/devextreme/artifacts/npm/devextreme/package.json b/packages/devextreme/artifacts/npm/devextreme/package.json index ee63ab21eee0..b4c2e58c0d19 100644 --- a/packages/devextreme/artifacts/npm/devextreme/package.json +++ b/packages/devextreme/artifacts/npm/devextreme/package.json @@ -1,6 +1,6 @@ { "name": "devextreme", - "version": "24.1.3", + "version": "24.2.0", "description": "HTML5 JavaScript Component Suite for Responsive Web Development", "keywords": [ "html5", diff --git a/packages/devextreme/js/core/version.js b/packages/devextreme/js/core/version.js index 8e29a8be29be..6d2cd9f2ed16 100644 --- a/packages/devextreme/js/core/version.js +++ b/packages/devextreme/js/core/version.js @@ -1,2 +1,2 @@ -export const version = '24.1.3'; -export const fullVersion = '24.1.3'; +export const version = '24.2.0'; +export const fullVersion = '24.2.0'; diff --git a/packages/devextreme/package.json b/packages/devextreme/package.json index 249bd8fbd0dc..f13d22d56a68 100644 --- a/packages/devextreme/package.json +++ b/packages/devextreme/package.json @@ -1,6 +1,6 @@ { "name": "devextreme-main", - "version": "24.1.3", + "version": "24.2.0", "description": "HTML5 JavaScript Component Suite for Responsive Web Development", "keywords": [ "html5", diff --git a/packages/testcafe-models/package.json b/packages/testcafe-models/package.json index f601281d9ca1..4d99ae6e14f5 100644 --- a/packages/testcafe-models/package.json +++ b/packages/testcafe-models/package.json @@ -3,5 +3,5 @@ "peerDependencies": { "testcafe": "*" }, - "version": "24.1.3" + "version": "24.2.0" } From 48e042bad06161d02d085bfa7350b2db6c2f3798 Mon Sep 17 00:00:00 2001 From: Roman Semenov Date: Tue, 18 Jun 2024 20:20:13 +0400 Subject: [PATCH 16/29] DataGrid - Flickering of cell focus / revert button during DataGrid update, when edited data is saved using keyboard navigation (T1206435) (#27605) --- ...Press.screenshots.ts => editOnKeyPress.ts} | 73 +++++++++++++++++++ .../m_keyboard_navigation.ts | 23 ++++-- .../keyboardNavigation.customization.tests.js | 12 +-- 3 files changed, 94 insertions(+), 14 deletions(-) rename e2e/testcafe-devextreme/tests/dataGrid/keyboardNavigation/{editOnKeyPress.screenshots.ts => editOnKeyPress.ts} (50%) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/keyboardNavigation/editOnKeyPress.screenshots.ts b/e2e/testcafe-devextreme/tests/dataGrid/keyboardNavigation/editOnKeyPress.ts similarity index 50% rename from e2e/testcafe-devextreme/tests/dataGrid/keyboardNavigation/editOnKeyPress.screenshots.ts rename to e2e/testcafe-devextreme/tests/dataGrid/keyboardNavigation/editOnKeyPress.ts index 5d335d07a6e8..839bfba67b81 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/keyboardNavigation/editOnKeyPress.screenshots.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/keyboardNavigation/editOnKeyPress.ts @@ -1,5 +1,6 @@ import { createScreenshotsComparer } from 'devextreme-screenshot-comparer'; import DataGrid from 'devextreme-testcafe-models/dataGrid'; +import { ClientFunction } from 'testcafe'; import url from '../../../helpers/getPageUrl'; import { createWidget } from '../../../helpers/createWidget'; import { makeRowsViewTemplatesAsync } from '../helpers/asyncTemplates'; @@ -62,3 +63,75 @@ const DATA_GRID_SELECTOR = '#container'; await makeRowsViewTemplatesAsync(DATA_GRID_SELECTOR); }); }); + +test('Focused cell should not flick (T1206435)', async (t) => { + type TestWindow = (typeof window) & { + counter?: number; + }; + + const dataGrid = new DataGrid(DATA_GRID_SELECTOR); + const firstCell = dataGrid.getDataCell(0, 0).element; + const secondCell = dataGrid.getDataCell(1, 0).element; + const getFocusEventCount = ClientFunction( + () => (window as TestWindow).counter, + ); + + await ClientFunction(() => { + const testWindow = window as TestWindow; + testWindow.counter = 0; + (secondCell() as any as HTMLElement).addEventListener('focusin', () => { + testWindow.counter! += 1; + }); + }, { + dependencies: { secondCell }, + })(); + + await t.click(firstCell); + + await t.pressKey('M'); + await t.pressKey('enter'); + + await t.expect(secondCell.focused).ok(); + + const focusEventCount = await getFocusEventCount(); + await t.expect(focusEventCount).eql(1); + + await ClientFunction(() => { + delete (window as TestWindow).counter; + })(); +}).before(async () => { + await createWidget('dxDataGrid', () => { + const data = [ + { value: 'data' }, + { value: 'data' }, + ]; + return { + dataSource: new (window as any).DevExpress.data.CustomStore({ + load() { + return Promise.resolve(data); + }, + update() { + return new Promise((res) => { + setTimeout(() => { + res(); + }, 100); + }); + }, + }), + keyboardNavigation: { + enabled: true, + editOnKeyPress: true, + enterKeyAction: 'moveFocus', + enterKeyDirection: 'column', + }, + editing: { + mode: 'cell', + allowUpdating: true, + allowAdding: true, + startEditAction: 'dblClick', + refreshMode: 'reshape', + }, + repaintChangesOnly: true, + }; + }); +}); 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 bdb76a786fed..1acd10f617b2 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 @@ -549,9 +549,11 @@ export class KeyboardNavigationController extends modules.ViewController { } private _closeEditCell() { + const d = Deferred(); setTimeout(() => { - this._editingController.closeEditCell(); + this._editingController.closeEditCell().always(d.resolve); }); + return d; } /** @@ -1055,12 +1057,13 @@ export class KeyboardNavigationController extends modules.ViewController { const allowEditingOnEnterKey = this._allowEditingOnEnterKey(); if (isEditing || (!allowEditingOnEnterKey && direction)) { - this._handleEnterKeyEditingCell(eventArgs.originalEvent); - if (direction === 'next' || direction === 'previous') { - this._targetCellTabHandler(eventArgs, direction); - } else if (direction === 'upArrow' || direction === 'downArrow') { - this._navigateNextCell(eventArgs.originalEvent, direction); - } + this._handleEnterKeyEditingCell(eventArgs.originalEvent).done(() => { + if (direction === 'next' || direction === 'previous') { + this._targetCellTabHandler(eventArgs, direction); + } else if (direction === 'upArrow' || direction === 'downArrow') { + this._navigateNextCell(eventArgs.originalEvent, direction); + } + }); } else if (allowEditingOnEnterKey) { this._startEditing(eventArgs); } @@ -1083,6 +1086,7 @@ export class KeyboardNavigationController extends modules.ViewController { } private _handleEnterKeyEditingCell(event) { + const d = Deferred(); const { target } = event; const $cell = this._getCellElementFromTarget(target); const isRowEditMode = this._isRowEditMode(); @@ -1094,13 +1098,16 @@ export class KeyboardNavigationController extends modules.ViewController { setTimeout( this._editingController.saveEditData.bind(this._editingController), ); + d.resolve(); } else { // @ts-expect-error eventsEngine.trigger($(target), 'change'); - this._closeEditCell(); + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this._closeEditCell().always(d.resolve); event.preventDefault(); } + return d; } /** diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.customization.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.customization.tests.js index ead0c7800fa3..1bcf160b6b9c 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.customization.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/keyboardNavigation.customization.tests.js @@ -1066,7 +1066,7 @@ QUnit.module('Customize keyboard navigation', { assert.equal($editor.find('.dx-texteditor-input').val(), 'D', 'input value'); // act - this.triggerKeyDown('enter'); + this.triggerKeyDown('enter', false, false, $editor.find('input')); this.clock.tick(10); $editor = $('.dx-texteditor').eq(0); @@ -1117,7 +1117,7 @@ QUnit.module('Customize keyboard navigation', { assert.equal($editor.find('.dx-texteditor-input').val(), 'D', 'input value'); // act - this.triggerKeyDown('enter'); + this.triggerKeyDown('enter', false, false, $editor.find('input')); this.clock.tick(10); $editor = $('.dx-texteditor').eq(0); @@ -1169,7 +1169,7 @@ QUnit.module('Customize keyboard navigation', { assert.equal($editor.find('.dx-texteditor-input').val(), 'D', 'input value'); // act - this.triggerKeyDown('enter'); + this.triggerKeyDown('enter', false, false, $editor.find('input')); this.clock.tick(10); $editor = $('.dx-texteditor').eq(0); @@ -1220,7 +1220,7 @@ QUnit.module('Customize keyboard navigation', { assert.equal($editor.find('.dx-texteditor-input').val(), 'D', 'input value'); // act - this.triggerKeyDown('enter'); + this.triggerKeyDown('enter', false, false, $editor.find('input')); this.clock.tick(10); $editor = $('.dx-texteditor').eq(0); @@ -1272,7 +1272,7 @@ QUnit.module('Customize keyboard navigation', { assert.equal($editor.find('.dx-texteditor-input').val(), 'D', 'input value'); // act - this.triggerKeyDown('enter'); + this.triggerKeyDown('enter', false, false, $editor.find('input')); this.clock.tick(10); $editor = $('.dx-texteditor').eq(0); @@ -2007,7 +2007,7 @@ QUnit.module('Customize keyboard navigation', { assert.ok(this.keyboardNavigationController._isFastEditingStarted(), 'Fast editing mode'); assert.equal($input.val(), '#_1.00', 'input value'); - this.triggerKeyDown('enter'); + this.triggerKeyDown('enter', false, false, $input); this.clock.tick(10); // arrange, assert From 8c3cc2cb25cea1c4a9e31335071ec3306ba4503a Mon Sep 17 00:00:00 2001 From: Joshua Victoria <133762589+jdvictoria@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:16:07 +0800 Subject: [PATCH 17/29] Toolbar Adaptability: Fix demos and unskip Testcafe tests (Angular, React and Vue) (#27615) --- .../Angular/app/app.component.html | 21 +++++++++++++++-- .../Adaptability/Angular/app/app.component.ts | 3 +++ .../Demos/Toolbar/Adaptability/React/App.tsx | 23 +++++++++++++++++-- .../Demos/Toolbar/Adaptability/ReactJs/App.js | 13 +++++++++++ .../Demos/Toolbar/Adaptability/Vue/App.vue | 17 ++++++++++++++ apps/demos/testing/common.test.js | 9 -------- .../utils/visual-tests/matrix-test-helper.js | 9 -------- 7 files changed, 73 insertions(+), 22 deletions(-) diff --git a/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.html b/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.html index c6883fb3ac45..936bdc441629 100644 --- a/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.html +++ b/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.html @@ -10,13 +10,21 @@
- +
- +
@@ -37,6 +45,7 @@ displayExpr="text" keyExpr="size" itemTemplate="fontSizeTemplate" + [stylingMode]="stylingMode" [items]="fontSizes" [selectedItemKey]="fontSizes[2].size" [useSelectMode]="true" @@ -56,6 +65,7 @@ icon="indent" displayExpr="text" keyExpr="lineHeight" + [stylingMode]="stylingMode" [items]="lineHeights" [useSelectMode]="true" [selectedItemKey]="lineHeight" @@ -176,6 +186,7 @@ @@ -191,6 +202,7 @@ @@ -216,6 +228,7 @@ @@ -231,6 +244,7 @@ @@ -246,6 +260,7 @@ @@ -266,6 +281,7 @@ @@ -276,6 +292,7 @@ diff --git a/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.ts b/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.ts index 5ed704d33b80..3dc587e3368f 100644 --- a/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.ts +++ b/apps/demos/Demos/Toolbar/Adaptability/Angular/app/app.component.ts @@ -11,6 +11,7 @@ import { DxButtonGroupModule, DxCheckBoxModule, } from 'devextreme-angular'; +import themes from 'devextreme/ui/themes'; import notify from 'devextreme/ui/notify'; import { FontFamily, @@ -36,6 +37,8 @@ if (!/localhost/.test(document.location.host)) { }) export class AppComponent { + stylingMode = !themes.current().startsWith('generic') ? 'text' : undefined; + fontSizes: FontSize[] = this.service.getFontSizes(); lineHeights: LineHeight[] = this.service.getLineHeights(); diff --git a/apps/demos/Demos/Toolbar/Adaptability/React/App.tsx b/apps/demos/Demos/Toolbar/Adaptability/React/App.tsx index 686688d713e0..8d9dbf5fad7f 100644 --- a/apps/demos/Demos/Toolbar/Adaptability/React/App.tsx +++ b/apps/demos/Demos/Toolbar/Adaptability/React/App.tsx @@ -6,6 +6,7 @@ import Resizable from 'devextreme-react/resizable'; import CheckBox from 'devextreme-react/check-box'; import DropDownButton, { DropDownButtonTypes } from 'devextreme-react/drop-down-button'; import SelectBox, { SelectBoxTypes } from 'devextreme-react/select-box'; +import themes from 'devextreme/ui/themes'; import notify from 'devextreme/ui/notify'; import 'devextreme/ui/select_box'; import { @@ -21,6 +22,7 @@ import { textStyleInputAttr, } from './data.ts'; +const stylingMode = !themes.current().startsWith('generic') ? 'text' : undefined; const lineHeightDefault = lineHeights[1].lineHeight; const textAlignDefault = [textAlignItems[0].alignment]; const fontSizeDefault = fontSizes[2].size; @@ -177,11 +179,19 @@ function App() { > - + - + @@ -316,6 +329,7 @@ function App() { @@ -337,6 +351,7 @@ function App() { @@ -350,6 +365,7 @@ function App() { @@ -363,6 +379,7 @@ function App() { @@ -379,6 +396,7 @@ function App() { @@ -387,6 +405,7 @@ function App() { diff --git a/apps/demos/Demos/Toolbar/Adaptability/ReactJs/App.js b/apps/demos/Demos/Toolbar/Adaptability/ReactJs/App.js index 93c6d48a85bc..e60dfdb7ef3e 100644 --- a/apps/demos/Demos/Toolbar/Adaptability/ReactJs/App.js +++ b/apps/demos/Demos/Toolbar/Adaptability/ReactJs/App.js @@ -6,6 +6,7 @@ import Resizable from 'devextreme-react/resizable'; import CheckBox from 'devextreme-react/check-box'; import DropDownButton from 'devextreme-react/drop-down-button'; import SelectBox from 'devextreme-react/select-box'; +import themes from 'devextreme/ui/themes'; import notify from 'devextreme/ui/notify'; import 'devextreme/ui/select_box'; import { @@ -21,6 +22,7 @@ import { textStyleInputAttr, } from './data.js'; +const stylingMode = !themes.current().startsWith('generic') ? 'text' : undefined; const lineHeightDefault = lineHeights[1].lineHeight; const textAlignDefault = [textAlignItems[0].alignment]; const fontSizeDefault = fontSizes[2].size; @@ -149,6 +151,7 @@ function App() { @@ -156,6 +159,7 @@ function App() { @@ -177,6 +181,7 @@ function App() { displayExpr="text" keyExpr="size" useSelectMode={true} + stylingMode={stylingMode} items={fontSizes} selectedItemKey={fontSize} itemRender={renderFontSize} @@ -194,6 +199,7 @@ function App() { displayExpr="text" keyExpr="lineHeight" useSelectMode={true} + stylingMode={stylingMode} items={lineHeights} selectedItemKey={lineHeight} onSelectionChanged={onLineHeightChanged} @@ -291,6 +297,7 @@ function App() { @@ -304,6 +311,7 @@ function App() { @@ -325,6 +333,7 @@ function App() { @@ -338,6 +347,7 @@ function App() { @@ -351,6 +361,7 @@ function App() { @@ -371,6 +382,7 @@ function App() { @@ -383,6 +395,7 @@ function App() { diff --git a/apps/demos/Demos/Toolbar/Adaptability/Vue/App.vue b/apps/demos/Demos/Toolbar/Adaptability/Vue/App.vue index 80cd4d535242..34ccaef16f06 100644 --- a/apps/demos/Demos/Toolbar/Adaptability/Vue/App.vue +++ b/apps/demos/Demos/Toolbar/Adaptability/Vue/App.vue @@ -16,6 +16,7 @@ > @@ -26,6 +27,7 @@ > @@ -46,6 +48,7 @@ display-expr="text" key-expr="size" item-template="fontSizeTemplate" + :styling-mode="stylingMode" :use-select-mode="true" :items="fontSizes" :selected-item-key="fontSize" @@ -68,6 +71,7 @@ icon="indent" display-expr="text" key-expr="lineHeight" + :styling-mode="stylingMode" :use-select-mode="true" :items="lineHeights" :selected-item-key="lineHeight" @@ -165,6 +169,7 @@ @@ -178,6 +183,7 @@ @@ -198,6 +204,7 @@ @@ -211,6 +218,7 @@ @@ -224,6 +232,7 @@ @@ -243,6 +252,7 @@ @@ -255,6 +265,7 @@ @@ -311,6 +322,7 @@ import DxButtonGroup from 'devextreme-vue/button-group'; import DxResizable from 'devextreme-vue/resizable'; import DxDropDownButton from 'devextreme-vue/drop-down-button'; import DxSelectBox from 'devextreme-vue/select-box'; +import themes from 'devextreme/ui/themes'; import notify from 'devextreme/ui/notify'; import { fontSizes, @@ -324,6 +336,7 @@ import { } from './data.ts'; import 'devextreme/ui/select_box'; +const stylingMode = !themes.current().startsWith('generic') ? 'text' : undefined; const lineHeightDefault = lineHeights[1].lineHeight; const textAlignDefault = [textAlignItems[0].alignment]; const fontSizeDefault = fontSizes[2].size; @@ -451,4 +464,8 @@ function onFontFamilyClick() { height: 1px; border-bottom: 1px solid #ddd; } + +.dx-button-content { + display: flex; +} diff --git a/apps/demos/testing/common.test.js b/apps/demos/testing/common.test.js index 63183cf0adde..44eacd92292d 100644 --- a/apps/demos/testing/common.test.js +++ b/apps/demos/testing/common.test.js @@ -94,9 +94,6 @@ const SKIPPED_TESTS = { { demo: 'Overview', themes: [THEME.material] }, { demo: 'ChartIntegration', themes: [THEME.material] }, ], - Toolbar: [ - { demo: 'Adaptability', themes: [THEME.fluent, THEME.material] }, - ], TreeList: [ { demo: 'BatchEditing', themes: [THEME.material] }, { demo: 'RowEditing', themes: [THEME.material] }, @@ -143,9 +140,6 @@ const SKIPPED_TESTS = { { demo: 'Overview', themes: [THEME.fluent, THEME.material] }, { demo: 'GroupByDate', themes: [THEME.fluent, THEME.material] }, ], - Toolbar: [ - { demo: 'Adaptability', themes: [THEME.fluent, THEME.material] }, - ], List: [ { demo: 'ListWithSearchBar', themes: [THEME.material] }, { demo: 'ItemDragging', themes: [THEME.fluent, THEME.material] }, @@ -200,9 +194,6 @@ const SKIPPED_TESTS = { TileView: [ { demo: 'Directions', themes: [THEME.material] }, ], - Toolbar: [ - { demo: 'Adaptability', themes: [THEME.fluent, THEME.material] }, - ], TreeList: [ { demo: 'Overview', themes: [THEME.material] }, ], diff --git a/apps/demos/utils/visual-tests/matrix-test-helper.js b/apps/demos/utils/visual-tests/matrix-test-helper.js index 018c889bdedf..8abbd7202449 100644 --- a/apps/demos/utils/visual-tests/matrix-test-helper.js +++ b/apps/demos/utils/visual-tests/matrix-test-helper.js @@ -213,9 +213,6 @@ const SKIPPED_TESTS = { Scheduler: [ 'CustomDragAndDrop', ], - Toolbar: [ - { demo: 'Adaptability', themes: [THEME.fluent, THEME.material] }, - ], }, Vue: { Charts: [ @@ -245,9 +242,6 @@ const SKIPPED_TESTS = { TabPanel: [ { demo: 'Overview', themes: [THEME.material] }, ], - Toolbar: [ - { demo: 'Adaptability', themes: [THEME.fluent, THEME.material] }, - ], }, React: { Charts: [ @@ -270,9 +264,6 @@ const SKIPPED_TESTS = { { demo: 'Overview', themes: [THEME.fluent, THEME.material] }, { demo: 'Templates', themes: [THEME.fluent, THEME.material] }, ], - Toolbar: [ - { demo: 'Adaptability', themes: [THEME.fluent, THEME.material] }, - ], }, }; From 7d732400195545eefb72e9bf410c8f7bca674688 Mon Sep 17 00:00:00 2001 From: Nikki Gonzales <38495263+nikkithelegendarypokemonster@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:11:34 +0800 Subject: [PATCH 18/29] TabPanel/Overview: Corrected classname appending in Vue template by adding wrapper div (#27619) Signed-off-by: Nikki Gonzales <38495263+nikkithelegendarypokemonster@users.noreply.github.com> --- .../Demos/TabPanel/Overview/Vue/TabPanelItem.vue | 14 ++++++++------ .../demos/utils/visual-tests/matrix-test-helper.js | 3 --- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/demos/Demos/TabPanel/Overview/Vue/TabPanelItem.vue b/apps/demos/Demos/TabPanel/Overview/Vue/TabPanelItem.vue index d1e660664e0a..e83419ec7c39 100644 --- a/apps/demos/Demos/TabPanel/Overview/Vue/TabPanelItem.vue +++ b/apps/demos/Demos/TabPanel/Overview/Vue/TabPanelItem.vue @@ -1,10 +1,12 @@ diff --git a/apps/demos/utils/visual-tests/matrix-test-helper.js b/apps/demos/utils/visual-tests/matrix-test-helper.js index 8abbd7202449..c46b1b24485a 100644 --- a/apps/demos/utils/visual-tests/matrix-test-helper.js +++ b/apps/demos/utils/visual-tests/matrix-test-helper.js @@ -239,9 +239,6 @@ const SKIPPED_TESTS = { Drawer: [ { demo: 'TopOrBottomPosition', themes: [THEME.material] }, ], - TabPanel: [ - { demo: 'Overview', themes: [THEME.material] }, - ], }, React: { Charts: [ From 3d5993e265d8898dce208f408a808f5dc6b441be Mon Sep 17 00:00:00 2001 From: Nikki Gonzales <38495263+nikkithelegendarypokemonster@users.noreply.github.com> Date: Wed, 19 Jun 2024 17:15:50 +0800 Subject: [PATCH 19/29] TileView/Directions: Apply standardized width and added space between span and input in Vue template (#27620) Signed-off-by: Nikki Gonzales <38495263+nikkithelegendarypokemonster@users.noreply.github.com> --- apps/demos/Demos/TileView/Directions/Vue/App.vue | 3 ++- apps/demos/testing/common.test.js | 3 --- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/demos/Demos/TileView/Directions/Vue/App.vue b/apps/demos/Demos/TileView/Directions/Vue/App.vue index 62094450614b..5dfdf246ca8d 100644 --- a/apps/demos/Demos/TileView/Directions/Vue/App.vue +++ b/apps/demos/Demos/TileView/Directions/Vue/App.vue @@ -17,6 +17,7 @@
Options
Direction + {{ " " }} span { - width: 74px; + width: 70px; display: inline-block; } diff --git a/apps/demos/testing/common.test.js b/apps/demos/testing/common.test.js index 44eacd92292d..1010ee2f0963 100644 --- a/apps/demos/testing/common.test.js +++ b/apps/demos/testing/common.test.js @@ -191,9 +191,6 @@ const SKIPPED_TESTS = { { demo: 'DeferredSelection', themes: [THEME.material] }, { demo: 'CellEditingAndEditingAPI', themes: [THEME.material] }, ], - TileView: [ - { demo: 'Directions', themes: [THEME.material] }, - ], TreeList: [ { demo: 'Overview', themes: [THEME.material] }, ], From 1fce2fe4e6c42f7d692ad8c4c14126e3ab6d6520 Mon Sep 17 00:00:00 2001 From: Vlada Skorohodova <94827090+vladaskorohodova@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:57:01 +0400 Subject: [PATCH 20/29] Demos: update splits in descriptions (#27621) (#27622) --- apps/demos/Demos/Charts/AjaxRequest/description.md | 4 ++-- apps/demos/Demos/Charts/Annotation/description.md | 2 +- .../Demos/Charts/AutoCalculatedBarWidth/description.md | 2 +- .../Demos/Charts/AxisLabelsOverlapping/description.md | 5 ++--- .../Demos/Charts/AxisLabelsTemplates/description.md | 2 +- apps/demos/Demos/Charts/Candlestick/description.md | 2 +- .../Demos/Charts/ClientSideDataProcessing/description.md | 2 +- apps/demos/Demos/Charts/ColorEachBar/description.md | 4 ++-- .../Demos/Charts/CustomLegendMarkers/description.md | 4 ++-- .../demos/Demos/Charts/ExportCustomMarkup/description.md | 4 ++-- .../Demos/Charts/ExportSeveralCharts/description.md | 2 +- apps/demos/Demos/Charts/FlatDataStructure/description.md | 5 ++--- .../Charts/HierarchicalDataStructure/description.md | 2 +- apps/demos/Demos/Charts/NullPointSupport/description.md | 2 +- .../demos/Demos/Charts/PieWithAnnotations/description.md | 4 ++-- apps/demos/Demos/Charts/PiesWithEqualSize/description.md | 4 ++-- .../PointsAggregationFinancialChart/description.md | 2 +- .../Demos/Charts/PolarChartAnnotations/description.md | 2 +- .../PolarChartZoomingAndScrollingAPI/description.md | 2 +- apps/demos/Demos/Charts/RangeBar/description.md | 2 +- apps/demos/Demos/Charts/ScaleBreaks/description.md | 2 +- apps/demos/Demos/Charts/SeriesTemplates/description.md | 2 +- .../Demos/Charts/ServerSideDataProcessing/description.md | 2 +- apps/demos/Demos/Charts/SignalRService/description.md | 2 +- apps/demos/Demos/Charts/StepArea/description.md | 4 ++-- apps/demos/Demos/Charts/Stock/description.md | 2 +- apps/demos/Demos/Charts/Strips/description.md | 2 +- apps/demos/Demos/ContextMenu/Scrolling/description.md | 2 +- apps/demos/Demos/DataGrid/Appearance/description.md | 4 ++-- apps/demos/Demos/DataGrid/BatchEditing/description.md | 4 ++-- apps/demos/Demos/DataGrid/CRUDOperations/description.md | 6 +++--- .../DataGrid/CellEditingAndEditingAPI/description.md | 4 ++-- .../DataGrid/CustomizeKeyboardNavigation/description.md | 4 ++-- .../Demos/DataGrid/DeferredSelection/description.md | 2 +- .../DataGrid/ExcelJSCellCustomization/description.md | 4 ++-- .../Demos/DataGrid/ExcelJSExportImages/description.md | 4 ++-- .../DataGrid/ExcelJSExportMultipleGrids/description.md | 4 ++-- .../Demos/DataGrid/ExcelJSHeaderAndFooter/description.md | 2 +- apps/demos/Demos/DataGrid/ExcelJSOverview/description.md | 2 +- apps/demos/Demos/DataGrid/FilterPanel/description.md | 4 ++-- apps/demos/Demos/DataGrid/FocusedRow/description.md | 2 +- apps/demos/Demos/DataGrid/FormEditing/description.md | 2 +- .../DataGrid/GridAdaptabilityOverview/description.md | 2 +- .../DataGrid/GridColumnsHidingPriority/description.md | 2 +- .../Demos/DataGrid/InfiniteScrolling/description.md | 2 +- .../Demos/DataGrid/KeyboardNavigation/description.md | 4 ++-- apps/demos/Demos/DataGrid/LocalReordering/description.md | 4 ++-- .../Demos/DataGrid/MultiRowHeadersBands/description.md | 2 +- .../DataGrid/MultipleRecordSelectionAPI/description.md | 4 ++-- .../DataGrid/MultipleRecordSelectionModes/description.md | 4 ++-- apps/demos/Demos/DataGrid/OdataService/description.md | 2 +- .../demos/Demos/DataGrid/Overview/Angular/description.md | 4 ++-- apps/demos/Demos/DataGrid/Overview/React/description.md | 4 ++-- .../demos/Demos/DataGrid/Overview/ReactJs/description.md | 4 ++-- apps/demos/Demos/DataGrid/Overview/Vue/description.md | 4 ++-- apps/demos/Demos/DataGrid/Overview/jQuery/description.md | 4 ++-- .../Demos/DataGrid/PDFCellCustomization/description.md | 4 ++-- apps/demos/Demos/DataGrid/PDFExportImages/description.md | 4 ++-- .../Demos/DataGrid/PDFExportMultipleGrids/description.md | 4 ++-- apps/demos/Demos/DataGrid/PDFOverview/description.md | 2 +- apps/demos/Demos/DataGrid/PopupEditing/description.md | 2 +- apps/demos/Demos/DataGrid/RecordGrouping/description.md | 4 ++-- apps/demos/Demos/DataGrid/RemoteGrouping/description.md | 2 +- .../demos/Demos/DataGrid/RemoteReordering/description.md | 2 +- .../Demos/DataGrid/RightToLeftSupport/description.md | 2 +- .../DataGrid/RowEditingAndEditingEvents/description.md | 2 +- apps/demos/Demos/DataGrid/RowSelection/description.md | 4 ++-- apps/demos/Demos/DataGrid/SignalRService/description.md | 2 +- apps/demos/Demos/DataGrid/SimpleArray/description.md | 4 ++-- .../demos/Demos/DataGrid/VirtualScrolling/description.md | 4 ++-- apps/demos/Demos/DataGrid/WebAPIService/description.md | 2 +- apps/demos/Demos/Diagram/Adaptability/description.md | 4 ++-- .../Demos/Diagram/AdvancedDataBinding/description.md | 5 +++-- apps/demos/Demos/Diagram/Containers/description.md | 4 ++-- .../Demos/Diagram/CustomShapesWithIcons/description.md | 4 ++-- .../Diagram/CustomShapesWithTemplates/description.md | 4 ++-- .../CustomShapesWithTemplatesWithEditing/description.md | 2 +- .../Demos/Diagram/CustomShapesWithTexts/description.md | 4 ++-- apps/demos/Demos/Diagram/ImagesInShapes/description.md | 4 ++-- apps/demos/Demos/Diagram/ItemSelection/description.md | 2 +- .../NodesArrayHierarchicalStructure/description.md | 4 ++-- .../Diagram/NodesArrayPlainStructure/description.md | 4 ++-- .../Demos/Diagram/OperationRestrictions/description.md | 2 +- apps/demos/Demos/Diagram/ReadOnly/description.md | 4 ++-- apps/demos/Demos/Diagram/SimpleView/description.md | 4 ++-- apps/demos/Demos/Diagram/UICustomization/description.md | 4 ++-- .../Demos/Drawer/LeftOrRightPosition/description.md | 2 +- .../Demos/Drawer/TopOrBottomPosition/description.md | 2 +- apps/demos/Demos/FileManager/Overview/description.md | 2 +- .../Demos/FileUploader/CustomDropzone/description.md | 2 +- .../Demos/FilterBuilder/Customization/description.md | 8 ++++---- apps/demos/Demos/Form/CustomizeItem/description.md | 4 ++-- .../Demos/Form/UpdateItemsDynamically/description.md | 4 ++-- apps/demos/Demos/Gantt/ChartAppearance/description.md | 2 +- apps/demos/Demos/Gantt/FilterRow/description.md | 2 +- apps/demos/Demos/Gantt/Overview/description.md | 4 ++-- apps/demos/Demos/Gantt/StripLines/description.md | 2 +- apps/demos/Demos/Gantt/Toolbar/description.md | 2 +- .../Demos/Gauges/GaugeTitleCustomized/description.md | 4 ++-- apps/demos/Demos/Gauges/Overview/Angular/description.md | 2 +- apps/demos/Demos/Gauges/Overview/React/description.md | 2 +- apps/demos/Demos/Gauges/Overview/ReactJs/description.md | 2 +- apps/demos/Demos/Gauges/Overview/Vue/description.md | 2 +- apps/demos/Demos/Gauges/Overview/jQuery/description.md | 2 +- apps/demos/Demos/HtmlEditor/OutputFormats/description.md | 2 +- apps/demos/Demos/HtmlEditor/Overview/description.md | 2 +- apps/demos/Demos/List/ItemTemplate/description.md | 2 +- apps/demos/Demos/List/ListEditingAndAPI/description.md | 2 +- apps/demos/Demos/List/ListWithSearchBar/description.md | 2 +- apps/demos/Demos/Lookup/EventHandling/description.md | 2 +- apps/demos/Demos/Lookup/Templates/description.md | 2 +- apps/demos/Demos/Map/ProvidersAndTypes/description.md | 4 ++-- apps/demos/Demos/Menu/Overview/description.md | 2 +- apps/demos/Demos/Menu/Scrolling/description.md | 4 ++-- apps/demos/Demos/MultiView/Overview/description.md | 5 ++--- apps/demos/Demos/NumberBox/Overview/description.md | 2 +- apps/demos/Demos/PivotGrid/DrillDown/description.md | 4 ++-- .../PivotGrid/ExcelJSCellCustomization/description.md | 2 +- .../demos/Demos/PivotGrid/ExcelJSOverview/description.md | 2 +- apps/demos/Demos/PivotGrid/FieldPanel/description.md | 2 +- .../Demos/PivotGrid/Overview/Angular/description.md | 2 +- apps/demos/Demos/PivotGrid/Overview/React/description.md | 2 +- .../Demos/PivotGrid/Overview/ReactJs/description.md | 2 +- apps/demos/Demos/PivotGrid/Overview/Vue/description.md | 2 +- .../demos/Demos/PivotGrid/Overview/jQuery/description.md | 2 +- apps/demos/Demos/PivotGrid/RunningTotals/description.md | 4 ++-- apps/demos/Demos/PivotGrid/SimpleArray/description.md | 2 +- .../Demos/PivotGrid/VirtualScrolling/description.md | 4 ++-- apps/demos/Demos/PivotGrid/WebAPIService/description.md | 2 +- apps/demos/Demos/Popup/Scrolling/description.md | 2 +- apps/demos/Demos/ProgressBar/Overview/description.md | 5 ++--- apps/demos/Demos/Resizable/Overview/description.md | 2 +- apps/demos/Demos/Scheduler/Adaptability/description.md | 9 +++------ apps/demos/Demos/Scheduler/Agenda/description.md | 4 ++-- apps/demos/Demos/Scheduler/BasicViews/description.md | 2 +- .../Demos/Scheduler/CurrentTimeIndicator/description.md | 2 +- .../demos/Demos/Scheduler/CustomTemplates/description.md | 2 +- .../Scheduler/CustomizeIndividualViews/description.md | 2 +- apps/demos/Demos/Scheduler/GroupByDate/description.md | 2 +- .../Demos/Scheduler/GroupOrientation/description.md | 2 +- .../Demos/Scheduler/Overview/Angular/description.md | 4 ++-- apps/demos/Demos/Scheduler/Overview/React/description.md | 4 ++-- .../Demos/Scheduler/Overview/ReactJs/description.md | 4 ++-- apps/demos/Demos/Scheduler/Overview/Vue/description.md | 4 ++-- .../demos/Demos/Scheduler/Overview/jQuery/description.md | 4 ++-- apps/demos/Demos/Scheduler/SimpleArray/description.md | 4 ++-- .../Demos/Scheduler/TimeZonesSupport/description.md | 2 +- apps/demos/Demos/Scheduler/Timelines/description.md | 4 ++-- .../Demos/Scheduler/VirtualScrolling/description.md | 2 +- apps/demos/Demos/Scheduler/WorkShifts/description.md | 4 ++-- .../SelectBox/CustomizeDropDownButton/description.md | 4 ++-- apps/demos/Demos/SelectBox/GroupedItems/description.md | 2 +- apps/demos/Demos/Switch/Overview/description.md | 3 +-- apps/demos/Demos/TabPanel/Overview/description.md | 2 +- apps/demos/Demos/Toast/Overview/description.md | 2 +- apps/demos/Demos/Toast/Stack/description.md | 2 +- apps/demos/Demos/Toolbar/Adaptability/description.md | 4 ++-- apps/demos/Demos/TreeList/Adaptability/description.md | 4 ++-- apps/demos/Demos/TreeList/ColumnFixing/description.md | 4 ++-- .../TreeList/CustomizeKeyboardNavigation/description.md | 4 ++-- apps/demos/Demos/TreeList/FilterModes/description.md | 4 ++-- apps/demos/Demos/TreeList/FilterPanel/description.md | 4 ++-- apps/demos/Demos/TreeList/FocusedRow/description.md | 4 ++-- apps/demos/Demos/TreeList/FormEditing/description.md | 4 ++-- .../Demos/TreeList/KeyboardNavigation/description.md | 4 ++-- .../Demos/TreeList/MultipleRowSelection/description.md | 4 ++-- apps/demos/Demos/TreeList/MultipleSorting/description.md | 2 +- .../demos/Demos/TreeList/Overview/Angular/description.md | 4 ++-- apps/demos/Demos/TreeList/Overview/React/description.md | 4 ++-- .../demos/Demos/TreeList/Overview/ReactJs/description.md | 4 ++-- apps/demos/Demos/TreeList/Overview/jQuery/description.md | 4 ++-- apps/demos/Demos/TreeList/PopupEditing/description.md | 2 +- apps/demos/Demos/TreeList/Reordering/description.md | 2 +- apps/demos/Demos/TreeList/RowEditing/description.md | 2 +- .../SimpleArrayHierarchicalStructure/description.md | 4 ++-- .../TreeList/SimpleArrayPlainStructure/description.md | 6 +++--- apps/demos/Demos/TreeList/UsingFilterRow/description.md | 4 ++-- .../demos/Demos/TreeList/UsingSearchPanel/description.md | 4 ++-- apps/demos/Demos/TreeList/WebAPIService/description.md | 2 +- .../Demos/TreeView/ContextMenuIntegration/description.md | 4 ++-- .../demos/Demos/TreeView/LoadDataOnDemand/description.md | 2 +- .../Demos/TreeView/TreeViewWithSearchBar/description.md | 4 ++-- apps/demos/Demos/TreeView/VirtualMode/description.md | 2 +- .../Demos/VectorMap/ColorsCustomization/description.md | 6 ++---- .../Demos/VectorMap/CustomAnnotations/description.md | 4 ++-- .../demos/Demos/VectorMap/DynamicViewport/description.md | 2 +- 186 files changed, 283 insertions(+), 292 deletions(-) diff --git a/apps/demos/Demos/Charts/AjaxRequest/description.md b/apps/demos/Demos/Charts/AjaxRequest/description.md index 17c6977b066b..25306e3dbd1c 100644 --- a/apps/demos/Demos/Charts/AjaxRequest/description.md +++ b/apps/demos/Demos/Charts/AjaxRequest/description.md @@ -1,4 +1,4 @@ If your server stores data in JSON format, you do not need to make AJAX requests to get the data. Instead, assign the URL of your data storage to the Chart's [dataSource](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#dataSource) property. To configure how the component displays data, specify the [series](Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) type and its nested options: [argumentField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#argumentField) and [valueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#valueField), so the component can determine the object fields that indicate Chart arguments and values in JSON. - -Note that you can also use a JSONP callback parameter supported by jQuery.ajax() in the [dataSource](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#dataSource). \ No newline at end of file +Note that you can also use a JSONP callback parameter supported by jQuery.ajax() in the [dataSource](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#dataSource). + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/Annotation/description.md b/apps/demos/Demos/Charts/Annotation/description.md index af0af775f272..f1e2ba34d519 100644 --- a/apps/demos/Demos/Charts/Annotation/description.md +++ b/apps/demos/Demos/Charts/Annotation/description.md @@ -1,7 +1,7 @@ Annotations are containers for images, text blocks, and custom content that display additional information about the visualized data. - To create annotations, populate the Chart's [annotations](/Documentation/ApiReference/UI_Components/dxChart/Configuration/annotations/) array. Each object in the array configures an individual annotation. To specify properties for all annotations, use the [commonAnnotationSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonAnnotationSettings/) object. Individual settings take precedence over common settings. + You can set each annotation's [type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/annotations/#type) property to *"text"*, *"image"*, or *"custom"*. Depending on the **type**, specify the [text](/Documentation/ApiReference/UI_Components/dxChart/Configuration/annotations/#text) or [image](/Documentation/ApiReference/UI_Components/dxChart/Configuration/annotations/image/) property. You can also add a [description](/Documentation/ApiReference/UI_Components/dxChart/Configuration/annotations/#description) that will be displayed in a tooltip. diff --git a/apps/demos/Demos/Charts/AutoCalculatedBarWidth/description.md b/apps/demos/Demos/Charts/AutoCalculatedBarWidth/description.md index 5cdff4a1befa..0feee59329fb 100644 --- a/apps/demos/Demos/Charts/AutoCalculatedBarWidth/description.md +++ b/apps/demos/Demos/Charts/AutoCalculatedBarWidth/description.md @@ -1,4 +1,4 @@ This demo illustrates a common issue in multi-series charts. Individual [series](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/BarSeries/) can skip values for certain arguments or include zero values. In such cases, arguments can display a different number of bars and cause uneven gaps between data. - The [ignoreEmptyPoints](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/BarSeries/#ignoreEmptyPoints) property allows you to change this behavior. If you set it to **true**, bars increase their width to fill the gaps. In this demo, you can see how the property affects the following arguments: `Iran`, `Canada`, `Saudi Arabia`, and `Mexico`. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/AxisLabelsOverlapping/description.md b/apps/demos/Demos/Charts/AxisLabelsOverlapping/description.md index 90b5d7927963..3289d9827c5b 100644 --- a/apps/demos/Demos/Charts/AxisLabelsOverlapping/description.md +++ b/apps/demos/Demos/Charts/AxisLabelsOverlapping/description.md @@ -1,5 +1,4 @@ In this demo, argument axis labels overlap due to their length. - To specify the overlapping behavior, you can use one of the following [label](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/label/).[overlappingBehavior](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/label/#overlappingBehavior) modes: @@ -14,6 +13,6 @@ Rotates axis labels at the angle specified by the [rotationAngle](/Documentation - `stagger` Arranges axis labels into two staggered rows. Use the [staggeringSpacing](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/label/#staggeringSpacing) property to specify an empty space between rows. + -All of the values above can be applied to a horizontal axis, but only `none` and `hide` can be specified for a vertical axis. - +All of the values above can be applied to a horizontal axis, but only `none` and `hide` can be specified for a vertical axis. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/AxisLabelsTemplates/description.md b/apps/demos/Demos/Charts/AxisLabelsTemplates/description.md index 426ce3602c64..3a08cf079dcf 100644 --- a/apps/demos/Demos/Charts/AxisLabelsTemplates/description.md +++ b/apps/demos/Demos/Charts/AxisLabelsTemplates/description.md @@ -1,6 +1,6 @@ Axis labels display values for [major axis ticks](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonAxisSettings/tick/). - To configure labels for individual axes, specify label settings in the **valueAxis**.[label](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/label/) and **argumentAxis**.[label](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/label/) objects. To configure labels for all axes, use the **commonAxisSettings**.[label](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonAxisSettings/label/) object. Individual settings take precedence over common settings. This demo illustrates how you can display custom content for axis labels. To replicate this demo, declare SVG markup within the [template](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonAxisSettings/label/#template) property. You can access a label's original and formatted values from template code. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/Candlestick/description.md b/apps/demos/Demos/Charts/Candlestick/description.md index 9c076573c303..6c6be0d420e4 100644 --- a/apps/demos/Demos/Charts/Candlestick/description.md +++ b/apps/demos/Demos/Charts/Candlestick/description.md @@ -1,7 +1,7 @@ The Candlestick financial chart is designed to communicate trading patterns over a short period of time. A single data point on a Candlestick [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type) displays variations in stock prices over the course of a day. - You can use the Candlestick type for an individual [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) or specify the type in the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/) object for all series in the Chart. Use the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/).[candlestick](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/CandleStickSeries/) object to configure properties of the Chart Candlestick series. + In Candlestick series, each point consists of a rectangle (body) and a vertical line (shadow, wick, or tail). The top and bottom values of a vertical line correspond to the highest and lowest prices of the stock, respectively. Use the [highValueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#highValueField) and [lowValueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#lowValueField) properties to specify data source fields for these prices. diff --git a/apps/demos/Demos/Charts/ClientSideDataProcessing/description.md b/apps/demos/Demos/Charts/ClientSideDataProcessing/description.md index 1b61dd263e2f..569cced4ea5a 100644 --- a/apps/demos/Demos/Charts/ClientSideDataProcessing/description.md +++ b/apps/demos/Demos/Charts/ClientSideDataProcessing/description.md @@ -1,6 +1,6 @@ The Chart component can get data from a remote storage and process it on the client side. To implement this functionality, assign a [DataSource](/Documentation/ApiReference/Data_Layer/DataSource/) object to the Chart [dataSource](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#dataSource) property. - In the [DataSource](/Documentation/ApiReference/Data_Layer/DataSource/), implement a [CustomStore](/Documentation/ApiReference/Data_Layer/CustomStore/). Switch the [CustomStore](/Documentation/ApiReference/Data_Layer/CustomStore/) to the `raw` [loadMode](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#loadMode) and load all data from the server in the [load](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#load) function as shown in the demo. Set the [paginate](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/#paginate) property to **false** to prevent data from partitioning. You can also apply [filter](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/#filter) to the received values. In this demo, select different values of the drop-down menu under the chart to apply different filters. + Once you load the data, specify the [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) type and its nested options: [argumentField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#argumentField) and [valueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#valueField), so the component can determine which object fields in the data source indicate Chart arguments and values. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/ColorEachBar/description.md b/apps/demos/Demos/Charts/ColorEachBar/description.md index d14ffa4ea10d..2b886db1de1c 100644 --- a/apps/demos/Demos/Charts/ColorEachBar/description.md +++ b/apps/demos/Demos/Charts/ColorEachBar/description.md @@ -1,8 +1,8 @@ The Chart assigns one color to one series. To color bars differently, create a separate series for each bar. - Assign the `age` field to the [argumentField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/#argumentField) property of the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/) object to specify a common argument for the series. Then specify the [valueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#valueField) property. Choose a data field and assign it to the [seriesTemplate](/Documentation/ApiReference/UI_Components/dxChart/Configuration/seriesTemplate/).[nameField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/seriesTemplate/#nameField) property. Each value from this data field generates a separate series. -To learn more about this type of data binding, refer to the following demo: [Dynamic Series from the DataSource](https://js.devexpress.com/Demos/WidgetsGallery/Demo/Charts/SeriesTemplates/). \ No newline at end of file +To learn more about this type of data binding, refer to the following demo: [Dynamic Series from the DataSource](https://js.devexpress.com/Demos/WidgetsGallery/Demo/Charts/SeriesTemplates/). + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/CustomLegendMarkers/description.md b/apps/demos/Demos/Charts/CustomLegendMarkers/description.md index 95790d97fbfd..b3473c4b036a 100644 --- a/apps/demos/Demos/Charts/CustomLegendMarkers/description.md +++ b/apps/demos/Demos/Charts/CustomLegendMarkers/description.md @@ -1,4 +1,4 @@ Legend markers are SVG elements. To customize a legend marker, declare the SVG markup in the [markerTemplate](/Documentation/ApiReference/UI_Components/dxChart/Configuration/legend/#markerTemplate). You can access the [legend item data object](/Documentation/ApiReference/UI_Components/dxChart/Types/Legend/) inside the template and use it to identify the series and read its parameters. - -In this demo, the markers' appearance changes when you click the markers to show or hide the corresponding series. \ No newline at end of file +In this demo, the markers' appearance changes when you click the markers to show or hide the corresponding series. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/ExportCustomMarkup/description.md b/apps/demos/Demos/Charts/ExportCustomMarkup/description.md index 05a832322b62..cab247c59569 100644 --- a/apps/demos/Demos/Charts/ExportCustomMarkup/description.md +++ b/apps/demos/Demos/Charts/ExportCustomMarkup/description.md @@ -1,4 +1,4 @@ The [DevExpress.viz.exportFromMarkup(markup, options)](/Documentation/ApiReference/Common/utils/viz/Methods/#exportFromMarkupmarkup_options) method allows you to export SVG content, including [SVG-based DevExtreme components](/Documentation/Guide/Themes_and_Styles/HTML-_and_SVG-Based_Widgets/), to an image or document. - -The **markup** parameter accepts valid SVG markup (see the `prepareMarkup()` function in the code). To get the markup of a component, call its [svg()](/Documentation/ApiReference/UI_Components/dxChart/Methods/#svg) method. The **options** parameter accepts an object whose fields configure export properties. In this demo, we specify the `width`, `height`, `format`, and `svgToCanvas` fields. Refer to the [method description](/Documentation/ApiReference/Common/utils/viz/Methods/#exportFromMarkupmarkup_options) for more information on these and other available fields. \ No newline at end of file +The **markup** parameter accepts valid SVG markup (see the `prepareMarkup()` function in the code). To get the markup of a component, call its [svg()](/Documentation/ApiReference/UI_Components/dxChart/Methods/#svg) method. The **options** parameter accepts an object whose fields configure export properties. In this demo, we specify the `width`, `height`, `format`, and `svgToCanvas` fields. Refer to the [method description](/Documentation/ApiReference/Common/utils/viz/Methods/#exportFromMarkupmarkup_options) for more information on these and other available fields. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/ExportSeveralCharts/description.md b/apps/demos/Demos/Charts/ExportSeveralCharts/description.md index d0c7b4226d39..4beb5d87e853 100644 --- a/apps/demos/Demos/Charts/ExportSeveralCharts/description.md +++ b/apps/demos/Demos/Charts/ExportSeveralCharts/description.md @@ -1,5 +1,4 @@ The **DevExpress.viz.exportWidgets(widgetInstances, options)** method allows you to export several charts to a single image or document. - The **widgetInstances** parameter accepts an array with the following format: @@ -9,6 +8,7 @@ The **widgetInstances** parameter accepts an array with the following format: ... [ widgetInstanceP_1, widgetInstanceP_2, ..., widgetInstanceP_R ] ] + Each nested array contains component instances that should be in the same row in the exported document. In this demo, `chartInstance` and `pieChartInstance` occupy the only row in the document. diff --git a/apps/demos/Demos/Charts/FlatDataStructure/description.md b/apps/demos/Demos/Charts/FlatDataStructure/description.md index 39ccea86b5a5..c057437db7b9 100644 --- a/apps/demos/Demos/Charts/FlatDataStructure/description.md +++ b/apps/demos/Demos/Charts/FlatDataStructure/description.md @@ -1,9 +1,9 @@ The TreeMap component visualizes data as a set of rectangles (tiles). The tile size corresponds to a data point value relative to other data points. - The TreeMap component works with collections of objects. If objects in your collection have a plain structure, the component visualizes them as tiles. If your data is hierarchical, the TreeMap displays it as a group of nested tiles. To bind data to the component, assign the collection of objects to the TreeMap's [dataSource](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/#dataSource) property. + Once you assign the data source, specify the [valueField](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/#valueField) and [labelField](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/#labelField) properties. If you specify these properties, the component can determine the object fields that indicate TreeMap labels and values in the collection. The default values for these properties are `value` and `name`, respectively. This demo uses default values, so there is no need to explicitly specify value and label fields. @@ -30,5 +30,4 @@ For example, one group of objects in the demo data appears as follows: This group of objects produces a tile with the **Australia** label. The **Australia** tile has two nested tiles labeled **Sydney** and **Melbourne**. -To make the TreeMap more informative, you can specify a [title](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/title/) and implement a [tooltip](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/tooltip/). - +To make the TreeMap more informative, you can specify a [title](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/title/) and implement a [tooltip](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/tooltip/). \ No newline at end of file diff --git a/apps/demos/Demos/Charts/HierarchicalDataStructure/description.md b/apps/demos/Demos/Charts/HierarchicalDataStructure/description.md index e1bee5cccc6e..6429b68e855f 100644 --- a/apps/demos/Demos/Charts/HierarchicalDataStructure/description.md +++ b/apps/demos/Demos/Charts/HierarchicalDataStructure/description.md @@ -1,9 +1,9 @@ The TreeMap component visualizes data as a set of rectangles (tiles). The tile size corresponds to a data point value relative to other data points. - The TreeMap component works with collections of objects. If objects in your collection have a plain structure, the component visualizes them as tiles. If your data is hierarchical, the TreeMap displays it as a group of nested tiles. To bind data to the component, assign the collection of objects to the TreeMap's [dataSource](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/#dataSource) property. + Once you assign the data source, specify the [valueField](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/#valueField) and [labelField](/Documentation/ApiReference/UI_Components/dxTreeMap/Configuration/#labelField) properties. If you specify these properties, the component can determine the object fields that indicate TreeMap labels and values in the collection. The default values for these properties are `value` and `name`, respectively. diff --git a/apps/demos/Demos/Charts/NullPointSupport/description.md b/apps/demos/Demos/Charts/NullPointSupport/description.md index 37cbe82de62d..e0e327e4bc45 100644 --- a/apps/demos/Demos/Charts/NullPointSupport/description.md +++ b/apps/demos/Demos/Charts/NullPointSupport/description.md @@ -1,4 +1,4 @@ The [Step Area](https://js.devexpress.com/Demos/WidgetsGallery/Demo/Charts/StepArea/) series uses perpendicular vertical and horizontal lines to connect data points and shades the area under these lines. If a point's value is `null`, the series draws a gap. - Only `null` point values result in gaps. `undefined` values are ignored. Multiple 0 values may look like a gap, but if [series points](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/StepAreaSeries/point/) are visible, you can see them in this gap. If you want to remove gaps caused by `null` values, enable the [ignoreEmptyPoints](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#ignoreEmptyPoints) property. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/PieWithAnnotations/description.md b/apps/demos/Demos/Charts/PieWithAnnotations/description.md index a6dde8b92d4a..bf758bb611ec 100644 --- a/apps/demos/Demos/Charts/PieWithAnnotations/description.md +++ b/apps/demos/Demos/Charts/PieWithAnnotations/description.md @@ -1,10 +1,10 @@ Annotations are containers for images, text blocks, and custom content. Annotations can help deliver a more refined user-experience and can improve analysis and readability (by displaying additional information for visualized data). - To create annotations, populate the PieChart's [annotations](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/annotations/) array. Each object in the array configures an individual annotation. To specify settings for all annotations, use the [commonAnnotationSettings](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/commonAnnotationSettings/) object. Individual settings take precedence over common settings. + You can set each annotation [type](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/annotations/#type) property to *"text"*, *"image"*, or *"custom"*. In this demo, the type used for all annotations is *"image"*. Annotations can deliver more information if you add tooltips. A [tooltip](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/tooltip/) appears when users hover the mouse pointer over an annotation. This demo illustrates how you can implement a tooltip with custom content via the [tooltipTemplate](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/annotations/#tooltipTemplate) property. -For more information on annotation settings, refer to the [annotations[]](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/annotations/) help topic. +For more information on annotation settings, refer to the [annotations[]](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/annotations/) help topic. \ No newline at end of file diff --git a/apps/demos/Demos/Charts/PiesWithEqualSize/description.md b/apps/demos/Demos/Charts/PiesWithEqualSize/description.md index 8e9a039cdc32..c936a01a9f0b 100644 --- a/apps/demos/Demos/Charts/PiesWithEqualSize/description.md +++ b/apps/demos/Demos/Charts/PiesWithEqualSize/description.md @@ -1,4 +1,4 @@ To display multiple PieChart components that share [series](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/series/) and [legend](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/legend/) settings, you can declare an object with options and use this object in every PieChart. - -When you display PieChart components side by side, their pies may differ in size. You can join all charts into a size group to resize these pies to match each other. To do so, set the [sizeGroup](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/#sizeGroup) property of every chart to the same value. \ No newline at end of file +When you display PieChart components side by side, their pies may differ in size. You can join all charts into a size group to resize these pies to match each other. To do so, set the [sizeGroup](/Documentation/ApiReference/UI_Components/dxPieChart/Configuration/#sizeGroup) property of every chart to the same value. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/PointsAggregationFinancialChart/description.md b/apps/demos/Demos/Charts/PointsAggregationFinancialChart/description.md index e11884275538..3e568a6c3237 100644 --- a/apps/demos/Demos/Charts/PointsAggregationFinancialChart/description.md +++ b/apps/demos/Demos/Charts/PointsAggregationFinancialChart/description.md @@ -1,6 +1,6 @@ The Chart component can aggregate series points. To enable this feature, set the **aggregation**.[enabled](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/aggregation/#enabled) property of a [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) to **true**. - In this demo, the Chart is bound to the [RangeSelector](/Documentation/ApiReference/UI_Components/dxRangeSelector/) component. If you set the selection to a wide range, the control will use a higher aggregation degree, and vice versa. Aggregation on zoom is one of many possible use cases for this feature. For information on how to configure aggregation for other scenarios, refer to the following description: [aggregation](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/aggregation/). + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/PolarChartAnnotations/description.md b/apps/demos/Demos/Charts/PolarChartAnnotations/description.md index f02252bc6a73..f5eb7321dfcf 100644 --- a/apps/demos/Demos/Charts/PolarChartAnnotations/description.md +++ b/apps/demos/Demos/Charts/PolarChartAnnotations/description.md @@ -1,9 +1,9 @@ Annotations are containers for images, text blocks, and custom content that display additional information about the visualized data. - To create annotations, populate the PolarChart's [annotations](/Documentation/ApiReference/UI_Components/dxPolarChart/Configuration/annotations/) array. Each object in the array configures an individual annotation. To specify settings for all annotations, use the [commonAnnotationSettings](/Documentation/ApiReference/UI_Components/dxPolarChart/Configuration/commonAnnotationSettings/) object. Individual settings take precedence over common settings. You can set each annotation's [type](/Documentation/ApiReference/UI_Components/dxPolarChart/Configuration/annotations/#type) property to *"text"*, *"image"*, or *"custom"*. This demo shows only *"text"* annotations. + You can place annotations at specific coordinates or anchor them to PolarChart elements. This demo illustrates the following annotation placement methods: diff --git a/apps/demos/Demos/Charts/PolarChartZoomingAndScrollingAPI/description.md b/apps/demos/Demos/Charts/PolarChartZoomingAndScrollingAPI/description.md index adb32a8565e4..071d7cef9ea2 100644 --- a/apps/demos/Demos/Charts/PolarChartZoomingAndScrollingAPI/description.md +++ b/apps/demos/Demos/Charts/PolarChartZoomingAndScrollingAPI/description.md @@ -1,6 +1,6 @@ To zoom a [PolarChart](/Documentation/ApiReference/UI_Components/dxPolarChart/) into a specific range on the value axis, specify the PolarChart's [visualRange](/Documentation/ApiReference/UI_Components/dxPolarChart/Configuration/valueAxis/visualRange/) property. - In this demo, this property is bound to the [RangeSelector](/Documentation/ApiReference/UI_Components/dxRangeSelector/)'s value. When you move the sliders in the RangeSelector, you change the **visualRange** and zoom the PolarChart. Once you set the zoom level, move the selected range left and right to scroll through data. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/RangeBar/description.md b/apps/demos/Demos/Charts/RangeBar/description.md index 9f0c5e952905..7f1318dd0ded 100644 --- a/apps/demos/Demos/Charts/RangeBar/description.md +++ b/apps/demos/Demos/Charts/RangeBar/description.md @@ -1,6 +1,6 @@ This demo illustrates the range bar [series type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type). - You can use range bars to display value ranges that correspond to specified arguments. Each point in a range bar series has one argument and two values. The [argumentField](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/RangeBarSeries/#argumentField) supplies arguments while the [rangeValue1Field](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/RangeBarSeries/#rangeValue1Field) and [rangeValue2Field](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/RangeBarSeries/#rangeValue2Field) supply bar start and end point values. + To create multiple range bar series, use the [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) array to declare each series and the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/) object to specify the common series type. In this object, you can implement parameters specific to the [range bar series](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/RangeBarSeries/) type. For example, this demo specifies a [minimum bar size](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/RangeBarSeries/#minBarSize) for all series. diff --git a/apps/demos/Demos/Charts/ScaleBreaks/description.md b/apps/demos/Demos/Charts/ScaleBreaks/description.md index ec2f391e6843..c77e1ab08a9f 100644 --- a/apps/demos/Demos/Charts/ScaleBreaks/description.md +++ b/apps/demos/Demos/Charts/ScaleBreaks/description.md @@ -1,7 +1,7 @@ Scale breaks (wavy stripes you see on the chart) cut out ranges from the value axis. This technique may enhance chart readability if values differ greatly. As you can see in this demo, you can easily compare smaller values if scale breaks are enabled. If you disable scale breaks, the smaller values are indistinguishable. - The Chart component can generate scale breaks on the [valueAxis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/). The Chart detects large gaps between side-by-side points, cuts them out, and displays scale breaks instead. Scale breaks are available only for *'continuous'* or *'logarithmic'* [axis types](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/#type). + To enable auto-calculated scale breaks, set the [autoBreaksEnabled](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/#autoBreaksEnabled) property to `true`. Use the [maxAutoBreakCount](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/#maxAutoBreakCount) property to limit the number of automatically created scale breaks. To configure scale break appearance, use the [breakStyle](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/breakStyle/) object. You can test all these options in the demo. diff --git a/apps/demos/Demos/Charts/SeriesTemplates/description.md b/apps/demos/Demos/Charts/SeriesTemplates/description.md index 6477c2b538e5..c0e3e7395e89 100644 --- a/apps/demos/Demos/Charts/SeriesTemplates/description.md +++ b/apps/demos/Demos/Charts/SeriesTemplates/description.md @@ -1,5 +1,4 @@ In certain scenarios, you may need to add more series to the data source after you created the Chart. - In this case, arrange your data source structure as follows: @@ -13,6 +12,7 @@ In this case, arrange your data source structure as follows: ] Every object in the data source should correspond to a point in a single series. + This demo uses the structure displayed above to organize data: diff --git a/apps/demos/Demos/Charts/ServerSideDataProcessing/description.md b/apps/demos/Demos/Charts/ServerSideDataProcessing/description.md index 68fe5db32440..eecaf81a5d6f 100644 --- a/apps/demos/Demos/Charts/ServerSideDataProcessing/description.md +++ b/apps/demos/Demos/Charts/ServerSideDataProcessing/description.md @@ -1,7 +1,7 @@ In many cases, you need to process data on the server before a chart displays it. The Chart component supports this scenario. - In this demo, the data source of the Chart loads weather data for a selected month from an OData service. Each time you select a different month in the drop-down menu, the data source sends a new query to the service. To implement this functionality, assign a [DataSource](/Documentation/ApiReference/Data_Layer/DataSource/) object to the Chart's [dataSource](/Documentation/ApiReference/UI_Components/dxChart/Configuration/#dataSource) property. + In the [DataSource](/Documentation/ApiReference/Data_Layer/DataSource/), implement the [ODataStore](/Documentation/ApiReference/Data_Layer/ODataStore/). An OData service can include multiple entity collections related to each other, but the [ODataStore](/Documentation/ApiReference/Data_Layer/ODataStore/) specifies only one collection. To load multiple collections at once, set the [expand](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/#expand) property to an array with the additional collection titles. Then, call the [postProcess](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/#postProcess) function to process additional data. diff --git a/apps/demos/Demos/Charts/SignalRService/description.md b/apps/demos/Demos/Charts/SignalRService/description.md index 4c85d3780af5..10157d927841 100644 --- a/apps/demos/Demos/Charts/SignalRService/description.md +++ b/apps/demos/Demos/Charts/SignalRService/description.md @@ -1,7 +1,7 @@ This example demonstrates a real-time data update in a financial [candlestick](https://js.devexpress.com/Demos/WidgetsGallery/Demo/Charts/Candlestick/) chart bound to a [SignalR](https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-6.0) server. Note that data used in this demo is for demonstration purposes only. - To integrate the Chart with a [SignalR](https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-6.0) server, specify a [CustomStore](/Documentation/ApiReference/Data_Layer/CustomStore/). Use the [CustomStore](/Documentation/ApiReference/Data_Layer/CustomStore/)'s [push(changes)](/Documentation/ApiReference/Data_Layer/CustomStore/Methods/#pushchanges) method to insert, update, and remove data objects. This method accepts an array and allows you to update data in batches. + To display updated data in real time, use the [aggregation](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/aggregation/) configuration object. In this object, set the [enabled](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/aggregation/#enabled) property to **true**, the [method](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/aggregation/#method) property to `custom`, and then implement the [calculate](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/aggregation/#calculate) function to process the incoming data. In this demo, the [calculate](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/aggregation/#calculate) function aggregates data into a one point for each interval. diff --git a/apps/demos/Demos/Charts/StepArea/description.md b/apps/demos/Demos/Charts/StepArea/description.md index f703e12a2797..e79a63692f5f 100644 --- a/apps/demos/Demos/Charts/StepArea/description.md +++ b/apps/demos/Demos/Charts/StepArea/description.md @@ -1,4 +1,4 @@ This demo shows a step area [series type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type). The primary difference between area and step area is that in step area series, data points are connected by perpendicular vertical and horizontal lines. - -To create multiple area series, use the [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) array to declare each series and the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/) object to specify the common series type. In that object you can implement specific parameters to configure [step area](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/StepAreaSeries/) specifically. For example, this demo disables a [border](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/StepAreaSeries/border/) for all series. \ No newline at end of file +To create multiple area series, use the [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) array to declare each series and the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/) object to specify the common series type. In that object you can implement specific parameters to configure [step area](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/StepAreaSeries/) specifically. For example, this demo disables a [border](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/StepAreaSeries/border/) for all series. + \ No newline at end of file diff --git a/apps/demos/Demos/Charts/Stock/description.md b/apps/demos/Demos/Charts/Stock/description.md index 198f6b2c3036..c4d6d9706a27 100644 --- a/apps/demos/Demos/Charts/Stock/description.md +++ b/apps/demos/Demos/Charts/Stock/description.md @@ -1,7 +1,7 @@ A stock [series type](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#type) displays variations in stock prices over the course of a day. You can specify the stock series type for each object in the [series](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/) or specify the type in the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/) object for all series in the Chart. Use the [commonSeriesSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonSeriesSettings/).[stock](/Documentation/ApiReference/UI_Components/dxChart/Series_Types/StockSeries/) object to configure properties of the Chart stock series. - In stock series, the bottom and top values of a vertical line correspond to high and low prices. Use the [highValueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#highValueField) and [lowValueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#lowValueField) properties to specify data source fields for high and low prices. + Open and close prices are displayed as left and right tick marks. To specify these prices, use the [openValueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#openValueField) and [closeValueField](/Documentation/ApiReference/UI_Components/dxChart/Configuration/series/#closeValueField) properties. diff --git a/apps/demos/Demos/Charts/Strips/description.md b/apps/demos/Demos/Charts/Strips/description.md index 9cd6cd75ddf0..04102fe0c236 100644 --- a/apps/demos/Demos/Charts/Strips/description.md +++ b/apps/demos/Demos/Charts/Strips/description.md @@ -1,8 +1,8 @@ DevExtreme Chart can display background strips to better highlight a range of values. - To configure strips, declare an array of objects in the **argumentAxis**.[strips[]](Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/strips/) or **valueAxis**.[strips[]](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/strips/) property. Each object in this array configures an individual strip. The [startValue](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/strips/#startValue) and [endValue](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/strips/#endValue) properties define the highlighted range. This demo shows two value axis strips. The code configures [label](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/strips/label/) [text](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/strips/label/#text) and **font**.[color](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/strips/label/font/#color) properties for each strip. + You can specify the same appearance for all strips on a specific axis or in the Chart. To specify the same appearance, declare the [stripStyle](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/stripStyle/) object in the [valueAxis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/), [argumentAxis](/Documentation/ApiReference/UI_Components/dxChart/Configuration/argumentAxis/), or [commonAxisSettings](/Documentation/ApiReference/UI_Components/dxChart/Configuration/commonAxisSettings/) object. Individual settings override common settings. In this example, we used the **stripStyle** object to specify the font [weight](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/stripStyle/label/font/#weight) and [size](/Documentation/ApiReference/UI_Components/dxChart/Configuration/valueAxis/stripStyle/label/font/#size) for all strip labels on the value axis. diff --git a/apps/demos/Demos/ContextMenu/Scrolling/description.md b/apps/demos/Demos/ContextMenu/Scrolling/description.md index d1fdbcf9f0a2..108b6caed9c2 100644 --- a/apps/demos/Demos/ContextMenu/Scrolling/description.md +++ b/apps/demos/Demos/ContextMenu/Scrolling/description.md @@ -1,8 +1,8 @@ The DevExtreme ContextMenu component supports submenu item scrolling. If combined item height exceeds screen size, a scrollbar appears on-screen. - To restrict submenu height, use the following CSS notation: .dx-context-menu .dx-menu-items-container { max-height: 200px; } + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/Appearance/description.md b/apps/demos/Demos/DataGrid/Appearance/description.md index 95885fe3c3b7..3f862081a517 100644 --- a/apps/demos/Demos/DataGrid/Appearance/description.md +++ b/apps/demos/Demos/DataGrid/Appearance/description.md @@ -1,5 +1,4 @@ -This example demonstrates the following properties. - +This example demonstrates the following properties: * [showBorders](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#showBorders) Specifies whether the outer borders of the DataGrid are visible. @@ -14,3 +13,4 @@ Specifies whether horizontal lines that separate rows are visible. Specifies whether rows should be in alternate colors. To toggle these properties, select the corresponding checkbox under the DataGrid. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/BatchEditing/description.md b/apps/demos/Demos/DataGrid/BatchEditing/description.md index 091095a6110e..05557ef200e7 100644 --- a/apps/demos/Demos/DataGrid/BatchEditing/description.md +++ b/apps/demos/Demos/DataGrid/BatchEditing/description.md @@ -1,9 +1,9 @@ You can use batch edit mode to defer saving multiple cell changes. Changes are stored in a buffer and can be discarded before a user clicks the **Save** button. - To enable batch edit mode, configure the following properties: * Set **editing**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#mode) to *"batch"*. * Assign **true** to the [editing](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#mode) object's [allowUpdating](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowUpdating), [allowAdding](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowAdding), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowDeleting) properties. + -The [startEditAction](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#startEditAction) property specifies whether cells enter the editing state on a single or double click. Cell edit also selects the cells' text because the [selectTextOnEditStart](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#selectTextOnEditStart) property is set to **true**. You can use the controls below the DataGrid to change these properties at runtime. +The [startEditAction](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#startEditAction) property specifies whether cells enter the editing state on a single or double click. Cell edit also selects the cells' text because the [selectTextOnEditStart](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#selectTextOnEditStart) property is set to **true**. You can use the controls below the DataGrid to change these properties at runtime. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/CRUDOperations/description.md b/apps/demos/Demos/DataGrid/CRUDOperations/description.md index 7e0b31688dd1..7d50b8d26177 100644 --- a/apps/demos/Demos/DataGrid/CRUDOperations/description.md +++ b/apps/demos/Demos/DataGrid/CRUDOperations/description.md @@ -1,4 +1,4 @@ -This demo shows how to implement remote CRUD operations in the **CustomStore**. You can view the server implementation under the *DataGridWebApiController* tab in the ASP.NET MVC version of this demo. The requests sent to the server are displayed under the DataGrid. - +This demo shows how to implement remote CRUD operations in the **CustomStore**. You can view the server implementation under the *DataGridWebApiController* tab in the ASP.NET MVC version of this demo. The requests sent to the server are displayed under the DataGrid. -After a cell is edited, the DataGrid can behave differently depending on the selected refresh mode: reload data from the server (the [refreshMode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#refreshMode) is full), reapply data processing operations (reshape), or merely rerender the changed cells (repaint). \ No newline at end of file +After a cell is edited, the DataGrid can behave differently depending on the selected refresh mode: reload data from the server (the [refreshMode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#refreshMode) is full), reapply data processing operations (reshape), or merely rerender the changed cells (repaint). + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/CellEditingAndEditingAPI/description.md b/apps/demos/Demos/DataGrid/CellEditingAndEditingAPI/description.md index 53e6f2271fa1..05387b800203 100644 --- a/apps/demos/Demos/DataGrid/CellEditingAndEditingAPI/description.md +++ b/apps/demos/Demos/DataGrid/CellEditingAndEditingAPI/description.md @@ -1,8 +1,8 @@ Users can modify DataGrid data cell by cell. In this mode, only one cell can be in the edit state at a time. DataGrid saves changes immediately after the focus leaves cell. - To enable the cell mode, do the following: - Set the **editing**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#mode) to *"cell*". - Assign **true** to the [editing](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/) object's [allowUpdating](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowUpdating), [allowAdding](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowAdding), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowDeleting) properties. -This demo also shows how to delete selected records. Review the [onSelectionChanged](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onSelectionChanged) and `deleteRecords` functions for implementation details. \ No newline at end of file +This demo also shows how to delete selected records. Review the [onSelectionChanged](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onSelectionChanged) and `deleteRecords` functions for implementation details. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/CustomizeKeyboardNavigation/description.md b/apps/demos/Demos/DataGrid/CustomizeKeyboardNavigation/description.md index 76376bf00de5..0c2f28c695c9 100644 --- a/apps/demos/Demos/DataGrid/CustomizeKeyboardNavigation/description.md +++ b/apps/demos/Demos/DataGrid/CustomizeKeyboardNavigation/description.md @@ -1,5 +1,4 @@ -The following properties customize keyboard navigation. - +The following properties customize keyboard navigation: - [enterKeyAction](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/keyboardNavigation/#enterKeyAction) Specifies the DataGrid's actions when a user presses Enter key: @@ -17,3 +16,4 @@ Specifies the direction in which to move focus when a user presses Enter: Specifies whether to start entering a new cell value on a key press. In this demo, you can use the controls under the DataGrid to change any of these properties. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/DeferredSelection/description.md b/apps/demos/Demos/DataGrid/DeferredSelection/description.md index 6abc0e620062..a51ee1213cd3 100644 --- a/apps/demos/Demos/DataGrid/DeferredSelection/description.md +++ b/apps/demos/Demos/DataGrid/DeferredSelection/description.md @@ -1,10 +1,10 @@ If you enable deferred row selection, the grid does not request selected rows' data with every selection change. For example, if a user clicks the checkbox in the column header to select all the rows, the grid does not immediately fetch all data from the server. - This is helpful in the following cases: - You process data on the server and do not want to load the selected rows' data. - You do process selected records on the client, but want to reduce the number of requests that are sent. + This demo illustrates the second scenario. Deferred selection is enabled and the selected rows are only requested when you click the button below the grid. diff --git a/apps/demos/Demos/DataGrid/ExcelJSCellCustomization/description.md b/apps/demos/Demos/DataGrid/ExcelJSCellCustomization/description.md index d1ac926cc118..71c63d17d842 100644 --- a/apps/demos/Demos/DataGrid/ExcelJSCellCustomization/description.md +++ b/apps/demos/Demos/DataGrid/ExcelJSCellCustomization/description.md @@ -1,5 +1,4 @@ The [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/#customizeCell) function allows you to modify cell data and value formatting in exported worksheets. - You can access and change the following attributes: @@ -9,4 +8,5 @@ You can access and change the following attributes: - Text alignment - Formatting properties -The [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/#customizeCell) function also allows you to identify row types. For example, this demo changes the background color and font weight for cells with the "group" [rowType](/Documentation/ApiReference/UI_Components/dxDataGrid/Row/#rowType). \ No newline at end of file +The [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/#customizeCell) function also allows you to identify row types. For example, this demo changes the background color and font weight for cells with the "group" [rowType](/Documentation/ApiReference/UI_Components/dxDataGrid/Row/#rowType). + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/ExcelJSExportImages/description.md b/apps/demos/Demos/DataGrid/ExcelJSExportImages/description.md index 718b8641fc3e..bf74d99b549d 100644 --- a/apps/demos/Demos/DataGrid/ExcelJSExportImages/description.md +++ b/apps/demos/Demos/DataGrid/ExcelJSExportImages/description.md @@ -1,4 +1,4 @@ This demo shows how you can use ExcelJS API to export images to Excel [worksheets](https://github.com/exceljs/exceljs#add-a-worksheet). - -See the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/#customizeCell) callback for implementation details. The **workbook**.addImage() method specifies image data and encoding. **tl** and **br** parameters are used to specify image location and span. \ No newline at end of file +See the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/#customizeCell) callback for implementation details. The **workbook**.addImage() method specifies image data and encoding. **tl** and **br** parameters are used to specify image location and span. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/ExcelJSExportMultipleGrids/description.md b/apps/demos/Demos/DataGrid/ExcelJSExportMultipleGrids/description.md index 6a45a1eec7f4..b5ef612c0ba5 100644 --- a/apps/demos/Demos/DataGrid/ExcelJSExportMultipleGrids/description.md +++ b/apps/demos/Demos/DataGrid/ExcelJSExportMultipleGrids/description.md @@ -1,6 +1,6 @@ The [exportDataGrid()](/Documentation/ApiReference/Common/Utils/excelExporter/#exportDataGridoptions) method allows users to export multiple grids to one Excel document. Grids are exported consequently in a chain of Promises. - In this demo, this functionality is used to export two DataGrids into separate worksheets in the same workbook. Starting position of each exported grid is set using the [topLeftCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/topLeftCell/) property. -Use the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/#customizeCell) method to customize the exported worksheets. \ No newline at end of file +Use the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExportDataGridProps/#customizeCell) method to customize the exported worksheets. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/ExcelJSHeaderAndFooter/description.md b/apps/demos/Demos/DataGrid/ExcelJSHeaderAndFooter/description.md index eb5cf0ff60db..6857c676f918 100644 --- a/apps/demos/Demos/DataGrid/ExcelJSHeaderAndFooter/description.md +++ b/apps/demos/Demos/DataGrid/ExcelJSHeaderAndFooter/description.md @@ -1,5 +1,4 @@ ExcelJS library allows you to customize worksheets outside the exported cell area. This demo uses this functionality to add a header (a title before exported data) and a footer (a note after exported data). - Review the [onExporting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onExporting) handler to see the data export code. The functions that create header and footer sections utilize the following customization features: @@ -7,3 +6,4 @@ Review the [onExporting](/Documentation/ApiReference/UI_Components/dxDataGrid/Co - Cell values formatting - Font properties - Text alignment + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/ExcelJSOverview/description.md b/apps/demos/Demos/DataGrid/ExcelJSOverview/description.md index 809d32380cec..b95a10f7dc81 100644 --- a/apps/demos/Demos/DataGrid/ExcelJSOverview/description.md +++ b/apps/demos/Demos/DataGrid/ExcelJSOverview/description.md @@ -1,11 +1,11 @@ To enable export in the DataGrid, reference or import the ExcelJS and FileSaver libraries. Set **export**.[enabled](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/export/#enabled) to **true**. - Once the conditions above are met, use the [exportDataGrid(options)](/Documentation/ApiReference/Common/Utils/excelExporter/#exportDataGridoptions) method to export the DataGrid to an Excel workbook. Review the [onExporting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onExporting) handler to see the data export code. DataGrid is exported as is to a single worksheet. You can also set [allowExportSelectedData](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/export/#allowExportSelectedData) to **true** to export only selected rows. You can export DataGrid to CSV. Call the **exportDataGrid(options)** method as shown in the following ticket: Export PivotGrid into CSV file. + [note] diff --git a/apps/demos/Demos/DataGrid/FilterPanel/description.md b/apps/demos/Demos/DataGrid/FilterPanel/description.md index 42ee8ef4d3e2..2865f248f546 100644 --- a/apps/demos/Demos/DataGrid/FilterPanel/description.md +++ b/apps/demos/Demos/DataGrid/FilterPanel/description.md @@ -1,8 +1,8 @@ The [Filter panel](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/filterPanel/) is a UI element that displays the combined filter. This filter is stored in the [filterValue](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#filterValue) property and consists of filters that users apply in other UI elements ([filter row](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/filterRow/), [header filter](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/headerFilter/), [filterBuilder](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#filterBuilder)). - To display the filter panel, set the **filterPanel**.[visible](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/filterPanel/#visible) property to **true**. A click on the combined filter calls the integrated filter builder. You can configure it in the [filterBuilder](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#filterBuilder) object. In this demo, this object is used to add the `weekends` [custom filter operation](/Documentation/ApiReference/UI_Components/dxFilterBuilder/Configuration/customOperations). + -The intergrated filter builder is displayed in a pop-up window (the DevExtreme [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) component). Its default configuration is defined automatically, but you can change it in the [filterBuilderPopup](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#filterBuilderPopup) object. In this example, this object is used to specify the [position](/Documentation/ApiReference/UI_Components/dxPopup/Configuration/#position) of the pop-up window. +The intergrated filter builder is displayed in a pop-up window (the DevExtreme [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) component). Its default configuration is defined automatically, but you can change it in the [filterBuilderPopup](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#filterBuilderPopup) object. In this example, this object is used to specify the [position](/Documentation/ApiReference/UI_Components/dxPopup/Configuration/#position) of the pop-up window. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/FocusedRow/description.md b/apps/demos/Demos/DataGrid/FocusedRow/description.md index f3f9cd746dee..d39fe26bc01a 100644 --- a/apps/demos/Demos/DataGrid/FocusedRow/description.md +++ b/apps/demos/Demos/DataGrid/FocusedRow/description.md @@ -1,8 +1,8 @@ The DataGrid component can highlight the focused row. To enable this feature, set the [focusedRowEnabled](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#focusedRowEnabled) property to **true**. - To focus a row programmatically, specify the [focusedRowKey](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#focusedRowKey) property. The DataGrid automatically scrolls to the focused row if the [autoNavigateToFocusedRow](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#autoNavigateToFocusedRow) property is enabled. In the UI, users can click a row to focus it. The focused row is saved in the DataGrid's [state](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/stateStoring/). You can use the [onFocusedRowChanging](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onFocusedRowChanging) or [onFocusedRowChanged](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onFocusedRowChanged) property to specify a custom function that is executed before or after a row is focused. + In this demo, the row with the `117` key is focused initially. You can specify the `focusedRowKey` and `autoNavigateToFocusedRow` properties via the input field and the checkbox below the DataGrid. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/FormEditing/description.md b/apps/demos/Demos/DataGrid/FormEditing/description.md index 76e29165f806..044d82c36a7b 100644 --- a/apps/demos/Demos/DataGrid/FormEditing/description.md +++ b/apps/demos/Demos/DataGrid/FormEditing/description.md @@ -1,9 +1,9 @@ The DataGrid can use the [Form](/Documentation/ApiReference/UI_Components/dxForm/) component to arrange cell editors when users modify a row. The Form allows users to edit values from [visible and hidden](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#visible) columns (see the `Notes` column). - To enable form edit mode, configure the following properties: - Set **editing**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#mode) to *"form"* - Assign **true** to the [editing](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/) object's [allowAdding](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowAdding), [allowUpdating](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowUpdating), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowDeleting) properties. + A column's default editor is defined automatically based on this column's [dataType](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#dataType). To customize this editor or replace it with another editor, use the column's [formItem](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#formItem) object. This demo shows how to replace the default editor in the `Notes` column with a [TextArea](/Documentation/ApiReference/UI_Components/dxTextArea/). Refer to the [SimpleItem](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/SimpleItem/) help topic for information on all settings that you can define in the **formItem** object. If you need more information about editor customization in DataGrid Form, review the following topic: [Customize Edit Form](/Documentation/Guide/UI_Components/DataGrid/Editing/#Customize_Edit_Form). diff --git a/apps/demos/Demos/DataGrid/GridAdaptabilityOverview/description.md b/apps/demos/Demos/DataGrid/GridAdaptabilityOverview/description.md index 54468c05da63..1189a968dd68 100644 --- a/apps/demos/Demos/DataGrid/GridAdaptabilityOverview/description.md +++ b/apps/demos/Demos/DataGrid/GridAdaptabilityOverview/description.md @@ -1,4 +1,4 @@ DataGrid automatically adapts its layout to screens with different sizes. In this demo, you can switch between horizontal and vertical screen orientations. If columns do not fit the selected orientation, the DataGrid hides them one by one, starting with the rightmost column. Information from the hidden columns is still available in adaptive detail rows. - To enable this feature, set the [columnHidingEnabled](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#columnHidingEnabled) property to **true**. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/GridColumnsHidingPriority/description.md b/apps/demos/Demos/DataGrid/GridColumnsHidingPriority/description.md index fd88b49201c0..04644e4d7451 100644 --- a/apps/demos/Demos/DataGrid/GridColumnsHidingPriority/description.md +++ b/apps/demos/Demos/DataGrid/GridColumnsHidingPriority/description.md @@ -1,4 +1,4 @@ When the DataGrid adapts its layout to smaller screens, it hides columns based on the [hidingPriority](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#hidingPriority). Columns with lower values are hidden first. - In this demo, the `CustomerStoreCity` column is hidden in vertical and horizontal orientation modes because its **hidingPriority** is 0. The `CustomerStoreState` and `OrderDate` columns have a priority of 1 and 2. The DataGrid hides these columns after the `CustomerStoreCity` column, only when the screen orientation is vertical. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/InfiniteScrolling/description.md b/apps/demos/Demos/DataGrid/InfiniteScrolling/description.md index fb6e2900f548..5e96e69ac13b 100644 --- a/apps/demos/Demos/DataGrid/InfiniteScrolling/description.md +++ b/apps/demos/Demos/DataGrid/InfiniteScrolling/description.md @@ -1,6 +1,6 @@ If the DataGrid component is bound to a large dataset, you can enable infinite scroll mode to optimize data load times and improve user navigation. The component initially displays one page of rows. When users scroll to the end of the view, the DataGrid loads an additional page. Users can only load pages sequentially and cannot skip to arbitrary positions within the dataset. - To enable infinite scroll mode, set the **scrolling**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/scrolling/#mode) to *"infinite"*. In this demo, the DataGrid is bound to a dataset of 100,000 records. Scroll to the last record to load the next page of records. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/KeyboardNavigation/description.md b/apps/demos/Demos/DataGrid/KeyboardNavigation/description.md index db6c1ff56bc6..f2068e57cfb6 100644 --- a/apps/demos/Demos/DataGrid/KeyboardNavigation/description.md +++ b/apps/demos/Demos/DataGrid/KeyboardNavigation/description.md @@ -1,5 +1,4 @@ -In this demo, you can use the following keys and key combinations to interact with the DataGrid. - +In this demo, you can use the following keys and key combinations to interact with the DataGrid: - **Enter** Execute an action on a focused element. @@ -9,3 +8,4 @@ Navigate within DataGrid elements. - **Ctrl** + **↑** or **Ctrl** + **↓** Navigate between a column header, filter row, data area, filter panel, and pager. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/LocalReordering/description.md b/apps/demos/Demos/DataGrid/LocalReordering/description.md index 4ee187144da6..ec1a4bb7fdbf 100644 --- a/apps/demos/Demos/DataGrid/LocalReordering/description.md +++ b/apps/demos/Demos/DataGrid/LocalReordering/description.md @@ -1,6 +1,6 @@ The DataGrid allows users to drag and drop rows. Use the icon to the left of the row as the drag handle. - To enable this feature, set the [allowReordering](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/rowDragging/#allowReordering) property to **true** and change the row index in the [onReorder](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/rowDragging/#onReorder) function. -Use the [rowDragging](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/rowDragging/) object to configure the row drag and drop feature. \ No newline at end of file +Use the [rowDragging](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/rowDragging/) object to configure the row drag and drop feature. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/MultiRowHeadersBands/description.md b/apps/demos/Demos/DataGrid/MultiRowHeadersBands/description.md index e0134d70b885..999c8fb0e1fe 100644 --- a/apps/demos/Demos/DataGrid/MultiRowHeadersBands/description.md +++ b/apps/demos/Demos/DataGrid/MultiRowHeadersBands/description.md @@ -1,7 +1,7 @@ Our DataGrid component allows you to group multiple columns under one header (band). This demo shows an example: the "Nominal GDP" and "Population" bands have banded columns. - You can drag one of the bands across the grid to reorder all its banded columns simultaneously. You can also move the band to the column chooser and hide the banded columns. Banded columns remain interactive. + To create the banded layout, do one of the following: diff --git a/apps/demos/Demos/DataGrid/MultipleRecordSelectionAPI/description.md b/apps/demos/Demos/DataGrid/MultipleRecordSelectionAPI/description.md index 06144f004a84..a89bd1ebc164 100644 --- a/apps/demos/Demos/DataGrid/MultipleRecordSelectionAPI/description.md +++ b/apps/demos/Demos/DataGrid/MultipleRecordSelectionAPI/description.md @@ -1,5 +1,4 @@ -DataGrid has the following API for multiple record selection. - +DataGrid has the following API for multiple record selection: * [selectAll()](/Documentation/ApiReference/UI_Components/dxDataGrid/Methods/#selectAll) / [deselectAll()](/Documentation/ApiReference/UI_Components/dxDataGrid/Methods/#deselectAll) Selects / deselects all rows or current page rows, depending on the value of [selectAllMode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/selection/#selectAllMode). @@ -15,5 +14,6 @@ Clears the selection of all rows on all pages. * [getSelectedRowKeys()](/Documentation/ApiReference/UI_Components/dxDataGrid/Methods/#getSelectedRowKeys) / [getSelectedRowsData()](/Documentation/ApiReference/UI_Components/dxDataGrid/Methods/#getSelectedRowsData) Gets the selected rows' keys or data objects. + In this demo, **selectAll()** or **selectRows(keys, preserve)** is called when you change the SelectBox value and **clearSelection()** is called when you click the Clear Selection button. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/MultipleRecordSelectionModes/description.md b/apps/demos/Demos/DataGrid/MultipleRecordSelectionModes/description.md index 396ce036b91f..975109b54704 100644 --- a/apps/demos/Demos/DataGrid/MultipleRecordSelectionModes/description.md +++ b/apps/demos/Demos/DataGrid/MultipleRecordSelectionModes/description.md @@ -1,8 +1,8 @@ This demo sets **selection**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/selection/#mode) to *"multiple"*. This allows users to select multiple rows using checkboxes or keyboard shortcuts. - To configure when the checkboxes appear, set the [showCheckBoxesMode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/selection/#showCheckBoxesMode) property. The checkbox in the header selects all rows or current page rows, depending on the [selectAllMode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/selection/#selectAllMode) value. If you want to disable this checkbox, set [allowSelectAll](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/selection/#allowSelectAll) to **false**. -In this demo, you can use the drop-down menus under the grid to change the **showCheckBoxesMode** and **selectAllMode** values. \ No newline at end of file +In this demo, you can use the drop-down menus under the grid to change the **showCheckBoxesMode** and **selectAllMode** values. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/OdataService/description.md b/apps/demos/Demos/DataGrid/OdataService/description.md index 2c5556a44117..1331ddb47119 100644 --- a/apps/demos/Demos/DataGrid/OdataService/description.md +++ b/apps/demos/Demos/DataGrid/OdataService/description.md @@ -1,7 +1,7 @@ To fetch data from an OData service, implement an [ODataStore](/Documentation/ApiReference/Data_Layer/ODataStore/). Use its properties to specify the service's [url](/Documentation/ApiReference/Data_Layer/ODataStore/Configuration/#url), [key](/Documentation/ApiReference/Data_Layer/ODataStore/Configuration/#key) data field, and OData [version](/Documentation/ApiReference/Data_Layer/ODataStore/Configuration/#version) if it is different from 2. - You can configure **ODataStore** as a standalone element (see [OData](/Documentation/Guide/Data_Binding/Specify_a_Data_Source/OData/) for details), but this demo assigns **ODataStore** settings to the [store](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/store/) field of the [DataSource](/Documentation/ApiReference/Data_Layer/DataSource/) configuration object. If you follow the same pattern in your application, make sure to set the **store**'s [type](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/store/#type) property to *"odata"*. + The **DataSource** configuration object allows you to sort, filter, group, and otherwise shape the store's data objects. This demo [filters](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/#filter) data and [selects](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/#select) a limited number of fields. diff --git a/apps/demos/Demos/DataGrid/Overview/Angular/description.md b/apps/demos/Demos/DataGrid/Overview/Angular/description.md index 25a790166097..71036ee8fbb2 100644 --- a/apps/demos/Demos/DataGrid/Overview/Angular/description.md +++ b/apps/demos/Demos/DataGrid/Overview/Angular/description.md @@ -1,6 +1,6 @@ DevExtreme Angular Data Grid is a responsive grid control with a vast assortment of capabilities, including data editing and validation, searching and filtering, layout customization. It supports native Angular features too: AOT compilation, declarative configuration, TypeScript compile-time checking, and more. - To get started with the DevExtreme DataGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with DataGrid](/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/). -For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). \ No newline at end of file +For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/Overview/React/description.md b/apps/demos/Demos/DataGrid/Overview/React/description.md index 24848be4ddb1..1cbc91b3ec3e 100644 --- a/apps/demos/Demos/DataGrid/Overview/React/description.md +++ b/apps/demos/Demos/DataGrid/Overview/React/description.md @@ -1,6 +1,6 @@ DevExtreme React DataGrid is a feature-rich grid control. Its main features include robust data layer, fast data processing, client-side data validation, and many more. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - To get started with the DevExtreme DataGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with DataGrid](/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/). -For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). \ No newline at end of file +For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/Overview/ReactJs/description.md b/apps/demos/Demos/DataGrid/Overview/ReactJs/description.md index 24848be4ddb1..1cbc91b3ec3e 100644 --- a/apps/demos/Demos/DataGrid/Overview/ReactJs/description.md +++ b/apps/demos/Demos/DataGrid/Overview/ReactJs/description.md @@ -1,6 +1,6 @@ DevExtreme React DataGrid is a feature-rich grid control. Its main features include robust data layer, fast data processing, client-side data validation, and many more. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - To get started with the DevExtreme DataGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with DataGrid](/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/). -For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). \ No newline at end of file +For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/Overview/Vue/description.md b/apps/demos/Demos/DataGrid/Overview/Vue/description.md index 8b1121c43aa4..6040f24ee7dc 100644 --- a/apps/demos/Demos/DataGrid/Overview/Vue/description.md +++ b/apps/demos/Demos/DataGrid/Overview/Vue/description.md @@ -1,6 +1,6 @@ DevExtreme Vue Data Grid is a a client-side grid component that includes all the features needed for use in a modern business application: powerful data binding, editing, and validation capabilities, versatile searching and filtering, flexible layout, and many more. You can use Vue syntax and techniques to instantiate and configure the Data Grid or handle its events. In addition, the Data Grid supports [prop validation](https://vuejs.org/v2/guide/components-props.html#Prop-Validation) and templates that use [named slots](https://vuejs.org/v2/guide/components-slots.html#Named-Slots). [Find out more about DevExtreme Vue components](/Documentation/Guide/Vue_Components/DevExtreme_Vue_Components/). - To get started with the DevExtreme DataGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with DataGrid](/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/). -For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). \ No newline at end of file +For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/Overview/jQuery/description.md b/apps/demos/Demos/DataGrid/Overview/jQuery/description.md index e5aff9362f42..e1df0b8a7425 100644 --- a/apps/demos/Demos/DataGrid/Overview/jQuery/description.md +++ b/apps/demos/Demos/DataGrid/Overview/jQuery/description.md @@ -1,6 +1,6 @@ DevExtreme JavaScript DataGrid is a client-side grid control available as a jQuery component. This control supports binding to data from local arrays, JSON files, Web API and OData services, as well as custom remote services. Check out other demos in this section to explore more DataGrid features, like data editing and validation, paging, scrolling, etc. - To get started with the DevExtreme DataGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with DataGrid](/Documentation/Guide/UI_Components/DataGrid/Getting_Started_with_DataGrid/). -For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). \ No newline at end of file +For a complete overview of DataGrid options, check the [DataGrid API Reference](/Documentation/ApiReference/UI_Components/dxDataGrid/). + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/PDFCellCustomization/description.md b/apps/demos/Demos/DataGrid/PDFCellCustomization/description.md index 4a7b6075ee2b..9a8613b8ebf5 100644 --- a/apps/demos/Demos/DataGrid/PDFCellCustomization/description.md +++ b/apps/demos/Demos/DataGrid/PDFCellCustomization/description.md @@ -1,5 +1,4 @@ DataGrid allows you to modify cell style settings and custom paint cells in a PDF document. - Use the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customizeCell) function to customize the appearance settings of DataGrid cells in a PDF document. For example, you can change the text alignment and the background color of cells. The following function parameters are available: @@ -7,6 +6,7 @@ Use the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/Pdf Contains information about the source DataGrid cell. - **pdfCell** Contains settings applied to a cell in a PDF document. + In this demo, the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customizeCell) function changes the following elements: - Background color and font weight of group row cells @@ -25,4 +25,4 @@ Contains settings applied to a cell in a PDF document. - **cancel** Set this parameter to **true** to prevent default painting logic. -This demo uses the [customDrawCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customDrawCell) function to paint cells in the "Website" column. +This demo uses the [customDrawCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customDrawCell) function to paint cells in the "Website" column. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/PDFExportImages/description.md b/apps/demos/Demos/DataGrid/PDFExportImages/description.md index c1c79e75cb2f..d9637ef066e1 100644 --- a/apps/demos/Demos/DataGrid/PDFExportImages/description.md +++ b/apps/demos/Demos/DataGrid/PDFExportImages/description.md @@ -1,4 +1,4 @@ This demo shows how to configure the DataGrid to export data with images to a PDF document. - -Use the [customDrawCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customDrawCell) function to redraw the content of the cell. Inside this function, implement the **jsPDF**.addImage() method that specifies image data. Specify the [onRowExporting](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#onRowExporting) function to change the height of the rows to fit the images. \ No newline at end of file +Use the [customDrawCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customDrawCell) function to redraw the content of the cell. Inside this function, implement the **jsPDF**.addImage() method that specifies image data. Specify the [onRowExporting](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#onRowExporting) function to change the height of the rows to fit the images. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/PDFExportMultipleGrids/description.md b/apps/demos/Demos/DataGrid/PDFExportMultipleGrids/description.md index aa3a13fa028a..846aa0045ac7 100644 --- a/apps/demos/Demos/DataGrid/PDFExportMultipleGrids/description.md +++ b/apps/demos/Demos/DataGrid/PDFExportMultipleGrids/description.md @@ -1,6 +1,6 @@ This demo shows two DataGrids in different tabs. Click the **Export multiple grids** button to export two grids and arrange them on different pages of the PDF document. - To implement this functionality, call the [exportDataGrid(options)](/Documentation/ApiReference/Common/Utils/pdfExporter/#exportDataGridoptions) methods in a chain of Promises, one after another. Use the **jsPDF**.addPage() method to add a page in the PDF document. -You can use the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customizeCell) function to customize cell appearance in the PDF document. In this demo, the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customizeCell) function highlights alternate (even) rows. \ No newline at end of file +You can use the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customizeCell) function to customize cell appearance in the PDF document. In this demo, the [customizeCell](/Documentation/ApiReference/Common/Object_Structures/PdfExportDataGridProps/#customizeCell) function highlights alternate (even) rows. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/PDFOverview/description.md b/apps/demos/Demos/DataGrid/PDFOverview/description.md index 3ff3f44cc48e..a85bc149c7b1 100644 --- a/apps/demos/Demos/DataGrid/PDFOverview/description.md +++ b/apps/demos/Demos/DataGrid/PDFOverview/description.md @@ -1,5 +1,4 @@ The [DataGrid](/Documentation/ApiReference/UI_Components/dxDataGrid/) allows you to export its contents to a PDF document. - To enable PDF export operations, import the jsPDF library and set the **export**.[enabled](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/export/#enabled) property to **true**. @@ -12,6 +11,7 @@ Specifies the jsPDF< Specifies the DataGrid's instance. To review implementation details, see the [exportDataGrid(options)](/Documentation/ApiReference/Common/Utils/pdfExporter/#exportDataGridoptions) method call in [onExporting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onExporting) handler. You can also set [allowExportSelectedData](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/export/#allowExportSelectedData) to **true** to export only selected rows. + [note] diff --git a/apps/demos/Demos/DataGrid/PopupEditing/description.md b/apps/demos/Demos/DataGrid/PopupEditing/description.md index f86ca16de35b..bf7ebe4aa5ca 100644 --- a/apps/demos/Demos/DataGrid/PopupEditing/description.md +++ b/apps/demos/Demos/DataGrid/PopupEditing/description.md @@ -1,8 +1,8 @@ DataGrid can display a popup edit form. The form can include any fields from the bound data source, regardless of whether the corresponding column is visible in the grid (see the `Notes` and `Address` columns). - To enable this behavior in your application, do the following: - Set **editing**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#mode) to *"popup"*. - Set the [editing](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/) object's [allowUpdating](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowUpdating), [allowAdding](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowAdding), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowDeleting) properties to **true**. + DataGrid uses the DevExtreme [Form](/Documentation/ApiReference/UI_Components/dxForm/) and [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) components to display the form and the popup. Their default configurations are defined automatically. If these configurations do not meet your requirements, you can redefine them in the **editing** object's [form](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#form) and [popup](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#popup) properties as shown in this demo. For more information about this edit mode's limitations, refer to the descriptions of these properties. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/RecordGrouping/description.md b/apps/demos/Demos/DataGrid/RecordGrouping/description.md index 08833fc9d5c1..64bc1dca87a8 100644 --- a/apps/demos/Demos/DataGrid/RecordGrouping/description.md +++ b/apps/demos/Demos/DataGrid/RecordGrouping/description.md @@ -1,10 +1,10 @@ The DataGrid allows users to group data against a single column or multiple columns. - To group data, users can drag and drop column headers onto and from the area above the grid. This area is called the [groupPanel](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/groupPanel/). Set its **visible** property to **true** to show it. Users can reorder headers within the **groupPanel** to change group hierarchy. To enable this functionality, set the [allowColumnReordering](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#allowColumnReordering) property to *"true"*. + To group data against a single **column**, apply the [groupIndex](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#groupIndex) property to it. This property accepts a zero-based index number that controls the column order. In this example, the data is grouped against the *State* column. -You can also use the [grouping](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/grouping/) object to specify user interaction settings related to grouping. This demo illustrates the [autoExpandAll](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/grouping/#autoExpandAll) property that specifies whether the groups appear expanded. +You can also use the [grouping](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/grouping/) object to specify user interaction settings related to grouping. This demo illustrates the [autoExpandAll](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/grouping/#autoExpandAll) property that specifies whether the groups appear expanded. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/RemoteGrouping/description.md b/apps/demos/Demos/DataGrid/RemoteGrouping/description.md index 39c79f47f18b..6fee2a94a9b0 100644 --- a/apps/demos/Demos/DataGrid/RemoteGrouping/description.md +++ b/apps/demos/Demos/DataGrid/RemoteGrouping/description.md @@ -1,7 +1,7 @@ Remote (server-side) operations can boost the DataGrid's performance on large datasets. In this demo, the DataGrid works with a million records seamlessly because they are processed on the server. - To notify the DataGrid that it works with a pre-processed dataset, set the [remoteOperations](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/remoteOperations/) property to **true**. + You can also specify properties that allow the DataGrid to load data on demand to reduce the amount of transmitted data. Set the **grouping**.[autoExpandAll](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/grouping/#autoExpandAll) property to **false** to collapse all the groups at startup. Data for each group is loaded only when the user expands the group. Enable the *"virtual"* **scrolling**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/scrolling/#mode) to load only those records that come into the viewport when the grid is scrolled vertically. diff --git a/apps/demos/Demos/DataGrid/RemoteReordering/description.md b/apps/demos/Demos/DataGrid/RemoteReordering/description.md index fae188b83951..53c31ecc02b5 100644 --- a/apps/demos/Demos/DataGrid/RemoteReordering/description.md +++ b/apps/demos/Demos/DataGrid/RemoteReordering/description.md @@ -1,7 +1,7 @@ This demo shows how to use drag and drop to reorder records stored on the server. This functionality requires that records' order indexes are in an individual data field (`OrderIndex` in this demo) and sorted against that field. - Row drag and drop is configured in the [rowDragging][5] object. Set [allowReordering][2] to **true** to enable this feature. To specify the highlight mode of the row's drop position, use the [dropFeedbackMode][6] property. In this demo, it is set to *"push"*: rows move up or down with animation to create space for the new position of the row. + When a row is dropped, the [onReorder][0] event handler is called. Use it to update the record's `OrderIndex` on the server. In this demo, we use the **onReorder** function's `toIndex` parameter to obtain the position at which a user dropped the row. The position is then used to get the new order index. The store's [update][1] method sends this index to the server where the records are sorted and returned to the client. Server-side implementation is available in the [ASP.NET Core][3] and [ASP.NET MVC 5][4] versions of this demo under the `DataGridRowReorderingController.cs` tab. diff --git a/apps/demos/Demos/DataGrid/RightToLeftSupport/description.md b/apps/demos/Demos/DataGrid/RightToLeftSupport/description.md index 02d321008ed5..0dbafbd14e17 100644 --- a/apps/demos/Demos/DataGrid/RightToLeftSupport/description.md +++ b/apps/demos/Demos/DataGrid/RightToLeftSupport/description.md @@ -1,4 +1,4 @@ DevExtreme supports right-to-left layouts. To change a layout to RTL, set the DataGrid's [rtlEnabled](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#rtlEnabled) property to **true**. You can also set **rtlEnabled** to **true** in the project's [globalConfig](/Documentation/ApiReference/Common/Object_Structures/globalConfig/) to apply RTL to all DevExtreme components in your application. - In this demo, you can use the drop-down menu to switch between the different layouts. Note that this demo updates the [dataField](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#dataField) and [caption](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#caption) properties to display translated content when you change the **rtlEnabled** value. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/RowEditingAndEditingEvents/description.md b/apps/demos/Demos/DataGrid/RowEditingAndEditingEvents/description.md index ad46b621e421..20500687fcdf 100644 --- a/apps/demos/Demos/DataGrid/RowEditingAndEditingEvents/description.md +++ b/apps/demos/Demos/DataGrid/RowEditingAndEditingEvents/description.md @@ -1,7 +1,7 @@ The DataGrid allows users to edit data in multiple modes. This demo shows the *"row"* edit mode. To start editing any row, click *"Edit"* in it. Only one row can be in the edit state at a time. - To enable row edit mode, set the [mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#mode) property to "row" and assign true to the editing object's [allowUpdating](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowUpdating), [allowAdding](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowAdding), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/editing/#allowDeleting) properties. + Edit operations raise events that you can handle with the following functions: - [onEditingStart](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onEditingStart) diff --git a/apps/demos/Demos/DataGrid/RowSelection/description.md b/apps/demos/Demos/DataGrid/RowSelection/description.md index 3fbbf1021ced..48475633f45a 100644 --- a/apps/demos/Demos/DataGrid/RowSelection/description.md +++ b/apps/demos/Demos/DataGrid/RowSelection/description.md @@ -1,4 +1,4 @@ In this demo, the DataGrid allows users to select only one row at a time. To enable this mode, set the **selection**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/selection/#mode) property to *"single"*. Press Ctrl to unselect a row. - -You can access the selected row data from the [onSelectionChanged](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onSelectionChanged) function. In this demo, this function fetches the selected row's information and displays it under the grid. \ No newline at end of file +You can access the selected row data from the [onSelectionChanged](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#onSelectionChanged) function. In this demo, this function fetches the selected row's information and displays it under the grid. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/SignalRService/description.md b/apps/demos/Demos/DataGrid/SignalRService/description.md index 3c762eb7ad9f..d37bb12c5f5a 100644 --- a/apps/demos/Demos/DataGrid/SignalRService/description.md +++ b/apps/demos/Demos/DataGrid/SignalRService/description.md @@ -1,9 +1,9 @@ This example demonstrates real-time data update in a **DataGrid** bound to a SignalR service. Access to the service is configured in a [CustomStore](/Documentation/ApiReference/Data_Layer/CustomStore/). - The **CustomStore** fetches the remote dataset at launch and keeps its local copy. Whenever the remote dataset changes, the server calls a client-side function that updates the local copy of the dataset (`updateStockPrices` in this demo). This function uses the store's [push(changes)](/Documentation/ApiReference/Data_Layer/CustomStore/Methods/#pushchanges) method. For server-side configuration, refer to the [ASP.NET MVC version of this demo](https://demos.devexpress.com/ASPNetMvc/Demo/DataGrid/SignalRService). + For more information about integration with push services, refer to the following help topic: [Integration with Push Services](/Documentation/Guide/Data_Binding/Data_Layer/#Data_Modification/Integration_with_Push_Services). diff --git a/apps/demos/Demos/DataGrid/SimpleArray/description.md b/apps/demos/Demos/DataGrid/SimpleArray/description.md index 0c4c825cc410..6d5c041bde61 100644 --- a/apps/demos/Demos/DataGrid/SimpleArray/description.md +++ b/apps/demos/Demos/DataGrid/SimpleArray/description.md @@ -1,4 +1,4 @@ You can use the DataGrid component to display and edit data from an array of objects. Use the [dataSource](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#dataSource) and [keyExpr](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#keyExpr) properties to specify the bound array and its key field. For more information, refer to the following help topic: [Local Array](/Documentation/Guide/Data_Binding/Specify_a_Data_Source/Local_Array/). - -Use the [columns](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/) property to specify a list of data fields you want to display within the DataGrid as columns. If the **columns** property is not specified, the component creates columns for all data fields available in objects from the bound array. \ No newline at end of file +Use the [columns](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/) property to specify a list of data fields you want to display within the DataGrid as columns. If the **columns** property is not specified, the component creates columns for all data fields available in objects from the bound array. + \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/VirtualScrolling/description.md b/apps/demos/Demos/DataGrid/VirtualScrolling/description.md index 21d18aee996e..c7874382953a 100644 --- a/apps/demos/Demos/DataGrid/VirtualScrolling/description.md +++ b/apps/demos/Demos/DataGrid/VirtualScrolling/description.md @@ -1,6 +1,6 @@ If the DataGrid component is bound to a large dataset, you can enable the virtual scroll feature to optimize data load times and improve user navigation. The component calculates the overall number of visible rows and displays a scrollbar that allows users to navigate to any section of rows. When users release the scroll thumb, the control loads records to be displayed in the viewport and removes other rows from memory. - To allow users to scroll the DataGrid virtually, set the **scrolling**.[mode](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/scrolling/#mode) to *"virtual"*. + -In this demo, the DataGrid is bound to a local dataset of 100,000 records. You can drag the scrollbar on the right to see that records within the viewport are updated immediately. +In this demo, the DataGrid is bound to a local dataset of 100,000 records. You can drag the scrollbar on the right to see that records within the viewport are updated immediately. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/WebAPIService/description.md b/apps/demos/Demos/DataGrid/WebAPIService/description.md index e9e35b3c05ac..1117be2e7cfb 100644 --- a/apps/demos/Demos/DataGrid/WebAPIService/description.md +++ b/apps/demos/Demos/DataGrid/WebAPIService/description.md @@ -1,7 +1,7 @@ To access a Web API service from the client, use the createStore method which is part of the DevExtreme.AspNet.Data extension. This extension also allows you to process data for DevExtreme components on the server. The server-side implementation is available under the `DataGridWebApiController.cs` tab in the [ASP.NET MVC version of this demo](https://demos.devexpress.com/ASPNetMvc/Demo/DataGrid/WebAPIService). - To notify the DataGrid that data is processed on the server, set the [remoteOperations](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/remoteOperations/) property to **true**. + ### A 1-Click Solution for CRUD Web API Services with Role-based Access Control via EF Core diff --git a/apps/demos/Demos/Diagram/Adaptability/description.md b/apps/demos/Demos/Diagram/Adaptability/description.md index 36f07fa905d2..b878044ffa83 100644 --- a/apps/demos/Demos/Diagram/Adaptability/description.md +++ b/apps/demos/Demos/Diagram/Adaptability/description.md @@ -1,5 +1,4 @@ The Diagram can adapt its layout to narrow screens. In this demo, the component's **Height** property is set to 100% to fit a screen. - Note the following changes to the toolbox and properties panel: @@ -8,4 +7,5 @@ Note the following changes to the toolbox and properties panel: * A tool slides out of the screen when a user drags a shape from the toolbox or edits an item's text. * Only one tool can be displayed at a time. -You can switch between landscape and portrait layouts to see the Diagram's appearance and behavior on wide and narrow screens. \ No newline at end of file +You can switch between landscape and portrait layouts to see the Diagram's appearance and behavior on wide and narrow screens. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/AdvancedDataBinding/description.md b/apps/demos/Demos/Diagram/AdvancedDataBinding/description.md index 0cd78e7c4b03..fb4c1d7fc4a7 100644 --- a/apps/demos/Demos/Diagram/AdvancedDataBinding/description.md +++ b/apps/demos/Demos/Diagram/AdvancedDataBinding/description.md @@ -1,5 +1,6 @@ The Diagram component accepts functions as expression property values. It allows you to implement custom logic when you bind a diagram to a data source. - + In this demo, the [nodes](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/) and [edges](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/edges/) collections are bound to a data source. Custom functions are used to get different shape types and font styles for items based on additional data source information. -The [autoLayout](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/autoLayout/) property specifies an auto-layout algorithm type and orientation that the component uses to build diagrams. \ No newline at end of file +The [autoLayout](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/autoLayout/) property specifies an auto-layout algorithm type and orientation that the component uses to build diagrams. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/Containers/description.md b/apps/demos/Demos/Diagram/Containers/description.md index 53e63831c8f7..862bceddc416 100644 --- a/apps/demos/Demos/Diagram/Containers/description.md +++ b/apps/demos/Demos/Diagram/Containers/description.md @@ -1,5 +1,4 @@ This demo shows the Diagram component's capability to wrap shapes into containers. A container is a special shape with the following features: - * A container can contain other shapes (including other containers). * A container is dragged with its content. @@ -7,4 +6,5 @@ This demo shows the Diagram component's capability to wrap shapes into container To wrap a shape, drop it into a container. -If you bind the Diagram to a data source, define the [containerKeyExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#containerKeyExpr) property to store information about the parent container in the data source. Otherwise, this information will be lost. \ No newline at end of file +If you bind the Diagram to a data source, define the [containerKeyExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#containerKeyExpr) property to store information about the parent container in the data source. Otherwise, this information will be lost. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/CustomShapesWithIcons/description.md b/apps/demos/Demos/Diagram/CustomShapesWithIcons/description.md index 463f31b06f25..d4328ac00a70 100644 --- a/apps/demos/Demos/Diagram/CustomShapesWithIcons/description.md +++ b/apps/demos/Demos/Diagram/CustomShapesWithIcons/description.md @@ -1,6 +1,6 @@ The Diagram component provides a collection of built-in shapes. You can extend this collection with custom shapes. - An array of custom shape objects is accessible through the [customShapes](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/customShapes/) property. For each custom shape object, you can specify the type, background image, default size, text, connection points, and other settings. Note that shape images should be supplied as SVG files. -This demo shows how to populate the shape collection with custom shape types, and how to use custom shapes in the Diagram. \ No newline at end of file +This demo shows how to populate the shape collection with custom shape types, and how to use custom shapes in the Diagram. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/CustomShapesWithTemplates/description.md b/apps/demos/Demos/Diagram/CustomShapesWithTemplates/description.md index 9cabc71f38e8..2ea03bc77b3a 100644 --- a/apps/demos/Demos/Diagram/CustomShapesWithTemplates/description.md +++ b/apps/demos/Demos/Diagram/CustomShapesWithTemplates/description.md @@ -1,9 +1,9 @@ The Diagram component provides the following properties to create custom shape templates. - * The [customShapeTemplate](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#customShapeTemplate) property defines a common template for all shapes in the component. * The [template](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/customShapes/#template) property defines a template for an individual shape. Template content must be presented as SVG elements. -In this demo, the [customShapeTemplate](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#customShapeTemplate) property adds the 'Show Details' link to a shape. When clicked, it displays a popup window that contains additional information about an employee. \ No newline at end of file +In this demo, the [customShapeTemplate](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#customShapeTemplate) property adds the 'Show Details' link to a shape. When clicked, it displays a popup window that contains additional information about an employee. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/CustomShapesWithTemplatesWithEditing/description.md b/apps/demos/Demos/Diagram/CustomShapesWithTemplatesWithEditing/description.md index 08c315ff009d..77623ef4a31a 100644 --- a/apps/demos/Demos/Diagram/CustomShapesWithTemplatesWithEditing/description.md +++ b/apps/demos/Demos/Diagram/CustomShapesWithTemplatesWithEditing/description.md @@ -1,7 +1,7 @@ In this demo, the [customShapeTemplate](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#customShapeTemplate) property defines a common shape template and adds the **Edit** and **Delete** links to a shape. These links allow users to modify and remove employee data from the data source. The Diagram component reloads modified diagram data whenever the data source changes. - The [onRequestLayoutUpdate](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#onRequestLayoutUpdate) function specifies whether the component must reapply its auto layout once the diagram is reloaded. + The [customDataExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#customDataExpr) property links custom employee information from the data source to diagram nodes. Changes made to data are reflected in the diagram's history. Undo and redo actions (available within the control's UI) allow users to rollback/reapply changes. diff --git a/apps/demos/Demos/Diagram/CustomShapesWithTexts/description.md b/apps/demos/Demos/Diagram/CustomShapesWithTexts/description.md index 01b1470c6bc7..95ca3e76bc44 100644 --- a/apps/demos/Demos/Diagram/CustomShapesWithTexts/description.md +++ b/apps/demos/Demos/Diagram/CustomShapesWithTexts/description.md @@ -1,6 +1,6 @@ The Diagram component allows you to bind a [customShapes](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/customShapes/) collection to a data source. In this demo, the collection is bound to an array of employee objects. The Diagram creates a shape for every employee data item in the data source and adds the shapes to the "employees" category. - The [toolbox](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/toolbox/) property allows you to add custom categories to a data toolbox. -Users can drag data items from the toolbox and drop them onto a canvas to create a diagram. \ No newline at end of file +Users can drag data items from the toolbox and drop them onto a canvas to create a diagram. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/ImagesInShapes/description.md b/apps/demos/Demos/Diagram/ImagesInShapes/description.md index d062a2d1877c..f7b5c77a961a 100644 --- a/apps/demos/Demos/Diagram/ImagesInShapes/description.md +++ b/apps/demos/Demos/Diagram/ImagesInShapes/description.md @@ -1,4 +1,4 @@ The Diagram component provides shapes with images that are specially designed for use in OrgCharts. You can select a shape with the following image positions: on the left, right, or top of the shape. - -In this demo, the Diagram is bound to a data source. The [imageUrlExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#imageUrlExpr) property specifies the name of a field that provides a path to images. \ No newline at end of file +In this demo, the Diagram is bound to a data source. The [imageUrlExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#imageUrlExpr) property specifies the name of a field that provides a path to images. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/ItemSelection/description.md b/apps/demos/Demos/Diagram/ItemSelection/description.md index 1330a7f5e28c..8110fcc1bd8c 100644 --- a/apps/demos/Demos/Diagram/ItemSelection/description.md +++ b/apps/demos/Demos/Diagram/ItemSelection/description.md @@ -1,5 +1,4 @@ The [onSelectionChanged](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#onSelectionChanged) function is executed after the selection is changed and allows you to access information about the selected items. In this demo, the function fetches selected shape information and displays it under the Diagram component. - The [onContentReady](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#onContentReady) function is handled to find the 'Greta Sims' shape, select it, and scroll to it. For this purpose, the following methods are called: @@ -7,3 +6,4 @@ The [onContentReady](/Documentation/ApiReference/UI_Components/dxDiagram/Configu * [setSelectedItems](/Documentation/ApiReference/UI_Components/dxDiagram/Methods/#setSelectedItemsitems) selects the specified items. * [scrollToItem](/Documentation/ApiReference/UI_Components/dxDiagram/Methods/#scrollToItemitem) scrolls the view area to the specified item. * [focus](/Documentation/ApiReference/UI_Components/dxDiagram/Methods/#focus) focuses the Diagram. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/NodesArrayHierarchicalStructure/description.md b/apps/demos/Demos/Diagram/NodesArrayHierarchicalStructure/description.md index f2c722c5c922..1ee4c60d729e 100644 --- a/apps/demos/Demos/Diagram/NodesArrayHierarchicalStructure/description.md +++ b/apps/demos/Demos/Diagram/NodesArrayHierarchicalStructure/description.md @@ -1,4 +1,4 @@ This demo shows the Diagram's ability to load an external tree structure from a hierarchical object. - -The component binds to a data object specified by the [dataSource](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#dataSource) property. You should set the [itemsExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#itemsExpr) property to the name of the field that provides data for nested items due to the data's hierarchical structure. \ No newline at end of file +The component binds to a data object specified by the [dataSource](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#dataSource) property. You should set the [itemsExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#itemsExpr) property to the name of the field that provides data for nested items due to the data's hierarchical structure. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/NodesArrayPlainStructure/description.md b/apps/demos/Demos/Diagram/NodesArrayPlainStructure/description.md index 0ebc91b18c62..e84b6eb52336 100644 --- a/apps/demos/Demos/Diagram/NodesArrayPlainStructure/description.md +++ b/apps/demos/Demos/Diagram/NodesArrayPlainStructure/description.md @@ -1,4 +1,4 @@ This demo shows the Diagram component's capability to load an external tree structure from a linear array. - -The component binds to a data object specified by the [dataSource](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#dataSource) property. You should specify the [keyExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#keyExpr) and [parentKeyExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#parentKeyExpr) properties because of the data's linear structure. The Diagram uses information from the key fields to transform linear data into a tree. \ No newline at end of file +The component binds to a data object specified by the [dataSource](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#dataSource) property. You should specify the [keyExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#keyExpr) and [parentKeyExpr](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/nodes/#parentKeyExpr) properties because of the data's linear structure. The Diagram uses information from the key fields to transform linear data into a tree. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/OperationRestrictions/description.md b/apps/demos/Demos/Diagram/OperationRestrictions/description.md index f4dbefdfa9bb..a1e6cbc0977b 100644 --- a/apps/demos/Demos/Diagram/OperationRestrictions/description.md +++ b/apps/demos/Demos/Diagram/OperationRestrictions/description.md @@ -1,4 +1,4 @@ Our Diagram component allows you to restrict edit operations as needed. To prohibit a specific operation, set its corresponding property within the [editing](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/editing/) property to **false**. - In this demo, the [onRequestEditOperation](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#onRequestEditOperation) function implements complex logic to determine whether an operation is allowed. The **reason** event parameter indicates whether the event is raised by a user action or via a UI update. If a user tries to perform a prohibited action, an error message is displayed. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/ReadOnly/description.md b/apps/demos/Demos/Diagram/ReadOnly/description.md index 34ddf6692a9c..c876e89b8f51 100644 --- a/apps/demos/Demos/Diagram/ReadOnly/description.md +++ b/apps/demos/Demos/Diagram/ReadOnly/description.md @@ -1,4 +1,4 @@ The Diagram component can operate in Read Only mode. In this mode, users are not permitted to edit a diagram; therefore, most of the UI elements are disabled. It is for this reason that the Toolbox and Properties panel in this demo are hidden. - -To switch the Diagram to Read Only mode, set the [readOnly](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#readOnly) property to true. \ No newline at end of file +To switch the Diagram to Read Only mode, set the [readOnly](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#readOnly) property to true. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/SimpleView/description.md b/apps/demos/Demos/Diagram/SimpleView/description.md index d331e8122bb4..599d3cbf76a8 100644 --- a/apps/demos/Demos/Diagram/SimpleView/description.md +++ b/apps/demos/Demos/Diagram/SimpleView/description.md @@ -1,4 +1,4 @@ This demo shows the Diagram component in Simple View mode. In this mode, the control does not divide the work area into pages and the diagram's content occupies all the available area inside the component. - -To enable Simple View mode, set the [simpleView](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#simpleView) property to true. \ No newline at end of file +To enable Simple View mode, set the [simpleView](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/#simpleView) property to true. + \ No newline at end of file diff --git a/apps/demos/Demos/Diagram/UICustomization/description.md b/apps/demos/Demos/Diagram/UICustomization/description.md index 2105b4015e57..e0ba0aadf516 100644 --- a/apps/demos/Demos/Diagram/UICustomization/description.md +++ b/apps/demos/Demos/Diagram/UICustomization/description.md @@ -1,5 +1,4 @@ The following properties allow you to customize the Diagram component's UI elements: - * [contextMenu](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/contextMenu/) * [contextToolbox](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/contextToolbox/) @@ -7,4 +6,5 @@ The following properties allow you to customize the Diagram component's UI eleme * [historyToolbar](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/historyToolbar/) * [viewToolbar](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/viewToolbar/) * [mainToolbar](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/mainToolbar/) -* [toolbox](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/toolbox/) \ No newline at end of file +* [toolbox](/Documentation/ApiReference/UI_Components/dxDiagram/Configuration/toolbox/) + \ No newline at end of file diff --git a/apps/demos/Demos/Drawer/LeftOrRightPosition/description.md b/apps/demos/Demos/Drawer/LeftOrRightPosition/description.md index a390cc1837c3..a085d881f1fc 100644 --- a/apps/demos/Demos/Drawer/LeftOrRightPosition/description.md +++ b/apps/demos/Demos/Drawer/LeftOrRightPosition/description.md @@ -1,5 +1,4 @@ Drawer is a dismissible or permanently visible panel that usually contains navigation elements. - To open or close the Drawer component in this demo, click the 'Hamburger' button. Each Drawer visibility change can adjust the layout in the following ways (see [openedStateMode](/Documentation/ApiReference/UI_Components/dxDrawer/Configuration/#openedStateMode)): @@ -11,6 +10,7 @@ The view shrinks to accommodate the Drawer. - "*overlap*" The Drawer overlaps the view. + Use the radio buttons at the bottom of this demo module to try different layout modes. You can also change the Drawer's [position](/Documentation/ApiReference/UI_Components/dxDrawer/Configuration/#position) and [revealMode](/Documentation/ApiReference/UI_Components/dxDrawer/Configuration/#revealMode) properties. diff --git a/apps/demos/Demos/Drawer/TopOrBottomPosition/description.md b/apps/demos/Demos/Drawer/TopOrBottomPosition/description.md index a390cc1837c3..a085d881f1fc 100644 --- a/apps/demos/Demos/Drawer/TopOrBottomPosition/description.md +++ b/apps/demos/Demos/Drawer/TopOrBottomPosition/description.md @@ -1,5 +1,4 @@ Drawer is a dismissible or permanently visible panel that usually contains navigation elements. - To open or close the Drawer component in this demo, click the 'Hamburger' button. Each Drawer visibility change can adjust the layout in the following ways (see [openedStateMode](/Documentation/ApiReference/UI_Components/dxDrawer/Configuration/#openedStateMode)): @@ -11,6 +10,7 @@ The view shrinks to accommodate the Drawer. - "*overlap*" The Drawer overlaps the view. + Use the radio buttons at the bottom of this demo module to try different layout modes. You can also change the Drawer's [position](/Documentation/ApiReference/UI_Components/dxDrawer/Configuration/#position) and [revealMode](/Documentation/ApiReference/UI_Components/dxDrawer/Configuration/#revealMode) properties. diff --git a/apps/demos/Demos/FileManager/Overview/description.md b/apps/demos/Demos/FileManager/Overview/description.md index a00b45a554a2..dde945a18871 100644 --- a/apps/demos/Demos/FileManager/Overview/description.md +++ b/apps/demos/Demos/FileManager/Overview/description.md @@ -1,7 +1,7 @@ The DevExtreme JavaScript FileManager component allows you to display and manage files and directories for different file systems. The FileManager uses file system providers to access file systems. - Use the [fileSystemProvider](/Documentation/ApiReference/UI_Components/dxFileManager/Configuration/#fileSystemProvider) property to configure the component's file system provider. The ["File System Types"](/Demos/WidgetsGallery/Demo/FileManager/BindingToFileSystem/NetCore/Light) demo group illustrates how to use the FileManager with different file system providers. + The component's default security settings provide read-only access to files and directories. Use the [permissions](/Documentation/ApiReference/UI_Components/dxFileManager/Configuration/permissions) property to deny or allow a user to copy, create, move, delete, rename, upload, and download files and directories. You can also specify file restrictions: allowed file extensions ([allowedFileExtensions](/Documentation/ApiReference/UI_Components/dxFileManager/Configuration/#allowedFileExtensions)), chunk size ([chunkSize](/Documentation/ApiReference/UI_Components/dxFileManager/Configuration/upload/#chunkSize)) and maximum file size ([maxFileSize](/Documentation/ApiReference/UI_Components/dxFileManager/Configuration/upload/#maxFileSize)). diff --git a/apps/demos/Demos/FileUploader/CustomDropzone/description.md b/apps/demos/Demos/FileUploader/CustomDropzone/description.md index 9b3a94c28f45..35124a93f51c 100644 --- a/apps/demos/Demos/FileUploader/CustomDropzone/description.md +++ b/apps/demos/Demos/FileUploader/CustomDropzone/description.md @@ -1,7 +1,7 @@ The FileUploader component supports the drag-and-drop functionality to upload files. - In this demo, the [dropZone](/Documentation/ApiReference/UI_Components/dxFileUploader/Configuration/#dropZone) property specifies the HTML element in which you can drag and drop files for upload. The [dropZoneEnter](/Documentation/ApiReference/UI_Components/dxFileUploader/Configuration/#onDropZoneEnter) and [dropZoneLeave](/Documentation/ApiReference/UI_Components/dxFileUploader/Configuration/#onDropZoneLeave) events allow you to customize the drop zone when the mouse pointer enters and leaves this zone while dragging the file. + [note] diff --git a/apps/demos/Demos/FilterBuilder/Customization/description.md b/apps/demos/Demos/FilterBuilder/Customization/description.md index 3f0254d9c55e..79477c7d3041 100644 --- a/apps/demos/Demos/FilterBuilder/Customization/description.md +++ b/apps/demos/Demos/FilterBuilder/Customization/description.md @@ -1,5 +1,5 @@ -In this demo, a custom filter operation, *"anyof"*, is implemented. The [calculateFilterExpression](/Documentation/ApiReference/UI_Components/dxFilterBuilder/Configuration/customOperations/#calculateFilterExpression) function converts it into **DataSource**-compatible operations. The compatible and incompatible filter expressions are displayed under the FilterBuilder. - +In this demo, a custom filter operation, *"anyof"*, is implemented. The [calculateFilterExpression](/Documentation/ApiReference/UI_Components/dxFilterBuilder/Configuration/customOperations/#calculateFilterExpression) function converts it into **DataSource**-compatible operations. The compatible and incompatible filter expressions are displayed under the FilterBuilder. -The set of available group operations is limited to *"and"* and *"or"* using the [groupOperations](/Documentation/ApiReference/UI_Components/dxFilterBuilder/Configuration/#groupOperations) array, and the groups’ maximum nesting level is limited to one using the -[maxGroupLevel](/Documentation/ApiReference/UI_Components/dxFilterBuilder/Configuration/#maxGroupLevel). \ No newline at end of file +The set of available group operations is limited to *"and"* and *"or"* using the [groupOperations](/Documentation/ApiReference/UI_Components/dxFilterBuilder/Configuration/#groupOperations) array, and the groups’ maximum nesting level is limited to one using the +[maxGroupLevel](/Documentation/ApiReference/UI_Components/dxFilterBuilder/Configuration/#maxGroupLevel). + \ No newline at end of file diff --git a/apps/demos/Demos/Form/CustomizeItem/description.md b/apps/demos/Demos/Form/CustomizeItem/description.md index 1f1e51c4ee73..fa8df97a26db 100644 --- a/apps/demos/Demos/Form/CustomizeItem/description.md +++ b/apps/demos/Demos/Form/CustomizeItem/description.md @@ -1,7 +1,7 @@ You can use the [items[]](/Documentation/ApiReference/UI_Components/dxForm/Configuration/#items) array to configure all form items. This array can contain strings ([formData](/Documentation/ApiReference/UI_Components/dxForm/Configuration/#formData) field names) and objects (item configurations). - -Use a string to create a simple item with default configuration as shown for the **Email** item. +Use a string to create a simple item with default configuration as shown for the **Email** item. + To change the default settings, declare an item configuration object. Use the [dataField](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/SimpleItem/#dataField) property to bind an item to a field in the [formData](/Documentation/ApiReference/UI_Components/dxForm/Configuration/#formData) object. Use the [editorType](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/SimpleItem/#editorType) property to specify an item's data editor or configure the editor in the [editorOptions](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/SimpleItem/#editorOptions) object. You can also specify any other properties described in the [SimpleItem](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/SimpleItem/) section. diff --git a/apps/demos/Demos/Form/UpdateItemsDynamically/description.md b/apps/demos/Demos/Form/UpdateItemsDynamically/description.md index a4cb2ae3f685..274232eb3936 100644 --- a/apps/demos/Demos/Form/UpdateItemsDynamically/description.md +++ b/apps/demos/Demos/Form/UpdateItemsDynamically/description.md @@ -1,6 +1,6 @@ The [Form](/Documentation/ApiReference/UI_Components/dxForm/) component allows you to add/remove items and specify item visibility at runtime. The Form only updates the affected items and does not re-render the entire form. - In this demo, the "Show Address" checkbox specifies the visibility of address-related fields. Review the component's code to see how to set the "HomeAddress" group's [visible](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/GroupItem/#visible) attribute. -Click the "Add phone" button to add a new phone editor. This action adds a new item to the [items](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/GroupItem/#items) array of the "phones" group. Each phone editor contains a button that deletes it from the **items** array and the Form. \ No newline at end of file +Click the "Add phone" button to add a new phone editor. This action adds a new item to the [items](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/GroupItem/#items) array of the "phones" group. Each phone editor contains a button that deletes it from the **items** array and the Form. + \ No newline at end of file diff --git a/apps/demos/Demos/Gantt/ChartAppearance/description.md b/apps/demos/Demos/Gantt/ChartAppearance/description.md index 181a5980b330..2a8f81bc48a4 100644 --- a/apps/demos/Demos/Gantt/ChartAppearance/description.md +++ b/apps/demos/Demos/Gantt/ChartAppearance/description.md @@ -1,5 +1,4 @@ This demo illustrates the DevExtreme JavaScript Gantt component's appearance settings. - * [scaleType](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/#scaleType) - Specifies views to display tasks: hours, days, weeks, months, etc. * [taskTitlePosition](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/#taskTitlePosition) - Specifies where to display a task's title - none, inside or outside the task. @@ -9,3 +8,4 @@ This demo illustrates the DevExtreme JavaScript Gantt component's appearance set * [startDateRange](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/#startDateRange) and [endDateRange](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/#endDateRange) - Allow you to specify a visible data range for the Gantt chart. Use the properties in the demo to see how they affect the Gantt's behavior and appearance. + \ No newline at end of file diff --git a/apps/demos/Demos/Gantt/FilterRow/description.md b/apps/demos/Demos/Gantt/FilterRow/description.md index fac2c663d6f9..a1feeead973a 100644 --- a/apps/demos/Demos/Gantt/FilterRow/description.md +++ b/apps/demos/Demos/Gantt/FilterRow/description.md @@ -1,5 +1,4 @@ The DevExtreme JavaScript Gantt component allows users to filter columns by filter row values. To display the filter row, set the **filterRow**.[visible](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/filterRow/#visible) property to **true**. - To apply filter criteria to a column, enter or select a value for the filter row cell or specify the [filterValue](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/columns/#filterValue) property (for the appropriate column) in code. @@ -27,6 +26,7 @@ Underlying [dataType](/Documentation/ApiReference/UI_Components/dxGantt/Configur Date and time picker + The **Gantt** supports a predefined set of [filter operations](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/columns/#filterOperations) for each data type. Click a cell’s magnifier icon to select the desired filter operation ([selectedFilterOperation](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/columns/#selectedFilterOperation)). diff --git a/apps/demos/Demos/Gantt/Overview/description.md b/apps/demos/Demos/Gantt/Overview/description.md index ebd08823d435..c1df26a0dc69 100644 --- a/apps/demos/Demos/Gantt/Overview/description.md +++ b/apps/demos/Demos/Gantt/Overview/description.md @@ -1,6 +1,6 @@ The DevExtreme JavaScript Gantt component allows you to display task flow and dependencies between tasks over a specified period. - You can move and modify tasks (task name, duration or progress, for example) directly from the chart. Adjust the timescale to display tasks in smaller or greater time intervals, from hours to years. Hold the CTRL key and rotate your mouse's scroll wheel to zoom and browse data in detail. -[note] The Gantt component requires specific imports. Refer to the following step-by-step tutorial to learn more: [Getting Started with Gantt](/Documentation/Guide/UI_Components/Gantt/Getting_Started_with_Gantt/). \ No newline at end of file +The Gantt component requires specific imports. Refer to the following step-by-step tutorial to learn more: [Getting Started with Gantt](/Documentation/Guide/UI_Components/Gantt/Getting_Started_with_Gantt/). + \ No newline at end of file diff --git a/apps/demos/Demos/Gantt/StripLines/description.md b/apps/demos/Demos/Gantt/StripLines/description.md index 4eb9e536cbcd..410f7b6be3f6 100644 --- a/apps/demos/Demos/Gantt/StripLines/description.md +++ b/apps/demos/Demos/Gantt/StripLines/description.md @@ -1,4 +1,4 @@ This demo illustrates how to use strip lines to highlight different times in the DevExtreme JavaScript Gantt component. The Gantt stores strip lines in its [stripLines](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/stripLines/) collection. You can specify a title ([title](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/stripLines/#title)) and appearance settings ([CssClass](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/stripLines/#cssClass)) for each strip line. - Use the [start](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/stripLines/#start) property to specify an individual strip line or combine it with the [end](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/stripLines/#end) property to specify a time interval. + \ No newline at end of file diff --git a/apps/demos/Demos/Gantt/Toolbar/description.md b/apps/demos/Demos/Gantt/Toolbar/description.md index 81640672078e..9171ef1f7988 100644 --- a/apps/demos/Demos/Gantt/Toolbar/description.md +++ b/apps/demos/Demos/Gantt/Toolbar/description.md @@ -1,4 +1,4 @@ The DevExtreme JavaScript Gantt component allows you to display the most frequently used commands in the toolbar. - The toolbar can display standard items and supports custom items. These items are stored in the [items](/Documentation/ApiReference/UI_Components/dxGantt/Configuration/toolbar/items/) collection. + \ No newline at end of file diff --git a/apps/demos/Demos/Gauges/GaugeTitleCustomized/description.md b/apps/demos/Demos/Gauges/GaugeTitleCustomized/description.md index 00424abe4cdb..48556d8a698e 100644 --- a/apps/demos/Demos/Gauges/GaugeTitleCustomized/description.md +++ b/apps/demos/Demos/Gauges/GaugeTitleCustomized/description.md @@ -1,5 +1,4 @@ This demo shows how to specify a CircularGauge title and display custom labels in the component's center. - A CircularGauge title usually informs users about the nature of gauge data. To customize it, use the properties of the [title](/Documentation/ApiReference/UI_Components/dxCircularGauge/Configuration/title/) configuration object: @@ -9,4 +8,5 @@ Use the [horizontalAlignment](/Documentation/ApiReference/UI_Components/dxCircul - **Font Settings** Use the [font](/Documentation/ApiReference/UI_Components/dxCircularGauge/Configuration/title/font/) configuration object. -You can display a custom label in the center of a CircularGauge. Use the [centerTemplate](/Documentation/ApiReference/UI_Components/dxCircularGauge/Configuration/#centerTemplate) property. Render template content as an [SVG](https://developer.mozilla.org/en-US/docs/Web/SVG) element. \ No newline at end of file +You can display a custom label in the center of a CircularGauge. Use the [centerTemplate](/Documentation/ApiReference/UI_Components/dxCircularGauge/Configuration/#centerTemplate) property. Render template content as an [SVG](https://developer.mozilla.org/en-US/docs/Web/SVG) element. + \ No newline at end of file diff --git a/apps/demos/Demos/Gauges/Overview/Angular/description.md b/apps/demos/Demos/Gauges/Overview/Angular/description.md index cc954cbd57f0..61fbcdc28f5b 100644 --- a/apps/demos/Demos/Gauges/Overview/Angular/description.md +++ b/apps/demos/Demos/Gauges/Overview/Angular/description.md @@ -1,11 +1,11 @@ DevExtreme Angular Gauge controls help you visualize data and create dashboards. Our library includes three gauge types: radial bar gauges, circular scale gauges, and linear gauges. - This demo displays a simple dashboard with a few highly customized gauges. Review other demos in this section to explore gauge features such as geometry customization, palettes, tooltips, and custom label display. Our gauge controls also support Native Angular features: AOT compilation, declarative configuration, and TypeScript compile-time checking. + [note] diff --git a/apps/demos/Demos/Gauges/Overview/React/description.md b/apps/demos/Demos/Gauges/Overview/React/description.md index e373a93ff09b..c9b8958ab7dd 100644 --- a/apps/demos/Demos/Gauges/Overview/React/description.md +++ b/apps/demos/Demos/Gauges/Overview/React/description.md @@ -1,11 +1,11 @@ DevExtreme React Gauge controls help you visualize data and create dashboards. Our library includes three gauge types: radial bar gauges, circular scale gauges, and linear gauges. - This demo displays a simple dashboard with customized gauges. Review other demos in this section to explore gauge features such as geometry customization, palettes, tooltips, and custom label display. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). + [note] diff --git a/apps/demos/Demos/Gauges/Overview/ReactJs/description.md b/apps/demos/Demos/Gauges/Overview/ReactJs/description.md index e373a93ff09b..c9b8958ab7dd 100644 --- a/apps/demos/Demos/Gauges/Overview/ReactJs/description.md +++ b/apps/demos/Demos/Gauges/Overview/ReactJs/description.md @@ -1,11 +1,11 @@ DevExtreme React Gauge controls help you visualize data and create dashboards. Our library includes three gauge types: radial bar gauges, circular scale gauges, and linear gauges. - This demo displays a simple dashboard with customized gauges. Review other demos in this section to explore gauge features such as geometry customization, palettes, tooltips, and custom label display. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). + [note] diff --git a/apps/demos/Demos/Gauges/Overview/Vue/description.md b/apps/demos/Demos/Gauges/Overview/Vue/description.md index 937bff1671f9..8fbbe0064d53 100644 --- a/apps/demos/Demos/Gauges/Overview/Vue/description.md +++ b/apps/demos/Demos/Gauges/Overview/Vue/description.md @@ -1,11 +1,11 @@ DevExtreme Vue Gauge controls help you visualize data and create dashboards. Our library includes three gauge types: radial bar gauges, circular scale gauges, and linear gauges. - This demo displays a simple dashboard with a few highly customized gauges. Review other demos in this section to explore gauge features such as geometry customization, palettes, tooltips, and custom label display. You can use Vue syntax and techniques to instantiate and configure the gauges or handle their events. In addition, the components support [prop validation](https://vuejs.org/v2/guide/components-props.html#Prop-Validation). [Find out more about DevExtreme Vue components](/Documentation/Guide/Vue_Components/DevExtreme_Vue_Components/). + [note] diff --git a/apps/demos/Demos/Gauges/Overview/jQuery/description.md b/apps/demos/Demos/Gauges/Overview/jQuery/description.md index 64e774b1dd71..ef6182369188 100644 --- a/apps/demos/Demos/Gauges/Overview/jQuery/description.md +++ b/apps/demos/Demos/Gauges/Overview/jQuery/description.md @@ -1,9 +1,9 @@ DevExtreme JavaScript Gauge controls help you visualize data and create dashboards. Our library includes three gauge types: radial bar gauges, circular scale gauges, and linear gauges. - This demo displays a simple dashboard with a few highly customized gauges. Review other demos in this section to explore gauge features such as geometry customization, palettes, tooltips, and custom label display. + [note] diff --git a/apps/demos/Demos/HtmlEditor/OutputFormats/description.md b/apps/demos/Demos/HtmlEditor/OutputFormats/description.md index ed327df19063..792306dd88d7 100644 --- a/apps/demos/Demos/HtmlEditor/OutputFormats/description.md +++ b/apps/demos/Demos/HtmlEditor/OutputFormats/description.md @@ -1,4 +1,4 @@ Our HtmlEditor can output the markup in HTML and Markdown formats. To specify the format, use the [valueType](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/#valueType) property. If you use Markdown, import the Markdown converter as described in the **valueType** article. - The HtmlEditor stores the markup in the [value](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/#value) property. In this demo, the value is displayed under the HtmlEditor. You can click the Html and Markdown buttons to switch between output formats. + \ No newline at end of file diff --git a/apps/demos/Demos/HtmlEditor/Overview/description.md b/apps/demos/Demos/HtmlEditor/Overview/description.md index 6c4e03f00254..9e6b7d6c8c33 100644 --- a/apps/demos/Demos/HtmlEditor/Overview/description.md +++ b/apps/demos/Demos/HtmlEditor/Overview/description.md @@ -1,7 +1,7 @@ The HtmlEditor component is a client-side WYSIWYG text editor. The editor allows users to format text and integrate media elements into documents. The result can be exported to HTML or Markdown. - Users can edit and customize content using the [toolbar](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/toolbar/) that can contain predefined and custom controls. To specify the available controls, use the [items](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/toolbar/items/) array. In this demo, the toolbar contains predefined controls. + You can use the **toolbar**.[multiline](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/toolbar/#multiline) property to arrange the toolbar controls into multiple rows. diff --git a/apps/demos/Demos/List/ItemTemplate/description.md b/apps/demos/Demos/List/ItemTemplate/description.md index 495ddb0f2ff6..07a1c83eaa71 100644 --- a/apps/demos/Demos/List/ItemTemplate/description.md +++ b/apps/demos/Demos/List/ItemTemplate/description.md @@ -1,6 +1,6 @@ You can use a default or custom item template to customize list items. A default template consists of a set of data source fields that the List automatically recognizes. These fields are listed in the [items](/Documentation/ApiReference/UI_Components/dxList/Configuration/items/) section. To use a default template for customization, add or remove the fields from data objects. Refer to the [Default Templates](/Documentation/Guide/UI_Components/Common/Templates/#Default_Templates) article for more information. - If you want more customization options, implement a custom template and assign it to the [itemTemplate](/Documentation/ApiReference/UI_Components/dxList/Configuration/#itemTemplate) property, as illustrated in this demo. + \ No newline at end of file diff --git a/apps/demos/Demos/List/ListEditingAndAPI/description.md b/apps/demos/Demos/List/ListEditingAndAPI/description.md index 683ff9fbdcc1..bc16c9de8005 100644 --- a/apps/demos/Demos/List/ListEditingAndAPI/description.md +++ b/apps/demos/Demos/List/ListEditingAndAPI/description.md @@ -1,7 +1,7 @@ The [List](/Documentation/ApiReference/UI_Components/dxList/) displays a collection of items as a scrollable list. To create a list, pass an array of items to the [dataSource](/Documentation/ApiReference/UI_Components/dxList/Configuration/#dataSource) property. - To allow users to delete items, set the [allowItemDeleting](/Documentation/ApiReference/UI_Components/dxList/Configuration/#allowItemDeleting) property to **true**. Use the "Allow deletion" checkbox under the List to toggle this property. + The "Deletion UI type" drop-down menu under the List allows you to switch between the different deletion behaviors described below. Menu items correspond to [itemDeleteMode](/Documentation/ApiReference/UI_Components/dxList/Configuration/#itemDeleteMode) property values. diff --git a/apps/demos/Demos/List/ListWithSearchBar/description.md b/apps/demos/Demos/List/ListWithSearchBar/description.md index 782c882d2003..13b7b76cf5cc 100644 --- a/apps/demos/Demos/List/ListWithSearchBar/description.md +++ b/apps/demos/Demos/List/ListWithSearchBar/description.md @@ -1,8 +1,8 @@ To add a search bar to the List and enable the search functionality, do the following: - Set the [searchEnabled](/Documentation/ApiReference/UI_Components/dxList/Configuration/#searchEnabled) property to **true**. - - Specify the [searchExpr](/Documentation/ApiReference/UI_Components/dxList/Configuration/#searchMode) property. It is used to compare the search string against a specific field in your data objects. In this example, the search string is compared against the *"Name"* field. - Use the [searchMode](/Documentation/ApiReference/UI_Components/dxList/Configuration/#searchMode) property to specify whether list items should start with, contain, or match the search string. In this example, you can use the drop-down menu under the List to change the **searchMode**. + \ No newline at end of file diff --git a/apps/demos/Demos/Lookup/EventHandling/description.md b/apps/demos/Demos/Lookup/EventHandling/description.md index ed7857633218..4b20b6fcfacc 100644 --- a/apps/demos/Demos/Lookup/EventHandling/description.md +++ b/apps/demos/Demos/Lookup/EventHandling/description.md @@ -1,4 +1,4 @@ To handle changes to the Lookup component's value, specify the [onValueChanged](/Documentation/ApiReference/UI_Components/dxLookup/Configuration/#onValueChanged) function. This demo uses it to display a picture and text for the selected item. - The Lookup component applies the selected value instantly. If you want users to click the Apply button instead, set the [applyValueMode](/Documentation/ApiReference/UI_Components/dxLookup/Configuration/#applyValueMode) property to *"useButtons"*. It adds the Apply button to the component's drop-down menu. This demo does not show this functionality. + \ No newline at end of file diff --git a/apps/demos/Demos/Lookup/Templates/description.md b/apps/demos/Demos/Lookup/Templates/description.md index 63642c657216..d8ea9ef496e5 100644 --- a/apps/demos/Demos/Lookup/Templates/description.md +++ b/apps/demos/Demos/Lookup/Templates/description.md @@ -1,5 +1,4 @@ You can use the following properties to specify custom templates for Lookup elements. - @@ -21,3 +20,4 @@ You can use the following properties to specify custom templates for Lookup elem
To customize elements, you can also define specific fields in data objects. Visit the [items](/Documentation/ApiReference/UI_Components/dxLookup/Configuration/items/) documentation for a full list of such fields. Refer to the [Default Templates](/Documentation/Guide/UI_Components/Common/Templates/#Default_Templates) help topic for more information about this feature. + \ No newline at end of file diff --git a/apps/demos/Demos/Map/ProvidersAndTypes/description.md b/apps/demos/Demos/Map/ProvidersAndTypes/description.md index bcd09e786731..021c2a783f92 100644 --- a/apps/demos/Demos/Map/ProvidersAndTypes/description.md +++ b/apps/demos/Demos/Map/ProvidersAndTypes/description.md @@ -1,4 +1,4 @@ The [provider](/Documentation/ApiReference/UI_Components/dxMap/Configuration/#provider) property specifies which map provider to use: Google Maps (default), Bing Maps (used in this demo), or Google Static Maps. - -You can also set the [type](/Documentation/ApiReference/UI_Components/dxMap/Configuration/#type) property to specify the map type: road, satellite (photographic), or hybrid map. \ No newline at end of file +You can also set the [type](/Documentation/ApiReference/UI_Components/dxMap/Configuration/#type) property to specify the map type: road, satellite (photographic), or hybrid map. + \ No newline at end of file diff --git a/apps/demos/Demos/Menu/Overview/description.md b/apps/demos/Demos/Menu/Overview/description.md index 82233b031fa8..622a87ba0704 100644 --- a/apps/demos/Demos/Menu/Overview/description.md +++ b/apps/demos/Demos/Menu/Overview/description.md @@ -1,9 +1,9 @@ ## Populate Menu with Data and Configure the Access to It You can display Menu items from the [items](/Documentation/ApiReference/UI_Components/dxMenu/Configuration/items/) array or a [dataSource](/Documentation/ApiReference/UI_Components/dxMenu/Configuration/#dataSource). This demo contains an example of a data structure. If you use a **dataSource**, specify the [displayExpr](/Documentation/ApiReference/UI_Components/dxMenu/Configuration/#displayExpr) property. - To access the clicked item, use the [onItemClick](/Documentation/ApiReference/UI_Components/dxMenu/Configuration/#onItemClick) event handler function. + ## Configure the Menu diff --git a/apps/demos/Demos/Menu/Scrolling/description.md b/apps/demos/Demos/Menu/Scrolling/description.md index 37a3830ada10..439e176be963 100644 --- a/apps/demos/Demos/Menu/Scrolling/description.md +++ b/apps/demos/Demos/Menu/Scrolling/description.md @@ -1,5 +1,4 @@ The DevExtreme Menu component supports submenu item scrolling. If combined item height exceeds screen size or a pre-defined height limit, a scrollbar appears on-screen. - You can use one of the following event handlers to configure submenus as requirements dictate: @@ -13,4 +12,5 @@ You can use one of the following event handlers to configure submenus as require These handlers can access the root submenu element (`submenuContainer`) and data from root and submenu items (`itemData`). -In this demo, the **onSubmenuShowing** function limits submenu height to 200px. \ No newline at end of file +In this demo, the **onSubmenuShowing** function limits submenu height to 200px. + \ No newline at end of file diff --git a/apps/demos/Demos/MultiView/Overview/description.md b/apps/demos/Demos/MultiView/Overview/description.md index 25c2b3d4a49b..eec208fd8be2 100644 --- a/apps/demos/Demos/MultiView/Overview/description.md +++ b/apps/demos/Demos/MultiView/Overview/description.md @@ -1,7 +1,6 @@ The MultiView component contains multiple views and allows users to switch between them. In this demo, swipe left or right to navigate through the views. - You can create view items in the [items](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/items/) array, or load them from a [dataSource](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#dataSource). If you specify the [dataSource](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#dataSource) structure as described in the [items](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/items/) API section, the [dataSource](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#dataSource) populates the component with view items. Otherwise, you need to specify an [itemTemplate](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#itemTemplate). This demo shows how to implement the latter scenario. + -If you want users to scroll back to the first item after they swipe the last item, set the [loop](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#loop) property to **true**. Specify the [animationEnabled](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#animationEnabled) property to enable or disable the scroll animation. - +If you want users to scroll back to the first item after they swipe the last item, set the [loop](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#loop) property to **true**. Specify the [animationEnabled](/Documentation/ApiReference/UI_Components/dxMultiView/Configuration/#animationEnabled) property to enable or disable the scroll animation. \ No newline at end of file diff --git a/apps/demos/Demos/NumberBox/Overview/description.md b/apps/demos/Demos/NumberBox/Overview/description.md index 64669ace4d86..634c77a31e63 100644 --- a/apps/demos/Demos/NumberBox/Overview/description.md +++ b/apps/demos/Demos/NumberBox/Overview/description.md @@ -1,7 +1,7 @@ The NumberBox is a component that displays a number. Users can change this number (for example, type a new value or use the spin buttons, keyboard arrows, or mouse wheel to increment/decrement it). - Use the [value](/Documentation/ApiReference/UI_Components/dxNumberBox/Configuration/#value) property to specify the number displayed in the NumberBox. If you do not specify the **value** property, the NumberBox displays 0 (the default value). You can use the [min](/Documentation/ApiReference/UI_Components/dxNumberBox/Configuration/#min) and [max](/Documentation/ApiReference/UI_Components/dxNumberBox/Configuration/#max) properties to set the value range. + Specify the [onValueChanged](/Documentation/ApiReference/UI_Components/dxNumberBox/Configuration/#onValueChanged) function to handle the value change. In this demo, the value of the "Stock" NumberBox depends on the "This month sales" NumberBox. Change the value in the "This month sales" NumberBox to see how it affects the other value. diff --git a/apps/demos/Demos/PivotGrid/DrillDown/description.md b/apps/demos/Demos/PivotGrid/DrillDown/description.md index 5a2b675076ef..9347aa36852e 100644 --- a/apps/demos/Demos/PivotGrid/DrillDown/description.md +++ b/apps/demos/Demos/PivotGrid/DrillDown/description.md @@ -1,6 +1,6 @@ PivotGrid supports the drill-down operation that allows you to retrieve individual facts (records) used to calculate a specific summary value. - Call the [createDrillDownDataSource(options)](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Methods/#createDrillDownDataSourceoptions) method to get a [DataSource](/Documentation/ApiReference/Data_Layer/DataSource/) instance that contains a list of facts for a summary value. -This demo displays a list of facts within a [DataGrid](/Documentation/ApiReference/UI_Components/dxDataGrid) in a [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) window. To open the window, click a pivot grid cell. We use the [onCellClick](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/#onCellClick) event handler to retrieve the cell's data and pass it as an argument to the **createDrillDownDataSource(options)** method. \ No newline at end of file +This demo displays a list of facts within a [DataGrid](/Documentation/ApiReference/UI_Components/dxDataGrid) in a [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) window. To open the window, click a pivot grid cell. We use the [onCellClick](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/#onCellClick) event handler to retrieve the cell's data and pass it as an argument to the **createDrillDownDataSource(options)** method. + \ No newline at end of file diff --git a/apps/demos/Demos/PivotGrid/ExcelJSCellCustomization/description.md b/apps/demos/Demos/PivotGrid/ExcelJSCellCustomization/description.md index 1c125e49a999..0b36a834f5bc 100644 --- a/apps/demos/Demos/PivotGrid/ExcelJSCellCustomization/description.md +++ b/apps/demos/Demos/PivotGrid/ExcelJSCellCustomization/description.md @@ -1,5 +1,4 @@ Our PivotGrid allows you to control and manage the data export process. You can use the PivotGrid's [customizeCell](/Documentation/ApiReference/Common/Object_Structures/ExcelExportPivotGridProps/#customizeCell) callback to modify cell data and associated formatting prior to export operations (from the PivotGrid to an Excel file). - Our PivotGrid gives you access and allows you to change the following attributes: @@ -10,3 +9,4 @@ Our PivotGrid gives you access and allows you to change the following attributes - Formatting properties The **customizeCell** function also allows you to identify cell area types. + \ No newline at end of file diff --git a/apps/demos/Demos/PivotGrid/ExcelJSOverview/description.md b/apps/demos/Demos/PivotGrid/ExcelJSOverview/description.md index 0f3eca5a4166..a7680cb3e4a7 100644 --- a/apps/demos/Demos/PivotGrid/ExcelJSOverview/description.md +++ b/apps/demos/Demos/PivotGrid/ExcelJSOverview/description.md @@ -1,8 +1,8 @@ Our PivotGrid allows you to easily and accurately export its contents to Microsoft Excel. To enable export operations, you must reference or import ExcelJS and FileSaver libraries. You must also set **export**.[enabled](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/export/#enabled) to **true**. - Once you've referenced/imported both files and set **export**.**enabled** to **true**, use the [exportPivotGrid(options)](/Documentation/ApiReference/Common/Utils/excelExporter/#exportPivotGridoptions) method to export PivotGrid content to an Excel workbook. Please review the [onExporting](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/#onExporting) handler and its data export code to learn more. In this example, PivotGrid content is exported as is to a single worksheet. + You can export PivotGrid to CSV. Call the **exportPivotGrid(options)** method as shown in the following ticket: Export PivotGrid into CSV file. \ No newline at end of file diff --git a/apps/demos/Demos/PivotGrid/FieldPanel/description.md b/apps/demos/Demos/PivotGrid/FieldPanel/description.md index 1910e25dfeac..57e090d45d0e 100644 --- a/apps/demos/Demos/PivotGrid/FieldPanel/description.md +++ b/apps/demos/Demos/PivotGrid/FieldPanel/description.md @@ -1,5 +1,4 @@ A field panel is an element that displays pivot grid fields involved in summary calculation. This panel consists of four field areas: column, row, data, and filter. Users can drag and drop fields between these areas, similar to the [field chooser](https://js.devexpress.com/Demos/WidgetsGallery/Demo/PivotGrid/IntegratedFieldChooser). You can use the field panel and the field chooser simultaneously, as shown in this demo. - Enable the [fieldPanel](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/fieldPanel/).[visible](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/fieldPanel/#visible) property to display the field panel. If you want to hide fields from specific areas, disable the corresponding properties in the **fieldPanel** object: @@ -7,6 +6,7 @@ Enable the [fieldPanel](/Documentation/ApiReference/UI_Components/dxPivotGrid/Co - [showRowFields](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/fieldPanel/#showRowFields) - [showDataFields](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/fieldPanel/#showDataFields) - [showFilterFields](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/fieldPanel/#showFilterFields) + In this demo, you can click the checkboxes below the PivotGrid to enable or disable these properties. diff --git a/apps/demos/Demos/PivotGrid/Overview/Angular/description.md b/apps/demos/Demos/PivotGrid/Overview/Angular/description.md index 1ef92c1cb08d..609dbf217698 100644 --- a/apps/demos/Demos/PivotGrid/Overview/Angular/description.md +++ b/apps/demos/Demos/PivotGrid/Overview/Angular/description.md @@ -1,7 +1,7 @@ DevExtreme Angular Pivot Grid is a client-side control for multi-dimensional data analysis. Its key features are: multiple summary calculation modes, customizable layout, exporting to Excel, integration with the DevExtreme Chart component. In addition, Pivot Grid supports TypeScript and AOT compilation and can be configured declaratively. - To get started with the DevExtreme PivotGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with PivotGrid](/Documentation/Guide/UI_Components/PivotGrid/Getting_Started_with_PivotGrid/). + [note] diff --git a/apps/demos/Demos/PivotGrid/Overview/React/description.md b/apps/demos/Demos/PivotGrid/Overview/React/description.md index e5cb2c62d678..3558c9a29043 100644 --- a/apps/demos/Demos/PivotGrid/Overview/React/description.md +++ b/apps/demos/Demos/PivotGrid/Overview/React/description.md @@ -1,7 +1,7 @@ DevExtreme React PivotGrid is a UI component for multi-dimensional data analysis. It can process data from local arrays and OLAP cubes (MS SQL Server Analysis Services), as well as from custom remote services. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - To get started with the DevExtreme PivotGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with PivotGrid](/Documentation/Guide/UI_Components/PivotGrid/Getting_Started_with_PivotGrid/). + [note] diff --git a/apps/demos/Demos/PivotGrid/Overview/ReactJs/description.md b/apps/demos/Demos/PivotGrid/Overview/ReactJs/description.md index e5cb2c62d678..3558c9a29043 100644 --- a/apps/demos/Demos/PivotGrid/Overview/ReactJs/description.md +++ b/apps/demos/Demos/PivotGrid/Overview/ReactJs/description.md @@ -1,7 +1,7 @@ DevExtreme React PivotGrid is a UI component for multi-dimensional data analysis. It can process data from local arrays and OLAP cubes (MS SQL Server Analysis Services), as well as from custom remote services. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - To get started with the DevExtreme PivotGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with PivotGrid](/Documentation/Guide/UI_Components/PivotGrid/Getting_Started_with_PivotGrid/). + [note] diff --git a/apps/demos/Demos/PivotGrid/Overview/Vue/description.md b/apps/demos/Demos/PivotGrid/Overview/Vue/description.md index 3132752bc9da..aa59f2c4e75b 100644 --- a/apps/demos/Demos/PivotGrid/Overview/Vue/description.md +++ b/apps/demos/Demos/PivotGrid/Overview/Vue/description.md @@ -1,7 +1,7 @@ DevExtreme Vue Pivot Grid is a powerful client-side component for multi-dimensional data analysis. It provides such essential features as grouping, sorting, filtering, multiple summary calculation modes, flexible layout, and more. You can use Vue syntax and techniques to instantiate and configure the Pivot Grid or handle its events. [Find out more about DevExtreme Vue components](/Documentation/Guide/Vue_Components/DevExtreme_Vue_Components/). - To get started with the DevExtreme PivotGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with PivotGrid](/Documentation/Guide/UI_Components/PivotGrid/Getting_Started_with_PivotGrid/). + [note] diff --git a/apps/demos/Demos/PivotGrid/Overview/jQuery/description.md b/apps/demos/Demos/PivotGrid/Overview/jQuery/description.md index 0eeb27e296e9..a71b4752f51e 100644 --- a/apps/demos/Demos/PivotGrid/Overview/jQuery/description.md +++ b/apps/demos/Demos/PivotGrid/Overview/jQuery/description.md @@ -1,7 +1,7 @@ DevExtreme JavaScript PivotGrid is a client-side control available as a jQuery component. It is optimized for multi-dimensional data analysis and supports binding to data from local arrays and OLAP cubes (MS SQL Server Analysis Services), as well as custom remote services. PivotGrid's key features include: several summary calculation modes, customizable layout, data sorting and exporting, and integration with DevExtreme Chart, which is shown in this demo. - To get started with the DevExtreme PivotGrid component, refer to the following tutorial for step-by-step instructions: [Getting Started with PivotGrid](/Documentation/Guide/UI_Components/PivotGrid/Getting_Started_with_PivotGrid/). + [note] diff --git a/apps/demos/Demos/PivotGrid/RunningTotals/description.md b/apps/demos/Demos/PivotGrid/RunningTotals/description.md index de62bfe43e2d..a0a91d98a002 100644 --- a/apps/demos/Demos/PivotGrid/RunningTotals/description.md +++ b/apps/demos/Demos/PivotGrid/RunningTotals/description.md @@ -1,4 +1,4 @@ The PivotGrid can calculate running totals by rows or columns. Assign *"row"* or *"column"* to a field's [runningTotal](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/#runningTotal) property to specify how running totals are calculated. This property is available only for data fields. - -Running totals are calculated from scratch for each [group](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/#groupName) within a row or column. You can assign **true** to the [allowCrossGroupCalculation](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/#allowCrossGroupCalculation) property to calculate running totals across all groups. \ No newline at end of file +Running totals are calculated from scratch for each [group](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/#groupName) within a row or column. You can assign **true** to the [allowCrossGroupCalculation](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/#allowCrossGroupCalculation) property to calculate running totals across all groups. + \ No newline at end of file diff --git a/apps/demos/Demos/PivotGrid/SimpleArray/description.md b/apps/demos/Demos/PivotGrid/SimpleArray/description.md index 0a07fe594d90..241caa87cc5f 100644 --- a/apps/demos/Demos/PivotGrid/SimpleArray/description.md +++ b/apps/demos/Demos/PivotGrid/SimpleArray/description.md @@ -1,7 +1,7 @@ The PivotGrid component can display data from an array of objects. Use the [dataSource](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/#dataSource) property to bind the PivotGrid to data. This property accepts a [PivotGridDataSource](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/) instance or its configuration object. Assign your array to the [store](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/store/) property of **PivotGridDataSource**. - To display data in the PivotGrid, assign an array to the [fields[]](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/) property. Each object in this array configures a single pivot grid field. Assign a field name to the [dataField](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/#dataField) property to populate the pivot grid field with data. + You can distribute fields between four different areas: row, column, filter, and data. To specify the area, set the [area](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/fields/#area) property. Fields that do not belong to any area are displayed in the [field chooser](https://js.devexpress.com/Demos/WidgetsGallery/Demo/PivotGrid/IntegratedFieldChooser/). diff --git a/apps/demos/Demos/PivotGrid/VirtualScrolling/description.md b/apps/demos/Demos/PivotGrid/VirtualScrolling/description.md index 4f208d7ce9e3..9ca9437f5483 100644 --- a/apps/demos/Demos/PivotGrid/VirtualScrolling/description.md +++ b/apps/demos/Demos/PivotGrid/VirtualScrolling/description.md @@ -1,6 +1,6 @@ If the PivotGrid is bound to a large dataset, you can enable the virtual scrolling mode to optimize data load time and reduce resource consumption. In this mode, the PivotGrid loads only the cells that are in the viewport. When cells leave the viewport, the PivotGrid removes them from the DOM. - To enable this mode, set the **scrolling**.[mode](/Documentation/ApiReference/UI_Components/dxPivotGrid/Configuration/scrolling/#mode) to _"virtual"_. -In this demo, the PivotGrid stores approximately 4000 values locally. To see virtual scrolling in action, scroll the PivotGrid horizontally. \ No newline at end of file +In this demo, the PivotGrid stores approximately 4000 values locally. To see virtual scrolling in action, scroll the PivotGrid horizontally. + \ No newline at end of file diff --git a/apps/demos/Demos/PivotGrid/WebAPIService/description.md b/apps/demos/Demos/PivotGrid/WebAPIService/description.md index 8eece306ccf0..ac1bac003d95 100644 --- a/apps/demos/Demos/PivotGrid/WebAPIService/description.md +++ b/apps/demos/Demos/PivotGrid/WebAPIService/description.md @@ -1,9 +1,9 @@ The PivotGrid can communicate with a Web API service. The quantity of aggregated data is irrelevant when aggregation is performed on the server. For example, the PivotGrid works with a million aggregated records in this demo. - To configure access to a Web API service from the client, use the createStore method, which is part of the DevExtreme.AspNet.Data extension. This extension also allows you to configure server-side data processing for DevExtreme components. You should also set the [remoteOperations](/Documentation/ApiReference/Data_Layer/PivotGridDataSource/Configuration/#remoteOperations) property to **true** to notify the PivotGrid that data is aggregated on the server. + ### A 1-Click Solution for CRUD Web API Services with Role-based Access Control via EF Core diff --git a/apps/demos/Demos/Popup/Scrolling/description.md b/apps/demos/Demos/Popup/Scrolling/description.md index 8bdf1066b4eb..bb5e63b451c5 100644 --- a/apps/demos/Demos/Popup/Scrolling/description.md +++ b/apps/demos/Demos/Popup/Scrolling/description.md @@ -1,7 +1,7 @@ This demo shows two implementations of scrolling in the Popup component. - When you click the first **Show Popup** button, a Popup with a native scrollbar appears. The component always displays a native scrollbar when the height of the Popup's content is greater than that of the Popup. + A click on the second **Show Popup** button also displays a Popup with a scrollbar, but this scrollbar belongs to the [ScrollView](/Documentation/ApiReference/UI_Components/dxScrollView/) component. This implementation is more flexible. For example, you can enable [right-to-left representation](/Documentation/ApiReference/UI_Components/dxScrollView/Configuration/#rtlEnabled) or scroll the content to a [specific position](/Documentation/ApiReference/UI_Components/dxScrollView/Methods/#scrollTotargetLocation). For more information about the available options, refer to the [ScrollView API section](/Documentation/ApiReference/UI_Components/dxScrollView/). diff --git a/apps/demos/Demos/ProgressBar/Overview/description.md b/apps/demos/Demos/ProgressBar/Overview/description.md index 68538f71c570..7fccbeaac79d 100644 --- a/apps/demos/Demos/ProgressBar/Overview/description.md +++ b/apps/demos/Demos/ProgressBar/Overview/description.md @@ -1,5 +1,4 @@ This demo shows how to configure the ProgressBar component. - To create a ProgressBar, declare it in markup. You can specify the following properties to change the ProgressBar's numeric scale: @@ -10,8 +9,8 @@ The min and max properties limit the range of accepted values. This property specifies the current value. If you want to switch the ProgressBar to an indeterminate state, set the [value](/Documentation/ApiReference/UI_Components/dxProgressBar/Configuration/#value) property to `false`. This demo uses the custom timer function to increase the ProgressBar's value. + When the ProgressBar reaches the maximum value, the [complete](/Documentation/ApiReference/UI_Components/dxProgressBar/Events/#complete) event occurs. Use the [onComplete](/Documentation/ApiReference/UI_Components/dxProgressBar/Configuration/#onComplete) function to handle it. -The progress status displays a ratio between the current and maximum values and indicates the progress. Use the [showStatus](/Documentation/ApiReference/UI_Components/dxProgressBar/Configuration/#showStatus) property to display or hide the status string. To format the status string, use the [statusFormat](/Documentation/ApiReference/UI_Components/dxProgressBar/Configuration/#statusFormat) function. - +The progress status displays a ratio between the current and maximum values and indicates the progress. Use the [showStatus](/Documentation/ApiReference/UI_Components/dxProgressBar/Configuration/#showStatus) property to display or hide the status string. To format the status string, use the [statusFormat](/Documentation/ApiReference/UI_Components/dxProgressBar/Configuration/#statusFormat) function. \ No newline at end of file diff --git a/apps/demos/Demos/Resizable/Overview/description.md b/apps/demos/Demos/Resizable/Overview/description.md index ed883e17b21f..30dec969d0b1 100644 --- a/apps/demos/Demos/Resizable/Overview/description.md +++ b/apps/demos/Demos/Resizable/Overview/description.md @@ -1,5 +1,4 @@ If you want to enable live resize operations for a UI element, wrap that element into a Resizable widget. In this demo, you can resize the DataGrid. Try to drag the [handles](/Documentation/ApiReference/UI_Components/dxResizable/Configuration/#handles) on the grid's edges. - Configure the following properties to specify resize operation constraints: @@ -12,6 +11,7 @@ Configure the following properties to specify resize operation constraints: - [maxHeight](/Documentation/ApiReference/UI_Components/dxResizable/Configuration/#maxHeight) - [area](/Documentation/ApiReference/UI_Components/dxResizable/Configuration/#area) + You can display resize handles on edges or corners. Use the following keywords to set up the [handles](/Documentation/ApiReference/UI_Components/dxResizable/Configuration/#handles) property: *top*, *bottom*, *left*, and *right*. If you specify two adjacent sides (for example, "bottom right"), the control displays a handle in the corner. diff --git a/apps/demos/Demos/Scheduler/Adaptability/description.md b/apps/demos/Demos/Scheduler/Adaptability/description.md index e26c13d772af..57fce8b12c5d 100644 --- a/apps/demos/Demos/Scheduler/Adaptability/description.md +++ b/apps/demos/Demos/Scheduler/Adaptability/description.md @@ -1,12 +1,9 @@ -When the [adaptivityEnabled](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#adaptivityEnabled) property is set to **true**, Scheduler elements adapt to small screens as follows. - +When the [adaptivityEnabled](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#adaptivityEnabled) property is set to **true**, Scheduler elements adapt to small screens as follows: * [Cell overflow indicators](/Documentation/Guide/UI_Components/Scheduler/Appointments/Cell_Overflow_Indicator/) become larger to accommodate touch gestures. * The appointment list **for a chosen date** slides in from the edge of the screen. * The appointment details form occupies the entire screen. * Instead of the [view switcher](/Documentation/Guide/UI_Components/Scheduler/View_Switcher/), a drop-down menu is used to switch between views. To open this menu, users should click or tap a button in the upper right corner. + -In this demo, we also added the [floating action button](/Demos/WidgetsGallery/Demo/FloatingActionButton/Overview/) as an alternative way to create a new appointment. The button is implemented with the [SpeedDialAction](/Documentation/ApiReference/UI_Components/dxSpeedDialAction/) component. - - - +In this demo, we also added the [floating action button](/Demos/WidgetsGallery/Demo/FloatingActionButton/Overview/) as an alternative way to create a new appointment. The button is implemented with the [SpeedDialAction](/Documentation/ApiReference/UI_Components/dxSpeedDialAction/) component. \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/Agenda/description.md b/apps/demos/Demos/Scheduler/Agenda/description.md index 928841aee744..a6c6c3a35e7b 100644 --- a/apps/demos/Demos/Scheduler/Agenda/description.md +++ b/apps/demos/Demos/Scheduler/Agenda/description.md @@ -1,8 +1,8 @@ The Agenda view shows appointments as a simple list. This is the most compact display style because it doesn't render a time scale. Appointments follow each other without empty spaces and their sizes do not depend on event duration. - To add the Agenda view to your Scheduler, declare it in the [views](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/) array. -[note] The Agenda view does not allow a user to add appointments or modify them by dragging. +The Agenda view does not allow a user to add appointments or modify them by dragging. For more information about Agenda and other supported views, refer to the following help topic: [View Types](/Documentation/Guide/UI_Components/Scheduler/Views/View_Types/). + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/BasicViews/description.md b/apps/demos/Demos/Scheduler/BasicViews/description.md index 4e93dd418de1..9c33adaa622a 100644 --- a/apps/demos/Demos/Scheduler/BasicViews/description.md +++ b/apps/demos/Demos/Scheduler/BasicViews/description.md @@ -1,6 +1,6 @@ This example demonstrates four Scheduler views: Day, Week, Work Week, and Month. You can use the View Switcher above the timetable to switch between them. - To add these views to your Scheduler, list them in the [views](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/) array. If you do not declare this array, users can switch only between the Day and Week views. To activate a specific view at application startup, use the [currentView](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#currentView) property. For more information about supported view types, refer to the following help topic: [View Types](/Documentation/Guide/UI_Components/Scheduler/Views/View_Types/). + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/CurrentTimeIndicator/description.md b/apps/demos/Demos/Scheduler/CurrentTimeIndicator/description.md index f6d126bc8078..f8ea8cece451 100644 --- a/apps/demos/Demos/Scheduler/CurrentTimeIndicator/description.md +++ b/apps/demos/Demos/Scheduler/CurrentTimeIndicator/description.md @@ -1,6 +1,6 @@ The Scheduler indicates the current time if you enable the [showCurrentTimeIndicator](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#showCurrentTimeIndicator) property. Use the [indicatorUpdateInterval](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#indicatorUpdateInterval) property to specify how frequently the indicator should change its position. - You can also shade the timetable up to the current time. To enable this feature, set the [shadeUntilCurrentTime](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#shadeUntilCurrentTime) property to **true**. In this example, you can use the controls under the Scheduler to change the above mentioned properties at runtime. + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/CustomTemplates/description.md b/apps/demos/Demos/Scheduler/CustomTemplates/description.md index 4fa964af1f1d..b5bd5d783df6 100644 --- a/apps/demos/Demos/Scheduler/CustomTemplates/description.md +++ b/apps/demos/Demos/Scheduler/CustomTemplates/description.md @@ -1,8 +1,8 @@ The Scheduler contains the following properties used to specify custom templates globally and for individual views. - * Appointment rectangle: [appointmentTemplate](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#appointmentTemplate) / **views[]**.[appointmentTemplate](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#appointmentTemplate) * Tooltip: [appointmentTooltipTemplate](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#appointmentTooltipTemplate) / **views[]**.[appointmentTooltipTemplate](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#appointmentTooltipTemplate). To customize the appointment details form, implement the [onAppointmentFormOpening](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#onAppointmentFormOpening) handler. In this demo, this handler adds custom fields to the appointment details form. + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/CustomizeIndividualViews/description.md b/apps/demos/Demos/Scheduler/CustomizeIndividualViews/description.md index 47d19f284fc4..6fdd8ae4982b 100644 --- a/apps/demos/Demos/Scheduler/CustomizeIndividualViews/description.md +++ b/apps/demos/Demos/Scheduler/CustomizeIndividualViews/description.md @@ -1,5 +1,4 @@ To customize a view, configure its settings in an object inside the [views[]](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views) array. You should specify the view's [type](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#type) and other properties to override global view settings. - This demo customizes two views - Week and Work Week - in the following manner: @@ -8,3 +7,4 @@ This demo customizes two views - Week and Work Week - in the following manner: * The Work Week view uses the [startDayHour](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#startDayHour) and [endDayHour](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#endDayHour) properties to set custom first and last hours on the time scale. Day and Month views use default settings. + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/GroupByDate/description.md b/apps/demos/Demos/Scheduler/GroupByDate/description.md index 205e272e360d..863c884a3a29 100644 --- a/apps/demos/Demos/Scheduler/GroupByDate/description.md +++ b/apps/demos/Demos/Scheduler/GroupByDate/description.md @@ -1,6 +1,6 @@ Appointments can be grouped by resources. This demo declares a single resource—Priority. Refer to the following demo for more information about resources and their configuration: [Resources](/Demos/WidgetsGallery/Demo/Scheduler/Resources/). - When appointments are grouped by resources, you can additionally group them by date first. To do this, set [groupByDate](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#groupByDate) to **true**. You can also use the [same property](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#groupByDate) for individual views. Note that Scheduler groups appointments by date when the view's [groupOrientation](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#groupOrientation) is *"horizontal"* only. In this demo, you can use the switch below the Scheduler to change the value of **groupByDate**. + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/GroupOrientation/description.md b/apps/demos/Demos/Scheduler/GroupOrientation/description.md index a0e6116f1786..a16abd2a65fb 100644 --- a/apps/demos/Demos/Scheduler/GroupOrientation/description.md +++ b/apps/demos/Demos/Scheduler/GroupOrientation/description.md @@ -1,6 +1,6 @@ Users can group appointments by resources. This demo declares a single resource—Priority. Refer to the following demo for more information about resources and their configuration: [Resources](/Demos/WidgetsGallery/Demo/Scheduler/Resources/). - To group appointments by resources, specify the [groups[]](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#groups) array. Each element of this array is the [fieldExpr](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/resources/#fieldExpr) of a corresponding resource kind. The order of group headers in the UI is the same as items in the resource instances array. If the **groups[]** array contains more than one element, groups are nested. + The Scheduler can arrange group headers vertically (in a column) or horizontally (in a row). Use the **views**.[groupOrientation](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/#groupOrientation) property to set a custom orientation for specific views. This demo shows two Work Week views with different group orientations. diff --git a/apps/demos/Demos/Scheduler/Overview/Angular/description.md b/apps/demos/Demos/Scheduler/Overview/Angular/description.md index 406ef89818bc..634078e7c405 100644 --- a/apps/demos/Demos/Scheduler/Overview/Angular/description.md +++ b/apps/demos/Demos/Scheduler/Overview/Angular/description.md @@ -1,4 +1,4 @@ DevExtreme Angular Scheduler is a client-side scheduling control. With a great number of features including appointment editing, multiple calendar views, current time indication, Scheduler provides excellent user experience. Native Angular features, like AOT compilation, declarative configuration, TypeScript compile-time checking, are supported as well. - -To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). \ No newline at end of file +To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/Overview/React/description.md b/apps/demos/Demos/Scheduler/Overview/React/description.md index fa0ba96d19f2..5bc9cd563916 100644 --- a/apps/demos/Demos/Scheduler/Overview/React/description.md +++ b/apps/demos/Demos/Scheduler/Overview/React/description.md @@ -1,4 +1,4 @@ DevExtreme React Scheduler is a UI component for scheduling. It implements all the features necessary for its purpose: flexible data binding, easy appointment editing, multiple calendar views, time zones support, and more. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - -To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). \ No newline at end of file +To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/Overview/ReactJs/description.md b/apps/demos/Demos/Scheduler/Overview/ReactJs/description.md index fa0ba96d19f2..5bc9cd563916 100644 --- a/apps/demos/Demos/Scheduler/Overview/ReactJs/description.md +++ b/apps/demos/Demos/Scheduler/Overview/ReactJs/description.md @@ -1,4 +1,4 @@ DevExtreme React Scheduler is a UI component for scheduling. It implements all the features necessary for its purpose: flexible data binding, easy appointment editing, multiple calendar views, time zones support, and more. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - -To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). \ No newline at end of file +To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/Overview/Vue/description.md b/apps/demos/Demos/Scheduler/Overview/Vue/description.md index f77733f4754b..5272018e3c1c 100644 --- a/apps/demos/Demos/Scheduler/Overview/Vue/description.md +++ b/apps/demos/Demos/Scheduler/Overview/Vue/description.md @@ -1,4 +1,4 @@ DevExtreme Vue Scheduler is a versatile scheduling component. Its main features include appointment editing, time zones support, vertical and horizontal orientation, and many more. You can use Vue syntax and techniques to instantiate and configure the Scheduler or handle its events. In addition, the component supports [prop validation](https://vuejs.org/v2/guide/components-props.html#Prop-Validation) and templates that use [named slots](https://vuejs.org/v2/guide/components-slots.html#Named-Slots). [Find out more about DevExtreme Vue components](/Documentation/Guide/Vue_Components/DevExtreme_Vue_Components/). - -To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). \ No newline at end of file +To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/Overview/jQuery/description.md b/apps/demos/Demos/Scheduler/Overview/jQuery/description.md index df2e932001c6..36bf290a25ba 100644 --- a/apps/demos/Demos/Scheduler/Overview/jQuery/description.md +++ b/apps/demos/Demos/Scheduler/Overview/jQuery/description.md @@ -1,4 +1,4 @@ DevExtreme JavaScript Scheduler is a client-side scheduling component available as a jQuery plugin. This control can be bound to local or remote data including online services like Google Calendar. In this demo, Scheduler is highly customized using templates. Appointments on the view are grouped by employee. View other demos in this section to explore more Scheduler features, like multiple calendar views, appointment editing, time zones support, etc. - -To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). \ No newline at end of file +To get started with the DevExtreme Scheduler component, refer to the following tutorial for step-by-step instructions: [Getting Started with Scheduler](/Documentation/Guide/UI_Components/Scheduler/Getting_Started_with_Scheduler/). + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/SimpleArray/description.md b/apps/demos/Demos/Scheduler/SimpleArray/description.md index 4003c0e5762e..849ecef3db47 100644 --- a/apps/demos/Demos/Scheduler/SimpleArray/description.md +++ b/apps/demos/Demos/Scheduler/SimpleArray/description.md @@ -1,6 +1,6 @@ You can use the Scheduler component to display and edit appointments from a local array. Use the [dataSource](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#dataSource) property to bind the Scheduler to the array. - The Scheduler automatically displays appointments if source object field names match the names listed in the [dxSchedulerAppointment](/Documentation/ApiReference/UI_Components/dxScheduler/Interfaces/dxSchedulerAppointment/) help section. In this demo, the following fields illustrate this point: [text](/Documentation/ApiReference/UI_Components/dxScheduler/Interfaces/dxSchedulerAppointment/#text), [startDate](/Documentation/ApiReference/UI_Components/dxScheduler/Interfaces/dxSchedulerAppointment/#startDate), [endDate](/Documentation/ApiReference/UI_Components/dxScheduler/Interfaces/dxSchedulerAppointment/#endDate), and [allDay](/Documentation/ApiReference/UI_Components/dxScheduler/Interfaces/dxSchedulerAppointment/#allDay). If field names in your data source differ, specify them in **...Expr** properties ([textExpr](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#textExpr), [startDateExpr](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#startDateExpr), [endDateExpr](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#endDateExpr), [allDayExpr](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#allDayExpr), and so on). + -For more information about binding to an array, refer to the following help topic: [Local Array](/Documentation/Guide/Data_Binding/Specify_a_Data_Source/Local_Array/). +For more information about binding to an array, refer to the following help topic: [Local Array](/Documentation/Guide/Data_Binding/Specify_a_Data_Source/Local_Array/). \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/TimeZonesSupport/description.md b/apps/demos/Demos/Scheduler/TimeZonesSupport/description.md index 76d9b3edb44d..55f2f56f007e 100644 --- a/apps/demos/Demos/Scheduler/TimeZonesSupport/description.md +++ b/apps/demos/Demos/Scheduler/TimeZonesSupport/description.md @@ -1,6 +1,6 @@ The Scheduler allows its users to view appointments in different time zones. Set the [timeZone](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#timeZone) property to specify the current time zone. This property accepts values from the IANA time zone database. - In this demo, you can use the drop-down menu above the Scheduler to choose between the London, Berlin, and Helsinki time zones. To populate the menu, the [getTimeZones](/Documentation/ApiReference/Common/Utils/utils/#getTimeZonesdate) utility method is used. It returns a list of all IANA time zones that is then filtered. + Users can edit the time zones of individual appointments in the appointment details form. To enable this functionality, set the **editing**.[allowTimeZoneEditing](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/editing/#allowTimeZoneEditing) property to **true**. Information about individual time zones is saved in the [startDateTimeZone](/Documentation/ApiReference/UI_Components/dxScheduler/Interfaces/dxSchedulerAppointment/#startDateTimeZone) and [endDateTimeZone](/Documentation/ApiReference/UI_Components/dxScheduler/Interfaces/dxSchedulerAppointment/#endDateTimeZone) fields of the appointment data objects. diff --git a/apps/demos/Demos/Scheduler/Timelines/description.md b/apps/demos/Demos/Scheduler/Timelines/description.md index 38ca786522a6..dab25828113b 100644 --- a/apps/demos/Demos/Scheduler/Timelines/description.md +++ b/apps/demos/Demos/Scheduler/Timelines/description.md @@ -1,11 +1,11 @@ Timeline views display appointments as a sequence of events on a horizontal timeline, as opposed to basic views that display appointments in a calendar format. You can use the View Switcher above the timetable to switch between the views. - List timeline views in the [views](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/) array to add them to your Scheduler. To activate a specific view at application startup, use the [currentView](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#currentView) property. For information about all supported view types, refer to the following help topic: [View Types](/Documentation/Guide/UI_Components/Scheduler/Views/View_Types/). + This demo shows multiple calendars side-by-side (with data grouped by resources). For information on how to configure such a display, see the following demos: - [Resources](/Demos/WidgetsGallery/Demo/Scheduler/Resources/) -- [Group Orientation](/Demos/WidgetsGallery/Demo/Scheduler/GroupOrientation/) +- [Group Orientation](/Demos/WidgetsGallery/Demo/Scheduler/GroupOrientation/) \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/VirtualScrolling/description.md b/apps/demos/Demos/Scheduler/VirtualScrolling/description.md index e09dcd91ec02..bda5c5f810c5 100644 --- a/apps/demos/Demos/Scheduler/VirtualScrolling/description.md +++ b/apps/demos/Demos/Scheduler/VirtualScrolling/description.md @@ -1,6 +1,6 @@ With virtual scrolling, you can improve the overall performance of your application and reduce load times when our Scheduler component is bound to a large data set. When virtual scrolling is enabled, our Scheduler only renders visible appointments. When an appointment leaves the viewport, the Scheduler removes it from the DOM. - To enable virtual scrolling mode, set the [scrolling](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/scrolling).[mode](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/scrolling/#mode) property to *"virtual"*. Virtual scrolling is available for all [views](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/views/) except *"agenda"*. + \ No newline at end of file diff --git a/apps/demos/Demos/Scheduler/WorkShifts/description.md b/apps/demos/Demos/Scheduler/WorkShifts/description.md index 8f29db303ce3..f89b0b3fd402 100644 --- a/apps/demos/Demos/Scheduler/WorkShifts/description.md +++ b/apps/demos/Demos/Scheduler/WorkShifts/description.md @@ -1,6 +1,6 @@ This demo uses the Scheduler component’s [offset](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#offset) property to indicate the starting point of a day. The Scheduler’s offset can be set in multiples of 5 and can range from -1440 minutes (-24 hours) to 1440 minutes (24 hours). - For instance, if you set the offset to -120, like the **First shift** in this demo, the day begins at 10:00 PM on the previous day instead of 00:00. If you set the offset to 360, like the **Second shift**, the day begins at 6:00 AM. -You can also combine this property with [startDayHour](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#startDayHour), [endDayHour](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#endDayHour), and [cellDuration](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#cellDuration) to obtain desired display results. \ No newline at end of file +You can also combine this property with [startDayHour](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#startDayHour), [endDayHour](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#endDayHour), and [cellDuration](/Documentation/ApiReference/UI_Components/dxScheduler/Configuration/#cellDuration) to obtain desired display results. + \ No newline at end of file diff --git a/apps/demos/Demos/SelectBox/CustomizeDropDownButton/description.md b/apps/demos/Demos/SelectBox/CustomizeDropDownButton/description.md index 41b420460680..b0e8c71617d8 100644 --- a/apps/demos/Demos/SelectBox/CustomizeDropDownButton/description.md +++ b/apps/demos/Demos/SelectBox/CustomizeDropDownButton/description.md @@ -1,5 +1,4 @@ Use the [dropDownButtonTemplate](/Documentation/ApiReference/UI_Components/dxSelectBox/Configuration/#dropDownButtonTemplate) to customize the drop-down button. - This demo illustrates three customization cases: @@ -10,4 +9,5 @@ Declare an `img` element in the template. Declare the load indicator and a regular icon in the template. Display the load indicator while hiding the icon, and vice versa. - **Icon that depends on the selected value** -Declare the default and the selected item's icon in the template. If there is a selected item, display its icon; otherwise, show the default icon. \ No newline at end of file +Declare the default and the selected item's icon in the template. If there is a selected item, display its icon; otherwise, show the default icon. + \ No newline at end of file diff --git a/apps/demos/Demos/SelectBox/GroupedItems/description.md b/apps/demos/Demos/SelectBox/GroupedItems/description.md index 706d8b4d0a51..2e8acd0bd662 100644 --- a/apps/demos/Demos/SelectBox/GroupedItems/description.md +++ b/apps/demos/Demos/SelectBox/GroupedItems/description.md @@ -1,7 +1,7 @@ Data items in the SelectBox's drop-down list can be organized in groups. - If the data source contains ungrouped data items, use the [DataSource](/Documentation/ApiReference/Data_Layer/DataSource/)'s [group](/Documentation/ApiReference/Data_Layer/DataSource/Configuration/#group) property to specify the data field to group by. This case is illustrated in this demo's first and third SelectBoxes. + The SelectBox can also work with initially grouped data items. In this case, the data array should contain objects with the **key** and **items** fields: diff --git a/apps/demos/Demos/Switch/Overview/description.md b/apps/demos/Demos/Switch/Overview/description.md index fef31c73965e..7251af821612 100644 --- a/apps/demos/Demos/Switch/Overview/description.md +++ b/apps/demos/Demos/Switch/Overview/description.md @@ -1,7 +1,6 @@ The Switch component can be in two states: **ON** (when the [value](/Documentation/ApiReference/UI_Components/dxSwitch/Configuration/#value) is **true**) and **OFF** (when the [value](/Documentation/ApiReference/UI_Components/dxSwitch/Configuration/#value) is **false**). To respond to value changes, assign the handling function to the [onValueChanged](/Documentation/ApiReference/UI_Components/dxSwitch/Configuration/#onValueChanged) property. - If you want to change the Switch text, specify the [switchedOnText](/Documentation/ApiReference/UI_Components/dxSwitch/Configuration/#switchedOnText) and the [switchedOffText](/Documentation/ApiReference/UI_Components/dxSwitch/Configuration/#switchedOffText) properties. If the changed text does not fit in the component, use the [width](/Documentation/ApiReference/UI_Components/dxSwitch/Configuration/#width) property. Set the [disabled](/Documentation/ApiReference/UI_Components/dxSwitch/Configuration/#disabled) property to **true** to disable the component. - + \ No newline at end of file diff --git a/apps/demos/Demos/TabPanel/Overview/description.md b/apps/demos/Demos/TabPanel/Overview/description.md index 36340d069039..08d982b5784e 100644 --- a/apps/demos/Demos/TabPanel/Overview/description.md +++ b/apps/demos/Demos/TabPanel/Overview/description.md @@ -1,7 +1,7 @@ The [TabPanel](/Documentation/ApiReference/UI_Components/dxTabPanel/) UI component includes both the [Tabs](/Documentation/ApiReference/UI_Components/dxTabs/) and [MultiView](/Documentation/ApiReference/UI_Components/dxMultiView/) components. The TabPanel automatically synchronizes the selected tab with the currently displayed view (and vice versa). - To get started with the DevExtreme TabPanel component, refer to the following step-by-step tutorial: [Getting Started with TabPanel](/Documentation/Guide/UI_Components/TabPanel/Getting_Started_with_TabPanel/). + ## Generate Similar Tabs Based on a Data Source diff --git a/apps/demos/Demos/Toast/Overview/description.md b/apps/demos/Demos/Toast/Overview/description.md index 6742ae869fea..7ddcef51c620 100644 --- a/apps/demos/Demos/Toast/Overview/description.md +++ b/apps/demos/Demos/Toast/Overview/description.md @@ -1,7 +1,7 @@ The Toast is a UI component that displays pop-up notifications. - When you need to display a notification, call the [notify(message, type, displayTime)](/Documentation/ApiReference/Common/Utils/ui/#notifymessage_type_displayTime) method with values for the [message](/Documentation/ApiReference/UI_Components/dxToast/Configuration/#message), [type](/Documentation/ApiReference/UI_Components/dxToast/Configuration/#type), and [displayTime](/Documentation/ApiReference/UI_Components/dxToast/Configuration/#displayTime) properties passed as arguments. + You can specify one of the four predefined types of notifications, depending on the mood of the message: diff --git a/apps/demos/Demos/Toast/Stack/description.md b/apps/demos/Demos/Toast/Stack/description.md index 2779d231951b..27fefd66ffc9 100644 --- a/apps/demos/Demos/Toast/Stack/description.md +++ b/apps/demos/Demos/Toast/Stack/description.md @@ -1,7 +1,7 @@ The DevExtreme Toast components can stack multiple notifications. Use the [notify(message, stack)](/Documentation/ApiReference/Common/Utils/ui/#notifymessage_stack) or [notify(options, stack)](/Documentation/ApiReference/Common/Utils/ui/#notifyoptions_stack) method to display stacked messages. - These methods use a **stack** object that has the following structure: *{position, direction}*. + ## Specify Position diff --git a/apps/demos/Demos/Toolbar/Adaptability/description.md b/apps/demos/Demos/Toolbar/Adaptability/description.md index 2b2b259fe0be..26c3a5075637 100644 --- a/apps/demos/Demos/Toolbar/Adaptability/description.md +++ b/apps/demos/Demos/Toolbar/Adaptability/description.md @@ -1,7 +1,7 @@ This demo demonstrates how the DevExtreme Toolbar component can adapt itself to different screen widths. - -If you would like to learn more about our feature-complete Toolbar component, please refer to the following tutorial: [Getting Started with Toolbar](/Documentation/Guide/UI_Components/Toolbar/Getting_Started_with_Toolbar/). +If you would like to learn more about our feature-complete Toolbar component, please refer to the following tutorial: [Getting Started with Toolbar](/Documentation/Guide/UI_Components/Toolbar/Getting_Started_with_Toolbar/). + In this demo, you can drag our Toolbar container's resizing handle to visualize resize operations and view our rendering implementation on different screens. When used in single-line mode (default), our Toolbar does not wrap content and displays an overflow menu for items that do not fit within the container. Use the [locateInMenu](/Documentation/ApiReference/UI_Components/dxToolbar/Configuration/items/#locateInMenu) property to control whether items appear in the overflow menu. diff --git a/apps/demos/Demos/TreeList/Adaptability/description.md b/apps/demos/Demos/TreeList/Adaptability/description.md index 316b2964bf8c..8fd238c60187 100644 --- a/apps/demos/Demos/TreeList/Adaptability/description.md +++ b/apps/demos/Demos/TreeList/Adaptability/description.md @@ -1,6 +1,6 @@ The TreeList automatically adapts its layout to screens with different sizes. In this demo, you can switch between horizontal and vertical screen orientations. If columns do not fit the selected orientation, the TreeList hides them one by one, starting with the rightmost column. Information from the hidden columns is still available in adaptive detail rows. - To enable this feature, set the [columnHidingEnabled](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#columnHidingEnabled) property to **true**. + -The TreeList hides columns based on their hiding priorities. Columns with lower priority values are hidden first. You can use the **columns[]**.[hidingPriority](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#hidingPriority) property to specify custom hiding priorities for those columns that you want to hide. Other columns will never be hidden. +The TreeList hides columns based on their hiding priorities. Columns with lower priority values are hidden first. You can use the **columns[]**.[hidingPriority](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#hidingPriority) property to specify custom hiding priorities for those columns that you want to hide. Other columns will never be hidden. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/ColumnFixing/description.md b/apps/demos/Demos/TreeList/ColumnFixing/description.md index 0325e8307316..2d2e626a4cca 100644 --- a/apps/demos/Demos/TreeList/ColumnFixing/description.md +++ b/apps/demos/Demos/TreeList/ColumnFixing/description.md @@ -1,6 +1,6 @@ A horizontal scrollbar appears when the total width of all columns exceeds the TreeList component's width. The component allows users to fix individual columns at the right or left border so that they are always visible. To enable this feature, set the **columnFixing**.[enabled](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columnFixing/#enabled) property to **true**. - To fix or unfix a column, users should right-click the column's header and select the corresponding operation in the context menu. To prevent users from fixing or unfixing a column, set its [allowFixing](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowFixing) property to **false**. + -To fix a column programmatically, set its [fixed](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixed) property to **true**. The default position is the TreeList's left, but you can set the column's [fixedPosition](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixedPosition) property to *"right"*. +To fix a column programmatically, set its [fixed](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixed) property to **true**. The default position is the TreeList's left, but you can set the column's [fixedPosition](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixedPosition) property to *"right"*. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/CustomizeKeyboardNavigation/description.md b/apps/demos/Demos/TreeList/CustomizeKeyboardNavigation/description.md index 3da28cbeaf93..1f5cf8ef0b12 100644 --- a/apps/demos/Demos/TreeList/CustomizeKeyboardNavigation/description.md +++ b/apps/demos/Demos/TreeList/CustomizeKeyboardNavigation/description.md @@ -1,5 +1,4 @@ -The following properties customize keyboard navigation. - +The following properties customize keyboard navigation: - [enterKeyAction](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/keyboardNavigation/#enterKeyAction) Specifies the TreeList's actions when a user presses Enter key: @@ -17,3 +16,4 @@ Specifies the direction in which to move focus when a user presses Enter: Specifies whether to start entering a new cell value on a key press. In this demo, you can use the controls under the TreeList to change any of these properties. + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/FilterModes/description.md b/apps/demos/Demos/TreeList/FilterModes/description.md index d4cd1e69a066..08d0e6c93d69 100644 --- a/apps/demos/Demos/TreeList/FilterModes/description.md +++ b/apps/demos/Demos/TreeList/FilterModes/description.md @@ -1,5 +1,4 @@ Filter and search results depend on the [filterMode](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#filterMode) property. - The TreeList supports the following modes: @@ -10,4 +9,5 @@ The TreeList supports the following modes: The results include rows that meet the filter condition and their ancestors. - *"fullBranch"* - The results include rows that meet the filter condition and their ancestors and descendants. \ No newline at end of file + The results include rows that meet the filter condition and their ancestors and descendants. + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/FilterPanel/description.md b/apps/demos/Demos/TreeList/FilterPanel/description.md index 7ec392770378..c7b80ff7007b 100644 --- a/apps/demos/Demos/TreeList/FilterPanel/description.md +++ b/apps/demos/Demos/TreeList/FilterPanel/description.md @@ -1,8 +1,8 @@ The [filterPanel](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/filterPanel/) displays the combined filter in the bottom of the TreeList. This filter is stored in the [filterValue](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#filterValue) property and consists of conditions that a user applied in the following UI elements: [filter row](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/filterRow/), [header filter](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/headerFilter/), [filterBuilder](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#filterBuilder). Users can deselect the checkbox in the filter panel to temporarily deactivate the current filter. - To display the filter panel, set the **filterPanel**.[visible](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/filterPanel/#visible) property to **true**. A click on the combined filter calls the integrated filter builder. You can configure it in the [filterBuilder](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#filterBuilder) object. + -TreeList uses the DevExtreme [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) component to display the integrated filter builder. The Popup's default configuration is defined automatically, but you can change it in the [filterBuilderPopup](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#filterBuilderPopup) object. +TreeList uses the DevExtreme [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) component to display the integrated filter builder. The Popup's default configuration is defined automatically, but you can change it in the [filterBuilderPopup](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#filterBuilderPopup) object. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/FocusedRow/description.md b/apps/demos/Demos/TreeList/FocusedRow/description.md index 138db954e924..063058861ad7 100644 --- a/apps/demos/Demos/TreeList/FocusedRow/description.md +++ b/apps/demos/Demos/TreeList/FocusedRow/description.md @@ -1,8 +1,8 @@ The TreeList component can highlight the focused row. To enable this feature, set the [focusedRowEnabled](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#focusedRowEnabled) property to **true**. - To focus a row programmatically, specify the [focusedRowKey](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#focusedRowKey) property. The TreeList automatically scrolls to the focused row. You can set the [autoNavigateToFocusedRow](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#autoNavigateToFocusedRow) property to **false** to deactivate this behavior. In the UI, users can click a row to focus it. The focused row is saved in the TreeList's [state](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/stateStoring/). You can use the [onFocusedRowChanging](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#onFocusedRowChanging) and [onFocusedRowChanged](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#onFocusedRowChanged) properties to specify a custom function that is executed before or after a row is focused. + -In this demo, the row with the `45` key is focused initially. You can specify the `focusedRowKey` property via the input field below the TreeList. The **onFocusedRowChanged** function is used to display additional information below the component when the focused row changes. +In this demo, the row with the `45` key is focused initially. You can specify the `focusedRowKey` property via the input field below the TreeList. The **onFocusedRowChanged** function is used to display additional information below the component when the focused row changes. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/FormEditing/description.md b/apps/demos/Demos/TreeList/FormEditing/description.md index 5b9ae35b97e7..688653a67d53 100644 --- a/apps/demos/Demos/TreeList/FormEditing/description.md +++ b/apps/demos/Demos/TreeList/FormEditing/description.md @@ -1,9 +1,9 @@ The TreeList can use the [Form](/Documentation/ApiReference/UI_Components/dxForm/) component to arrange cell editors when users modify a row. The Form allows users to edit values from [visible and hidden](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#visible) columns. - To enable form edit mode, configure the following properties: - Set **editing**.[mode](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#mode) to *"form"* - Assign **true** to the [editing](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/) object's [allowAdding](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowAdding), [allowUpdating](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowUpdating), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowDeleting) properties. + A column's default editor is defined automatically based on this column's [dataType](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#dataType). To customize this editor or replace it with another editor, use the column's [formItem](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#formItem) object. For information on settings that you can define in the **formItem** object, refer to the [SimpleItem](/Documentation/ApiReference/UI_Components/dxForm/Item_Types/SimpleItem/) help topic. @@ -17,4 +17,4 @@ Populates form editors of a new row with default values. In this demo, **onInitN - [onEditorPreparing](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#onEditorPreparing) Customizes form editors. In this demo, this handler forbids users to edit the `Head` value of John Heart. -Refer to the following help topic to see the full list of the events that edit operations raise: [Editing Events](/Documentation/Guide/UI_Components/TreeList/Editing/#Events). +Refer to the following help topic to see the full list of the events that edit operations raise: [Editing Events](/Documentation/Guide/UI_Components/TreeList/Editing/#Events). \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/KeyboardNavigation/description.md b/apps/demos/Demos/TreeList/KeyboardNavigation/description.md index bcdc8574fc3b..ca84bb3d4a8b 100644 --- a/apps/demos/Demos/TreeList/KeyboardNavigation/description.md +++ b/apps/demos/Demos/TreeList/KeyboardNavigation/description.md @@ -1,5 +1,4 @@ -In this demo, you can use the following keys and key combinations to interact with the TreeList. - +In this demo, you can use the following keys and key combinations to interact with the TreeList: - **Enter** Execute an action on a focused element. @@ -12,3 +11,4 @@ Navigate between a column header, filter row, data area, filter panel, and pager - **Ctrl** + **←** or **Ctrl** + **→** Expand/collapse the focused row. + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/MultipleRowSelection/description.md b/apps/demos/Demos/TreeList/MultipleRowSelection/description.md index c1465e77ee4d..d43a0d612b75 100644 --- a/apps/demos/Demos/TreeList/MultipleRowSelection/description.md +++ b/apps/demos/Demos/TreeList/MultipleRowSelection/description.md @@ -1,8 +1,8 @@ This demo enables multiple selection [mode](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/selection/#mode). This mode allows users to press keyboard shortcuts or click checkboxes to select multiple rows. - The checkbox in the leftmost column header selects all rows. You can set the [allowSelectAll](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/selection/#allowSelectAll) property to **false** to disable the checkbox. Multiple selection mode is non-recursive (when a row is selected, nested rows remain unselected). If users should select rows recursively, set the **selection**.[recursive](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/selection/#recursive) property to **true**. In this demo, you can use the checkbox under the TreeList component to toggle this property. + -TreeList includes an API to select multiple rows. For details, refer to the following article: [Selection API](/Documentation/Guide/UI_Components/TreeList/Selection/#API). +TreeList includes an API to select multiple rows. For details, refer to the following article: [Selection API](/Documentation/Guide/UI_Components/TreeList/Selection/#API). \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/MultipleSorting/description.md b/apps/demos/Demos/TreeList/MultipleSorting/description.md index 535587cb9f4a..c5868145ff7b 100644 --- a/apps/demos/Demos/TreeList/MultipleSorting/description.md +++ b/apps/demos/Demos/TreeList/MultipleSorting/description.md @@ -1,11 +1,11 @@ The TreeList component can sort values by a single or multiple columns. Use the **sorting**.[mode](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/sorting/#mode) property to specify the sort mode. - - **Single sort mode** A user can click the column header to sort by this column and click it again to change the sort order. An arrow icon in the column's header indicates the sort order. - **Multiple sort mode** A user can hold the **Shift** key and click column headers in the order the user wants to apply sorting. A number in the column's header indicates the sort index. To cancel a column's sort settings, a user should hold the **Ctrl** key and click the column header. + A user can also apply or cancel sort settings in the column header's context menu. To disallow a user to sort by a particular column, set the column's [allowSorting](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowSorting) property to **false**. diff --git a/apps/demos/Demos/TreeList/Overview/Angular/description.md b/apps/demos/Demos/TreeList/Overview/Angular/description.md index 39be13322d81..5aa7c56de760 100644 --- a/apps/demos/Demos/TreeList/Overview/Angular/description.md +++ b/apps/demos/Demos/TreeList/Overview/Angular/description.md @@ -1,4 +1,4 @@ DevExtreme Angular Tree List is a client-side control for displaying hierarchical data. You can use it as an Angular component. It is so flexible that you do not need to feed it hierarchical data structures. Even with a collection of linked plain objects, the Tree List can still build a tree hierarchy. It supports native Angular features as well: AOT compilation, declarative configuration, TypeScript compile-time checking, and more. - -To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). \ No newline at end of file +To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/Overview/React/description.md b/apps/demos/Demos/TreeList/Overview/React/description.md index 1583b4fee6c6..c18bef9f0777 100644 --- a/apps/demos/Demos/TreeList/Overview/React/description.md +++ b/apps/demos/Demos/TreeList/Overview/React/description.md @@ -1,4 +1,4 @@ DevExtreme React Tree List is a UI component that displays hierarchical data in a table. Its main features include robust data layer, multiple editing modes, client-side data validation, numerous filtering and searching properties, and many more. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - -To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). \ No newline at end of file +To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/Overview/ReactJs/description.md b/apps/demos/Demos/TreeList/Overview/ReactJs/description.md index 1583b4fee6c6..c18bef9f0777 100644 --- a/apps/demos/Demos/TreeList/Overview/ReactJs/description.md +++ b/apps/demos/Demos/TreeList/Overview/ReactJs/description.md @@ -1,4 +1,4 @@ DevExtreme React Tree List is a UI component that displays hierarchical data in a table. Its main features include robust data layer, multiple editing modes, client-side data validation, numerous filtering and searching properties, and many more. [Learn more about DevExtreme React components](/Documentation/Guide/React_Components/DevExtreme_React_Components/). - -To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). \ No newline at end of file +To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/Overview/jQuery/description.md b/apps/demos/Demos/TreeList/Overview/jQuery/description.md index 710c067fc1dd..89eec05cdf56 100644 --- a/apps/demos/Demos/TreeList/Overview/jQuery/description.md +++ b/apps/demos/Demos/TreeList/Overview/jQuery/description.md @@ -1,4 +1,4 @@ DevExtreme JavaScript TreeList control is a cross-breed of a tree view and data grid. This control is available as a jQuery plugin and can be bound to data from local arrays, JSON files, Web API and OData services, or custom remote services. This demo shows a slightly customized TreeList with selection, filtering, and column rearranging enabled. Move to other demos to explore more TreeList features, like sorting, data editing, adaptability, etc. - -To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). \ No newline at end of file +To get started with the DevExtreme TreeList component, refer to the following tutorial for step-by-step instructions: [Getting Started with TreeList](/Documentation/Guide/UI_Components/TreeList/Getting_Started_with_TreeList/). + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/PopupEditing/description.md b/apps/demos/Demos/TreeList/PopupEditing/description.md index 4455937c3c7c..b81bfd024126 100644 --- a/apps/demos/Demos/TreeList/PopupEditing/description.md +++ b/apps/demos/Demos/TreeList/PopupEditing/description.md @@ -1,8 +1,8 @@ TreeList can display a popup edit form. The form can include any fields from the bound data source, regardless of whether the corresponding column is visible in the grid (see the `Head` column). - To enable this behavior in your application, do the following: - Set **editing**.[mode](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#mode) to *"popup"*. - Set the [editing](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/) object's [allowUpdating](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowUpdating), [allowAdding](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowAdding), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowDeleting) properties to **true**. + TreeList uses the DevExtreme [Form](/Documentation/ApiReference/UI_Components/dxForm/) and [Popup](/Documentation/ApiReference/UI_Components/dxPopup/) components to display the popup form. Their default configurations are defined automatically. If these configurations do not meet your requirements, you can redefine them in the **editing** object's [form](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#form) and [popup](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#popup) properties. For more information about this edit mode's limitations, refer to the descriptions of these properties. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/Reordering/description.md b/apps/demos/Demos/TreeList/Reordering/description.md index 99c98caf46e4..5e96056c12c1 100644 --- a/apps/demos/Demos/TreeList/Reordering/description.md +++ b/apps/demos/Demos/TreeList/Reordering/description.md @@ -1,4 +1,4 @@ TreeList columns have the same order as fields in data objects. You can use the [columns](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/) array to specify a different order. To reorder a column at runtime, change its [visibleIndex](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#visibleIndex) property. - Users can drag and drop column headers to reorder columns. To enable this feature, set the [allowColumnReordering](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#allowColumnReordering) property to **true**. If you do not want users to drag a specific column, disable its [allowReordering](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowReordering) property. In this demo, users cannot drag the Full Name column. + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/RowEditing/description.md b/apps/demos/Demos/TreeList/RowEditing/description.md index 635e4b6e5912..3312ee24832a 100644 --- a/apps/demos/Demos/TreeList/RowEditing/description.md +++ b/apps/demos/Demos/TreeList/RowEditing/description.md @@ -1,7 +1,7 @@ The TreeList allows users to edit data in multiple modes. This demo shows the *"row"* edit mode. To edit a row, click its "Edit" button. Only one row can be in the edit state at a time. - To enable row edit mode, set the [mode](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#mode) property to *"row"* and enable the [editing](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#mode) object's [allowUpdating](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowUpdating), [allowAdding](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowAdding), and [allowDeleting](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/editing/#allowDeleting) properties to allow edit operations. + Buttons for allowed edit operations are displayed in an edit column. To customize it programmatically, declare a column of the `buttons` [type](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#type) and specify the available buttons. In this demo, the `buttons` column is used to hide the "Add" button in each row. See the following help topic for more details on edit column customization: [Customize the Edit Column](/Documentation/Guide/UI_Components/TreeList/Columns/Column_Types/Command_Columns/#Customize_the_Edit_Column). diff --git a/apps/demos/Demos/TreeList/SimpleArrayHierarchicalStructure/description.md b/apps/demos/Demos/TreeList/SimpleArrayHierarchicalStructure/description.md index ea7831897b8f..f3dabc67d114 100644 --- a/apps/demos/Demos/TreeList/SimpleArrayHierarchicalStructure/description.md +++ b/apps/demos/Demos/TreeList/SimpleArrayHierarchicalStructure/description.md @@ -1,5 +1,4 @@ -To bind the TreeList to a hierarchical array, do the following. - +To bind the TreeList to a hierarchical array, do the following: 1. Assign the array to the [dataSource](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#dataSource) property. @@ -8,3 +7,4 @@ To bind the TreeList to a hierarchical array, do the following. 3. Use the [itemsExpr](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#itemsExpr) property to specify the data field that contains nested items. 4. If each data item has a Boolean field that specifies whether this data item nests other items, assign the field's name to the [hasItemsExpr](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#hasItemsExpr) property. The TreeList uses this information to render the expand button. This is required only if the UI component is bound to a remote data source. + \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/SimpleArrayPlainStructure/description.md b/apps/demos/Demos/TreeList/SimpleArrayPlainStructure/description.md index 1dd80418bad1..120ea6dce514 100644 --- a/apps/demos/Demos/TreeList/SimpleArrayPlainStructure/description.md +++ b/apps/demos/Demos/TreeList/SimpleArrayPlainStructure/description.md @@ -1,5 +1,4 @@ -To bind the TreeList to an array that contains plain-structured data objects, do the following. - +To bind the TreeList to an array that contains plain-structured data objects, do the following: 1. Assign the array to the [dataSource](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#dataSource) property. @@ -8,5 +7,6 @@ To bind the TreeList to an array that contains plain-structured data objects, do 3. Specify the root node's key in the [rootValue](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#rootValue) property if it is not 0. 4. If each data item has a Boolean field that specifies whether this data item nests other items, assign the field's name to the [hasItemsExpr](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#hasItemsExpr) property. The TreeList uses this information to render the expand button. This is required only if the UI component is bound to a remote data source. + -The TreeList builds a tree from plain data objects based on the specified properties. +The TreeList builds a tree from plain data objects based on the specified properties. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/UsingFilterRow/description.md b/apps/demos/Demos/TreeList/UsingFilterRow/description.md index 3e79b0c4bb49..dc00612e6ea7 100644 --- a/apps/demos/Demos/TreeList/UsingFilterRow/description.md +++ b/apps/demos/Demos/TreeList/UsingFilterRow/description.md @@ -1,5 +1,4 @@ The filter row allows users to enter a value for each column and filter grid data by those values. To display the filter row, set the **filterRow**.[visible](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/filterRow/#visible) property to **true**. If you need to disable a filter row cell for a specific column, set the column's [allowFiltering](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowFiltering) property to **false**. - Depending on a column's [dataType](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#dataType), its filter row cell contains different editors: @@ -25,9 +24,10 @@ Depending on a column's [dataType](/Documentation/ApiReference/UI_Components/dxT Date and time picker + In this demo, the Hire Date column's filter row cell contains a date picker. Other filter row cells contain text boxes. The TreeList supports a specific set of [filterOperations](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#filterOperations) for each data type. Users can click a magnifying glass icon in each filter row cell to specify the [selectedFilterOperation](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#selectedFilterOperation). -A column's filter value is stored in the [filterValue](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#filterValue) property. You can use this property to set the filter value in code. +A column's filter value is stored in the [filterValue](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#filterValue) property. You can use this property to set the filter value in code. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/UsingSearchPanel/description.md b/apps/demos/Demos/TreeList/UsingSearchPanel/description.md index 63f7753d6209..5ae663322cd2 100644 --- a/apps/demos/Demos/TreeList/UsingSearchPanel/description.md +++ b/apps/demos/Demos/TreeList/UsingSearchPanel/description.md @@ -1,7 +1,7 @@ If you want users to search data, display the [searchPanel](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/searchPanel/). Set its [visible](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/searchPanel/#visible) property to **true**. - -The TreeList searches in all columns, regardless of whether they are [visible](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#visible) or hidden. To exclude hidden columns from search, enable the **searchPanel**.[searchVisibleColumnsOnly](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/searchPanel/#searchVisibleColumnsOnly) property. You can also exclude any specific column. To do this, set its [allowSearch](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowSearch) property to **false** +The TreeList searches in all columns, regardless of whether they are [visible](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#visible) or hidden. To exclude hidden columns from search, enable the **searchPanel**.[searchVisibleColumnsOnly](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/searchPanel/#searchVisibleColumnsOnly) property. You can also exclude any specific column. To do this, set its [allowSearch](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowSearch) property to **false**. + Numeric, date, and Boolean values match only if they are equal to the search query. String values match if they contain the query. Search for strings is case-insensitive. diff --git a/apps/demos/Demos/TreeList/WebAPIService/description.md b/apps/demos/Demos/TreeList/WebAPIService/description.md index 25f2333cfcf5..cccceccbfc98 100644 --- a/apps/demos/Demos/TreeList/WebAPIService/description.md +++ b/apps/demos/Demos/TreeList/WebAPIService/description.md @@ -1,7 +1,7 @@ To access a Web API service from the client, use the createStore method from the DevExtreme.AspNet.Data extension. This extension also allows you to process data for DevExtreme components on the server. The server-side implementation is available under the `TreeListTasksController.cs` tab in the [ASP.NET MVC](https://demos.devexpress.com/ASPNetMvc/Demo/TreeList/WebAPIService) and [ASP.NET Core](https://demos.devexpress.com/ASPNetCore/Demo/TreeList/WebAPIService/) versions of this demo. - To notify the TreeList that data is processed on the server, set the [remoteOperations](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/remoteOperations/) property to **true**. + ### A 1-Click Solution for CRUD Web API Services with Role-based Access Control via EF Core diff --git a/apps/demos/Demos/TreeView/ContextMenuIntegration/description.md b/apps/demos/Demos/TreeView/ContextMenuIntegration/description.md index 30ef44dccef9..8fcd113ee345 100644 --- a/apps/demos/Demos/TreeView/ContextMenuIntegration/description.md +++ b/apps/demos/Demos/TreeView/ContextMenuIntegration/description.md @@ -1,4 +1,4 @@ To display a DevExtreme [ContextMenu](/Demos/WidgetsGallery/Demo/ContextMenu/Basics/) when users right-click TreeView nodes, specify the nodes as the menu's target elements. To do this, set the menu's [target](/Documentation/ApiReference/UI_Components/dxContextMenu/Configuration/#target) property to a CSS selector. Since all TreeView nodes use the `dx-treeview-item` class, you can use this class' selector, as shown in this demo. - -You can control each command's enabled state depending on the node where users invoked the context menu. Implement the TreeView's [onItemContextMenu](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#onItemContextMenu) function; in it, set the [disabled](/Documentation/ApiReference/UI_Components/dxContextMenu/Configuration/items/#disabled) property to **true** for required commands. \ No newline at end of file +You can control each command's enabled state depending on the node where users invoked the context menu. Implement the TreeView's [onItemContextMenu](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#onItemContextMenu) function; in it, set the [disabled](/Documentation/ApiReference/UI_Components/dxContextMenu/Configuration/items/#disabled) property to **true** for required commands. + \ No newline at end of file diff --git a/apps/demos/Demos/TreeView/LoadDataOnDemand/description.md b/apps/demos/Demos/TreeView/LoadDataOnDemand/description.md index f9eeafaca18f..bf9945eb1688 100644 --- a/apps/demos/Demos/TreeView/LoadDataOnDemand/description.md +++ b/apps/demos/Demos/TreeView/LoadDataOnDemand/description.md @@ -1,4 +1,4 @@ You can use the [createChildren](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#createChildren) function to specify custom logic to load data. This function is called each time a user expands a node that was not expanded before. The node's identifier is passed to the function as an argument. Send this identifier to the data service that should return data for child nodes. - As an alternative, you can enable [virtual mode](/Demos/WidgetsGallery/Demo/TreeView/VirtualMode/) to use the default load logic. + \ No newline at end of file diff --git a/apps/demos/Demos/TreeView/TreeViewWithSearchBar/description.md b/apps/demos/Demos/TreeView/TreeViewWithSearchBar/description.md index 7900313ea519..89e24a7dd239 100644 --- a/apps/demos/Demos/TreeView/TreeViewWithSearchBar/description.md +++ b/apps/demos/Demos/TreeView/TreeViewWithSearchBar/description.md @@ -1,11 +1,11 @@ To add a search bar to the TreeView and customize the search functionality, do the following: - Set the [searchEnabled](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#searchEnabled) property to **true**. - - Use the [searchMode](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#searchMode) property to specify whether items should contain (default), start with, or match the search string. In this example, you can switch between search modes in the drop-down menu. -- Configure the [searchExpr](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#searchExpr) property to specify custom search fields. The default search field is [text](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/items/#text). +- Configure the [searchExpr](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#searchExpr) property to specify custom search fields. The default search field is [text](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/items/#text). + The TreeView uses the TextBox component as a search bar. To customize it, specify [TextBox properties](/Documentation/ApiReference/UI_Components/dxTextBox/Configuration/) in the [searchEditorOptions](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#searchEditorOptions) object. diff --git a/apps/demos/Demos/TreeView/VirtualMode/description.md b/apps/demos/Demos/TreeView/VirtualMode/description.md index 7fb8885379f8..4e891f828f4c 100644 --- a/apps/demos/Demos/TreeView/VirtualMode/description.md +++ b/apps/demos/Demos/TreeView/VirtualMode/description.md @@ -1,7 +1,7 @@ In virtual mode, the TreeView loads a node's children when the node is expanded for the first time. This enhances performance on large datasets. - To enable this feature, set the [virtualModeEnabled](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#virtualModeEnabled) property to **true**. Note that this mode is only available when the TreeView's [dataStructure](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/#dataStructure) is plain. + When the data source is remote, the TreeView requests data for each expanded node. To prevent this for nodes that do not nest others, set the [hasItems](/Documentation/ApiReference/UI_Components/dxTreeView/Configuration/items/#hasItems) field to **false** for the corresponding data objects. diff --git a/apps/demos/Demos/VectorMap/ColorsCustomization/description.md b/apps/demos/Demos/VectorMap/ColorsCustomization/description.md index 964c79c68a69..a1e16ecf758a 100644 --- a/apps/demos/Demos/VectorMap/ColorsCustomization/description.md +++ b/apps/demos/Demos/VectorMap/ColorsCustomization/description.md @@ -1,6 +1,4 @@ -This demo shows how to color different map elements. The map represented here indicates the top ten largest countries in the world by means of colors. These colors are assigned to the map areas using the **customize** callback function of the **layers** object. Moreover, when one of the areas is selected or hovered over, its color changes to those specified by the **selectedColor** and **hoveredColor** properties. +This demo shows how to color different map elements. The map represented here indicates the top ten largest countries in the world by means of colors. These colors are assigned to the map areas using the **customize** callback function of the **layers** object. Moreover, when one of the areas is selected or hovered over, its color changes to those specified by the **selectedColor** and **hoveredColor** properties. - - -Tooltips for the map areas representing the largest countries are customized as well. Using the **tooltip** | **customizeTooltip** callback function, they are colored identical to the areas themselves and display the total area of the country. \ No newline at end of file +Tooltips for the map areas representing the largest countries are customized as well. Using the **tooltip** | **customizeTooltip** callback function, they are colored identical to the areas themselves and display the total area of the country. \ No newline at end of file diff --git a/apps/demos/Demos/VectorMap/CustomAnnotations/description.md b/apps/demos/Demos/VectorMap/CustomAnnotations/description.md index dc86f96bac8e..ec1f46166423 100644 --- a/apps/demos/Demos/VectorMap/CustomAnnotations/description.md +++ b/apps/demos/Demos/VectorMap/CustomAnnotations/description.md @@ -1,10 +1,10 @@ Annotations are containers for images, text blocks, and custom content. By using annotations, you can display additional information to your end users and improve the readability of data visualized within your app. - To create annotations, populate the VectorMap's [annotations](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/annotations/) array. Each object in the array configures an individual annotation. To specify settings for all annotations, use the [commonAnnotationSettings](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/commonAnnotationSettings/) object. Individual settings take precedence over common settings. + You can set each annotation [type](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/annotations/#type) property to *"text"*, *"image"*, or *"custom"*. In this demo, annotation type has been set to *"custom"*. Custom annotations require that you specify your own display [template](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/annotations/#template) in SVG format. As you can see in the demo code, you can access annotation data within template markup. -For more information on annotation settings, refer to the [annotations[]](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/annotations/) help topic. +For more information on annotation settings, refer to the [annotations[]](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/annotations/) help topic. \ No newline at end of file diff --git a/apps/demos/Demos/VectorMap/DynamicViewport/description.md b/apps/demos/Demos/VectorMap/DynamicViewport/description.md index 4d11caf72251..c6909d65d91e 100644 --- a/apps/demos/Demos/VectorMap/DynamicViewport/description.md +++ b/apps/demos/Demos/VectorMap/DynamicViewport/description.md @@ -1,6 +1,6 @@ This demo illustrates how to change the map's viewport. Use the drop-down menu under the map to choose a continent and change the visible area so that the chosen continent is displayed optimally. - To implement this functionality, call the [viewport(viewportCoordinates)](/Documentation/ApiReference/UI_Components/dxVectorMap/Methods/#viewportviewportCoordinates) method every time the drop-down box value changes. You can also implement the [onCenterChanged](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/#onCenterChanged) and [onZoomFactorChanged](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/#onZoomFactorChanged) functions to display the map center's coordinates and the current zoom factor in text boxes under the map. + To show or hide the [control bar](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/controlBar/), enable or disable the [panVisible](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/controlBar/#panVisible) and [zoomVisible](/Documentation/ApiReference/UI_Components/dxVectorMap/Configuration/controlBar/#zoomVisible) properties. You can toggle switches under the map to see how these settings affect the control bar. \ No newline at end of file From dfe964c8e0d62894e6849555d0d0de672196275c Mon Sep 17 00:00:00 2001 From: ivanblinov2k17 Date: Thu, 20 Jun 2024 09:10:18 +0400 Subject: [PATCH 21/29] Fix list drag and drop demo (#27391) (#27635) --- .../Demos/List/ItemDragging/React/App.tsx | 27 ++++++++++++++++--- .../Demos/List/ItemDragging/ReactJs/App.js | 24 ++++++++++++++--- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/apps/demos/Demos/List/ItemDragging/React/App.tsx b/apps/demos/Demos/List/ItemDragging/React/App.tsx index 450b410c4c77..15deeca3bc14 100644 --- a/apps/demos/Demos/List/ItemDragging/React/App.tsx +++ b/apps/demos/Demos/List/ItemDragging/React/App.tsx @@ -12,7 +12,9 @@ const App = () => { const onAdd = useCallback((e) => { const tasks = e.toData === 'plannedTasks' ? plannedTasksState : doingTasksState; - const updatedTasks = [...tasks.slice(0, e.toIndex), e.itemData, ...tasks.slice(e.toIndex)]; + + const updatedTasks = [...tasks]; + updatedTasks.splice(e.toIndex, 0, e.itemData); if (e.toData === 'plannedTasks') { setPlannedTasksState(updatedTasks); @@ -23,7 +25,8 @@ const App = () => { const onRemove = useCallback((e) => { const tasks = e.fromData === 'plannedTasks' ? plannedTasksState : doingTasksState; - const updatedTasks = [...tasks.slice(0, e.fromIndex), ...tasks.slice(e.fromIndex + 1)]; + const updatedTasks = [...tasks]; + updatedTasks.splice(e.fromIndex, 1); if (e.fromData === 'plannedTasks') { setPlannedTasksState(updatedTasks); @@ -33,8 +36,24 @@ const App = () => { }, [setPlannedTasksState, setDoingTasksState, plannedTasksState, doingTasksState]); const onReorder = useCallback((e) => { - onRemove(e); - onAdd(e); + if (e.fromData === e.toData) { + const updateTasks = (tasks) => { + const updatedTasks = [...tasks]; + const [movedTask] = updatedTasks.splice(e.fromIndex, 1); + updatedTasks.splice(e.toIndex, 0, movedTask); + return updatedTasks; + }; + + if (e.fromData === 'plannedTasks') { + setPlannedTasksState((prevTasks) => updateTasks(prevTasks)); + } else { + setDoingTasksState((prevTasks) => updateTasks(prevTasks)); + } + } + else { + onRemove(e); + onAdd(e); + } }, [onAdd, onRemove]); return ( diff --git a/apps/demos/Demos/List/ItemDragging/ReactJs/App.js b/apps/demos/Demos/List/ItemDragging/ReactJs/App.js index d120dd40ad09..9beef1e88a8b 100644 --- a/apps/demos/Demos/List/ItemDragging/ReactJs/App.js +++ b/apps/demos/Demos/List/ItemDragging/ReactJs/App.js @@ -16,7 +16,8 @@ const App = () => { const onAdd = useCallback( (e) => { const tasks = e.toData === 'plannedTasks' ? plannedTasksState : doingTasksState; - const updatedTasks = [...tasks.slice(0, e.toIndex), e.itemData, ...tasks.slice(e.toIndex)]; + const updatedTasks = [...tasks]; + updatedTasks.splice(e.toIndex, 0, e.itemData); if (e.toData === 'plannedTasks') { setPlannedTasksState(updatedTasks); } else { @@ -28,7 +29,8 @@ const App = () => { const onRemove = useCallback( (e) => { const tasks = e.fromData === 'plannedTasks' ? plannedTasksState : doingTasksState; - const updatedTasks = [...tasks.slice(0, e.fromIndex), ...tasks.slice(e.fromIndex + 1)]; + const updatedTasks = [...tasks]; + updatedTasks.splice(e.fromIndex, 1); if (e.fromData === 'plannedTasks') { setPlannedTasksState(updatedTasks); } else { @@ -39,8 +41,22 @@ const App = () => { ); const onReorder = useCallback( (e) => { - onRemove(e); - onAdd(e); + if (e.fromData === e.toData) { + const updateTasks = (tasks) => { + const updatedTasks = [...tasks]; + const [movedTask] = updatedTasks.splice(e.fromIndex, 1); + updatedTasks.splice(e.toIndex, 0, movedTask); + return updatedTasks; + }; + if (e.fromData === 'plannedTasks') { + setPlannedTasksState((prevTasks) => updateTasks(prevTasks)); + } else { + setDoingTasksState((prevTasks) => updateTasks(prevTasks)); + } + } else { + onRemove(e); + onAdd(e); + } }, [onAdd, onRemove], ); From 6b303b79c43fef6ae44d2e5d7221dbc276c839b5 Mon Sep 17 00:00:00 2001 From: ivanblinov2k17 Date: Thu, 20 Jun 2024 09:10:51 +0400 Subject: [PATCH 22/29] Documentation - Fix - Framework dependant desriptions missing (#27610) (#27623) Co-authored-by: Vlada Skorokhodova --- .../DataGrid/EditStateManagement/React/description.md | 1 + .../DataGrid/EditStateManagement/ReactJs/description.md | 1 + .../Demos/DataGrid/EditStateManagement/Vue/description.md | 1 + .../DropDownBox/SingleSelection/Angular/description.md | 6 +++++- .../Demos/DropDownBox/SingleSelection/React/description.md | 7 ++++++- .../DropDownBox/SingleSelection/ReactJs/description.md | 7 ++++++- .../Demos/DropDownBox/SingleSelection/Vue/description.md | 7 ++++++- 7 files changed, 26 insertions(+), 4 deletions(-) diff --git a/apps/demos/Demos/DataGrid/EditStateManagement/React/description.md b/apps/demos/Demos/DataGrid/EditStateManagement/React/description.md index da82ac7073ba..f8ce44c8624c 100644 --- a/apps/demos/Demos/DataGrid/EditStateManagement/React/description.md +++ b/apps/demos/Demos/DataGrid/EditStateManagement/React/description.md @@ -1,4 +1,5 @@ Our DataGrid component manages its edit state automatically. If your use case requires full control over the editing process, you can use the API members below to manage state manually. In this demo, we manage state with a help of the useReducer React hook. + **Component Properties** diff --git a/apps/demos/Demos/DataGrid/EditStateManagement/ReactJs/description.md b/apps/demos/Demos/DataGrid/EditStateManagement/ReactJs/description.md index da82ac7073ba..f8ce44c8624c 100644 --- a/apps/demos/Demos/DataGrid/EditStateManagement/ReactJs/description.md +++ b/apps/demos/Demos/DataGrid/EditStateManagement/ReactJs/description.md @@ -1,4 +1,5 @@ Our DataGrid component manages its edit state automatically. If your use case requires full control over the editing process, you can use the API members below to manage state manually. In this demo, we manage state with a help of the useReducer React hook. + **Component Properties** diff --git a/apps/demos/Demos/DataGrid/EditStateManagement/Vue/description.md b/apps/demos/Demos/DataGrid/EditStateManagement/Vue/description.md index 4537d3f5f0bb..c116a185d6d4 100644 --- a/apps/demos/Demos/DataGrid/EditStateManagement/Vue/description.md +++ b/apps/demos/Demos/DataGrid/EditStateManagement/Vue/description.md @@ -1,4 +1,5 @@ Our DataGrid component manages its edit state automatically. If your use case requires full control over the editing process, you can use the API members below to manage state manually. In this demo, we manage state with a help of the Vuex library. + **Component Properties** diff --git a/apps/demos/Demos/DropDownBox/SingleSelection/Angular/description.md b/apps/demos/Demos/DropDownBox/SingleSelection/Angular/description.md index 411f1dab4440..351ec986b248 100644 --- a/apps/demos/Demos/DropDownBox/SingleSelection/Angular/description.md +++ b/apps/demos/Demos/DropDownBox/SingleSelection/Angular/description.md @@ -1,4 +1,8 @@ -The DropDownBox component is an editor that consists of a text field and drop-down content. In this demo, the content is the TreeView and the DataGrid in the single selection mode. +DropDownBox is an advanced editor whose drop-down window can include other components. + +DevExtreme ships with multiple other drop-down editors. To find out which editor best suits your task, review the following article: [How to Choose a Drop-Down Editor](/Documentation/Guide/UI_Components/Lookup/Choose_a_Drop-Down_Editor/). + +To get started with the DevExtreme DropDownBox component, refer to the following step-by-step tutorial: [Getting Started with DropDownBox](/Documentation/Guide/UI_Components/DropDownBox/Getting_Started_with_DropDownBox/). The following instructions show how to synchronize the DropDownBox with any other embedded DevExtreme component: diff --git a/apps/demos/Demos/DropDownBox/SingleSelection/React/description.md b/apps/demos/Demos/DropDownBox/SingleSelection/React/description.md index add75e5cf71d..351ec986b248 100644 --- a/apps/demos/Demos/DropDownBox/SingleSelection/React/description.md +++ b/apps/demos/Demos/DropDownBox/SingleSelection/React/description.md @@ -1,4 +1,9 @@ -The DropDownBox component is an editor that consists of a text field and drop-down content. In this demo, the content is the TreeView and the DataGrid in the single selection mode. +DropDownBox is an advanced editor whose drop-down window can include other components. + +DevExtreme ships with multiple other drop-down editors. To find out which editor best suits your task, review the following article: [How to Choose a Drop-Down Editor](/Documentation/Guide/UI_Components/Lookup/Choose_a_Drop-Down_Editor/). + +To get started with the DevExtreme DropDownBox component, refer to the following step-by-step tutorial: [Getting Started with DropDownBox](/Documentation/Guide/UI_Components/DropDownBox/Getting_Started_with_DropDownBox/). + The following instructions show how to synchronize the DropDownBox with any other embedded DevExtreme component: diff --git a/apps/demos/Demos/DropDownBox/SingleSelection/ReactJs/description.md b/apps/demos/Demos/DropDownBox/SingleSelection/ReactJs/description.md index add75e5cf71d..351ec986b248 100644 --- a/apps/demos/Demos/DropDownBox/SingleSelection/ReactJs/description.md +++ b/apps/demos/Demos/DropDownBox/SingleSelection/ReactJs/description.md @@ -1,4 +1,9 @@ -The DropDownBox component is an editor that consists of a text field and drop-down content. In this demo, the content is the TreeView and the DataGrid in the single selection mode. +DropDownBox is an advanced editor whose drop-down window can include other components. + +DevExtreme ships with multiple other drop-down editors. To find out which editor best suits your task, review the following article: [How to Choose a Drop-Down Editor](/Documentation/Guide/UI_Components/Lookup/Choose_a_Drop-Down_Editor/). + +To get started with the DevExtreme DropDownBox component, refer to the following step-by-step tutorial: [Getting Started with DropDownBox](/Documentation/Guide/UI_Components/DropDownBox/Getting_Started_with_DropDownBox/). + The following instructions show how to synchronize the DropDownBox with any other embedded DevExtreme component: diff --git a/apps/demos/Demos/DropDownBox/SingleSelection/Vue/description.md b/apps/demos/Demos/DropDownBox/SingleSelection/Vue/description.md index 5f3afd92b8d8..6ead6e8718a1 100644 --- a/apps/demos/Demos/DropDownBox/SingleSelection/Vue/description.md +++ b/apps/demos/Demos/DropDownBox/SingleSelection/Vue/description.md @@ -1,4 +1,9 @@ -The DropDownBox component is an editor that consists of a text field and drop-down content. In this demo, the content is the TreeView and the DataGrid in the single selection mode. +DropDownBox is an advanced editor whose drop-down window can include other components. + +DevExtreme ships with multiple other drop-down editors. To find out which editor best suits your task, review the following article: [How to Choose a Drop-Down Editor](/Documentation/Guide/UI_Components/Lookup/Choose_a_Drop-Down_Editor/). + +To get started with the DevExtreme DropDownBox component, refer to the following step-by-step tutorial: [Getting Started with DropDownBox](/Documentation/Guide/UI_Components/DropDownBox/Getting_Started_with_DropDownBox/). + The following instructions show how to synchronize the DropDownBox with any other embedded DevExtreme component: From b78b156ddc1c1b2e862b003e030da646395f3e20 Mon Sep 17 00:00:00 2001 From: Ilya Vinogradov <48182348+williamvinogradov@users.noreply.github.com> Date: Thu, 20 Jun 2024 21:23:49 +0400 Subject: [PATCH 23/29] Fix demo tests (#27638) --- .../FileManager-BindingToFileSystem.png | Bin 57146 -> 56294 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/demos/testing/etalons/FileManager-BindingToFileSystem.png b/apps/demos/testing/etalons/FileManager-BindingToFileSystem.png index fac46fb244c10ae8379930dd36ba89e1ea1408f5..cf46d3a19439111e9f886f1cf308a7bafb2b6acb 100644 GIT binary patch delta 14548 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 D`n(Yl delta 15407 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 Ax&QzG From b551c2547f8830e0029ed4c6c355dff775247256 Mon Sep 17 00:00:00 2001 From: Alyar Date: Thu, 20 Jun 2024 23:31:03 +0300 Subject: [PATCH 24/29] TestCafe testing: Merge all pages for testing into one page (#27644) --- e2e/testcafe-devextreme/tests/container.html | 1 + .../tests/containerAspNet.html | 31 ------------------- .../tests/containerQuill.html | 31 ------------------- .../editing/T1154721_editingCellFocus.ts | 2 +- .../T1162057_oneGroupOnDifferentPages.ts | 2 +- .../tests/dataGrid/scrolling.ts | 2 +- e2e/testcafe-devextreme/tests/form/common.ts | 2 +- .../tests/form/form.buttonItem.ts | 2 +- .../tests/form/form.emptyItem.ts | 2 +- .../tests/form/form.groupItem.ts | 2 +- .../tests/form/form.labelMode.ts | 2 +- .../tests/form/form.simpleItem.colSpan.ts | 2 +- .../tests/form/form.simpleItem.labelMode.ts | 2 +- .../tests/form/form.simpleItem.ts | 2 +- .../tests/form/form.tabbedItem.ts | 2 +- .../tests/htmlEditor/common.ts | 2 +- .../dialogs/addImage/addImageFromDevice.ts | 2 +- .../dialogs/addImage/addImageUrl.ts | 2 +- .../htmlEditor/dialogs/addImage/common.ts | 2 +- .../tests/htmlEditor/format.ts | 2 +- .../tests/htmlEditor/list.ts | 2 +- .../pivotGrid/sort/localSort_T1150523.ts | 2 +- 22 files changed, 20 insertions(+), 81 deletions(-) delete mode 100644 e2e/testcafe-devextreme/tests/containerAspNet.html delete mode 100644 e2e/testcafe-devextreme/tests/containerQuill.html diff --git a/e2e/testcafe-devextreme/tests/container.html b/e2e/testcafe-devextreme/tests/container.html index 4efb4e886e8c..7ca423929c01 100644 --- a/e2e/testcafe-devextreme/tests/container.html +++ b/e2e/testcafe-devextreme/tests/container.html @@ -19,6 +19,7 @@ + diff --git a/e2e/testcafe-devextreme/tests/containerAspNet.html b/e2e/testcafe-devextreme/tests/containerAspNet.html deleted file mode 100644 index fdf72072d66d..000000000000 --- a/e2e/testcafe-devextreme/tests/containerAspNet.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - TestCafe Tests Container - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
- - diff --git a/e2e/testcafe-devextreme/tests/containerQuill.html b/e2e/testcafe-devextreme/tests/containerQuill.html deleted file mode 100644 index 011df68a8197..000000000000 --- a/e2e/testcafe-devextreme/tests/containerQuill.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - TestCafe Tests Container - - - - - - - - - - - - - - - - - - - -
-
-
-
-
-
- - diff --git a/e2e/testcafe-devextreme/tests/dataGrid/editing/T1154721_editingCellFocus.ts b/e2e/testcafe-devextreme/tests/dataGrid/editing/T1154721_editingCellFocus.ts index aca21034ac7f..50454f46bf48 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/editing/T1154721_editingCellFocus.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/editing/T1154721_editingCellFocus.ts @@ -4,7 +4,7 @@ import { createWidget } from '../../../helpers/createWidget'; import url from '../../../helpers/getPageUrl'; fixture`Editing - cell focus` - .page(url(__dirname, '../../containerAspNet.html')); + .page(url(__dirname, '../../container.html')); const apiRequestMock = RequestMock() .onRequestTo(/\/api\/data/) diff --git a/e2e/testcafe-devextreme/tests/dataGrid/grouping/T1162057_oneGroupOnDifferentPages.ts b/e2e/testcafe-devextreme/tests/dataGrid/grouping/T1162057_oneGroupOnDifferentPages.ts index 1bbcab7ba82a..be3b572205d3 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/grouping/T1162057_oneGroupOnDifferentPages.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/grouping/T1162057_oneGroupOnDifferentPages.ts @@ -6,7 +6,7 @@ import url from '../../../helpers/getPageUrl'; // import { safeSizeTest } from '../../../helpers/safeSizeTest'; fixture`Grouping Panel - One group on different pages` - .page(url(__dirname, '../../containerAspNet.html')); + .page(url(__dirname, '../../container.html')); const GRID_SELECTOR = '#container'; diff --git a/e2e/testcafe-devextreme/tests/dataGrid/scrolling.ts b/e2e/testcafe-devextreme/tests/dataGrid/scrolling.ts index 29f9bd18b16c..6cabf57d93a0 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/scrolling.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/scrolling.ts @@ -1139,7 +1139,7 @@ safeSizeTest('The page should not be changed when hiding/showing the grid view a })()); fixture`Remote Scrolling` - .page(url(__dirname, '../containerAspNet.html')); + .page(url(__dirname, '../container.html')); test.meta({ unstable: true })('Scroll to the bottom after expand several group', async (t) => { const dataGrid = new DataGrid('#container'); diff --git a/e2e/testcafe-devextreme/tests/form/common.ts b/e2e/testcafe-devextreme/tests/form/common.ts index e59301db356f..7393960332e3 100644 --- a/e2e/testcafe-devextreme/tests/form/common.ts +++ b/e2e/testcafe-devextreme/tests/form/common.ts @@ -9,7 +9,7 @@ import { appendElementTo, insertStylesheetRulesToPage, removeStylesheetRulesFrom const DATERANGEBOX_CLASS = 'dx-daterangebox'; fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); test('Color of the mark (T882067)', async (t) => { const { takeScreenshot, compareResults } = createScreenshotsComparer(t); diff --git a/e2e/testcafe-devextreme/tests/form/form.buttonItem.ts b/e2e/testcafe-devextreme/tests/form/form.buttonItem.ts index 15e276b42557..80016fec2f1b 100644 --- a/e2e/testcafe-devextreme/tests/form/form.buttonItem.ts +++ b/e2e/testcafe-devextreme/tests/form/form.buttonItem.ts @@ -4,7 +4,7 @@ import { createWidget } from '../../helpers/createWidget'; import { testScreenshot } from '../../helpers/themeUtils'; fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); const testName = 'ButtonItem'; test(testName, async (t) => { diff --git a/e2e/testcafe-devextreme/tests/form/form.emptyItem.ts b/e2e/testcafe-devextreme/tests/form/form.emptyItem.ts index 2581a75668dc..a1b7d34454b7 100644 --- a/e2e/testcafe-devextreme/tests/form/form.emptyItem.ts +++ b/e2e/testcafe-devextreme/tests/form/form.emptyItem.ts @@ -4,7 +4,7 @@ import { createWidget } from '../../helpers/createWidget'; import { testScreenshot } from '../../helpers/themeUtils'; fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); const testName = 'EmptyItem'; test(testName, async (t) => { diff --git a/e2e/testcafe-devextreme/tests/form/form.groupItem.ts b/e2e/testcafe-devextreme/tests/form/form.groupItem.ts index ca6aa60cdba6..59603573d34e 100644 --- a/e2e/testcafe-devextreme/tests/form/form.groupItem.ts +++ b/e2e/testcafe-devextreme/tests/form/form.groupItem.ts @@ -4,7 +4,7 @@ import { createWidget } from '../../helpers/createWidget'; import { testScreenshot } from '../../helpers/themeUtils'; fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); const testName = 'GroupItem'; diff --git a/e2e/testcafe-devextreme/tests/form/form.labelMode.ts b/e2e/testcafe-devextreme/tests/form/form.labelMode.ts index 817eb80ac44a..818b8d94fbd0 100644 --- a/e2e/testcafe-devextreme/tests/form/form.labelMode.ts +++ b/e2e/testcafe-devextreme/tests/form/form.labelMode.ts @@ -4,7 +4,7 @@ import { createWidget } from '../../helpers/createWidget'; import { isMaterialBased, testScreenshot } from '../../helpers/themeUtils'; fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); ['left', 'right', 'top'].forEach((formLabelLocation) => { ['outside', 'floating', 'hidden', 'static'].forEach((formLabelMode) => { diff --git a/e2e/testcafe-devextreme/tests/form/form.simpleItem.colSpan.ts b/e2e/testcafe-devextreme/tests/form/form.simpleItem.colSpan.ts index 90f535d58b42..c937f62a1915 100644 --- a/e2e/testcafe-devextreme/tests/form/form.simpleItem.colSpan.ts +++ b/e2e/testcafe-devextreme/tests/form/form.simpleItem.colSpan.ts @@ -6,7 +6,7 @@ import { createWidget } from '../../helpers/createWidget'; import { testScreenshot } from '../../helpers/themeUtils'; fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); const labelLocations = ['left', 'right', 'top']; diff --git a/e2e/testcafe-devextreme/tests/form/form.simpleItem.labelMode.ts b/e2e/testcafe-devextreme/tests/form/form.simpleItem.labelMode.ts index 2e657f274726..de90004b1c46 100644 --- a/e2e/testcafe-devextreme/tests/form/form.simpleItem.labelMode.ts +++ b/e2e/testcafe-devextreme/tests/form/form.simpleItem.labelMode.ts @@ -7,7 +7,7 @@ import { createWidget } from '../../helpers/createWidget'; const waitFont = ClientFunction(() => (window as any).DevExpress.ui.themes.waitWebFont('Item123somevalu*op ', 400)); fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); [false, true].forEach((rtlEnabled) => { ['outside', 'static', 'floating'].forEach((labelMode) => { diff --git a/e2e/testcafe-devextreme/tests/form/form.simpleItem.ts b/e2e/testcafe-devextreme/tests/form/form.simpleItem.ts index 55af539b5953..d3836a0774d7 100644 --- a/e2e/testcafe-devextreme/tests/form/form.simpleItem.ts +++ b/e2e/testcafe-devextreme/tests/form/form.simpleItem.ts @@ -7,7 +7,7 @@ import { testScreenshot } from '../../helpers/themeUtils'; const waitFont = ClientFunction(() => (window as any).DevExpress.ui.themes.waitWebFont('Item123somevalu*op ', 400)); fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); [false, true].forEach((rtlEnabled) => { ['left', 'right', 'top'].forEach((labelLocation) => { diff --git a/e2e/testcafe-devextreme/tests/form/form.tabbedItem.ts b/e2e/testcafe-devextreme/tests/form/form.tabbedItem.ts index d6d49bcbb5d0..f13e62654add 100644 --- a/e2e/testcafe-devextreme/tests/form/form.tabbedItem.ts +++ b/e2e/testcafe-devextreme/tests/form/form.tabbedItem.ts @@ -4,7 +4,7 @@ import { createWidget } from '../../helpers/createWidget'; import { testScreenshot } from '../../helpers/themeUtils'; fixture.disablePageReloads`Form` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); const testName = 'TabbedItem'; test(testName, async (t) => { diff --git a/e2e/testcafe-devextreme/tests/htmlEditor/common.ts b/e2e/testcafe-devextreme/tests/htmlEditor/common.ts index 9a181e7dfb49..52fdf95a1615 100644 --- a/e2e/testcafe-devextreme/tests/htmlEditor/common.ts +++ b/e2e/testcafe-devextreme/tests/htmlEditor/common.ts @@ -5,7 +5,7 @@ import url from '../../helpers/getPageUrl'; import { testScreenshot } from '../../helpers/themeUtils'; fixture.disablePageReloads`HtmlEditor` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); [false, true].forEach((toolbar) => { const selector = toolbar ? '#otherContainer' : '#container'; diff --git a/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageFromDevice.ts b/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageFromDevice.ts index a162cf0921ae..8ba8c9ed0880 100644 --- a/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageFromDevice.ts +++ b/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageFromDevice.ts @@ -8,7 +8,7 @@ const TEST_IMAGE_PATH_1 = './images/test-image-1.png'; const TEST_IMAGE_PATH_2 = './images/test-image-2.png'; fixture`HtmlEditor - upload image from device` - .page(url(__dirname, '../../../containerQuill.html')); + .page(url(__dirname, '../../../container.html')); test('Image from device should be inserted', async (t) => { const { takeScreenshot, compareResults } = createScreenshotsComparer(t); diff --git a/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageUrl.ts b/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageUrl.ts index 20a035e71ee7..b97ff2171a1d 100644 --- a/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageUrl.ts +++ b/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/addImageUrl.ts @@ -6,7 +6,7 @@ import { BASE64_IMAGE_1, BASE64_IMAGE_2 } from './images/base64'; import { isMaterial, testScreenshot } from '../../../../helpers/themeUtils'; fixture.disablePageReloads`HtmlEditor - add image url` - .page(url(__dirname, '../../../containerQuill.html')); + .page(url(__dirname, '../../../container.html')); const ADD_IMAGE_POPUP_CONTENT_SELECTOR = '.dx-htmleditor-add-image-popup .dx-overlay-content'; diff --git a/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/common.ts b/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/common.ts index f023bd712296..21584b01a561 100644 --- a/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/common.ts +++ b/e2e/testcafe-devextreme/tests/htmlEditor/dialogs/addImage/common.ts @@ -8,7 +8,7 @@ import { testScreenshot } from '../../../../helpers/themeUtils'; const TEST_IMAGE_PATH_1 = './images/test-image-1.png'; fixture.disablePageReloads`HtmlEditor - common` - .page(url(__dirname, '../../../containerQuill.html')); + .page(url(__dirname, '../../../container.html')); const ADD_IMAGE_POPUP_CONTENT_SELECTOR = '.dx-htmleditor-add-image-popup .dx-overlay-content'; diff --git a/e2e/testcafe-devextreme/tests/htmlEditor/format.ts b/e2e/testcafe-devextreme/tests/htmlEditor/format.ts index 7f2bf8e70495..3993fde1f76d 100644 --- a/e2e/testcafe-devextreme/tests/htmlEditor/format.ts +++ b/e2e/testcafe-devextreme/tests/htmlEditor/format.ts @@ -3,7 +3,7 @@ import url from '../../helpers/getPageUrl'; import { createWidget } from '../../helpers/createWidget'; fixture.disablePageReloads`HtmlEditor - formats` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); test('HtmlEditor should keep actual format after "enter" key pressed (T922236)', async (t) => { const selectBox = new SelectBox('.dx-font-format'); diff --git a/e2e/testcafe-devextreme/tests/htmlEditor/list.ts b/e2e/testcafe-devextreme/tests/htmlEditor/list.ts index 0cd5fdb9ee57..3a2ad546c762 100644 --- a/e2e/testcafe-devextreme/tests/htmlEditor/list.ts +++ b/e2e/testcafe-devextreme/tests/htmlEditor/list.ts @@ -25,7 +25,7 @@ const orderedListMarkup = ` `; fixture.disablePageReloads`HtmlEditor - lists` - .page(url(__dirname, '../containerQuill.html')); + .page(url(__dirname, '../container.html')); test('ordered list numbering sequence should reset for each list item (T1220554)', async (t) => { const { takeScreenshot, compareResults } = createScreenshotsComparer(t); diff --git a/e2e/testcafe-devextreme/tests/pivotGrid/sort/localSort_T1150523.ts b/e2e/testcafe-devextreme/tests/pivotGrid/sort/localSort_T1150523.ts index e536fe5c8d83..c14f60bac24d 100644 --- a/e2e/testcafe-devextreme/tests/pivotGrid/sort/localSort_T1150523.ts +++ b/e2e/testcafe-devextreme/tests/pivotGrid/sort/localSort_T1150523.ts @@ -7,7 +7,7 @@ import { isMaterial } from '../../../helpers/themeUtils'; const testFixture = () => (isMaterial() ? fixture.skip : fixture); testFixture()`pivotGrid_sort` - .page(url(__dirname, '../../containerAspNet.html')); + .page(url(__dirname, '../../container.html')); const requestLogger = RequestLogger(/\/api\/data/); const apiRequestMock = RequestMock() From 39cc654244a4c82da6ed3712d6e57a10ec755895 Mon Sep 17 00:00:00 2001 From: Roch Nicolas <89575880+tomodasheesh@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:00:42 +0800 Subject: [PATCH 25/29] Fix React Drawer Component 24_2 (#27634) Co-authored-by: Rochmar Nicolas (DevExpress) --- .../src/core/__tests__/component.test.tsx | 27 +++++++++++++++++++ .../src/core/__tests__/test-component.tsx | 16 +++++++++++ .../src/core/component-base.tsx | 2 +- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/packages/devextreme-react/src/core/__tests__/component.test.tsx b/packages/devextreme-react/src/core/__tests__/component.test.tsx index 81b8a0c4ad7b..089270491d90 100644 --- a/packages/devextreme-react/src/core/__tests__/component.test.tsx +++ b/packages/devextreme-react/src/core/__tests__/component.test.tsx @@ -6,7 +6,9 @@ import * as ReactDOM from 'react-dom'; import { fireOptionChange, TestComponent, + TestComponentRef, TestPortalComponent, + TestRestoreTreeComponent, Widget, WidgetClass, } from './test-component'; @@ -147,6 +149,31 @@ describe('rendering', () => { expect(didRenderToDetachedBranch).toBeFalsy(); }); + + it('does not restore the parent tree if its child elements are still attached', () => { + testingLib.configure({ reactStrictMode: true }); + + const TreeComponentRef = React.createRef<{ restoreTree?: () => void }>(); + const ParentComponentRef = React.createRef(); + + const component = ( + + Span Element + + + ); + + testingLib.render(component); + + const element = ParentComponentRef.current!.instance().element()!; + const appendFn = jest.spyOn(element, 'append'); + + testingLib.act(() => { + TreeComponentRef.current?.restoreTree?.(); + }); + + expect(appendFn).toHaveBeenCalledTimes(0); + }); }); it('renders portal component without children correctly', () => { diff --git a/packages/devextreme-react/src/core/__tests__/test-component.tsx b/packages/devextreme-react/src/core/__tests__/test-component.tsx index 03ef7856cf6d..b5b63ca4a8a5 100644 --- a/packages/devextreme-react/src/core/__tests__/test-component.tsx +++ b/packages/devextreme-react/src/core/__tests__/test-component.tsx @@ -6,11 +6,14 @@ import { memo, useImperativeHandle, useCallback, + useContext, useRef, forwardRef, ReactElement, } from 'react'; +import { RestoreTreeContext } from '../helpers'; + const eventHandlers: { [index: string]: ((e?: any) => void)[] } = {}; const Widget = { @@ -97,6 +100,18 @@ const TestPortalComponent = memo(forwardRef(function Test ); })) as

(props: P, ref: React.ForwardedRef) => ReactElement | null; +const TestRestoreTreeComponent = forwardRef((_, ref: React.ForwardedRef<{ restoreTree?: () => void }>) => { + const restoreParentLink = useContext(RestoreTreeContext); + + useImperativeHandle(ref, () => { + return { + restoreTree: restoreParentLink + }; + }, [restoreParentLink]); + + return

Context Component
; +}); + function fireOptionChange(fullName: string, value: unknown): void { eventHandlers.optionChanged?.forEach((e) => e({ name: fullName.split('.')[0], @@ -108,6 +123,7 @@ function fireOptionChange(fullName: string, value: unknown): void { export { TestComponent, TestPortalComponent, + TestRestoreTreeComponent, TestComponentRef, Widget, WidgetClass, diff --git a/packages/devextreme-react/src/core/component-base.tsx b/packages/devextreme-react/src/core/component-base.tsx index 99cb8fded199..dc221bed1a29 100644 --- a/packages/devextreme-react/src/core/component-base.tsx +++ b/packages/devextreme-react/src/core/component-base.tsx @@ -86,7 +86,7 @@ const ComponentBase = forwardRef( const prevPropsRef = useRef

(); const restoreTree = useCallback(() => { - if (childNodes.current?.length && element.current) { + if (childElementsDetached.current && childNodes.current?.length && element.current) { element.current.append(...childNodes.current); childElementsDetached.current = false; } From 293a37db1f41e12ddd1cee9a853b0173cec606c8 Mon Sep 17 00:00:00 2001 From: Alyar Date: Fri, 21 Jun 2024 10:38:20 +0300 Subject: [PATCH 26/29] DataGrid - Dragged column from the column chooser is frozen when the Esc key is pressed (T1219785) (#27633) Co-authored-by: Alyar <> --- .../tests/dataGrid/columnChooser.ts | 48 ++++++++++++++++++ .../etalons/T1219785-column-chooser-1.png | Bin 0 -> 25022 bytes .../etalons/T1219785-column-chooser-2.png | Bin 0 -> 23441 bytes .../etalons/T1219785-column-chooser-3.png | Bin 0 -> 26316 bytes .../column_chooser/m_column_chooser.ts | 1 - .../testcafe-models/dataGrid/columnChooser.ts | 22 +++++++- packages/testcafe-models/dataGrid/index.ts | 18 +++++++ 7 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 e2e/testcafe-devextreme/tests/dataGrid/etalons/T1219785-column-chooser-1.png create mode 100644 e2e/testcafe-devextreme/tests/dataGrid/etalons/T1219785-column-chooser-2.png create mode 100644 e2e/testcafe-devextreme/tests/dataGrid/etalons/T1219785-column-chooser-3.png diff --git a/e2e/testcafe-devextreme/tests/dataGrid/columnChooser.ts b/e2e/testcafe-devextreme/tests/dataGrid/columnChooser.ts index 67a974f3f8a7..97a262475621 100644 --- a/e2e/testcafe-devextreme/tests/dataGrid/columnChooser.ts +++ b/e2e/testcafe-devextreme/tests/dataGrid/columnChooser.ts @@ -136,3 +136,51 @@ test('Column chooser should support string height and width', async (t) => { width: '330px', }, })); + +// T1219785 +test('Check the behavior of pressing the Esc button when dragging a column from the column chooser', async (t) => { + // arrange + const dataGrid = new DataGrid('#container'); + const { takeScreenshot, compareResults } = createScreenshotsComparer(t); + + await t + .click(dataGrid.getColumnChooserButton()); + + await takeScreenshot('T1219785-column-chooser-1.png', dataGrid.element); + + await dataGrid.getColumnChooser().focusList(); + await dataGrid.moveColumnChooserColumn(0, -25, -25, true); + await dataGrid.moveColumnChooserColumn(0, -50, -50); + + await takeScreenshot('T1219785-column-chooser-2.png', dataGrid.element); + + // act + await t.pressKey('esc'); + await dataGrid.moveColumnChooserColumn(0, -75, -75); + + await takeScreenshot('T1219785-column-chooser-3.png', dataGrid.element); + + // assert + await t + .expect(compareResults.isValid()) + .ok(compareResults.errorMessages()); +}).before(async () => createWidget('dxDataGrid', { + dataSource: getData(20, 3), + height: 400, + showBorders: true, + columns: [{ + dataField: 'field_0', + dataType: 'string', + }, { + dataField: 'field_1', + dataType: 'string', + }, { + dataField: 'field_2', + dataType: 'string', + visible: false, + }], + columnChooser: { + enabled: true, + mode: 'dragAndDrop', + }, +})); diff --git a/e2e/testcafe-devextreme/tests/dataGrid/etalons/T1219785-column-chooser-1.png b/e2e/testcafe-devextreme/tests/dataGrid/etalons/T1219785-column-chooser-1.png new file mode 100644 index 0000000000000000000000000000000000000000..71ba916219bf472fdd193801479077e3cc3c2013 GIT binary patch literal 25022 zcmd6P2UwKn*6kP*jg=UCgIJL!77#@ND@Kvtq{jlnAfU*gj1-Nr5=BKpK#Cw`Kp3S6 z49(aDkv0R0QdAHaL=+k6aMvC@$;tV1&Yzrf&vP%2F$go?eBWF4UVE*z-;;Ve8^?^C zHj=?$jM?=4dIJXI%LoQz$l0%l;U_`Ur`%*Pmey`szsBgmkhi~#+A8?!$AN*OuD1Hw zGY+qlUQ?o!J$CyF52ZwTgYWiDW!VKO&wsnUaP!sZ(~*veL3fnSMEl!o2AD*x2;R-x z94IsXrfA7jL)rB!*iVe!e6{AAy4kMpdq1rjINtEGHR^ErtR2CB* zYjJOGZz_xDaP)WVh^q9@%geiFlAyZ(oqU;+E!{D`W}bT9V&dSyQDq6QK79E7S6_Y^ zrxvPq&_r2TSyn;8c<0WmqlbuJ7_n}JS9dDC?8J$$>18?iYr*WK zG29m5oyq2j-B*tO^i$l;nN*D;QEs z25+3vdG_<^l0Mq9VW-CXqRUC0c+ zz1CvFq)GAf@G7lspWo9tY3%WJHAjEF%`Jmt#Hfk9eqB#t#f-65BY(ZkH+z=1JIxq- zJa^Q(!RsB8`1M|+Z{J?)HU0RVSzLURCVrq_FLnFnp2n>Ic{5*(95qVh_1n*Xy@%f( z?AM|C^#i944$kW1uUcEVDZ7e<$K5}@HS6l>Dfm1KsuL0f@xj5<`ihy3juXHAcJ}AD zHtJ!yT!ZJT&3`(czq`HM;TAV{mjo+2@+W=%#%-~gnOSAlel9*& zH6DX#YiB3y{P3Eo?d6rTWa&~?Z|7dChhb_5+aE72!iUsuwu>JV=J96g#ful4JSX{X z@aeoG<+{Inv7)}do|BQWb=Q;2C21Ab2{yg2CSy5_XE1JE+}>K9W1j9D zy0Grd%6G*r=`~3*hB351TdrVDhN!rdE2O`OT)g8xJ}4q5h#B?VCC_Tz@v+8Q_#kWd zEUT86MJ@$HagBMhnKrry3j@dUd>oOOA1aBa>MgpkR@@zttLRQEu^Keca3Bl!G14r=>KkD=hb&&Yr*JQbcSR zd-DT7DN`e(3mD0yxwzTM1~xWa>2Oa2KebPnA|oUDPoKtRXRo?=;X+(ek`BGoyQ{!P z7LVW1(^jA;dK2Oztb61ye3lZ+?s%8zQkH0;()T>CFT~or%N9@9tGC6gNLE(1U6{a? zoi}eog^f>6etv!`Qy}}*@Zkk7_ryi#^^3UOZ&Qle-`|mtTeZs4BHh{8$tiK+)%f_$ zhEMAgRa&N(6zx~t;RUPbC%b>lZ|+}Iqe(Z?BmM-RJ9^XDm7 z5HCWxadF?Pyx4Pu=hhU7pjze85X!`e9_0%JkK~pw->QJyNk9n3plN7oYioBuuj!BZ z>8CG`9y^w=q&;umJPwa%zA#Wr!Am4CMV2Uu(~sI29Fvs!X4;r(O5fvcrmBWc?Vp~z zG-ExPXzAV6NTl8A;DNAGPv2phYvH|aUadM4i81N z$~ccDdT!3fd<^}(G9{Ke!pWE!%k?^{4|2_4yJxX-5oD~s|Ni?E*?8s&6DC}>!*Grq zF=8BThPz7IYHbhasM;Jjkg-bAFE}VhhC6ksU7TY@lBx|hUvOrXvzh#)v^w{!uW+N$ zO9h&tEBDi!neRw{&U#)>IZNC@zi|HDb&dV|)9! z-2QIIXD#j?#-^qT$;k$^>cs04ix@-2JBuB!-25Ul<%^+1S#O^%X0=or7s|@X*`_?> z8{q8-p?qBJ)~(eZq09HK6%Y5inw06z8EXUrL1nI2*0kxpi^XmT-Cu`z?mKny_MfV~I;_001%il)xaN!{&DQ46hj6jUBCJKw*o zyy+C8b9wm{q{WuXG%cUr*HWxEkEf>b6HFDc^_sEu_13LBV!1GI?2P3Rz79;LfwA$$ z`1p8?5Iu5yylkktmpSgSwaGvI|V-*{}gb1{~WTP}qa#4q;C zqm!|g&YwTuE~>C8c>SSqt#e+VyP%@N5lde6;HPV}4^NJlMngw|ii85K^eXod1Vqj#83hHwz9O|) zI~(t=X!=P)5^pmy+$08L^}!p7IDxR_LBn1N|Gk(bu!gsZ!jwO9Vc|qNa=bYPRm-FHNbP6iTDJi0g zynbV+8*CA?r8>uA)Z~Ty$}~sYG;`&HpLWy77$ul;%imRHrR{mSHqk1}#3aEO6K!Hq z7^0#ZvdqcA%`FvAo;qVo%WK1>JoV;mJY%$W?T^XH z$!-8ZR`DG*J~rdVjbqmy9zJ2>#AplW%nh&apDqh=$>rR9SXd~yAY(XT^5j^2s^go- zL9z=MmS0(S9FI|K?f&-Zl@Mp%CXq8jEM8ZOHTPOLeW^{A~9!JZ0zkD<*U2 z&yU9xDNLL&!T#~3#cc;xAq@v4<@K|jp5N5w=6ni9(ofrVXP8yIVs7W!p~J@-Y0+Ps zHk~xz_v-ElV?+e=g)tO3#SIYymMS`(IUMp_ZEYcnJe8FAdMsc zi+2^P*@VW6V$S`ar$#+X*_CkPhJN6yyC=uT$HnRG-hD0j=<(xns;cJ58cbh=b3{}O zw#`!hsk?XAuL#xg`dFya=9+2QjRbn(?Ah;p??tkj%N_DB$c!94+6YraNeg#k6>k`; zBcr5bq;T};(I!5}kg1J8lYRU4ZN345wN9uicFCbn+k<0Xy?$-1rx#%dbieug@6S2} zZ`RQ%zkhnVAZ3>>A_B9w^8@ORa^wg%846SrCrye8z#}7Q%iwt}H*HCqEi1cu@7}$# z3l`{^n+M-?sY#l(?$|@;^nwI{C|XSz65A=q5QyDgpH>m})P6Y7ZgpUlBvJ#7SS%h* zt-tfNYZgsw>66fv7ehl86w{w4PLwmTuSl{|-S_5a`ANRn)22;p_j-R|Rq|GOaq7Cn zJc2Zf>06+npiTF`Y16sDvL^mDvlONM?<`NxTxk;H!2Iy)o+`UNZsEm3J3}C9^Z0Am zF5p|o-OEC+SNVhmVy}oV9=yleMMC1B2PIWgPt| z%|{7Wudcsx<;pY_=gV8lE>!Fa_lhYPH+_1-t5@68QeA4)X~`-Ba^cU04I7vyCMGdE z9-NU`xKM{~>yeW7y$27P??`AEVf!Q8@4T_KE)8#+CoL_98?wgRc{Bdm+fBb+=k(3g zshp=zw0U!;M~FDPJfzWw%FO3Vs2xt2hL z6+Nwa-1Hi6i@e@?MZqK)85znTcs#ex_uFi3Z5yezU! zA&=D@6B#)h1J>lLn5&1Ji4w-lENG$e=FO)}u5G=7U(Qtb+zJRkP1P-qEfPkTXH+>~ z3Q79hlXua5`YOExw<-@Pm?CO6j_@u(CzH7?hyCqDs55ox*N z)jeM^4&^l`l_ADPiJB{#%XBpahlUJoe|cPrQk=0Pu!8c=hu=6=rfyoXVuk9S+Cwoq zq4Ce1v$UP|BE2VMXIsjdCh=(>L~WEP4A-y;Rb_pPbke~A1i@OVnU6)EV3K%Vz!ao9 zl=0=~&)1x;;>=IBEpV&7HKZ_1%_1!=js4-?WY(QAD)tReLZ<;%yn6MDAKc8%vqpts zp6MFB%=tx}q#E14zqd=s=lGlN10?Ee&g)MoPqc`A{lJelP;+^r;hHsv-|?EM_eH0*y%YDOy;$jInxY93p7pP7b%(Vgrc6vR$!;$PZ@sLY)WIr%aA%MuWvho?^VAwG`*B)k*i;&wUsPnOt$li! zgygl%eGT!*!U#Z(aafe1I)7au(H=Gf-KIe?9IYD&@(Sju-{ZRZ52>s^q&S85qU6QkAv8;&ISY%F;+lBd9`s`}D>-l`1!X3U=2}#LUtBxfp3!z~^6m`*t^l zP?Z|b6azy;(T4|8&8~bt-yY*JO~X5T;l}?Uqn;7xHjWnS|7IQ~1TMsrFEm9O+ENBG z(^n;ii zQ0HL78zH;mX`O0vt=1hIeXhzm&~)$K8zx-qM8x5OMWa!KG~J)>!oPUy^@oSsZxC;w zHgEoXA;vopq@kgqKjCdmh6k#t#H}~h0$G#>E!{;K05!vRc*-;RM$_lcolAhz!NGwR zD}rk_9@?%jI2sFEAnZR+eUk~u+Qp6ecKmq2psPR}04JxXDQ~t0 zav3>hj38t0Yt$v#>OF6lrm19AEzGJ)qBI~UCs%f3#{+;pabUqqfImbC%d#38Hk&qW zLTYcTOm_)C@9#fx>QosnvLi()x0uTBkmYXNxM7~W^W-rJsif=I7kN;nhtUHZI`#9< ze1z4crMsShpRf$XwrvIv(Z<}p+sMi)bhDNgAhk5^q5SIAtM>O!O(YrtAVvhDf%y;F zi`Y`Qw{H zW?^4P4HvXxVbIcz0Ls&r>^$+NC|nUML+ZynFZHmXK}c`ku|x2-WTTXzx9cP8xl=mF zXP}?m_DFi-v}y4x_Pwzu3_l^Suf;{AG4N4?`6(s5Z;SP)N%F-{Z|o2`{gaRW;?O5I z5M~~$B=HA1U#E~B&+-}ITJY3kvwZK(#-BTj_~-96xv@XjUN`q*!cLwX$EeNva9|aP z&&w!A+u!9zu@BblU7^d5Prj+o@V4ANt6x|)Z~efM<(oHEu>8Zr!$;r2u02;!e}0fL zt_*tcS|8ivg>(9(daqd;cXT_d$~SstxtAN4uO8C5cZFG5M4r^j#EuRrK|eR4{pr(w zYyxj@@3tj^u^9LZ=gwX6y533XdTB?r2`8`8MdyT_)7 z<+VTIes5|P5g~(>X2eVkH^MvQ-s3j>I+Ka>{!T$)A{rLVtJDYhUKAhiC1 z(jlks)APz~j}&am1t=8a;ucWw0r{CuC5{P7?PA(iyNV>OIA^3Zl1!~VHmuzL&d9?f zlU~5J(dZMJ=9QipH;4cBq;yy@ViJ*%S6;JQb2=apOaOcCVyLfA1Ry5;QN`arn-Y0z z_Qx{_d>7B3CqB^Y)3aS{)HSJ2&zB`yW*Pv5&-{hp{c$Ppt+Qs$3SPc9GAZYidFUz+ z1D708K#X=s3>Yps)GVD1?}0`g-o41ge$dy^IWv3qY`0kmIGc5K1F_Cc4GhkEK0+SD z*UX2YaND1(Y_-SByYDG_U$Fxu&+4zY>EA$XovW*B``z)njSrq+4Iy__2uy7fsa!!3 zSV;8lwQKT(=c6=F8>Bl|{dA@X!bhbe_hLc40h`UU_WZB`FJIC7!>G_!yi<^WQBDA2OB{{}krZhRSb~&8DHy!WDR|h}8F8aB z>jNw($7%;FZ7THcd0ry~?`WRoo|ugRWDWFn6x6%QAoPParPxP|0t$*I;C16Yd#;z3 zm5Ib*Xy2R1=PI;Ss;-*actIAiC4$+mC@gW!kzq}1i6U^x?b0M}1bp8U6|Zi$DprM+ znD#_jNY^h2P$;9+hoV-ktIq$_>C+c0P=2Rvzc(@mqlfDIEZFqW{nZ>mrH4w|9wg4m znOrMA*qRedm0gQF@xH-JY)?`3MiiNImFmnDuItyVS;KpIY`W6EH(NGnYUUF|Nwl9R zJ+DtYRwvY;Cf7?D)IP*252Q$n>RJKvB`6b+Jf!=YbbY?fwOYUaCmR3g*jO44H8m^L zB%e!5Bh1YpZFRxlKMI0QSMV$;RNBRjB~gHkhi-1t))pKaGyO|O#wu*q?w*=~r0Fi% z`jeObaEk$)`=~jAn`?k1LhLn-9yhz~6bNKd@j3|(Dy+Z)C2eAPi0K1q9^+6J;{fWC zU3YGyTa8zTL(iucA_Q(99c64~rJz`*lm-<6Ftr(Uqqr^vF|8)z8}crpL^i_g-#Ip> z>?q>_2BJMazLAlZ-iY5LUm2zx9W|MWDIs?j}eXB^$_&$K3a31T5Gsn9~&I;1ejvM9KThO0J@I~YHDn( zsh+#K$zRE(des#tY&05A)KHidj5|#m=v3NwWlcuVcto#!6-n1<`Gr4mClZ5st|#_H zATWcn^NZzu-4%HO_qOXhBKHI=w2JTT^#o$Je_#7c@XGy380y)C%HmL=K700z@EG`2 z?>7JNMwPs-)7_t15^h%VSP7F9%&+qKMz%Ylx_ZAw8mcEAi3l-T{FCIjepjYckGqNn z%Yk&$ba=RAalNo6FHiH#3>ogqcNy#Q2Kri+?Tf#&+F!+LswQKq0#?A0yUIQ zS&X(nM)HRrBD{elKwr?CiEKoqtrG!;i0J@?JV>_Lc26#I{M5U@Cz)%!?ka)}iqL`g zzP>*qa6Tph^jjoiLA{$QEn7-RO>XfJ#_}IMItMD};9|F<%U$bENFIE<`1Fhw22_V% zUa>FLy~Vt*!)GA9ayz)}%AAAglNMUWr8!pQGt-#J>*5j)CDjVA-VYDVQ|-@L`}DCk ztY2>rZjMk%<@V}q59mq$kx|%cGfz7NGkqz<4IMTbG#PW!j2YJ;DhgYD2C{N}@m+k7 zfO*lBYn{WF2j^#v-N-Bld4NsGF+*I+29v>>g&h#%AT(%y`^@m=%a_baQ1rMwp6bk1 z2lNmFY1+(b%&GD!NM>Pt zLXv@{<>hS9o%IkaK)}TXZJW}K_!5tx9T$yAIU?|ZT?*~OoP!<2uhzM#3bOXQ)YsKL zv`gWr1u^dtT>^r&@yc;YgOvJ$zywH|+}!SXTvYU8Ur`fcH_?oqp4pI9Cw}uygw|dN zE>(LU%ek`j-5km|<#lh~Fw3u*;qCrZcV4`7DGu9_qZ_V{vA364 z>Hby^5KFzYb|^_e)>u!d%!<#?(^A^~bdlOX??-k=)qb$p(T+)(nj}FU8#^;ziv`#M zaYG9$H8dM^x6-!TUxH}eQc_aF)J9E8JDip$iZDy;1z;{!&(7ILbQ+aQMNYr&n-hWRbSM78J3aT_5Umm$WtXVvuSP(B0^O{E|RZ0KoK5Sy7KHk(?p zE}Fx|al7Ne_8X1Ie~6!W^5jW^qw6HpuG(SY5Tp6vbqNug?r*o!h!DdC7Vz4b>C5cF z6!0csDd3L+!h{3D53>;a+6cG>RG;!F2?rgK$%ppCZ~WHs|V?;OgoMESLKbW}tiz$OtG06&q;CNMVTD3q3#e#w}r4Q;Ty zqm>I;SUYT$*^nVaRBMn(CSY}t_zd*`8$lHb{`6b-tc7>+oSqok?pZJP+!huxs{dXX&5s(MYtx89UJC>@sE$j4?WBhO*}*`&rQJ^ z()Os%IY^mYJ6zq$C9m%$ik&aM_=2KTXwjn4FMIR{F%2TU=v|eC_3^PY3Go0h?Sw>V zJvwbR6mgwc!y3#m`1G{I+VxmwNbK~-KIRjS^-8P@Ekd7(v3Zo>U}J)!Eo@7H_F1#VuM=R-awc6;L$RN*Z(c{bMg71frK?8aH3LpMw7hVc;+Sde%y#~g${Vu6Xm zh1kk!D&5fe4rJxUu&{;Tz%fU1h&@0y!m6xvl#>YPq`H3E9zPN54KadPPOPa^uO9a? zQ;t0uZY<9_q& zQKQPhq)kQ}XAC>j?Xg3YrJ+&Ckt7GIENUoyMpS;|J*_ozwulR&InBa$H`GEMaLXW?^zqdrkK zn0oAru6oycup2^1{UBoHxqyS_8_&!ri8oG|0C5BS2T3HZGgaNbhxjFcs73|GD8~B% zk5?z9=_2)S-Uy%V3cm5ZQ1UPV5fzN*CK_v~#Ht7}wd*gfYl1ya00qB#1TR2$GuISr z4BSd@Z*S`EXG=&z&VT&a2DU0MA@;B$TbbM&CFYNTBRm09I%il1Pu&fCV!P$|IDAWb7W`05`+~^5)lSzUc{XYOm`6J;!`bQy^ zzo_sW0ra|;Ay25*JUlnY7|uhx{{DU{JYsailYBoQwZXfojFQpnghMd9^W|}>Mw+*y zKuE>bw%Xz+sRqB|0?S}90fSZX0)#Ov)CS)ZC-g9&FJ zMoQgs+qP|O!pgJ+GUdP@hm{J~lNG#W`bee=jll&k+x;}+qMT_w$_1?NHjq?eVBima z0Sai`Mn6da^9syD0#I8#!YmE23!nn~P0%jzn~Bj{f$?V8Kt`Zq!v}gBR1dt5Ky0!N zjsY#n&-3xII<>)fk^|^*(%7&y1@Z_SSoht_z!xEmU!ZIPeb&g_97L=Js@);r4r2-Q zqj1G4X`}&Z$99MZB*gTzDH}RrQm@|go$UC_k6$t2z9bk%2mqHQ$^!%>_vfES7hYPt zj#8ZkY3fM)JXG5P1DHjs54;|e_J-^&fCdo#qhRBqun*1?13EG|c>NC*J6u=wCsp?pE`mb& zo3}Qmat)*dU{SZlxM2?u58fs0c?xZlm!kNOzIv5t{iuhJAM=s^-4-K0k^Z?5Z1no6 zQ>XH#0N~)x38GClZ21nZ0)$YWB`h7JIcoT0_L^Lg_{pz;G-o>U-=)w-izzh5-y41Z z^Gk`{x`)Qzu6G@As~*ep9QP7dC?0qy{xR;57Hpw)T7#72@1?vyCNdbs=PvPn+>Q03 znAe+3xgTj0j>^WGfxa5>_^~7qD_HT2!0nKo4uL`$az6nMeCW&)#FJF)Ju+Znb)#A< zrUEv+w@#Xw@Oya=FZcYVc;a?&G{Gt^Ve_?vuR`rI1lv>spmF8&bd`7oigs8xjtJhw zTOq*%7AsJBFC^j+u1sXaC{&e*xtsk~wVeR;_^CVSo3;I5vta{%&yX zl&3+>!~L?$@vgDuK%iV#o3Gr|TIKLn(KPw%P{5Gg52C$8B0>L(1^1ehS~ zC}W;EV}ebDN2n}#|MJd66l6dzoM&fduABh3BSIe&+!666)(2jGMJ3vf`#+aJITgT^ zss+ApKL-wgHiEaLjSLw&EDrGIcP<(MxoBwR5Y*@GZ>0o@`gSvh2UQ~3de^R9OO;Dw zqy6bAi;4N=S(2w0d}JapZQmP}JbhHZ=FkY|aUnsaO^}pK!e$mrsh46not+2BP1N34 z(nhS$uee{+PcjiinFsl8iHd}qhAe?rXMiGzBZDxgKbYC^_(^kP%*Vkcm65Uhv$y4W zx=Y2`S?hMDKd&e47Nl!4MhG?)*b{khcCk<$OD59mCr_4JxzYl;cf|^`z&rnzpcqjg zx;;uU4lu^2|6}+?h$KWCBC2EJGYtNk=f)J;2zh8|Z34uw!AxDeeEFKoj+AG00RJ)w zdv-vV;5u<}dtIy+e~=cC)Q#Xfh7rgSC2bqKyD64c_i$XIdD`Z4=gv`|1?C{v7sd(7 zjXXFbCScnjI1Cs=>!lH#aIEq>R04pwAg0d25(Lj=ow0#IBybCMwGOQE&B&)^^#}U9 z8VJIt!QrV0GgbN17I$Pn+!F_wAqZxIBTM>wWjRYRF}Q;q?qL8XO|v1i_5{xIA-Q9DF$cy{gqNO_b1`Jb9PK*58N zfMC!0n}Es0gA);eY(@5UF++vr>73QFEN#O-bI!~oup9uAh2j-Po>E(ia}|#R12g%O zk-jg4gvgaC!DSnxwJrTQEV7g<`}$gaDzGFeYJ%zLYme11CT0^r;d7e-R8}I35fQ#% z^e!T=H4uHA!sl-qx5Ma1?(!j~BmXKasPg<+NGc>jJwm~Q8M!oXpeHXu;a%Qpw@Kp}(QP?_QQ zB4aNbQ4`%7@qlAYRAoZn$u^$)m|{U*Z$VxossW0ERM3mV>?X*@k{)&ASSwMTySG$E zV+NQgu)bh;c99wYvO}0M`cAQ~Pq!g48~AEVKXYa*Nng+_ih&rFVEdr53Pys-wTha! zpbBhA*Z_^8a1ukn`I=F@-V%x*sw&v(Do%` zN(NYSqQyw8xwL2v7(UvE)YO4MVAb4_H;|*=-?^i&aifL-Omry61*N5t%^t|>Zi(=H zn*~IJeEs_UWUaniut3(kHff>&1N^IP-Gpkv`2wn@g8FY!=_HZA55^NXhbrpFqb>l= zk042wKk}DXkXV7DwafEkNR1IJaO|j@94oNDJV4h8Q>HAqWg{;}bBDY?eC{16PeYFe zb-6T}69?Ph+n^zb4u}feWZ5ow5oFO%QAK&4JdJ9ZZcXRg+S=OFxL(>z?H+$qs~aGm ztkroL0O<&4v5t6{BCw!*jsDjfLLdc0UF2}}gp?FRpF(Ij#7o%215eIkhEK|%V%vQW z`;=V1Ve3&hK;`0!+U@5wP_5g=_QKv%l6@e z%}zh84nj{0snqbqvE1F`!4CphllS!+%n;3RCGhsV{L$RPLWD|i0ai%`u(~8gchWlG z>8DkOy^8ma#B7Kk?T6Jjp6zCX$t2UtK!58%Ie|w|B~+$_i*5~-h{MMa?36Ds0AJVN z7MS<2StLwRRaJF^RjKO&T87L)5WrlR^=0P~L|lB;?gxhNc6{?BG{N!o)TNrxK>S1= z^iSsi+a{P>%G1bkS2P~h5ER`*`U(dnT}JK381V(rII;xcg}yq^4VoJmxBLbrXVfY? zKexlZpYyp7?2uFt@+E!sKKxUc8eAxQ#$)Gyd+6}J^HQi}$%#zHM_i>i1q>{)Siu@T zxeSKaWRRUtp6Gz_w#s1}BY-f}!?#UAT^e93gMsef>A;{JO0XK_1+oH11?z%5i$Jr= zDk_d}G@IYt9RyvH2%L~AFpT7DC%Yw;J}!WUvZ$irBt?!H&*-(;WflO26lxLnIHQ+! zY#TIKc%OZel^6uNN+9ZqXr1PyL1mw*#x`;+zow7vM;QoW6`?^qhe}F7z$8+ijtm=P zU~>&#DP%!IGOX9yZ3~Ve<+gd^q3Xq>*Y(?RhQr&U2ZTnVkTa+~a;1`#47FFxnWFm! zIw@%u1jxVos!7u_W6v6B7R4~oPzJ3g!!wjs)cW-wL6V?{rV(5M1$o>{_Z@KU7ZHIV zzmNx9T|q$s3Aq$ZAUV`&D4?wxBGSIgcs-VExgS1!;OP_EBv!Dd|5Liq7h)L`#3hMS z^axXqd5*sG&7s40j3gkNfvQddqd>6RBgYylqW$fkMi6Uj?IkisAaMZ4#nT7jO14hm zMS;a+MQh@UK*aL^KPdK~K*GKD*?w-DB3#;nmrh%C;5v+1Vy$=5Bw>A^O*u$qV(}op zbFlqYUV;CPq9ztt+eF47?d1zlsvgP<5*~)*2$=}zO&S?NmIOx-21qaPU+@V?*Vg_3 zPoo@oLVUUks>UWopDtg>oe{bAyLVqGqG}`&;2NC`o9O25CCkGPmtXJ7u>e^@-e;M2Bn0pb=xZgd`t@4RzCn zW44KzfNK)OB-6=BfPf`1O-xMeepcii1J@mO#T3+v*f6lutonm1ZmTb-|8M~9U(q1U zh*wYt0ZkJ}!&hCs@Xn&TeTZ!$fg?9(J}j6nUd5{Riq(T8Vl)J4bu5+}`N-@X)Z;}}Oz(lPpKhig!mohM2_w>cP-;E)he(LisJ zupHh~Y&i^CjRE9A-0ZNCS~>8q%YX+!q0Pi%B_7L@e1OQfAl8Wjq{cx(b#)TdRFMEm zB+ZXARk~yfAS4E8DLjc|bloX%Iiq$z<=fYMxWnJf~ZzRfl+-8+dO|fNF%aBsE3AzVm%py-GUee zKhZ2~4@LiIYvPbG$HX?Xe8Ccve_cB4z*@wtQbZQ?J|tpKseOFBl$JG{8XYS@br~Z# z(sWKIc>`lb@f3IB&{p>dz6mrL-Ktp&0T_7?s2-J~zzK~H_)R%^1EHihWj2Hvg1aWW z0udYORO+Ixc7#fR&4y`@mqySa;|IS5-LoW?z-PdLSWLZR1v`yQOxQaHyQiv=M~K5i zs%Q|g1tld{5O?P_1jO$a$PdX_aZjNpw!?eL28cqxrL}19TK6oFW--l3!I<+>5iED) z@vra~3q(kJheF74hm62dYiepj4b{C05dw}@o+Ne=?4y7??f)CDV%%E&xAyUWKVSY| zOuc{ZQWq#A7hYaL3BEBD*_gBie6KQIYv_8&goJyGx?yJ6Pib0s5~45`s1eA3H*f4n z#2{AT`nEe%Yc8caq`ln2rOBLJJ=Go!Gesubwq1eXc>$C%78k~`^GNiNR|sT?%SZ+I zyNa~+>Zjmth?7UCUx59A4r_fAlK`~zETriv0csOHoa5IBmr*W{PA5pG77iE}DVN}O z`*;53w8~M$V#bms#5i3ak{L*23e^oH)F9YGY*V&-O#OT9$5H1Ho*h1Rh8|RBPjho~ z;-D!cAP|yM<5SCXD$mG~K>HCXOkf(QXj4vn5&-t}#Zb}7LOn>V9?~!qXDcWeVi159 zLdaQwJAiW(jLBPpXhKlG6zZA?9CW-Q@(l71_0b*I=v@QirUc$2WuJaeC{%fGU^+yl zO0q~gHWktwNsnkQqfjUTPmCdqJtXy*4L>>ei%Un-0 z>cd&tnjM83Lg}esoxPQs>|CzK#9(_yXk7Y>dDjaiJ()rrfEh^ZC%PVCL73OyoX7Xa z7 zAW$(7o?uhcKp?GD?>=@HtfEfU*=CRl^$#A*f`PaQ6)oSCP+XcxqIopO9e% zMt*`ss5oFV#kT}y^qfPms{7kZm6erB=r^LBs!nPrwlqpF5`(aR$?ae8L&`HZa%F?9 z#YP%>l0)ek$%lFX0H@#qpCtvSE9xhz_ycSoHN5uIC_jAwe${r=PMQ@YEduJYza2dI z0l7ZG0<02sGGjl97YXhiP=Ewd2% z^?mU3;lmHX)fnh1qK0Q|O)_i1#~DZdXWTw9hP!sfqEs{n(SQwvVB-1gi%E*smuG^% z4NFBDg~g9(C>EN%^LHWbQ`;G`G+DyPOKN`ohr_fhVYyljQlbKEbUUnd9BH!C!oEp` z10gGEoy*1ky6PN~VsjQl5yM_^KnE9X5;`mbfD%eDu>l3tlnzd~PZ{n9Pzsjp2Q^hSb5toyfCh6u z_i(ow0bCKMbSU>DI|tiXPfN@9{5~z?o6G>li_5P9TFVY<1Vuu7|E(f5(Abkzg)Cks z!t{ViZDPYMMnq!sCb7K|73;0S*@)vHUU*?J8-r@`lEm6ZX0q~wN{x7o)zD5Nfgp!XefQ8cRLi)j^5?mt8<`ma{ae=c?ZsRI1BOXd3^f&xHOncuDhDi__7 zwB|!jMh~e&LMBfm_~6y6523^(&!~NI#F~Gd@KdN^8lDeUf3F8sL`ADU{!D~JH8dt8 za858`;II)?;tZcf%7@?t={-)gNr6qj0aY!?u+&K^x)0kH?Ycy>6wN%uSwu6?9rNhk zj5lmJDmICbGllj9b((5+l za%Y9ZeM^Bpo%+ZpqS+Xoe+b;~rM1*3_yVM2^9TxYlueUcezQmx$qXD*IUM}tMUnzA zsD!JOm{QR_a8iU*sI9;Nx|n=HX?m_m0ZaT*vV5QNA6DMbuW*dUYM)DRE`w?yje{Vd zIv$L8DbfOgzDaQ>(>CpI$BKnykH^lZa-jPaaC-9dmhN99ydyr33~4LuZYO{Me1c)TF_!lg?KprkodQh_dFYZkn8*BMx7l$rbm za7vPhiHgbqIj{S6vxww$*!5$m5TT}G#IkP0a5NuMWB%y50qk!81>s*D%)%sj2Cwo+ zhX0_B8ZuC=H$n76*^44Q7>zmIG&3MrU@pF(3y-X%cjq?pFcC{P4qy({Gyx=(cH|dB zMnLR?DpUeVv;Osm1F0S#?a0U9($WGHtZtfQsc&;2$GQuS0E)Eg1Kr$#cp3>Q&-aJn z86hBi__l%KTy%vD(g}EM)GBQV)ka{0$VUU;NkOtaxs6cJ2@}W%3ByRmGQR{*<1VSiMIzl&q@A znB+U8h8yr^pSyXxLr^dPl#$X0WXGBg+=3Sp)P+@(+9LyO31E24vC@z z5FRuRJObnjKP>Ic`?`f~rjfsQjmAD=H(n#h@VAa6<>86H_0@;=q1_lUhfsjpp zH8)l4k3A`{&yWt1B#jOk0Q2w%E$-AsRRJ{_&ZoHq9Jh0%py1-BtKx`h2SKj(=+UE+ z(}fl#F!4Ib;iiz>7Mn)^5AQA)Hrnga}_R6AVAu zE<|@h*1@<8P+$VeZNARsINO2%I@bb^pYhBx({%%x1l5ah+6k4<)hP7;0VP~lTD=Mf za*!L2m56EwX7epMH~uB_9s*W3M^tXXqtYfo-Yn9mJJ!d*t}ZAsor&GsZ%cpxU?%>>M?Slj-u#BHF}i zeeGp970m?YAt*|mH6_|G14UrqLaS03==jqClG>(%QB9)5U0|94wvNc#DlQhWl~{6E zN#LykY4GX`;o)2;uymFfwQ`}g6s3}A!)}~FM9idE2Dr6)2WL2$x`Et)WuXpG^E9kd zL}sdEs>vesBuouf1VLpb89;@;2jC4MZs}pNyw|^#wo6X4p~JIY-u}u9eTGDcuHMO+ z47s2VcGuuwGFqX~=mL#NIF9%-zzAEj02n0+I9J6X=zC#>k>Q+8%(pu1ig2a~P2fdA zt|hP&JJ=maK369vC-TB$do2iuAtwQ6yg{BMvlKQRELoxr*-%lDt1sA^QQSGPMMS;W z@O=Iu-ws|`UCO8TM(zpRC$$>Vm0aMw{7=&HT)QUUK4)sJp3 zX5GVcLOD42aR3yZi$VuXV4Dy+{X5#6G&$I%h}=%6J_)=KI7<~4FKl8EX23nHIizb~ zc{$J(M}a5*r)f5TErYtBuqXUE0tG1I)aw*>;ME8^F^}5f;g&+WAg$XT@KTsSlsomq zcGI~DrkDbPmw=SyNJS4GW}wsJ1bPghw;^ki0!9=XenZp`we*n*j~u0?(OTrM7YSf5 zmkme5rD(%HHEJ+Am(U@S)t`@I**|E2n8R3I13`}E<`#!E{3tV8)r&Mv%L%4mC+)yjl~O09aR zM@RTi-frDp;I^!P`C(abc`9TE-n#7SfSKOfcOCv zNQY8UW9M`zRb-o^hk__cO%GJU>x8R|=`~lJ+eDTk#4uqwz!~x}?O$wIqJpXIE2}lv z0_uEs_&}Fb)d_%S;^Az%@=cY{ZAuaZdR)(=sN+wk;e+x&QBo3>5yNMRU?|Sn1zd4N z<{+2qXF46t-K4{P?%$@exf=jQ2bqU(3TT9Wh#RJWuDph@gM5F$Y_h|n2dD~jJ7MNb zh4km*TVLW-sRV$~3^Tvb9gjgy78C$<{3~28A{;_WJ(F~h8$4 zCf}`TUbiv%J9Ewj2g?>DV|UcL1h8xOEEo5T;S>v^*8j0mCQBa8*sn=cU`mJO(0M$- zR~)P)b&ME&GQ0HY(*@y3)k1Ta|7oN!GTpwmW|R$pAJ7U}ZwToIMK~B)I(q}!D(>FD zh>rZ(c4rtJKLQV_(086zzyg5X6uZLnMNoH$(uV4SdiLL;(22)}9td$9C&xvA$YA1# z6G}74&;Krwj@4aGJ&#bEsQr-Ll2$>=J6zfYb}54tonRE?e}L~c7@NvfazBjuTMDk} zda|ERKBETw?kD?mqo%{k>eAS3Gr*(%7>e}d+3nyDS`b%-Fu34o5oKV;o9n6g38Lh(Sk%;zY+KJj98aXoRE${r#Uy(9U;} z?O7tBu@yw|I2F(mbXEkh(+TLU!Y+*jbwOA`T13n1)b63hGWLF4od%7jbc zI9q_#mcHYkH~3UiOK>_PZ0kLR-_x*CfJR* zRVd@!g`MIr12*C}iR5;`ivmzWv4ejP``bzDf7yHXZ{di>jj(_%8a*VV3#SO(Sv2T?JCt|$x`n(~rRN5Q zvpOq~yP$WHR@LC;i;K3D@lEHfZI9JmIOX}zx>>`DM-6;#Y3o-wFSB;Ub5 zjA6?#ic^l^g|=p-DdQ604ar7|GbVO44J5!Bh)c2QjA{5(?!)v5!!q`;0cal{k5?yR zQ_$-IH9BOBcr~&{?0f_J<$;4}LdR AegFUf literal 0 HcmV?d00001 diff --git a/e2e/testcafe-devextreme/tests/dataGrid/etalons/T1219785-column-chooser-2.png b/e2e/testcafe-devextreme/tests/dataGrid/etalons/T1219785-column-chooser-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4b167f13dbd8b30fd47bef4b1a89347f9c2672 GIT binary patch literal 23441 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 { + const $treeView = $(container()); + + $treeView.trigger('focus'); + }, { + dependencies: { + treeView, + } + })(treeView); + } + getCheckboxIcon(nth = 0): Selector { return this.content.find(`.${CLASS.checkboxIcon}`).nth(nth); } + + getColumn(index = 0): Selector { + return this.content.find(`.${CLASS.treeViewItem}`).nth(index); + } } diff --git a/packages/testcafe-models/dataGrid/index.ts b/packages/testcafe-models/dataGrid/index.ts index aadec7af9e1b..d17cd93bfc74 100644 --- a/packages/testcafe-models/dataGrid/index.ts +++ b/packages/testcafe-models/dataGrid/index.ts @@ -649,6 +649,24 @@ export default class DataGrid extends Widget { )(); } + moveColumnChooserColumn(columnIndex: number, x: number, y: number, isStart = false): Promise { + const columnChooser = this.getColumnChooser(); + const column = columnChooser.getColumn(columnIndex); + + return ClientFunction( + (column) => { + const $column = $(column()); + + moveElement($column, x, y, isStart); + }, + { + dependencies: { + column, x, y, isStart, moveElement, + }, + }, + )(column); + } + hide(): Promise { const { getInstance } = this; From 8ffffcccbd1dbaf8da606f2a6d99c5b68fa683eb Mon Sep 17 00:00:00 2001 From: dxArtemiusz <111366900+dxArtemiusz@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:12:39 +0400 Subject: [PATCH 27/29] 24_2 fix Vue warnings (#27624) --- apps/demos/Demos/Accordion/Overview/Vue/App.vue | 3 ++- apps/demos/Demos/Common/NavigationOverview/Vue/App.vue | 4 ++-- apps/demos/Demos/Gantt/TaskTemplate/Vue/App.vue | 2 +- apps/demos/Demos/Gantt/Toolbar/Vue/App.vue | 2 +- apps/demos/Demos/TabPanel/SortableClosableTabs/Vue/App.vue | 4 ++-- apps/demos/Demos/TabPanel/Templates/Vue/App.vue | 3 ++- apps/demos/Demos/VectorMap/ImageMarkers/Vue/App.vue | 3 ++- apps/demos/testing/known-warnings.json | 7 ------- 8 files changed, 12 insertions(+), 16 deletions(-) diff --git a/apps/demos/Demos/Accordion/Overview/Vue/App.vue b/apps/demos/Demos/Accordion/Overview/Vue/App.vue index 6a4a82d6fdb8..346cd726a057 100644 --- a/apps/demos/Demos/Accordion/Overview/Vue/App.vue +++ b/apps/demos/Demos/Accordion/Overview/Vue/App.vue @@ -7,8 +7,9 @@ :animation-duration="animationDuration" v-model:selected-items="selectedItems" id="accordion-container" + item-title-template="itemTitle" > -