@thanh01.pmt/interactive-quiz-kit 1.0.23 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -2628,6 +2628,260 @@ var KnowledgeCardService = class {
2628
2628
  }
2629
2629
  };
2630
2630
 
2631
+ // src/services/metadataService.ts
2632
+ var LocalStorageManager = class {
2633
+ constructor(key) {
2634
+ this.key = `iqk_metadata_${key}`;
2635
+ }
2636
+ getAll() {
2637
+ if (typeof window === "undefined") return [];
2638
+ try {
2639
+ const stored = localStorage.getItem(this.key);
2640
+ return stored ? JSON.parse(stored) : [];
2641
+ } catch (e) {
2642
+ console.error(`Error reading from localStorage key ${this.key}:`, e);
2643
+ return [];
2644
+ }
2645
+ }
2646
+ saveAll(items) {
2647
+ if (typeof window === "undefined") return;
2648
+ try {
2649
+ localStorage.setItem(this.key, JSON.stringify(items));
2650
+ } catch (e) {
2651
+ console.error(`Error writing to localStorage key ${this.key}:`, e);
2652
+ }
2653
+ }
2654
+ add(item) {
2655
+ const items = this.getAll();
2656
+ if (items.some((i) => i.code === item.code)) {
2657
+ throw new Error(`An item with code "${item.code}" already exists for ${this.key}.`);
2658
+ }
2659
+ const newItem = __spreadProps(__spreadValues({}, item), { id: generateUniqueId(`${this.key}_`) });
2660
+ this.saveAll([...items, newItem]);
2661
+ return newItem;
2662
+ }
2663
+ // ===== FIX IS HERE =====
2664
+ // Changed the type of 'updates' to allow 'code' to be part of the update object.
2665
+ update(id, updates) {
2666
+ const items = this.getAll();
2667
+ const index = items.findIndex((i) => i.id === id);
2668
+ if (index === -1) {
2669
+ console.warn(`Item with id "${id}" not found in ${this.key} for update.`);
2670
+ return null;
2671
+ }
2672
+ const updatedItem = __spreadValues(__spreadValues({}, items[index]), updates);
2673
+ items[index] = updatedItem;
2674
+ this.saveAll(items);
2675
+ return updatedItem;
2676
+ }
2677
+ // =======================
2678
+ delete(code) {
2679
+ const items = this.getAll();
2680
+ const newItems = items.filter((i) => i.code !== code);
2681
+ if (items.length === newItems.length) {
2682
+ return false;
2683
+ }
2684
+ this.saveAll(newItems);
2685
+ return true;
2686
+ }
2687
+ };
2688
+ var subjectManager = new LocalStorageManager("subjects");
2689
+ var gradeLevelManager = new LocalStorageManager("grade_levels");
2690
+ var topicManager = new LocalStorageManager("topics");
2691
+ var categoryManager = new LocalStorageManager("categories");
2692
+ var bloomLevelManager = new LocalStorageManager("bloom_levels");
2693
+ var questionTypeManager = new LocalStorageManager("question_types");
2694
+ var learningObjectiveManager = new LocalStorageManager("learning_objectives");
2695
+ var contextManager = new LocalStorageManager("contexts");
2696
+ var approachManager = new LocalStorageManager("approaches");
2697
+ function mapRawDifficultyToStandard(rawDifficulty) {
2698
+ switch (rawDifficulty) {
2699
+ case "E":
2700
+ case "E~M":
2701
+ return "easy";
2702
+ case "M":
2703
+ case "M~H":
2704
+ return "medium";
2705
+ case "H":
2706
+ return "hard";
2707
+ default:
2708
+ return "medium";
2709
+ }
2710
+ }
2711
+ var _MetadataService = class _MetadataService {
2712
+ };
2713
+ // --- Subject Services ---
2714
+ _MetadataService.getSubjects = () => subjectManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2715
+ _MetadataService.addSubject = (name, code) => {
2716
+ return subjectManager.add({ code, name, createdAt: (/* @__PURE__ */ new Date()).toISOString(), updatedAt: (/* @__PURE__ */ new Date()).toISOString() });
2717
+ };
2718
+ _MetadataService.updateSubject = (id, name, code) => {
2719
+ return subjectManager.update(id, { name, code, updatedAt: (/* @__PURE__ */ new Date()).toISOString() });
2720
+ };
2721
+ _MetadataService.deleteSubject = (code) => {
2722
+ const topics = _MetadataService.getTopics(code);
2723
+ if (topics.length > 0) {
2724
+ throw new Error("Cannot delete subject: It is referenced by topics.");
2725
+ }
2726
+ return subjectManager.delete(code);
2727
+ };
2728
+ // --- GradeLevel Services ---
2729
+ _MetadataService.getGradeLevels = () => gradeLevelManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2730
+ _MetadataService.addGradeLevel = (name, code) => gradeLevelManager.add({ name, code });
2731
+ _MetadataService.updateGradeLevel = (id, name, code) => gradeLevelManager.update(id, { name, code });
2732
+ _MetadataService.deleteGradeLevel = (code) => gradeLevelManager.delete(code);
2733
+ // --- Topic Services ---
2734
+ _MetadataService.getTopics = (subjectCode) => {
2735
+ const allTopics = topicManager.getAll();
2736
+ const filtered = subjectCode ? allTopics.filter((t) => t.subjectCode === subjectCode) : allTopics;
2737
+ return filtered.sort((a, b) => a.name.localeCompare(b.name));
2738
+ };
2739
+ _MetadataService.addTopic = (name, code, subjectCode) => topicManager.add({ name, code, subjectCode });
2740
+ _MetadataService.updateTopic = (id, name, code, subjectCode) => topicManager.update(id, { name, code, subjectCode });
2741
+ _MetadataService.deleteTopic = (code) => topicManager.delete(code);
2742
+ // --- BloomLevel Services ---
2743
+ _MetadataService.getBloomLevels = () => bloomLevelManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2744
+ _MetadataService.addBloomLevel = (name, code, description) => bloomLevelManager.add({ name, code, description });
2745
+ _MetadataService.updateBloomLevel = (id, name, code, description) => bloomLevelManager.update(id, { name, code, description });
2746
+ _MetadataService.deleteBloomLevel = (code) => bloomLevelManager.delete(code);
2747
+ // --- QuestionType Services ---
2748
+ _MetadataService.getQuestionTypes = () => questionTypeManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2749
+ _MetadataService.addQuestionType = (name, code, description) => questionTypeManager.add({ name, code, description });
2750
+ _MetadataService.updateQuestionType = (id, name, code, description) => questionTypeManager.update(id, { name, code, description });
2751
+ _MetadataService.deleteQuestionType = (code) => questionTypeManager.delete(code);
2752
+ // --- Category Services ---
2753
+ _MetadataService.getCategories = () => categoryManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2754
+ _MetadataService.addCategory = (name, code, description) => categoryManager.add({ name, code, description });
2755
+ _MetadataService.updateCategory = (id, name, code, description) => categoryManager.update(id, { name, code, description });
2756
+ _MetadataService.deleteCategory = (code) => categoryManager.delete(code);
2757
+ // --- Context Services ---
2758
+ _MetadataService.getContexts = () => contextManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2759
+ _MetadataService.addContext = (name, code, description) => contextManager.add({ name, code, description });
2760
+ _MetadataService.updateContext = (id, name, code, description) => contextManager.update(id, { name, code, description });
2761
+ _MetadataService.deleteContext = (code) => contextManager.delete(code);
2762
+ // --- Approach Services ---
2763
+ _MetadataService.getApproaches = () => approachManager.getAll().sort((a, b) => a.code.localeCompare(b.code));
2764
+ _MetadataService.addApproach = (approachData) => {
2765
+ const difficulty = mapRawDifficultyToStandard(approachData.rawDifficulty);
2766
+ return approachManager.add(__spreadProps(__spreadValues({}, approachData), { difficulty }));
2767
+ };
2768
+ _MetadataService.updateApproach = (id, approachData) => {
2769
+ const updates = __spreadValues({}, approachData);
2770
+ if (approachData.rawDifficulty) {
2771
+ updates.difficulty = mapRawDifficultyToStandard(approachData.rawDifficulty);
2772
+ }
2773
+ return approachManager.update(id, updates);
2774
+ };
2775
+ _MetadataService.deleteApproach = (code) => approachManager.delete(code);
2776
+ // --- LearningObjective Services ---
2777
+ _MetadataService.getLearningObjectives = (subjectCode) => {
2778
+ const allLOs = learningObjectiveManager.getAll();
2779
+ const filtered = subjectCode ? allLOs.filter((lo) => lo.subjectCode === subjectCode) : allLOs;
2780
+ return filtered.sort((a, b) => a.name.localeCompare(b.name));
2781
+ };
2782
+ _MetadataService.addLearningObjective = (name, code, subjectCode, description) => learningObjectiveManager.add({ name, code, subjectCode, description });
2783
+ _MetadataService.updateLearningObjective = (id, name, code, subjectCode, description) => learningObjectiveManager.update(id, { name, code, subjectCode, description });
2784
+ _MetadataService.deleteLearningObjective = (code) => learningObjectiveManager.delete(code);
2785
+ var MetadataService = _MetadataService;
2786
+
2787
+ // src/services/questionBankService.ts
2788
+ var LocalStorageManager2 = class {
2789
+ constructor(key) {
2790
+ this.key = key;
2791
+ }
2792
+ getAll() {
2793
+ if (typeof window === "undefined") return [];
2794
+ try {
2795
+ const stored = localStorage.getItem(this.key);
2796
+ return stored ? JSON.parse(stored) : [];
2797
+ } catch (e) {
2798
+ console.error(`Error reading from localStorage key ${this.key}:`, e);
2799
+ return [];
2800
+ }
2801
+ }
2802
+ saveAll(items) {
2803
+ if (typeof window === "undefined") return;
2804
+ try {
2805
+ localStorage.setItem(this.key, JSON.stringify(items));
2806
+ } catch (e) {
2807
+ console.error(`Error writing to localStorage key ${this.key}:`, e);
2808
+ }
2809
+ }
2810
+ };
2811
+ var questionBankManager = new LocalStorageManager2("iqk_question_bank");
2812
+ var QuestionBankService = class {
2813
+ static getQuestions(filters) {
2814
+ let questions = questionBankManager.getAll();
2815
+ if (filters) {
2816
+ if (filters.subjectCode) {
2817
+ questions = questions.filter((q) => q.subjectCode === filters.subjectCode);
2818
+ }
2819
+ if (filters.topicCode) {
2820
+ questions = questions.filter((q) => q.topicCode === filters.topicCode);
2821
+ }
2822
+ if (filters.gradeLevelCode) {
2823
+ questions = questions.filter((q) => q.gradeLevelCode === filters.gradeLevelCode);
2824
+ }
2825
+ if (filters.bloomLevelCode) {
2826
+ questions = questions.filter((q) => q.bloomLevelCode === filters.bloomLevelCode);
2827
+ }
2828
+ if (filters.questionTypeCode) {
2829
+ questions = questions.filter((q) => q.questionTypeCode === filters.questionTypeCode);
2830
+ }
2831
+ if (filters.difficulty) {
2832
+ questions = questions.filter((q) => q.difficulty === filters.difficulty);
2833
+ }
2834
+ if (filters.searchTerm) {
2835
+ const lowercasedTerm = filters.searchTerm.toLowerCase();
2836
+ questions = questions.filter(
2837
+ (q) => q.text.toLowerCase().includes(lowercasedTerm) || q.code.toLowerCase().includes(lowercasedTerm)
2838
+ );
2839
+ }
2840
+ }
2841
+ return questions.sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime());
2842
+ }
2843
+ static getQuestionByCode(code) {
2844
+ return questionBankManager.getAll().find((q) => q.code === code);
2845
+ }
2846
+ // CHANGE 2: Simplified function signature. It now takes the full object to be added.
2847
+ static addQuestion(questionData) {
2848
+ const allQuestions = questionBankManager.getAll();
2849
+ if (allQuestions.some((q) => q.code === questionData.code)) {
2850
+ throw new Error(`A question with code "${questionData.code}" already exists.`);
2851
+ }
2852
+ const newQuestion = __spreadProps(__spreadValues({}, questionData), {
2853
+ id: generateUniqueId("qb_"),
2854
+ lastModified: (/* @__PURE__ */ new Date()).toISOString()
2855
+ });
2856
+ questionBankManager.saveAll([...allQuestions, newQuestion]);
2857
+ return newQuestion;
2858
+ }
2859
+ // CHANGE 2: Simplified function signature.
2860
+ static updateQuestion(id, updates) {
2861
+ const allQuestions = questionBankManager.getAll();
2862
+ const index = allQuestions.findIndex((q) => q.id === id);
2863
+ if (index === -1) {
2864
+ console.warn(`Question with id "${id}" not found for update.`);
2865
+ return null;
2866
+ }
2867
+ const updatedQuestion = __spreadProps(__spreadValues(__spreadValues({}, allQuestions[index]), updates), {
2868
+ lastModified: (/* @__PURE__ */ new Date()).toISOString()
2869
+ });
2870
+ allQuestions[index] = updatedQuestion;
2871
+ questionBankManager.saveAll(allQuestions);
2872
+ return updatedQuestion;
2873
+ }
2874
+ static deleteQuestionByCode(code) {
2875
+ const allQuestions = questionBankManager.getAll();
2876
+ const newQuestions = allQuestions.filter((q) => q.code !== code);
2877
+ if (allQuestions.length === newQuestions.length) {
2878
+ return false;
2879
+ }
2880
+ questionBankManager.saveAll(newQuestions);
2881
+ return true;
2882
+ }
2883
+ };
2884
+
2631
2885
  // src/services/HTMLLauncherGenerator.ts
