Loading editor/html/index.html +4 −13 Original line number Diff line number Diff line Loading @@ -57,11 +57,14 @@ <main id="preview-pane"> <div id="preview-toolbar"> <button id="btn-refresh-preview" data-i18n-title="I18N_TITLE_REFRESH_TREE">🔄 <span data-i18n="I18N_VIEW">Vorschau</span></button> <select id="preview-publish-target" title="Publish Target" style="padding:0.2em 0.4em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer;display:none"> </select> <select id="theme-select" title="Theme" style="margin-left:auto;padding:0.2em 0.4em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer"> <option value="dark">🌙 Dark</option> <option value="light">☀ Light</option> </select> </div> <div id="preview-publish-fields" style="display:none;padding:0 0.5em 0.4em;background:var(--bg-secondary);border-bottom:1px solid var(--border);font-size:0.8rem;"></div> <div id="preview-frame"></div> </main> Loading Loading @@ -179,19 +182,7 @@ <button id="btn-conn-connect" class="set-save-btn" data-i18n="I18N_CONNECT">Verbinden</button> </div> <!-- Publish section (shown after connect) --> <div id="conn-publish-section" style="display:none"> <hr style="border-color:var(--border);margin:1em 0"> <h4 data-i18n="I18N_PUBLISH">Veröffentlichen</h4> <div class="set-field"> <label data-i18n="I18N_PUBLISH_TARGET">Ziel</label> <select id="conn-publish-target"></select> </div> <div id="conn-publish-fields"></div> <div class="set-field"> <button id="btn-conn-publish" class="set-save-btn" data-i18n="I18N_PUBLISH">Veröffentlichen</button> </div> </div> <span id="conn-status" class="set-status"></span> </div> Loading editor/html/js/editor.js +37 −63 Original line number Diff line number Diff line Loading @@ -732,75 +732,32 @@ status.textContent = I18n.t('I18N_CONNECTION_OK', 'Verbunden'); status.className = 'set-status success'; // Show publish section with targets // Populate preview toolbar publish targets var targets = resp.targets || []; showPublishTargets(targets); showPreviewPublishTargets(targets); // Update list to show connected state loadConnectionList(); }).catch(function(err) { status.textContent = I18n.t('I18N_CONNECTION_FAILED', 'Verbindung fehlgeschlagen') + ': ' + (err.error || ''); status.className = 'set-status error'; document.getElementById('conn-publish-section').style.display = 'none'; }); }); // Publish button document.getElementById('btn-conn-publish').addEventListener('click', function() { var id = document.getElementById('conn-edit-id').value; if (!id) return; var targetSelect = document.getElementById('conn-publish-target'); var target = targetSelect.value; if (!target) return; // Collect dynamic fields var params = {}; var fieldsContainer = document.getElementById('conn-publish-fields'); var inputs = fieldsContainer.querySelectorAll('[data-publish-key]'); for (var i = 0; i < inputs.length; i++) { var key = inputs[i].getAttribute('data-publish-key'); if (inputs[i].type === 'checkbox') { params[key] = inputs[i].checked; } else { params[key] = inputs[i].value; } } if (!confirm(I18n.t('I18N_PUBLISH_CONFIRM', 'Dokument ver\u00f6ffentlichen?'))) return; var status = document.getElementById('conn-status'); status.textContent = I18n.t('I18N_PUBLISHING', 'Ver\u00f6ffentliche...'); status.className = 'set-status'; EditorApi.publishToConnection(id, target, params).then(function() { status.textContent = I18n.t('I18N_PUBLISH_SUCCESS', 'Erfolgreich ver\u00f6ffentlicht'); status.className = 'set-status success'; }).catch(function(err) { status.textContent = I18n.t('I18N_PUBLISH_FAILED', 'Ver\u00f6ffentlichung fehlgeschlagen') + ': ' + (err.error || ''); status.className = 'set-status error'; if (err.error && err.error.indexOf('Not connected') !== -1) { delete connectedConnections[id]; document.getElementById('conn-publish-section').style.display = 'none'; } }); }); // Target select change: render dynamic fields document.getElementById('conn-publish-target').addEventListener('change', function() { renderPublishFields(this.value); }); // Publish button removed from connection manager } // Current targets cache for dynamic field rendering var currentPublishTargets = []; function showPublishTargets(targets) { function showPreviewPublishTargets(targets) { currentPublishTargets = targets; var section = document.getElementById('conn-publish-section'); var select = document.getElementById('conn-publish-target'); var select = document.getElementById('preview-publish-target'); var fieldsDiv = document.getElementById('preview-publish-fields'); select.innerHTML = ''; if (!targets || targets.length === 0) { section.style.display = 'none'; select.style.display = 'none'; fieldsDiv.style.display = 'none'; return; } Loading @@ -811,12 +768,20 @@ select.appendChild(opt); } section.style.display = 'block'; renderPublishFields(targets[0].name); select.style.display = ''; renderPreviewPublishFields(targets[0].name); // Bind change event (only once) if (!select._bound) { select._bound = true; select.addEventListener('change', function() { renderPreviewPublishFields(this.value); }); } } function renderPublishFields(targetName) { var container = document.getElementById('conn-publish-fields'); function renderPreviewPublishFields(targetName) { var container = document.getElementById('preview-publish-fields'); container.innerHTML = ''; var target = null; for (var i = 0; i < currentPublishTargets.length; i++) { Loading @@ -825,35 +790,42 @@ break; } } if (!target || !target.fields) return; if (!target || !target.fields || target.fields.length === 0) { container.style.display = 'none'; return; } container.style.display = 'flex'; container.style.flexWrap = 'wrap'; container.style.gap = '0.4em'; container.style.alignItems = 'center'; var fields = target.fields; for (var f = 0; f < fields.length; f++) { var field = fields[f]; var div = document.createElement('div'); div.className = 'set-field'; var label = document.createElement('label'); label.textContent = field.label || field.key; div.appendChild(label); label.style.fontSize = '0.75rem'; label.style.color = 'var(--text-secondary)'; container.appendChild(label); if (field.type === 'select' && field.options) { var sel = document.createElement('select'); sel.setAttribute('data-publish-key', field.key); sel.style.cssText = 'padding:0.15em 0.3em;border-radius:3px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.75rem;'; for (var o = 0; o < field.options.length; o++) { var optEl = document.createElement('option'); optEl.value = field.options[o].value; optEl.textContent = field.options[o].label; sel.appendChild(optEl); } div.appendChild(sel); container.appendChild(sel); } else { var inp = document.createElement('input'); inp.type = field.type || 'text'; inp.setAttribute('data-publish-key', field.key); inp.style.cssText = 'padding:0.15em 0.3em;border-radius:3px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.75rem;width:8em;'; if (field.placeholder) inp.placeholder = field.placeholder; if (field.required) inp.required = true; div.appendChild(inp); container.appendChild(inp); } container.appendChild(div); } } Loading Loading @@ -993,6 +965,8 @@ publishTargetsCache[connId] = targets; statusDiv.style.display = 'none'; showPublishDialogTargets(targets); // Also update preview toolbar showPreviewPublishTargets(targets); }).catch(function(err) { statusEl.textContent = I18n.t('I18N_PUBLISH_FAILED', 'Verbindung fehlgeschlagen') + ': ' + (err.error || ''); statusEl.className = 'set-status error'; Loading editor/html/js/preview.js +18 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,24 @@ var Preview = (function() { addField('_color_mode', 'theme'); addField('_color_scheme', colorScheme); // Send publish target + params for themed preview var targetSelect = document.getElementById('preview-publish-target'); if (targetSelect && targetSelect.value) { addField('target', targetSelect.value); var pfields = document.getElementById('preview-publish-fields'); if (pfields) { var inputs = pfields.querySelectorAll('[data-publish-key]'); for (var i = 0; i < inputs.length; i++) { var key = inputs[i].getAttribute('data-publish-key'); if (inputs[i].type === 'checkbox') { if (inputs[i].checked) addField(key, 'true'); } else if (inputs[i].value) { addField(key, inputs[i].value); } } } } document.body.appendChild(form); form.submit(); document.body.removeChild(form); Loading Loading
editor/html/index.html +4 −13 Original line number Diff line number Diff line Loading @@ -57,11 +57,14 @@ <main id="preview-pane"> <div id="preview-toolbar"> <button id="btn-refresh-preview" data-i18n-title="I18N_TITLE_REFRESH_TREE">🔄 <span data-i18n="I18N_VIEW">Vorschau</span></button> <select id="preview-publish-target" title="Publish Target" style="padding:0.2em 0.4em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer;display:none"> </select> <select id="theme-select" title="Theme" style="margin-left:auto;padding:0.2em 0.4em;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.8rem;cursor:pointer"> <option value="dark">🌙 Dark</option> <option value="light">☀ Light</option> </select> </div> <div id="preview-publish-fields" style="display:none;padding:0 0.5em 0.4em;background:var(--bg-secondary);border-bottom:1px solid var(--border);font-size:0.8rem;"></div> <div id="preview-frame"></div> </main> Loading Loading @@ -179,19 +182,7 @@ <button id="btn-conn-connect" class="set-save-btn" data-i18n="I18N_CONNECT">Verbinden</button> </div> <!-- Publish section (shown after connect) --> <div id="conn-publish-section" style="display:none"> <hr style="border-color:var(--border);margin:1em 0"> <h4 data-i18n="I18N_PUBLISH">Veröffentlichen</h4> <div class="set-field"> <label data-i18n="I18N_PUBLISH_TARGET">Ziel</label> <select id="conn-publish-target"></select> </div> <div id="conn-publish-fields"></div> <div class="set-field"> <button id="btn-conn-publish" class="set-save-btn" data-i18n="I18N_PUBLISH">Veröffentlichen</button> </div> </div> <span id="conn-status" class="set-status"></span> </div> Loading
editor/html/js/editor.js +37 −63 Original line number Diff line number Diff line Loading @@ -732,75 +732,32 @@ status.textContent = I18n.t('I18N_CONNECTION_OK', 'Verbunden'); status.className = 'set-status success'; // Show publish section with targets // Populate preview toolbar publish targets var targets = resp.targets || []; showPublishTargets(targets); showPreviewPublishTargets(targets); // Update list to show connected state loadConnectionList(); }).catch(function(err) { status.textContent = I18n.t('I18N_CONNECTION_FAILED', 'Verbindung fehlgeschlagen') + ': ' + (err.error || ''); status.className = 'set-status error'; document.getElementById('conn-publish-section').style.display = 'none'; }); }); // Publish button document.getElementById('btn-conn-publish').addEventListener('click', function() { var id = document.getElementById('conn-edit-id').value; if (!id) return; var targetSelect = document.getElementById('conn-publish-target'); var target = targetSelect.value; if (!target) return; // Collect dynamic fields var params = {}; var fieldsContainer = document.getElementById('conn-publish-fields'); var inputs = fieldsContainer.querySelectorAll('[data-publish-key]'); for (var i = 0; i < inputs.length; i++) { var key = inputs[i].getAttribute('data-publish-key'); if (inputs[i].type === 'checkbox') { params[key] = inputs[i].checked; } else { params[key] = inputs[i].value; } } if (!confirm(I18n.t('I18N_PUBLISH_CONFIRM', 'Dokument ver\u00f6ffentlichen?'))) return; var status = document.getElementById('conn-status'); status.textContent = I18n.t('I18N_PUBLISHING', 'Ver\u00f6ffentliche...'); status.className = 'set-status'; EditorApi.publishToConnection(id, target, params).then(function() { status.textContent = I18n.t('I18N_PUBLISH_SUCCESS', 'Erfolgreich ver\u00f6ffentlicht'); status.className = 'set-status success'; }).catch(function(err) { status.textContent = I18n.t('I18N_PUBLISH_FAILED', 'Ver\u00f6ffentlichung fehlgeschlagen') + ': ' + (err.error || ''); status.className = 'set-status error'; if (err.error && err.error.indexOf('Not connected') !== -1) { delete connectedConnections[id]; document.getElementById('conn-publish-section').style.display = 'none'; } }); }); // Target select change: render dynamic fields document.getElementById('conn-publish-target').addEventListener('change', function() { renderPublishFields(this.value); }); // Publish button removed from connection manager } // Current targets cache for dynamic field rendering var currentPublishTargets = []; function showPublishTargets(targets) { function showPreviewPublishTargets(targets) { currentPublishTargets = targets; var section = document.getElementById('conn-publish-section'); var select = document.getElementById('conn-publish-target'); var select = document.getElementById('preview-publish-target'); var fieldsDiv = document.getElementById('preview-publish-fields'); select.innerHTML = ''; if (!targets || targets.length === 0) { section.style.display = 'none'; select.style.display = 'none'; fieldsDiv.style.display = 'none'; return; } Loading @@ -811,12 +768,20 @@ select.appendChild(opt); } section.style.display = 'block'; renderPublishFields(targets[0].name); select.style.display = ''; renderPreviewPublishFields(targets[0].name); // Bind change event (only once) if (!select._bound) { select._bound = true; select.addEventListener('change', function() { renderPreviewPublishFields(this.value); }); } } function renderPublishFields(targetName) { var container = document.getElementById('conn-publish-fields'); function renderPreviewPublishFields(targetName) { var container = document.getElementById('preview-publish-fields'); container.innerHTML = ''; var target = null; for (var i = 0; i < currentPublishTargets.length; i++) { Loading @@ -825,35 +790,42 @@ break; } } if (!target || !target.fields) return; if (!target || !target.fields || target.fields.length === 0) { container.style.display = 'none'; return; } container.style.display = 'flex'; container.style.flexWrap = 'wrap'; container.style.gap = '0.4em'; container.style.alignItems = 'center'; var fields = target.fields; for (var f = 0; f < fields.length; f++) { var field = fields[f]; var div = document.createElement('div'); div.className = 'set-field'; var label = document.createElement('label'); label.textContent = field.label || field.key; div.appendChild(label); label.style.fontSize = '0.75rem'; label.style.color = 'var(--text-secondary)'; container.appendChild(label); if (field.type === 'select' && field.options) { var sel = document.createElement('select'); sel.setAttribute('data-publish-key', field.key); sel.style.cssText = 'padding:0.15em 0.3em;border-radius:3px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.75rem;'; for (var o = 0; o < field.options.length; o++) { var optEl = document.createElement('option'); optEl.value = field.options[o].value; optEl.textContent = field.options[o].label; sel.appendChild(optEl); } div.appendChild(sel); container.appendChild(sel); } else { var inp = document.createElement('input'); inp.type = field.type || 'text'; inp.setAttribute('data-publish-key', field.key); inp.style.cssText = 'padding:0.15em 0.3em;border-radius:3px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-size:0.75rem;width:8em;'; if (field.placeholder) inp.placeholder = field.placeholder; if (field.required) inp.required = true; div.appendChild(inp); container.appendChild(inp); } container.appendChild(div); } } Loading Loading @@ -993,6 +965,8 @@ publishTargetsCache[connId] = targets; statusDiv.style.display = 'none'; showPublishDialogTargets(targets); // Also update preview toolbar showPreviewPublishTargets(targets); }).catch(function(err) { statusEl.textContent = I18n.t('I18N_PUBLISH_FAILED', 'Verbindung fehlgeschlagen') + ': ' + (err.error || ''); statusEl.className = 'set-status error'; Loading
editor/html/js/preview.js +18 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,24 @@ var Preview = (function() { addField('_color_mode', 'theme'); addField('_color_scheme', colorScheme); // Send publish target + params for themed preview var targetSelect = document.getElementById('preview-publish-target'); if (targetSelect && targetSelect.value) { addField('target', targetSelect.value); var pfields = document.getElementById('preview-publish-fields'); if (pfields) { var inputs = pfields.querySelectorAll('[data-publish-key]'); for (var i = 0; i < inputs.length; i++) { var key = inputs[i].getAttribute('data-publish-key'); if (inputs[i].type === 'checkbox') { if (inputs[i].checked) addField(key, 'true'); } else if (inputs[i].value) { addField(key, inputs[i].value); } } } } document.body.appendChild(form); form.submit(); document.body.removeChild(form); Loading