ported legacy functions

This commit is contained in:
2025-07-04 14:00:46 +02:00
parent e48ddfdb2c
commit 3c898f36de
32 changed files with 2642 additions and 35 deletions

View File

@@ -0,0 +1,171 @@
const DEL = 'DELETE';
const PATCH = 'PATCH';
const POST = 'POST';
// remove all children from element, leave only the first <keep> children
function clearElement(key,keep = 1){
var elem = key instanceof Element ? key : get(key);
while (elem.childElementCount > keep) elem.removeChild(elem.lastChild);
return elem;
}
function create(type,code){
var elem = document.createElement(type);
if (code) elem.innerHTML = code;
return elem;
}
function disable(id){
var elem = get(id);
elem.setAttribute('disabled','disabled');
return elem;
}
function enable(id){
var elem = get(id);
elem.removeAttribute('disabled');
return elem;
}
function get(id){
return document.getElementById(id);
}
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let arr = decodedCookie.split(';');
for(let i = 0; i <arr.length; i++) {
let c = arr[i];
while (c.charAt(0) == ' ') c = c.substring(1);
if (c.indexOf(name) == 0) return c.substring(name.length, c.length);
}
return "";
}
function getValue(id){
return get(id).value;
}
function hide(id){
var elem = get(id);
if (elem) elem.style.display = 'none';
return elem;
}
function hideAll(clazz){
var elems = document.getElementsByTagName('*'), i;
for (i in elems) {
if((' ' + elems[i].className + ' ').indexOf(' ' + clazz + ' ') > -1) elems[i].style.display = 'none';
}
}
function isChecked(id){
return get(id).checked;
}
function menu(){
fetch('<? user.api.menu ?>').then(showMenu);
}
// Replacement for Object.toEntries(…)
function paramsToObject(entries) {
const result = {};
for(var key of entries) { // each 'entry' is a [key, value] tupple
result[key[0]] = key[1];
}
return result;
}
function redirect(page){
window.location.href = page;
}
function setText(id, text){
var elem = get(id);
elem.innerHTML = text;
return elem;
}
function setValue(id,newVal){
var elem = get(id);
if (elem) elem.value = newVal;
return elem;
}
function show(id){
var elem = get(id);
if (elem) elem.style.display = '';
return elem;
}
function showAll(clazz){
var elems = document.getElementsByTagName('*'), i;
for (i in elems) {
if((' ' + elems[i].className + ' ').indexOf(' ' + clazz + ' ') > -1) elems[i].style.display = '';
}
}
function showError(json){
var message = json.message;
var box = show('error');
box.innerHTML = message;
var button = document.createElement('button');
button.innerText = 'ok';
button.addEventListener('click',() => hide('error'))
box.appendChild(button);
box.scrollIntoView();
}
async function showMenu(resp){
if (resp.ok){
var menu = get('main_menu');
var json = await resp.json();
var entries = json.entries;
entries.sort((a,b) => a.index - b.index);
for (var idx in entries){
var entry = entries[idx];
menu.insertAdjacentHTML('beforeend','<a class="button" href="'+entry.url+'">'+entry.caption+'</a>');
}
}
}
function sortTableColumn(column){
var table = column;
var columnIndex = [...column.parentNode.children].indexOf(column);
while (table.localName != 'table'){
if (!table.parentNode) return;
table = table.parentNode;
}
var rows = Array.from(table.tBodies[0].rows);
var asc = table.getAttribute("data-sort-dir") !== "desc";
table.setAttribute("data-sort-dir", asc ? "desc" : "asc");
rows.sort(function(a, b) {
var cellA = a.cells[columnIndex].innerText.trim();
var cellB = b.cells[columnIndex].innerText.trim();
var numA = parseFloat(cellA);
var numB = parseFloat(cellB);
if (!isNaN(numA) && !isNaN(numB)) return asc ? numA - numB : numB - numA;
return asc ? cellA.localeCompare(cellB) : cellB.localeCompare(cellA);
});
// Append sorted rows back to the tbody
rows.forEach(function(row) {
table.tBodies[0].appendChild(row);
});
}
function spread(json,prefix){
for (var key in json){
var val = json[key];
var id = prefix+"."+key;
if (typeof val === 'object'){
spread(val,id);
continue;
}
if (typeof val === 'string') val = val.replaceAll("\n","<br/>\n");
var tag = get(id);
if (tag) tag.innerHTML = val;
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,124 @@
const POST = 'POST';
function toggle(selector){
$(selector).toggle("slow");
}
function addDescriptionOption(text){
if (text.trim() == '') return;
var select = $('select[name=alt_comment]');
if (select.length == 0){
var area=$('textarea[name=comment]');
var hint= area.attr('descr');
$('<select/>',{name: 'alt_comment'})
.append($('<option/>',{value: '',text: hint}))
.insertBefore(area);
select = $('select[name=alt_comment]');
select.on('change',function(){
$('textarea[name=comment]').val(select.find('option:selected').text());
});
}
select.append($('<option/>',{text: text}));
}
function getHeadings(elem){
$('select[name=alt_comment]').remove();
$('textarea[name=comment]').val('');
var url=window.location.href.replace(/\/([^\/]*)$/,'/headings')+'?page='+encodeURIComponent(elem.value);
$.ajax({
url: url,
dataType: "json",
success: function(data){
for (var index in data.headings) addDescriptionOption(data.headings[index]);
}
});
}
var preview_timer = 0;
function keyEvent(e){
if (e.ctrlKey){
if (e.key === 'f') { // display search form on Ctrl+F
e.preventDefault();
$('.search *').show();
$('.search form>input').focus();
} else
if (e.key === 's') { // save current element on Ctrl+S
var saveBtn = $('form[method=POST] button[type="submit"]')[0];
if (saveBtn) {
e.preventDefault();
saveBtn.click();
}
}
return;
}
if (e.altKey){
switch (e.keyCode){
case 38:
$('a.parent').each(function(){this.click()});
return;
case 39:
$('a.next').each(function(){this.click()});
return
default:
console.log(e.keyCode);
}
}
switch (e.keyCode){
case 27: // ESC
if (document.location.href.includes("/add")) window.history.back();
if (document.location.href.includes("/edit")) window.history.back();
return;
case 107: // +
var active = document.activeElement.tagName;
switch (active){
case 'TEXTAREA':
// do not activate add-link when in these fields
return;
}
var addLink = $('a[href^="add"]')[0];
if (addLink) addLink.click();
return;
}
if (e.target.id == 'preview-source') {
clearTimeout(preview_timer);
preview_timer = setTimeout(preview,750,e.target);
}
console.log(e);
}
getHeadingsTimer = null;
function getHeadings_delayed(){
if (getHeadingsTimer != null) clearTimeout(getHeadingsTimer);
getHeadingsTimer = window.setTimeout(getHeadings,200,this);
}
async function handlePreview(resp,txt){
const target = document.getElementById('preview');
if (resp.ok){
const content = await resp.text();
$(target).removeClass('loading').html(content);
setTimeout(() => {
$(txt).css('height',Math.max(target.clientHeight,200));
},200);
} else {
$(target).removeClass('loading').html('Preview failed…');
console.log("preview request failed!");
}
}
function preview(txt){
let target = document.getElementById('preview');
if (!target) return;
$(target).addClass('loading');
$(target).html('loading…');
let url = '<? base ?>/api/preview';
fetch(url,{
method: POST,
body: txt.value,
credentials: 'include'
}).then(resp => handlePreview(resp,txt));
}
document.addEventListener('keydown',keyEvent);