|
91 | 91 | </div> |
92 | 92 | </div> |
93 | 93 |
|
94 | | - <vaadin-grid multi-sort column-reordering-allowed> |
| 94 | + <vaadin-grid multi-sort column-reordering-allowed item-id-path="id"> |
95 | 95 | <vaadin-grid-selection-column></vaadin-grid-selection-column> |
96 | 96 |
|
97 | 97 | <vaadin-grid-column-group header="Personal Information"> |
|
116 | 116 | import '@vaadin/select'; |
117 | 117 | import '@vaadin/list-box'; |
118 | 118 |
|
| 119 | + const createItem = (id, children) => ({ |
| 120 | + name: `First Lastname ${id}`, |
| 121 | + email: `first.lastname${id}@example.com`, |
| 122 | + address: `${id} Main Street`, |
| 123 | + city: `City ${id}`, |
| 124 | + country: `Country ${id}`, |
| 125 | + children, |
| 126 | + id, |
| 127 | + }); |
| 128 | + |
119 | 129 | // Generate sample data |
120 | 130 | const generateItems = (count) => { |
121 | | - return Array.from({ length: count }, (_, i) => ({ |
122 | | - name: `First Lastname ${i + 1}`, |
123 | | - email: `first.lastname${i + 1}@example.com`, |
124 | | - address: `${i + 1} Main Street`, |
125 | | - city: `City ${i + 1}`, |
126 | | - country: `Country ${i + 1}`, |
127 | | - children: i % 3 === 0, |
128 | | - })); |
| 131 | + return Array.from({ length: count }, (_, i) => createItem(i + 1, i % 3 === 0)); |
| 132 | + }; |
| 133 | + |
| 134 | + const generateDataProvider = (rootLevelSize) => { |
| 135 | + return ({ parentItem, page, pageSize }, cb) => { |
| 136 | + if (!parentItem) { |
| 137 | + const rootItems = generateItems(rootLevelSize); |
| 138 | + const offset = page * pageSize; |
| 139 | + cb(rootItems.slice(offset, offset + pageSize), rootItems.length); |
| 140 | + } else { |
| 141 | + const childId = parentItem.id + '-1'; |
| 142 | + const childItem = createItem(childId, parentItem.children); |
| 143 | + cb([childItem], 1); |
| 144 | + } |
| 145 | + }; |
129 | 146 | }; |
130 | 147 |
|
131 | 148 | // Setup grid and controls |
|
134 | 151 | const treeColumn = grid.querySelector('vaadin-grid-tree-column'); |
135 | 152 |
|
136 | 153 | // Initialize grid with data |
137 | | - grid.items = generateItems(100); |
| 154 | + grid.dataProvider = generateDataProvider(100); |
138 | 155 |
|
139 | 156 | // Setup row details renderer |
140 | 157 | const rowDetailsRenderer = (root, grid, model) => { |
@@ -177,15 +194,17 @@ <h4>Details for ${model.item.name}</h4> |
177 | 194 |
|
178 | 195 | // Items Controls |
179 | 196 | document.getElementById('items').addEventListener('value-changed', (e) => { |
180 | | - grid.items = generateItems(parseInt(e.detail.value)); |
| 197 | + grid.dataProvider = generateDataProvider(parseInt(e.detail.value)); |
181 | 198 | }); |
182 | 199 |
|
183 | 200 | document.getElementById('details').addEventListener('checked-changed', (e) => { |
184 | 201 | grid.rowDetailsRenderer = e.detail.value ? rowDetailsRenderer : undefined; |
| 202 | + grid.detailsOpenedItems = []; |
185 | 203 | }); |
186 | 204 |
|
187 | 205 | document.getElementById('children').addEventListener('checked-changed', (e) => { |
188 | 206 | grid.itemHasChildrenPath = e.detail.value ? 'children' : ''; |
| 207 | + grid.requestContentUpdate(); |
189 | 208 | }); |
190 | 209 |
|
191 | 210 | // Column Controls |
@@ -276,8 +295,10 @@ <h4>Details for ${model.item.name}</h4> |
276 | 295 |
|
277 | 296 | // Handle active item changes for details |
278 | 297 | grid.addEventListener('active-item-changed', (e) => { |
279 | | - const item = e.detail.value; |
280 | | - grid.detailsOpenedItems = item ? [item] : []; |
| 298 | + if (grid.rowDetailsRenderer) { |
| 299 | + const item = e.detail.value; |
| 300 | + grid.detailsOpenedItems = item ? [item] : []; |
| 301 | + } |
281 | 302 | }); |
282 | 303 |
|
283 | 304 | // Drag & Drop Controls |
|
0 commit comments