Update from Git Manager GUI
This commit is contained in:
126
public/js/wmw-public.js
Normal file
126
public/js/wmw-public.js
Normal file
@@ -0,0 +1,126 @@
|
||||
/* jshint esversion: 6 */
|
||||
jQuery(function ($) {
|
||||
'use strict';
|
||||
|
||||
// ── TOC Toggle ────────────────────────────────────────────────────────
|
||||
$(document).on('click', '.wmw-toc__title, .wmw-toc__toggle', function () {
|
||||
var $toc = $(this).closest('.wmw-toc');
|
||||
var $btn = $toc.find('.wmw-toc__toggle');
|
||||
$toc.toggleClass('is-collapsed');
|
||||
$btn.text($toc.hasClass('is-collapsed') ? '▶' : '▼');
|
||||
});
|
||||
|
||||
// ── TOC Active Heading Highlight ──────────────────────────────────────
|
||||
if ($('.wmw-toc').length && $('[id]').length) {
|
||||
var headingIds = [];
|
||||
$('.wmw-toc a').each(function () {
|
||||
var href = $(this).attr('href');
|
||||
if (href && href.startsWith('#')) {
|
||||
headingIds.push(href.substring(1));
|
||||
}
|
||||
});
|
||||
|
||||
var $tocLinks = $('.wmw-toc a');
|
||||
|
||||
function highlightToc() {
|
||||
var scrollTop = $(window).scrollTop() + 120;
|
||||
var active = null;
|
||||
headingIds.forEach(function (id) {
|
||||
var $el = $('#' + id);
|
||||
if ($el.length && $el.offset().top <= scrollTop) {
|
||||
active = id;
|
||||
}
|
||||
});
|
||||
$tocLinks.removeClass('is-active');
|
||||
if (active) {
|
||||
$tocLinks.filter('[href="#' + active + '"]').addClass('is-active');
|
||||
}
|
||||
}
|
||||
|
||||
$(window).on('scroll.wmwToc', highlightToc);
|
||||
highlightToc();
|
||||
}
|
||||
|
||||
// ── AJAX Search ───────────────────────────────────────────────────────
|
||||
var searchTimer = null;
|
||||
|
||||
$(document).on('input', '.wmw-search__input', function () {
|
||||
var $input = $(this);
|
||||
var $wrap = $input.closest('.wmw-search');
|
||||
var $results = $wrap.find('.wmw-search__results');
|
||||
var $inner = $wrap.find('.wmw-search__results-inner');
|
||||
var query = $input.val().trim();
|
||||
var wikiId = $wrap.data('wiki-id') || 0;
|
||||
|
||||
clearTimeout(searchTimer);
|
||||
|
||||
if (query.length < 2) {
|
||||
$results.attr('hidden', '');
|
||||
return;
|
||||
}
|
||||
|
||||
searchTimer = setTimeout(function () {
|
||||
$inner.html('<div class="wmw-search-no-results">🔍 Suche…</div>');
|
||||
$results.removeAttr('hidden');
|
||||
|
||||
$.post(wmwPublic.ajaxUrl, {
|
||||
action: 'wmw_search',
|
||||
query: query,
|
||||
wiki_id: wikiId,
|
||||
nonce: wmwPublic.nonce,
|
||||
}, function (res) {
|
||||
if (!res.success) { $inner.html('<div class="wmw-search-no-results">Fehler bei der Suche.</div>'); return; }
|
||||
|
||||
var results = res.data.results;
|
||||
if (!results || results.length === 0) {
|
||||
$inner.html('<div class="wmw-search-no-results">Keine Ergebnisse für „' + escHtml(query) + '"</div>');
|
||||
return;
|
||||
}
|
||||
|
||||
var html = '';
|
||||
results.forEach(function (r) {
|
||||
html += '<a href="' + r.url + '" class="wmw-search-result">';
|
||||
html += '<span class="wmw-search-result__icon">' + r.icon + '</span>';
|
||||
html += '<div class="wmw-search-result__body">';
|
||||
if (r.wiki) html += '<div class="wmw-search-result__wiki">' + escHtml(r.wiki) + '</div>';
|
||||
html += '<div class="wmw-search-result__title">' + r.title + '</div>';
|
||||
if (r.excerpt) html += '<div class="wmw-search-result__exc">' + r.excerpt + '</div>';
|
||||
html += '</div></a>';
|
||||
});
|
||||
|
||||
$inner.html(html);
|
||||
});
|
||||
}, 280);
|
||||
});
|
||||
|
||||
// Close search on outside click
|
||||
$(document).on('click', function (e) {
|
||||
if (!$(e.target).closest('.wmw-search').length) {
|
||||
$('.wmw-search__results').attr('hidden', '');
|
||||
}
|
||||
});
|
||||
|
||||
// Prevent closing when clicking inside results
|
||||
$(document).on('click', '.wmw-search__results', function (e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
|
||||
// ── Smooth Scroll for TOC links ───────────────────────────────────────
|
||||
$(document).on('click', '.wmw-toc a', function (e) {
|
||||
var href = $(this).attr('href');
|
||||
if (href && href.startsWith('#')) {
|
||||
var $target = $(href);
|
||||
if ($target.length) {
|
||||
e.preventDefault();
|
||||
$('html, body').animate({ scrollTop: $target.offset().top - 80 }, 400);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// ── Helper ────────────────────────────────────────────────────────────
|
||||
function escHtml(str) {
|
||||
return str.replace(/[&<>"']/g, function (c) {
|
||||
return { '&':'&','<':'<','>':'>','"':'"',"'":''' }[c];
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user