Hi
I’m trying to use a grid within a web component but I’m failing to select a clicked row. What am I doing wrong…?
I’m able to put a listener on the component, I can also catch the relevant event but when I try to set “this.grid.selectedItems = item ? [item]
: ;” I get “Uncaught TypeError: Cannot set property ‘selectedItems’ of undefined.”
Where am I going wrong!?
import { LitElement, html, css } from 'lit-element';
import '@vaadin/vaadin-lumo-styles';
import '@vaadin/vaadin-grid/vaadin-grid.js';
import '@vaadin/vaadin-grid/vaadin-grid-column.js';
import '@vaadin/vaadin-grid/vaadin-grid-filter-column.js';
import '@vaadin/vaadin-grid/vaadin-grid-selection-column.js';
import '@vaadin/vaadin-button/vaadin-button.js';
import '@polymer/paper-card';
class CardUnitsList extends LitElement {
static get properties() {
return {
units: { type: Array },
cardHeader: { type: String }
};
}
constructor() {
super();
this.units = [];
this.cardHeader = '';
this.getUnits();
this.grid;
this.item;
}
firstUpdated(changedProperties) {
this.grid = this.shadowRoot.getElementById('grid');
this.grid.addEventListener('active-item-changed', this.onActiveItemChangedEvent);
}
updated(changedProperties) {
changedProperties.forEach((oldValue, propName) => {
//console.log(`${propName} changed. oldValue: ${oldValue}`);
if (propName === 'units'){
console.log('Prop units was updated!');
this.grid.items = this.units;
this.grid.recalculateColumnWidths();
}
});
}
onActiveItemChangedEvent(event) {
console.log(event.path[0]
._focusedItemIndex);
const item = event.detail.value;
this.grid.selectedItems = item ? [item]
: [];
}
doMagicThings(event) {
this.grid.recalculateColumnWidths();
}
getUnits() {
fetch('../../assets/units.json')
.then(response => {
return response.json();
})
.then(response => {
//console.log(response);
this.units = response;
});
}
static get styles() {
return css`
#card {
width: 800px;
max-height:450px;
padding-top: 0px;
padding-left: 20px;
padding-right: 20px;
padding-bottom:20px;
border-radius: 3px;
margin: 5px;
}
#grid {
max-height: 400px;
font-size: 14px;
}
#grid vaadin-text-field {
width: 100px;
}
`;
}
render() {
return html`
<paper-card id="card">
<div style="padding-left: 15px;">
<h2 style="color: rgb(110, 120, 130);">${this.cardHeader}</h2>
</div>
<div >
<vaadin-grid id="grid" aria-label="Selection using Active Item Example">
<vaadin-grid-column path="friendlyName" header="Name"></vaadin-grid-column>
<vaadin-grid-column path="modelName" header="Model"></vaadin-grid-column>
<vaadin-grid-column path="chassiNumber" header="Chassi Number"></vaadin-grid-column>
<vaadin-grid-column path="description" header="Description"></vaadin-grid-column>
</vaadin-grid>
</div>
</paper-card>
`;
}
}
customElements.define('card-units-list', CardUnitsList);