@thanh01.pmt/interactive-quiz-kit 1.0.82 → 1.0.84

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/react-ui.mjs CHANGED
@@ -138959,7 +138959,7 @@ function TopicManager({
138959
138959
  setCurrentItem(topic);
138960
138960
  setItemName(topic.name);
138961
138961
  setItemCode(topic.code);
138962
- setSelectedSubjectCode(topic.subjectCode);
138962
+ setSelectedSubjectCode(topic.subjectCode ?? "");
138963
138963
  setIsDialogOpen(true);
138964
138964
  };
138965
138965
  const handleDeleteItem = (topic) => {
@@ -139037,7 +139037,7 @@ function TopicManager({
139037
139037
  const getSubjectName = (subjectCode) => {
139038
139038
  return subjects.find((s4) => s4.code === subjectCode)?.name || "N/A";
139039
139039
  };
139040
- return /* @__PURE__ */ React169__default.createElement(Card, null, /* @__PURE__ */ React169__default.createElement(CardHeader, null, /* @__PURE__ */ React169__default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React169__default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React169__default.createElement(Tag, { className: "mr-2 h-5 w-5 text-primary" }), " Manage Topics"), /* @__PURE__ */ React169__default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React169__default.createElement(MetadataImportControls, { metadataName: "Topics", onImport: handleImport }), /* @__PURE__ */ React169__default.createElement(Button, { onClick: handleAddItem, size: "sm", disabled: subjects.length === 0 }, /* @__PURE__ */ React169__default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Topic"))), subjects.length === 0 && !isLoading && /* @__PURE__ */ React169__default.createElement("p", { className: "text-sm text-destructive" }, "Please add subjects before adding topics.")), /* @__PURE__ */ React169__default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React169__default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React169__default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : topics.length === 0 ? /* @__PURE__ */ React169__default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No topics found. Add one to get started!") : /* @__PURE__ */ React169__default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React169__default.createElement(Table3, null, /* @__PURE__ */ React169__default.createElement(TableHeader, null, /* @__PURE__ */ React169__default.createElement(TableRow, null, /* @__PURE__ */ React169__default.createElement(TableHead, null, "Code"), /* @__PURE__ */ React169__default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React169__default.createElement(TableHead, null, "Subject"), /* @__PURE__ */ React169__default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React169__default.createElement(TableBody, null, topics.map((topic) => /* @__PURE__ */ React169__default.createElement(TableRow, { key: topic.id }, /* @__PURE__ */ React169__default.createElement(TableCell, { className: "font-mono text-xs" }, topic.code), /* @__PURE__ */ React169__default.createElement(TableCell, { className: "font-Medium" }, topic.name), /* @__PURE__ */ React169__default.createElement(TableCell, null, getSubjectName(topic.subjectCode), " (", topic.subjectCode, ")"), /* @__PURE__ */ React169__default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React169__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleEditItem(topic), className: "mr-2" }, /* @__PURE__ */ React169__default.createElement(PenLine, { className: "h-4 w-4" })), /* @__PURE__ */ React169__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteItem(topic), className: "text-destructive hover:text-destructive" }, /* @__PURE__ */ React169__default.createElement(Trash2, { className: "h-4 w-4" })))))))), /* @__PURE__ */ React169__default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React169__default.createElement(DialogContent2, { className: "sm:max-w-md" }, /* @__PURE__ */ React169__default.createElement(DialogHeader, null, /* @__PURE__ */ React169__default.createElement(DialogTitle2, null, currentItem ? "Edit Topic" : "Add New Topic")), /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-2" }, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "itemCode" }, "Topic Code"), /* @__PURE__ */ React169__default.createElement(Input, { id: "itemCode", value: itemCode, onChange: (e3) => setItemCode(e3.target.value.toUpperCase()), placeholder: "e.g., ALG-BASICS", disabled: !!currentItem })), /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-2" }, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "itemName" }, "Topic Name"), /* @__PURE__ */ React169__default.createElement(Input, { id: "itemName", value: itemName, onChange: (e3) => setItemName(e3.target.value), placeholder: "e.g., Algebra Basics" })), /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-2" }, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject"), /* @__PURE__ */ React169__default.createElement(Select2, { value: selectedSubjectCode, onValueChange: setSelectedSubjectCode, disabled: subjects.length === 0 }, /* @__PURE__ */ React169__default.createElement(SelectTrigger2, { id: "subjectCode" }, /* @__PURE__ */ React169__default.createElement(SelectValue2, { placeholder: "Select a subject" })), /* @__PURE__ */ React169__default.createElement(SelectContent2, null, subjects.map((subject) => /* @__PURE__ */ React169__default.createElement(SelectItem2, { key: subject.code, value: subject.code }, subject.name, " (", subject.code, ")")))))), /* @__PURE__ */ React169__default.createElement(DialogFooter, null, /* @__PURE__ */ React169__default.createElement(Button, { type: "button", variant: "outline", onClick: () => setIsDialogOpen(false), disabled: isPending }, "Cancel"), /* @__PURE__ */ React169__default.createElement(Button, { type: "submit", onClick: handleSubmit, disabled: isPending || !itemName.trim() || !itemCode.trim() || !selectedSubjectCode }, isPending && /* @__PURE__ */ React169__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Save")))), /* @__PURE__ */ React169__default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React169__default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React169__default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React169__default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React169__default.createElement(AlertDialogDescription2, null, 'This will permanently delete topic "', itemToDelete?.name, '".')), /* @__PURE__ */ React169__default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React169__default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React169__default.createElement(AlertDialogAction2, { onClick: confirmDelete, disabled: isPending, className: "bg-destructive hover:bg-destructive/90" }, isPending && /* @__PURE__ */ React169__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Delete"))))));
139040
+ return /* @__PURE__ */ React169__default.createElement(Card, null, /* @__PURE__ */ React169__default.createElement(CardHeader, null, /* @__PURE__ */ React169__default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React169__default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React169__default.createElement(Tag, { className: "mr-2 h-5 w-5 text-primary" }), " Manage Topics"), /* @__PURE__ */ React169__default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React169__default.createElement(MetadataImportControls, { metadataName: "Topics", onImport: handleImport }), /* @__PURE__ */ React169__default.createElement(Button, { onClick: handleAddItem, size: "sm", disabled: subjects.length === 0 }, /* @__PURE__ */ React169__default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Topic"))), subjects.length === 0 && !isLoading && /* @__PURE__ */ React169__default.createElement("p", { className: "text-sm text-destructive" }, "Please add subjects before adding topics.")), /* @__PURE__ */ React169__default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React169__default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React169__default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : topics.length === 0 ? /* @__PURE__ */ React169__default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No topics found. Add one to get started!") : /* @__PURE__ */ React169__default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React169__default.createElement(Table3, null, /* @__PURE__ */ React169__default.createElement(TableHeader, null, /* @__PURE__ */ React169__default.createElement(TableRow, null, /* @__PURE__ */ React169__default.createElement(TableHead, null, "Code"), /* @__PURE__ */ React169__default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React169__default.createElement(TableHead, null, "Subject"), /* @__PURE__ */ React169__default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React169__default.createElement(TableBody, null, topics.map((topic) => /* @__PURE__ */ React169__default.createElement(TableRow, { key: topic.id }, /* @__PURE__ */ React169__default.createElement(TableCell, { className: "font-mono text-xs" }, topic.code), /* @__PURE__ */ React169__default.createElement(TableCell, { className: "font-Medium" }, topic.name), /* @__PURE__ */ React169__default.createElement(TableCell, null, getSubjectName(topic.subjectCode ?? ""), " (", topic.subjectCode, ")"), /* @__PURE__ */ React169__default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React169__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleEditItem(topic), className: "mr-2" }, /* @__PURE__ */ React169__default.createElement(PenLine, { className: "h-4 w-4" })), /* @__PURE__ */ React169__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteItem(topic), className: "text-destructive hover:text-destructive" }, /* @__PURE__ */ React169__default.createElement(Trash2, { className: "h-4 w-4" })))))))), /* @__PURE__ */ React169__default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React169__default.createElement(DialogContent2, { className: "sm:max-w-md" }, /* @__PURE__ */ React169__default.createElement(DialogHeader, null, /* @__PURE__ */ React169__default.createElement(DialogTitle2, null, currentItem ? "Edit Topic" : "Add New Topic")), /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-2" }, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "itemCode" }, "Topic Code"), /* @__PURE__ */ React169__default.createElement(Input, { id: "itemCode", value: itemCode, onChange: (e3) => setItemCode(e3.target.value.toUpperCase()), placeholder: "e.g., ALG-BASICS", disabled: !!currentItem })), /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-2" }, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "itemName" }, "Topic Name"), /* @__PURE__ */ React169__default.createElement(Input, { id: "itemName", value: itemName, onChange: (e3) => setItemName(e3.target.value), placeholder: "e.g., Algebra Basics" })), /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-2" }, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject"), /* @__PURE__ */ React169__default.createElement(Select2, { value: selectedSubjectCode, onValueChange: setSelectedSubjectCode, disabled: subjects.length === 0 }, /* @__PURE__ */ React169__default.createElement(SelectTrigger2, { id: "subjectCode" }, /* @__PURE__ */ React169__default.createElement(SelectValue2, { placeholder: "Select a subject" })), /* @__PURE__ */ React169__default.createElement(SelectContent2, null, subjects.map((subject) => /* @__PURE__ */ React169__default.createElement(SelectItem2, { key: subject.code, value: subject.code }, subject.name, " (", subject.code, ")")))))), /* @__PURE__ */ React169__default.createElement(DialogFooter, null, /* @__PURE__ */ React169__default.createElement(Button, { type: "button", variant: "outline", onClick: () => setIsDialogOpen(false), disabled: isPending }, "Cancel"), /* @__PURE__ */ React169__default.createElement(Button, { type: "submit", onClick: handleSubmit, disabled: isPending || !itemName.trim() || !itemCode.trim() || !selectedSubjectCode }, isPending && /* @__PURE__ */ React169__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Save")))), /* @__PURE__ */ React169__default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React169__default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React169__default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React169__default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React169__default.createElement(AlertDialogDescription2, null, 'This will permanently delete topic "', itemToDelete?.name, '".')), /* @__PURE__ */ React169__default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React169__default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React169__default.createElement(AlertDialogAction2, { onClick: confirmDelete, disabled: isPending, className: "bg-destructive hover:bg-destructive/90" }, isPending && /* @__PURE__ */ React169__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Delete"))))));
139041
139041
  }
