@thanh01.pmt/interactive-quiz-kit 1.0.71 → 1.0.73

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/ai.cjs CHANGED
@@ -2496,12 +2496,10 @@ function validateConsecutiveTypes(quizPlan) {
2496
2496
 
2497
2497
  // src/services/TopicDataService.ts
2498
2498
  var TopicDataService = class {
2499
- // ... saveData, mergeData, getData, clearData methods remain the same ...
2500
2499
  static saveData(data) {
2501
2500
  try {
2502
2501
  if (typeof window === "undefined") return;
2503
- const serializedData = JSON.stringify(data);
2504
- localStorage.setItem(this.STORAGE_KEY, serializedData);
2502
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
2505
2503
  } catch (error) {
2506
2504
  console.error("Error saving learning objectives to Local Storage:", error);
2507
2505
  }
@@ -2512,8 +2510,7 @@ var TopicDataService = class {
2512
2510
  newData.forEach((newLo) => {
2513
2511
  loMap.set(newLo.code, newLo);
2514
2512
  });
2515
- const mergedData = Array.from(loMap.values());
2516
- this.saveData(mergedData);
2513
+ this.saveData(Array.from(loMap.values()));
2517
2514
  }
2518
2515
  static getData() {
2519
2516
  try {
@@ -2528,7 +2525,7 @@ var TopicDataService = class {
2528
2525
  }
2529
2526
  static clearData() {
2530
2527
  try {
2531
- if (typeof window === "undefined") return;
2528
+ if (typeof window !== "undefined") return;
2532
2529
  localStorage.removeItem(this.STORAGE_KEY);
2533
2530
  } catch (error) {
2534
2531
  console.error("Error clearing learning objectives from Local Storage:", error);
@@ -2542,6 +2539,12 @@ var TopicDataService = class {
2542
2539
  const headerLine = lines.shift();
2543
2540
  const headers = headerLine.split(" ").map((h) => h.trim());
2544
2541
  const headerMap = headers.map((h) => this.HEADER_MAP[h] || null);
2542
+ const requiredHeaders = ["LO ID", "LO Name", "Subject", "Subject Code", "Category", "Category Code", "Topic", "Topic Code", "Grade", "Grade Code"];
2543
+ const missingHeaders = requiredHeaders.filter((h) => !headers.includes(h));
2544
+ if (missingHeaders.length > 0) {
2545
+ const errorMsg = `Invalid TSV header. Missing required columns: ${missingHeaders.join(", ")}`;
2546
+ return { data: [], errors: [errorMsg] };
2547
+ }
2545
2548
  const data = [];
2546
2549
  const errors = [];
2547
2550
  lines.forEach((line, index) => {
@@ -2550,29 +2553,30 @@ var TopicDataService = class {
2550
2553
  headerMap.forEach((propName, i) => {
2551
2554
  if (propName) {
2552
2555
  const value = values[i]?.trim() || "";
2553
- if (propName === "keywords" || propName === "stemElements" || propName === "bloomLevelsGuideline") {
2556
+ if (["keywords", "stemElements", "bloomLevelsGuideline"].includes(propName)) {
2554
2557
  rowObject[propName] = value.split(",").map((s) => s.trim()).filter(Boolean);
2555
2558
  } else {
2556
2559
  rowObject[propName] = value;
2557
2560
  }
2558
2561
  }
2559
2562
  });
2560
- if (!rowObject.code) {
2561
- errors.push(`Line ${index + 2}: Missing required value for 'LO ID'.`);
2563
+ if (!rowObject.code || !rowObject.name) {
2564
+ errors.push(`Line ${index + 2}: Missing required values for 'LO ID' or 'LO Name'.`);
2562
2565
  return;
2563
2566
  }
2564
- if (!rowObject.name) {
2565
- rowObject.name = rowObject.code;
2566
- }
2567
2567
  const learningObjective = {
2568
2568
  id: generateUniqueId("lo_"),
2569
2569
  code: rowObject.code,
2570
2570
  name: rowObject.name,
2571
2571
  description: rowObject.description,
2572
2572
  subject: rowObject.subject || "",
2573
+ subjectCode: rowObject.subjectCode,
2573
2574
  category: rowObject.category || "",
2575
+ categoryCode: rowObject.categoryCode,
2574
2576
  topic: rowObject.topic || "",
2577
+ topicCode: rowObject.topicCode,
2575
2578
  grade: rowObject.grade || "",
2579
+ gradeCode: rowObject.gradeCode,
2576
2580
  keywords: rowObject.keywords || [],
2577
2581
  stemElements: rowObject.stemElements || [],
2578
2582
  bloomLevelsGuideline: rowObject.bloomLevelsGuideline || []
@@ -2603,17 +2607,23 @@ var TopicDataService = class {
2603
2607
  }
2604
2608
  };
2605
2609
  TopicDataService.STORAGE_KEY = "interactive_quiz_kit_learning_objectives";
2606
- // Define a map for flexible header mapping
2607
2610
  TopicDataService.HEADER_MAP = {
2608
2611
  "LO ID": "code",
2609
2612
  "LO Name": "name",
2610
- // Ready for future addition
2611
2613
  "LO Description": "description",
2612
2614
  "Subject": "subject",
2615
+ "Subject Code": "subjectCode",
2616
+ // New
2613
2617
  "Category": "category",
2618
+ "Category Code": "categoryCode",
2619
+ // New
2614
2620
  "Topic": "topic",
2621
+ "Topic Code": "topicCode",
2622
+ // New
2615
2623
  "Keywords": "keywords",
2616
2624
  "Grade": "grade",
2625
+ "Grade Code": "gradeCode",
2626
+ // New
2617
2627
  "STEM Element(s)": "stemElements",
2618
2628
  "Bloom\u2019s Level(s) Guideline": "bloomLevelsGuideline"
2619
2629
  };
package/dist/ai.mjs CHANGED
@@ -2494,12 +2494,10 @@ function validateConsecutiveTypes(quizPlan) {
2494
2494
 
2495
2495
  // src/services/TopicDataService.ts
2496
2496
  var TopicDataService = class {
2497
- // ... saveData, mergeData, getData, clearData methods remain the same ...
2498
2497
  static saveData(data) {
2499
2498
  try {
2500
2499
  if (typeof window === "undefined") return;
2501
- const serializedData = JSON.stringify(data);
2502
- localStorage.setItem(this.STORAGE_KEY, serializedData);
2500
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
2503
2501
  } catch (error) {
2504
2502
  console.error("Error saving learning objectives to Local Storage:", error);
2505
2503
  }
@@ -2510,8 +2508,7 @@ var TopicDataService = class {
2510
2508
  newData.forEach((newLo) => {
2511
2509
  loMap.set(newLo.code, newLo);
2512
2510
  });
2513
- const mergedData = Array.from(loMap.values());
2514
- this.saveData(mergedData);
2511
+ this.saveData(Array.from(loMap.values()));
2515
2512
  }
2516
2513
  static getData() {
2517
2514
  try {
@@ -2526,7 +2523,7 @@ var TopicDataService = class {
2526
2523
  }
2527
2524
  static clearData() {
2528
2525
  try {
2529
- if (typeof window === "undefined") return;
2526
+ if (typeof window !== "undefined") return;
2530
2527
  localStorage.removeItem(this.STORAGE_KEY);
2531
2528
  } catch (error) {
2532
2529
  console.error("Error clearing learning objectives from Local Storage:", error);
@@ -2540,6 +2537,12 @@ var TopicDataService = class {
2540
2537
  const headerLine = lines.shift();
2541
2538
  const headers = headerLine.split(" ").map((h) => h.trim());
2542
2539
  const headerMap = headers.map((h) => this.HEADER_MAP[h] || null);
2540
+ const requiredHeaders = ["LO ID", "LO Name", "Subject", "Subject Code", "Category", "Category Code", "Topic", "Topic Code", "Grade", "Grade Code"];
2541
+ const missingHeaders = requiredHeaders.filter((h) => !headers.includes(h));
2542
+ if (missingHeaders.length > 0) {
2543
+ const errorMsg = `Invalid TSV header. Missing required columns: ${missingHeaders.join(", ")}`;
2544
+ return { data: [], errors: [errorMsg] };
2545
+ }
2543
2546
  const data = [];
2544
2547
  const errors = [];
2545
2548
  lines.forEach((line, index) => {
@@ -2548,29 +2551,30 @@ var TopicDataService = class {
2548
2551
  headerMap.forEach((propName, i) => {
2549
2552
  if (propName) {
2550
2553
  const value = values[i]?.trim() || "";
2551
- if (propName === "keywords" || propName === "stemElements" || propName === "bloomLevelsGuideline") {
2554
+ if (["keywords", "stemElements", "bloomLevelsGuideline"].includes(propName)) {
2552
2555
  rowObject[propName] = value.split(",").map((s) => s.trim()).filter(Boolean);
2553
2556
  } else {
2554
2557
  rowObject[propName] = value;
2555
2558
  }
2556
2559
  }
2557
2560
  });
2558
- if (!rowObject.code) {
2559
- errors.push(`Line ${index + 2}: Missing required value for 'LO ID'.`);
2561
+ if (!rowObject.code || !rowObject.name) {
2562
+ errors.push(`Line ${index + 2}: Missing required values for 'LO ID' or 'LO Name'.`);
2560
2563
  return;
2561
2564
  }
2562
- if (!rowObject.name) {
2563
- rowObject.name = rowObject.code;
2564
- }
2565
2565
  const learningObjective = {
2566
2566
  id: generateUniqueId("lo_"),
2567
2567
  code: rowObject.code,
2568
2568
  name: rowObject.name,
2569
2569
  description: rowObject.description,
2570
2570
  subject: rowObject.subject || "",
2571
+ subjectCode: rowObject.subjectCode,
2571
2572
  category: rowObject.category || "",
2573
+ categoryCode: rowObject.categoryCode,
2572
2574
  topic: rowObject.topic || "",
2575
+ topicCode: rowObject.topicCode,
2573
2576
  grade: rowObject.grade || "",
2577
+ gradeCode: rowObject.gradeCode,
2574
2578
  keywords: rowObject.keywords || [],
2575
2579
  stemElements: rowObject.stemElements || [],
2576
2580
  bloomLevelsGuideline: rowObject.bloomLevelsGuideline || []
@@ -2601,17 +2605,23 @@ var TopicDataService = class {
2601
2605
  }
2602
2606
  };
2603
2607
  TopicDataService.STORAGE_KEY = "interactive_quiz_kit_learning_objectives";
2604
- // Define a map for flexible header mapping
2605
2608
  TopicDataService.HEADER_MAP = {
2606
2609
  "LO ID": "code",
2607
2610
  "LO Name": "name",
2608
- // Ready for future addition
2609
2611
  "LO Description": "description",
2610
2612
  "Subject": "subject",
2613
+ "Subject Code": "subjectCode",
2614
+ // New
2611
2615
  "Category": "category",
2616
+ "Category Code": "categoryCode",
2617
+ // New
2612
2618
  "Topic": "topic",
2619
+ "Topic Code": "topicCode",
2620
+ // New
2613
2621
  "Keywords": "keywords",
2614
2622
  "Grade": "grade",
2623
+ "Grade Code": "gradeCode",
2624
+ // New
2615
2625
  "STEM Element(s)": "stemElements",
2616
2626
  "Bloom\u2019s Level(s) Guideline": "bloomLevelsGuideline"
2617
2627
  };