refactor: remove more jQuery

Co-Authored-By: CoPilot
This commit is contained in:
rugk
2026-02-25 20:04:32 +00:00
parent 84e7cbdfbf
commit d285a9dfee
+120 -97
View File
@@ -455,14 +455,13 @@ window.PrivateBin = (function() {
*/ */
me.urls2links = function(element) me.urls2links = function(element)
{ {
element.html( const raw = element.innerHTML;
DOMPurify.sanitize( element.innerHTML = DOMPurify.sanitize(
element.html().replace( raw.replace(
/(((https?|ftp):\/\/[\w?!=&.\/-;#@~%+*-]+(?![\w\s?!&.\/;#~%"=-]>))|((magnet):[\w?=&.\/-;#@~%+*-]+))/ig, /(((https?|ftp):\/\/[\w?!=&.\/\-;#@~%+*-]+(?![\w\s?!&.\/;#~%"=-]>))|((magnet):[\w?=&.\/\-;#@~%+*-]+))/ig,
'<a href="$1" rel="nofollow noopener noreferrer">$1</a>' '<a href="$1" rel="nofollow noopener noreferrer">$1</a>'
), ),
purifyHtmlConfigStrictSubset purifyHtmlConfigStrictSubset
)
); );
}; };
@@ -2301,7 +2300,10 @@ window.PrivateBin = (function() {
if (bootstrap5PasswordModal) { if (bootstrap5PasswordModal) {
bootstrap5PasswordModal.hide(); bootstrap5PasswordModal.hide();
} else { } else {
$passwordModal.modal('hide'); if (passwordModal) {
passwordModal.classList.remove('show');
passwordModal.style.display = 'none';
}
} }
PasteDecrypter.run(); PasteDecrypter.run();
@@ -2325,10 +2327,13 @@ window.PrivateBin = (function() {
loadconfirmClose.removeEventListener('click', Controller.newPaste); loadconfirmClose.removeEventListener('click', Controller.newPaste);
loadconfirmClose.addEventListener('click', Controller.newPaste); loadconfirmClose.addEventListener('click', Controller.newPaste);
if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip.VERSION) { if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip && typeof bootstrap.Modal === 'function') {
(new bootstrap.Modal(loadconfirmmodal)).show(); (new bootstrap.Modal(loadconfirmmodal)).show();
} else if (typeof jQuery !== 'undefined' && jQuery.fn && typeof jQuery.fn.modal === 'function') {
jQuery(loadconfirmmodal).modal('show');
} else { } else {
$(loadconfirmmodal).modal('show'); // minimal fallback: make element visible
loadconfirmmodal.classList.add('show');
} }
} }
@@ -2394,10 +2399,10 @@ window.PrivateBin = (function() {
me.init = function() me.init = function()
{ {
passwordDecrypt = document.getElementById('passworddecrypt'); passwordDecrypt = document.getElementById('passworddecrypt');
passwordModal = $('#passwordmodal'); passwordModal = document.getElementById('passwordmodal');
// bind events - handle Model password submission // bind events - handle Model password submission
if (passwordModal.length !== 0) { if (passwordModal) {
document.getElementById('passwordform').addEventListener('submit', submitPasswordModal); document.getElementById('passwordform').addEventListener('submit', submitPasswordModal);
const disableClosingConfig = { const disableClosingConfig = {
@@ -2405,14 +2410,22 @@ window.PrivateBin = (function() {
keyboard: false, keyboard: false,
show: false show: false
}; };
if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip.VERSION) { if (typeof bootstrap !== 'undefined' && bootstrap.Tooltip && typeof bootstrap.Modal === 'function') {
bootstrap5PasswordModal = new bootstrap.Modal(passwordModal[0], disableClosingConfig); bootstrap5PasswordModal = new bootstrap.Modal(passwordModal, disableClosingConfig);
} else { } else {
passwordModal.modal(disableClosingConfig); // fallback: keep modal hidden until explicitly shown
passwordModal.style.display = 'none';
} }
passwordModal.on('shown.bs.modal', () => {
// ensure focus when modal shown (works for bootstrap5 and jQuery plugin)
passwordModal.addEventListener('shown.bs.modal', () => {
passwordDecrypt.focus(); passwordDecrypt.focus();
}); });
if (typeof jQuery !== 'undefined' && jQuery.fn && typeof jQuery.fn.on === 'function') {
jQuery(passwordModal).on('shown.bs.modal', () => {
passwordDecrypt.focus();
});
}
} }
}; };
@@ -2430,13 +2443,13 @@ window.PrivateBin = (function() {
const Editor = (function () { const Editor = (function () {
const me = {}; const me = {};
let $editorTabs, let editorTabs,
$messageEdit, messageEdit,
$messageEditParent, messageEditParent,
$messagePreview, messagePreview,
$messagePreviewParent, messagePreviewParent,
$messageTab, messageTab,
$messageTabParent, messageTabParent,
message, message,
isPreview = false, isPreview = false,
isTabSupported = true; isTabSupported = true;
@@ -2454,7 +2467,7 @@ window.PrivateBin = (function() {
// support disabling tab support using [Esc] and [Ctrl]+[m] // support disabling tab support using [Esc] and [Ctrl]+[m]
if (event.key === 'Escape' || (event.ctrlKey && event.key === 'm')) { if (event.key === 'Escape' || (event.ctrlKey && event.key === 'm')) {
toggleTabSupport(); toggleTabSupport();
$messageTab[0].checked = isTabSupported; if (messageTab) messageTab.checked = isTabSupported;
event.preventDefault(); event.preventDefault();
} }
else if (isTabSupported && event.key === 'Tab') { else if (isTabSupported && event.key === 'Tab') {
@@ -2493,19 +2506,20 @@ window.PrivateBin = (function() {
function viewEditor(event) function viewEditor(event)
{ {
// toggle buttons // toggle buttons
$messageEdit.addClass('active');
$messageEditParent.addClass('active');
$messagePreview.removeClass('active');
$messagePreviewParent.removeClass('active');
$messageEdit.attr('aria-selected','true'); messageEdit.classList.add('active');
$messagePreview.attr('aria-selected','false'); messageEditParent.classList.add('active');
messagePreview.classList.remove('active');
messagePreviewParent.classList.remove('active');
messageEdit.setAttribute('aria-selected','true');
messagePreview.setAttribute('aria-selected','false');
PasteViewer.hide(); PasteViewer.hide();
// reshow input // reshow input
$message.removeClass('hidden'); message.classList.remove('hidden');
$messageTabParent.removeClass('hidden'); messageTabParent.classList.remove('hidden');
me.focusInput(); me.focusInput();
@@ -2528,20 +2542,20 @@ window.PrivateBin = (function() {
function viewPreview(event) function viewPreview(event)
{ {
// toggle buttons // toggle buttons
$messageEdit.removeClass('active'); messageEdit.classList.remove('active');
$messageEditParent.removeClass('active'); messageEditParent.classList.remove('active');
$messagePreview.addClass('active'); messagePreview.classList.add('active');
$messagePreviewParent.addClass('active'); messagePreviewParent.classList.add('active');
$messageEdit.attr('aria-selected','false'); messageEdit.setAttribute('aria-selected','false');
$messagePreview.attr('aria-selected','true'); messagePreview.setAttribute('aria-selected','true');
// hide input as now preview is shown // hide input as now preview is shown
$message.addClass('hidden'); message.classList.add('hidden');
$messageTabParent.addClass('hidden'); messageTabParent.classList.add('hidden');
// show preview // show preview
PasteViewer.setText($message.val()); PasteViewer.setText(message.value);
if (AttachmentViewer.hasAttachmentData()) { if (AttachmentViewer.hasAttachmentData()) {
const attachmentsData = AttachmentViewer.getAttachmentsData(); const attachmentsData = AttachmentViewer.getAttachmentsData();
@@ -2592,7 +2606,7 @@ window.PrivateBin = (function() {
} }
// clear content // clear content
$message.val(''); message.value = '';
}; };
/** /**
@@ -2603,9 +2617,9 @@ window.PrivateBin = (function() {
*/ */
me.show = function() me.show = function()
{ {
$message.removeClass('hidden'); message.classList.remove('hidden');
$messageTabParent.removeClass('hidden'); messageTabParent.classList.remove('hidden');
$editorTabs.removeClass('hidden'); editorTabs.classList.remove('hidden');
}; };
/** /**
@@ -2616,9 +2630,9 @@ window.PrivateBin = (function() {
*/ */
me.hide = function() me.hide = function()
{ {
$message.addClass('hidden'); message.classList.add('hidden');
$messageTabParent.addClass('hidden'); messageTabParent.classList.add('hidden');
$editorTabs.addClass('hidden'); editorTabs.classList.add('hidden');
}; };
/** /**
@@ -2629,7 +2643,7 @@ window.PrivateBin = (function() {
*/ */
me.focusInput = function() me.focusInput = function()
{ {
$message.focus(); message.focus();
}; };
/** /**
@@ -2641,7 +2655,7 @@ window.PrivateBin = (function() {
*/ */
me.setText = function(newText) me.setText = function(newText)
{ {
$message.val(newText); message.value = newText;
}; };
/** /**
@@ -2653,7 +2667,7 @@ window.PrivateBin = (function() {
*/ */
me.getText = function() me.getText = function()
{ {
return $message.val(); return message.value;
}; };
/** /**
@@ -2666,20 +2680,30 @@ window.PrivateBin = (function() {
*/ */
me.init = function() me.init = function()
{ {
$editorTabs = $('#editorTabs'); editorTabs = document.getElementById('editorTabs');
$message = $('#message'); message = document.getElementById('message');
$messageTab = $('#messagetab'); messageTab = document.getElementById('messagetab');
$messageTabParent = $messageTab.parent(); messageTabParent = messageTab ? messageTab.parentElement : null;
// bind events // bind events
$message.keydown(supportTabs); if (message) {
$messageTab.change(toggleTabSupport); message.addEventListener('keydown', supportTabs);
}
if (messageTab) {
messageTab.addEventListener('change', toggleTabSupport);
}
// bind click events to tab switchers (a), and save parents (li) // bind click events to tab switchers (a), and save parents (li)
$messageEdit = $('#messageedit').click(viewEditor); messageEdit = document.getElementById('messageedit');
$messageEditParent = $messageEdit.parent(); if (messageEdit) {
$messagePreview = $('#messagepreview').click(viewPreview); messageEdit.addEventListener('click', viewEditor);
$messagePreviewParent = $messagePreview.parent(); messageEditParent = messageEdit.parentElement;
}
messagePreview = document.getElementById('messagepreview');
if (messagePreview) {
messagePreview.addEventListener('click', viewPreview);
messagePreviewParent = messagePreview.parentElement;
}
}; };
return me; return me;
@@ -2694,11 +2718,11 @@ window.PrivateBin = (function() {
const PasteViewer = (function () { const PasteViewer = (function () {
const me = {}; const me = {};
let $messageTabParent, let messageTabParent,
$placeholder, placeholder,
$prettyMessage, prettyMessage,
$prettyPrint, prettyPrintEl,
$plainText, plainText,
text, text,
format = 'plaintext', format = 'plaintext',
isDisplayed = false, isDisplayed = false,
@@ -2727,14 +2751,14 @@ window.PrivateBin = (function() {
excludeTrailingPunctuationFromURLs: true excludeTrailingPunctuationFromURLs: true
}); });
// let showdown convert the HTML and sanitize HTML *afterwards*! // let showdown convert the HTML and sanitize HTML *afterwards*!
$plainText.html( plainText.innerHTML = DOMPurify.sanitize(
DOMPurify.sanitize( converter.makeHtml(text),
converter.makeHtml(text), purifyHtmlConfig
purifyHtmlConfig
)
); );
// add table classes from bootstrap css // add table classes from bootstrap css
$plainText.find('table').addClass('table-condensed table-bordered'); plainText.querySelectorAll('table').forEach(t => {
t.classList.add('table-condensed', 'table-bordered');
});
} else { } else {
if (format === 'syntaxhighlighting') { if (format === 'syntaxhighlighting') {
// yes, this is really needed to initialize the environment // yes, this is really needed to initialize the environment
@@ -2743,19 +2767,17 @@ window.PrivateBin = (function() {
prettyPrint(); prettyPrint();
} }
$prettyPrint.html( prettyPrintEl.innerHTML = prettyPrintOne(
prettyPrintOne( Helper.htmlEntities(text), null, true
Helper.htmlEntities(text), null, true
)
); );
} else { } else {
// = 'plaintext' // = 'plaintext'
$prettyPrint.text(text); prettyPrintEl.textContent = text;
} }
Helper.urls2links($prettyPrint); Helper.urls2links(prettyPrintEl);
$prettyPrint.css('white-space', 'pre-wrap'); prettyPrintEl.style.whiteSpace = 'pre-wrap';
$prettyPrint.css('word-break', 'normal'); prettyPrintEl.style.wordBreak = 'normal';
$prettyPrint.removeClass('prettyprint'); prettyPrintEl.classList.remove('prettyprint');
} }
} }
@@ -2770,19 +2792,19 @@ window.PrivateBin = (function() {
{ {
// instead of "nothing" better display a placeholder // instead of "nothing" better display a placeholder
if (text === '') { if (text === '') {
$placeholder.removeClass('hidden'); if (placeholder) placeholder.classList.remove('hidden');
return; return;
} }
// otherwise hide the placeholder // otherwise hide the placeholder
$placeholder.addClass('hidden'); if (placeholder) placeholder.classList.add('hidden');
$messageTabParent.addClass('hidden'); if (messageTabParent) messageTabParent.classList.add('hidden');
if (format === 'markdown') { if (format === 'markdown') {
$plainText.removeClass('hidden'); if (plainText) plainText.classList.remove('hidden');
$prettyMessage.addClass('hidden'); if (prettyMessage) prettyMessage.classList.add('hidden');
} else { } else {
$plainText.addClass('hidden'); if (plainText) plainText.classList.add('hidden');
$prettyMessage.removeClass('hidden'); if (prettyMessage) prettyMessage.classList.remove('hidden');
} }
} }
@@ -2896,9 +2918,9 @@ window.PrivateBin = (function() {
return; return;
} }
$plainText.addClass('hidden'); if (plainText) plainText.classList.add('hidden');
$prettyMessage.addClass('hidden'); if (prettyMessage) prettyMessage.classList.add('hidden');
$placeholder.addClass('hidden'); if (placeholder) placeholder.classList.add('hidden');
AttachmentViewer.hideAttachmentPreview(); AttachmentViewer.hideAttachmentPreview();
isDisplayed = false; isDisplayed = false;
@@ -2914,11 +2936,12 @@ window.PrivateBin = (function() {
*/ */
me.init = function() me.init = function()
{ {
$messageTabParent = $('#messagetab').parent(); const messagetab = document.getElementById('messagetab');
$placeholder = $('#placeholder'); messageTabParent = messagetab ? messagetab.parentElement : null;
$plainText = $('#plaintext'); placeholder = document.getElementById('placeholder');
$prettyMessage = $('#prettymessage'); plainText = document.getElementById('plaintext');
$prettyPrint = $('#prettyprint'); prettyMessage = document.getElementById('prettymessage');
prettyPrintEl = document.getElementById('prettyprint');
// get default option from template/HTML or fall back to set value // get default option from template/HTML or fall back to set value
format = Model.getFormatDefault() || format; format = Model.getFormatDefault() || format;