Loading plugins/survey/survey.cpp +74 −26 Changes for plugins/survey/survey.cpp: 74 added lines, 26 removed lines. Original line number Diff line number Diff line Loading @@ -3495,10 +3495,12 @@ namespace blogi { << ".se-type-label{font-size:.7em;}" << ".se-opts{margin-top:8px;padding-top:8px;border-top:1px solid var(--blogi-border,#eee);}" << ".se-opts h4{margin:0 0 6px;font-size:.85em;color:var(--blogi-text-muted,#888);}" << ".se-opt-row{display:grid;grid-template-columns:1fr 1fr 1fr 30px;gap:6px;margin-bottom:6px;align-items:start;}" << ".se-opt-row{display:grid;grid-template-columns:1fr 1fr 30px;gap:6px;margin-bottom:6px;align-items:start;}" << ".se-opt-row input{padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.85em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);}" << ".se-opt-row select.se-exc{padding:2px 4px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.8em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);min-height:48px;}" << ".se-opt-row button{background:none;border:none;cursor:pointer;color:var(--blogi-error,#F36947);font-size:1em;}" << ".se-parent-row{margin-top:8px;padding-top:8px;border-top:1px solid var(--blogi-border,#444);display:flex;align-items:center;gap:8px;flex-wrap:wrap;}" << ".se-parent-row>label{font-size:.82em;font-weight:600;color:var(--blogi-text-muted,#888);white-space:nowrap;}" << ".se-parent-row select{padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.82em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);}" << ".se-add-opt{background:none;border:1px dashed var(--blogi-border,#ccc);border-radius:4px;padding:4px 10px;cursor:pointer;font-size:.85em;color:var(--blogi-text-muted,#888);margin-top:4px;}" << ".se-add-opt:hover{border-color:var(--blogi-accent,#2da82d);color:var(--blogi-accent,#2da82d);}" << ".se-pick-icon{padding:4px 8px;background:var(--blogi-accent,#2da82d);color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:1em;}" Loading @@ -3511,7 +3513,7 @@ namespace blogi { << ".se-img-row{display:grid;grid-template-columns:1fr 100px 80px;gap:8px;margin-top:8px;align-items:end;}" << ".se-img-row label{display:block;font-size:.85em;color:var(--blogi-text-muted,#666);margin-bottom:2px;}" << ".se-img-row input{width:100%;padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);box-sizing:border-box;}" << ".se-opt-row.se-opt-row-icon{grid-template-columns:1fr 1fr 1fr 1fr 30px;}" << ".se-opt-row.se-opt-row-icon{grid-template-columns:1fr 1fr 1fr 30px;}" << ".se-opt-icon-wrap{display:flex;gap:4px;align-items:center;min-width:0;}" << ".se-opt-icon-wrap input{flex:1;min-width:0;padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.85em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);}" << ".se-upload-wrap{display:flex;align-items:center;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid var(--blogi-border,#555);}" Loading Loading @@ -3575,14 +3577,27 @@ namespace blogi { << "var optEls=qe.querySelectorAll('.se-opt-row');" << "for(var j=0;j<optEls.length;j++){" << "var inputs=optEls[j].querySelectorAll('input');" << "if(inputs.length>=2){" << "var o={value:inputs[0].value,label:inputs[1].value};" << "var excSel=optEls[j].querySelector('.se-exc');" << "if(excSel){var sv=[];for(var si=0;si<excSel.options.length;si++){if(excSel.options[si].selected)sv.push(excSel.options[si].value);}if(sv.length)o.excludes=sv.join(',');}" << "if(inputs.length>=1){" << "var o={value:inputs[0].value,label:inputs[1]?inputs[1].value:'',excludes:''};" << "var iconI=optEls[j].querySelector('.se-opt-icon');" << "if(iconI&&iconI.value)o.icon=iconI.value;" << "q.options.push(o);}}" << "survey.questions.push(q);}}" << "survey.questions.push(q);}" // Second pass: translate übergeordnete Frage assignments into option.excludes << "for(var i=0;i<qEls.length;i++){" << "var qe=qEls[i];" << "var pqSel=qe.querySelector('.se-parent-q');" << "var panSel=qe.querySelector('.se-parent-ans');" << "if(!pqSel||!pqSel.value||!panSel||!panSel.value)continue;" << "var parentQid=pqSel.value,parentAns=panSel.value,childId=survey.questions[i].id;" << "for(var pi=0;pi<survey.questions.length;pi++){" << "if(survey.questions[pi].id!==parentQid)continue;" << "for(var oi=0;oi<survey.questions[pi].options.length;oi++){" << "var opt=survey.questions[pi].options[oi];" << "if(opt.value!==parentAns)continue;" << "var ex=(opt.excludes||'').split(',').map(function(s){return s.trim();}).filter(Boolean);" << "if(ex.indexOf(childId)===-1)ex.push(childId);" << "opt.excludes=ex.join(',');break;}break;}}}" << "" << "function render(){" << "var h='<div id=\"se-msg\"></div>';" Loading Loading @@ -3648,24 +3663,50 @@ namespace blogi { << "h+='<div class=\"se-opt-row'+(isIcon?' se-opt-row-icon':'')+'\">';" << "h+='<input placeholder=\"value\" value=\"'+esc(opts[j].value||'')+'\"/>';" << "h+='<input placeholder=\"label\" value=\"'+esc(opts[j].label||'')+'\"/>';" << "var excArr=(opts[j].excludes||'').split(',').filter(function(s){return s.trim();});" << "h+='<select class=\"se-exc\" multiple title=\"Excludes\">';" << "var allQs=survey.questions||[];" << "for(var k=0;k<allQs.length;k++){" << "if(allQs[k].id===q.id)continue;" << "var sel=excArr.indexOf(allQs[k].id)!==-1?' selected':'';" << "var lbl=allQs[k].id.substring(0,8)+(allQs[k].text?' - '+allQs[k].text.substring(0,20):'');" << "h+='<option value=\"'+esc(allQs[k].id)+'\"'+sel+'>'+esc(lbl)+'</option>';}" << "h+='</select>';" << "if(isIcon){" << "var icoUrl=opts[j].icon||'';" << "var upId='seup_'+idx+'_'+j;" << "h+='<div class=\"se-opt-icon-wrap\">';" << "if(icoUrl)h+='<img src=\"'+esc(icoUrl)+'\" class=\"se-opt-preview\" alt=\"\"/>';" << "h+='<input class=\"se-opt-icon\" placeholder=\"Icon URL\" value=\"'+esc(icoUrl)+'\"/>';" << "h+='<button class=\"se-pick-icon\" type=\"button\" title=\"Bild ausw\\u00e4hlen\">📷</button>';" << "h+='<input type=\"file\" accept=\"image/*\" id=\"'+upId+'\" class=\"se-upload-file\" style=\"display:none\"/>';" << "h+='<button class=\"se-pick-icon\" type=\"button\" title=\"Aus Mediathek\">🗎</button>';" << "h+='<button class=\"se-upload-icon\" type=\"button\" data-target=\"'+upId+'\" title=\"Bild hochladen\">📤</button>';" << "h+='</div>';}" << "h+='<button class=\"se-opt-del\">×</button></div>';}" << "h+='<button class=\"se-add-opt\">+ Option</button></div>';}" // Übergeordnete Frage section – derive current parent from option.excludes << "var parentQid='',parentAns='';" << "var allQs=survey.questions||[];" << "for(var pi=0;pi<allQs.length;pi++){" << "if(allQs[pi].id===q.id)continue;" << "var popts=allQs[pi].options||[];" << "for(var oi=0;oi<popts.length;oi++){" << "var ex=(popts[oi].excludes||'').split(',').map(function(s){return s.trim();}).filter(Boolean);" << "if(ex.indexOf(q.id)!==-1){parentQid=allQs[pi].id;parentAns=popts[oi].value;break;}}" << "if(parentQid)break;}" << "h+='<div class=\"se-parent-row\">';" << "h+='<label>🔗 Übergeordnete Frage:</label>';" << "h+='<select class=\"se-parent-q\">';" << "h+='<option value=\"\">– keine –</option>';" << "for(var pi=0;pi<allQs.length;pi++){" << "if(allQs[pi].id===q.id)continue;" << "var psel=parentQid===allQs[pi].id?' selected':'';" << "var plbl=(allQs[pi].text||allQs[pi].id.substring(0,8)).substring(0,40);" << "h+='<option value=\"'+esc(allQs[pi].id)+'\"'+psel+'>'+esc(plbl)+'</option>';}" << "h+='</select>';" << "if(parentQid){" << "var parentQ=null;for(var pi=0;pi<allQs.length;pi++){if(allQs[pi].id===parentQid){parentQ=allQs[pi];break;}}" << "if(parentQ&&parentQ.options&&parentQ.options.length){" << "h+='<label style=\"font-size:.82em\">bei Antwort:</label>';" << "h+='<select class=\"se-parent-ans\">';" << "h+='<option value=\"\">– Antwort –</option>';" << "for(var oi=0;oi<parentQ.options.length;oi++){" << "var asel=parentAns===parentQ.options[oi].value?' selected':'';" << "var albl=parentQ.options[oi].label||parentQ.options[oi].value;" << "h+='<option value=\"'+esc(parentQ.options[oi].value)+'\"'+asel+'>'+esc(albl)+'</option>';}" << "h+='</select>';}}" << "h+='</div>';" << "h+='</div>';return h;}" << "" << "function addQuestion(){" Loading @@ -3682,8 +3723,20 @@ namespace blogi { << "else if(t.classList.contains('se-q-down')){readForm();var qe=t.closest('.se-question');var idx=parseInt(qe.getAttribute('data-idx'));if(idx<survey.questions.length-1){var tmp=survey.questions[idx];survey.questions[idx]=survey.questions[idx+1];survey.questions[idx+1]=tmp;var tmpO=survey.questions[idx].order;survey.questions[idx].order=survey.questions[idx-1].order;survey.questions[idx-1].order=tmpO;render();}}" << "else if(t.classList.contains('se-opt-del')){readForm();var row=t.closest('.se-opt-row');var qe=t.closest('.se-question');var qi=parseInt(qe.getAttribute('data-idx'));var opts=qe.querySelectorAll('.se-opt-row');for(var i=0;i<opts.length;i++){if(opts[i]===row){survey.questions[qi].options.splice(i,1);break;}}render();}" << "else if(t.classList.contains('se-add-opt')){readForm();var qe=t.closest('.se-question');var qi=parseInt(qe.getAttribute('data-idx'));survey.questions[qi].options.push({value:'',label:'',excludes:'',icon:''});render();}" << "else if(t.classList.contains('se-pick-icon')){var inp=t.previousElementSibling;if(inp)openMediaPicker(inp);}" << "else if(t.classList.contains('se-pick-icon')){var wrap=t.closest('.se-opt-icon-wrap');var inp=wrap?wrap.querySelector('.se-opt-icon'):null;if(inp)openMediaPicker(inp);}" << "else if(t.classList.contains('se-upload-icon')){var inp=t.getAttribute('data-target');var fi=document.getElementById(inp);if(fi)fi.click();}" << "else{var btn=t.closest?t.closest('.se-type-btn'):null;if(btn){var qe=btn.closest('.se-question');var inp=qe?qe.querySelector('.se-qtype'):null;if(inp)inp.value=btn.getAttribute('data-type');readForm();render();}}};" << "el.onchange=function(e){" << "var t=e.target;" << "if(t.classList.contains('se-parent-q')){readForm();render();}" << "else if(t.classList.contains('se-parent-ans')){readForm();}" << "else if(t.classList.contains('se-upload-file')){" << "var file=t.files[0];if(!file)return;" << "var wrap=t.closest('.se-opt-icon-wrap');" << "var iconInput=wrap?wrap.querySelector('.se-opt-icon'):null;" << "var reader=new FileReader();" << "reader.onload=function(e){if(iconInput)iconInput.value=e.target.result;t.value='';readForm();render();};" << "reader.readAsDataURL(file);}};" << "}}" << "" // media picker for icon type Loading Loading @@ -3747,15 +3800,10 @@ namespace blogi { << "uploadStatus.textContent='Lade hoch...';" << "var reader=new FileReader();" << "reader.onload=function(e){" << "apiCall([{command:'media_upload',album_id:albumId,filename:file.name,data:e.target.result}],function(err,res){" << "targetInput.value=e.target.result;" << "uploadInput.value='';" << "if(err||!res){uploadStatus.textContent='Fehler beim Upload';return;}" << "var r=res[0];" << "if(r&&r.status==='success'&&r.media){" << "targetInput.value=r.media.url+'?w=64&h=64';" << "uploadStatus.textContent='';" << "ov.remove();readForm();render();" << "}else{uploadStatus.textContent='Fehler: '+(r&&r.message?r.message:'Unbekannt');}});};" << "ov.remove();readForm();render();};" << "reader.readAsDataURL(file);};" << "function renderMediaGrid(){" << "apiCall([{command:'media_list_media',album_id:albumId}],function(err,res){" Loading Loading
plugins/survey/survey.cpp +74 −26 Changes for plugins/survey/survey.cpp: 74 added lines, 26 removed lines. Original line number Diff line number Diff line Loading @@ -3495,10 +3495,12 @@ namespace blogi { << ".se-type-label{font-size:.7em;}" << ".se-opts{margin-top:8px;padding-top:8px;border-top:1px solid var(--blogi-border,#eee);}" << ".se-opts h4{margin:0 0 6px;font-size:.85em;color:var(--blogi-text-muted,#888);}" << ".se-opt-row{display:grid;grid-template-columns:1fr 1fr 1fr 30px;gap:6px;margin-bottom:6px;align-items:start;}" << ".se-opt-row{display:grid;grid-template-columns:1fr 1fr 30px;gap:6px;margin-bottom:6px;align-items:start;}" << ".se-opt-row input{padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.85em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);}" << ".se-opt-row select.se-exc{padding:2px 4px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.8em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);min-height:48px;}" << ".se-opt-row button{background:none;border:none;cursor:pointer;color:var(--blogi-error,#F36947);font-size:1em;}" << ".se-parent-row{margin-top:8px;padding-top:8px;border-top:1px solid var(--blogi-border,#444);display:flex;align-items:center;gap:8px;flex-wrap:wrap;}" << ".se-parent-row>label{font-size:.82em;font-weight:600;color:var(--blogi-text-muted,#888);white-space:nowrap;}" << ".se-parent-row select{padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.82em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);}" << ".se-add-opt{background:none;border:1px dashed var(--blogi-border,#ccc);border-radius:4px;padding:4px 10px;cursor:pointer;font-size:.85em;color:var(--blogi-text-muted,#888);margin-top:4px;}" << ".se-add-opt:hover{border-color:var(--blogi-accent,#2da82d);color:var(--blogi-accent,#2da82d);}" << ".se-pick-icon{padding:4px 8px;background:var(--blogi-accent,#2da82d);color:#fff;border:none;border-radius:4px;cursor:pointer;font-size:1em;}" Loading @@ -3511,7 +3513,7 @@ namespace blogi { << ".se-img-row{display:grid;grid-template-columns:1fr 100px 80px;gap:8px;margin-top:8px;align-items:end;}" << ".se-img-row label{display:block;font-size:.85em;color:var(--blogi-text-muted,#666);margin-bottom:2px;}" << ".se-img-row input{width:100%;padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);box-sizing:border-box;}" << ".se-opt-row.se-opt-row-icon{grid-template-columns:1fr 1fr 1fr 1fr 30px;}" << ".se-opt-row.se-opt-row-icon{grid-template-columns:1fr 1fr 1fr 30px;}" << ".se-opt-icon-wrap{display:flex;gap:4px;align-items:center;min-width:0;}" << ".se-opt-icon-wrap input{flex:1;min-width:0;padding:4px 6px;border:1px solid var(--blogi-border,#ddd);border-radius:4px;font-size:.85em;background:var(--blogi-surface,#fff);color:var(--blogi-text,#333);}" << ".se-upload-wrap{display:flex;align-items:center;gap:8px;padding:8px 0;margin-bottom:8px;border-bottom:1px solid var(--blogi-border,#555);}" Loading Loading @@ -3575,14 +3577,27 @@ namespace blogi { << "var optEls=qe.querySelectorAll('.se-opt-row');" << "for(var j=0;j<optEls.length;j++){" << "var inputs=optEls[j].querySelectorAll('input');" << "if(inputs.length>=2){" << "var o={value:inputs[0].value,label:inputs[1].value};" << "var excSel=optEls[j].querySelector('.se-exc');" << "if(excSel){var sv=[];for(var si=0;si<excSel.options.length;si++){if(excSel.options[si].selected)sv.push(excSel.options[si].value);}if(sv.length)o.excludes=sv.join(',');}" << "if(inputs.length>=1){" << "var o={value:inputs[0].value,label:inputs[1]?inputs[1].value:'',excludes:''};" << "var iconI=optEls[j].querySelector('.se-opt-icon');" << "if(iconI&&iconI.value)o.icon=iconI.value;" << "q.options.push(o);}}" << "survey.questions.push(q);}}" << "survey.questions.push(q);}" // Second pass: translate übergeordnete Frage assignments into option.excludes << "for(var i=0;i<qEls.length;i++){" << "var qe=qEls[i];" << "var pqSel=qe.querySelector('.se-parent-q');" << "var panSel=qe.querySelector('.se-parent-ans');" << "if(!pqSel||!pqSel.value||!panSel||!panSel.value)continue;" << "var parentQid=pqSel.value,parentAns=panSel.value,childId=survey.questions[i].id;" << "for(var pi=0;pi<survey.questions.length;pi++){" << "if(survey.questions[pi].id!==parentQid)continue;" << "for(var oi=0;oi<survey.questions[pi].options.length;oi++){" << "var opt=survey.questions[pi].options[oi];" << "if(opt.value!==parentAns)continue;" << "var ex=(opt.excludes||'').split(',').map(function(s){return s.trim();}).filter(Boolean);" << "if(ex.indexOf(childId)===-1)ex.push(childId);" << "opt.excludes=ex.join(',');break;}break;}}}" << "" << "function render(){" << "var h='<div id=\"se-msg\"></div>';" Loading Loading @@ -3648,24 +3663,50 @@ namespace blogi { << "h+='<div class=\"se-opt-row'+(isIcon?' se-opt-row-icon':'')+'\">';" << "h+='<input placeholder=\"value\" value=\"'+esc(opts[j].value||'')+'\"/>';" << "h+='<input placeholder=\"label\" value=\"'+esc(opts[j].label||'')+'\"/>';" << "var excArr=(opts[j].excludes||'').split(',').filter(function(s){return s.trim();});" << "h+='<select class=\"se-exc\" multiple title=\"Excludes\">';" << "var allQs=survey.questions||[];" << "for(var k=0;k<allQs.length;k++){" << "if(allQs[k].id===q.id)continue;" << "var sel=excArr.indexOf(allQs[k].id)!==-1?' selected':'';" << "var lbl=allQs[k].id.substring(0,8)+(allQs[k].text?' - '+allQs[k].text.substring(0,20):'');" << "h+='<option value=\"'+esc(allQs[k].id)+'\"'+sel+'>'+esc(lbl)+'</option>';}" << "h+='</select>';" << "if(isIcon){" << "var icoUrl=opts[j].icon||'';" << "var upId='seup_'+idx+'_'+j;" << "h+='<div class=\"se-opt-icon-wrap\">';" << "if(icoUrl)h+='<img src=\"'+esc(icoUrl)+'\" class=\"se-opt-preview\" alt=\"\"/>';" << "h+='<input class=\"se-opt-icon\" placeholder=\"Icon URL\" value=\"'+esc(icoUrl)+'\"/>';" << "h+='<button class=\"se-pick-icon\" type=\"button\" title=\"Bild ausw\\u00e4hlen\">📷</button>';" << "h+='<input type=\"file\" accept=\"image/*\" id=\"'+upId+'\" class=\"se-upload-file\" style=\"display:none\"/>';" << "h+='<button class=\"se-pick-icon\" type=\"button\" title=\"Aus Mediathek\">🗎</button>';" << "h+='<button class=\"se-upload-icon\" type=\"button\" data-target=\"'+upId+'\" title=\"Bild hochladen\">📤</button>';" << "h+='</div>';}" << "h+='<button class=\"se-opt-del\">×</button></div>';}" << "h+='<button class=\"se-add-opt\">+ Option</button></div>';}" // Übergeordnete Frage section – derive current parent from option.excludes << "var parentQid='',parentAns='';" << "var allQs=survey.questions||[];" << "for(var pi=0;pi<allQs.length;pi++){" << "if(allQs[pi].id===q.id)continue;" << "var popts=allQs[pi].options||[];" << "for(var oi=0;oi<popts.length;oi++){" << "var ex=(popts[oi].excludes||'').split(',').map(function(s){return s.trim();}).filter(Boolean);" << "if(ex.indexOf(q.id)!==-1){parentQid=allQs[pi].id;parentAns=popts[oi].value;break;}}" << "if(parentQid)break;}" << "h+='<div class=\"se-parent-row\">';" << "h+='<label>🔗 Übergeordnete Frage:</label>';" << "h+='<select class=\"se-parent-q\">';" << "h+='<option value=\"\">– keine –</option>';" << "for(var pi=0;pi<allQs.length;pi++){" << "if(allQs[pi].id===q.id)continue;" << "var psel=parentQid===allQs[pi].id?' selected':'';" << "var plbl=(allQs[pi].text||allQs[pi].id.substring(0,8)).substring(0,40);" << "h+='<option value=\"'+esc(allQs[pi].id)+'\"'+psel+'>'+esc(plbl)+'</option>';}" << "h+='</select>';" << "if(parentQid){" << "var parentQ=null;for(var pi=0;pi<allQs.length;pi++){if(allQs[pi].id===parentQid){parentQ=allQs[pi];break;}}" << "if(parentQ&&parentQ.options&&parentQ.options.length){" << "h+='<label style=\"font-size:.82em\">bei Antwort:</label>';" << "h+='<select class=\"se-parent-ans\">';" << "h+='<option value=\"\">– Antwort –</option>';" << "for(var oi=0;oi<parentQ.options.length;oi++){" << "var asel=parentAns===parentQ.options[oi].value?' selected':'';" << "var albl=parentQ.options[oi].label||parentQ.options[oi].value;" << "h+='<option value=\"'+esc(parentQ.options[oi].value)+'\"'+asel+'>'+esc(albl)+'</option>';}" << "h+='</select>';}}" << "h+='</div>';" << "h+='</div>';return h;}" << "" << "function addQuestion(){" Loading @@ -3682,8 +3723,20 @@ namespace blogi { << "else if(t.classList.contains('se-q-down')){readForm();var qe=t.closest('.se-question');var idx=parseInt(qe.getAttribute('data-idx'));if(idx<survey.questions.length-1){var tmp=survey.questions[idx];survey.questions[idx]=survey.questions[idx+1];survey.questions[idx+1]=tmp;var tmpO=survey.questions[idx].order;survey.questions[idx].order=survey.questions[idx-1].order;survey.questions[idx-1].order=tmpO;render();}}" << "else if(t.classList.contains('se-opt-del')){readForm();var row=t.closest('.se-opt-row');var qe=t.closest('.se-question');var qi=parseInt(qe.getAttribute('data-idx'));var opts=qe.querySelectorAll('.se-opt-row');for(var i=0;i<opts.length;i++){if(opts[i]===row){survey.questions[qi].options.splice(i,1);break;}}render();}" << "else if(t.classList.contains('se-add-opt')){readForm();var qe=t.closest('.se-question');var qi=parseInt(qe.getAttribute('data-idx'));survey.questions[qi].options.push({value:'',label:'',excludes:'',icon:''});render();}" << "else if(t.classList.contains('se-pick-icon')){var inp=t.previousElementSibling;if(inp)openMediaPicker(inp);}" << "else if(t.classList.contains('se-pick-icon')){var wrap=t.closest('.se-opt-icon-wrap');var inp=wrap?wrap.querySelector('.se-opt-icon'):null;if(inp)openMediaPicker(inp);}" << "else if(t.classList.contains('se-upload-icon')){var inp=t.getAttribute('data-target');var fi=document.getElementById(inp);if(fi)fi.click();}" << "else{var btn=t.closest?t.closest('.se-type-btn'):null;if(btn){var qe=btn.closest('.se-question');var inp=qe?qe.querySelector('.se-qtype'):null;if(inp)inp.value=btn.getAttribute('data-type');readForm();render();}}};" << "el.onchange=function(e){" << "var t=e.target;" << "if(t.classList.contains('se-parent-q')){readForm();render();}" << "else if(t.classList.contains('se-parent-ans')){readForm();}" << "else if(t.classList.contains('se-upload-file')){" << "var file=t.files[0];if(!file)return;" << "var wrap=t.closest('.se-opt-icon-wrap');" << "var iconInput=wrap?wrap.querySelector('.se-opt-icon'):null;" << "var reader=new FileReader();" << "reader.onload=function(e){if(iconInput)iconInput.value=e.target.result;t.value='';readForm();render();};" << "reader.readAsDataURL(file);}};" << "}}" << "" // media picker for icon type Loading Loading @@ -3747,15 +3800,10 @@ namespace blogi { << "uploadStatus.textContent='Lade hoch...';" << "var reader=new FileReader();" << "reader.onload=function(e){" << "apiCall([{command:'media_upload',album_id:albumId,filename:file.name,data:e.target.result}],function(err,res){" << "targetInput.value=e.target.result;" << "uploadInput.value='';" << "if(err||!res){uploadStatus.textContent='Fehler beim Upload';return;}" << "var r=res[0];" << "if(r&&r.status==='success'&&r.media){" << "targetInput.value=r.media.url+'?w=64&h=64';" << "uploadStatus.textContent='';" << "ov.remove();readForm();render();" << "}else{uploadStatus.textContent='Fehler: '+(r&&r.message?r.message:'Unbekannt');}});};" << "ov.remove();readForm();render();};" << "reader.readAsDataURL(file);};" << "function renderMediaGrid(){" << "apiCall([{command:'media_list_media',album_id:albumId}],function(err,res){" Loading