function rebuildIndex() { openModal({ title: 'Rebuilding search index…', body: 'Walking the wiki tree.' }); fetch('/_reindex', { method: 'POST' }) .then(function (resp) { if (!resp.ok) throw new Error('rebuild failed: ' + resp.status); window.location.href = window.location.href; }) .catch(function (err) { closeModal(); openModal({ title: 'Rebuild failed', body: String(err), confirm: { label: 'OK' } }); }); } function encodeSearchPath(p) { if (p === '/' || p === '') return '/'; return '/' + p.replace(/^\/+/, '').split('/').map(encodeURIComponent).join('/'); } // createSearchPage runs the new-page flow (pick a parent folder, then confirm // the name) starting from the search query, so a query with no exact page can // be turned into that page in one step. The name field is pre-filled with the // query but stays editable. function createSearchPage(name) { var current = decodeURIComponent(window.location.pathname).replace(/\/+$/, '') || '/'; openTreePicker({ title: 'New page — where?', mode: 'folder', initialPath: current, preselect: current, hideFiles: true, confirmLabel: 'NEXT', onSelect: function (parentPath) { var input = document.createElement('input'); input.type = 'text'; input.className = 'input'; input.placeholder = 'Page name'; input.value = name || ''; openModal({ title: 'New page — name?', body: input, confirm: { label: 'CREATE', onConfirm: function () { var finalName = input.value.trim(); if (!finalName) return; var base = parentPath === '/' ? '/' : encodeSearchPath(parentPath) + '/'; window.location.href = base + encodeURIComponent(finalName) + '/?edit'; } } }); } }); } document.addEventListener('DOMContentLoaded', function () { wireDropdown(document.querySelector('[data-action="actions-drop"]')); var createLink = document.querySelector('[data-create-page]'); if (createLink) { createLink.addEventListener('click', function (e) { e.preventDefault(); createSearchPage(createLink.getAttribute('data-create-page')); }); } // Focus the search input on results pages so Tab steps directly into the // first match — the input sits immediately before the results in DOM // order, so the natural tab sequence is input → first result → next, … var input = document.querySelector('.search-input'); if (input && input.value) { input.focus(); var end = input.value.length; try { input.setSelectionRange(end, end); } catch (e) {} } });