File: src/lib/UI/NativeDOM/List.js

Recommend this page to a friend!
  Classes of Dom Hastings  >  JS Webdav Client  >  src/lib/UI/NativeDOM/List.js  >  Download  
File: src/lib/UI/NativeDOM/List.js
Role: Class source
Content type: text/plain
Description: Class source
Class: JS Webdav Client
Access files of a Webdav server
Author: By
Last change:
Date: 1 year ago
Size: 2,154 bytes
 

Contents

Class file image Download
import Element from './Element.js'; import Item from './List/Item.js'; import supportsFocusWithin from '../supportsFocusWithin.js'; export default class List extends Element { #collection; #items; constructor() { const template = '<ul class="loading"></ul>'; super(template); this.bindEvents(); } bindEvents() { this.on('list:update:request', () => this.loading()); this.on('list:update:success', (collection) => this.update(collection)); this.on('list:update:failed', () => this.loading(false)); this.on('collection:update', (collection) => { if (collection === this.#collection) { this.update(); } }); this.on('entry:update', (entry) => { if (entry.collection === this.#collection) { this.update(); } }); const arrowHandler = (event) => { if (! [38, 40].includes(event.which)) { // if (! ['ArrowUp', 'ArrowDown'].includes(event.key)) { return; } event.preventDefault(); event.stopPropagation(); const current = this.element.querySelector(`li:focus${supportsFocusWithin ? ', li:focus-within' : ''}`), next = current ? current.nextSibling : this.element.querySelector('li:first-child'), previous = current ? current.previousSibling : null ; if (event.which === 38 && previous) { // if (event.key === 'ArrowUp' && previous) { previous.focus(); } else if (event.which === 40 && next) { // else if (event.key === 'ArrowDown' && next) { next.focus(); } }; document.addEventListener('keydown', arrowHandler); this.element.addEventListener('keydown', arrowHandler); } loading(loading = true) { if (loading) { return this.element.classList.add('loading'); } this.element.classList.remove('loading'); } update(collection = this.#collection) { this.emptyNode(); this.#items = collection.map((entry) => new Item(entry)); [...this.#items.map((item) => item.element)] .forEach((element) => this.element.appendChild(element)) ; this.loading(false); this.#collection = collection; } }