From 2096751629f526a009ffc50624be589a788bb2bd Mon Sep 17 00:00:00 2001 From: Patrick Heuser Date: Thu, 21 Aug 2025 09:04:15 +0200 Subject: [PATCH 1/2] fix(quill): use alerts module, bind toolbar handlers to composer, avoid duplicate upload toasts --- static/lib/quill-nbb.js | 37 ++++++++++--------------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/static/lib/quill-nbb.js b/static/lib/quill-nbb.js index 2ffa236..c3dc3fe 100644 --- a/static/lib/quill-nbb.js +++ b/static/lib/quill-nbb.js @@ -11,7 +11,8 @@ define('quill-nbb', [ 'composer/resize', 'components', 'slugify', -], (Quill, resize, components, slugify) => { + 'alerts', +], (Quill, resize, components, slugify, alerts) => { $(window).on('action:composer.loaded', (ev, data) => { const postContainer = $(`.composer[data-uuid="${data.post_uuid}"]`); const targetEl = postContainer.find('.write-container div'); @@ -70,34 +71,19 @@ define('quill-nbb', [ value = JSON.parse(value); quill.setContents(value, 'user'); } catch (e) { - app.alertError('[[error:invalid-json]]'); + alerts.error('[[error:invalid-json]]'); } }); $(window).on('action:composer.uploadUpdate', (evt, data) => { - const filename = data.filename.replace(/^\d+_\d+_/, ''); - const alertId = generateAlertId(data.post_uuid, filename); - if (!window.quill.uploads[filename]) { - console.warn(`[quill/uploads] Unable to find file (${filename}).`); - app.removeAlert(alertId); - return; - } - - if (!data.text.startsWith('/')) { - app.alert({ - alert_id: alertId, - title: data.filename.replace(/\d_\d+_/, ''), - message: data.text, - timeout: 1000, - }); - } + // Upload-Progress wird global von uploadHelpers gehandhabt }); $(window).on('action:composer.upload', (evt, data) => { const quill = components.get('composer').filter(`[data-uuid="${data.post_uuid}"]`).find('.ql-container').data('quill'); data.files.forEach((file) => { const alertId = generateAlertId(data.post_uuid, file.filename); - app.removeAlert(alertId); + alerts.remove(alertId); // Image vs. file upload if (file.isImage) { @@ -129,13 +115,7 @@ define('quill-nbb', [ }); $(window).on('action:composer.uploadStart', (evt, data) => { - data.files.forEach((file) => { - app.alert({ - alert_id: generateAlertId(data.post_uuid, file.filename), - title: file.filename.replace(/\d_\d+_/, ''), - message: data.text, - }); - }); + // Upload-Start-Toast wird global von uploadHelpers gehandhabt }); $(window).on('action:composer.insertIntoTextarea', (evt, data) => { @@ -420,7 +400,10 @@ window.quill.configureToolbar = async (targetEl, data) => { if (app.user.privileges[privilege]) { const name = privilege === 'upload:post:image' ? 'picture' : 'upload'; group.unshift(name); - toolbar.handlers[name] = toolbarHandlers[name].bind($('.formatting-bar')); + // Handler im Kontext des aktiven Composers ausführen + toolbar.handlers[name] = function () { + return toolbarHandlers[name].apply(data.postContainer, arguments); + }; } }); toolbar.container.push(group); From 7d78b05f8cd5642321e8eb835eca2e85e8215e24 Mon Sep 17 00:00:00 2001 From: Patrick Heuser Date: Thu, 21 Aug 2025 09:11:00 +0200 Subject: [PATCH 2/2] chore: translate inline comments to English --- static/lib/quill-nbb.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/static/lib/quill-nbb.js b/static/lib/quill-nbb.js index c3dc3fe..68852df 100644 --- a/static/lib/quill-nbb.js +++ b/static/lib/quill-nbb.js @@ -76,7 +76,7 @@ define('quill-nbb', [ }); $(window).on('action:composer.uploadUpdate', (evt, data) => { - // Upload-Progress wird global von uploadHelpers gehandhabt + // Upload progress is handled globally by uploadHelpers }); $(window).on('action:composer.upload', (evt, data) => { @@ -115,7 +115,7 @@ define('quill-nbb', [ }); $(window).on('action:composer.uploadStart', (evt, data) => { - // Upload-Start-Toast wird global von uploadHelpers gehandhabt + // Upload start toast is handled globally by uploadHelpers }); $(window).on('action:composer.insertIntoTextarea', (evt, data) => { @@ -400,7 +400,7 @@ window.quill.configureToolbar = async (targetEl, data) => { if (app.user.privileges[privilege]) { const name = privilege === 'upload:post:image' ? 'picture' : 'upload'; group.unshift(name); - // Handler im Kontext des aktiven Composers ausführen + // Execute handler in the context of the active composer instance toolbar.handlers[name] = function () { return toolbarHandlers[name].apply(data.postContainer, arguments); };