139042
139042
 
139043
139043
  // src/react-ui/components/metadata/CategoryManager.tsx
@@ -139435,6 +139435,9 @@ init_react_shim();
139435
139435
  function LearningObjectiveManager({
139436
139436
  initialData,
139437
139437
  subjects: subjectsProp,
139438
+ categories: categoriesProp,
139439
+ topics: topicsProp,
139440
+ gradeLevels: gradeLevelsProp,
139438
139441
  isLoading: isLoadingProp,
139439
139442
  onAdd,
139440
139443
  onUpdate,
@@ -139443,6 +139446,9 @@ function LearningObjectiveManager({
139443
139446
  }) {
139444
139447
  const [items, setItems] = useState([]);
139445
139448
  const [subjects, setSubjects] = useState([]);
139449
+ const [categories, setCategories] = useState([]);
139450
+ const [topics, setTopics] = useState([]);
139451
+ const [gradeLevels, setGradeLevels] = useState([]);
139446
139452
  const [isLoading, setIsLoading] = useState(true);
139447
139453
  const [isDialogOpen, setIsDialogOpen] = useState(false);
139448
139454
  const [isAlertOpen, setIsAlertOpen] = useState(false);
@@ -139462,6 +139468,9 @@ function LearningObjectiveManager({
139462
139468
  try {
139463
139469
  setItems(MetadataService.getLearningObjectives());
139464
139470
  setSubjects(MetadataService.getSubjects());
139471
+ setCategories(MetadataService.getCategories());
139472
+ setTopics(MetadataService.getTopics());
139473
+ setGradeLevels(MetadataService.getGradeLevels());
139465
139474
  } catch (error) {
139466
139475
  toast2({
139467
139476
  title: "Error",
@@ -139477,13 +139486,34 @@ function LearningObjectiveManager({
139477
139486
  if (isControlled) {
139478
139487
  setItems(initialData || []);
139479
139488
  setSubjects(subjectsProp || []);
139489
+ setCategories(categoriesProp || []);
139490
+ setTopics(topicsProp || []);
139491
+ setGradeLevels(gradeLevelsProp || []);
139480
139492
  setIsLoading(isLoadingProp || false);
139481
139493
  } else {
139482
139494
  refreshData();
139483
139495
  }
139484
- }, [isControlled, initialData, subjectsProp, isLoadingProp]);
139496
+ }, [isControlled, initialData, subjectsProp, categoriesProp, topicsProp, gradeLevelsProp, isLoadingProp]);
139497
+ const filteredCategories = useMemo(() => {
139498
+ if (!formState.subjectCode) return [];
139499
+ return categories.filter((c4) => c4.subjectCode === formState.subjectCode);
139500
+ }, [formState.subjectCode, categories]);
139501
+ const filteredTopics = useMemo(() => {
139502
+ if (!formState.categoryCode) return [];
139503
+ return topics.filter((t4) => t4.categoryCode === formState.categoryCode);
139504
+ }, [formState.categoryCode, topics]);
139485
139505
  const handleFormChange = (field, value) => {
139486
- setFormState((prev) => ({ ...prev, [field]: value }));
139506
+ setFormState((prev) => {
139507
+ const newState = { ...prev, [field]: value };
139508
+ if (field === "subjectCode") {
139509
+ newState.categoryCode = "";
139510
+ newState.topicCode = "";
139511
+ }
139512
+ if (field === "categoryCode") {
139513
+ newState.topicCode = "";
139514
+ }
139515
+ return newState;
139516
+ });
139487
139517
  };
139488
139518
  const handleAddItem = () => {
139489
139519
  setCurrentItem(null);
@@ -139494,11 +139524,7 @@ function LearningObjectiveManager({
139494
139524
  };
139495
139525
  const handleEditItem = (item) => {
139496
139526
  setCurrentItem(item);
139497
- const subject = subjects.find((s4) => s4.code === item.subjectCode);
139498
- setFormState({
139499
- ...item,
139500
- subject: subject ? subject.name : item.subject || ""
139501
- });
139527
+ setFormState({ ...item });
139502
139528
  setIsDialogOpen(true);
139503
139529
  };
139504
139530
  const handleDeleteItem = (item) => {
@@ -139600,7 +139626,6 @@ function LearningObjectiveManager({
139600
139626
  acc.valid.push({
139601
139627
  code: rec["LO ID"],
139602
139628
  name: rec["LO Name"] || rec["LO Description"],
139603
- // Use description if name is missing
139604
139629
  description: rec["LO Description"],
139605
139630
  subject: rec["Subject"] || "",
139606
139631
  subjectCode: rec["Subject Code"] || rec["Subject"],
@@ -139668,141 +139693,43 @@ function LearningObjectiveManager({
139668
139693
  className: "text-destructive hover:text-destructive"
139669
139694
  },
139670
139695
  /* @__PURE__ */ React169__default.createElement(Trash2, { className: "h-4 w-4" })
139671
- ))))))))), /* @__PURE__ */ React169__default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React169__default.createElement(DialogContent2, { className: "sm:max-w-2xl" }, /* @__PURE__ */ React169__default.createElement(ScrollArea2, { className: "max-h-[85vh]" }, /* @__PURE__ */ React169__default.createElement("div", { className: "p-6" }, /* @__PURE__ */ React169__default.createElement(DialogHeader, null, /* @__PURE__ */ React169__default.createElement(DialogTitle2, null, currentItem ? "Edit Learning Objective" : "Add New Learning Objective")), /* @__PURE__ */ React169__default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "code" }, "Code"), /* @__PURE__ */ React169__default.createElement(
139696
+ ))))))))), /* @__PURE__ */ React169__default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React169__default.createElement(DialogContent2, { className: "sm:max-w-2xl max-h-[90vh] flex flex-col" }, /* @__PURE__ */ React169__default.createElement(DialogHeader, { className: "p-6 pb-0" }, /* @__PURE__ */ React169__default.createElement(DialogTitle2, null, currentItem ? "Edit Learning Objective" : "Add New Learning Objective")), /* @__PURE__ */ React169__default.createElement(ScrollArea2, { className: "flex-1 pr-1" }, /* @__PURE__ */ React169__default.createElement("div", { className: "px-6 py-4 grid gap-4" }, /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "code" }, "LO Code"), /* @__PURE__ */ React169__default.createElement(
139672
139697
  Input,
139673
139698
  {
139674
139699
  id: "code",
139675
139700
  value: formState.code || "",
139676
- onChange: (e3) => handleFormChange(
139677
- "code",
139678
- e3.target.value.toUpperCase()
139679
- ),
139701
+ onChange: (e3) => handleFormChange("code", e3.target.value.toUpperCase()),
139680
139702
  disabled: !!currentItem
139681
139703
  }
139682
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "name" }, "Name (Description)"), /* @__PURE__ */ React169__default.createElement(
139704
+ )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "name" }, "LO Name (Description)"), /* @__PURE__ */ React169__default.createElement(
139683
139705
  Input,
139684
139706
  {
139685
139707
  id: "name",
139686
139708
  value: formState.name || "",
139687
- onChange: (e3) => handleFormChange(
139688
- "name",
139689
- e3.target.value
139690
- )
139709
+ onChange: (e3) => handleFormChange("name", e3.target.value)
139691
139710
  }
139692
- ))), /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "subject" }, "Subject Name"), /* @__PURE__ */ React169__default.createElement(
139693
- Input,
139694
- {
139695
- id: "subject",
139696
- value: formState.subject || "",
139697
- onChange: (e3) => handleFormChange(
139698
- "subject",
139699
- e3.target.value
139700
- )
139701
- }
139702
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject Code"), /* @__PURE__ */ React169__default.createElement(
139703
- EditableCombobox,
139704
- {
139705
- options: subjects.map((s4) => ({
139706
- value: s4.code,
139707
- label: s4.name
139708
- })),
139709
- value: formState.subjectCode || "",
139710
- onChange: (val) => handleFormChange("subjectCode", val),
139711
- placeholder: "Select a subject..."
139712
- }
139713
- ))), /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "category" }, "Category Name"), /* @__PURE__ */ React169__default.createElement(
139714
- Input,
139715
- {
139716
- id: "category",
139717
- value: formState.category || "",
139718
- onChange: (e3) => handleFormChange(
139719
- "category",
139720
- e3.target.value
139721
- )
139722
- }
139723
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "categoryCode" }, "Category Code"), /* @__PURE__ */ React169__default.createElement(
139724
- Input,
139725
- {
139726
- id: "categoryCode",
139727
- value: formState.categoryCode || "",
139728
- onChange: (e3) => handleFormChange(
139729
- "categoryCode",
139730
- e3.target.value
139731
- )
139732
- }
139733
- ))), /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "topic" }, "Topic Name"), /* @__PURE__ */ React169__default.createElement(
139734
- Input,
139735
- {
139736
- id: "topic",
139737
- value: formState.topic || "",
139738
- onChange: (e3) => handleFormChange(
139739
- "topic",
139740
- e3.target.value
139741
- )
139742
- }
139743
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "topicCode" }, "Topic Code"), /* @__PURE__ */ React169__default.createElement(
139744
- Input,
139745
- {
139746
- id: "topicCode",
139747
- value: formState.topicCode || "",
139748
- onChange: (e3) => handleFormChange(
139749
- "topicCode",
139750
- e3.target.value
139751
- )
139752
- }
139753
- ))), /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "grade" }, "Grade Name"), /* @__PURE__ */ React169__default.createElement(
139754
- Input,
139755
- {
139756
- id: "grade",
139757
- value: formState.grade || "",
139758
- onChange: (e3) => handleFormChange(
139759
- "grade",
139760
- e3.target.value
139761
- )
139762
- }
139763
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "gradeCode" }, "Grade Code"), /* @__PURE__ */ React169__default.createElement(
139764
- Input,
139765
- {
139766
- id: "gradeCode",
139767
- value: formState.gradeCode || "",
139768
- onChange: (e3) => handleFormChange(
139769
- "gradeCode",
139770
- e3.target.value
139771
- )
139772
- }
139773
- ))), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "keywords" }, "Keywords (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139711
+ ))), /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject"), /* @__PURE__ */ React169__default.createElement(Select2, { value: formState.subjectCode || "", onValueChange: (val) => handleFormChange("subjectCode", val) }, /* @__PURE__ */ React169__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React169__default.createElement(SelectValue2, { placeholder: "Select a subject..." })), /* @__PURE__ */ React169__default.createElement(SelectContent2, null, subjects.map((s4) => /* @__PURE__ */ React169__default.createElement(SelectItem2, { key: s4.code, value: s4.code }, s4.name))))), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "categoryCode" }, "Category"), /* @__PURE__ */ React169__default.createElement(Select2, { value: formState.categoryCode || "", onValueChange: (val) => handleFormChange("categoryCode", val), disabled: !formState.subjectCode || filteredCategories.length === 0 }, /* @__PURE__ */ React169__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React169__default.createElement(SelectValue2, { placeholder: "Select a category..." })), /* @__PURE__ */ React169__default.createElement(SelectContent2, null, filteredCategories.map((c4) => /* @__PURE__ */ React169__default.createElement(SelectItem2, { key: c4.code, value: c4.code }, c4.name)))))), /* @__PURE__ */ React169__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "topicCode" }, "Topic"), /* @__PURE__ */ React169__default.createElement(Select2, { value: formState.topicCode || "", onValueChange: (val) => handleFormChange("topicCode", val), disabled: !formState.categoryCode || filteredTopics.length === 0 }, /* @__PURE__ */ React169__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React169__default.createElement(SelectValue2, { placeholder: "Select a topic..." })), /* @__PURE__ */ React169__default.createElement(SelectContent2, null, filteredTopics.map((t4) => /* @__PURE__ */ React169__default.createElement(SelectItem2, { key: t4.code, value: t4.code }, t4.name))))), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "gradeCode" }, "Grade Level"), /* @__PURE__ */ React169__default.createElement(Select2, { value: formState.gradeCode || "", onValueChange: (val) => handleFormChange("gradeCode", val) }, /* @__PURE__ */ React169__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React169__default.createElement(SelectValue2, { placeholder: "Select a grade level..." })), /* @__PURE__ */ React169__default.createElement(SelectContent2, null, gradeLevels.map((g) => /* @__PURE__ */ React169__default.createElement(SelectItem2, { key: g.code, value: g.code }, g.name)))))), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "keywords" }, "Keywords (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139774
139712
  Textarea,
139775
139713
  {
139776
139714
  id: "keywords",
139777
- value: formState.keywords?.join(", ") || "",
139778
- onChange: (e3) => handleFormChange(
139779
- "keywords",
139780
- e3.target.value.split(",").map((s4) => s4.trim())
139781
- )
139715
+ value: Array.isArray(formState.keywords) ? formState.keywords.join(", ") : "",
139716
+ onChange: (e3) => handleFormChange("keywords", e3.target.value.split(",").map((s4) => s4.trim()))
139782
139717
  }
139783
139718
  )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "stemElements" }, "STEM Elements (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139784
