BookStackApp/BookStack

View on GitHub
resources/js/components/page-picker.js

Summary

Maintainability
A
0 mins
Test Coverage
import {Component} from './component';

function toggleElem(elem, show) {
    elem.toggleAttribute('hidden', !show);
}

export class PagePicker extends Component {

    setup() {
        this.input = this.$refs.input;
        this.resetButton = this.$refs.resetButton;
        this.selectButton = this.$refs.selectButton;
        this.display = this.$refs.display;
        this.defaultDisplay = this.$refs.defaultDisplay;
        this.buttonSep = this.$refs.buttonSeperator;

        this.selectorEndpoint = this.$opts.selectorEndpoint;

        this.value = this.input.value;
        this.setupListeners();
    }

    setupListeners() {
        this.selectButton.addEventListener('click', this.showPopup.bind(this));
        this.display.parentElement.addEventListener('click', this.showPopup.bind(this));
        this.display.addEventListener('click', e => e.stopPropagation());

        this.resetButton.addEventListener('click', () => {
            this.setValue('', '');
        });
    }

    showPopup() {
        /** @type {EntitySelectorPopup} * */
        const selectorPopup = window.$components.first('entity-selector-popup');
        selectorPopup.show(entity => {
            this.setValue(entity.id, entity.name);
        }, {
            initialValue: '',
            searchEndpoint: this.selectorEndpoint,
            entityTypes: 'page',
            entityPermission: 'view',
        });
    }

    setValue(value, name) {
        this.value = value;
        this.input.value = value;
        this.controlView(name);
    }

    controlView(name) {
        const hasValue = this.value && this.value !== 0;
        toggleElem(this.resetButton, hasValue);
        toggleElem(this.buttonSep, hasValue);
        toggleElem(this.defaultDisplay, !hasValue);
        toggleElem(this.display, hasValue);
        if (hasValue) {
            const id = this.getAssetIdFromVal();
            this.display.textContent = `#${id}, ${name}`;
            this.display.href = window.baseUrl(`/link/${id}`);
        }
    }

    getAssetIdFromVal() {
        return Number(this.value);
    }

}