@thanh01.pmt/interactive-quiz-kit 1.0.81 → 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
@@ -101960,17 +101960,13 @@ TopicDataService.HEADER_MAP = {
101960
101960
  "LO Description": "description",
101961
101961
  "Subject": "subject",
101962
101962
  "Subject Code": "subjectCode",
101963
- // New
101964
101963
  "Category": "category",
101965
101964
  "Category Code": "categoryCode",
101966
- // New
101967
101965
  "Topic": "topic",
101968
101966
  "Topic Code": "topicCode",
101969
- // New
101970
101967
  "Keywords": "keywords",
101971
101968
  "Grade": "grade",
101972
101969
  "Grade Code": "gradeCode",
101973
- // New
101974
101970
  "STEM Element(s)": "stemElements",
101975
101971
  "Bloom\u2019s Level(s) Guideline": "bloomLevelsGuideline"
101976
101972
  };
@@ -138963,7 +138959,7 @@ function TopicManager({
138963
138959
  setCurrentItem(topic);
138964
138960
  setItemName(topic.name);
138965
138961
  setItemCode(topic.code);
138966
- setSelectedSubjectCode(topic.subjectCode);
138962
+ setSelectedSubjectCode(topic.subjectCode ?? "");
138967
138963
  setIsDialogOpen(true);
138968
138964
  };
138969
138965
  const handleDeleteItem = (topic) => {
@@ -139041,7 +139037,7 @@ function TopicManager({
139041
139037
  const getSubjectName = (subjectCode) => {
139042
139038
  return subjects.find((s4) => s4.code === subjectCode)?.name || "N/A";
139043
139039
  };
139044
- 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"))))));
139045
139041
  }
139046
139042
 
139047
139043
  // src/react-ui/components/metadata/CategoryManager.tsx
@@ -139439,6 +139435,9 @@ init_react_shim();
139439
139435
  function LearningObjectiveManager({
139440
139436
  initialData,
139441
139437
  subjects: subjectsProp,
139438
+ categories: categoriesProp,
139439
+ topics: topicsProp,
139440
+ gradeLevels: gradeLevelsProp,
139442
139441
  isLoading: isLoadingProp,
139443
139442
  onAdd,
139444
139443
  onUpdate,
@@ -139447,6 +139446,9 @@ function LearningObjectiveManager({
139447
139446
  }) {
139448
139447
  const [items, setItems] = useState([]);
139449
139448
  const [subjects, setSubjects] = useState([]);
139449
+ const [categories, setCategories] = useState([]);
139450
+ const [topics, setTopics] = useState([]);
139451
+ const [gradeLevels, setGradeLevels] = useState([]);
139450
139452
  const [isLoading, setIsLoading] = useState(true);
139451
139453
  const [isDialogOpen, setIsDialogOpen] = useState(false);
139452
139454
  const [isAlertOpen, setIsAlertOpen] = useState(false);
@@ -139481,13 +139483,34 @@ function LearningObjectiveManager({
139481
139483
  if (isControlled) {
139482
139484
  setItems(initialData || []);
139483
139485
  setSubjects(subjectsProp || []);
139486
+ setCategories(categoriesProp || []);
139487
+ setTopics(topicsProp || []);
139488
+ setGradeLevels(gradeLevelsProp || []);
139484
139489
  setIsLoading(isLoadingProp || false);
139485
139490
  } else {
139486
139491
  refreshData();
139487
139492
  }
139488
- }, [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]);
139489
139502
  const handleFormChange = (field, value) => {
139490
- 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
+ });
139491
139514
  };
139492
139515
  const handleAddItem = () => {
139493
139516
  setCurrentItem(null);
@@ -139498,7 +139521,7 @@ function LearningObjectiveManager({
139498
139521
  };
139499
139522
  const handleEditItem = (item) => {
139500
139523
  setCurrentItem(item);
139501
- setFormState(item);
139524
+ setFormState({ ...item });
139502
139525
  setIsDialogOpen(true);
139503
139526
  };
139504
139527
  const handleDeleteItem = (item) => {
@@ -139599,7 +139622,7 @@ function LearningObjectiveManager({
139599
139622
  if (typeof rec["LO ID"] === "string" && rec["LO ID"].trim() && typeof rec["LO Description"] === "string" && rec["LO Description"].trim()) {
139600
139623
  acc.valid.push({
139601
139624
  code: rec["LO ID"],
139602
- name: rec["LO Name"],
139625
+ name: rec["LO Name"] || rec["LO Description"],
139603
139626
  description: rec["LO Description"],
139604
139627
  subject: rec["Subject"] || "",
139605
139628
  subjectCode: rec["Subject Code"] || rec["Subject"],
@@ -139667,141 +139690,43 @@ function LearningObjectiveManager({
139667
139690
  className: "text-destructive hover:text-destructive"
139668
139691
  },
139669
139692
  /* @__PURE__ */ React169__default.createElement(Trash2, { className: "h-4 w-4" })
139670
- ))))))))), /* @__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(
139671
139694
  Input,
139672
139695
  {
139673
139696
  id: "code",
139674
139697
  value: formState.code || "",
139675
- onChange: (e3) => handleFormChange(
139676
- "code",
139677
- e3.target.value.toUpperCase()
139678
- ),
139698
+ onChange: (e3) => handleFormChange("code", e3.target.value.toUpperCase()),
139679
139699
  disabled: !!currentItem
139680
139700
  }
139681
- )), /* @__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(
139682
139702
  Input,
139683
139703
  {
139684
139704
  id: "name",
139685
139705
  value: formState.name || "",
139686
- onChange: (e3) => handleFormChange(
139687
- "name",
139688
- e3.target.value
139689
- )
139690
- }
139691
- ))), /* @__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(
139692
- Input,
139693
- {
139694
- id: "subject",
139695
- value: formState.subject || "",
139696
- onChange: (e3) => handleFormChange(
139697
- "subject",
139698
- e3.target.value
139699
- )
139700
- }
139701
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject Code"), /* @__PURE__ */ React169__default.createElement(
139702
- EditableCombobox,
139703
- {
139704
- options: subjects.map((s4) => ({
139705
- value: s4.code,
139706
- label: s4.name
139707
- })),
139708
- value: formState.subjectCode || "",
139709
- onChange: (val) => handleFormChange("subjectCode", val),
139710
- placeholder: "Select a subject..."
139711
- }
139712
- ))), /* @__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(
139713
- Input,
139714
- {
139715
- id: "category",
139716
- value: formState.category || "",
139717
- onChange: (e3) => handleFormChange(
139718
- "category",
139719
- e3.target.value
139720
- )
139706
+ onChange: (e3) => handleFormChange("name", e3.target.value)
139721
139707
  }
139722
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "categoryCode" }, "Category Code"), /* @__PURE__ */ React169__default.createElement(
139723
- Input,
139724
- {
139725
- id: "categoryCode",
139726
- value: formState.categoryCode || "",
139727
- onChange: (e3) => handleFormChange(
139728
- "categoryCode",
139729
- e3.target.value
139730
- )
139731
- }
139732
- ))), /* @__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(
139733
- Input,
139734
- {
139735
- id: "topic",
139736
- value: formState.topic || "",
139737
- onChange: (e3) => handleFormChange(
139738
- "topic",
139739
- e3.target.value
139740
- )
139741
- }
139742
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "topicCode" }, "Topic Code"), /* @__PURE__ */ React169__default.createElement(
139743
- Input,
139744
- {
139745
- id: "topicCode",
139746
- value: formState.topicCode || "",
139747
- onChange: (e3) => handleFormChange(
139748
- "topicCode",
139749
- e3.target.value
139750
- )
139751
- }
139752
- ))), /* @__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(
139753
- Input,
139754
- {
139755
- id: "grade",
139756
- value: formState.grade || "",
139757
- onChange: (e3) => handleFormChange(
139758
- "grade",
139759
- e3.target.value
139760
- )
139761
- }
139762
- )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "gradeCode" }, "Grade Code"), /* @__PURE__ */ React169__default.createElement(
139763
- Input,
139764
- {
139765
- id: "gradeCode",
139766
- value: formState.gradeCode || "",
139767
- onChange: (e3) => handleFormChange(
139768
- "gradeCode",
139769
- e3.target.value
139770
- )
139771
- }
139772
- ))), /* @__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(
139773
139709
  Textarea,
139774
139710
  {
139775
139711
  id: "keywords",
139776
- value: formState.keywords?.join(", ") || "",
139777
- onChange: (e3) => handleFormChange(
139778
- "keywords",
139779
- e3.target.value.split(",").map((s4) => s4.trim())
139780
- )
139712
+ value: Array.isArray(formState.keywords) ? formState.keywords.join(", ") : "",
139713
+ onChange: (e3) => handleFormChange("keywords", e3.target.value.split(",").map((s4) => s4.trim()))
139781
139714
  }
139782
139715
  )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "stemElements" }, "STEM Elements (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139783
139716
  Textarea,
139784
139717
  {
139785
139718
  id: "stemElements",
139786
- value: formState.stemElements?.join(", ") || "",
139787
- onChange: (e3) => handleFormChange(
139788
- "stemElements",
139789
- e3.target.value.split(",").map((s4) => s4.trim())
139790
- )
139719
+ value: Array.isArray(formState.stemElements) ? formState.stemElements.join(", ") : "",
139720
+ onChange: (e3) => handleFormChange("stemElements", e3.target.value.split(",").map((s4) => s4.trim()))
139791
139721
  }
139792
139722
  )), /* @__PURE__ */ React169__default.createElement("div", null, /* @__PURE__ */ React169__default.createElement(Label2, { htmlFor: "bloomLevelsGuideline" }, "Bloom's Guideline (comma-separated)"), /* @__PURE__ */ React169__default.createElement(
139793
139723
  Textarea,
139794
139724
  {
139795
139725
  id: "bloomLevelsGuideline",
139796
- value: formState.bloomLevelsGuideline?.join(
139797
- ", "
139798
- ) || "",
139799
- onChange: (e3) => handleFormChange(
139800
- "bloomLevelsGuideline",
139801
- e3.target.value.split(",").map((s4) => s4.trim())
139802
- )
139726
+ value: Array.isArray(formState.bloomLevelsGuideline) ? formState.bloomLevelsGuideline.join(", ") : "",
139727
+ onChange: (e3) => handleFormChange("bloomLevelsGuideline", e3.target.value.split(",").map((s4) => s4.trim()))
139803
139728
  }
139804
- ))))), /* @__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(
139805
139730
  Button,
139806
139731
  {
139807
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.81",
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",