139719
  Textarea,
139785
139720
  {
139786
139721
  id: "stemElements",
139787
- value: formState.stemElements?.join(", ") || "",
139788
- onChange: (e3) => handleFormChange(
139789
- "stemElements",
139790
- e3.target.value.split(",").map((s4) => s4.trim())
139791
- )
139722
+ value: Array.isArray(formState.stemElements) ? formState.stemElements.join(", ") : "",
139723
+ onChange: (e3) => handleFormChange("stemElements", e3.target.value.split(",").map((s4) => s4.trim()))
139792
139724
  }
139793
139725
  )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "bloomLevelsGuideline" }, "Bloom's Guideline (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139794
139726
  Textarea,
139795
139727
  {
139796
139728
  id: "bloomLevelsGuideline",
139797
- value: formState.bloomLevelsGuideline?.join(
139798
- ", "
139799
- ) || "",
139800
- onChange: (e3) => handleFormChange(
139801
- "bloomLevelsGuideline",
139802
- e3.target.value.split(",").map((s4) => s4.trim())
139803
- )
139729
+ value: Array.isArray(formState.bloomLevelsGuideline) ? formState.bloomLevelsGuideline.join(", ") : "",
139730
+ onChange: (e3) => handleFormChange("bloomLevelsGuideline", e3.target.value.split(",").map((s4) => s4.trim()))
139804
139731
  }
