'use strict' var editor = {} editor.textareaAutoGrow = function () { let autogrow = function () { console.log(this.style.height) this.style.height = 'auto' this.style.height = (this.scrollHeight) + 'px' } let textareas = document.getElementsByTagName('textarea') let addAutoGrow = () => { Array.from(textareas).forEach(textarea => { autogrow.bind(textarea)() textarea.addEventListener('keyup', autogrow) }) } addAutoGrow() window.addEventListener('resize', addAutoGrow) } editor.toggleSourceEditor = function (event) { event.preventDefault() if (document.querySelector('[data-kind="content-only"]')) { window.location = window.location.pathname + '?visual=true' return } window.location = window.location.pathname + '?visual=false' } function deleteFrontMatterItem (event) { event.preventDefault() document.getElementById(this.dataset.delete).remove() } function makeFromBaseTemplate (id, type, name, parent) { let clone = document.importNode(templates.base.content, true) clone.querySelector('fieldset').id = id clone.querySelector('fieldset').dataset.type = type clone.querySelector('h3').innerHTML = name clone.querySelector('.delete').dataset.delete = id clone.querySelector('.delete').addEventListener('click', deleteFrontMatterItem) clone.querySelector('.add').addEventListener('click', addFrontMatterItem) if (parent.classList.contains('frontmatter')) { parent.insertBefore(clone, document.querySelector('div.button.add')) return } parent.appendChild(clone) } function makeFromArrayItemTemplate (id, number, parent) { let clone = document.importNode(templates.arrayItem.content, true) clone.querySelector('[data-type="array-item"]').id = `${id}-${number}` clone.querySelector('input').name = id clone.querySelector('input').id = id clone.querySelector('div.action').dataset.delete = `${id}-${number}` clone.querySelector('div.action').addEventListener('click', deleteFrontMatterItem) parent.querySelector('.group').appendChild(clone) document.getElementById(`${id}-${number}`).querySelector('input').focus() } function makeFromObjectItemTemplate (id, name, parent) { let clone = document.importNode(templates.objectItem.content, true) clone.querySelector('.block').id = `block-${id}` clone.querySelector('.block').dataset.content = id clone.querySelector('label').for = id clone.querySelector('label').innerHTML = name clone.querySelector('input').name = id clone.querySelector('input').id = id clone.querySelector('.action').dataset.delete = `block-${id}` clone.querySelector('.action').addEventListener('click', deleteFrontMatterItem) parent.appendChild(clone) document.getElementById(id).focus() } function addFrontMatterItemPrompt (parent) { return function (event) { event.preventDefault() let value = event.currentTarget.querySelector('input').value if (value === '') { return true } closePrompt(event) let name = value.substring(0, value.lastIndexOf(':')) let type = value.substring(value.lastIndexOf(':') + 1, value.length) if (type !== '' && type !== 'array' && type !== 'object') { name = value } name = name.replace(' ', '_') let id = name if (parent.id != '') { id = parent.id + '.' + id } if (type == 'array' || type == 'object') { if (parent.dataset.type == 'parent') { makeFromBaseTemplate(id, type, name, document.querySelector('.frontmatter')) return } makeFromBaseTemplate(id, type, name, block) return } let group = parent.querySelector('.group') if (group == null) { parent.insertAdjacentHTML('afterbegin', '
') group = parent.querySelector('.group') } makeFromObjectItemTemplate(id, name, group) } } function addFrontMatterItem (event) { event.preventDefault() let parent = event.currentTarget.parentNode let type = parent.dataset.type // If the block is an array if (type === 'array') { let id = parent.id + '[]' let count = parent.querySelectorAll('.group > div').length let fieldsets = parent.getElementsByTagName('fieldset') if (fieldsets.length > 0) { let itemType = fieldsets[0].dataset.type let itemID = parent.id + '[' + fieldsets.length + ']' let itemName = fieldsets.length makeFromBaseTemplate(itemID, itemType, itemName, parent) } else { makeFromArrayItemTemplate(id, count, parent) } return } if (type === 'object' || type === 'parent') { let clone = document.importNode(templates.question.content, true) clone.querySelector('form').id = tempID clone.querySelector('h3').innerHTML = 'New field' clone.querySelector('p').innerHTML = 'Write the field name and then press enter. If you want to create an array or an object, end the name with :array or :object.' clone.querySelector('.ok').innerHTML = 'Create' clone.querySelector('form').addEventListener('submit', addFrontMatterItemPrompt(parent)) clone.querySelector('form').classList.add('active') document.querySelector('body').appendChild(clone) document.querySelector('.overlay').classList.add('active') document.getElementById(tempID).classList.add('active') } return false } document.addEventListener('DOMContentLoaded', (event) => { if (!document.getElementById('editor')) return editor.textareaAutoGrow() templates.arrayItem = document.getElementById('array-item-template') templates.base = document.getElementById('base-template') templates.objectItem = document.getElementById('object-item-template') templates.temporary = document.getElementById('temporary-template') buttons.save = document.querySelector('#save') buttons.editSource = document.querySelector('#edit-source') if (buttons.editSource) { buttons.editSource.addEventListener('click', editor.toggleSourceEditor) } let container = document.getElementById('editor'), kind = container.dataset.kind, rune = container.dataset.rune if (kind != 'frontmatter-only') { let editor = document.querySelector('.content #ace'), mode = editor.dataset.mode, textarea = document.querySelector('textarea[name="content"]'), aceEditor = ace.edit('ace'), options = { wrap: true, maxLines: Infinity, theme: 'ace/theme/github', showPrintMargin: false, fontSize: '1em', minLines: 20 } aceEditor.getSession().setMode('ace/mode/' + mode) aceEditor.getSession().setValue(textarea.value) aceEditor.getSession().on('change', function () { textarea.value = aceEditor.getSession().getValue() }) if (mode == 'markdown') options.showGutter = false aceEditor.setOptions(options) } let deleteFrontMatterItemButtons = document.getElementsByClassName('delete') Array.from(deleteFrontMatterItemButtons).forEach(button => { button.addEventListener('click', deleteFrontMatterItem) }) let addFrontMatterItemButtons = document.getElementsByClassName('add') Array.from(addFrontMatterItemButtons).forEach(button => { button.addEventListener('click', addFrontMatterItem) }) let saveContent = function () { let data = form2js(document.querySelector('form')) if (typeof data.content === 'undefined' && kind !== 'frontmatter-only') { data.content = '' } if (typeof data.content === 'number') { data.content = data.content.toString() } let request = new XMLHttpRequest() buttons.setLoading('save') webdav.put(window.location.pathname, JSON.stringify(data), { 'Kind': kind, 'Rune': rune }) .then(() => { buttons.setDone('save') }) .catch(e => { console.log(e) buttons.setDone('save', false) }) } document.querySelector('#save').addEventListener('click', event => { event.preventDefault() saveContent() }) document.querySelector('form').addEventListener('submit', (event) => { event.preventDefault() saveContent() }) window.addEventListener('keydown', (event) => { if (event.ctrlKey || event.metaKey) { switch (String.fromCharCode(event.which).toLowerCase()) { case 's': event.preventDefault() saveContent() break } } }) return false })