minigame 1 question 1.1
This commit is contained in:
@@ -188,6 +188,11 @@
|
||||
var bMs = data.betweenMs != null ? data.betweenMs : 3500;
|
||||
el('quiz-between-sec').value = String(Math.max(0, Math.round(bMs / 1000)));
|
||||
renderQuizAdminQuestions(data.questions);
|
||||
if (data.quizMapPanelTheme && typeof data.quizMapPanelTheme === 'object') {
|
||||
quizTfFillFormFromTheme(data.quizMapPanelTheme);
|
||||
} else {
|
||||
quizTfFillFormFromTheme({});
|
||||
}
|
||||
setMsg('quiz-settings-msg', '', '');
|
||||
}).catch(function (e) {
|
||||
setMsg('quiz-settings-msg', e.message || 'โหลดไม่ได้', 'error');
|
||||
@@ -219,6 +224,7 @@
|
||||
answerMs: ansS * 1000,
|
||||
betweenMs: betS * 1000,
|
||||
questions: questions,
|
||||
quizMapPanelTheme: quizTfBuildThemeForSave(),
|
||||
}).then(function () {
|
||||
setMsg('quiz-settings-msg', 'บันทึกแล้ว', 'ok');
|
||||
}).catch(function (e) {
|
||||
@@ -226,6 +232,134 @@
|
||||
});
|
||||
}
|
||||
|
||||
function quizTfThemeHiddenId(kind) {
|
||||
if (kind === 'bg') return 'quiz-tf-theme-bg';
|
||||
if (kind === 'border') return 'quiz-tf-theme-border';
|
||||
return 'quiz-tf-theme-text';
|
||||
}
|
||||
|
||||
function quizTfRowPrefix(kind) {
|
||||
return 'quiz-tf-theme-' + kind;
|
||||
}
|
||||
|
||||
function quizTfSetPickersFromColorString(kind, cssStr) {
|
||||
var fb = QUIZ_CARRY_THEME_DEFAULTS[kind];
|
||||
var o = quizCarryParseCssColor(cssStr, fb);
|
||||
var pref = quizTfRowPrefix(kind);
|
||||
var sw = el(pref + '-swatch');
|
||||
var ra = el(pref + '-alpha');
|
||||
var out = el(pref + '-alpha-out');
|
||||
var hi = el(quizTfThemeHiddenId(kind));
|
||||
var pr = el(pref + '-preview');
|
||||
if (!sw || !ra || !hi) return;
|
||||
sw.value = quizCarryHexFromRgb(o.r, o.g, o.b);
|
||||
var pct = Math.max(0, Math.min(100, Math.round(Number(o.a) * 100)));
|
||||
ra.value = String(pct);
|
||||
if (out) out.textContent = pct + '%';
|
||||
hi.value = quizCarryRgbToRgbaString(o);
|
||||
if (pr) pr.textContent = hi.value;
|
||||
}
|
||||
|
||||
function quizTfComposeFromPickers(kind) {
|
||||
var pref = quizTfRowPrefix(kind);
|
||||
var sw = el(pref + '-swatch');
|
||||
var ra = el(pref + '-alpha');
|
||||
if (!sw || !ra) return '';
|
||||
var pr = quizCarryParseHexToRgb(sw.value);
|
||||
if (!pr) return '';
|
||||
var pct = parseInt(String(ra.value), 10);
|
||||
if (!Number.isFinite(pct)) pct = 100;
|
||||
pct = Math.max(0, Math.min(100, pct));
|
||||
return quizCarryRgbToRgbaString({ r: pr.r, g: pr.g, b: pr.b, a: pct / 100 });
|
||||
}
|
||||
|
||||
function quizTfSyncRowOutput(kind) {
|
||||
var s = quizTfComposeFromPickers(kind);
|
||||
var hi = el(quizTfThemeHiddenId(kind));
|
||||
var pref = quizTfRowPrefix(kind);
|
||||
var ra = el(pref + '-alpha');
|
||||
var out = el(pref + '-alpha-out');
|
||||
var pr = el(pref + '-preview');
|
||||
if (hi) hi.value = s;
|
||||
if (out && ra) out.textContent = String(Math.max(0, Math.min(100, parseInt(ra.value, 10) || 0))) + '%';
|
||||
if (pr && hi) pr.textContent = hi.value;
|
||||
}
|
||||
|
||||
function quizTfBindThemePickersOnce() {
|
||||
if (quizTfBindThemePickersOnce._done) return;
|
||||
['bg', 'border', 'text'].forEach(function (kind) {
|
||||
var pref = quizTfRowPrefix(kind);
|
||||
var sw = el(pref + '-swatch');
|
||||
var ra = el(pref + '-alpha');
|
||||
if (!sw || !ra) return;
|
||||
if (ra.getAttribute('data-tf-bound') === '1') return;
|
||||
ra.setAttribute('data-tf-bound', '1');
|
||||
function sync() {
|
||||
quizTfSyncRowOutput(kind);
|
||||
}
|
||||
sw.addEventListener('input', sync);
|
||||
sw.addEventListener('change', sync);
|
||||
ra.addEventListener('input', sync);
|
||||
ra.addEventListener('change', sync);
|
||||
});
|
||||
quizTfBindThemePickersOnce._done = true;
|
||||
}
|
||||
|
||||
function quizTfBuildThemeForSave() {
|
||||
quizTfBindThemePickersOnce();
|
||||
['bg', 'border', 'text'].forEach(function (k) {
|
||||
quizTfSyncRowOutput(k);
|
||||
});
|
||||
var fbBg = QUIZ_CARRY_THEME_DEFAULTS.bg;
|
||||
var fbBr = QUIZ_CARRY_THEME_DEFAULTS.border;
|
||||
var fbTx = QUIZ_CARRY_THEME_DEFAULTS.text;
|
||||
var sBg = quizTfComposeFromPickers('bg');
|
||||
var sBr = quizTfComposeFromPickers('border');
|
||||
var sTx = quizTfComposeFromPickers('text');
|
||||
var bwEl = el('quiz-tf-theme-border-w');
|
||||
var bw = bwEl ? parseInt(String(bwEl.value || '2'), 10) : 2;
|
||||
if (!Number.isFinite(bw)) bw = 2;
|
||||
bw = Math.max(0, Math.min(12, Math.round(bw)));
|
||||
var qfMinEl = el('quiz-tf-theme-qfont-min');
|
||||
var qfMaxEl = el('quiz-tf-theme-qfont-max');
|
||||
var qMin = qfMinEl ? parseInt(String(qfMinEl.value || '10'), 10) : 10;
|
||||
var qMax = qfMaxEl ? parseInt(String(qfMaxEl.value || '24'), 10) : 24;
|
||||
if (!Number.isFinite(qMin)) qMin = 10;
|
||||
if (!Number.isFinite(qMax)) qMax = 24;
|
||||
qMin = Math.max(10, Math.min(40, Math.round(qMin)));
|
||||
qMax = Math.max(14, Math.min(56, Math.round(qMax)));
|
||||
if (qMax < qMin) {
|
||||
var swap = qMin;
|
||||
qMin = qMax;
|
||||
qMax = swap;
|
||||
}
|
||||
return {
|
||||
panelBg: (sBg && sBg.trim()) ? sBg.trim().slice(0, 120) : quizCarryRgbToRgbaString(fbBg),
|
||||
panelBorder: (sBr && sBr.trim()) ? sBr.trim().slice(0, 120) : quizCarryRgbToRgbaString(fbBr),
|
||||
textColor: (sTx && sTx.trim()) ? sTx.trim().slice(0, 120) : quizCarryRgbToRgbaString(fbTx),
|
||||
borderWidthPx: bw,
|
||||
questionFontMinPx: qMin,
|
||||
questionFontMaxPx: qMax,
|
||||
};
|
||||
}
|
||||
|
||||
function quizTfFillFormFromTheme(th) {
|
||||
quizTfBindThemePickersOnce();
|
||||
var t = th && typeof th === 'object' ? th : {};
|
||||
quizTfSetPickersFromColorString('bg', t.panelBg);
|
||||
quizTfSetPickersFromColorString('border', t.panelBorder);
|
||||
quizTfSetPickersFromColorString('text', t.textColor);
|
||||
var bwEl = el('quiz-tf-theme-border-w');
|
||||
var bw = parseInt(String(t.borderWidthPx), 10);
|
||||
if (bwEl) bwEl.value = String(Number.isFinite(bw) && bw >= 0 ? Math.min(12, bw) : 2);
|
||||
var qfMinEl = el('quiz-tf-theme-qfont-min');
|
||||
var qfMaxEl = el('quiz-tf-theme-qfont-max');
|
||||
var qMin = parseInt(String(t.questionFontMinPx), 10);
|
||||
var qMax = parseInt(String(t.questionFontMaxPx), 10);
|
||||
if (qfMinEl) qfMinEl.value = String(Number.isFinite(qMin) ? Math.max(10, Math.min(40, qMin)) : 10);
|
||||
if (qfMaxEl) qfMaxEl.value = String(Number.isFinite(qMax) ? Math.max(14, Math.min(56, qMax)) : 24);
|
||||
}
|
||||
|
||||
var QUIZ_CARRY_MAX_SLOTS = 16;
|
||||
|
||||
function rebuildQuizCarryCorrectSelect(row) {
|
||||
|
||||
Reference in New Issue
Block a user