mirror of
https://github.com/PrivateBin/PrivateBin.git
synced 2026-04-18 21:48:24 -04:00
refactor: remove more jQuery
Co-Authored-By: CoPilot
This commit is contained in:
+120
-97
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user