BookStackApp/BookStack

View on GitHub
resources/js/components/template-manager.js

Summary

Maintainability
A
3 hrs
Test Coverage
import * as DOM from '../services/dom';
import {Component} from './component';

export class TemplateManager extends Component {

    setup() {
        this.container = this.$el;
        this.list = this.$refs.list;

        this.searchInput = this.$refs.searchInput;
        this.searchButton = this.$refs.searchButton;
        this.searchCancel = this.$refs.searchCancel;

        this.setupListeners();
    }

    setupListeners() {
        // Template insert action buttons
        DOM.onChildEvent(this.container, '[template-action]', 'click', this.handleTemplateActionClick.bind(this));

        // Template list pagination click
        DOM.onChildEvent(this.container, '.pagination a', 'click', this.handlePaginationClick.bind(this));

        // Template list item content click
        DOM.onChildEvent(this.container, '.template-item-content', 'click', this.handleTemplateItemClick.bind(this));

        // Template list item drag start
        DOM.onChildEvent(this.container, '.template-item', 'dragstart', this.handleTemplateItemDragStart.bind(this));

        // Search box enter press
        this.searchInput.addEventListener('keypress', event => {
            if (event.key === 'Enter') {
                event.preventDefault();
                this.performSearch();
            }
        });

        // Search submit button press
        this.searchButton.addEventListener('click', () => this.performSearch());

        // Search cancel button press
        this.searchCancel.addEventListener('click', () => {
            this.searchInput.value = '';
            this.performSearch();
        });
    }

    handleTemplateItemClick(event, templateItem) {
        const templateId = templateItem.closest('[template-id]').getAttribute('template-id');
        this.insertTemplate(templateId, 'replace');
    }

    handleTemplateItemDragStart(event, templateItem) {
        const templateId = templateItem.closest('[template-id]').getAttribute('template-id');
        event.dataTransfer.setData('bookstack/template', templateId);
        event.dataTransfer.setData('text/plain', templateId);
    }

    handleTemplateActionClick(event, actionButton) {
        event.stopPropagation();

        const action = actionButton.getAttribute('template-action');
        const templateId = actionButton.closest('[template-id]').getAttribute('template-id');
        this.insertTemplate(templateId, action);
    }

    async insertTemplate(templateId, action = 'replace') {
        const resp = await window.$http.get(`/templates/${templateId}`);
        const eventName = `editor::${action}`;
        window.$events.emit(eventName, resp.data);
    }

    async handlePaginationClick(event, paginationLink) {
        event.preventDefault();
        const paginationUrl = paginationLink.getAttribute('href');
        const resp = await window.$http.get(paginationUrl);
        this.list.innerHTML = resp.data;
    }

    async performSearch() {
        const searchTerm = this.searchInput.value;
        const resp = await window.$http.get('/templates', {
            search: searchTerm,
        });
        this.searchCancel.style.display = searchTerm ? 'block' : 'none';
        this.list.innerHTML = resp.data;
    }

}