X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/b649738718fb62632574530392299f9aa9bbf53b..refs/pull/4728/head:/resources/js/components/entity-selector.js diff --git a/resources/js/components/entity-selector.js b/resources/js/components/entity-selector.js index 09d14b233..b12eeb402 100644 --- a/resources/js/components/entity-selector.js +++ b/resources/js/components/entity-selector.js @@ -1,5 +1,5 @@ -import {onChildEvent} from "../services/dom"; -import {Component} from "./component"; +import {onChildEvent} from '../services/dom'; +import {Component} from './component'; /** * Entity Selector @@ -10,6 +10,7 @@ export class EntitySelector extends Component { this.elem = this.$el; this.entityTypes = this.$opts.entityTypes || 'page,book,chapter'; this.entityPermission = this.$opts.entityPermission || 'view'; + this.searchEndpoint = this.$opts.searchEndpoint || '/search/entity-selector'; this.input = this.$refs.input; this.searchInput = this.$refs.search; @@ -18,7 +19,6 @@ export class EntitySelector extends Component { this.search = ''; this.lastClick = 0; - this.selectedItemData = null; this.setupListeners(); this.showLoading(); @@ -29,7 +29,7 @@ export class EntitySelector extends Component { this.elem.addEventListener('click', this.onClick.bind(this)); let lastSearch = 0; - this.searchInput.addEventListener('input', event => { + this.searchInput.addEventListener('input', () => { lastSearch = Date.now(); this.showLoading(); setTimeout(() => { @@ -43,35 +43,35 @@ export class EntitySelector extends Component { }); // Keyboard navigation - onChildEvent(this.$el, '[data-entity-type]', 'keydown', (e, el) => { - if (e.ctrlKey && e.code === 'Enter') { + onChildEvent(this.$el, '[data-entity-type]', 'keydown', event => { + if (event.ctrlKey && event.code === 'Enter') { const form = this.$el.closest('form'); if (form) { form.submit(); - e.preventDefault(); + event.preventDefault(); return; } } - if (e.code === 'ArrowDown') { + if (event.code === 'ArrowDown') { this.focusAdjacent(true); } - if (e.code === 'ArrowUp') { + if (event.code === 'ArrowUp') { this.focusAdjacent(false); } }); - this.searchInput.addEventListener('keydown', e => { - if (e.code === 'ArrowDown') { + this.searchInput.addEventListener('keydown', event => { + if (event.code === 'ArrowDown') { this.focusAdjacent(true); } - }) + }); } focusAdjacent(forward = true) { const items = Array.from(this.resultsContainer.querySelectorAll('[data-entity-type]')); const selectedIndex = items.indexOf(document.activeElement); - const newItem = items[selectedIndex+ (forward ? 1 : -1)] || items[0]; + const newItem = items[selectedIndex + (forward ? 1 : -1)] || items[0]; if (newItem) { newItem.focus(); } @@ -87,6 +87,11 @@ export class EntitySelector extends Component { this.searchInput.focus(); } + searchText(queryText) { + this.searchInput.value = queryText; + this.searchEntities(queryText); + } + showLoading() { this.loading.style.display = 'block'; this.resultsContainer.style.display = 'none'; @@ -101,11 +106,11 @@ export class EntitySelector extends Component { window.$http.get(this.searchUrl()).then(resp => { this.resultsContainer.innerHTML = resp.data; this.hideLoading(); - }) + }); } searchUrl() { - return `/search/entity-selector?types=${encodeURIComponent(this.entityTypes)}&permission=${encodeURIComponent(this.entityPermission)}`; + return `${this.searchEndpoint}?types=${encodeURIComponent(this.entityTypes)}&permission=${encodeURIComponent(this.entityPermission)}`; } searchEntities(searchTerm) { @@ -144,13 +149,12 @@ export class EntitySelector extends Component { const link = item.getAttribute('href'); const name = item.querySelector('.entity-list-item-name').textContent; - const data = {id: Number(id), name: name, link: link}; + const data = {id: Number(id), name, link}; if (isSelected) { item.classList.add('selected'); - this.selectedItemData = data; } else { - window.$events.emit('entity-select-change', null) + window.$events.emit('entity-select-change', null); } if (!isDblClick && !isSelected) return; @@ -159,7 +163,7 @@ export class EntitySelector extends Component { this.confirmSelection(data); } if (isSelected) { - window.$events.emit('entity-select-change', data) + window.$events.emit('entity-select-change', data); } } @@ -172,7 +176,6 @@ export class EntitySelector extends Component { for (const selectedElem of selected) { selectedElem.classList.remove('selected', 'primary-background'); } - this.selectedItemData = null; } -} \ No newline at end of file +}