Skip to content

Commit 9fcc152

Browse files
committed
Fix like/dislike feedback not appearing after solve.
Restore vpSyncFeedback call, move feedback block outside hidden step player so list mode and play mode both show it.
1 parent bf98da6 commit 9fcc152

2 files changed

Lines changed: 70 additions & 28 deletions

File tree

en/index.html

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,7 @@
750750
.vp-ctrl .btn:disabled{opacity:.45;cursor:not-allowed;}
751751
.vp-ctrl .btn:disabled:hover{transform:none;border-color:var(--line-2);}
752752
.vp-feedback{margin-top:14px;text-align:center;overflow:hidden;}
753+
.vp-feedback.sol-feedback{margin-top:22px;}
753754
.vp-feedback[hidden]{display:none!important;}
754755
.vp-fb-q{margin:0 0 10px;font-size:14px;color:var(--ink-2);max-height:32px;opacity:1;
755756
transition:opacity .35s var(--ease),max-height .35s var(--ease),margin .35s var(--ease);}
@@ -2560,7 +2561,11 @@ <h2 class="rise" style="--d:0">How it works</h2>
25602561
trackEvent('solve_empty');
25612562
body.innerHTML =
25622563
'<div class="sol-head"><span class="sol-title">Solution</span></div>' +
2563-
'<div class="msg ok">All pins already centered - lock is open. No moves needed.</div>';
2564+
'<div class="msg ok">All pins already centered - lock is open. No moves needed.</div>' +
2565+
solFeedbackHtml();
2566+
resetSolFeedback();
2567+
bindSolFeedback();
2568+
vpSyncFeedback(true);
25642569
return;
25652570
}
25662571

@@ -2610,6 +2615,28 @@ <h2 class="rise" style="--d:0">How it works</h2>
26102615
: '<span class="dirchip R">RIGHT &rarr;</span>';
26112616
}
26122617

2618+
function solFeedbackHtml() {
2619+
return '<div class="vp-feedback sol-feedback" id="vpFeedback" hidden>' +
2620+
'<p class="vp-fb-q">Did this help?</p>' +
2621+
'<div class="vp-fb-act" id="vpFbAct">' +
2622+
'<button class="vp-fb-btn vp-fb-up" id="vpFbUp" type="button">Yes</button>' +
2623+
'<button class="vp-fb-btn vp-fb-down" id="vpFbDn" type="button">No</button>' +
2624+
'</div>' +
2625+
'<p class="vp-fb-hint" id="vpFbHint" hidden>You can change your vote</p>' +
2626+
'<p class="vp-fb-thanks" id="vpFbThanks">Thanks!</p>' +
2627+
'</div>';
2628+
}
2629+
function bindSolFeedback() {
2630+
var up = document.getElementById('vpFbUp');
2631+
var dn = document.getElementById('vpFbDn');
2632+
if (up) up.onclick = function () { vpSubmitFeedback('up'); };
2633+
if (dn) dn.onclick = function () { vpSubmitFeedback('down'); };
2634+
}
2635+
function resetSolFeedback() {
2636+
vpFbChecked = false;
2637+
vpCurrentVote = null;
2638+
}
2639+
26132640
function renderSolution(fresh) {
26142641
if (!SOL) return;
26152642
var body = document.getElementById('solbody');
@@ -2647,7 +2674,8 @@ <h2 class="rise" style="--d:0">How it works</h2>
26472674
}
26482675
html += '</div><div class="msg ok">After the last step all pins reach center - lock opens. ' +
26492676
'Solution verified by simulation. Click steps to mark done.</div></div>' +
2650-
'<div id="solPlayer"' + (SOL_MODE === 'play' ? '' : ' style="display:none"') + '></div>';
2677+
'<div id="solPlayer"' + (SOL_MODE === 'play' ? '' : ' style="display:none"') + '></div>' +
2678+
solFeedbackHtml();
26512679
body.innerHTML = html;
26522680
document.getElementById('pvToggle').onchange = function () {
26532681
PV_ON = this.checked;
@@ -2664,6 +2692,9 @@ <h2 class="rise" style="--d:0">How it works</h2>
26642692
if (fresh) vpIdx = 0;
26652693
buildPlayer();
26662694
setSolMode(SOL_MODE, false);
2695+
resetSolFeedback();
2696+
bindSolFeedback();
2697+
vpSyncFeedback(SOL_MODE === 'list');
26672698
}
26682699

26692700
/* ---------- visual step-by-step mode ---------- */
@@ -2687,6 +2718,7 @@ <h2 class="rise" style="--d:0">How it works</h2>
26872718
if (vp) { vp.classList.remove('show'); void vp.offsetWidth; vp.classList.add('show'); }
26882719
}
26892720
}
2721+
if (SOL) vpSyncFeedback(SOL_MODE === 'list' || vpIdx >= vpGroups.length);
26902722
}
26912723

