package.src.vaadin-grid-tree-toggle-mixin.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of grid Show documentation
Show all versions of grid Show documentation
A free, flexible and high-quality Web Component for showing large amounts of tabular data
/**
* @license
* Copyright (c) 2016 - 2023 Vaadin Ltd.
* This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
*/
import { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
import { isFocusable } from './vaadin-grid-active-item-mixin.js';
const template = document.createElement('template');
template.innerHTML = `
`;
document.head.appendChild(template.content);
registerStyles(
'vaadin-grid-tree-toggle',
css`
:host {
display: inline-flex;
align-items: baseline;
max-width: 100%;
/* CSS API for :host */
--vaadin-grid-tree-toggle-level-offset: 1em;
--_collapsed-icon: '\\e7be\\00a0';
}
:host([dir='rtl']) {
--_collapsed-icon: '\\e7bd\\00a0';
}
:host([hidden]) {
display: none !important;
}
:host(:not([leaf])) {
cursor: pointer;
}
#level-spacer,
[part='toggle'] {
flex: none;
}
#level-spacer {
display: inline-block;
width: calc(var(---level, '0') * var(--vaadin-grid-tree-toggle-level-offset));
}
[part='toggle']::before {
font-family: 'vaadin-grid-tree-icons';
line-height: 1em; /* make icon font metrics not affect baseline */
}
:host(:not([expanded])) [part='toggle']::before {
content: var(--_collapsed-icon);
}
:host([expanded]) [part='toggle']::before {
content: '\\e7bc\\00a0'; /* icon glyph + single non-breaking space */
}
:host([leaf]) [part='toggle'] {
visibility: hidden;
}
slot {
display: block;
overflow: hidden;
text-overflow: ellipsis;
}
`,
{ moduleId: 'vaadin-grid-tree-toggle-styles' },
);
/**
* @polymerMixin
*/
export const GridTreeToggleMixin = (superClass) =>
class extends superClass {
static get properties() {
return {
/**
* Current level of the tree represented with a horizontal offset
* of the toggle button.
* @type {number}
*/
level: {
type: Number,
value: 0,
observer: '_levelChanged',
sync: true,
},
/**
* Hides the toggle icon and disables toggling a tree sublevel.
* @type {boolean}
*/
leaf: {
type: Boolean,
value: false,
reflectToAttribute: true,
},
/**
* Sublevel toggle state.
* @type {boolean}
*/
expanded: {
type: Boolean,
value: false,
reflectToAttribute: true,
notify: true,
sync: true,
},
};
}
constructor() {
super();
this.addEventListener('click', (e) => this._onClick(e));
}
/** @private */
_onClick(e) {
if (this.leaf) {
return;
}
if (isFocusable(e.target) || e.target instanceof HTMLLabelElement) {
return;
}
e.preventDefault();
this.expanded = !this.expanded;
}
/** @private */
_levelChanged(level) {
const value = Number(level).toString();
this.style.setProperty('---level', value);
}
};