Update from Git Manager GUI
This commit is contained in:
109
assets/js/search.js
Normal file
109
assets/js/search.js
Normal file
@@ -0,0 +1,109 @@
|
||||
/**
|
||||
* WP Multi Wiki – AJAX Search Script
|
||||
*/
|
||||
(function ($) {
|
||||
'use strict';
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
$('.wmw-search-widget').each(function () {
|
||||
var $widget = $(this);
|
||||
var $input = $widget.find('.wmw-search-input');
|
||||
var $results = $widget.find('.wmw-search-results');
|
||||
var $clear = $widget.find('.wmw-search-clear');
|
||||
var wikiId = parseInt($widget.data('wiki-id'), 10) || 0;
|
||||
var timer = null;
|
||||
|
||||
// ── Input handler ─────────────────────────────────────────────────
|
||||
$input.on('input', function () {
|
||||
clearTimeout(timer);
|
||||
var term = $input.val().trim();
|
||||
|
||||
if (term.length < 2) {
|
||||
closeResults();
|
||||
$clear.hide();
|
||||
return;
|
||||
}
|
||||
|
||||
$clear.show();
|
||||
timer = setTimeout(function () {
|
||||
doSearch(term);
|
||||
}, 280);
|
||||
});
|
||||
|
||||
// ── Clear button ──────────────────────────────────────────────────
|
||||
$clear.on('click', function () {
|
||||
$input.val('').trigger('input').focus();
|
||||
});
|
||||
|
||||
// ── Close on outside click ────────────────────────────────────────
|
||||
$(document).on('click.wmw', function (e) {
|
||||
if (!$widget.is(e.target) && !$widget.has(e.target).length) {
|
||||
closeResults();
|
||||
}
|
||||
});
|
||||
|
||||
// ── Keyboard: escape closes ───────────────────────────────────────
|
||||
$input.on('keydown', function (e) {
|
||||
if (e.key === 'Escape') closeResults();
|
||||
});
|
||||
|
||||
function doSearch(term) {
|
||||
$results.html('<div class="wmw-search-no-results">Suche...</div>').addClass('wmw-open');
|
||||
|
||||
$.ajax({
|
||||
url: wmwData.ajaxUrl,
|
||||
type: 'POST',
|
||||
data: {
|
||||
action: 'wmw_search',
|
||||
nonce: wmwData.nonce,
|
||||
term: term,
|
||||
wiki_id: wikiId,
|
||||
},
|
||||
success: function (response) {
|
||||
if (!response.success) {
|
||||
$results.html('<div class="wmw-search-no-results">Fehler bei der Suche.</div>');
|
||||
return;
|
||||
}
|
||||
var items = response.data;
|
||||
if (!items.length) {
|
||||
$results.html('<div class="wmw-search-no-results">Keine Ergebnisse fuer “' + escHtml(term) + '”</div>');
|
||||
return;
|
||||
}
|
||||
var html = '';
|
||||
items.forEach(function (item) {
|
||||
html += '<a href="' + escAttr(item.url) + '" class="wmw-search-result-item">';
|
||||
html += '<div class="wmw-search-result-title">' + escHtml(item.title) + '</div>';
|
||||
if (item.wiki_title) {
|
||||
html += '<div class="wmw-search-result-meta">' + escHtml(item.wiki_title) + '</div>';
|
||||
}
|
||||
if (item.excerpt) {
|
||||
html += '<div class="wmw-search-result-excerpt">' + item.excerpt + '</div>';
|
||||
}
|
||||
html += '</a>';
|
||||
});
|
||||
$results.html(html).addClass('wmw-open');
|
||||
},
|
||||
error: function () {
|
||||
$results.html('<div class="wmw-search-no-results">Verbindungsfehler.</div>');
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function closeResults() {
|
||||
$results.removeClass('wmw-open').html('');
|
||||
}
|
||||
});
|
||||
|
||||
// ── Helpers ───────────────────────────────────────────────────────────
|
||||
function escHtml(str) {
|
||||
return String(str)
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"');
|
||||
}
|
||||
function escAttr(str) { return escHtml(str); }
|
||||
|
||||
});
|
||||
})(jQuery);
|
||||
80
assets/js/toc.js
Normal file
80
assets/js/toc.js
Normal file
@@ -0,0 +1,80 @@
|
||||
/**
|
||||
* WP Multi Wiki – TOC Script
|
||||
* Highlights active TOC entry while scrolling + toggle functionality.
|
||||
*/
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var toc = document.getElementById('wmw-toc');
|
||||
if (!toc) return;
|
||||
|
||||
// ── Toggle ────────────────────────────────────────────────────────────
|
||||
var toggleBtn = toc.querySelector('.wmw-toc-toggle');
|
||||
var tocList = document.getElementById('wmw-toc-list');
|
||||
if (toggleBtn && tocList) {
|
||||
toggleBtn.addEventListener('click', function () {
|
||||
var expanded = toggleBtn.getAttribute('aria-expanded') === 'true';
|
||||
toggleBtn.setAttribute('aria-expanded', String(!expanded));
|
||||
tocList.style.display = expanded ? 'none' : '';
|
||||
var icon = toggleBtn.querySelector('.wmw-toc-toggle-icon');
|
||||
if (icon) icon.innerHTML = expanded ? '▶' : '▼';
|
||||
});
|
||||
}
|
||||
|
||||
// ── Active Highlight on Scroll ────────────────────────────────────────
|
||||
var links = toc.querySelectorAll('a[href^="#"]');
|
||||
if (!links.length) return;
|
||||
|
||||
var headings = [];
|
||||
links.forEach(function (link) {
|
||||
var id = link.getAttribute('href').substring(1);
|
||||
var el = document.getElementById(id);
|
||||
if (el) headings.push({ el: el, link: link });
|
||||
});
|
||||
|
||||
function setActive() {
|
||||
var scrollY = window.scrollY || window.pageYOffset;
|
||||
var offset = 80; // sticky header offset
|
||||
var activeIdx = -1;
|
||||
|
||||
headings.forEach(function (h, i) {
|
||||
if (h.el.getBoundingClientRect().top + scrollY - offset <= scrollY) {
|
||||
activeIdx = i;
|
||||
}
|
||||
});
|
||||
|
||||
links.forEach(function (l) { l.classList.remove('wmw-toc-active'); });
|
||||
if (activeIdx >= 0) {
|
||||
headings[activeIdx].link.classList.add('wmw-toc-active');
|
||||
}
|
||||
}
|
||||
|
||||
var ticking = false;
|
||||
window.addEventListener('scroll', function () {
|
||||
if (!ticking) {
|
||||
requestAnimationFrame(function () {
|
||||
setActive();
|
||||
ticking = false;
|
||||
});
|
||||
ticking = true;
|
||||
}
|
||||
}, { passive: true });
|
||||
|
||||
setActive(); // run once on load
|
||||
|
||||
// ── Sidebar: mark current article ────────────────────────────────────
|
||||
var currentUrl = window.location.href.replace(/\/$/, '');
|
||||
document.querySelectorAll('.wmw-sidebar .wmw-article-list a').forEach(function (a) {
|
||||
if (a.href.replace(/\/$/, '') === currentUrl) {
|
||||
a.classList.add('wmw-current');
|
||||
// Scroll link into view inside sidebar
|
||||
var sidebar = document.getElementById('wmw-sidebar');
|
||||
if (sidebar) {
|
||||
var linkTop = a.offsetTop;
|
||||
sidebar.scrollTop = linkTop - 80;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
})();
|
||||
Reference in New Issue
Block a user