26922724
function buildPlayer() {
@@ -2704,15 +2736,6 @@ <h2 class="rise" style="--d:0">How it works</h2>
27042736
'<button id="vpPrev" class="btn" type="button">&larr; Back</button>' +
27052737
'<button id="vpNext" class="btn primary" type="button">Next &rarr;</button>' +
27062738
'</div>' +
2707-
'<div class="vp-feedback" id="vpFeedback" hidden>' +
2708-
'<p class="vp-fb-q">Did this help?</p>' +
2709-
'<div class="vp-fb-act" id="vpFbAct">' +
2710-
'<button class="vp-fb-btn vp-fb-up" id="vpFbUp" type="button">Yes</button>' +
2711-
'<button class="vp-fb-btn vp-fb-down" id="vpFbDn" type="button">No</button>' +
2712-
'</div>' +
2713-
'<p class="vp-fb-hint" id="vpFbHint" hidden>You can change your vote</p>' +
2714-
'<p class="vp-fb-thanks" id="vpFbThanks">Thanks!</p>' +
2715-
'</div>' +
27162739
'</div>';
27172740
var lockEl = document.getElementById('vpLock');
27182741
lockEl.style.setProperty('--vty', ((N - 1) * 15 + 6) + 'px');
@@ -2732,11 +2755,8 @@ <h2 class="rise" style="--d:0">How it works</h2>
27322755
vpStates = [SOL.check.states[0]];
27332756
for (var g = 0; g < vpGroups.length; g++) vpStates.push(SOL.check.states[vpGroups[g].endIdx + 1]);
27342757
if (vpIdx > vpGroups.length) vpIdx = vpGroups.length;
2735-
vpFbChecked = false;
27362758
document.getElementById('vpPrev').onclick = function () { if (vpIdx > 0) { vpIdx--; playerRender(); } };
27372759
document.getElementById('vpNext').onclick = function () { if (vpIdx < vpGroups.length) { vpIdx++; playerRender(); } };
2738-
document.getElementById('vpFbUp').onclick = function () { vpSubmitFeedback('up'); };
2739-
document.getElementById('vpFbDn').onclick = function () { vpSubmitFeedback('down'); };
27402760
}
27412761

27422762
var vpFbChecked = false;
@@ -2830,6 +2850,7 @@ <h2 class="rise" style="--d:0">How it works</h2>
28302850
document.getElementById('vpMove').innerHTML = done ? 'All pins centered' : vpMoveText(vpGroups[vpIdx]);
28312851
document.getElementById('vpPrev').disabled = vpIdx === 0;
28322852
document.getElementById('vpNext').disabled = done;
2853+
vpSyncFeedback(done);
28332854
}
28342855

28352856
/* ---------- share links / presets / reset ---------- */

index.html

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -797,6 +797,7 @@
797797
.vp-ctrl .btn:disabled{opacity:.45;cursor:not-allowed;}
798798
.vp-ctrl .btn:disabled:hover{transform:none;border-color:var(--line-2);}
799799
.vp-feedback{margin-top:14px;text-align:center;overflow:hidden;}
800+
.vp-feedback.sol-feedback{margin-top:22px;}
800801
.vp-feedback[hidden]{display:none!important;}
801802
.vp-fb-q{margin:0 0 10px;font-size:14px;color:var(--ink-2);max-height:32px;opacity:1;
802803
transition:opacity .35s var(--ease),max-height .35s var(--ease),margin .35s var(--ease);}
@@ -2634,7 +2635,11 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
26342635
trackEvent('solve_empty');
26352636
body.innerHTML =
26362637
'<div class="sol-head"><span class="sol-title">Решение</span></div>' +
2637-
'<div class="msg ok">Все штифты уже в центре - замок открыт. Ходов не нужно.</div>';
2638+
'<div class="msg ok">Все штифты уже в центре - замок открыт. Ходов не нужно.</div>' +
2639+
solFeedbackHtml();
2640+
resetSolFeedback();
2641+
bindSolFeedback();
2642+
vpSyncFeedback(true);
26382643
return;
26392644
}
26402645

@@ -2684,6 +2689,28 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
26842689
: '<span class="dirchip R">ВПРАВО &rarr;</span>';
26852690
}
26862691

