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

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);
@@ -139477,13 +139483,34 @@ function LearningObjectiveManager({
139477
139483
  if (isControlled) {
139478
139484
  setItems(initialData || []);
139479
139485
  setSubjects(subjectsProp || []);
139486
+ setCategories(categoriesProp || []);
139487
+ setTopics(topicsProp || []);
139488
+ setGradeLevels(gradeLevelsProp || []);
139480
139489
  setIsLoading(isLoadingProp || false);
139481
139490
  } else {
139482
139491
  refreshData();
139483
139492
  }
139484
- }, [isControlled, initialData, subjectsProp, isLoadingProp]);
139493
+ }, [isControlled, initialData, subjectsProp, categoriesProp, topicsProp, gradeLevelsProp, isLoadingProp]);
139494
+ const filteredCategories = useMemo(() => {
139495
+ if (!formState.subjectCode) return [];
139496
+ return categories.filter((c4) => c4.subjectCode === formState.subjectCode);
139497
+ }, [formState.subjectCode, categories]);
139498
+ const filteredTopics = useMemo(() => {
139499
+ if (!formState.categoryCode) return [];
139500
+ return topics.filter((t4) => t4.categoryCode === formState.categoryCode);
139501
+ }, [formState.categoryCode, topics]);
139485
139502
  const handleFormChange = (field, value) => {
139486
- setFormState((prev) => ({ ...prev, [field]: value }));
139503
+ setFormState((prev) => {
139504
+ const newState = { ...prev, [field]: value };
139505
+ if (field === "subjectCode") {
139506
+ newState.categoryCode = "";
139507
+ newState.topicCode = "";
139508
+ }
139509
+ if (field === "categoryCode") {
139510
+ newState.topicCode = "";
139511
+ }
139512
+ return newState;
139513
+ });
139487
139514
  };
139488
139515
  const handleAddItem = () => {
139489
139516
  setCurrentItem(null);
@@ -139494,11 +139521,7 @@ function LearningObjectiveManager({
139494
139521
  };
139495
139522
  const handleEditItem = (item) => {
139496
139523
  setCurrentItem(item);
139497
- const subject = subjects.find((s4) => s4.code === item.subjectCode);
139498
- setFormState({
139499
- ...item,
139500
- subject: subject ? subject.name : item.subject || ""
139501
- });
139524
+ setFormState({ ...item });
139502
139525
  setIsDialogOpen(true);
139503
139526
  };
139504
139527
  const handleDeleteItem = (item) => {
@@ -139600,7 +139623,6 @@ function LearningObjectiveManager({
139600
139623
  acc.valid.push({
139601
139624
  code: rec["LO ID"],
139602
139625
  name: rec["LO Name"] || rec["LO Description"],
139603
- // Use description if name is missing
139604
139626
  description: rec["LO Description"],
139605
139627
  subject: rec["Subject"] || "",
139606
139628
  subjectCode: rec["Subject Code"] || rec["Subject"],
@@ -139668,141 +139690,43 @@ function LearningObjectiveManager({
139668
139690
  className: "text-destructive hover:text-destructive"
139669
139691
  },
139670
139692
  /* @__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(
139693
+ ))))))))), /* @__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
139694
  Input,
139673
139695
  {
139674
139696
  id: "code",
139675
139697
  value: formState.code || "",
139676
- onChange: (e3) => handleFormChange(
139677
- "code",
139678
- e3.target.value.toUpperCase()
139679
- ),
139698
+ onChange: (e3) => handleFormChange("code", e3.target.value.toUpperCase()),
139680
139699
  disabled: !!currentItem
139681
139700
  }
139682
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "name" }, "Name (Description)"), /* @__PURE__ */ React169__default.createElement(
139701
+ )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "name" }, "LO Name (Description)"), /* @__PURE__ */ React169__default.createElement(
139683
139702
  Input,
139684
139703
  {
139685
139704
  id: "name",
139686
139705
  value: formState.name || "",
139687
- onChange: (e3) => handleFormChange(
139688
- "name",
139689
- e3.target.value
139690
- )
139691
- }
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
- )
139706
+ onChange: (e3) => handleFormChange("name", e3.target.value)
139752
139707
  }
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(
139708
+ ))), /* @__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 }, /* @__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 }, /* @__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
139709
  Textarea,
139775
139710
  {
139776
139711
  id: "keywords",
139777
- value: formState.keywords?.join(", ") || "",
139778
- onChange: (e3) => handleFormChange(
139779
- "keywords",
139780
- e3.target.value.split(",").map((s4) => s4.trim())
139781
- )
139712
+ value: Array.isArray(formState.keywords) ? formState.keywords.join(", ") : "",
139713
+ onChange: (e3) => handleFormChange("keywords", e3.target.value.split(",").map((s4) => s4.trim()))
139782
139714
  }
139783
139715
  )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "stemElements" }, "STEM Elements (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139784
139716
  Textarea,
139785
139717
  {
139786
139718
  id: "stemElements",
139787
- value: formState.stemElements?.join(", ") || "",
139788
- onChange: (e3) => handleFormChange(
139789
- "stemElements",
139790
- e3.target.value.split(",").map((s4) => s4.trim())
139791
- )
139719
+ value: Array.isArray(formState.stemElements) ? formState.stemElements.join(", ") : "",
139720
+ onChange: (e3) => handleFormChange("stemElements", e3.target.value.split(",").map((s4) => s4.trim()))
139792
139721
  }
139793
139722
  )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "bloomLevelsGuideline" }, "Bloom's Guideline (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139794
139723
  Textarea,
139795
139724
  {
139796
139725
  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
- )
139726
+ value: Array.isArray(formState.bloomLevelsGuideline) ? formState.bloomLevelsGuideline.join(", ") : "",
139727
+ onChange: (e3) => handleFormChange("bloomLevelsGuideline", e3.target.value.split(",").map((s4) => s4.trim()))
139804
139728
  }
139805
- ))))), /* @__PURE__ */ React169__default.createElement(DialogFooter, { className: "p-6 pt-0" }, /* @__PURE__ */ React169__default.createElement(
139729
+ )))), /* @__PURE__ */ React169__default.createElement(DialogFooter, { className: "p-6 pt-4 border-t" }, /* @__PURE__ */ React169__default.createElement(
139806
139730
  Button,
139807
139731
  {
139808
139732
  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.83",
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",