139805
- ))))), /* @__PURE__ */ React169__default.createElement(DialogFooter, { className: "p-6 pt-0" }, /* @__PURE__ */ React169__default.createElement(
139732
+ )))), /* @__PURE__ */ React169__default.createElement(DialogFooter, { className: "p-6 pt-4 border-t" }, /* @__PURE__ */ React169__default.createElement(
139806
139733
  Button,
139807
139734
  {
139808
139735
  type: "button",
@@ -267,13 +267,16 @@ declare function QuestionTypeManager({ initialData, isLoading: isLoadingProp, on
267
267
  interface LearningObjectiveManagerProps {
268
268
  initialData?: LearningObjective[];
269
269
  subjects?: Subject[];
270
+ categories?: Category[];
271
+ topics?: Topic[];
272
+ gradeLevels?: GradeLevel[];
270
273
  isLoading?: boolean;
271
274
  onAdd?: (item: Omit<LearningObjective, "id">) => Promise<void>;
272
275
  onUpdate?: (item: LearningObjective) => Promise<void>;
273
276
  onDelete?: (item: LearningObjective) => Promise<void>;
274
277
  onBulkAdd?: (items: Omit<LearningObjective, "id">[]) => Promise<void>;
275
278
  }
276
- declare function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoading: isLoadingProp, onAdd, onUpdate, onDelete, onBulkAdd, }: LearningObjectiveManagerProps): React__default.JSX.Element;
279
+ declare function LearningObjectiveManager({ initialData, subjects: subjectsProp, categories: categoriesProp, topics: topicsProp, gradeLevels: gradeLevelsProp, isLoading: isLoadingProp, onAdd, onUpdate, onDelete, onBulkAdd, }: LearningObjectiveManagerProps): React__default.JSX.Element;
277
280
 
278
281
  interface ContextManagerProps {
279
282
  initialData?: Context[];
@@ -267,13 +267,16 @@ declare function QuestionTypeManager({ initialData, isLoading: isLoadingProp, on
267
267
  interface LearningObjectiveManagerProps {
268
268
  initialData?: LearningObjective[];
269
269
  subjects?: Subject[];
270
+ categories?: Category[];
271
+ topics?: Topic[];
272
+ gradeLevels?: GradeLevel[];
270
273
  isLoading?: boolean;
271
274
  onAdd?: (item: Omit<LearningObjective, "id">) => Promise<void>;
272
275
  onUpdate?: (item: LearningObjective) => Promise<void>;
273
276
  onDelete?: (item: LearningObjective) => Promise<void>;
274
277
  onBulkAdd?: (items: Omit<LearningObjective, "id">[]) => Promise<void>;
275
278
  }
276
- declare function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoading: isLoadingProp, onAdd, onUpdate, onDelete, onBulkAdd, }: LearningObjectiveManagerProps): React__default.JSX.Element;
279
+ declare function LearningObjectiveManager({ initialData, subjects: subjectsProp, categories: categoriesProp, topics: topicsProp, gradeLevels: gradeLevelsProp, isLoading: isLoadingProp, onAdd, onUpdate, onDelete, onBulkAdd, }: LearningObjectiveManagerProps): React__default.JSX.Element;
277
280
 
278
281
  interface ContextManagerProps {
279
282
  initialData?: Context[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thanh01.pmt/interactive-quiz-kit",
3
- "version": "1.0.82",
3
+ "version": "1.0.84",
4
4
  "description": "A comprehensive library for creating, managing, and playing interactive quizzes, with AI generation and SCORM support.",
5
5
  "keywords": [
6
6
  "react",