2632
2886
  var escapeAttribute = (unsafe) => {
2633
2887
  if (typeof unsafe !== "string") return "";
@@ -3253,7 +3507,9 @@ exports.APIKeyService = APIKeyService;
3253
3507
  exports.AchievementService = AchievementService;
3254
3508
  exports.GEMINI_API_KEY_SERVICE_NAME = GEMINI_API_KEY_SERVICE_NAME;
3255
3509
  exports.KnowledgeCardService = KnowledgeCardService;
3510
+ exports.MetadataService = MetadataService;
3256
3511
  exports.PracticeHistoryService = PracticeHistoryService;
3512
+ exports.QuestionBankService = QuestionBankService;
3257
3513
  exports.QuestionImportService = QuestionImportService;
3258
3514
  exports.QuizEditorService = QuizEditorService;
3259
3515
  exports.QuizEngine = QuizEngine;
package/dist/index.js CHANGED
@@ -2622,6 +2622,260 @@ var KnowledgeCardService = class {
2622
2622
  }
2623
2623
  };
2624
2624
 
2625
+ // src/services/metadataService.ts
2626
+ var LocalStorageManager = class {
2627
+ constructor(key) {
2628
+ this.key = `iqk_metadata_${key}`;
2629
+ }
2630
+ getAll() {
2631
+ if (typeof window === "undefined") return [];
2632
+ try {
2633
+ const stored = localStorage.getItem(this.key);
2634
+ return stored ? JSON.parse(stored) : [];
2635
+ } catch (e) {
2636
+ console.error(`Error reading from localStorage key ${this.key}:`, e);
2637
+ return [];
2638
+ }
2639
+ }
2640
+ saveAll(items) {
2641
+ if (typeof window === "undefined") return;
2642
+ try {
2643
+ localStorage.setItem(this.key, JSON.stringify(items));
2644
+ } catch (e) {
2645
+ console.error(`Error writing to localStorage key ${this.key}:`, e);
2646
+ }
2647
+ }
2648
+ add(item) {
2649
+ const items = this.getAll();
2650
+ if (items.some((i) => i.code === item.code)) {
2651
+ throw new Error(`An item with code "${item.code}" already exists for ${this.key}.`);
2652
+ }
2653
+ const newItem = __spreadProps(__spreadValues({}, item), { id: generateUniqueId(`${this.key}_`) });
2654
+ this.saveAll([...items, newItem]);
2655
+ return newItem;
2656
+ }
2657
+ // ===== FIX IS HERE =====
2658
+ // Changed the type of 'updates' to allow 'code' to be part of the update object.
2659
+ update(id, updates) {
2660
+ const items = this.getAll();
2661
+ const index = items.findIndex((i) => i.id === id);
2662
+ if (index === -1) {
2663
+ console.warn(`Item with id "${id}" not found in ${this.key} for update.`);
2664
+ return null;
2665
+ }
2666
+ const updatedItem = __spreadValues(__spreadValues({}, items[index]), updates);
2667
+ items[index] = updatedItem;
2668
+ this.saveAll(items);
2669
+ return updatedItem;
2670
+ }
2671
+ // =======================
2672
+ delete(code) {
2673
+ const items = this.getAll();
2674
+ const newItems = items.filter((i) => i.code !== code);
2675
+ if (items.length === newItems.length) {
2676
+ return false;
2677
+ }
2678
+ this.saveAll(newItems);
2679
+ return true;
2680
+ }
2681
+ };
2682
+ var subjectManager = new LocalStorageManager("subjects");
2683
+ var gradeLevelManager = new LocalStorageManager("grade_levels");
2684
+ var topicManager = new LocalStorageManager("topics");
2685
+ var categoryManager = new LocalStorageManager("categories");
2686
+ var bloomLevelManager = new LocalStorageManager("bloom_levels");
2687
+ var questionTypeManager = new LocalStorageManager("question_types");
2688
+ var learningObjectiveManager = new LocalStorageManager("learning_objectives");
2689
+ var contextManager = new LocalStorageManager("contexts");
2690
+ var approachManager = new LocalStorageManager("approaches");
2691
+ function mapRawDifficultyToStandard(rawDifficulty) {
2692
+ switch (rawDifficulty) {
2693
+ case "E":
2694
+ case "E~M":
2695
+ return "easy";
2696
+ case "M":
2697
+ case "M~H":
2698
+ return "medium";
2699
+ case "H":
2700
+ return "hard";
2701
+ default:
2702
+ return "medium";
2703
+ }
2704
+ }
2705
+ var _MetadataService = class _MetadataService {
2706
+ };
2707
+ // --- Subject Services ---
2708
+ _MetadataService.getSubjects = () => subjectManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2709
+ _MetadataService.addSubject = (name, code) => {
2710
+ return subjectManager.add({ code, name, createdAt: (/* @__PURE__ */ new Date()).toISOString(), updatedAt: (/* @__PURE__ */ new Date()).toISOString() });
2711
+ };
2712
+ _MetadataService.updateSubject = (id, name, code) => {
2713
+ return subjectManager.update(id, { name, code, updatedAt: (/* @__PURE__ */ new Date()).toISOString() });
2714
+ };
2715
+ _MetadataService.deleteSubject = (code) => {
2716
+ const topics = _MetadataService.getTopics(code);
2717
+ if (topics.length > 0) {
2718
+ throw new Error("Cannot delete subject: It is referenced by topics.");
2719
+ }
2720
+ return subjectManager.delete(code);
2721
+ };
2722
+ // --- GradeLevel Services ---
2723
+ _MetadataService.getGradeLevels = () => gradeLevelManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2724
+ _MetadataService.addGradeLevel = (name, code) => gradeLevelManager.add({ name, code });
2725
+ _MetadataService.updateGradeLevel = (id, name, code) => gradeLevelManager.update(id, { name, code });
2726
+ _MetadataService.deleteGradeLevel = (code) => gradeLevelManager.delete(code);
2727
+ // --- Topic Services ---
2728
+ _MetadataService.getTopics = (subjectCode) => {
2729
+ const allTopics = topicManager.getAll();
2730
+ const filtered = subjectCode ? allTopics.filter((t) => t.subjectCode === subjectCode) : allTopics;
2731
+ return filtered.sort((a, b) => a.name.localeCompare(b.name));
2732
+ };
2733
+ _MetadataService.addTopic = (name, code, subjectCode) => topicManager.add({ name, code, subjectCode });
2734
+ _MetadataService.updateTopic = (id, name, code, subjectCode) => topicManager.update(id, { name, code, subjectCode });
2735
+ _MetadataService.deleteTopic = (code) => topicManager.delete(code);
2736
+ // --- BloomLevel Services ---
2737
+ _MetadataService.getBloomLevels = () => bloomLevelManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2738
+ _MetadataService.addBloomLevel = (name, code, description) => bloomLevelManager.add({ name, code, description });
2739
+ _MetadataService.updateBloomLevel = (id, name, code, description) => bloomLevelManager.update(id, { name, code, description });
2740
+ _MetadataService.deleteBloomLevel = (code) => bloomLevelManager.delete(code);
2741
+ // --- QuestionType Services ---
2742
+ _MetadataService.getQuestionTypes = () => questionTypeManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2743
+ _MetadataService.addQuestionType = (name, code, description) => questionTypeManager.add({ name, code, description });
2744
+ _MetadataService.updateQuestionType = (id, name, code, description) => questionTypeManager.update(id, { name, code, description });
2745
+ _MetadataService.deleteQuestionType = (code) => questionTypeManager.delete(code);
2746
+ // --- Category Services ---
2747
+ _MetadataService.getCategories = () => categoryManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2748
+ _MetadataService.addCategory = (name, code, description) => categoryManager.add({ name, code, description });
2749
+ _MetadataService.updateCategory = (id, name, code, description) => categoryManager.update(id, { name, code, description });
2750
+ _MetadataService.deleteCategory = (code) => categoryManager.delete(code);
2751
+ // --- Context Services ---
2752
+ _MetadataService.getContexts = () => contextManager.getAll().sort((a, b) => a.name.localeCompare(b.name));
2753
+ _MetadataService.addContext = (name, code, description) => contextManager.add({ name, code, description });
2754
+ _MetadataService.updateContext = (id, name, code, description) => contextManager.update(id, { name, code, description });
2755
+ _MetadataService.deleteContext = (code) => contextManager.delete(code);
2756
+ // --- Approach Services ---
2757
+ _MetadataService.getApproaches = () => approachManager.getAll().sort((a, b) => a.code.localeCompare(b.code));
2758
+ _MetadataService.addApproach = (approachData) => {
2759
+ const difficulty = mapRawDifficultyToStandard(approachData.rawDifficulty);
2760
+ return approachManager.add(__spreadProps(__spreadValues({}, approachData), { difficulty }));
2761
+ };
2762
+ _MetadataService.updateApproach = (id, approachData) => {
2763
+ const updates = __spreadValues({}, approachData);
2764
+ if (approachData.rawDifficulty) {
2765
+ updates.difficulty = mapRawDifficultyToStandard(approachData.rawDifficulty);
2766
+ }
2767
+ return approachManager.update(id, updates);
2768
+ };
2769
+ _MetadataService.deleteApproach = (code) => approachManager.delete(code);
2770
+ // --- LearningObjective Services ---
2771
+ _MetadataService.getLearningObjectives = (subjectCode) => {
2772
+ const allLOs = learningObjectiveManager.getAll();
2773
+ const filtered = subjectCode ? allLOs.filter((lo) => lo.subjectCode === subjectCode) : allLOs;
2774
+ return filtered.sort((a, b) => a.name.localeCompare(b.name));
2775
+ };
2776
+ _MetadataService.addLearningObjective = (name, code, subjectCode, description) => learningObjectiveManager.add({ name, code, subjectCode, description });
2777
+ _MetadataService.updateLearningObjective = (id, name, code, subjectCode, description) => learningObjectiveManager.update(id, { name, code, subjectCode, description });
2778
+ _MetadataService.deleteLearningObjective = (code) => learningObjectiveManager.delete(code);
2779
+ var MetadataService = _MetadataService;
2780
+
2781
+ // src/services/questionBankService.ts
2782
+ var LocalStorageManager2 = class {
2783
+ constructor(key) {
2784
+ this.key = key;
2785
+ }
2786
+ getAll() {
2787
+ if (typeof window === "undefined") return [];
2788
+ try {
2789
+ const stored = localStorage.getItem(this.key);
2790
+ return stored ? JSON.parse(stored) : [];
2791
+ } catch (e) {
2792
+ console.error(`Error reading from localStorage key ${this.key}:`, e);
2793
+ return [];
2794
+ }
2795
+ }
2796
+ saveAll(items) {
2797
+ if (typeof window === "undefined") return;
2798
+ try {
2799
+ localStorage.setItem(this.key, JSON.stringify(items));
2800
+ } catch (e) {
2801
+ console.error(`Error writing to localStorage key ${this.key}:`, e);
2802
+ }
2803
+ }
2804
+ };
2805
+ var questionBankManager = new LocalStorageManager2("iqk_question_bank");
2806
+ var QuestionBankService = class {
2807
+ static getQuestions(filters) {
2808
+ let questions = questionBankManager.getAll();
2809
+ if (filters) {
2810
+ if (filters.subjectCode) {
2811
+ questions = questions.filter((q) => q.subjectCode === filters.subjectCode);
2812
+ }
2813
+ if (filters.topicCode) {
2814
+ questions = questions.filter((q) => q.topicCode === filters.topicCode);
2815
+ }
2816
+ if (filters.gradeLevelCode) {
2817
+ questions = questions.filter((q) => q.gradeLevelCode === filters.gradeLevelCode);
2818
+ }
2819
+ if (filters.bloomLevelCode) {
2820
+ questions = questions.filter((q) => q.bloomLevelCode === filters.bloomLevelCode);
2821
+ }
2822
+ if (filters.questionTypeCode) {
2823
+ questions = questions.filter((q) => q.questionTypeCode === filters.questionTypeCode);
2824
+ }
2825
+ if (filters.difficulty) {
2826
+ questions = questions.filter((q) => q.difficulty === filters.difficulty);
2827
+ }
2828
+ if (filters.searchTerm) {
2829
+ const lowercasedTerm = filters.searchTerm.toLowerCase();
2830
+ questions = questions.filter(
2831
+ (q) => q.text.toLowerCase().includes(lowercasedTerm) || q.code.toLowerCase().includes(lowercasedTerm)
2832
+ );
2833
+ }
2834
+ }
2835
+ return questions.sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime());
2836
+ }
2837
+ static getQuestionByCode(code) {
2838
+ return questionBankManager.getAll().find((q) => q.code === code);
2839
+ }
2840
+ // CHANGE 2: Simplified function signature. It now takes the full object to be added.
2841
+ static addQuestion(questionData) {
2842
+ const allQuestions = questionBankManager.getAll();
2843
+ if (allQuestions.some((q) => q.code === questionData.code)) {
2844
+ throw new Error(`A question with code "${questionData.code}" already exists.`);
2845
+ }
2846
+ const newQuestion = __spreadProps(__spreadValues({}, questionData), {
2847
+ id: generateUniqueId("qb_"),
2848
+ lastModified: (/* @__PURE__ */ new Date()).toISOString()
2849
+ });
2850
+ questionBankManager.saveAll([...allQuestions, newQuestion]);
2851
+ return newQuestion;
2852
+ }
2853
+ // CHANGE 2: Simplified function signature.
2854
+ static updateQuestion(id, updates) {
2855
+ const allQuestions = questionBankManager.getAll();
2856
+ const index = allQuestions.findIndex((q) => q.id === id);
2857
+ if (index === -1) {
2858
+ console.warn(`Question with id "${id}" not found for update.`);
2859
+ return null;
2860
+ }
2861
+ const updatedQuestion = __spreadProps(__spreadValues(__spreadValues({}, allQuestions[index]), updates), {
2862
+ lastModified: (/* @__PURE__ */ new Date()).toISOString()
2863
+ });
2864
+ allQuestions[index] = updatedQuestion;
2865
+ questionBankManager.saveAll(allQuestions);
2866
+ return updatedQuestion;
2867
+ }
2868
+ static deleteQuestionByCode(code) {
2869
+ const allQuestions = questionBankManager.getAll();
2870
+ const newQuestions = allQuestions.filter((q) => q.code !== code);
2871
+ if (allQuestions.length === newQuestions.length) {
2872
+ return false;
2873
+ }
2874
+ questionBankManager.saveAll(newQuestions);
2875
+ return true;
2876
+ }
2877
+ };
2878
+
2625
2879
  // src/services/HTMLLauncherGenerator.ts
2626
2880
  var escapeAttribute = (unsafe) => {
2627
2881
  if (typeof unsafe !== "string") return "";
@@ -3243,4 +3497,4 @@ function cn(...inputs) {
3243
3497
  return twMerge(clsx(inputs));
3244
3498
  }
3245
3499
 
3246
- export { APIKeyService, AchievementService, GEMINI_API_KEY_SERVICE_NAME, KnowledgeCardService, PracticeHistoryService, QuestionImportService, QuizEditorService, QuizEngine, QuoteService, SCORMService, UserConfigService, cn, emptyQuiz, exportQuizAsSCORMZip, generateLauncherHTML, generateSCORMManifest, generateUniqueId, sampleQuiz };
3500
+ export { APIKeyService, AchievementService, GEMINI_API_KEY_SERVICE_NAME, KnowledgeCardService, MetadataService, PracticeHistoryService, QuestionBankService, QuestionImportService, QuizEditorService, QuizEngine, QuoteService, SCORMService, UserConfigService, cn, emptyQuiz, exportQuizAsSCORMZip, generateLauncherHTML, generateSCORMManifest, generateUniqueId, sampleQuiz };