mcp-quiz-server
Version:
🧠 AI-Powered Quiz Management via Model Context Protocol (MCP) - Create, manage, and take quizzes directly from VS Code, Claude, and other AI agents.
294 lines • 13.8 kB
JavaScript
import { SettingsService } from '../services/SettingsService';
import { Component } from './Component';
export class SettingsMenu extends Component {
constructor() {
super('#settings-dropdown');
this.unsubscribe = null;
this.settingsService = SettingsService.getInstance();
this.menuButton = document.querySelector('#settings-menu-btn');
this.dropdown = document.querySelector('#settings-dropdown');
this.closeButton = document.querySelector('#close-settings-menu');
}
onMount() {
this.unsubscribe = this.settingsService.subscribe(settings => this.onSettingsChange(settings));
this.updateUI();
}
onUnmount() {
this.unsubscribe?.();
}
bindEvents() {
this.menuButton?.addEventListener('click', this.toggleMenu.bind(this));
this.closeButton?.addEventListener('click', this.closeMenu.bind(this));
document.addEventListener('keydown', e => {
if (e.key === 'Escape' && !this.dropdown.classList.contains('hidden')) {
this.closeMenu();
}
});
document.addEventListener('click', e => {
if (!this.element.contains(e.target) && !this.menuButton.contains(e.target)) {
this.closeMenu();
}
});
this.bindSettingsControls();
}
bindSettingsControls() {
const hideNavButtons = document.querySelector('#hide-nav-buttons');
hideNavButtons?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({ hideDisabledNavButtons: target.checked });
});
const hideAllNavButtons = document.querySelector('#hide-all-nav-buttons');
hideAllNavButtons?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({ hideAllNavButtons: target.checked });
});
const clickToAdvance = document.querySelector('#click-to-advance');
clickToAdvance?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({ clickToAdvance: target.checked });
});
const autoAdvance = document.querySelector('#auto-advance');
autoAdvance?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({ autoAdvanceQuestions: target.checked });
});
const autoAdvanceEnabled = document.querySelector('#auto-advance-enabled');
autoAdvanceEnabled?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateQuizSettings({ autoAdvanceEnabled: target.checked });
});
const autoAdvanceDelay = document.querySelector('#auto-advance-delay');
autoAdvanceDelay?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateQuizSettings({ autoAdvanceDelay: parseInt(target.value) });
});
const smartSubmitLogic = document.querySelector('#smart-submit-logic');
smartSubmitLogic?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateQuizSettings({ smartSubmitLogic: target.checked });
});
const showQuestionNumbers = document.querySelector('#show-question-numbers');
showQuestionNumbers?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({ showQuestionNumbers: target.checked });
});
const defaultViewMode = document.querySelector('#default-view-mode');
defaultViewMode?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({
defaultViewMode: target.value,
});
});
const enableAnimations = document.querySelector('#enable-animations');
enableAnimations?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({ enableAnimations: target.checked });
});
const clickToSelectCards = document.querySelector('#click-to-select-cards');
clickToSelectCards?.addEventListener('change', e => {
const target = e.target;
this.settingsService.updateUISettings({ clickToSelectCards: target.checked });
console.log('🎯 Click-to-select cards setting updated:', target.checked);
});
const quizMode = document.querySelector('#quiz-mode');
quizMode?.addEventListener('change', e => {
const target = e.target;
const mode = target.value;
this.settingsService.updateUISettings({ quizMode: mode });
this.settingsService.updateUISettings({
clickToSelectCards: mode === 'cards',
});
this.settingsService.updateQuizSettings({
instantSubmission: mode === 'instant',
});
console.log('🎮 Quiz mode updated:', mode);
});
const autoAdvanceMode = document.querySelector('#auto-advance-mode');
autoAdvanceMode?.addEventListener('change', e => {
const target = e.target;
const mode = target.value;
this.settingsService.updateQuizSettings({ autoAdvanceMode: mode });
const customDelayRow = document.querySelector('#custom-delay-row');
if (customDelayRow) {
customDelayRow.style.display = mode === 'custom' ? 'flex' : 'none';
}
const autoAdvanceEnabled = mode !== 'off';
this.settingsService.updateQuizSettings({ autoAdvanceEnabled });
this.settingsService.updateUISettings({ autoAdvanceQuestions: autoAdvanceEnabled });
let delay = 3000;
if (mode === 'basic')
delay = 2000;
else if (mode === 'enhanced')
delay = 3000;
this.settingsService.updateQuizSettings({ autoAdvanceDelay: delay });
console.log('⚡ Auto-advance mode updated:', mode, 'delay:', delay);
});
const autoAdvanceDelaySlider = document.querySelector('#auto-advance-delay-slider');
const delayValue = document.querySelector('#delay-value');
autoAdvanceDelaySlider?.addEventListener('input', e => {
const target = e.target;
const seconds = parseInt(target.value);
const delay = seconds * 1000;
if (delayValue) {
delayValue.textContent = `${seconds} second${seconds !== 1 ? 's' : ''}`;
}
this.settingsService.updateQuizSettings({ autoAdvanceDelay: delay });
console.log('⏱️ Custom auto-advance delay updated:', delay);
});
const resetSettings = document.querySelector('#reset-settings');
resetSettings?.addEventListener('click', () => {
if (confirm('Reset all settings to defaults?')) {
this.settingsService.resetToDefaults();
}
});
}
toggleMenu() {
if (this.dropdown.classList.contains('hidden')) {
this.openMenu();
}
else {
this.closeMenu();
}
}
openMenu() {
this.dropdown.classList.remove('hidden');
const navigationContainer = document
.querySelector('#prev-btn')
?.closest('div.bg-white.border-t');
if (navigationContainer) {
navigationContainer.style.zIndex = '60';
navigationContainer.style.position = 'relative';
console.log('✅ Settings modal opened - navigation buttons z-index preserved');
}
else {
console.warn('⚠️ Navigation container not found - buttons may be hidden');
}
const prevBtn = document.querySelector('#prev-btn');
const nextBtn = document.querySelector('#next-btn');
const submitBtn = document.querySelector('#submit-button');
[prevBtn, nextBtn, submitBtn].forEach(btn => {
if (btn) {
btn.style.zIndex = '65';
btn.style.position = 'relative';
}
});
this.updateUI();
}
closeMenu() {
this.dropdown.classList.add('hidden');
const navigationContainer = document
.querySelector('#prev-btn')
?.closest('div.bg-white.border-t');
if (navigationContainer) {
navigationContainer.style.zIndex = '';
navigationContainer.style.position = '';
console.log('✅ Settings modal closed - navigation z-index reset');
}
const prevBtn = document.querySelector('#prev-btn');
const nextBtn = document.querySelector('#next-btn');
const submitBtn = document.querySelector('#submit-button');
[prevBtn, nextBtn, submitBtn].forEach(btn => {
if (btn) {
btn.style.zIndex = '';
btn.style.position = '';
}
});
setTimeout(() => {
this.refreshProgressTitle();
}, 100);
}
refreshProgressTitle() {
const quizApp = window.__quizApp;
if (quizApp && quizApp.components && quizApp.components.quizContent) {
const quizContent = quizApp.components.quizContent;
const progressTracker = quizContent.getProgressTracker && quizContent.getProgressTracker();
if (progressTracker && typeof progressTracker.refreshDocumentTitle === 'function') {
progressTracker.refreshDocumentTitle();
console.log('🔄 Progress title refreshed after settings modal close');
}
}
}
onSettingsChange(settings) {
console.log('🔄 SettingsMenu: Settings changed, updating UI...');
this.updateUI();
}
updateUI() {
const settings = this.settingsService.getSettings();
const hideNavButtons = document.querySelector('#hide-nav-buttons');
if (hideNavButtons)
hideNavButtons.checked = settings.ui.hideDisabledNavButtons;
const hideAllNavButtons = document.querySelector('#hide-all-nav-buttons');
if (hideAllNavButtons)
hideAllNavButtons.checked = settings.ui.hideAllNavButtons;
const clickToAdvance = document.querySelector('#click-to-advance');
if (clickToAdvance)
clickToAdvance.checked = settings.ui.clickToAdvance;
const autoAdvance = document.querySelector('#auto-advance');
if (autoAdvance)
autoAdvance.checked = settings.ui.autoAdvanceQuestions;
const autoAdvanceEnabled = document.querySelector('#auto-advance-enabled');
if (autoAdvanceEnabled)
autoAdvanceEnabled.checked = settings.quiz.autoAdvanceEnabled;
const autoAdvanceDelay = document.querySelector('#auto-advance-delay');
if (autoAdvanceDelay)
autoAdvanceDelay.value = settings.quiz.autoAdvanceDelay.toString();
const smartSubmitLogic = document.querySelector('#smart-submit-logic');
if (smartSubmitLogic)
smartSubmitLogic.checked = settings.quiz.smartSubmitLogic;
const showQuestionNumbers = document.querySelector('#show-question-numbers');
if (showQuestionNumbers)
showQuestionNumbers.checked = settings.ui.showQuestionNumbers;
const enableAnimations = document.querySelector('#enable-animations');
if (enableAnimations)
enableAnimations.checked = settings.ui.enableAnimations;
const clickToSelectCards = document.querySelector('#click-to-select-cards');
if (clickToSelectCards)
clickToSelectCards.checked = settings.ui.clickToSelectCards;
const quizMode = document.querySelector('#quiz-mode');
if (quizMode) {
let mode = settings.ui.quizMode || 'cards';
if (settings.quiz.instantSubmission)
mode = 'instant';
else if (settings.ui.clickToSelectCards)
mode = 'cards';
else
mode = 'traditional';
quizMode.value = mode;
}
const autoAdvanceMode = document.querySelector('#auto-advance-mode');
const customDelayRow = document.querySelector('#custom-delay-row');
const autoAdvanceDelaySlider = document.querySelector('#auto-advance-delay-slider');
const delayValue = document.querySelector('#delay-value');
if (autoAdvanceMode) {
let mode = settings.quiz.autoAdvanceMode || 'enhanced';
if (!settings.quiz.autoAdvanceEnabled) {
mode = 'off';
}
else if (settings.quiz.autoAdvanceDelay === 2000) {
mode = 'basic';
}
else if (settings.quiz.autoAdvanceDelay === 3000) {
mode = 'enhanced';
}
else {
mode = 'custom';
}
autoAdvanceMode.value = mode;
if (customDelayRow) {
customDelayRow.style.display = mode === 'custom' ? 'flex' : 'none';
}
if (autoAdvanceDelaySlider && delayValue) {
const seconds = Math.round(settings.quiz.autoAdvanceDelay / 1000);
autoAdvanceDelaySlider.value = seconds.toString();
delayValue.textContent = `${seconds} second${seconds !== 1 ? 's' : ''}`;
}
}
const defaultViewMode = document.querySelector('#default-view-mode');
if (defaultViewMode)
defaultViewMode.value = settings.ui.defaultViewMode;
}
render() {
this.updateUI();
}
}
//# sourceMappingURL=SettingsMenu.js.map