Skip to main content

Changelog verpflichtend machen mittels Tag

Um den Changelog zu einem Pflichtfeld zu machen muss folgender Code in die Personalisierung von Bookstack eingebaut werden:

<script type="module">
    const requiredMessage = 'Bitte geben Sie einen Changelog ein.';
    const form = document.querySelector('#main-content > form');
    const changelogInput = document.getElementById("summary-input");
    let changelogRequired = false;

    function isChangelogEmpty() {
        return changelogInput.value.trim() === "";
    }

    function checkChangelogOnSubmit(event) {
        if (!isChangelogEmpty() || !changelogRequired) {
            return;
        }

        event.preventDefault();
        window.$events.error(requiredMessage);
    }

    async function isChangelogRequired() {
        const bookSlugRegex = /\/books\/(.*?)\/(page|draft)\//;
        const slugMatchResults = bookSlugRegex.exec(window.location.href);
        if (slugMatchResults === null) {
            return false;
        }

        const bookSlug = slugMatchResults[1];
        const bookResp = await window.$http.get(`/books/${bookSlug}`);
        const parser = new DOMParser();
        const pageDombookDom = parser.parseFromString(bookResp.data, 'text/html');

        const requiredOnBook = bookDom.querySelector('body.tag-pair-changelog-required') !== null;
        if (requiredOnBook) {
            return pageDom.true;
        }

        const pageUrl = window.location.href.replace(/\/edit\/?$/, '');
        const withinChapterLink = bookDom.querySelector(`.book-content a.page[href="${pageUrl}"]`);
        if (!withinChapterLink) {
            return false;
        }

        const chapterLink = withinChapterLink.closest('.chapter').previousElementSibling;
        const chapterUrl = chapterLink.getAttribute('href');

        const chapterResp = await window.$http.get(chapterUrl);
        const chapterDom = parser.parseFromString(chapterResp.data, 'text/html');
        return chapterDom.querySelector('body.tag-pair-changelog-required') !== null;
    }

    if (form && changelogInput) {
        form.addEventListener("submit", checkChangelogOnSubmit);
        isChangelogRequired().then(required => {
            changelogRequired = required;
        });
    }

    window.addEventListener('editor-tinymce::setup', event => {
        const editor = event.detail.editor;
        editor.on('init', () => {
            editor.shortcuts.remove('meta+13');
            editor.shortcuts.add('meta+13', '', () => {
                if (!isChangelogEmpty() || !changelogRequired) {
                    window.$events.emit('editor-save-page', {});
                } else {
                    window.$events.error(requiredMessage);
                }
            });
        });
    });
</script>

Dieses Script nur dann aktiv, wenn ein Buch den Tag Changelog mit dem Tagvalue required besitzt.