Skip to content

Commit d0b5370

Browse files
dropdownbox demo improvements (#31816)
Signed-off-by: DuckTieCorpMember <[email protected]> Signed-off-by: assylbek.danyshbek <[email protected]> Co-authored-by: Copilot <[email protected]>
1 parent bed3156 commit d0b5370

File tree

6 files changed

+55
-50
lines changed

6 files changed

+55
-50
lines changed

apps/demos/Demos/DropDownBox/SingleSelection/Angular/app/app.component.html

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
[showClearButton]="true"
1313
[dataSource]="treeDataSource"
1414
(onValueChanged)="syncTreeViewSelection()"
15-
(onOptionChanged)="onTreeBoxOptionChanged($event)"
1615
>
1716
<div *dxTemplate="let data of 'content'">
1817
<dx-tree-view
@@ -44,15 +43,15 @@
4443
[inputAttr]="{ 'aria-label': 'Owner' }"
4544
[showClearButton]="true"
4645
[dataSource]="gridDataSource"
47-
(onOptionChanged)="onGridBoxOptionChanged($event)"
4846
>
4947
<div *dxTemplate="let data of 'content'">
5048
<dx-data-grid
5149
[dataSource]="gridDataSource"
5250
[columns]="gridColumns"
5351
[hoverStateEnabled]="true"
5452
showBorders="true"
55-
[(selectedRowKeys)]="gridBoxValue"
53+
[selectedRowKeys]="gridBoxValue"
54+
(onSelectionChanged)="dataGrid_selectionChanged($event)"
5655
height="100%"
5756
>
5857
<dxo-data-grid-selection mode="single"></dxo-data-grid-selection>

apps/demos/Demos/DropDownBox/SingleSelection/Angular/app/app.component.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
77
import { lastValueFrom } from 'rxjs';
88
import { CustomStore } from 'devextreme-angular/common/data';
99
import { DxDataGridModule } from 'devextreme-angular';
10+
import { DxDataGridTypes } from 'devextreme-angular/ui/data-grid';
1011
import { DxTreeViewModule, DxTreeViewComponent, DxTreeViewTypes } from 'devextreme-angular/ui/tree-view';
11-
import { DxDropDownBoxModule, DxDropDownBoxTypes } from 'devextreme-angular/ui/drop-down-box';
12+
import { DxDropDownBoxModule } from 'devextreme-angular/ui/drop-down-box';
1213

1314
if (!/localhost/.test(document.location.host)) {
1415
enableProdMode();
@@ -66,27 +67,23 @@ export class AppComponent {
6667
} else {
6768
this.treeView.instance.unselectAll();
6869
}
70+
71+
this.isTreeBoxOpened = false;
72+
this.ref.detectChanges();
6973
}
7074

7175
treeView_itemSelectionChanged(e: DxTreeViewTypes.ItemSelectionChangedEvent) {
72-
this.treeBoxValue = e.component.getSelectedNodeKeys();
76+
const selectedKeys = e.component.getSelectedNodeKeys();
77+
this.treeBoxValue = selectedKeys.length > 0 ? selectedKeys[0] : null;
7378
}
7479

75-
gridBox_displayExpr = ({ CompanyName, Phone }) => CompanyName && `${CompanyName} <${Phone}>`;
76-
77-
onTreeBoxOptionChanged(e: DxDropDownBoxTypes.OptionChangedEvent) {
78-
if (e.name === 'value') {
79-
this.isTreeBoxOpened = false;
80-
this.ref.detectChanges();
81-
}
80+
dataGrid_selectionChanged(e: DxDataGridTypes.SelectionChangedEvent) {
81+
this.gridBoxValue = e.selectedRowKeys;
82+
this.isGridBoxOpened = false;
83+
this.ref.detectChanges();
8284
}
8385

84-
onGridBoxOptionChanged(e: DxDropDownBoxTypes.OptionChangedEvent) {
85-
if (e.name === 'value') {
86-
this.isGridBoxOpened = false;
87-
this.ref.detectChanges();
88-
}
89-
}
86+
gridBox_displayExpr = ({ CompanyName, Phone }) => CompanyName && `${CompanyName} <${Phone}>`;
9087
}
9188

9289
@NgModule({

apps/demos/Demos/DropDownBox/SingleSelection/React/App.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ function App() {
3434

3535
const treeViewItemSelectionChanged = useCallback(
3636
(e: { component: { getSelectedNodeKeys: () => any } }) => {
37-
setTreeBoxValue(e.component.getSelectedNodeKeys());
37+
const selectedKeys = e.component.getSelectedNodeKeys();
38+
setTreeBoxValue(selectedKeys.length > 0 ? selectedKeys[0] : null);
3839
},
3940
[],
4041
);
@@ -51,10 +52,6 @@ function App() {
5152
[treeBoxValue],
5253
);
5354

54-
const onTreeItemClick = useCallback(() => {
55-
setIsTreeBoxOpened(false);
56-
}, []);
57-
5855
const treeViewRender = useCallback(
5956
() => (
6057
<TreeView
@@ -67,11 +64,10 @@ function App() {
6764
displayExpr="name"
6865
selectByClick={true}
6966
onContentReady={treeViewOnContentReady}
70-
onItemClick={onTreeItemClick}
7167
onItemSelectionChanged={treeViewItemSelectionChanged}
7268
/>
7369
),
74-
[treeViewRef, treeViewOnContentReady, onTreeItemClick, treeViewItemSelectionChanged],
70+
[treeViewRef, treeViewOnContentReady, treeViewItemSelectionChanged],
7571
);
7672

7773
const dataGridRender = useCallback(
@@ -106,6 +102,8 @@ function App() {
106102
} else {
107103
treeViewRef.current.instance().selectItem(e.value);
108104
}
105+
106+
setIsTreeBoxOpened(false);
109107
}, []);
110108

111109
const syncDataGridSelection = useCallback((e: DropDownBoxTypes.ValueChangedEvent) => {

apps/demos/Demos/DropDownBox/SingleSelection/ReactJs/App.js

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ function App() {
2727
const [isGridBoxOpened, setIsGridBoxOpened] = useState(false);
2828
const [isTreeBoxOpened, setIsTreeBoxOpened] = useState(false);
2929
const treeViewItemSelectionChanged = useCallback((e) => {
30-
setTreeBoxValue(e.component.getSelectedNodeKeys());
30+
const selectedKeys = e.component.getSelectedNodeKeys();
31+
setTreeBoxValue(selectedKeys.length > 0 ? selectedKeys[0] : null);
3132
}, []);
3233
const dataGridOnSelectionChanged = useCallback((e) => {
3334
setGridBoxValue(e.selectedRowKeys);
@@ -39,9 +40,6 @@ function App() {
3940
},
4041
[treeBoxValue],
4142
);
42-
const onTreeItemClick = useCallback(() => {
43-
setIsTreeBoxOpened(false);
44-
}, []);
4543
const treeViewRender = useCallback(
4644
() => (
4745
<TreeView
@@ -54,11 +52,10 @@ function App() {
5452
displayExpr="name"
5553
selectByClick={true}
5654
onContentReady={treeViewOnContentReady}
57-
onItemClick={onTreeItemClick}
5855
onItemSelectionChanged={treeViewItemSelectionChanged}
5956
/>
6057
),
61-
[treeViewRef, treeViewOnContentReady, onTreeItemClick, treeViewItemSelectionChanged],
58+
[treeViewRef, treeViewOnContentReady, treeViewItemSelectionChanged],
6259
);
6360
const dataGridRender = useCallback(
6461
() => (
@@ -90,6 +87,7 @@ function App() {
9087
} else {
9188
treeViewRef.current.instance().selectItem(e.value);
9289
}
90+
setIsTreeBoxOpened(false);
9391
}, []);
9492
const syncDataGridSelection = useCallback((e) => {
9593
setGridBoxValue(e.value);

apps/demos/Demos/DropDownBox/SingleSelection/Vue/App.vue

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
>
1717
<template #content="{ data }">
1818
<DxTreeView
19+
ref="treeViewRef"
1920
:data-source="treeDataSource"
2021
:select-by-click="true"
2122
data-structure="plain"
2223
key-expr="ID"
2324
parent-id-expr="categoryId"
2425
selection-mode="single"
2526
display-expr="name"
26-
@content-ready="treeViewContentReady($event)"
27+
@content-ready="treeViewContentReady"
2728
@item-selection-changed="treeViewItemSelectionChanged($event)"
28-
@item-click="onTreeItemClick()"
2929
/>
3030
</template>
3131
</DxDropDownBox>
@@ -74,57 +74,69 @@ import { ref } from 'vue';
7474
import DxDropDownBox from 'devextreme-vue/drop-down-box';
7575
import DxTreeView, { type DxTreeViewTypes } from 'devextreme-vue/tree-view';
7676
import {
77-
DxDataGrid, DxSelection, DxPaging, DxFilterRow, DxScrolling,
77+
DxDataGrid,
78+
DxSelection,
79+
DxPaging,
80+
DxFilterRow,
81+
DxScrolling,
7882
} from 'devextreme-vue/data-grid';
7983
import { CustomStore } from 'devextreme-vue/common/data';
84+
import type dxTreeView from 'devextreme/ui/tree_view';
8085
import 'whatwg-fetch';
8186
82-
const treeBoxValue = ref(['1_1']);
87+
const treeBoxValue = ref('1_1');
8388
const isGridBoxOpened = ref(false);
8489
const isTreeBoxOpened = ref(false);
8590
const gridBoxValue = ref([3]);
8691
const gridDataSource = makeAsyncDataSource('customers.json');
8792
const treeDataSource = makeAsyncDataSource('treeProducts.json');
8893
const gridColumns = ['CompanyName', 'City', 'Phone'];
8994
90-
let treeView: DxTreeView['instance'];
95+
const treeViewRef = ref<{ instance: dxTreeView } | null>(null);
9196
92-
function treeViewContentReady({ component }: DxTreeViewTypes.ContentReadyEvent) {
93-
treeView = component;
94-
syncTreeViewSelection();
97+
function treeViewContentReady({
98+
component,
99+
}: DxTreeViewTypes.ContentReadyEvent) {
100+
if (treeBoxValue.value) {
101+
component.selectItem(treeBoxValue.value);
102+
}
95103
}
96104
97105
function makeAsyncDataSource(jsonFile: string) {
98106
return new CustomStore({
99107
loadMode: 'raw',
100108
key: 'ID',
101109
load() {
102-
return fetch(`../../../../data/${jsonFile}`)
103-
.then((response) => response.json());
110+
return fetch(
111+
`../../../../data/${jsonFile}`,
112+
).then((response) => response.json());
104113
},
105114
});
106115
}
107116
108117
function syncTreeViewSelection() {
109-
treeView?.unselectAll();
118+
if (!treeViewRef?.value?.instance) return;
110119
111120
if (treeBoxValue.value) {
112-
treeView?.selectItem(treeBoxValue.value);
121+
treeViewRef.value.instance.selectItem(treeBoxValue.value);
122+
} else {
123+
treeViewRef.value.instance.unselectAll();
113124
}
125+
126+
isTreeBoxOpened.value = false;
114127
}
115128
116-
function treeViewItemSelectionChanged(e: DxTreeViewTypes.ItemSelectionChangedEvent) {
117-
treeBoxValue.value = e.component.getSelectedNodeKeys();
129+
function treeViewItemSelectionChanged(
130+
e: DxTreeViewTypes.ItemSelectionChangedEvent,
131+
) {
132+
const selectedKeys = e.component.getSelectedNodeKeys();
133+
treeBoxValue.value = selectedKeys.length > 0 ? selectedKeys[0] : null;
118134
}
119135
120136
function gridBoxDisplayExpr(item: any) {
121137
return item && `${item.CompanyName} <${item.Phone}>`;
122138
}
123139
124-
function onTreeItemClick() {
125-
isTreeBoxOpened.value = false;
126-
}
127-
128140
function onGridSelectionChanged() {
129141
isGridBoxOpened.value = false;
130142
}

apps/demos/Demos/DropDownBox/SingleSelection/jQuery/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ $(() => {
4444
selectNodesRecursive: false,
4545
onItemSelectionChanged(args) {
4646
const selectedKeys = args.component.getSelectedNodeKeys();
47-
e.component.option('value', selectedKeys);
47+
const singleValue = selectedKeys.length > 0 ? selectedKeys[0] : null;
48+
e.component.option('value', singleValue);
4849
},
4950
});
5051

0 commit comments

Comments
 (0)