# Master Page

## HTML

```html
<vaadin-vertical-layout theme="padding spacing" style="align-items: stretch;">
  <mate-filter-panel id="filterPanel">
    <vaadin-text-field label="Username" id="usernameFilter"></vaadin-text-field>
    <vaadin-text-field label="Vorname" id="prenameFilter"></vaadin-text-field>
    <vaadin-text-field label="Nachname" id="familyNameFilter"></vaadin-text-field>
  </mate-filter-panel>
  <hr/>
  <mate-toolbar title-text="Users" for-grid="grid">
    <vaadin-button id="deleteButton">Löschen</vaadin-button>
  </mate-toolbar>
  <vaadin-grid id="grid" theme="column-borders" style="flex-grow: 1;">
    <mate-grid-addon id="gridAddon"></mate-grid-addon>
    <vaadin-grid-selection-column></vaadin-grid-selection-column>
    <vaadin-grid-sort-column id="username" header="Username" path="username" resizable>
      <mate-grid-details-column-addon></mate-grid-details-column-addon>
    </vaadin-grid-sort-column>
    <vaadin-grid-sort-column id="birthdate" header="Geburtstag" resizable>
    </vaadin-grid-sort-column>
    <vaadin-grid-sort-column id="gender" header="Geschlecht" resizable>
    </vaadin-grid-sort-column>
    <vaadin-grid-sort-column header="Vorname" path="prename" resizable></vaadin-grid-sort-column>
    <vaadin-grid-sort-column header="Nachname" path="familyName"></vaadin-grid-sort-column>
  </vaadin-grid>
</vaadin-vertical-layout>
```

## Javascript

Assuming allItems array is loaded from the backend without lazy loading:

```javascript
const grid = document.getElementById('grid');
grid.items = allItems;

grid.rowDetailsRenderer = (root, grid, model) => root.innerHTML = `<div><h6>More Information for ID ${model.item.id}</h6></div>`;
document.querySelector('#birthdate').renderer = (root, column, model) => root.textContent = model.item.birthdate.toLocaleString('de-DE', {year: 'numeric', month: '2-digit', day: '2-digit'});
document.querySelector('#gender').renderer = (root, column, model) => root.textContent = model.item.gender == DummyGender.Female ? 'Weiblich' : model.item.gender == DummyGender.Male ? 'Männlich' : 'Divers';

const gridAddon = document.getElementById('gridAddon');
gridAddon.rowProvider = item => {
  if (!item) return {};
  return { disabled: item.username.startsWith('s'), hasDetails: item.gender === DummyGender.Female };
};

gridAddon.primaryActionColumnProvider = item => {
  if (!item) return {};
  return { tooltipText: `Aktionen für ${item.username}`, children: [ { text: 'Bearbeiten' }, { text: 'Löschen', disabled: true, tooltipText: 'Du kannst dieses Element nicht löschen' }, { text: 'Children', children: [ { text: 'Test', tooltipText: 'My tooltip' }, { text: 'Male', hidden: item.gender != DummyGender.Male } ] } ] };
};

const filterPanel = document.getElementById('filterPanel');
const arrayFilter = (selector, itemProperty) => {
  const filterInputValue = document.getElementById(selector).value;
  return item => {
    if (!filterInputValue || filterInputValue.length < 1) {
      return true;
    }
    const itemValue = item[itemProperty];
    if (!itemValue || itemValue.length < 1) {
      return false;
    }
    return itemValue.toLowerCase().includes(filterInputValue.toLowerCase());
  };
};
filterPanel.addEventListener('search-click', e => {
  grid.items = allItems.filter(arrayFilter('usernameFilter', 'username')).filter(arrayFilter('prenameFilter', 'prename')).filter(arrayFilter('familyNameFilter', 'familyName'));
  grid.clearCache();
});
filterPanel.addEventListener('reset-click', e => {
  document.getElementById('usernameFilter').value = '';
  document.getElementById('prenameFilter').value = '';
  document.getElementById('familyNameFilter').value = '';
  grid.items = allItems;
  grid.clearCache();
});

const deleteButton = document.getElementById('deleteButton');
deleteButton.addEventListener('click', e => {
  if (grid.selectedItems) {
    grid.selectedItems.forEach(item => allItems.splice(allItems.indexOf(item), 1));
    grid.clearCache();
  }
});
```

For lazy loading examples see Grid component examples.