2692+
function solFeedbackHtml() {
2693+
return '<div class="vp-feedback sol-feedback" id="vpFeedback" hidden>' +
2694+
'<p class="vp-fb-q">Сайт помог?</p>' +
2695+
'<div class="vp-fb-act" id="vpFbAct">' +
2696+
'<button class="vp-fb-btn vp-fb-up" id="vpFbUp" type="button">Да</button>' +
2697+
'<button class="vp-fb-btn vp-fb-down" id="vpFbDn" type="button">Нет</button>' +
2698+
'</div>' +
2699+
'<p class="vp-fb-hint" id="vpFbHint" hidden>Оценку можно изменить</p>' +
2700+
'<p class="vp-fb-thanks" id="vpFbThanks">Спасибо!</p>' +
2701+
'</div>';
2702+
}
2703+
function bindSolFeedback() {
2704+
var up = document.getElementById('vpFbUp');
2705+
var dn = document.getElementById('vpFbDn');
2706+
if (up) up.onclick = function () { vpSubmitFeedback('up'); };
2707+
if (dn) dn.onclick = function () { vpSubmitFeedback('down'); };
2708+
}
2709+
function resetSolFeedback() {
2710+
vpFbChecked = false;
2711+
vpCurrentVote = null;
2712+
}
2713+
26872714
function renderSolution(fresh) {
26882715
if (!SOL) return;
26892716
var body = document.getElementById('solbody');
@@ -2721,7 +2748,8 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27212748
}
27222749
html += '</div><div class="msg ok">После последнего шага все штифты встанут в центр - замок откроется. ' +
27232750
'Решение проверено симуляцией перед выводом. Кликай по шагам, чтобы отмечать выполненные.</div></div>' +
2724-
'<div id="solPlayer"' + (SOL_MODE === 'play' ? '' : ' style="display:none"') + '></div>';
2751+
'<div id="solPlayer"' + (SOL_MODE === 'play' ? '' : ' style="display:none"') + '></div>' +
2752+
solFeedbackHtml();
27252753
body.innerHTML = html;
27262754
document.getElementById('pvToggle').onchange = function () {
27272755
PV_ON = this.checked;
@@ -2738,6 +2766,9 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27382766
if (fresh) vpIdx = 0;
27392767
buildPlayer();
27402768
setSolMode(SOL_MODE, false);
2769+
resetSolFeedback();
2770+
bindSolFeedback();
2771+
vpSyncFeedback(SOL_MODE === 'list');
27412772
}
27422773

27432774
/* ---------- визуальный пошаговый режим («Показ») ---------- */
@@ -2761,6 +2792,7 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27612792
if (vp) { vp.classList.remove('show'); void vp.offsetWidth; vp.classList.add('show'); }
27622793
}
27632794
}
2795+
if (SOL) vpSyncFeedback(SOL_MODE === 'list' || vpIdx >= vpGroups.length);
27642796
}
27652797

27662798
function buildPlayer() {
@@ -2778,15 +2810,6 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
27782810
'<button id="vpPrev" class="btn" type="button">&larr; Назад</button>' +
27792811
'<button id="vpNext" class="btn primary" type="button">Далее &rarr;</button>' +
27802812
'</div>' +
2781-
'<div class="vp-feedback" id="vpFeedback" hidden>' +
2782-
'<p class="vp-fb-q">Сайт помог?</p>' +
2783-
'<div class="vp-fb-act" id="vpFbAct">' +
2784-
'<button class="vp-fb-btn vp-fb-up" id="vpFbUp" type="button">Да</button>' +
2785-
'<button class="vp-fb-btn vp-fb-down" id="vpFbDn" type="button">Нет</button>' +
2786-
'</div>' +
2787-
'<p class="vp-fb-hint" id="vpFbHint" hidden>Оценку можно изменить</p>' +
2788-
'<p class="vp-fb-thanks" id="vpFbThanks">Спасибо!</p>' +
2789-
'</div>' +
27902813
'</div>';
27912814
var lockEl = document.getElementById('vpLock');
27922815
lockEl.style.setProperty('--vty', ((N - 1) * 15 + 6) + 'px');
@@ -2806,11 +2829,8 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
28062829
vpStates = [SOL.check.states[0]];
28072830
for (var g = 0; g < vpGroups.length; g++) vpStates.push(SOL.check.states[vpGroups[g].endIdx + 1]);
28082831
if (vpIdx > vpGroups.length) vpIdx = vpGroups.length;
2809-
vpFbChecked = false;
28102832
document.getElementById('vpPrev').onclick = function () { if (vpIdx > 0) { vpIdx--; playerRender(); } };
28112833
document.getElementById('vpNext').onclick = function () { if (vpIdx < vpGroups.length) { vpIdx++; playerRender(); } };
2812-
document.getElementById('vpFbUp').onclick = function () { vpSubmitFeedback('up'); };
2813-
document.getElementById('vpFbDn').onclick = function () { vpSubmitFeedback('down'); };
28142834
}
28152835

28162836
var vpFbChecked = false;
@@ -2904,6 +2924,7 @@ <h2 class="rise" style="--d:0">Как это работает</h2>
29042924
document.getElementById('vpMove').innerHTML = done ? 'Все штифты в центре' : vpMoveText(vpGroups[vpIdx]);
29052925
document.getElementById('vpPrev').disabled = vpIdx === 0;
29062926
document.getElementById('vpNext').disabled = done;
2927+
vpSyncFeedback(done);
29072928
}
29082929

29092930
/* ---------- ссылки / пресеты / сброс ---------- */

0 commit comments

Comments
 (0)