destroy learning hub row editors
This commit is contained in:
parent
a0ba8c16c1
commit
13c4c0a1a0
2 changed files with 45 additions and 6 deletions
|
|
@ -117,7 +117,7 @@
|
||||||
|
|
||||||
// Remove question block
|
// Remove question block
|
||||||
var rmQ = e.target.closest('.lh-rm-question');
|
var rmQ = e.target.closest('.lh-rm-question');
|
||||||
if (rmQ) { var qb = rmQ.closest('.lh-question-block'); if (qb) qb.remove(); return; }
|
if (rmQ) { var qb = rmQ.closest('.lh-question-block'); if (qb) { destroyQuestionBlockEditors(qb); qb.remove(); } return; }
|
||||||
|
|
||||||
// Add option to question
|
// Add option to question
|
||||||
var addOpt = e.target.closest('.lh-add-option');
|
var addOpt = e.target.closest('.lh-add-option');
|
||||||
|
|
@ -129,7 +129,7 @@
|
||||||
|
|
||||||
// Remove option
|
// Remove option
|
||||||
var rmOpt = e.target.closest('.lh-rm-option');
|
var rmOpt = e.target.closest('.lh-rm-option');
|
||||||
if (rmOpt) { var row = rmOpt.closest('.lh-option-row'); if (row) row.remove(); return; }
|
if (rmOpt) { var row = rmOpt.closest('.lh-option-row'); if (row) { destroyOptionEditor(row); row.remove(); } return; }
|
||||||
});
|
});
|
||||||
|
|
||||||
// wireSearch() called after component is in DOM
|
// wireSearch() called after component is in DOM
|
||||||
|
|
@ -876,7 +876,7 @@
|
||||||
// Fill questions if any were generated alongside slides
|
// Fill questions if any were generated alongside slides
|
||||||
var qContainerP = document.getElementById('lh-cms-questions');
|
var qContainerP = document.getElementById('lh-cms-questions');
|
||||||
if (qContainerP) {
|
if (qContainerP) {
|
||||||
qContainerP.innerHTML = '';
|
clearQuestionBlocks(qContainerP);
|
||||||
if (content.questions && Array.isArray(content.questions)) {
|
if (content.questions && Array.isArray(content.questions)) {
|
||||||
content.questions.forEach(function(q) { addQuestionBlock(q); });
|
content.questions.forEach(function(q) { addQuestionBlock(q); });
|
||||||
}
|
}
|
||||||
|
|
@ -898,7 +898,7 @@
|
||||||
// Replace questions
|
// Replace questions
|
||||||
var qContainer = document.getElementById('lh-cms-questions');
|
var qContainer = document.getElementById('lh-cms-questions');
|
||||||
if (qContainer) {
|
if (qContainer) {
|
||||||
qContainer.innerHTML = '';
|
clearQuestionBlocks(qContainer);
|
||||||
if (content.questions && Array.isArray(content.questions)) {
|
if (content.questions && Array.isArray(content.questions)) {
|
||||||
content.questions.forEach(function(q) { addQuestionBlock(q); });
|
content.questions.forEach(function(q) { addQuestionBlock(q); });
|
||||||
}
|
}
|
||||||
|
|
@ -1240,6 +1240,29 @@
|
||||||
return (html === '<p></p>' || html === '') ? '' : html;
|
return (html === '<p></p>' || html === '') ? '' : html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function destroyTpEditor(editor) {
|
||||||
|
if (editor && typeof editor.destroy === 'function') editor.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
function destroyOptionEditor(row) {
|
||||||
|
if (!row || !row._optEditor) return;
|
||||||
|
destroyTpEditor(row._optEditor);
|
||||||
|
row._optEditor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function destroyQuestionBlockEditors(block) {
|
||||||
|
if (!block) return;
|
||||||
|
destroyTpEditor(block._questionEditor);
|
||||||
|
block._questionEditor = null;
|
||||||
|
block.querySelectorAll('.lh-option-row').forEach(destroyOptionEditor);
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearQuestionBlocks(container) {
|
||||||
|
if (!container) return;
|
||||||
|
container.querySelectorAll('.lh-question-block').forEach(destroyQuestionBlockEditors);
|
||||||
|
container.innerHTML = '';
|
||||||
|
}
|
||||||
|
|
||||||
// ── Body editor ────────────────────────────────────────────
|
// ── Body editor ────────────────────────────────────────────
|
||||||
function initBodyEditor() {
|
function initBodyEditor() {
|
||||||
var wrap = document.getElementById('lh-body-editor');
|
var wrap = document.getElementById('lh-body-editor');
|
||||||
|
|
@ -1335,7 +1358,7 @@
|
||||||
document.getElementById('lh-cms-edit-category').value = '';
|
document.getElementById('lh-cms-edit-category').value = '';
|
||||||
document.getElementById('lh-cms-edit-type').value = contentType || 'article';
|
document.getElementById('lh-cms-edit-type').value = contentType || 'article';
|
||||||
document.getElementById('lh-cms-edit-published').value = 'false';
|
document.getElementById('lh-cms-edit-published').value = 'false';
|
||||||
document.getElementById('lh-cms-questions').innerHTML = '';
|
clearQuestionBlocks(document.getElementById('lh-cms-questions'));
|
||||||
document.getElementById('btn-lh-delete-content').classList.add('hidden');
|
document.getElementById('btn-lh-delete-content').classList.add('hidden');
|
||||||
hideDeleteConfirm();
|
hideDeleteConfirm();
|
||||||
toggleEditorMode(contentType || 'article');
|
toggleEditorMode(contentType || 'article');
|
||||||
|
|
@ -1375,7 +1398,7 @@
|
||||||
|
|
||||||
// Load questions
|
// Load questions
|
||||||
var qContainer = document.getElementById('lh-cms-questions');
|
var qContainer = document.getElementById('lh-cms-questions');
|
||||||
qContainer.innerHTML = '';
|
clearQuestionBlocks(qContainer);
|
||||||
if (c.questions && c.questions.length > 0) {
|
if (c.questions && c.questions.length > 0) {
|
||||||
c.questions.forEach(function(q) { addQuestionBlock(q); });
|
c.questions.forEach(function(q) { addQuestionBlock(q); });
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
test/learning-hub-editor.test.js
Normal file
16
test/learning-hub-editor.test.js
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
const { test } = require('node:test');
|
||||||
|
const assert = require('node:assert/strict');
|
||||||
|
const fs = require('node:fs');
|
||||||
|
const path = require('node:path');
|
||||||
|
|
||||||
|
const source = fs.readFileSync(path.join(__dirname, '..', 'public', 'js', 'learningHub.js'), 'utf8');
|
||||||
|
|
||||||
|
test('Learning Hub destroys embedded Tiptap editors before removing CMS rows', () => {
|
||||||
|
assert.match(source, /function destroyTpEditor\(editor\)/);
|
||||||
|
assert.match(source, /function destroyQuestionBlockEditors\(block\)/);
|
||||||
|
assert.match(source, /function clearQuestionBlocks\(container\)/);
|
||||||
|
assert.match(source, /destroyQuestionBlockEditors\(qb\); qb\.remove\(\)/);
|
||||||
|
assert.match(source, /destroyOptionEditor\(row\); row\.remove\(\)/);
|
||||||
|
assert.doesNotMatch(source, /document\.getElementById\('lh-cms-questions'\)\.innerHTML = ''/);
|
||||||
|
assert.doesNotMatch(source, /qContainer\.innerHTML = ''/);
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue