From 0be1f6b608fbeb69ad64d4b3a264fec5182d5c13 Mon Sep 17 00:00:00 2001 From: dmlvr Date: Tue, 3 Feb 2026 13:27:37 +0200 Subject: [PATCH 01/16] moved disabled class from item to content --- .../__internal/ui/tree_view/tree_view.base.ts | 35 ++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts index fd4680d6cbfd..d2da1abd3775 100644 --- a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts +++ b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts @@ -58,6 +58,7 @@ const OPENED_NODE_CONTAINER_CLASS = `${NODE_CLASS}-container-opened`; const IS_LEAF = `${NODE_CLASS}-is-leaf`; export const ITEM_CLASS = `${WIDGET_CLASS}-item`; +const ITEM_CONTENT_CLASS = `${WIDGET_CLASS}-item-content`; const ITEM_WITH_CHECKBOX_CLASS = `${ITEM_CLASS}-with-checkbox`; const ITEM_WITH_CUSTOM_EXPANDER_ICON_CLASS = `${ITEM_CLASS}-with-custom-expander-icon`; const CUSTOM_EXPANDER_ICON_ITEM_CONTAINER_CLASS = `${WIDGET_CLASS}-custom-expander-icon-item-container`; @@ -76,6 +77,7 @@ export const SELECT_ALL_ITEM_CLASS = `${WIDGET_CLASS}-select-all-item`; const INVISIBLE_STATE_CLASS = 'dx-state-invisible'; const DISABLED_STATE_CLASS = 'dx-state-disabled'; +const DISABLED_STATE_ARIA = 'aria-disabled'; const SELECTED_ITEM_CLASS = 'dx-state-selected'; const EXPAND_EVENT_NAMESPACE = 'dxTreeView_expand'; const DATA_ITEM_ID = 'data-item-id'; @@ -884,8 +886,10 @@ class TreeViewBase extends HierarchicalCollectionWidget): void { @@ -1148,9 +1162,6 @@ class TreeViewBase extends HierarchicalCollectionWidget Date: Tue, 3 Feb 2026 14:57:39 +0200 Subject: [PATCH 02/16] update disabled styles --- .../scss/widgets/base/treeView/_common.scss | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss b/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss index 9efe8e84d511..05a138c0d29c 100644 --- a/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss +++ b/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss @@ -90,6 +90,10 @@ $treeview-searchbox-margin-bottom: 5px; margin-inline-end: 0; } } + + &.dx-state-disabled { + opacity: 0.5; + } } .dx-item-content { @@ -98,10 +102,6 @@ $treeview-searchbox-margin-bottom: 5px; align-items: center; } } - - &.dx-state-disabled { - opacity: 0.5; - } } .dx-treeview-toggle-item-visibility, @@ -109,10 +109,6 @@ $treeview-searchbox-margin-bottom: 5px; .dx-treeview-custom-collapse-icon { cursor: pointer; order: 0; - - &.dx-state-disabled { - cursor: default; - } } .dx-rtl { From fd77de5ef4757054a5e61dbb7c371aac42dd890a Mon Sep 17 00:00:00 2001 From: dmlvr Date: Wed, 4 Feb 2026 15:34:30 +0200 Subject: [PATCH 03/16] fix itemcontent classes --- .../js/__internal/ui/tree_view/tree_view.base.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts index d2da1abd3775..fb855ac0ca65 100644 --- a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts +++ b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts @@ -1001,12 +1001,6 @@ class TreeViewBase extends HierarchicalCollectionWidget): void { @@ -1016,6 +1010,15 @@ class TreeViewBase extends HierarchicalCollectionWidget Date: Wed, 11 Feb 2026 09:19:57 +0200 Subject: [PATCH 04/16] fix removing disabled state class from itemElement --- .../js/__internal/ui/tree_view/tree_view.base.ts | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts index fb855ac0ca65..beebc3c020e7 100644 --- a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts +++ b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts @@ -886,12 +886,6 @@ class TreeViewBase extends HierarchicalCollectionWidget Date: Wed, 11 Feb 2026 16:11:31 +0200 Subject: [PATCH 05/16] fix tests for new behavior --- .../treeView.accessibility.tests.js | 1 - .../treeView.expanded.tests.js | 16 ++++++++-------- .../treeView.markup.tests.js | 12 ++++++------ .../treeView.virtualMode.tests.js | 4 ++-- .../treeViewParts/keyboardNavigation.js | 4 ++-- .../treeViewParts/optionChanged.js | 15 +++++++++++---- 6 files changed, 29 insertions(+), 23 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.accessibility.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.accessibility.tests.js index d2faf5932ce8..72b7d82f32a8 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.accessibility.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.accessibility.tests.js @@ -81,7 +81,6 @@ let helper; helper.checkAttributes(searchEnabled ? helper.$itemContainer : helper.$widget, { role: 'tree', tabindex: '0' }); helper.checkAttributes(searchEnabled ? helper.$widget : helper.widget._itemContainer(true), { }); - helper.checkItemsAttributes([0], { attributes: [ 'aria-disabled' ] }); }); test('Selected: ["Item_1_1"], selectionMode: "single", Item_1.expanded: true, collapseItem(["Item_1"]) -> expand(["Item_1"])', function() { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js index e9f3086216f4..ec19bf2ac0e2 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js @@ -232,7 +232,7 @@ module('Expanded items', { assert.ok(!treeView.option('items')[0].expanded, 'disabled item was not expanded'); }); - test('disabled item with custom expander icons should not expand on click', function(assert) { + test('disabled item with custom expander icons should expand on click', function(assert) { const data = $.extend(true, [], DATA[5]); data[0].disabled = true; const $treeView = initTree({ @@ -245,7 +245,7 @@ module('Expanded items', { $icon.trigger('dxclick'); - assert.notOk(treeView.option('items')[0].expanded, 'disabled item was not expanded'); + assert.ok(treeView.option('items')[0].expanded, 'disabled item was expanded'); }); test('expanded disabled item should not collapse on click', function(assert) { @@ -292,7 +292,7 @@ module('Expanded items', { assert.notOk($expandIcon.is(':visible')); }); - test('expanded disabled item with custom icon should not collapse on click', function(assert) { + test('expanded disabled item with custom icon should collapse on click', function(assert) { const data = $.extend(true, [], DATA[5]); data[0].expanded = true; data[0].disabled = true; @@ -306,7 +306,7 @@ module('Expanded items', { $icon.trigger('dxclick'); - assert.ok(treeView.option('items')[0].expanded, 'disabled item was not collapsed'); + assert.notOk(treeView.option('items')[0].expanded, 'disabled item was collapsed'); }); test('expanded item with custom icon should collapse on click', function(assert) { @@ -651,7 +651,7 @@ module('Expanded items', { assert.notOk(nodes[0].items[0].items[0].expanded, 'item 111'); }); - test('Disabled item doesn\'t expand when using the expandAll method', function(assert) { + test('Disabled item should expand when using the expandAll method', function(assert) { const $treeView = initTree({ items: [{ text: '1', @@ -683,11 +683,11 @@ module('Expanded items', { assert.ok(isNodeExpanded($node2), 'second node is expanded'); assert.equal(getNodeItemId($node2), 11, 'id for second node'); - assert.notOk(isNodeExpanded($node3), 'third node is expanded'); + assert.ok(isNodeExpanded($node3), 'third node is expanded'); assert.equal(getNodeItemId($node3), 111, 'id for third node'); }); - test('Disabled item doesn\'t expand when using the expandAll method and the expandNodesRecursive is enabled', function(assert) { + test('Disabled item should expand when using the expandAll method and the expandNodesRecursive is enabled', function(assert) { const $treeView = initTree({ expandNodesRecursive: true, items: [{ @@ -720,7 +720,7 @@ module('Expanded items', { assert.ok(isNodeExpanded($node2), 'second node is expanded'); assert.equal(getNodeItemId($node2), 11, 'id for second node'); - assert.notOk(isNodeExpanded($node3), 'third node is expanded'); + assert.ok(isNodeExpanded($node3), 'third node is expanded'); assert.equal(getNodeItemId($node3), 111, 'id for third node'); }); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js index f156ef758236..5e7d8fd40f15 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js @@ -424,7 +424,7 @@ QUnit.module('markup', { assert.equal($rootNodeSecondItem.find('.' + TOGGLE_ITEM_VISIBILITY_CLASS).length, 0); }); - QUnit.test('Add disabled class for toggle icon if item is disabled', function(assert) { + QUnit.test('Not add disabled class for toggle icon if item is disabled', function(assert) { const $treeView = initTree({ items: [{ id: 1, @@ -437,7 +437,7 @@ QUnit.module('markup', { const $rootNode = $treeView.find(`.${NODE_CONTAINER_CLASS}:first-child`); const $icon = $rootNode.find(`.${ITEM_CLASS}`).eq(0).children(`.${TOGGLE_ITEM_VISIBILITY_CLASS}`).eq(0); - assert.ok($icon.hasClass('dx-state-disabled')); + assert.notOk($icon.hasClass('dx-state-disabled')); }); QUnit.test('Render checkboxes', function(assert) { @@ -510,17 +510,17 @@ QUnit.module('markup', { assert.equal(treeView.getScrollable().option('direction'), 'both'); }); - QUnit.test('Disabled class is added when disabledExpr is used', function(assert) { + QUnit.test('Disabled class is not added when disabledExpr is used', function(assert) { const $treeView = initTree({ items: [{ id: 1, text: 'item 1', isDisabled: true }], disabledExpr: 'isDisabled' }); const $item = $treeView.find('.' + ITEM_CLASS).eq(0); - assert.ok($item.hasClass('dx-state-disabled')); + assert.notOk($item.hasClass('dx-state-disabled')); }); - QUnit.test('Disabled class is added when disabledExpr is used with custom template', function(assert) { + QUnit.test('Disabled class is not added when disabledExpr is used with custom template', function(assert) { const $treeView = initTree({ items: [{ id: 1, text: 'item 1', isDisabled: true }], disabledExpr: 'isDisabled', @@ -530,7 +530,7 @@ QUnit.module('markup', { }); const $item = $treeView.find('.' + ITEM_CLASS).eq(0); - assert.ok($item.hasClass('dx-state-disabled')); + assert.notOk($item.hasClass('dx-state-disabled')); }); QUnit.test('toggle visibility icon should not render for invisible item (T323491)', function(assert) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js index e63f6c0c9982..75d022ac74ad 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js @@ -275,7 +275,7 @@ QUnit.test('Don\'t create loadindicator on dblclick after expand childless item assert.equal($node.find('.dx-loadindicator').length, 0); }); -QUnit.test('Don\'t create loadindicator when disabled item expands', function(assert) { +QUnit.test('Create loadindicator when disabled item expands', function(assert) { const newData = $.extend(true, [], data2); newData[15].disabled = true; @@ -290,7 +290,7 @@ QUnit.test('Don\'t create loadindicator when disabled item expands', function(as const $node = this.$element.find(`.${TREEVIEW_NODE_CLASS}`).eq(2); $node.find('.dx-treeview-toggle-item-visibility').trigger('dxclick'); - assert.equal($node.find('.dx-loadindicator').length, 0); + assert.equal($node.find('.dx-loadindicator').length, 1); }); QUnit.test('Add leaf class after expand childless item', function(assert) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js index d9d91a0fe9a8..b2599c623e14 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js @@ -788,8 +788,8 @@ QUnit.module('keyboard navigation', { assert.ok($focusedNode.hasClass('dx-state-focused'), 'item was focused'); keyboard.keyDown('left'); - $focusedNode = $treeView.find('.dx-treeview-node[data-item-id=1]'); - assert.ok($focusedNode.hasClass('dx-state-focused'), 'first item was focused'); + $focusedNode = $treeView.find('.dx-treeview-node[data-item-id=2]'); + assert.ok($focusedNode.hasClass('dx-state-focused'), 'parent disabled item was focused'); keyboard.keyDown('right'); $focusedNode = $treeView.find('.dx-treeview-node[data-item-id=21]'); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js index 141985c3e0c0..2be431cc90d1 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js @@ -66,19 +66,23 @@ QUnit.test('parentIdExpr should work correctly when it was dynamically changed', QUnit.module('Option changing for single item'); -QUnit.test('node should have disabled class when it was disabled at runtime', function(assert) { +QUnit.test('node should not have disabled class when it was disabled at runtime', function(assert) { const $treeView = initTree({ items: [{ text: 'item 1' }], dataStructure: 'plain' }); const instance = $treeView.dxTreeView('instance'); const $item = $treeView.find('.dx-treeview-item').eq(0); + const $itemContent = $treeView.find('.dx-item-content').eq(0); instance.option('items[0].disabled', true); - assert.ok($item.hasClass('dx-state-disabled'), 'item should be disabled'); + assert.notOk($item.hasClass('dx-state-disabled'), 'item frame do not have disabled class'); + assert.ok($itemContent.hasClass('dx-state-disabled'), 'item content should have disabled class'); instance.option('items[0].disabled', false); - assert.notOk($item.hasClass('dx-state-disabled'), 'item should not be disabled'); + assert.notOk($item.hasClass('dx-state-disabled'), 'item frame do not have disabled class'); + assert.notOk($itemContent.hasClass('dx-state-disabled'), 'item content do not have disabled class'); + }); QUnit.test('checkbox should have disabled class when item was disabled at runtime', function(assert) { @@ -105,12 +109,15 @@ QUnit.test('node should have disabled class when it was disabled at runtime with }); const instance = $treeView.dxTreeView('instance'); const $item = $treeView.find('.dx-treeview-item').eq(0); + const $itemContent = $treeView.find('.dx-item-content').eq(0); instance.option('items[0].disable', true); - assert.ok($item.hasClass('dx-state-disabled'), 'item should be disabled'); + assert.notOk($item.hasClass('dx-state-disabled'), 'item frame should do not have disabled class'); + assert.ok($itemContent.hasClass('dx-state-disabled'), 'item content should have disabled class'); instance.option('items[0].disable', false); assert.notOk($item.hasClass('dx-state-disabled'), 'item should not be disabled'); + assert.notOk($itemContent.hasClass('dx-state-disabled'), 'item content should do not have disabled class'); }); QUnit.test('checkbox should have disabled class when item was disabled at runtime with expressions', function(assert) { From fc4b3a2a09c87b9120fb0325f4256344d4a40976 Mon Sep 17 00:00:00 2001 From: dmlvr Date: Wed, 11 Feb 2026 16:12:26 +0200 Subject: [PATCH 06/16] fix the way to change selectable state via api --- .../devextreme/js/__internal/ui/tree_view/tree_view.base.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts index beebc3c020e7..0213bf7d0e70 100644 --- a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts +++ b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts @@ -1006,6 +1006,7 @@ class TreeViewBase extends HierarchicalCollectionWidget Date: Thu, 12 Feb 2026 11:20:04 +0200 Subject: [PATCH 07/16] fix DataGrid ColumnChooser integration tests --- .../columnChooser.integration.tests.js | 2 +- packages/testcafe-models/dataGrid/columnChooser.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/columnChooser.integration.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/columnChooser.integration.tests.js index 55ad451fd93e..f108afe720c4 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/columnChooser.integration.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.dataGrid/columnChooser.integration.tests.js @@ -466,7 +466,7 @@ QUnit.module('Column chooser', baseModuleConfig, () => { // act dataGrid.showColumnChooser(); - const items = $('.dx-item.dx-treeview-item'); + const items = $('.dx-item.dx-treeview-item .dx-treeview-item-content'); // assert assert.ok(items.eq(2).hasClass('dx-state-disabled'), 'Column with allowHiding=false is disabled'); diff --git a/packages/testcafe-models/dataGrid/columnChooser.ts b/packages/testcafe-models/dataGrid/columnChooser.ts index 63a01c157f8f..3e82eab9d4b5 100644 --- a/packages/testcafe-models/dataGrid/columnChooser.ts +++ b/packages/testcafe-models/dataGrid/columnChooser.ts @@ -10,6 +10,7 @@ const CLASS = { stateDisabled: 'dx-state-disabled', checkbox: 'dx-checkbox', treeViewItem: 'dx-treeview-item', + treeViewItemContent: 'dx-treeview-item-content', treeView: 'dx-treeview', itemContent: 'dx-item-content', itemContentToolbar: 'dx-toolbar-item-content', @@ -58,7 +59,7 @@ export default class ColumnChooser extends FocusableElement { } isColumnDisabled(index = 0): Promise { - return this.getColumn(index).hasClass(CLASS.stateDisabled); + return this.getColumn(index).find(`.${CLASS.treeViewItemContent}`).nth(0).hasClass(CLASS.stateDisabled); } getColumnsCount(): Promise { From d0c37fa3103c0e7a7d3249e9aaa1cfc068ecf77c Mon Sep 17 00:00:00 2001 From: dmlvr Date: Mon, 16 Feb 2026 12:57:59 +0200 Subject: [PATCH 08/16] update colors for disabled state --- .../scss/widgets/base/treeView/_common.scss | 4 ---- .../scss/widgets/fluent/treeView/_colors.scss | 16 +++++++++++++ .../scss/widgets/fluent/treeView/_index.scss | 23 +++++++++++++++++++ .../widgets/generic/treeView/_colors.scss | 12 ++++++++-- .../scss/widgets/generic/treeView/_index.scss | 4 ++++ .../widgets/material/treeView/_colors.scss | 2 +- .../widgets/material/treeView/_index.scss | 4 ++++ 7 files changed, 58 insertions(+), 7 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss b/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss index 05a138c0d29c..6caa9d950beb 100644 --- a/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss +++ b/packages/devextreme-scss/scss/widgets/base/treeView/_common.scss @@ -90,10 +90,6 @@ $treeview-searchbox-margin-bottom: 5px; margin-inline-end: 0; } } - - &.dx-state-disabled { - opacity: 0.5; - } } .dx-item-content { diff --git a/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss b/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss index 4d665729e03a..2d9199dad8c0 100644 --- a/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss @@ -19,3 +19,19 @@ $treeview-item-selected-color: $treeview-color !default; $treeview-item-selected-bg: $base-selected-bg !default; $treeview-spin-icon-color: $base-spin-icon-color !default; $checkbox-border-color-focused: $base-accent-active !default; +$checkbox-disabled-border-color-focused: null !default; +$checkbox-disabled-background-focused: null !default; +$treeview-item-content-disabled: null !default; + + +@if $mode == "light" { + $treeview-item-content-disabled: color.scale($base-bg, $lightness: -25.88%); + $checkbox-disabled-border-color-focused: color.scale($base-bg, $lightness: -29.8%); + $checkbox-disabled-background-focused: color.scale($base-bg, $lightness: -7.84%); +} + +@if $mode == "dark" { + $treeview-item-content-disabled: color.change($base-bg, $lightness: 36.08%, $space: hsl); + $checkbox-disabled-border-color-focused: color.change($base-bg, $lightness: 70.2%, $space: hsl); + $checkbox-disabled-background-focused: color.change($base-bg, $lightness: 92.16%, $space: hsl); +} diff --git a/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss b/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss index 601885492485..03cdeeb86cd6 100644 --- a/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss +++ b/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss @@ -32,9 +32,32 @@ } } } + + .dx-checkbox.dx-state-disabled { + .dx-checkbox-icon { + background-color: $checkbox-disabled-background-focused; + border-color: $checkbox-disabled-border-color-focused; + } + + &.dx-checkbox-checked { + .dx-checkbox-icon { + color: $checkbox-disabled-border-color-focused; + } + } + + &.dx-checkbox-indeterminate { + .dx-checkbox-icon::before { + background-color: $checkbox-disabled-border-color-focused; + } + } + } } } +.dx-treeview-item-content.dx-state-disabled { + color: $treeview-item-content-disabled; +} + @include default-expander-icon( 'chevrondown', 'chevronright', diff --git a/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss b/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss index 1973ce45a8c4..abe822f72a36 100644 --- a/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss @@ -33,6 +33,7 @@ $treeview-border-color: $base-border-color !default; $treeview-item-selected-color: null !default; $treeview-item-selected-bg: null !default; $treeview-item-selected-hover-bg: null !default; +$treeview-item-content-disabled: null !default; /** * $name 120. Arrow icon color @@ -52,6 +53,7 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: color.change($base-accent, $alpha: 0.48) !default; $treeview-item-selected-hover-bg: color.change($base-accent, $alpha: 0.3) !default; $treeview-spin-icon-color: $base-header-color !default; + $treeview-item-content-disabled: color.adjust($base-text-color, $lightness: 40%, $space: hsl); } @if $color == "contrast" { @@ -63,6 +65,7 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: $base-inverted-bg !default; $treeview-item-selected-hover-bg: $base-inverted-bg !default; $treeview-spin-icon-color: $base-icon-color !default; + $treeview-item-content-disabled: color.scale($base-text-color, $lightness: -48.24%); } @if $color == "dark" { @@ -75,6 +78,7 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: color.change(#fff, $alpha: 0.12) !default; $treeview-item-selected-hover-bg: color.change(#fff, $alpha: 0.09) !default; $treeview-spin-icon-color: $base-icon-color !default; + $treeview-item-content-disabled: color.change($base-text-color, $lightness: 51.8%, $space: hsl); } @if $color == "darkmoon" { @@ -87,6 +91,7 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: color.change(#748fbc, $alpha: 0.42) !default; $treeview-item-selected-hover-bg: color.change(#748fbc, $alpha: 0.3) !default; $treeview-spin-icon-color: $base-icon-color !default; + $treeview-item-content-disabled: color.scale($base-text-color, $lightness: -48.24%); } @if $color == "darkviolet" { @@ -99,6 +104,7 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: color.change($base-accent, $alpha: 0.46) !default; $treeview-item-selected-hover-bg: color.change($base-accent, $alpha: 0.6) !default; $treeview-spin-icon-color: $base-header-color !default; + $treeview-item-content-disabled: color.change($base-text-color, $saturation: 0%, $lightness: 51.76%, $space: hsl); } @if $color == "greenmist" { @@ -111,6 +117,7 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: color.change(#000, $alpha: 0.1) !default; $treeview-item-selected-hover-bg: color.change(#000, $alpha: 0.2) !default; $treeview-spin-icon-color: $base-icon-color !default; + $treeview-item-content-disabled: color.change($base-text-color, $saturation: 0%, $lightness: 60%, $space: hsl); } @if $color == "light" { @@ -123,6 +130,7 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: color.change(#000, $alpha: 0.1) !default; $treeview-item-selected-hover-bg: color.change(#000, $alpha: 0.07) !default; $treeview-spin-icon-color: $base-icon-color !default; + $treeview-item-content-disabled: color.adjust($base-text-color, $lightness: 40%, $space: hsl); } @if $color == "softblue" { @@ -135,5 +143,5 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-bg: color.change(#000, $alpha: 0.1) !default; $treeview-item-selected-hover-bg: color.change(#000, $alpha: 0.15) !default; $treeview-spin-icon-color: $base-icon-color !default; -} - + $treeview-item-content-disabled: color.adjust($base-text-color, $lightness: 40%, $space: hsl); +} \ No newline at end of file diff --git a/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss b/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss index b2f0624e0bf9..768db54a3ae8 100644 --- a/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss +++ b/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss @@ -81,3 +81,7 @@ } } } + +.dx-treeview-item-content.dx-state-disabled { + color: $treeview-item-content-disabled; +} \ No newline at end of file diff --git a/packages/devextreme-scss/scss/widgets/material/treeView/_colors.scss b/packages/devextreme-scss/scss/widgets/material/treeView/_colors.scss index c1966caec80d..825c2c67abd0 100644 --- a/packages/devextreme-scss/scss/widgets/material/treeView/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/material/treeView/_colors.scss @@ -18,8 +18,8 @@ $treeview-border-color: $base-border-color !default; $treeview-item-selected-color: $treeview-color !default; $treeview-item-selected-bg: null !default; $treeview-spin-icon-color: $base-spin-icon-color !default; - $checkbox-border-color-focused: $base-focus-bg !default; +$treeview-item-content-disabled: color.change($base-text-color, $alpha: 0.38); @if $mode == "light" { $treeview-item-selected-bg: color.change(#000, $alpha: 0.12) !default; diff --git a/packages/devextreme-scss/scss/widgets/material/treeView/_index.scss b/packages/devextreme-scss/scss/widgets/material/treeView/_index.scss index 70f6e780557a..b76e5427f6b2 100644 --- a/packages/devextreme-scss/scss/widgets/material/treeView/_index.scss +++ b/packages/devextreme-scss/scss/widgets/material/treeView/_index.scss @@ -32,6 +32,10 @@ } } +.dx-treeview-item-content.dx-state-disabled { + color: $treeview-item-content-disabled; +} + @include treeview-item( $material-treeview-item-element-gap, $material-treeview-item-padding, From 6f27257f3027461bfe215a8f051759013e28cac6 Mon Sep 17 00:00:00 2001 From: dmlvr Date: Mon, 16 Feb 2026 15:26:28 +0200 Subject: [PATCH 09/16] modified card view column chooser etalons --- ...-chooser_drag_mode (fluent.blue.light).png | Bin 10078 -> 10077 bytes ...hooser_select_mode (fluent.blue.light).png | Bin 12169 -> 12164 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/e2e/testcafe-devextreme/tests/cardView/columnChooser/etalons/card-view_column-chooser_drag_mode (fluent.blue.light).png b/e2e/testcafe-devextreme/tests/cardView/columnChooser/etalons/card-view_column-chooser_drag_mode (fluent.blue.light).png index 459ef44ce4c22a214213e6f099c997327f979d46..1f2aeb11da3216ac7d34362503213be5c8a4a81c 100644 GIT binary patch literal 10077 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 A^#A|> diff --git a/e2e/testcafe-devextreme/tests/cardView/columnChooser/etalons/card-view_column-chooser_select_mode (fluent.blue.light).png b/e2e/testcafe-devextreme/tests/cardView/columnChooser/etalons/card-view_column-chooser_select_mode (fluent.blue.light).png index fb081af694b11c842a5b210d1833e66edea2a3db..6e46c99bec5df88066adbb7c9f8ac1f92454f144 100644 GIT binary patch literal 12164 zcmeHtbyQs6nk58xx8M+*KmiF_K!SuMc#uGFm*DOMcef&iBxrDVrzpH2fh4#?0YM9b z1pO9p zuo2=xE8d-K}5Ocs7ILFoM3z z7R;43>y}#0-?|iOutMQv5T!`BlxpiFVh@S_Rg?@)BNceAt_d?KsuPMlIF+rs)e|`tr8v+j2 z!=5TA4B&(T^^#zdk&!VI0>xx#fy)9w0nb`TIGwsrURE15L=onT(VbVeW%AW@W|R~~ zMGr@qx<0iMZ!AswJ|Xa`jIwO`X?-8KKZUz)N_ez_mnTjf*XQ?=M`Lq?STBh8Q{)feKV~ zZC{SO$zXQ8h1AA!$H}g!tQe~8m(2h41Rp;pqsIK;2mVV2nVcE*y%T7e z`k?J>Q*L=Q!vB|d{SDH8H}QMj9?G7rSxJ4*&8h0Bct3?vyQAun?EH(@NlM)JOFR7@ zKDJ`@lM?;1*q&95VYh#LZ&dfOMoST9l-8oaVUH)4I(6k1*PaD~t)1C+w*Ya`N0$4g z0Xi5>RuQuSgkmrDzN=yLn7YEA>2k>hBx}`&pC!HXzOWXSxBF$p?JBM;YxK~-&S?pD zyUcphuSu@s`SsfX9!jRAG)y(YU{|Gtmf>C~R(PRn`P;ouu~D@WasJV{stFED&;oB4 zT-;Y04D6alWAo*-tjk+&p9-_99{TU9oe4vTQeQK0XzC-%%kkNWkK9S>8tgC(E;x4? z8Sb5Mb0^kcR!iDvrLVd~LLJO^r>b1GMZXWV+s=Phn<`t6Flvep&=p7B7Zq)-EHinb zwM1=C!8(z-Yj194k?I3`W)DmV{O8>PC8v(8Khtury1%27;kEqjf?O1djTYomx%>_( zWoYs!O~f!2;qAKpD^MkFc{JFdDb#9fg)Lq6%Up9sUbCa#!w+$ISGD;5KM;k*fYT;n9r-x|cGr!wJfd^gZ(YmLV6CvTq%?uVzfP zdwYJzcYjW}vC`p)>sdSYn^C{oRev?!T^Fi1yk6K^b{BS*#ITB3x2o*9nB-}^($EdU zqYBnSm@EtDCnI=sd_=4^sMl?L$^ZO1fS|>2>zKGE>bs84*WVt=vTenYM@vod z1~omgcG9wizekj=^f?C~2I~%}fc?Cxi_4o6?rN)x_66Uzy4&S^hEAUTOk~{OX>PmC zbau%m@{!&*G(dE9__gh~_n4iPTP@xs%ynMf7zfRNf7aqH-C`I_CtAu7n0L;VzomLD zK4Nq&Arve`MP+3u+e4Z%nVKCjlh#_EglxCIExde2t|%h$aQcjeZ!cK!ChG3FBX~gD zTxf3b(a2X)Oyw5?aw_58pE7X77~f&N^|kaT;t)OJuFzBY+L7UZE;_xaGm#l9cPlQ6 z={v-d;jr*ZJ_g2PHINhJRJAgB`_sI+N%{%f01wrJe)+`!Z!X4bzfZh8eb^54w4)jt zGlQ8NWDaT-EO}W-q<_cm?25Y13rr}2B88 zJ3pKS=I9NVXYh6IzG6O~`mXG*Z?5I|BKyuq=G=NOVa*5HiVn+lMX}|%XJ1=NpP%^; zyma_=;b00g&YEf$ZGN3)>iz~xnU~M@O>=tHLsbu5r$2C4-S?Yko#e>WLXnj%U+1IG zLxcNFmR7&<4{Q7(_HSBCg%s^z)b<;!CHG;Lr-qT>UOdg!*#I{t>1#=eWFm5ddPp=v zUv7YJgA%0RW)e%dt?p`<6Ae3>6USn8_`s6Ma(`Xg>(e_@(5!6qkbbDp=mwd?@-}58 zUW!#MSHh6e=^|_Wlc#3rqCuM}pQ;}qkC{rvpSdy-7W=zOv!oR@_>=bI@ounAAQfn| z+R%1(Ip>Z-vRLQl5Tu&af-&nZnHupNadE6rb9G^u-BbGEk{9RJ$39uAmLq;l!2#?# z9HO7q>l>hbrtz_gWDXPS3Os^Ia-xc_d0`U$ai3mNvYqJDyj&d0jC@60*%4vzo$*7X z8NmgIoQfi~R;F^h7>0N_K7+%ARaAfYyS&?{h9q)1Bmh*OibEY2X5VR%_9FvDMMYPw zrNI;H;ka`F?+|vznX)Xy%v=hspOJ>5%|t%QXT4)ZyWSzsh0LJtbHrF5!Q#oBk9VG~ zv6OjGhhkCEi06!P3ch-hY&_K!=HnHw;7Rr6P|2?6`q?=!XkQzuj2LkaR_H}**aQD4 zmX7>i2Hnr3nFVsaP(CIgL%G>!3MHg*Bi2#eF7Iv$!>Vyuq3WaV(!H#cbyqA>f(js9 z{mG4hdPkWYBGLSJjF|My4mqKuzP+Y*EKH^%nn3TF`Jk-O2-CbUL@-iZwA42br`3na zbU|E{+0+7u(LoK>iy;?tJ&W>5A1pz5?5~U!UL0;|s_}4d)$HAGtzipIh}%Z*OD#MJcw0&cX|X@aL56gK4^) zLLo4v6GIvX94H=sBrZ0q)aLrhQzp6@42Ba1dY4+qUUye%l3L&VD6#ZD3kHhaNVUxJiuyU+@A{l1JFX?5&>yBIf|wRm>D2R2SW$4-ljjXB z>@j2d!Y}4Kus^b>`Bswtx~M%wzHRkgViL|lU@ssaL0M*5*SGLaXbUQeGn}$6e5D(! zJF{zo{W%zaM+Z2yE+Hz*)XCq@$~m$P;6#u&IoL&~RGP@Uw~T3u;RencSAQ*&|BXq2z(wV>S z$szq*hpAAUg_(mI-4840A(^Q;@XMq5!NG5?44k|Q<~kS|BOP`oE%yXeXeockvtsx^av}>bl$brYFxR+l+Ba;)JDtuPUfa)+*pnlxS>O zK~za^rN8E9(@o}B>WVr)4W%!( zL~vNnsTn=I9kzfdK|Y8%Gx!uE5sp2X zvv;yFu@Sr$=YS}Q-`}2yvj0>TO;#@vCtv9&)nOrJ=j2pejCwI8|HN1*?#M5^{hJl# zd_YluY}3~RWmjh#u7nGZR2t(a1)cAsn7n*E;P~^|u?#QEn`_@b#X&&Drt7^0)tOcq zeX-yQd_QbkD^e8(`UE>_^bqwtv8Be1I61yR; z`lGoW)=ap&xZ`Dp$+5N)jo>+>+3j$_S$ecO(g58cm^aWi&m&~bw+^zpN%p& zm9^zxA9aP%pJ+8ofA3o}Gra^cRxuWB>uR{)t<;^Lzg=w;Wm?F!PS?8EyF+G7=hAw0 z9XxijXCv~{kS|GEWZ<>43GDY9LwwKjS7*r}?t5q`MlMD^xt&=v({Nkk_tJ%bW0nyWDMYsN&`hsBm+Y z=~hBE2q{6_BRN28qnDz&Ofk$VC>VuS8c*bEiJMa+x#{wZMfRngOevvzI-2fn)^N*Z z7aF>$hex_5%R69_t%Vdf$17IPq0Q5sRWTt@r^5ALSK|ouNSx=t3&NV0CQnNqN3knK z(GqP_^p?Jp_qionl)1ysWRiYvaBAV<$!KkM4+YV?d4~7n#4*MvV+alV5jTl1IjHuP(b+4 zFJ=W2u%e(Za6Sua!k!UO@(>Q@Nw$ff#3cCaQAcp@q^en#$z5wg_1fO2He#}rxIDPx zV9fI1$%2$m<$;joJ#P)6$u$x;B#LINqSi}x%$*V8(JgULm&rXAnWEPnxwjpKhc>fl z4AUFZ0(Tvt2Z2SyBot5E%6^C7=JoUhu7N zXdep)2gjd6nNX-Q3+bxK?Usqp4QhyviRl@@dp!WT^{;`pwzdG85}pI75sQGj*0k@Q zg2HA4?Ejw0{~131dk|3zDG2iS2w%A68Chc=%8vGRceA})mb-lrj13T;FMr9Wh1*>T zrppQN?Txy;%7E;hf8=QJ%agI|o(KRnm|&Eim&2go+fr7}ACq^F27pT1NIUa%yZsLk zV2H<+c3YHf``MdYWn~g30i%nR@g_d+sif%P&ALmlyZ`KTdq(EDKx$W*qdmR$0>+vfGcU(VmT-Vsht}CpUu%*+&(4hj?MW<)nhNq&F0k!LC7U2UW;&xYS+)F|fs!PSbSQCiJ227$G9*3jb1H}V71 zDut9;K;GM5%-93nt3J2-RydP#9`Lx|@C%S97_l* zH`7lJQgKB~!!tGL6UbK5`n|+q2WB=}(om_3G^SB@!#5N2k#Bg}i0@(+U=t;NqTYvG z(&BmZBa7S6n|%*$7C7DJ6=Sd7*P)eO_+QNStco=fOh} zbIF;%2p19d_*(O!&YR40VJ2;Ouh`w4{p`Ylt#L!fJm;aj(r^6x{xq5`fzmOZ#*$)U zuYxBz<)jYT)lyY2zBbgfW)1~6o9{`4YwNz!*A0d70A{?G ze1X|xWpmaK$v>Lt+Or%>q}$%>K`zd`r{{=bBERv+M7)zLpRwLCZq7d6v@bYUJ3m({ z3u;Z(`$(ii1UCE(Hw{5BZ&&i(4Uj(lGFwxZgr6rki0iv;y%XI^fK|w(POn@$> z@IwDFNxIJIlajdWtg52oV(3Z7yH4}N#i_wS*C>(`zjOD*zn}hCiBYF(U$~f(5`Vt& z(4;V>fwFNr_l1TvJDXddzTpETVr1*j#6p1Om(5*M8dg%pvtFUArE7bdry*2l9@SM% zpa!YU{n#QFM&n&8f#8@vTBD216>;g*8p4@!0rJ`dzX zR{@th7h}Slw=kgb)@i;2Oucvosu+`-%~`WLuPy6N`(7P1I!a2`wn|77(|%(9rypU! zM{#v0B&J@T^?6h6;i2D~^9Q>lt(Jc6b9360NP(<%g>((G_>)#u?^EnI9oMeXf9dvi za||Q82_4!(u+#KXXUO-%Aj8QmjXlZC>e(l+v2%9FscFuq>f3THgJnl@RlkZgC;xN+ zUSQ!cI^pWLp$@R$dDE0?&W|7X~=8wr#Nf?LIkmSQEDxiA0?a z#%Nt1`|TsD8pQ-kd88FY^`1P+{9tcEuVckA`$Q2&Y+G&v8>P4ViO-!VX#EY=lpfLR zE}_gyMI`m1ERTrKx#$bu2k~x*4#~_b>h*Nm3TCI?ik03I`aM*Cv37M}_(mJv9mO!`9Md(p?A;hXo6DBoE;@6!=ljXCN%M$_`JIlz=&Yu*>1y(L zV@l_4)Bt)%2!!I`NFMv;9K+kI6%m!Mf8Z0CW8jhzD1?3z<u%xGz4dy}#d5 zFE%%3N_`Tm%u`W`tS%R3Bc{n$5ku^KuVtm%`e?ME{|dNkzE-T3?T0pVv0S@Eg6k9W z9nlevogT4)2LPFHjhr7e4KN7YcdC!@+r>?JmU91#HPD@vOb!ke^KCgyQiDR-6#R|{uFUkZOheNoG=d| z^7+{qkY#n?+I;Yd<7-!BG5v>j@^cT)7iT_{ufMyRuqnEq%Dn2L!yo-#-))9RworV1 zTU<$BS=9aknuuXHRjpcCo*4OFob^^D=^ih$6T9f_@RTPY#yP{*+$Rozt*@Xc1y2qR z;%$6*nf@J`ju6h`1L$E{>2#U-*!1Lyg8?JK)Wga$=h7jI{?28Aa}7kM(cR!-0v>jL zXH-TNtFGe;{LsiVyj`rpS6$Y|r>Nu23;3Q-z>JfZGe6h#D|Pp&Em*iYReFZ_>|X@G zowH4xS{D~XBNf0P)|57JYi_TrLzWbdo1tC%s~Xd*KJ52zCW=g&;(Bl_MtDInwW%$`Yyqa5!{D`BX}TO2*2D#Q z=fMplr(i)k{AlD{4y?Hjog_&F9QiBi7~r#gP{6W;Q2C55xnylfaZ6CvHPpMlv?8uL zk@|a;9;~p7)%*+TM_UP$Mrnp_Zg8VA<~vbMneI zg7QF6;iZTBaR6g~mh5AlD}}mKYZg~X==v*i9eUq(;im&@>6k=G4n<|%DH&p-!jyy! z9|}SoJ(al|`!@JLidX#LEn9IBYiYjc3+I1h__7Z@i9f9>KX=R-xg4m!?0J;%+D-5& zwR9u&KpCHmOoF*27aYN3dv&tqu+q&an<;2AaelDymsRo?j(`-6yymQcrN_yets?Aw zXb8AUZu%;kf7a=2tr-SX)X|(xpkrS+=s1iSSnp|L=CQx}X}Wt??tZTTVX#)(|9a#8 zp9Koge`Y~F6-^5Z3qnFdkf`XOf?g(kvCX}XpWqMlQfqzf?M2Hn_Tv$;nXqI_WRw~N z&evQZ1iJ%uD<_NYb^>j`_5wV;(14^0$v7T+2Zwkdk3m@TPjMHQJscBg-)m|^_&yqi$S+R83kI`+nBy}n#c}*& ze|J0+>Vlf>$3bGkqYhHNJ9X%O#y{4E4cOzeS=zEDSWhx=Kj!S_91LhMPcqW>X7?ml zSYy4TAUu;Ea>pPhpf-lb7v4?O7>kAzu!vkz4=I@r=HR{#GK=nBVcPN@8p5SkX#K@! zVu}2zxh(#Z&v=xYl(?O+mECfPFe~8dWkG~VZ{9?kTD%C;czpHK?2FZap)$LJB6LpB+YG)Ew#E|Al7<$fl6Qmo z&3%9TYct>wyx?Fh;mMk(~1 zzee5-es=kz;_9RlEtt>(!6Gix4;^XZ^B>o{+$VrKa z2m{9((BN3vO7fw9NLZjncun_v!Abn%q4#<8>r-?V48I-UwvKUGdd6wMyVU1xBZ38rMl#s?aAuKb2Y+qNivj@CBCYiQThxf0$Q=U!E-WleCEQAXJXeYaKtV%lt#m8> zaF`hY^!CF4naKOUXEpr0pdZKcqeV%n^=i!o^}~RP0#&RW1`eDQyG*;G`!gmX6-_JI zUmP{vTSA&O-5Fa*=HICVh&{Wlj+y20uopA{Y-0dboV7Gup3N`lbB+SZQYC{``>N-{ zkciIpSEIZYZ58G5(J;l)!r<-unaj`zx5EOWnGvL95+?jI6od^YgzWMbJ}QPKdqJ61 zKB>#cY=@OyaeA|Z%B8b2-HFBisSYc~%HwP6(>+l{&PKyS0w3an8H&PsE)j&T#Yf~Vu86v*>Kv)~^2 zg7#GMDEElhE7$rZz?55w_+V)nQ3-qr4qX*fO!L*{mfWm z?I~df#AT-wE??>)!GY-qE6uar8(6o8F4VGM@8ozRmCo6KWhVodS2MV8x zLce)))TS}+A6-CdJGnEqG#OYZ9~O((ywkIi;2@s;$c?&}wA>gsWGCA9T*8}^4akUK zVE@rtcQ``w;C|C;9mVo1~W+>gRJ6Vnz{&ZkyjKBHFCnO=N;nM2= zEDDtw=9pVlu&GU*A0=l1#`eOjl~&wjb=gYu_U-IFexwPrl|eTAoKdhA<&r5IX`~S^ zFSyhtz>I*6`T69GZKR!EVmipYM{un(*>Ckt@MknV9sm|TX97H3Y_RW+3odgzL? zG5%ctX67w_-Yn`KJ&Dbg#ax6dHI-9A6QHC!BO$PBVIy#>HHGonGu+FyCw;tS1#?1`tnZkJi?kT@&OMvmGCOJtEB@71W1d_$2W4($8}Tr`X@18H zSMu4p3;1(~a%j}ze>7$68`S~fuor4ZC*wf@t3ylHL>1I_a=@4SKAUA01xZzrl{?=T zAnP^E$YFUA3x&NNA^P)_X#r1b$MQLch>sAC-}&dMxiO9C7uFPIw>?*?kB{6tT7&JR z=b9WV1qlF&->qlJKbUx`Fm|_zH_@Z9j_$P|{du-EhD!|C>VERnl_#b=0c@1bvhMOS zG*U@)N_%B^l%AdrKT==gOK)>K2j%>#Yo1659H3IBp z6#)Qc%G=s*kWq1fcrP3I$3pnug*u>`|2ft5zZe|<|33a}67v7UnE~X?pC@r(c9s@- ziQ4$<7}$Fdg27;a9RoY!NMNTt2kc7@=sI=tfPkDrr6hB;9Pz%lHC>SaadM&N-`2RU z58#bA+D-dxB#6=ewfV5QK}bU4{&PnYa8n|)WdbFqOH>O>OQS+UfcP9p{sv+PX=&*{ zJ0H8#r51D+wfu2)bwb$K*gktzEyI(OTwGjHbRyQK`an|o$(0D8w}yvt+1c4UQG@h8 ic~L^xWA&iH<2#JTB0)Ji5RhUIyk01(DOAguhW-mDoYqkQ literal 12169 zcmeIYWmH^Ew=Rk#K!TH?jRy_x78*$tLa^Z0I1M269fCHJ1PQLeg9K@u0156I z+}+N~yMOF)zOlb^&)9eWxno?$XnL($)m5`r)s*L%GyJWJJpN;<$7pD1_zJHf>S$=_ zaeqHJSU`(^tMCBug`ohE(eyyyq4FI?L*tSCd$-$;?vivGaDL5mue8qa$umw6vsPfg zJL7F#qDFH2>7eZz@3^eC7r)NL!RVZBk=~>^L9OFq67?)-&|4(E3|aA!+-)uRIzhy1 z#8E`C1eyB*|Ce38mqWchjduSecbd*#M&Xan9Mz-)JO*f-Ry(Op775wj6xmiOa}{T-ZlZ1cikm?xLcj;|DFpT(_P&wB8CAsAT@2c&Va7 zppmcCE+Q=4Jvm8XZf>rW4bI#gD|p7pXclF<^{Y@RQ~YCKAjZ7cHrL-B5yf(7zNY&dmRc$yt=;5$jHb~3yhIkO+-vg8H+?x z;{i>y6c7mH1uxLg!vttQY@=snTn>!qjL1DFG<4svBgTU4@f)^SNO+1t{iZL85B47w z+MMe{;pcRoQKyQ16&KCUuWL%pVPi&Ehfnb2aZp9NCSth>KGc&7z3sP|H8l$z-CVAn z7-2oX2NZrbTRw5yef9o}Fda&vrouk)T>RTwcMu+bM6~ zAEUeb&ns{1R-dBHDJw&sm1?HwBWUqmget16d4ld5W~*Viu9axy&IG%;OD)%%;QEgt z%4%+sPdi>g%JkiWr>EICK-$ZK_PN|ti(f3R()GsT=*R0nd>zbPTzO3K$L`ab37Ovo zZEcCMY~f&62~lMum#tGuwS8-s^mM=|+6L^8jm_tV(pU?xI8NWk5weiyI+bp&NdAo2 zb%LKQH`-Jr#8mFz)D7PswghBywx0T4{W#t6stQr>&ujG&s}suo>R~G(q$0r;>pnKK zPl6*~SfZzBC+Dv@!JacH(a+MOTQV^KNt~ZM z^Ww`bv3)G2DlEn^J>)|^*fnUP%ng%^2IRSC09)-4kXw>z`g?VM@O(oG!*T+wP9khr)Zq4iprpnnE!M|aGIrUG|9g!c~g45;L z&g|Z|cuO2d7C2?S{JciHXVjX_zBF?Ysl}nIeJTH-N}*Arc5K9o&+jlAY7=mMb?oAD zBd~Y+QIm%oHf;3w)D$uw-cpeRoC#Y-VrcEMVuxjAEZxaEh* zmgiYP8O+I5D01WC_3rLEYm-}|hbbY=qsWLYnC2@hUgRVyYmX_wz@C-lAmCbjxYqsX zXuBMKke#*mdXcQf(6H+>$j)g0_K}n)OK+6HG6Vz6-KB7+GcM&8x5C`7>vvy=qlaKJ zHl;k=A3xabg5&5ST?2pZxi#LO3SO4)f7(r(cr+)P4T{92P@-MUK0kNN%}uyC72c@F zH2gI&E02mttJ5sE?5dj46&yA@xGb2uyAYse*Be;gwwqr&8*3>_zsklt@{Y8*oR{pc zx4S!4+Vo2vqKQ4WW%;q}Kqi2na+hgSShl@5(Ng~Qa94lNh>F?q2Il6lFmwivyo_{M z)yH+bo@%HKxpvR1Kg-{*^7_qh|J?}-Wjx=nDlYy9zESOQ_e~cmbi$u0k+o6p8rWHe ziOi}F^Josdgv*8@l9g}=S>0}l^|uTzTzk1XBMO{U^3P4Rg>M8#=Nw2w>u_dg+8+5*F_bIO~f$NZ{6@+`!Y!mmq z)~+ybV7=rq;~83=5cQ(87x9cZEhE`tiD=~_Z{7Ti^2D8QQGZ_rT0cgJz|-IE6)**M zvW?DgvfPH#J8&Zb-djWMh%R}jUZzAmwDu!5W?|agP5AiHs?=|iO3#$Bb6&+1Nfl#v zI?O{N2L2QKcb_E;A#3I{le)x<&7!37ME%M3Io>uBLY3l-wTgZ^PX@0;*)OYiYrs#t z)|)Rr^WNogOpZ+bm``W>{Rt0S+?(<&WvssRF+v_H=)YB(=RblFpxDUd#<=D+q zJMWk%xw8|F*z$z$yMJ&$HbIw*r&vPUuf~vj;NKn~1LaHAvghpLZ!eFN}rh1;bL1QPj9k|ECF<6P7Gq56l+bx|wMGj`Rd7T67C$ZpJjHj%<(!`GWixI1*Jyv}C_0@O+SV2e=r!9uaQ6Se*!he`Mpsc$fyTPM?2IlU-M0La zbI7UshRoMj1U--;GEz^MY*BXnp-7@-8~PhX9DV3O75n3-ZS8`+GUT#BOk;WnVtn5>zX*XiH3;*B2|m1Z9lYR+gVJHjBXGk zQnl?U=mR#Ho0>m{iK7V-c?AUzE^cJ($HBP4z}B|z<%MdyNH}!jAvKh|g3~sVu(IMt zn9QnS5hGv{)7Fn)N#oeEkzi--@cR5n)Qa@uvDInx3nHGbAMLK_eyL3p<#~)IhiZ=l z^K||D^?WOKFgS7Jhnto5J4$Rt+h$LjJd=d?Y;=1&q76Lg$xNya`9^l=M;wV`3ldJ4 z_%%~P>IKPBl@)gLuqm=d-ko|xssz$h6xX-^huIC3C0kllHtahS;YotC8N`;m*Oj`$ zj+AMzB?j_rzuwq|N5hw5_HEl;KVK zgu^FpDieM_rFyjZJ_~hi}-v z1t=xdbaWwQ5(-TZu-Q4P+PE2^>S$Afy*2$^)T6zEdXI5J>^Q*#jBlwJjHVUEatuP)nByQSRD!-%~>E?PtgnN)By@OsW_-fNe_a)po zq_@-Y;RCbt3NIP-Tw1HaMqvUmL|DhCGgr)il&U*4(wU< ztHx^zmY%>qUSYcSstP+$RnSR+A$T!vXG%3eq38LR_pYSOc-5^-MznjBZEI$G(maIa z(B73^&b&2J2u74D{lI5kV!X4FIgz#xNDK07jm6kbc0xVrus@&K9_CKXd~937NPCd^ zJ?QPzJbseE0NU|6FU-2KZHA5yoE4lyl?Oqj^!k)v{7t=PrZ?di{xhoAeFm2u4kfuZ zXz|1N1?3-v@EQFj}w_dbgiu41xqiqX>U!gT%4=`h`Qv_?=|Y@Rg9-Md$6J1wQu z{@LsO7j&?`|3M(m!#VG%kzdk<8gim&X%Gp6^OrvfDS<;;5+e`7Zm2Wmk=XnG;X9nX zl8vNuxn$|7chgzo5ZPPbVPWC27&8GQbTc5(dNZrI(MVd~OZEJVOo^=0*_=<82g+f2)NQLwR@j!4F;wKfLEbuoWfwkcf5UcKA1 zPv6_lrx#7ph2h7(cz=8mLF&R!IhCa4U^+3&tuO45Z?|vcM!jnIP>wlx2Ink$GvYmBa`0jg3q?sqM&bSHH+oet@})Ae+FJKf7l#PbHagCY zJ$WEl<>^{R5|KvJxFps69Bs+oTeqhj#<-(jBel`S8)Icwz9^-&HV}jv1tD9j`Xj{?Vl;ZW&ZK;#D77iN~U-hfJPY^ zoi8cPdjMf}K&60zLix9e;r>)E9u3QBhHGy%ucGpEF8H zWrwet2a3gX0DV%0?Wh14=@iAMlp!1qr$#aSeQc3xGG&{5bAy0DR{MH}hgmZQ`A6`c z> zwsJG&1|}1`NEK9x_btn0J!|e8I1)Wv^ZQZq1FC{gv(}?{?eX56XJXEa{P%ItD)26| zg*%w|oa-YC&ZuEShOQ-H3vI5|wnxs#6;_5Qq#TDXd_qU8apO@VL9F8`Xvq;}Ja$kw z%;)l$IKDU`R-v8Y@;Jq0K9dufiIT6h;#rUJ4E5aFP_WPP!Tb<4)}vrgxd*c^TtH;*< zyIof{BM)+$yRGtizb-RNcxJjlQ(&23Fv|zxSG^szm%0s}!k*No7D);&_&Ezy+YNzk@rUa~;EQ<+ygM1a6J*@5&CgSlVPQ(XA-(hyEIjTHP)p{SR8ABO zu`lRWRycC&iAIO_SGsg)=2Ju>#nwc4n|R4p@DC#k^gXVAr*W3~#9{BZMrPn9y1W?a zS|T=CJWjt3mM+{YCJ$$~A4KlHsB}mz zpKl1ko|y05`Q&5kz3ds2wOpcsS75yCI6wI7ZY}5rkVs*F+hk#h7y>E70<#1)rzMfa zRP1*>8)&r`_CzER$54C3$LrxfnvPQ4XNLTZgb7H?X&)>Imy`Vd^nm+V_24 zRLCp;7Z3=G1YKgF@Cn>Li(7SCk__be&U#b1RQNDOCU z;Bt(pqlZiam*)9-n zzdj@;Qtk4GSzJFWr|z8h*sSdr%54X{7dhJL3ipaGxBG_TXq7S( zK0+T`rBuIj6N|jSsZLhk_D&y<(athzME;ckVsFHdE8+2eh8LH-J5|7&%(J8Xs4u{% z(TEZ@p8bHGZD0k6K1W;1BR8z(WIUZ{Ut(vO7&xH2BlcAyjuE`hQ71ofmYRtZhEI>S zz7oEQ5x{tQz|invfW0-wM|IzFnCGz`h08@(ti&IhhVbbOBI1Uv%lf{_B?(<$D{@tr z7cx3~hMiV3H`-^mcNU&PEt12>W;(cYDAmAn|Fo{^a4zGH8!;K@0MK3utY+KV&A~g2 zE>;C*c}PvBz0gh#!r@^ev;B14dQ1+7RawTP^%!RgV83RP1g!W1VyMMrot*emW_p&mvnKKD%EI7=w1Afh zcqSk77787J965dL%b+PZy9OA_g3kYB7XQ^HvP>qiYlyJU)U`ho%_&QUcVdo*w0s zLDYkOzzvCrr1;&S{8oEevn?zv9sqvm=IH1M2P;TZTRR~;dl+);^l%_kBBcSo@z-_G z{EKh;FGdi@G@6pS`{5HCLeX1pAEbaZxxAM;6O$I#+I5c@fVHX zIV0g5IK$yq#{ckQv(@73Rnr5W7Z>ut8|~y%QV)%dJ}8yK;Wb*g3PKBw&0Kurcs+AD zG~uwe6x>nJCk8pTGv1K;cDl0s^Lnuq;j^ZKMMRt?3I-1&eZ8jZM#rZV8HHZg(!UlZ z$t$uX{ar~!rW4UG?LgjZf{aj)RO~$|GvAC*neCIG`o^b%MjWpi8(Z8t)++i+!#$z{ zrQ-N$O5nJ#oO3A#WXTW4bSX9H_6aB1Giu7})}>JY?ow-;V-1sXd7+@3)#nzkd`6v>;bd{!ulPPl=BflRU`BfQ0DYT4QjAkAfW_e=YjGZ`(C{%%gS=@ zreZ_Vgs^&D?$gL>48^aw@?mF8l>ilZH8nNcw!Vj%8;XmQtW#B68RJnn*t&93UEL5c zIEVe3kerCK+``VB=1@HYj=bYe2MPc5q{nY}E&@i=SsJZ9aT8_=z!Vv2S|oP+#?8># zHG5|y{)8-YOUK;7NPc4;eOV|^7Z6Px5RHINqCM}ga8A_`Y#f0@XQeJ5%V7$7{_azG zoykegMj>S(q=I>5Zx%!a4u)`cb;Ths{ynDly)8Z;w8TfQABja7Y z!;^qrLL%n&{A;R7V|7&GFt`6LNO!`Kr|f%XXszTcXKT!oxvp*xf4|{8KR;FlZ{p%F z#IGN2?o2ECX|cnEfg}5vE?WlxINKu2fBfg#D_)Ci=OvYh}q=C?t#OE z$}AO_(1O3}Wqfj&vJ`((9RA?4O`2}bhsXvxnD816N3B};O_8H_YCJ)5WUU_)bDIR@Dyp(7>^cHP+iTs#6MrYk0g4C42ZK>1Z=W>)>sE3U*3qZfR+3pSOP?$=>{EJEmF&A^e)qG5$YqL6hO~lvm>C2~^a%)`t`C zmNDcqPhe)6z@9>#z-1)WR_ky;_rQHSX_rwcGYfLZ<4hx3#f3O}%{*^qb2}}|SNv(1 z-oaky@z<+?BH`5hnA~n`01G7X`e$F<8<^u4VX_TT3oPi)TQrHMoz4ll{M?oP4@IfB zwpMe#hZXUr2>+C~D(|0dqJz20p+z3gDiLN-HCpe}~cz3W&FAs#uiXR>sZ3);z^x99>@|u|3c=&1$ws+YIC9?_*M?6 zC;o|Ly)K(9?APaV80M}IrfAtefZnh&U>&LK;x^y%02WWXPH zT00&ks(nooVDx4-pS@95M(PT_5u{?KiYAGiPzMD;HjJ(e0aqwWrxPw=pV~_!GO$`z z`Q?{nBdrZwB2&5FT7@w2l$)`cD;%m8MRu6a* zEVY*d`MSi!f3jfzH+KC0+;P!7kVee;ulqTQh>T2o4Q9~=ye1>#(UkeWWZeF{b6uq7 z&U>uj->o~`g-jUxWgeyq*^o(Hv=agVP8J9;2vRXZaVsbtCqsADIvqBmUnXIvXva&`!tpFd>K4VeG zv;35ki;O6u+AA!}`L({4xcLP(MS%EC5N(APgpRD!V;>GofBGbia2_z-f#=1fS1 zl| z?ih-m35z}wo|}-aGaO8w8$L$JOTx$OO056nF2H7IHF+d|Rlp{sDy__;+G)-!t0dcs z#tnC-v{Z8(1Tws_M2DH@W>om~hZCF5Dy+-DGu?1*0=)Vt1DVt!fR`h}NzqV$3&|}?;0KjR zr@o6ICZWk3AY~0n7;GhSuW0~-%@r~%hFfv5iwqDfGkl}awk+xPH5e`E zgs>?p1%_S06?qJBZV|ST=X(B$YldW#4;lWs&Tw@iCcbo`0B@9hCb3mN$)n~T>>6yW zhYqYI!Y?0iau3QvEY$fBLwcXsaAgU;b7eA7b0=@EE$!d1((d${V85JHkt&Sp_eKUh zrHsHK*M)XgRiKfl9798}L;eoE!;6@oB7Q%vO)Od;kXPpuif!OFIyR%|paa_0E?GL% z^nWcXO%GKNjLWryOZZ??Vv$HpH8+rd)`GkwBd^+_XOMWwAK(6P_KtSCQ3LN8pj}HZ zaXM+uuFurd(}gR|J8pN-BHr|cYdKiBYelJNRGSHcYvb2LShVLyJ1eAmW<8$GY^4xY zwXIe`deK+TE?*Jp7)^c**yM)5C(WR8bbN zLj?cWp&G=cv%Z1Bq1olpT1{;&5K}%u{S)+>CNu)&1PV+fQ96wACgUYQtkctZ#HVn( zh%IFTD5mXnP55Cw(B-n7(AOVO2~HsNBX7NsySpmCrvmU8@_&>W`X7jMQA|QWiNlOT z>mWcZt(Zoc0(A$gtE<3jpP*1or)M(`09JmWyBgwv)nLG{`$Kw@<~B^I&p5UEv<-eY0{5E zsG$nMVR4JmRf4?ep8f#a-D8n?!R)Fu4ZyTQ5r|hntwcId*3j&+@!Mwyu?~xw>4K~; z^n7z8D9DtFVe-DXzME*cJ-b9$Ki3I&|KoQ?>BTQMV0>fv=7{F*+rFOfxKH|x!#&@G z@=M5S)q&G*(6epol|L1+pKT(0`b`lkE#0`^6;vK>b~PW&mQ%d& zP2lmde*WcU>vBW(X}l60YOt5}Ewo#?l5Ily-09PZIZxGb8q=qXy0m*{I^MpYkrGpB zcuwBG5&3z3eG5|9@%(@8Pq*<1qWPauKXaR-=V^8fZeQ7tGv?2Za7b4BBhlN|(psDeE?H@9!Lr`mT46{vs8`;3k_zQ5b? zH`Ox<cVU*h7iI8%ubD=MeT&_V*6ue!^nUZvNlNDojLr=dEZ_O6_C=d_v(_=qEkXsTCBY$*aF(%x^+hd$ z#g#gErs=Cv%7N7N70G179zhk})fj#wunkr6Fv?RbZsplR-;$4*zjwO(W!uq=E_i+e zQzaWb$d=-EG|Aw5HDG_&N_kuuh6pbNb^;ty+`jn)kEWj&NrTzlLtrK9g~0P(SISo% zTykIP=jmJ)#Y7o$+a-+^$cqhjy}Dd|b@>1RO^W_(B}=c3UlvaHMy)08F?PJ@BPH=^)z+q7Y-yy@Qgz@+C3+pque%YH~ zz^hAiXfcE~Q=+$|dMAj?iwDu9_MQ}qLCG{)A*=bkm*rBZg}QspYa>y}eR28GR=LqC zUG|jnvIp4sd3twE+v$U20j4V>v&B+(kL_JMx#2smsAIrmA2axE!Y^^g9Hw;M&PJX}#z@7nGPTj< zvBlh$F5{#Sck|^7($Xwi+?s&KNz~U%#IAP^(e~NGN$CD~UsWEm>YVDl&dKsgWC4+A zQ`UgRGmkh{E^An)0>Z`R|EQc&Qtzgyn&MpfIB3b&{n!5W1NQF&4Eb)8ZF6IwZGIYj~$jd3!_G=K1EveF_2U`T{pe6pH$iic-nEt_@naq_;@)B zSyg?U_t)tCl0Qt1c|na~59?2W_yd-yR%=)O>}Op_9w;aOu~*|0rfb7DMO&Wq$+>wj zsb0;H&k^5B9H6p=Yd_By)yMI*)ii#|PqYhKqZriI7Gpq^76{|E;NJ39pn+nm#2|qp56HsMu`5YTSKayW^X+ zA+eQ~VQ;SdlJ%B*Wj)_(^HT^{(_OeE$Q*C4KKA1-y7sp{v*9u?44;gtS%EfB?#+3( zgb}Z-*>9neAdcP|p`Qtk^+`(mEW#%b3k?kwegcwI2|&Lg2GZ#APeEY)y8DDyaby?n z1SOOCM{usi`0`>o}2e?oQ;>LX${Xv^I3duF7d%x(|3x(v_nTtRkCVi!NMc+qY8}rik<72 zX-2e0)sN~dpA`o&*cN1Kb~BSzh@vQ8$A1cQ4Cs>M#Km=VLdSKaq^0PFeQvNIIC137 zTwSb^vfv=EKWFjcpo2|xi=smyzV6^MtS@?JyKjzqsv2(Cyb|Q^W_YGNMEhZ;@?Z4~ zy5>nix?To6e%gj|oYZa3>Mjm*5G$6xXG>`4#R>0BnC&uV9!=h$-?oO@X7hl@k}$(wg=U0rI*-u-$DpQzrU!j3D}t?7}t3KC>0a|<$9%h zpgD6tr~&m2n0#rwVDv^~jK$5iKAT2bO+l=3D|)9aLhU_VJE|KcJUaWcv(F%%;tV?t zH-Ewk*A4c}Ei~mWG1JI>uUs`o)aGBnzfG@d&{T&N{ z$({Zqx@9S}v6C_yth)Uh9rG)xH)$_O=g_Adrt2+QO%#EMh~vZ8%o7@YwZZpS9RP6b zS+)2d!q5M{2KK*;$p8Nl|Myzr{|~;$)R7T2z!i6!ySP04k1PbFd!;k{Nh*+4|EC>D zDF^_mb0Dn^9K%bdzs2HIR6qWLkO?Die89=8E`OUaS~=MqO9k>72i+hCUVi>S;M}4p zDJf0gy$b_cO`M&bQ~6kKZolNMOib(|ithpeekCt2=5@m6 z&~nN0;lqc&xqARz0p;ERgt`Og} From 84a35e7d8276aae7d72cd7306badd43af860d170 Mon Sep 17 00:00:00 2001 From: dmlvr Date: Mon, 16 Feb 2026 16:11:12 +0200 Subject: [PATCH 10/16] update treeview styles --- .../scss/widgets/fluent/treeView/_colors.scss | 14 +++++++------- .../scss/widgets/fluent/treeView/_index.scss | 8 ++++---- .../scss/widgets/generic/treeView/_colors.scss | 2 +- .../scss/widgets/generic/treeView/_index.scss | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss b/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss index 2d9199dad8c0..23b658311c8e 100644 --- a/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/fluent/treeView/_colors.scss @@ -19,19 +19,19 @@ $treeview-item-selected-color: $treeview-color !default; $treeview-item-selected-bg: $base-selected-bg !default; $treeview-spin-icon-color: $base-spin-icon-color !default; $checkbox-border-color-focused: $base-accent-active !default; -$checkbox-disabled-border-color-focused: null !default; -$checkbox-disabled-background-focused: null !default; +$treeview-checkbox-disabled-border-color-focused: null !default; +$treeview-checkbox-disabled-background-focused: null !default; $treeview-item-content-disabled: null !default; - @if $mode == "light" { $treeview-item-content-disabled: color.scale($base-bg, $lightness: -25.88%); - $checkbox-disabled-border-color-focused: color.scale($base-bg, $lightness: -29.8%); - $checkbox-disabled-background-focused: color.scale($base-bg, $lightness: -7.84%); + $treeview-checkbox-disabled-border-color-focused: color.scale($base-bg, $lightness: -29.8%); + $treeview-checkbox-disabled-background-focused: color.scale($base-bg, $lightness: -7.84%); } @if $mode == "dark" { $treeview-item-content-disabled: color.change($base-bg, $lightness: 36.08%, $space: hsl); - $checkbox-disabled-border-color-focused: color.change($base-bg, $lightness: 70.2%, $space: hsl); - $checkbox-disabled-background-focused: color.change($base-bg, $lightness: 92.16%, $space: hsl); + $treeview-checkbox-disabled-border-color-focused: color.change($base-bg, $lightness: 41.96%, $space: hsl); + $treeview-checkbox-disabled-background-focused: color.change($base-bg, $lightness: 21.96%, $space: hsl); } + diff --git a/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss b/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss index 03cdeeb86cd6..ca5c959e62b2 100644 --- a/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss +++ b/packages/devextreme-scss/scss/widgets/fluent/treeView/_index.scss @@ -35,19 +35,19 @@ .dx-checkbox.dx-state-disabled { .dx-checkbox-icon { - background-color: $checkbox-disabled-background-focused; - border-color: $checkbox-disabled-border-color-focused; + background-color: $treeview-checkbox-disabled-background-focused; + border-color: $treeview-checkbox-disabled-border-color-focused; } &.dx-checkbox-checked { .dx-checkbox-icon { - color: $checkbox-disabled-border-color-focused; + color: $treeview-checkbox-disabled-border-color-focused; } } &.dx-checkbox-indeterminate { .dx-checkbox-icon::before { - background-color: $checkbox-disabled-border-color-focused; + background-color: $treeview-checkbox-disabled-border-color-focused; } } } diff --git a/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss b/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss index abe822f72a36..1e8d0e4649ce 100644 --- a/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/generic/treeView/_colors.scss @@ -144,4 +144,4 @@ $generic-treeview-focused-row-load-indicator-color: #fff; $treeview-item-selected-hover-bg: color.change(#000, $alpha: 0.15) !default; $treeview-spin-icon-color: $base-icon-color !default; $treeview-item-content-disabled: color.adjust($base-text-color, $lightness: 40%, $space: hsl); -} \ No newline at end of file +} diff --git a/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss b/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss index 768db54a3ae8..b27d7dec6d23 100644 --- a/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss +++ b/packages/devextreme-scss/scss/widgets/generic/treeView/_index.scss @@ -84,4 +84,4 @@ .dx-treeview-item-content.dx-state-disabled { color: $treeview-item-content-disabled; -} \ No newline at end of file +} From faa80644cc99c708485b55f2ea2678f0a875798e Mon Sep 17 00:00:00 2001 From: dmlvr Date: Mon, 16 Feb 2026 17:01:56 +0200 Subject: [PATCH 11/16] update form equal method to strickEqual in QUnit tests --- .../treeView.expanded.tests.js | 66 +++--- .../treeView.markup.tests.js | 78 +++---- .../treeView.virtualMode.tests.js | 194 +++++++++--------- .../treeViewParts/keyboardNavigation.js | 50 ++--- .../treeViewParts/optionChanged.js | 14 +- 5 files changed, 201 insertions(+), 201 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js index ec19bf2ac0e2..660d358f0e7b 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js @@ -54,7 +54,7 @@ module('Expanded items', { items: data }); - assert.equal($treeView.find(`.${TREEVIEW_NODE_CONTAINER_OPENED_CLASS}`).length, 3); + assert.strictEqual($treeView.find(`.${TREEVIEW_NODE_CONTAINER_OPENED_CLASS}`).length, 3); }); test('expansion by itemData', function(assert) { @@ -85,7 +85,7 @@ module('Expanded items', { const done = assert.async(); treeView.expandItem($firstItem.get(0)).done(() => { assert.ok('expand is success'); done(); }); - assert.equal($treeView.find(`.${TREEVIEW_NODE_CONTAINER_OPENED_CLASS}`).length, 1); + assert.strictEqual($treeView.find(`.${TREEVIEW_NODE_CONTAINER_OPENED_CLASS}`).length, 1); assert.ok(itemExpandedHandler.calledOnce); const args = itemExpandedHandler.getCall(0).args[0]; @@ -104,7 +104,7 @@ module('Expanded items', { deferRendering: false }); - assert.equal($treeView.find('.dx-treeview-node').length, 3, 'all items have been rendered'); + assert.strictEqual($treeView.find('.dx-treeview-node').length, 3, 'all items have been rendered'); }); test('onContentReady rises after first expand', function(assert) { @@ -120,11 +120,11 @@ module('Expanded items', { const done = assert.async(3); treeView.expandItem($firstItem.get(0)).done(() => { assert.ok('expand is success'); done(); }); - assert.equal(onContentReadyHandler.callCount, 2); + assert.strictEqual(onContentReadyHandler.callCount, 2); treeView.collapseItem($firstItem.get(0)).done(() => { assert.ok('expand is success'); done(); }); treeView.expandItem($firstItem.get(0)).done(() => { assert.ok('collapse is success'); done(); }); - assert.equal(onContentReadyHandler.callCount, 2); + assert.strictEqual(onContentReadyHandler.callCount, 2); }); test('onItemExpanded callback after click should have correct arguments', function(assert) { @@ -165,7 +165,7 @@ module('Expanded items', { const done = assert.async(); treeView.collapseItem($firstItem).done(() => { assert.ok('expand is success'); done(); }); - assert.equal($treeView.find(`.${TREEVIEW_NODE_CONTAINER_OPENED_CLASS}`).length, 1); + assert.strictEqual($treeView.find(`.${TREEVIEW_NODE_CONTAINER_OPENED_CLASS}`).length, 1); assert.ok(itemCollapsedHandler.calledOnce); const args = itemCollapsedHandler.getCall(0).args[0]; @@ -454,7 +454,7 @@ module('Expanded items', { $item.trigger('dxclick'); - assert.equal(itemExpanded, 0, 'event was not fired'); + assert.strictEqual(itemExpanded, 0, 'event was not fired'); }); test('not expand parent items in non-recursive case', function(assert) { @@ -469,7 +469,7 @@ module('Expanded items', { treeView.expandItem(11).done(() => { assert.ok('expand is success'); done(); }); let $items = $treeView.find('.dx-treeview-node'); - assert.equal($items.length, 1, 'root item was expanded'); + assert.strictEqual($items.length, 1, 'root item was expanded'); const nodes = treeView.getNodes(); assert.notOk(nodes[0].expanded, 'root node is collapsed'); @@ -477,7 +477,7 @@ module('Expanded items', { treeView.expandItem(1).done(() => { assert.ok('expand is success'); done(); }); $items = $treeView.find('.dx-treeview-node'); - assert.equal($items.length, 3, 'root item was expanded'); + assert.strictEqual($items.length, 3, 'root item was expanded'); }); test('expand parent items in recursive case', function(assert) { @@ -491,7 +491,7 @@ module('Expanded items', { treeView.expandItem(11).done(() => { assert.ok('expand is success'); done(); }); const $items = $treeView.find('.dx-treeview-node'); - assert.equal($items.length, 3, 'root item was expanded'); + assert.strictEqual($items.length, 3, 'root item was expanded'); const nodes = treeView.getNodes(); assert.ok(nodes[0].expanded, 'root node is expanded'); @@ -573,7 +573,7 @@ module('Expanded items', { treeView.expandItem(11).done(() => { assert.ok('expand is success'); done(); }); const $items = $treeView.find('.dx-treeview-node'); - assert.equal($items.length, 2, 'root item was expanded'); + assert.strictEqual($items.length, 2, 'root item was expanded'); const nodes = treeView.getNodes(); assert.ok(nodes[0].expanded, 'root node is expanded'); @@ -676,15 +676,15 @@ module('Expanded items', { const $node2 = $nodes.eq(1); const $node3 = $nodes.eq(2); - assert.equal($nodes.length, 3, 'nodes count'); + assert.strictEqual($nodes.length, 3, 'nodes count'); assert.ok(isNodeExpanded($node1), 'first node is expanded'); - assert.equal(getNodeItemId($node1), 1, 'id for first node'); + assert.strictEqual(getNodeItemId($node1), 1, 'id for first node'); assert.ok(isNodeExpanded($node2), 'second node is expanded'); - assert.equal(getNodeItemId($node2), 11, 'id for second node'); + assert.strictEqual(getNodeItemId($node2), 11, 'id for second node'); assert.ok(isNodeExpanded($node3), 'third node is expanded'); - assert.equal(getNodeItemId($node3), 111, 'id for third node'); + assert.strictEqual(getNodeItemId($node3), 111, 'id for third node'); }); test('Disabled item should expand when using the expandAll method and the expandNodesRecursive is enabled', function(assert) { @@ -713,15 +713,15 @@ module('Expanded items', { const $node2 = $nodes.eq(1); const $node3 = $nodes.eq(2); - assert.equal($nodes.length, 3, 'nodes count'); + assert.strictEqual($nodes.length, 3, 'nodes count'); assert.ok(isNodeExpanded($node1), 'first node is expanded'); - assert.equal(getNodeItemId($node1), 1, 'id for first node'); + assert.strictEqual(getNodeItemId($node1), 1, 'id for first node'); assert.ok(isNodeExpanded($node2), 'second node is expanded'); - assert.equal(getNodeItemId($node2), 11, 'id for second node'); + assert.strictEqual(getNodeItemId($node2), 11, 'id for second node'); assert.ok(isNodeExpanded($node3), 'third node is expanded'); - assert.equal(getNodeItemId($node3), 111, 'id for third node'); + assert.strictEqual(getNodeItemId($node3), 111, 'id for third node'); }); test('Expand all items when the expandNodesRecursive is enabled', function(assert) { @@ -749,15 +749,15 @@ module('Expanded items', { const $node2 = $nodes.eq(1); const $node3 = $nodes.eq(2); - assert.equal($nodes.length, 3, 'nodes count'); + assert.strictEqual($nodes.length, 3, 'nodes count'); assert.ok(isNodeExpanded($node1), 'first node is expanded'); - assert.equal(getNodeItemId($node1), 1, 'id for first node'); + assert.strictEqual(getNodeItemId($node1), 1, 'id for first node'); assert.ok(isNodeExpanded($node2), 'second node is expanded'); - assert.equal(getNodeItemId($node2), 11, 'id for second node'); + assert.strictEqual(getNodeItemId($node2), 11, 'id for second node'); assert.ok(isNodeExpanded($node3), 'third node is expanded'); - assert.equal(getNodeItemId($node3), 111, 'id for third node'); + assert.strictEqual(getNodeItemId($node3), 111, 'id for third node'); }); test('Content ready event is thrown once when the expandAll is called', function(assert) { @@ -912,8 +912,8 @@ module('Expanded items', { const $item2 = wrapper.getElement().find('[aria-level="2"]'); assert.notEqual(wrapper.instance, undefined); - assert.equal($item1.is(':visible'), true); - assert.equal($item2.is(':visible'), expanded); + assert.strictEqual($item1.is(':visible'), true); + assert.strictEqual($item2.is(':visible'), expanded); wrapper.instance.dispose(); }); }); @@ -930,7 +930,7 @@ module('Expanded items', { wrapper.instance.expandItem(argumentGetter($item1)).done(() => { assert.ok('expand is success'); done(); }); const $item1_1 = wrapper.getElement().find('[aria-level="2"]'); - assert.equal($item1_1.is(':visible'), true); + assert.strictEqual($item1_1.is(':visible'), true); wrapper.instance.dispose(); } @@ -955,8 +955,8 @@ module('Expanded items', { wrapper.instance.expandAll(); const $item1_1 = wrapper.getElement().find('[aria-level="2"]'); - assert.equal($item1_1.length, 1); - assert.equal($item1_1.is(':visible'), true); + assert.strictEqual($item1_1.length, 1); + assert.strictEqual($item1_1.is(':visible'), true); wrapper.instance.dispose(); }); @@ -972,9 +972,9 @@ module('Expanded items', { const $item1_1 = wrapper.getElement().find('[aria-level="2"]'); if(expanded) { - assert.equal($item1_1.is(':hidden'), true); + assert.strictEqual($item1_1.is(':hidden'), true); } else { - assert.equal($item1_1.length, 0); + assert.strictEqual($item1_1.length, 0); } wrapper.instance.dispose(); } @@ -1000,8 +1000,8 @@ module('Expanded items', { wrapper.instance.collapseAll(); const $item1_1 = wrapper.getElement().find('[aria-level="2"]'); - assert.equal($item1_1.length, 1); - assert.equal($item1_1.is(':hidden'), true); + assert.strictEqual($item1_1.length, 1); + assert.strictEqual($item1_1.is(':hidden'), true); wrapper.instance.dispose(); }); }); @@ -1019,7 +1019,7 @@ module('Expanded items', { wrapper.instance.expandItem(1); const item1_1 = wrapper.getElement().find('[data-item-id="2"]'); - assert.equal(item1_1.length, 1, 'item1_1 is rendered'); + assert.strictEqual(item1_1.length, 1, 'item1_1 is rendered'); }); function createOptions(options, items) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js index 5e7d8fd40f15..8564f49a1351 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.markup.tests.js @@ -65,15 +65,15 @@ QUnit.module('aria accessibility', { QUnit.test('aria role for items', function(assert) { const $node = this.$element.find('.' + NODE_CLASS); - assert.equal($node.attr('role'), 'treeitem', 'role is correct'); + assert.strictEqual($node.attr('role'), 'treeitem', 'role is correct'); }); QUnit.test('aria label for items', function(assert) { const $node1 = this.$element.find('.' + NODE_CLASS).eq(0); const $node2 = this.$element.find('.' + NODE_CLASS).eq(1); - assert.equal($node1.attr('aria-label'), 'Item 1', 'label for 1st item is correct'); - assert.equal($node2.attr('aria-label'), 'Item 11', 'label for 2nd ite is correct'); + assert.strictEqual($node1.attr('aria-label'), 'Item 1', 'label for 1st item is correct'); + assert.strictEqual($node2.attr('aria-label'), 'Item 11', 'label for 2nd ite is correct'); }); QUnit.test('aria-label for selectAll checkbox should be localized (T1299342)', function(assert) { @@ -102,27 +102,27 @@ QUnit.module('aria accessibility', { QUnit.test('aria role for item levels', function(assert) { const $node = this.$element.find('.' + NODE_CONTAINER_CLASS); - assert.equal($node.attr('role'), 'group', 'role is correct'); + assert.strictEqual($node.attr('role'), 'group', 'role is correct'); }); QUnit.test('aria expanded for items', function(assert) { const $node = this.$element.find('.' + NODE_CLASS).eq(0); - assert.equal($node.attr('aria-expanded'), 'true', 'expanded item has aria-expanded as true'); + assert.strictEqual($node.attr('aria-expanded'), 'true', 'expanded item has aria-expanded as true'); }); QUnit.test('aria level for items', function(assert) { const $node1 = this.$element.find('.' + NODE_CLASS).eq(0); const $node2 = this.$element.find('.' + NODE_CLASS).eq(1); - assert.equal($node1.attr('aria-level'), '1', 'level set correct'); - assert.equal($node2.attr('aria-level'), '2', 'level set correct'); + assert.strictEqual($node1.attr('aria-level'), '1', 'level set correct'); + assert.strictEqual($node2.attr('aria-level'), '2', 'level set correct'); }); QUnit.test('aria selected for items', function(assert) { const $node = this.$element.find('.' + NODE_CLASS).eq(0); - assert.equal($node.attr('aria-selected'), 'true', 'item is selected'); + assert.strictEqual($node.attr('aria-selected'), 'true', 'item is selected'); }); }); @@ -222,7 +222,7 @@ QUnit.module('markup', { treeView.option('expandIcon', null); treeView.option('collapseIcon', null); - assert.equal($(`.${TOGGLE_ITEM_VISIBILITY_CLASS}`).length, 2); + assert.strictEqual($(`.${TOGGLE_ITEM_VISIBILITY_CLASS}`).length, 2); }); QUnit.test('icons should not be rendered if plain items are used', function(assert) { @@ -232,8 +232,8 @@ QUnit.module('markup', { collapseIcon: 'add', }); - assert.equal($(CUSTOM_EXPAND_ICON_CLASS_SELECTOR).length, 0); - assert.equal($(CUSTOM_COLLAPSE_ICON_CLASS_SELECTOR).length, 0); + assert.strictEqual($(CUSTOM_EXPAND_ICON_CLASS_SELECTOR).length, 0); + assert.strictEqual($(CUSTOM_COLLAPSE_ICON_CLASS_SELECTOR).length, 0); }); QUnit.test('expand icon should be shown if node is collapsed', function(assert) { @@ -286,7 +286,7 @@ QUnit.module('markup', { }); const $scrollableContent = $treeView.find('.dx-scrollable-content'); - assert.equal($scrollableContent.find('.dx-empty-message').length, 1, 'empty message should be shown inside scrollable content'); + assert.strictEqual($scrollableContent.find('.dx-empty-message').length, 1, 'empty message should be shown inside scrollable content'); }); QUnit.test('data expressions should work on render', function(assert) { @@ -321,11 +321,11 @@ QUnit.module('markup', { const $nodeContainer = $node.children('.' + NODE_CONTAINER_CLASS).eq(0); const $item = $node.children('.' + ITEM_CLASS).eq(0); - assert.equal($node.data('item-id'), '2', 'keyExpr works'); - assert.equal($item.text(), 'Item 1', 'displayExpr works'); + assert.strictEqual($node.data('item-id'), 2, 'keyExpr works'); + assert.strictEqual($item.text(), 'Item 1', 'displayExpr works'); assert.ok($node.hasClass(SELECTED_STATE_CLASS), 'selectedExpr works'); assert.ok($nodeContainer.hasClass(OPENED_NODE_CONTAINER_CLASS), 'expandedExpr works'); - assert.equal($node.find('.' + NODE_CLASS).length, 1, 'parentIdExpr works'); + assert.strictEqual($node.find('.' + NODE_CLASS).length, 1, 'parentIdExpr works'); }); QUnit.test('TreeView should has a right class', function(assert) { @@ -348,7 +348,7 @@ QUnit.module('markup', { const $treeView = initTree({ items: [{ key: 1, text: 'Item' }] }); - assert.equal($treeView.find('.' + NODE_CONTAINER_CLASS).length, 1); + assert.strictEqual($treeView.find('.' + NODE_CONTAINER_CLASS).length, 1); }); QUnit.test('Render html item', function(assert) { @@ -359,7 +359,7 @@ QUnit.module('markup', { const $node = $itemContainer.find('.' + NODE_CLASS).eq(0); const $item = $node.find('.' + ITEM_CLASS); - assert.equal($item.text(), 'Hello', 'created'); + assert.strictEqual($item.text(), 'Hello', 'created'); }); QUnit.test('Render first level items', function(assert) { @@ -371,10 +371,10 @@ QUnit.module('markup', { const $nodes = $itemContainer.find('.' + NODE_CLASS); const $items = $nodes.find('.' + ITEM_CLASS); - assert.equal($items.length, 16); - assert.equal($($items[0]).find('span').text(), 'Animals'); - assert.equal($($items[1]).find('span').text(), 'Cat'); - assert.equal($($items[2]).find('span').text(), 'Dog'); + assert.strictEqual($items.length, 16); + assert.strictEqual($($items[0]).find('span').text(), 'Animals'); + assert.strictEqual($($items[1]).find('span').text(), 'Cat'); + assert.strictEqual($($items[2]).find('span').text(), 'Dog'); }); QUnit.test('Render items with parentId set as tree', function(assert) { @@ -384,7 +384,7 @@ QUnit.module('markup', { }); const $items = $treeView.find('.' + ITEM_CLASS); - assert.equal($items.length, 16); + assert.strictEqual($items.length, 16); }); QUnit.test('Render nested items', function(assert) { @@ -420,8 +420,8 @@ QUnit.module('markup', { const $rootNodeFirstItem = $rootNode.find('.' + NODE_CLASS).eq(0); const $rootNodeSecondItem = $rootNode.find('.' + NODE_CLASS).eq(1); - assert.equal($rootNodeFirstItem.find('.' + TOGGLE_ITEM_VISIBILITY_CLASS).length, 1); - assert.equal($rootNodeSecondItem.find('.' + TOGGLE_ITEM_VISIBILITY_CLASS).length, 0); + assert.strictEqual($rootNodeFirstItem.find('.' + TOGGLE_ITEM_VISIBILITY_CLASS).length, 1); + assert.strictEqual($rootNodeSecondItem.find('.' + TOGGLE_ITEM_VISIBILITY_CLASS).length, 0); }); QUnit.test('Not add disabled class for toggle icon if item is disabled', function(assert) { @@ -448,8 +448,8 @@ QUnit.module('markup', { showCheckBoxesMode: 'normal' }); - assert.equal($treeView.find('.' + NODE_CLASS).find('.dx-checkbox').length, 4); - assert.equal($treeView.find('.' + NODE_CLASS + '.' + ITEM_WITH_CHECKBOX_CLASS).length, 4); + assert.strictEqual($treeView.find('.' + NODE_CLASS).find('.dx-checkbox').length, 4); + assert.strictEqual($treeView.find('.' + NODE_CLASS + '.' + ITEM_WITH_CHECKBOX_CLASS).length, 4); }); QUnit.test('Render tree by id/parentId fields', function(assert) { @@ -469,12 +469,12 @@ QUnit.module('markup', { const $rootNode = $treeView.find('.' + NODE_CONTAINER_CLASS + ':first'); const $rootNodeItems = $rootNode.find(' > .' + NODE_CLASS); - assert.equal($treeView.find('.' + NODE_CONTAINER_CLASS).length, 5); - assert.equal($rootNodeItems.length, 3); - assert.equal($rootNodeItems.eq(0).find('> .' + ITEM_CLASS + ' span').text(), 'Animals'); - assert.equal($rootNodeItems.eq(1).find('> .' + ITEM_CLASS + ' span').text(), 'Birds'); - assert.equal($rootNodeItems.eq(0).find('> .' + NODE_CONTAINER_CLASS).find('> .' + NODE_CLASS).length, 3); - assert.equal($rootNodeItems.eq(1).find('> .' + NODE_CONTAINER_CLASS).find('> .' + NODE_CLASS).length, 3); + assert.strictEqual($treeView.find('.' + NODE_CONTAINER_CLASS).length, 5); + assert.strictEqual($rootNodeItems.length, 3); + assert.strictEqual($rootNodeItems.eq(0).find('> .' + ITEM_CLASS + ' span').text(), 'Animals'); + assert.strictEqual($rootNodeItems.eq(1).find('> .' + ITEM_CLASS + ' span').text(), 'Birds'); + assert.strictEqual($rootNodeItems.eq(0).find('> .' + NODE_CONTAINER_CLASS).find('> .' + NODE_CLASS).length, 3); + assert.strictEqual($rootNodeItems.eq(1).find('> .' + NODE_CONTAINER_CLASS).find('> .' + NODE_CLASS).length, 3); }); QUnit.test('Custom item template', function(assert) { @@ -489,8 +489,8 @@ QUnit.module('markup', { const $firstRootNode = $rootNodeContainer.find('li').first(); const $firstItem = $firstRootNode.find('> .' + ITEM_CLASS); - assert.equal($firstItem.length, 1); - assert.equal($firstItem.text(), 'Item 1'); + assert.strictEqual($firstItem.length, 1); + assert.strictEqual($firstItem.text(), 'Item 1'); }); QUnit.test('scroll direction by default is vertical', function(assert) { @@ -498,7 +498,7 @@ QUnit.module('markup', { items: this.treeItems, }).dxTreeView('instance'); - assert.equal(treeView.getScrollable().option('direction'), 'vertical'); + assert.strictEqual(treeView.getScrollable().option('direction'), 'vertical'); }); QUnit.test('custom scroll direction', function(assert) { @@ -507,7 +507,7 @@ QUnit.module('markup', { scrollDirection: 'both' }).dxTreeView('instance'); - assert.equal(treeView.getScrollable().option('direction'), 'both'); + assert.strictEqual(treeView.getScrollable().option('direction'), 'both'); }); QUnit.test('Disabled class is not added when disabledExpr is used', function(assert) { @@ -541,7 +541,7 @@ QUnit.module('markup', { }); const $icons = $treeView.find('.' + TOGGLE_ITEM_VISIBILITY_CLASS); - assert.equal($icons.length, 1, 'only one icon should be rendered'); + assert.strictEqual($icons.length, 1, 'only one icon should be rendered'); }); QUnit.test('Render Search editor', function(assert) { @@ -584,7 +584,7 @@ QUnit.module('markup', { const expectedValues = ['Bikes', 'Stels', 'Cars', 'Audi', 'BMW', 'Motobikes', 'Honda', 'Yamaha']; $.each($items, function(index, item) { - assert.equal($(item).text(), expectedValues[index], 'Correct item'); + assert.strictEqual($(item).text(), expectedValues[index], 'Correct item'); }); }); @@ -595,7 +595,7 @@ QUnit.module('markup', { }); const $selectAll = $treeView.find('.' + SELECT_ALL_ITEM_CLASS); - assert.equal($selectAll.length, 1); + assert.strictEqual($selectAll.length, 1); }); QUnit.test('On initialization selectAll item should be selected if all items are selected', function(assert) { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js index 75d022ac74ad..ba312b3db77b 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.virtualMode.tests.js @@ -49,7 +49,7 @@ QUnit.test('All nodes should be rendered by default', function(assert) { }); const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 3); + assert.strictEqual(items.length, 3); }); QUnit.test('Only root nodes should be rendered in virtualMode', function(assert) { @@ -61,8 +61,8 @@ QUnit.test('Only root nodes should be rendered in virtualMode', function(assert) const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 3); - assert.equal(treeView.option('items').length, 3); + assert.strictEqual(items.length, 3); + assert.strictEqual(treeView.option('items').length, 3); }); QUnit.test('Render expanded node in virtualMode', function(assert) { @@ -77,8 +77,8 @@ QUnit.test('Render expanded node in virtualMode', function(assert) { const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 6); - assert.equal(treeView.option('items').length, 6); + assert.strictEqual(items.length, 6); + assert.strictEqual(treeView.option('items').length, 6); }); QUnit.test('Ignore virtual mode if dataStructure is set to \'tree\'', function(assert) { @@ -90,7 +90,7 @@ QUnit.test('Ignore virtual mode if dataStructure is set to \'tree\'', function(a const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 16); + assert.strictEqual(items.length, 16); }); QUnit.test('Root nodes should not have leaf class', function(assert) { @@ -120,8 +120,8 @@ QUnit.test('Render second level in virtualMode after click on icon', function(as $icon.trigger('dxclick'); const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 6); - assert.equal(treeView.option('items').length, 6); + assert.strictEqual(items.length, 6); + assert.strictEqual(treeView.option('items').length, 6); // T378648 const $itemsContainer = $icon.parent().siblings(`.${internals.NODE_CONTAINER_CLASS}`); @@ -142,8 +142,8 @@ QUnit.test('Render second level in virtualMode after expand by api', function(as treeView.expandItem(1); const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 6); - assert.equal(treeView.option('items').length, 6); + assert.strictEqual(items.length, 6); + assert.strictEqual(treeView.option('items').length, 6); }); QUnit.test('Render second level in virtualMode with parentIdExpr', function(assert) { @@ -157,8 +157,8 @@ QUnit.test('Render second level in virtualMode with parentIdExpr', function(asse treeView.expandItem(1); const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 3); - assert.equal(treeView.option('items').length, 3); + assert.strictEqual(items.length, 3); + assert.strictEqual(treeView.option('items').length, 3); }); QUnit.test('DataSource should contain root items and second level after expand with custom root value', function(assert) { @@ -179,8 +179,8 @@ QUnit.test('DataSource should contain root items and second level after expand w treeView.expandItem(1); const items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 5); - assert.equal(treeView.option('items').length, 5); + assert.strictEqual(items.length, 5); + assert.strictEqual(treeView.option('items').length, 5); }); QUnit.test('Render toggle icon everywhen', function(assert) { @@ -192,7 +192,7 @@ QUnit.test('Render toggle icon everywhen', function(assert) { const $icons = this.$element.find('.' + internals.TOGGLE_ITEM_VISIBILITY_CLASS); - assert.equal($icons.length, 3); + assert.strictEqual($icons.length, 3); }); QUnit.test('Remove toggle icon after expand childless item', function(assert) { @@ -205,7 +205,7 @@ QUnit.test('Remove toggle icon after expand childless item', function(assert) { treeView.expandItem(16); const $icons = this.$element.find('.' + internals.TOGGLE_ITEM_VISIBILITY_CLASS); - assert.equal($icons.length, 2); + assert.strictEqual($icons.length, 2); }); QUnit.test('No custom expander icons should be visible after expand childless item', function(assert) { @@ -233,7 +233,7 @@ QUnit.test('Remove loadindicator after expand childless item', function(assert) const $node = this.$element.find(`.${TREEVIEW_NODE_CLASS}`).eq(2); $node.find('.' + internals.TOGGLE_ITEM_VISIBILITY_CLASS).trigger('dxclick'); - assert.equal($node.find('.dx-treeview-node-loadindicator').length, 1); + assert.strictEqual($node.find('.dx-treeview-node-loadindicator').length, 1); this.clock.tick(400); assert.ok($node.find('.dx-treeview-node-loadindicator').is(':hidden')); @@ -251,7 +251,7 @@ QUnit.test('Remove loadindicator after expand childless item on dblclick', funct const $node = this.$element.find(`.${TREEVIEW_NODE_CLASS}`).eq(2); $node.find(`.${TREEVIEW_ITEM_CLASS}`).trigger(dblclickEvent.name); - assert.equal($node.find('.dx-loadindicator').length, 1); + assert.strictEqual($node.find('.dx-loadindicator').length, 1); this.clock.tick(400); assert.ok($node.find('.dx-loadindicator').is(':hidden')); @@ -272,7 +272,7 @@ QUnit.test('Don\'t create loadindicator on dblclick after expand childless item const $node = this.$element.find(`.${TREEVIEW_NODE_CLASS}`).eq(2); $node.find(`.${TREEVIEW_ITEM_CLASS}`).trigger(dblclickEvent.name); - assert.equal($node.find('.dx-loadindicator').length, 0); + assert.strictEqual($node.find('.dx-loadindicator').length, 0); }); QUnit.test('Create loadindicator when disabled item expands', function(assert) { @@ -290,7 +290,7 @@ QUnit.test('Create loadindicator when disabled item expands', function(assert) { const $node = this.$element.find(`.${TREEVIEW_NODE_CLASS}`).eq(2); $node.find('.dx-treeview-toggle-item-visibility').trigger('dxclick'); - assert.equal($node.find('.dx-loadindicator').length, 1); + assert.strictEqual($node.find('.dx-loadindicator').length, 1); }); QUnit.test('Add leaf class after expand childless item', function(assert) { @@ -317,7 +317,7 @@ QUnit.test('Don\'t render toggle icon if item.hasItems is false', function(asser }); const icons = this.$element.find('.' + internals.TOGGLE_ITEM_VISIBILITY_CLASS); - assert.equal(icons.length, 2); + assert.strictEqual(icons.length, 2); }); QUnit.test('Don\'t render toggle icon if item.hasChildren is false', function(assert) { @@ -333,7 +333,7 @@ QUnit.test('Don\'t render toggle icon if item.hasChildren is false', function(as const icons = this.$element.find('.' + internals.TOGGLE_ITEM_VISIBILITY_CLASS); - assert.equal(icons.length, 2); + assert.strictEqual(icons.length, 2); }); QUnit.test('Render opened icon if item is expanded', function(assert) { @@ -348,7 +348,7 @@ QUnit.test('Render opened icon if item is expanded', function(assert) { }); const icons = this.$element.find('.' + internals.TOGGLE_ITEM_VISIBILITY_OPENED_CLASS); - assert.equal(icons.length, 1); + assert.strictEqual(icons.length, 1); }); QUnit.test('Add leaf class if item.hasItems is false', function(assert) { @@ -378,10 +378,10 @@ QUnit.test('Render empty checkboxes on root level', function(assert) { const $checkboxes = this.$element.find('.dx-checkbox'); - assert.equal($checkboxes.length, 3, 'number of checkboxes is right'); + assert.strictEqual($checkboxes.length, 3, 'number of checkboxes is right'); $.each($checkboxes, function(index, checkbox) { - assert.equal($(checkbox).dxCheckBox('instance').option('value'), false, index + ' checkbox is not checked'); + assert.strictEqual($(checkbox).dxCheckBox('instance').option('value'), false, index + ' checkbox is not checked'); }); }); @@ -399,10 +399,10 @@ QUnit.test('Render empty checkboxes on nested level', function(assert) { const $checkboxes = this.$element.find('.dx-checkbox'); - assert.equal($checkboxes.length, 6, 'number of checkboxes is right'); + assert.strictEqual($checkboxes.length, 6, 'number of checkboxes is right'); $.each($checkboxes, function(index, checkbox) { - assert.equal($(checkbox).dxCheckBox('instance').option('value'), false, index + ' checkbox is not checked'); + assert.strictEqual($(checkbox).dxCheckBox('instance').option('value'), false, index + ' checkbox is not checked'); }); }); @@ -438,10 +438,10 @@ QUnit.test('Check rendered children items if parent item is checked', function(a $checkboxes.eq(0).trigger('dxclick'); - assert.equal($checkboxes.eq(0).dxCheckBox('instance').option('value'), true); - assert.equal($checkboxes.eq(1).dxCheckBox('instance').option('value'), true); - assert.equal($checkboxes.eq(2).dxCheckBox('instance').option('value'), true); - assert.equal($checkboxes.eq(3).dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkboxes.eq(0).dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkboxes.eq(1).dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkboxes.eq(2).dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkboxes.eq(3).dxCheckBox('instance').option('value'), true); }); QUnit.test('Render checked children items if parent item is checked', function(assert) { @@ -458,10 +458,10 @@ QUnit.test('Render checked children items if parent item is checked', function(a treeView.expandItem(1); const $checkboxes = this.$element.find('.dx-checkbox'); - assert.equal($checkboxes.eq(0).dxCheckBox('instance').option('value'), true, 'checked'); - assert.equal($checkboxes.eq(1).dxCheckBox('instance').option('value'), true, 'child checked'); - assert.equal($checkboxes.eq(2).dxCheckBox('instance').option('value'), true, 'child checked'); - assert.equal($checkboxes.eq(3).dxCheckBox('instance').option('value'), true, 'child checked'); + assert.strictEqual($checkboxes.eq(0).dxCheckBox('instance').option('value'), true, 'checked'); + assert.strictEqual($checkboxes.eq(1).dxCheckBox('instance').option('value'), true, 'child checked'); + assert.strictEqual($checkboxes.eq(2).dxCheckBox('instance').option('value'), true, 'child checked'); + assert.strictEqual($checkboxes.eq(3).dxCheckBox('instance').option('value'), true, 'child checked'); }); QUnit.test('Change parent check if child item became unselected', function(assert) { @@ -494,12 +494,12 @@ QUnit.test('Check root level rendering with slow dataSource', function(assert) { let items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 0, 'items was not rendered yet because dataSource is slow'); + assert.strictEqual(items.length, 0, 'items was not rendered yet because dataSource is slow'); this.clock.tick(300); items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 3, 'items was rendered'); + assert.strictEqual(items.length, 3, 'items was rendered'); }); QUnit.test('Check nested level rendering with slow dataSource', function(assert) { @@ -514,11 +514,11 @@ QUnit.test('Check nested level rendering with slow dataSource', function(assert) treeView.expandItem(1); let items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 3, 'nested items was not rendered yet because dataSource is slow'); + assert.strictEqual(items.length, 3, 'nested items was not rendered yet because dataSource is slow'); this.clock.tick(300); items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 6, 'nested items was rendered'); + assert.strictEqual(items.length, 6, 'nested items was rendered'); }); QUnit.test('Change root checkbox\'s value if new rendered child is selected with slow dataSource', function(assert) { @@ -580,8 +580,8 @@ QUnit.test('Create error message if dataSource is unavailable', function(assert) ds.on('loadError', function() { const items = $element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 0, 'no items'); - assert.equal($element.text(), 'No data to display', 'error generated'); + assert.strictEqual(items.length, 0, 'no items'); + assert.strictEqual($element.text(), 'No data to display', 'error generated'); }); this.clock.tick(300); @@ -691,12 +691,12 @@ QUnit.test('SearchValue in virtualMode', function(assert) { }); let $items = treeView.$element().find('.dx-treeview-item'); - assert.equal($items.length, 1, '1 item was rendered after filtration'); + assert.strictEqual($items.length, 1, '1 item was rendered after filtration'); treeView.expandItem(1); $items = treeView.$element().find('.dx-treeview-item'); - assert.equal($items.length, 2, '2 items were rendered after filtration'); + assert.strictEqual($items.length, 2, '2 items were rendered after filtration'); }); QUnit.test('Clear searchValue in virtualMode', function(assert) { @@ -711,7 +711,7 @@ QUnit.test('Clear searchValue in virtualMode', function(assert) { treeView.option('searchValue', ''); const items = treeView.option('items'); - assert.equal(items.length, 6, '6 items were rendered after filtration'); + assert.strictEqual(items.length, 6, '6 items were rendered after filtration'); }); QUnit.test('SearchValue should work after sublevels were expanded', function(assert) { @@ -726,7 +726,7 @@ QUnit.test('SearchValue should work after sublevels were expanded', function(ass treeView.option('searchValue', 'a'); const $items = treeView.$element().find('.dx-treeview-item'); - assert.equal($items.length, 2, '2 items were rendered after filtration'); + assert.strictEqual($items.length, 2, '2 items were rendered after filtration'); }); QUnit.test('Repaint treeView on every dataSource modified - insert', function(assert) { @@ -767,7 +767,7 @@ QUnit.test('Repaint treeView on every dataSource modified - insert', function(as }); items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 4); + assert.strictEqual(items.length, 4); dataSource.store().insert({ id: 6, @@ -776,11 +776,11 @@ QUnit.test('Repaint treeView on every dataSource modified - insert', function(as }); items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 5); + assert.strictEqual(items.length, 5); treeView.option('searchValue', 'Item 2'); items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 3); + assert.strictEqual(items.length, 3); dataSource.store().insert({ id: 8, @@ -789,7 +789,7 @@ QUnit.test('Repaint treeView on every dataSource modified - insert', function(as }); items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 3); + assert.strictEqual(items.length, 3); }); QUnit.test('Repaint treeView on every dataSource modified - remove', function(assert) { @@ -829,13 +829,13 @@ QUnit.test('Repaint treeView on every dataSource modified - remove', function(as dataSource.store().remove(4); let items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 5); + assert.strictEqual(items.length, 5); dataSource.store().remove(1); items = this.$element.find(`.${TREEVIEW_ITEM_CLASS}`); - assert.equal(items.length, 2); - assert.equal(treeView.option('items').length, 2); + assert.strictEqual(items.length, 2); + assert.strictEqual(treeView.option('items').length, 2); }); QUnit.test('Virtual mode should work with custom dataSource filter', function(assert) { @@ -855,11 +855,11 @@ QUnit.test('Virtual mode should work with custom dataSource filter', function(as virtualModeEnabled: true }); - assert.equal(this.$element.find('.dx-treeview-item').length, 1, 'root nodes should be filtered'); + assert.strictEqual(this.$element.find('.dx-treeview-item').length, 1, 'root nodes should be filtered'); treeView.expandItem(1); - assert.equal(this.$element.find('.dx-treeview-item').length, 2, 'child nodes should be filtered'); + assert.strictEqual(this.$element.find('.dx-treeview-item').length, 2, 'child nodes should be filtered'); }); QUnit.test('Filter in virtual mode should not be lost after repaint', function(assert) { @@ -882,7 +882,7 @@ QUnit.test('Filter in virtual mode should not be lost after repaint', function(a treeView.repaint(); - assert.equal(this.$element.find('.dx-treeview-item').length, 1, 'root nodes should be filtered'); + assert.strictEqual(this.$element.find('.dx-treeview-item').length, 1, 'root nodes should be filtered'); }); QUnit.test('DataSource change should not influence on items', function(assert) { @@ -894,20 +894,20 @@ QUnit.test('DataSource change should not influence on items', function(assert) { }); this.clock.tick(400); - assert.equal(treeView._dataSource.items().length, 3); - assert.equal(treeView.option('items').length, 3); + assert.strictEqual(treeView._dataSource.items().length, 3); + assert.strictEqual(treeView.option('items').length, 3); const $node = this.$element.find(`.${TREEVIEW_NODE_CLASS}`).eq(0); $node.find('.' + internals.TOGGLE_ITEM_VISIBILITY_CLASS).trigger('dxclick'); this.clock.tick(400); - assert.equal(treeView._dataSource.items().length, 3); - assert.equal(treeView.option('items').length, 6); + assert.strictEqual(treeView._dataSource.items().length, 3); + assert.strictEqual(treeView.option('items').length, 6); // newData = treeView.option("dataSource"); // treeView.option("dataSource", newData); // this.clock.tick(400); - // assert.equal(treeView._dataSource.items().length, 3); - // assert.equal(treeView.option("items").length, 3); // will be fixed in T384846 + // assert.strictEqual(treeView._dataSource.items().length, 3); + // assert.strictEqual(treeView.option("items").length, 3); // will be fixed in T384846 }); QUnit.test('Reload dataSource', function(assert) { @@ -935,16 +935,16 @@ QUnit.test('Reload dataSource', function(assert) { virtualModeEnabled: true }); - assert.equal(treeView.option('items').length, 2); - assert.equal(treeView.option('items')[0].text, 'Item 1-1'); + assert.strictEqual(treeView.option('items').length, 2); + assert.strictEqual(treeView.option('items')[0].text, 'Item 1-1'); numb = 2; ds.reload(); - assert.equal(treeView.option('items').length, 2); - assert.equal(treeView.option('items')[0].text, 'Item 1-2'); + assert.strictEqual(treeView.option('items').length, 2); + assert.strictEqual(treeView.option('items')[0].text, 'Item 1-2'); numb = 1; ds.reload(); - assert.equal(treeView.option('items').length, 2); - assert.equal(treeView.option('items')[0].text, 'Item 1-1'); + assert.strictEqual(treeView.option('items').length, 2); + assert.strictEqual(treeView.option('items')[0].text, 'Item 1-1'); }); QUnit.test('Internal filter in virtual mode should be correct after datasource reloading', function(assert) { @@ -1030,7 +1030,7 @@ QUnit.test('Items should update when dataSource changed', function(assert) { virtualModeEnabled: true }); - assert.equal(treeView.option('items')[0].text, 'Item 1'); + assert.strictEqual(treeView.option('items')[0].text, 'Item 1'); treeView.option('dataSource', new DataSource({ store: new ArrayStore([ @@ -1038,7 +1038,7 @@ QUnit.test('Items should update when dataSource changed', function(assert) { ]) })); - assert.equal(treeView.option('items')[0].text, 'Item 2'); + assert.strictEqual(treeView.option('items')[0].text, 'Item 2'); }); // T480748 @@ -1067,12 +1067,12 @@ QUnit.test('Load indicator should be shown on first loading with slow dataSource }); this.clock.tick(200); - assert.equal(this.$element.find('.dx-treeview-loadindicator-wrapper').length, 1, 'load indicator wrapper was created'); - assert.equal(this.$element.find('.dx-treeview-loadindicator').length, 1, 'load indicator was created'); + assert.strictEqual(this.$element.find('.dx-treeview-loadindicator-wrapper').length, 1, 'load indicator wrapper was created'); + assert.strictEqual(this.$element.find('.dx-treeview-loadindicator').length, 1, 'load indicator was created'); this.clock.tick(100); - assert.equal(this.$element.find('.dx-treeview-loadindicator-wrapper').length, 0, 'load indicator wrapper was removed'); - assert.equal(this.$element.find('.dx-treeview-loadindicator').length, 0, 'load indicator was removed'); + assert.strictEqual(this.$element.find('.dx-treeview-loadindicator-wrapper').length, 0, 'load indicator wrapper was removed'); + assert.strictEqual(this.$element.find('.dx-treeview-loadindicator').length, 0, 'load indicator was removed'); }); QUnit.test('load indicator should be removed after datasource is loaded even if init method is not finished yet', function(assert) { @@ -1085,7 +1085,7 @@ QUnit.test('load indicator should be removed after datasource is loaded even if ], onContentReady: function(e) { const $loadIndicator = $(e.element).find('.dx-treeview-loadindicator'); - assert.equal($loadIndicator.length, 0, 'load indicator should be removed'); + assert.strictEqual($loadIndicator.length, 0, 'load indicator should be removed'); }, dataStructure: 'plain', virtualModeEnabled: true @@ -1122,7 +1122,7 @@ QUnit.test('Expand all method with the virtual mode', function(assert) { const nodes = treeView.getNodes(); assert.ok(nodes[0].expanded, 'item 1'); assert.notOk(nodes[0].items[0].expanded, 'item 11'); - assert.equal(nodes[0].items[0].items.length, 0, 'children count of the item 11'); + assert.strictEqual(nodes[0].items[0].items.length, 0, 'children count of the item 11'); }); QUnit.test('load indicator should be located inside an item', function(assert) { @@ -1162,7 +1162,7 @@ QUnit.test('the passed function is called on widget initialization', function(as }); assert.ok(spy.calledOnce, 'the callback function is called once after widget initialization'); - assert.equal(spy.args[0][0], null, '\'null\' is passed as argument for the root item loading'); + assert.strictEqual(spy.args[0][0], null, '\'null\' is passed as argument for the root item loading'); }); QUnit.test('\'createChildren\' callback didn\'t called at dblclick on item without children', function(assert) { @@ -1191,7 +1191,7 @@ QUnit.test('the passed function is called on node expansion', function(assert) { treeView.expandItem(1); assert.ok(spy.calledOnce, 'the callback was fired only once on item expansion'); - assert.equal(spy.args[0][0].itemData.id, 1, 'the correct parentNode is passed to the callback arguments'); + assert.strictEqual(spy.args[0][0].itemData.id, 1, 'the correct parentNode is passed to the callback arguments'); }); QUnit.test('the passed function is not called on the node collapsing', function(assert) { @@ -1205,7 +1205,7 @@ QUnit.test('the passed function is not called on the node collapsing', function( treeView.option('createChildren', spy); treeView.collapseItem(1); - assert.equal(spy.callCount, 0, 'the callback was not fired'); + assert.strictEqual(spy.callCount, 0, 'the callback was not fired'); }); QUnit.test('the passed function is not called on the second expansion of the node', function(assert) { @@ -1220,7 +1220,7 @@ QUnit.test('the passed function is not called on the second expansion of the nod treeView.option('createChildren', spy); treeView.expandItem(1); - assert.equal(spy.callCount, 0, 'the callback was not fired'); + assert.strictEqual(spy.callCount, 0, 'the callback was not fired'); }); QUnit.test('the nodes returned by the callback function should be added to the widget', function(assert) { @@ -1287,7 +1287,7 @@ QUnit.test('load indicator should be rendered on node expansion if the \'createC }); treeView.expandItem(1); - assert.equal($treeView.find('.dx-treeview-node-loadindicator').length, 1, 'load indicator is created for the node expanding'); + assert.strictEqual($treeView.find('.dx-treeview-node-loadindicator').length, 1, 'load indicator is created for the node expanding'); deferred.resolve([{ id: 2, text: 'Two', parentId: 1 }]); assert.ok($treeView.find('.dx-treeview-node-loadindicator').is(':hidden'), 'load indicator is removed after data is fetched'); @@ -1335,10 +1335,10 @@ QUnit.test('fetched nodes should be rendered after asynchronous load via \'creat }); treeView.expandItem(1); - assert.equal($treeView.find('.dx-treeview-node').length, 1, 'only root node is present'); + assert.strictEqual($treeView.find('.dx-treeview-node').length, 1, 'only root node is present'); deferred.resolve([item]); - assert.equal($treeView.find('.dx-treeview-node').length, 2, 'fetched node is rendered'); + assert.strictEqual($treeView.find('.dx-treeview-node').length, 2, 'fetched node is rendered'); }); QUnit.test('load indicator should not be rendered on node expansion if the \'createChildren\' callback is specified and hasItems field is false', function(assert) { @@ -1354,7 +1354,7 @@ QUnit.test('load indicator should not be rendered on node expansion if the \'cre }); treeView.expandItem(1); - assert.equal($treeView.find('.dx-treeview-node-loadindicator').length, 0, 'load indicator is created for the node expanding'); + assert.strictEqual($treeView.find('.dx-treeview-node-loadindicator').length, 0, 'load indicator is created for the node expanding'); }); QUnit.test('fetched nodes should be rendered after asynchronous load via \'createChildren\' on widget init', function(assert) { @@ -1366,10 +1366,10 @@ QUnit.test('fetched nodes should be rendered after asynchronous load via \'creat } }); - assert.equal($treeView.find('.dx-treeview-node').length, 0, 'no nodes are rendered'); + assert.strictEqual($treeView.find('.dx-treeview-node').length, 0, 'no nodes are rendered'); deferred.resolve([{ id: 1, text: 'One' }]); - assert.equal($treeView.find('.dx-treeview-node').length, 1, 'fetched node is rendered'); + assert.strictEqual($treeView.find('.dx-treeview-node').length, 1, 'fetched node is rendered'); }); QUnit.test('arrow should be rendered for a node if the \'createChildren\' callback is specified', function(assert) { @@ -1379,7 +1379,7 @@ QUnit.test('arrow should be rendered for a node if the \'createChildren\' callba createChildren: noop }); - assert.equal($treeView.find('.dx-treeview-toggle-item-visibility').length, 1, 'arrow is rendered'); + assert.strictEqual($treeView.find('.dx-treeview-toggle-item-visibility').length, 1, 'arrow is rendered'); }); QUnit.test('widget should not be rerendered after data is loaded with the help of \'createChildren\'', function(assert) { @@ -1409,7 +1409,7 @@ QUnit.test('the createChildren is not called if not plain dataStructure is used' createChildren: spy }); - assert.equal(spy.callCount, 0, 'the \'createChildren\' callback is not called'); + assert.strictEqual(spy.callCount, 0, 'the \'createChildren\' callback is not called'); }); QUnit.test('data source is ignored if the \'createChildren\' callback is specified', function(assert) { @@ -1427,7 +1427,7 @@ QUnit.test('data source is ignored if the \'createChildren\' callback is specifi createChildren: noop }); - assert.equal(spy.callCount, 0, 'data source is ignored'); + assert.strictEqual(spy.callCount, 0, 'data source is ignored'); }); QUnit.test('arrow should not be rendered for item which is explicitly has \'hasItems\' property set to false', function(assert) { @@ -1438,7 +1438,7 @@ QUnit.test('arrow should not be rendered for item which is explicitly has \'hasI } }); - assert.equal($treeView.find('.dx-treeview-toggle-item-visibility').length, 0, 'arrow is not rendered'); + assert.strictEqual($treeView.find('.dx-treeview-toggle-item-visibility').length, 0, 'arrow is not rendered'); }); QUnit.test('the \'createChildren\' callback should not create duplicate items when search is used', function(assert) { @@ -1457,8 +1457,8 @@ QUnit.test('the \'createChildren\' callback should not create duplicate items wh treeView.option('searchValue', 'Ro'); - assert.equal($treeView.find('.dx-treeview-item').length, 1, 'only one item is rendered'); - assert.equal($treeView.find('.dx-treeview-toggle-item-visibility').length, 0, 'arrow is not rendered'); + assert.strictEqual($treeView.find('.dx-treeview-item').length, 1, 'only one item is rendered'); + assert.strictEqual($treeView.find('.dx-treeview-toggle-item-visibility').length, 0, 'arrow is not rendered'); }); QUnit.test('the \'createChildren\' callback should support native promises', function(assert) { @@ -1474,7 +1474,7 @@ QUnit.test('the \'createChildren\' callback should support native promises', fun }).dxTreeView('instance'); promise.then(function() { - assert.equal(treeView.option('items').length, 1, 'items are loaded after native Promise resolution'); + assert.strictEqual(treeView.option('items').length, 1, 'items are loaded after native Promise resolution'); done(); }); }); @@ -1513,15 +1513,15 @@ module('Loadindicator', () => { const $node = treeView.getNodes().eq(0); const { toggleItemVisibilityCount, contentReadyCount } = expectedArgs; - assert.equal(contentReadyHandler.callCount, contentReadyCount, 'contentReady.callCount'); + assert.strictEqual(contentReadyHandler.callCount, contentReadyCount, 'contentReady.callCount'); const $loadIndicator = treeView.getNodeLoadIndicator($node); - assert.equal($loadIndicator.length, 1, 'loadIndicator count'); - assert.equal(treeView.hasInvisibleClass($loadIndicator), contentReadyCount ? true : false, 'loadIndicator has invisible class'); + assert.strictEqual($loadIndicator.length, 1, 'loadIndicator count'); + assert.strictEqual(treeView.hasInvisibleClass($loadIndicator), contentReadyCount ? true : false, 'loadIndicator has invisible class'); const $toggleItem = treeView.getToggleItemVisibility($node); - assert.equal($toggleItem.length, toggleItemVisibilityCount, 'toggle item count'); - assert.equal($toggleItem.css('display') === 'none', contentReadyCount ? false : true, 'toggle item is hidden'); + assert.strictEqual($toggleItem.length, toggleItemVisibilityCount, 'toggle item count'); + assert.strictEqual($toggleItem.css('display') === 'none', contentReadyCount ? false : true, 'toggle item is hidden'); }; test(`Loadindicator: ${config}`, function() { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js index b2599c623e14..402ecde892a5 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/keyboardNavigation.js @@ -29,7 +29,7 @@ QUnit.module('keyboard navigation', { $treeView.focusin(); - assert.equal(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); + assert.strictEqual(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); assert.ok($firstNode.hasClass('dx-state-focused'), 'item was focused '); }); @@ -48,12 +48,12 @@ QUnit.module('keyboard navigation', { $firstItem.trigger('dxpointerdown'); - assert.equal(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); + assert.strictEqual(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); assert.ok($firstNode.hasClass('dx-state-focused'), 'item was focused '); keyboard.keyDown('down'); - assert.equal(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); + assert.strictEqual(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); assert.ok($secondNode.hasClass('dx-state-focused'), 'next item was focused after down was pressed'); }); @@ -101,7 +101,7 @@ QUnit.module('keyboard navigation', { keyboard.keyDown('home'); - assert.equal(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); + assert.strictEqual(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); assert.ok($secondNode.hasClass('dx-state-focused'), 'first item was focused after home was pressed'); }); @@ -136,7 +136,7 @@ QUnit.module('keyboard navigation', { $firstItem.trigger('dxpointerdown'); $treeView.trigger($.Event('keydown', { key: 'Home', shiftKey: true })); - assert.equal($treeView.dxTreeView('instance').option('selectedIndex'), -1); + assert.strictEqual($treeView.dxTreeView('instance').option('selectedIndex'), -1); }); QUnit.test('end key pressing move focus to the last element', function(assert) { @@ -158,7 +158,7 @@ QUnit.module('keyboard navigation', { keyboard.keyDown('end'); - assert.equal(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); + assert.strictEqual(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); assert.ok($secondNode.hasClass('dx-state-focused'), 'last item was focused after end was pressed'); }); @@ -193,7 +193,7 @@ QUnit.module('keyboard navigation', { $firstItem.trigger('dxpointerdown'); $treeView.trigger($.Event('keydown', { key: 'End', shiftKey: true })); - assert.equal($treeView.dxTreeView('instance').option('selectedIndex'), -1); + assert.strictEqual($treeView.dxTreeView('instance').option('selectedIndex'), -1); }); QUnit.test('up arrow move focus to the previous element', function(assert) { @@ -251,7 +251,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); $treeView.trigger($.Event('keydown', { key: 'ArrowDown', shiftKey: true })); - assert.equal($checkBox.dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkBox.dxCheckBox('instance').option('value'), true); }); QUnit.test('shiftDown key test without checkBoxes', function(assert) { @@ -265,7 +265,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); $treeView.trigger($.Event('keydown', { key: 'ArrowDown', shiftKey: true })); - assert.equal($treeView.dxTreeView('instance').option('selectedIndex'), -1); + assert.strictEqual($treeView.dxTreeView('instance').option('selectedIndex'), -1); }); QUnit.test('up arrow move focus on item with same level', function(assert) { @@ -302,7 +302,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); $treeView.trigger($.Event('keydown', { key: 'ArrowUp', shiftKey: true })); - assert.equal($checkBox.dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkBox.dxCheckBox('instance').option('value'), true); }); QUnit.test('shiftUp key test without checkBoxes', function(assert) { @@ -316,7 +316,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); $treeView.trigger($.Event('keydown', { key: 'ArrowUp', shiftKey: true })); - assert.equal($treeView.dxTreeView('instance').option('selectedIndex'), -1); + assert.strictEqual($treeView.dxTreeView('instance').option('selectedIndex'), -1); }); QUnit.test('left/right arrow collapse/expand node-container', function(assert) { @@ -338,12 +338,12 @@ QUnit.module('keyboard navigation', { $treeView.focusin(); $parentItem.trigger('dxpointerdown'); keyboard.keyDown('right'); - assert.equal(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); + assert.strictEqual(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); assert.ok($treeView.find(`.${internals.NODE_CLASS}`).eq(1).is(':visible'), 'child item not hidden'); assert.ok($iconItem.hasClass('dx-treeview-toggle-item-visibility-opened'), 'icon item indicate opened state'); keyboard.keyDown('left'); - assert.equal(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); + assert.strictEqual(isRenderer(instance.option('focusedElement')), !!config().useJQuery, 'focusedElement is correct'); assert.ok($treeView.find(`.${internals.NODE_CLASS}`).eq(1).is(':hidden'), 'child item is hidden'); assert.ok(!$iconItem.hasClass('dx-treeview-toggle-item-visibility-opened'), 'icon item indicate closed state'); }); @@ -459,7 +459,7 @@ QUnit.module('keyboard navigation', { const $childNode = $treeView.find('.dx-treeview-node').eq(5); assert.ok($childNode.is(':visible'), 'deep leaf is visible'); - assert.equal(expandFired, 3, 'onItemExpanded was fired desired number of times'); + assert.strictEqual(expandFired, 3, 'onItemExpanded was fired desired number of times'); const $parentNode = $treeView.find('.dx-treeview-node').eq(0); assert.ok($parentNode.hasClass('dx-state-focused')); @@ -559,8 +559,8 @@ QUnit.module('keyboard navigation', { assert.ok(handler.calledOnce); assert.ok(args.itemData.expanded); assert.ok(args.node.expanded); - assert.equal(args.itemData.text, 'Item 1'); - assert.equal(args.node.text, 'Item 1'); + assert.strictEqual(args.itemData.text, 'Item 1'); + assert.strictEqual(args.node.text, 'Item 1'); }); QUnit.test('left arrow should raise onItemCollapsed event', function(assert) { @@ -585,8 +585,8 @@ QUnit.module('keyboard navigation', { assert.ok(handler.calledOnce); assert.ok(!args.itemData.expanded); assert.ok(!args.node.expanded); - assert.equal(args.itemData.text, 'Item 1'); - assert.equal(args.node.text, 'Item 1'); + assert.strictEqual(args.itemData.text, 'Item 1'); + assert.strictEqual(args.node.text, 'Item 1'); }); QUnit.test('focus remains on parent node if it is root after left arrow pressing', function(assert) { @@ -624,7 +624,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); keyboard.keyDown('enter'); - assert.equal(clickFired, 1); + assert.strictEqual(clickFired, 1); }); QUnit.test('item should be expanded by enter when expandEvent is click', function(assert) { @@ -660,7 +660,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); keyboard.keyDown('enter'); - assert.equal($checkBox.dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkBox.dxCheckBox('instance').option('value'), true); }); QUnit.test('enter key pressing fire onItemSelectionChanged if checkboxes are visible', function(assert) { @@ -681,7 +681,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); keyboard.keyDown('enter'); - assert.equal(selectFired, 1); + assert.strictEqual(selectFired, 1); }); QUnit.test('space key pressing fire onItemClick', function(assert) { @@ -702,7 +702,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); keyboard.keyDown('space'); - assert.equal(clickFired, 1); + assert.strictEqual(clickFired, 1); }); QUnit.test('space key pressing select/unselect nodes if checkboxes are visible', function(assert) { @@ -720,7 +720,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); keyboard.keyDown('space'); - assert.equal($checkBox.dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkBox.dxCheckBox('instance').option('value'), true); }); QUnit.test('space key pressing fire onItemSelectionChanged if checkboxes are visible', function(assert) { @@ -741,7 +741,7 @@ QUnit.module('keyboard navigation', { $item.trigger('dxpointerdown'); keyboard.keyDown('space'); - assert.equal(selectFired, 1); + assert.strictEqual(selectFired, 1); }); QUnit.test('T179601', function(assert) { @@ -765,7 +765,7 @@ QUnit.module('keyboard navigation', { let actualSelectedState = true; keyboard.keyDown('space'); - assert.equal($checkBox.dxCheckBox('instance').option('value'), true); + assert.strictEqual($checkBox.dxCheckBox('instance').option('value'), true); actualSelectedState = false; keyboard.keyDown('space'); diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js index 2be431cc90d1..4c98388706ce 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js @@ -11,7 +11,7 @@ QUnit.test('selectAllText', function(assert) { }).dxTreeView('instance'); treeView.option('selectAllText', 'Select all items'); - assert.equal(treeView._$selectAllItem.dxCheckBox('instance').option('text'), 'Select all items'); + assert.strictEqual(treeView._$selectAllItem.dxCheckBox('instance').option('text'), 'Select all items'); }); QUnit.test('selectAll mode', function(assert) { @@ -21,10 +21,10 @@ QUnit.test('selectAll mode', function(assert) { }).dxTreeView('instance'); treeView.option('showCheckBoxesMode', 'normal'); - assert.equal(typeof treeView._$selectAllItem, 'undefined'); + assert.strictEqual(typeof treeView._$selectAllItem, 'undefined'); treeView.option('showCheckBoxesMode', 'selectAll'); - assert.equal(treeView._$selectAllItem.length, 1); + assert.strictEqual(treeView._$selectAllItem.length, 1); }); QUnit.test('scrollDirection', function(assert) { @@ -33,7 +33,7 @@ QUnit.test('scrollDirection', function(assert) { }).dxTreeView('instance'); treeView.option('scrollDirection', 'both'); - assert.equal(treeView.getScrollable().option('direction'), 'both'); + assert.strictEqual(treeView.getScrollable().option('direction'), 'both'); }); QUnit.test('showCheckBoxes', function(assert) { @@ -45,10 +45,10 @@ QUnit.test('showCheckBoxes', function(assert) { }).dxTreeView('instance'); treeView.option('showCheckBoxesMode', 'normal'); - assert.equal(treeView.$element().find('.dx-checkbox').length, 6); + assert.strictEqual(treeView.$element().find('.dx-checkbox').length, 6); treeView.option('showCheckBoxesMode', 'none'); - assert.equal(treeView.$element().find('.dx-checkbox').length, 0); + assert.strictEqual(treeView.$element().find('.dx-checkbox').length, 0); }); QUnit.test('parentIdExpr should work correctly when it was dynamically changed', function(assert) { @@ -61,7 +61,7 @@ QUnit.test('parentIdExpr should work correctly when it was dynamically changed', instance.option('parentIdExpr', 'parentId'); const $node1 = $treeView.find('.dx-treeview-node').eq(0); - assert.equal($node1.find('.dx-treeview-node').length, 1, 'item 11 became a child of the item 1'); + assert.strictEqual($node1.find('.dx-treeview-node').length, 1, 'item 11 became a child of the item 1'); }); QUnit.module('Option changing for single item'); From 3a19f4f059b9aae0d70139a21704e4689e76bcc3 Mon Sep 17 00:00:00 2001 From: dmlvr Date: Mon, 16 Feb 2026 17:51:54 +0200 Subject: [PATCH 12/16] prevent selection for disabled nodes when SelectByClick is enabled --- .../devextreme/js/__internal/ui/tree_view/tree_view.base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts index 0213bf7d0e70..f2b0d73ed42a 100644 --- a/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts +++ b/packages/devextreme/js/__internal/ui/tree_view/tree_view.base.ts @@ -1887,7 +1887,7 @@ class TreeViewBase extends HierarchicalCollectionWidget Date: Mon, 16 Feb 2026 18:00:07 +0200 Subject: [PATCH 13/16] add testcase for selectByClick true and disabled: true item --- .../treeView.selection.tests.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.selection.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.selection.tests.js index 973577fd185b..a857b0609418 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.selection.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.selection.tests.js @@ -554,6 +554,19 @@ module('selection single', () => { treeView.checkSelected([], items); }); + test('selectByClick option should not select item witch disabled: true', function(assert) { + const items = [{ text: 'item 1', disabled: true }, { text: 'item 2' }]; + const treeView = createInstance({ + items: items, + selectByClick: true, + selectionMode: 'single' + }); + + eventsEngine.trigger(treeView.getItems().eq(0), 'dxclick'); + + treeView.checkSelected([], items); + }); + test('selection can be prevented on itemClick', function(assert) { const items = [{ text: 'item 1' }, { text: 'item 2' }]; const treeView = createInstance({ From 26001f707e8f74c5e501d6ba3af43906a326072b Mon Sep 17 00:00:00 2001 From: dmlvr Date: Mon, 16 Feb 2026 18:52:20 +0200 Subject: [PATCH 14/16] update fileManager tests with treeview disabled state checking --- .../testing/helpers/fileManagerHelpers.js | 1 + .../fileManagerParts/editing.tests.js | 76 +++++++++---------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/packages/devextreme/testing/helpers/fileManagerHelpers.js b/packages/devextreme/testing/helpers/fileManagerHelpers.js index 28f4bbd1b171..02d645b2fc60 100644 --- a/packages/devextreme/testing/helpers/fileManagerHelpers.js +++ b/packages/devextreme/testing/helpers/fileManagerHelpers.js @@ -40,6 +40,7 @@ export const Consts = { GRID_DATA_ROW_CLASS: 'dx-data-row', FILE_ACTION_BUTTON_CLASS: 'dx-filemanager-file-actions-button', FOLDERS_TREE_VIEW_ITEM_CLASS: 'dx-treeview-item', + FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS: 'dx-treeview-item-content', FOLDERS_TREE_VIEW_ITEM_TOGGLE_CLASS: 'dx-treeview-toggle-item-visibility', FOLDERS_TREE_VIEW_ITEM_TOGGLE_OPENED_CLASS: 'dx-treeview-toggle-item-visibility-opened', BREADCRUMBS_CLASS: 'dx-filemanager-breadcrumbs', diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/fileManagerParts/editing.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/fileManagerParts/editing.tests.js index 23da5e1d7738..dff8fa6ace9f 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/fileManagerParts/editing.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/fileManagerParts/editing.tests.js @@ -1572,13 +1572,13 @@ QUnit.module('Editing operations', moduleConfig, () => { const $folderNodes = this.wrapper.getFolderNodes(true); assert.strictEqual($folderNodes.length, 4, 'there are only 4 nodes'); - assert.ok($folderNodes.eq(0).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); + assert.ok($folderNodes.eq(0).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); assert.ok($folderNodes.eq(0).is(':visible'), '\'Files\' node is visible'); - assert.ok($folderNodes.eq(1).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); + assert.ok($folderNodes.eq(1).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); assert.ok($folderNodes.eq(1).is(':visible'), '\'Folder 1\' node is visible'); - assert.notOk($folderNodes.eq(2).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); + assert.notOk($folderNodes.eq(2).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); assert.ok($folderNodes.eq(2).is(':visible'), '\'Folder 2\' node is visible'); - assert.notOk($folderNodes.eq(3).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); + assert.notOk($folderNodes.eq(3).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); assert.ok($folderNodes.eq(3).is(':visible'), '\'Folder 3\' node is visible'); }); @@ -1593,13 +1593,13 @@ QUnit.module('Editing operations', moduleConfig, () => { const $folderNodes = this.wrapper.getFolderNodes(true); assert.strictEqual($folderNodes.length, 4, 'there are only 4 nodes'); - assert.ok($folderNodes.eq(0).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); + assert.ok($folderNodes.eq(0).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); assert.ok($folderNodes.eq(0).is(':visible'), '\'Files\' node is visible'); - assert.ok($folderNodes.eq(1).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); + assert.ok($folderNodes.eq(1).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); assert.ok($folderNodes.eq(1).is(':visible'), '\'Folder 1\' node is visible'); - assert.notOk($folderNodes.eq(2).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); + assert.notOk($folderNodes.eq(2).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); assert.ok($folderNodes.eq(2).is(':visible'), '\'Folder 2\' node is visible'); - assert.notOk($folderNodes.eq(3).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); + assert.notOk($folderNodes.eq(3).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); assert.ok($folderNodes.eq(3).is(':visible'), '\'Folder 3\' node is visible'); }); @@ -1625,13 +1625,13 @@ QUnit.module('Editing operations', moduleConfig, () => { const $folderNodes = this.wrapper.getFolderNodes(true); assert.strictEqual($folderNodes.length, 4, 'there are only 4 nodes'); - assert.ok($folderNodes.eq(0).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); + assert.ok($folderNodes.eq(0).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); assert.ok($folderNodes.eq(0).is(':visible'), '\'Files\' node is visible'); - assert.ok($folderNodes.eq(1).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); + assert.ok($folderNodes.eq(1).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); assert.ok($folderNodes.eq(1).is(':visible'), '\'Folder 1\' node is visible'); - assert.ok($folderNodes.eq(2).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is disabled'); + assert.ok($folderNodes.eq(2).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is disabled'); assert.ok($folderNodes.eq(2).is(':visible'), '\'Folder 2\' node is visible'); - assert.notOk($folderNodes.eq(3).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); + assert.notOk($folderNodes.eq(3).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); assert.ok($folderNodes.eq(3).is(':visible'), '\'Folder 3\' node is visible'); implementationsMap.getWidth = originalFunc; }); @@ -1652,27 +1652,27 @@ QUnit.module('Editing operations', moduleConfig, () => { const $folderNodes = this.wrapper.getFolderNodes(true); assert.strictEqual($folderNodes.length, 9, 'there are only 9 nodes'); - assert.notOk($folderNodes.eq(0).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is enabled'); + assert.notOk($folderNodes.eq(0).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is enabled'); assert.ok($folderNodes.eq(0).is(':visible'), '\'Files\' node is visible'); - assert.notOk($folderNodes.eq(1).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is enabled'); + assert.notOk($folderNodes.eq(1).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is enabled'); assert.ok($folderNodes.eq(1).is(':visible'), '\'Folder 1\' node is visible'); - assert.notOk($folderNodes.eq(2).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1\' node is enabled'); + assert.notOk($folderNodes.eq(2).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1\' node is enabled'); assert.ok($folderNodes.eq(2).is(':visible'), '\'Folder 1.1\' node is visible'); - assert.notOk($folderNodes.eq(3).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1\' node is enabled'); + assert.notOk($folderNodes.eq(3).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1\' node is enabled'); assert.ok($folderNodes.eq(3).is(':visible'), '\'Folder 1.1.1\' node is visible'); - assert.ok($folderNodes.eq(4).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1\' node is disabled'); + assert.ok($folderNodes.eq(4).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1\' node is disabled'); assert.ok($folderNodes.eq(4).is(':visible'), '\'Folder 1.1.1.1\' node is visible'); - assert.ok($folderNodes.eq(5).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1.1\' node is disabled'); + assert.ok($folderNodes.eq(5).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1.1\' node is disabled'); assert.ok($folderNodes.eq(5).is(':visible'), '\'Folder 1.1.1.1.1\' node is visible'); - assert.notOk($folderNodes.eq(6).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.2\' node is enabled'); + assert.notOk($folderNodes.eq(6).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.2\' node is enabled'); assert.ok($folderNodes.eq(6).is(':visible'), '\'Folder 1.2\' node is visible'); - assert.notOk($folderNodes.eq(7).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); + assert.notOk($folderNodes.eq(7).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); assert.ok($folderNodes.eq(7).is(':visible'), '\'Folder 2\' node is visible'); - assert.notOk($folderNodes.eq(8).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); + assert.notOk($folderNodes.eq(8).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); assert.ok($folderNodes.eq(8).is(':visible'), '\'Folder 3\' node is visible'); }); @@ -1706,27 +1706,27 @@ QUnit.module('Editing operations', moduleConfig, () => { $folderNodes = this.wrapper.getFolderNodes(true); assert.ok(this.wrapper.getFolderChooserDialog().is(':visible'), 'Folder chooser dialog is visible'); assert.strictEqual($folderNodes.length, 9, 'there are only 9 nodes'); - assert.notOk($folderNodes.eq(0).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is enabled'); + assert.notOk($folderNodes.eq(0).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is enabled'); assert.ok($folderNodes.eq(0).is(':visible'), '\'Files\' node is visible'); - assert.ok($folderNodes.eq(1).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); + assert.ok($folderNodes.eq(1).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is disabled'); assert.ok($folderNodes.eq(1).is(':visible'), '\'Folder 1\' node is visible'); - assert.ok($folderNodes.eq(2).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1\' node is disabled'); + assert.ok($folderNodes.eq(2).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1\' node is disabled'); assert.ok($folderNodes.eq(2).is(':visible'), '\'Folder 1.1\' node is visible'); - assert.notOk($folderNodes.eq(3).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1\' node is enabled'); + assert.notOk($folderNodes.eq(3).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1\' node is enabled'); assert.notOk($folderNodes.eq(3).is(':visible'), '\'Folder 1.1.1\' node is invisible'); - assert.notOk($folderNodes.eq(4).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1\' node is enabled'); + assert.notOk($folderNodes.eq(4).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1\' node is enabled'); assert.notOk($folderNodes.eq(4).is(':visible'), '\'Folder 1.1.1.1\' node is invisible'); - assert.notOk($folderNodes.eq(5).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1.1\' node is enabled'); + assert.notOk($folderNodes.eq(5).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.1.1.1.1\' node is enabled'); assert.notOk($folderNodes.eq(5).is(':visible'), '\'Folder 1.1.1.1.1\' node is invisible'); - assert.notOk($folderNodes.eq(6).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.2\' node is enabled'); + assert.notOk($folderNodes.eq(6).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1.2\' node is enabled'); assert.ok($folderNodes.eq(6).is(':visible'), '\'Folder 1.2\' node is visible'); - assert.notOk($folderNodes.eq(7).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); + assert.notOk($folderNodes.eq(7).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); assert.ok($folderNodes.eq(7).is(':visible'), '\'Folder 2\' node is visible'); - assert.notOk($folderNodes.eq(8).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); + assert.notOk($folderNodes.eq(8).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); assert.ok($folderNodes.eq(8).is(':visible'), '\'Folder 3\' node is visible'); }); @@ -1739,13 +1739,13 @@ QUnit.module('Editing operations', moduleConfig, () => { const $folderNodes = this.wrapper.getFolderNodes(true); assert.strictEqual($folderNodes.length, 4, 'there are only 4 nodes'); - assert.ok($folderNodes.eq(0).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); + assert.ok($folderNodes.eq(0).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); assert.ok($folderNodes.eq(0).is(':visible'), '\'Files\' node is visible'); - assert.notOk($folderNodes.eq(1).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is enabled'); + assert.notOk($folderNodes.eq(1).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is enabled'); assert.ok($folderNodes.eq(1).is(':visible'), '\'Folder 1\' node is visible'); - assert.notOk($folderNodes.eq(2).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); + assert.notOk($folderNodes.eq(2).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is enabled'); assert.ok($folderNodes.eq(2).is(':visible'), '\'Folder 2\' node is visible'); - assert.notOk($folderNodes.eq(3).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); + assert.notOk($folderNodes.eq(3).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); assert.ok($folderNodes.eq(3).is(':visible'), '\'Folder 3\' node is visible'); $folderNodes.eq(1).trigger('dxclick'); @@ -2069,19 +2069,19 @@ QUnit.module('Editing operations', moduleConfig, () => { assert.strictEqual(this.wrapper.getFolderToggles(true).length, 2, 'there are 2 node toggles'); assert.ok($folderNodes.eq(0).is(':visible'), '\'Files\' node is visible'); - assert.ok($folderNodes.eq(0).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); + assert.ok($folderNodes.eq(0).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Files\' node is disabled'); assert.strictEqual(this.wrapper.isFolderNodeToggleOpened('Files', true), true, '\'Files\' toggle is opened'); assert.ok($folderNodes.eq(1).is(':visible'), '\'Folder 1\' node is visible'); - assert.notOk($folderNodes.eq(1).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is enabled'); + assert.notOk($folderNodes.eq(1).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 1\' node is enabled'); assert.strictEqual(this.wrapper.isFolderNodeToggleOpened('Folder 1', true), false, '\'Folder 1\' toggle is closed'); assert.ok($folderNodes.eq(2).is(':visible'), '\'Folder 2\' node is visible'); - assert.notOk($folderNodes.eq(2).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is ensabled'); + assert.notOk($folderNodes.eq(2).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 2\' node is ensabled'); assert.strictEqual(this.wrapper.isFolderNodeToggleOpened('Folder 2', true), null, '\'Folder 2\' toggle is absent'); assert.ok($folderNodes.eq(3).is(':visible'), '\'Folder 3\' node is visible'); - assert.notOk($folderNodes.eq(3).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); + assert.notOk($folderNodes.eq(3).find(`.${Consts.FOLDERS_TREE_VIEW_ITEM_CONTENT_CLASS}`).is(`.${Consts.DISABLED_STATE_CLASS}`), '\'Folder 3\' node is enabled'); assert.strictEqual(this.wrapper.isFolderNodeToggleOpened('Folder 3', true), null, '\'Folder 3\' toggle is absent'); this.wrapper.getDialogButton('Cancel').trigger('dxclick'); From d4006e7c5966b2c98da7cd4b14ed8eabcf0e96a1 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrinovich <52966626+dmlvr@users.noreply.github.com> Date: Mon, 16 Feb 2026 20:35:53 +0200 Subject: [PATCH 15/16] Update packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Dmitry Lavrinovich <52966626+dmlvr@users.noreply.github.com> --- .../tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js index 4c98388706ce..fef4009cdd0c 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeViewParts/optionChanged.js @@ -73,7 +73,7 @@ QUnit.test('node should not have disabled class when it was disabled at runtime' }); const instance = $treeView.dxTreeView('instance'); const $item = $treeView.find('.dx-treeview-item').eq(0); - const $itemContent = $treeView.find('.dx-item-content').eq(0); + const $itemContent = $treeView.find('.dx-treeview-item-content').eq(0); instance.option('items[0].disabled', true); assert.notOk($item.hasClass('dx-state-disabled'), 'item frame do not have disabled class'); From 1a4f5ec091a58aca103e7a2c326f1a3833b789d7 Mon Sep 17 00:00:00 2001 From: dmlvr Date: Tue, 17 Feb 2026 10:18:25 +0200 Subject: [PATCH 16/16] update expanded test for treeview --- .../tests/DevExpress.ui.widgets/treeView.expanded.tests.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js index 660d358f0e7b..b2d07fed0de0 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.expanded.tests.js @@ -225,11 +225,11 @@ module('Expanded items', { }); const treeView = $treeView.dxTreeView('instance'); const $firstItem = $treeView.find(`.${TREEVIEW_ITEM_CLASS}`).eq(0); - const $icon = $firstItem.parent().find(`> .${TREEVIEW_TOGGLE_ITEM_VISIBILITY_CLASS}`); + const $icon = $firstItem.find(`.${TREEVIEW_TOGGLE_ITEM_VISIBILITY_CLASS}`); $icon.trigger('dxclick'); - assert.ok(!treeView.option('items')[0].expanded, 'disabled item was not expanded'); + assert.ok(treeView.option('items')[0].expanded, 'disabled item was expanded'); }); test('disabled item with custom expander icons should expand on click', function(assert) {