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

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.
@@ -71606,21 +71606,30 @@ var EditableCombobox = ({
71606
71606
  disabled = false
71607
71607
  }) => {
71608
71608
  const [open, setOpen] = React119.useState(false);
71609
- const [inputValue, setInputValue] = React119.useState(value);
71609
+ const [inputValue, setInputValue] = React119.useState("");
71610
71610
  React119.useEffect(() => {
71611
- setInputValue(value);
71612
- }, [value]);
71613
- const handleSelect = (currentValue) => {
71614
- const newValue = currentValue === value ? "" : currentValue;
71615
- onChange(newValue);
71616
- setInputValue(newValue);
71611
+ if (value) {
71612
+ const selectedOption = options.find((option) => option.value.toLowerCase() === value.toLowerCase());
71613
+ setInputValue(selectedOption ? selectedOption.label : value);
71614
+ } else {
71615
+ setInputValue("");
71616
+ }
71617
+ }, [value, options, open]);
71618
+ const handleSelect = (selectedValue) => {
71619
+ onChange(selectedValue);
71617
71620
  setOpen(false);
71618
71621
  };
71619
- const handleBlur = () => {
71620
- onChange(inputValue);
71622
+ const handleOpenChange = (isOpen) => {
71623
+ if (!isOpen) {
71624
+ const match2 = options.find((option) => option.label.toLowerCase() === inputValue.toLowerCase());
71625
+ if (!match2 && inputValue !== (options.find((opt) => opt.value === value)?.label || value)) {
71626
+ onChange(inputValue);
71627
+ }
71628
+ }
71629
+ setOpen(isOpen);
71621
71630
  };
71622
71631
  const displayLabel = options.find((option) => option.value.toLowerCase() === value?.toLowerCase())?.label || value;
71623
- return /* @__PURE__ */ React119.createElement(Popover2, { open, onOpenChange: setOpen }, /* @__PURE__ */ React119.createElement(PopoverTrigger2, { asChild: true }, /* @__PURE__ */ React119.createElement(
71632
+ return /* @__PURE__ */ React119.createElement(Popover2, { open, onOpenChange: handleOpenChange }, /* @__PURE__ */ React119.createElement(PopoverTrigger2, { asChild: true }, /* @__PURE__ */ React119.createElement(
71624
71633
  Button,
71625
71634
  {
71626
71635
  variant: "outline",
@@ -71636,8 +71645,7 @@ var EditableCombobox = ({
71636
71645
  {
71637
71646
  placeholder: searchPlaceholder,
71638
71647
  value: inputValue,
71639
- onValueChange: setInputValue,
71640
- onBlur: handleBlur
71648
+ onValueChange: setInputValue
71641
71649
  }
71642
71650
  ), /* @__PURE__ */ React119.createElement(CommandList, null, /* @__PURE__ */ React119.createElement(CommandEmpty, null, noResultsMessage), /* @__PURE__ */ React119.createElement(CommandGroup, null, options.map((option) => /* @__PURE__ */ React119.createElement(
71643
71651
  CommandItem,
@@ -72936,6 +72944,10 @@ var supportedQuestionTypesForAI = [
72936
72944
  { value: "sequence", label: "Sequence" },
72937
72945
  { value: "matching", label: "Matching" }
72938
72946
  ];
72947
+ var availableLanguages = [
72948
+ { value: "English", label: "English" },
72949
+ { value: "Vietnamese", label: "Ti\u1EBFng Vi\u1EC7t" }
72950
+ ];
72939
72951
  var AIQuestionGeneratorModal = ({
72940
72952
  isOpen,
72941
72953
  onClose,
@@ -72945,51 +72957,65 @@ var AIQuestionGeneratorModal = ({
72945
72957
  subjects = [],
72946
72958
  topics = [],
72947
72959
  gradeLevels = [],
72948
- bloomLevels = []
72960
+ bloomLevels = [],
72961
+ categories = []
72949
72962
  }) => {
72950
- const [prompt, setPrompt] = useState("");
72963
+ const [additionalInfo, setAdditionalInfo] = useState("");
72951
72964
  const [isLoading, setIsLoading] = useState(false);
72952
72965
  const [error, setError] = useState(null);
72953
72966
  const { toast: toast2 } = useToast();
72954
72967
  const [subjectCode, setSubjectCode] = useState("");
72968
+ const [categoryCode, setCategoryCode] = useState("");
72955
72969
  const [topicCode, setTopicCode] = useState("");
72956
72970
  const [gradeBand, setGradeBand] = useState("");
72957
72971
  const [bloomLevelCode, setBloomLevelCode] = useState("");
72958
72972
  const [selectedQuestionType, setSelectedQuestionType] = useState("multiple_choice");
72973
+ const [selectedLanguage, setSelectedLanguage] = useState(language3);
72959
72974
  const [numberOfOptions, setNumberOfOptions] = useState(4);
72960
- const [minCorrectAnswers, setMinCorrectAnswers] = useState(2);
72961
- const [maxCorrectAnswers, setMaxCorrectAnswers] = useState(3);
72962
- const [isCaseSensitive, setIsCaseSensitive] = useState(false);
72963
- const [numberOfBlanks, setNumberOfBlanks] = useState(2);
72964
- const [numberOfSequenceItems, setNumberOfSequenceItems] = useState(4);
72965
- const [numberOfMatchingPairs, setNumberOfMatchingPairs] = useState(4);
72966
72975
  const [isApiKeyManagerModalOpen, setIsApiKeyManagerModalOpen] = useState(false);
72967
72976
  const [geminiApiKeyExists, setGeminiApiKeyExists] = useState(false);
72968
72977
  const finalQuestionType = questionTypeProp || selectedQuestionType;
72969
72978
  useEffect(() => {
72970
72979
  if (isOpen) {
72971
- setPrompt("");
72980
+ setAdditionalInfo("");
72972
72981
  setError(null);
72973
72982
  setIsLoading(false);
72974
72983
  setSubjectCode("");
72984
+ setCategoryCode("");
72975
72985
  setTopicCode("");
72976
72986
  setGradeBand("");
72977
72987
  setBloomLevelCode("");
72978
72988
  setSelectedQuestionType(questionTypeProp || "multiple_choice");
72989
+ setSelectedLanguage(language3);
72979
72990
  setGeminiApiKeyExists(APIKeyService.hasAPIKey(GEMINI_API_KEY_SERVICE_NAME));
72980
72991
  }
72981
- }, [isOpen, questionTypeProp]);
72992
+ }, [isOpen, questionTypeProp, language3]);
72993
+ const filteredCategories = useMemo(() => {
72994
+ return categories;
72995
+ }, [categories]);
72982
72996
  const filteredTopics = useMemo(() => {
72983
- if (!subjectCode) return [];
72984
- return topics.filter((t2) => t2.subjectCode === subjectCode);
72985
- }, [subjectCode, topics]);
72997
+ if (!subjectCode || !categoryCode) return [];
72998
+ return topics.filter(
72999
+ (t2) => t2.subjectCode === subjectCode
73000
+ /* && t.categoryCode === categoryCode */
73001
+ );
73002
+ }, [subjectCode, categoryCode, topics]);
73003
+ const handleSubjectChange = (newSubjectCode) => {
73004
+ setSubjectCode(newSubjectCode);
73005
+ setCategoryCode("");
73006
+ setTopicCode("");
73007
+ };
73008
+ const handleCategoryChange = (newCategoryCode) => {
73009
+ setCategoryCode(newCategoryCode);
73010
+ setTopicCode("");
73011
+ };
72986
73012
  const handleApiKeyModalClose = () => {
72987
73013
  setIsApiKeyManagerModalOpen(false);
72988
73014
  setGeminiApiKeyExists(APIKeyService.hasAPIKey(GEMINI_API_KEY_SERVICE_NAME));
72989
73015
  };
72990
73016
  const handleSubmit = async () => {
72991
- if (!prompt.trim()) {
72992
- setError("Please provide a prompt for the question.");
73017
+ if (!subjectCode || !categoryCode || !topicCode || !gradeBand || !bloomLevelCode) {
73018
+ setError("Please fill in all required metadata fields: Subject, Category, Topic, Grade Level, and Bloom's Level.");
72993
73019
  return;
72994
73020
  }
72995
73021
  const geminiKey = APIKeyService.getAPIKey(GEMINI_API_KEY_SERVICE_NAME);
@@ -73003,14 +73029,15 @@ var AIQuestionGeneratorModal = ({
73003
73029
  setIsLoading(true);
73004
73030
  try {
73005
73031
  const quizContext = {
73006
- plannedTopic: prompt,
73032
+ plannedTopic: additionalInfo.trim() || topicCode,
73007
73033
  originalSubject: subjectCode,
73008
73034
  originalTopic: topicCode,
73035
+ originalCategory: categoryCode,
73009
73036
  gradeBand,
73010
73037
  plannedBloomLevel: bloomLevelCode
73011
73038
  };
73012
73039
  const baseClientInput = {
73013
- language: language3,
73040
+ language: selectedLanguage,
73014
73041
  difficulty: "Medium",
73015
73042
  quizContext
73016
73043
  };
@@ -73023,33 +73050,32 @@ var AIQuestionGeneratorModal = ({
73023
73050
  generatedResult = await generateMCQQuestion({ ...baseClientInput, numberOfOptions }, geminiKey);
73024
73051
  break;
73025
73052
  case "multiple_response":
73026
- generatedResult = await generateMRQQuestion({ ...baseClientInput, numberOfOptions, minCorrectAnswers, maxCorrectAnswers }, geminiKey);
73053
+ generatedResult = await generateMRQQuestion({ ...baseClientInput, numberOfOptions: 5, minCorrectAnswers: 2, maxCorrectAnswers: 3 }, geminiKey);
73027
73054
  break;
73028
73055
  case "short_answer":
73029
- generatedResult = await generateShortAnswerQuestion({ ...baseClientInput, isCaseSensitive }, geminiKey);
73056
+ generatedResult = await generateShortAnswerQuestion({ ...baseClientInput, isCaseSensitive: false }, geminiKey);
73030
73057
  break;
73031
73058
  case "numeric":
73032
73059
  generatedResult = await generateNumericQuestion({ ...baseClientInput, allowDecimals: true, tolerance: 0 }, geminiKey);
73033
73060
  break;
73034
73061
  case "fill_in_the_blanks":
73035
- generatedResult = await generateFillInTheBlanksQuestion({ ...baseClientInput, numberOfBlanks, isCaseSensitive }, geminiKey);
73062
+ generatedResult = await generateFillInTheBlanksQuestion({ ...baseClientInput, numberOfBlanks: 2, isCaseSensitive: false }, geminiKey);
73036
73063
  break;
73037
73064
  case "sequence":
73038
- generatedResult = await generateSequenceQuestion({ ...baseClientInput, numberOfItems: numberOfSequenceItems }, geminiKey);
73065
+ generatedResult = await generateSequenceQuestion({ ...baseClientInput, numberOfItems: 4 }, geminiKey);
73039
73066
  break;
73040
73067
  case "matching":
73041
- generatedResult = await generateMatchingQuestion({ ...baseClientInput, numberOfPairs: numberOfMatchingPairs, shuffleOptions: true }, geminiKey);
73068
+ generatedResult = await generateMatchingQuestion({ ...baseClientInput, numberOfPairs: 4, shuffleOptions: true }, geminiKey);
73042
73069
  break;
73043
73070
  default:
73044
73071
  throw new Error(`AI generation for '${finalQuestionType}' is not implemented in this flow.`);
73045
73072
  }
73046
- if (generatedResult.error) {
73047
- throw new Error(generatedResult.error);
73048
- }
73073
+ if (generatedResult.error) throw new Error(generatedResult.error);
73049
73074
  if (generatedResult.question) {
73050
73075
  const completeQuestion = generatedResult.question;
73051
73076
  completeQuestion.subject = subjectCode;
73052
73077
  completeQuestion.topic = topicCode;
73078
+ completeQuestion.category = categoryCode;
73053
73079
  completeQuestion.gradeBand = gradeBand;
73054
73080
  completeQuestion.bloomLevel = bloomLevelCode;
73055
73081
  if (completeQuestion.points === void 0) completeQuestion.points = 10;
@@ -73075,47 +73101,13 @@ var AIQuestionGeneratorModal = ({
73075
73101
  const comboboxOptions = {
73076
73102
  subjects: subjects.map((s2) => ({ value: s2.code, label: s2.name })),
73077
73103
  topics: filteredTopics.map((t2) => ({ value: t2.code, label: t2.name })),
73104
+ categories: filteredCategories.map((c2) => ({ value: c2.code, label: c2.name })),
73078
73105
  gradeLevels: gradeLevels.map((g) => ({ value: g.code, label: g.name })),
73079
73106
  bloomLevels: bloomLevels.map((b) => ({ value: b.code, label: b.name }))
73080
73107
  };
73081
- const renderSpecificParams = () => {
73082
- switch (finalQuestionType) {
73083
- case "multiple_choice":
73084
- case "multiple_response":
73085
- return /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2 pt-4 border-t" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-num-options" }, "Number of Options (2-8)"), /* @__PURE__ */ React119__default.createElement(
73086
- Input,
73087
- {
73088
- id: "ai-num-options",
73089
- type: "number",
73090
- value: numberOfOptions,
73091
- onChange: (e2) => setNumberOfOptions(parseInt(e2.target.value, 10)),
73092
- min: 2,
73093
- max: 8
73094
- }
73095
- ), finalQuestionType === "multiple_response" && /* @__PURE__ */ React119__default.createElement(React119__default.Fragment, null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-min-correct" }, "Min Correct Answers"), /* @__PURE__ */ React119__default.createElement(Input, { id: "ai-min-correct", type: "number", value: minCorrectAnswers, onChange: (e2) => setMinCorrectAnswers(parseInt(e2.target.value, 10)), min: 1, max: numberOfOptions }), /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-max-correct" }, "Max Correct Answers"), /* @__PURE__ */ React119__default.createElement(Input, { id: "ai-max-correct", type: "number", value: maxCorrectAnswers, onChange: (e2) => setMaxCorrectAnswers(parseInt(e2.target.value, 10)), min: minCorrectAnswers, max: numberOfOptions })));
73096
- case "short_answer":
73097
- case "fill_in_the_blanks":
73098
- return /* @__PURE__ */ React119__default.createElement("div", { className: "flex items-center space-x-2 pt-4 border-t" }, /* @__PURE__ */ React119__default.createElement("input", { type: "checkbox", id: "ai-case-sensitive", checked: isCaseSensitive, onChange: (e2) => setIsCaseSensitive(e2.target.checked), className: "h-4 w-4 rounded border-gray-300 text-primary focus:ring-primary" }), /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-case-sensitive" }, "Case Sensitive Answers"), finalQuestionType === "fill_in_the_blanks" && /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-1 ml-4" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-num-blanks" }, "Number of Blanks (1-5)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "ai-num-blanks", type: "number", value: numberOfBlanks, onChange: (e2) => setNumberOfBlanks(parseInt(e2.target.value, 10)), min: 1, max: 5 })));
73099
- case "sequence":
73100
- return /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2 pt-4 border-t" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-num-seq-items" }, "Number of Items to Sequence (2-10)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "ai-num-seq-items", type: "number", value: numberOfSequenceItems, onChange: (e2) => setNumberOfSequenceItems(parseInt(e2.target.value, 10)), min: 2, max: 10 }));
73101
- case "matching":
73102
- return /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2 pt-4 border-t" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-num-match-pairs" }, "Number of Pairs to Match (2-8)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "ai-num-match-pairs", type: "number", value: numberOfMatchingPairs, onChange: (e2) => setNumberOfMatchingPairs(parseInt(e2.target.value, 10)), min: 2, max: 8 }));
73103
- default:
73104
- return null;
73105
- }
73106
- };
73107
73108
  return /* @__PURE__ */ React119__default.createElement(React119__default.Fragment, null, /* @__PURE__ */ React119__default.createElement(Dialog2, { open: isOpen, onOpenChange: (open) => {
73108
73109
  if (!open) onClose();
73109
- } }, /* @__PURE__ */ React119__default.createElement(DialogContent2, { className: "sm:max-w-[600px]" }, /* @__PURE__ */ React119__default.createElement(DialogHeader, null, /* @__PURE__ */ React119__default.createElement(DialogTitle2, { className: "flex items-center font-headline text-2xl" }, /* @__PURE__ */ React119__default.createElement(WandSparkles, { className: "mr-2 h-6 w-6 text-primary" }), " AI Question Generator"), /* @__PURE__ */ React119__default.createElement(DialogDescription2, null, "Provide a prompt and metadata to generate a '", finalQuestionType, "' question.")), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-4 py-4 max-h-[60vh] overflow-y-auto px-2" }, !geminiApiKeyExists && /* @__PURE__ */ React119__default.createElement("div", { className: "p-3 mb-4 border border-amber-500 bg-amber-50 rounded-md text-amber-700" }), !questionTypeProp && /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-q-type-select" }, "Question Type"), /* @__PURE__ */ React119__default.createElement(Select2, { value: selectedQuestionType, onValueChange: (v) => setSelectedQuestionType(v) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, { id: "ai-q-type-select" }, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, supportedQuestionTypesForAI.map((type) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: type.value, value: type.value }, type.label))))), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-prompt" }, "Prompt / Topic"), /* @__PURE__ */ React119__default.createElement(
73110
- Textarea,
73111
- {
73112
- id: "ai-prompt",
73113
- value: prompt,
73114
- onChange: (e2) => setPrompt(e2.target.value),
73115
- placeholder: "e.g., The process of photosynthesis, The causes of World War II, Basic Algebra Equations",
73116
- className: "min-h-[100px]"
73117
- }
73118
- )), /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Subject"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.subjects, value: subjectCode, onChange: setSubjectCode, placeholder: "Select or type a Subject..." })), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Topic"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.topics, value: topicCode, onChange: setTopicCode, placeholder: "Select or type a Topic...", disabled: !subjectCode })), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Grade Level"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.gradeLevels, value: gradeBand, onChange: setGradeBand, placeholder: "Select or type a Grade..." })), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Bloom's Level"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.bloomLevels, value: bloomLevelCode, onChange: setBloomLevelCode, placeholder: "Select a Bloom's Level..." }))), renderSpecificParams(), error && /* @__PURE__ */ React119__default.createElement("p", { className: "text-sm text-destructive flex items-center mt-2" }, /* @__PURE__ */ React119__default.createElement(TriangleAlert, { className: "mr-1 h-4 w-4" }), " ", error)), /* @__PURE__ */ React119__default.createElement(DialogFooter, null, /* @__PURE__ */ React119__default.createElement(DialogClose2, { asChild: true }, /* @__PURE__ */ React119__default.createElement(Button, { type: "button", variant: "outline" }, "Cancel")), /* @__PURE__ */ React119__default.createElement(Button, { type: "button", onClick: handleSubmit, disabled: isLoading || !prompt.trim() || !geminiApiKeyExists }, isLoading ? /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ React119__default.createElement(WandSparkles, { className: "mr-2 h-4 w-4" }), "Generate Question")))), /* @__PURE__ */ React119__default.createElement(APIKeyManagerModal, { isOpen: isApiKeyManagerModalOpen, onClose: handleApiKeyModalClose }));
73110
+ } }, /* @__PURE__ */ React119__default.createElement(DialogContent2, { className: "sm:max-w-[700px]" }, /* @__PURE__ */ React119__default.createElement(DialogHeader, null, /* @__PURE__ */ React119__default.createElement(DialogTitle2, { className: "flex items-center font-headline text-2xl" }, /* @__PURE__ */ React119__default.createElement(WandSparkles, { className: "mr-2 h-6 w-6 text-primary" }), " AI Question Generator"), /* @__PURE__ */ React119__default.createElement(DialogDescription2, null, "Provide metadata and optional info to generate a '", finalQuestionType, "' question.")), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-4 py-4 max-h-[60vh] overflow-y-auto px-2" }, /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-2 gap-4" }, !questionTypeProp && /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Question Type"), /* @__PURE__ */ React119__default.createElement(Select2, { value: selectedQuestionType, onValueChange: (v) => setSelectedQuestionType(v) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, supportedQuestionTypesForAI.map((type) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: type.value, value: type.value }, type.label))))), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Language"), /* @__PURE__ */ React119__default.createElement(Select2, { value: selectedLanguage, onValueChange: setSelectedLanguage }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, availableLanguages.map((lang) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: lang.value, value: lang.value }, lang.label)))))), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-additional-info" }, "Additional Info (Optional)"), /* @__PURE__ */ React119__default.createElement(Textarea, { id: "ai-additional-info", value: additionalInfo, onChange: (e2) => setAdditionalInfo(e2.target.value), placeholder: "Provide extra context, a specific topic, or a detailed prompt for the AI...", className: "min-h-[100px]" })), /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Subject *"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.subjects, value: subjectCode, onChange: handleSubjectChange, placeholder: "Select Subject..." })), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Category *"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.categories, value: categoryCode, onChange: handleCategoryChange, placeholder: "Select Category...", disabled: !subjectCode })), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Topic *"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.topics, value: topicCode, onChange: setTopicCode, placeholder: "Select Topic...", disabled: !categoryCode })), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Grade Level *"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.gradeLevels, value: gradeBand, onChange: setGradeBand, placeholder: "Select Grade..." })), /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React119__default.createElement(Label2, null, "Bloom's Level *"), /* @__PURE__ */ React119__default.createElement(EditableCombobox, { options: comboboxOptions.bloomLevels, value: bloomLevelCode, onChange: setBloomLevelCode, placeholder: "Select Bloom's Level..." }))), finalQuestionType === "multiple_choice" && /* @__PURE__ */ React119__default.createElement("div", { className: "space-y-2 pt-4 border-t" }, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "ai-num-options" }, "Number of Options (2-8)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "ai-num-options", type: "number", value: numberOfOptions, onChange: (e2) => setNumberOfOptions(parseInt(e2.target.value, 10)), min: 2, max: 8 })), error && /* @__PURE__ */ React119__default.createElement("p", { className: "text-sm text-destructive flex items-center mt-2" }, /* @__PURE__ */ React119__default.createElement(TriangleAlert, { className: "mr-1 h-4 w-4" }), " ", error)), /* @__PURE__ */ React119__default.createElement(DialogFooter, null, /* @__PURE__ */ React119__default.createElement(DialogClose2, { asChild: true }, /* @__PURE__ */ React119__default.createElement(Button, { type: "button", variant: "outline" }, "Cancel")), /* @__PURE__ */ React119__default.createElement(Button, { type: "button", onClick: handleSubmit, disabled: isLoading || !geminiApiKeyExists || !subjectCode || !categoryCode || !topicCode || !gradeBand || !bloomLevelCode }, isLoading ? /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ React119__default.createElement(WandSparkles, { className: "mr-2 h-4 w-4" }), "Generate Question")))), /* @__PURE__ */ React119__default.createElement(APIKeyManagerModal, { isOpen: isApiKeyManagerModalOpen, onClose: handleApiKeyModalClose }));
73119
73111
  };
73120
73112
 
73121
73113
  // src/react-ui/components/authoring/AIFullQuizGeneratorModal.tsx
@@ -77831,7 +77823,7 @@ function ApproachManager({
77831
77823
  };
77832
77824
  const handleEditItem = (item) => {
77833
77825
  setCurrentItem(item);
77834
- setFormState(item);
77826
+ setFormState({ ...item, difficulty: Array.isArray(item.difficulty) ? item.difficulty : [item.difficulty] });
77835
77827
  setIsDialogOpen(true);
77836
77828
  };
77837
77829
  const handleDeleteItem = (item) => {
@@ -77924,11 +77916,18 @@ function ApproachManager({
77924
77916
  await onBulkAdd(validatedRecords);
77925
77917
  }
77926
77918
  };
77927
- return /* @__PURE__ */ React119__default.createElement(Card, null, /* @__PURE__ */ React119__default.createElement(CardHeader, null, /* @__PURE__ */ React119__default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React119__default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React119__default.createElement(Settings2, { className: "mr-2 h-5 w-5 text-primary" }), " Manage Approaches"), /* @__PURE__ */ React119__default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React119__default.createElement(MetadataImportControls, { metadataName: "Approaches", onImport: handleImport }), /* @__PURE__ */ React119__default.createElement(Button, { onClick: handleAddItem, size: "sm" }, /* @__PURE__ */ React119__default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Approach")))), /* @__PURE__ */ React119__default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React119__default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : items.length === 0 ? /* @__PURE__ */ React119__default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No Approaches found.") : /* @__PURE__ */ React119__default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React119__default.createElement(Table2, null, /* @__PURE__ */ React119__default.createElement(TableHeader, null, /* @__PURE__ */ React119__default.createElement(TableRow, null, /* @__PURE__ */ React119__default.createElement(TableHead, null, "Approach ID"), /* @__PURE__ */ React119__default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React119__default.createElement(TableHead, null, "Verb (VI)"), /* @__PURE__ */ React119__default.createElement(TableHead, null, "Cognitive Level"), /* @__PURE__ */ React119__default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React119__default.createElement(TableBody, null, items.map((item) => /* @__PURE__ */ React119__default.createElement(TableRow, { key: item.id }, /* @__PURE__ */ React119__default.createElement(TableCell, { className: "font-Medium" }, item.code), /* @__PURE__ */ React119__default.createElement(TableCell, null, item.name), /* @__PURE__ */ React119__default.createElement(TableCell, null, item.verbVi), /* @__PURE__ */ React119__default.createElement(TableCell, null, item.bloomLevelCode), /* @__PURE__ */ React119__default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React119__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleEditItem(item), className: "mr-2" }, /* @__PURE__ */ React119__default.createElement(PenLine, { className: "h-4 w-4" })), /* @__PURE__ */ React119__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteItem(item), className: "text-destructive hover:text-destructive" }, /* @__PURE__ */ React119__default.createElement(Trash2, { className: "h-4 w-4" })))))))), /* @__PURE__ */ React119__default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React119__default.createElement(DialogContent2, { className: "sm:max-w-2xl max-h-[90vh] overflow-y-auto" }, /* @__PURE__ */ React119__default.createElement(DialogHeader, null, /* @__PURE__ */ React119__default.createElement(DialogTitle2, null, currentItem ? "Edit Approach" : "Add New Approach")), /* @__PURE__ */ React119__default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "code" }, "Approach Code"), /* @__PURE__ */ React119__default.createElement(Input, { id: "code", value: formState.code || "", onChange: (e2) => setFormState((s2) => ({ ...s2, code: e2.target.value.toUpperCase() })), placeholder: "e.g., REM-FAC-IDT-MCQ", disabled: !!currentItem })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "name" }, "Name / Description"), /* @__PURE__ */ React119__default.createElement(Input, { id: "name", value: formState.name || "", onChange: (e2) => setFormState((s2) => ({ ...s2, name: e2.target.value })), placeholder: "e.g., Identify a Fact" }))), /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "verbEn" }, "Verb (English)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "verbEn", value: formState.verbEn || "", onChange: (e2) => setFormState((s2) => ({ ...s2, verbEn: e2.target.value })), placeholder: "e.g., Identify" })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "verbVi" }, "Verb (Vietnamese)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "verbVi", value: formState.verbVi || "", onChange: (e2) => setFormState((s2) => ({ ...s2, verbVi: e2.target.value })), placeholder: "e.g., Nh\u1EADn d\u1EA1ng" }))), /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "bloomLevelCode" }, "Cognitive Level"), /* @__PURE__ */ React119__default.createElement(Select2, { value: formState.bloomLevelCode, onValueChange: (v) => setFormState((s2) => ({ ...s2, bloomLevelCode: v })) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, bloomLevels.map((level) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: level.code, value: level.code }, level.name))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "knowledgeDimension" }, "Knowledge Dimension"), /* @__PURE__ */ React119__default.createElement(Select2, { value: formState.knowledgeDimension, onValueChange: (v) => setFormState((s2) => ({ ...s2, knowledgeDimension: v })) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, knowledgeDimensions.map((kd) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: kd, value: kd }, kd))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "iSpringQuizType" }, "iSpring Quiz Type"), /* @__PURE__ */ React119__default.createElement(Select2, { value: formState.iSpringQuizType, onValueChange: (v) => setFormState((s2) => ({ ...s2, iSpringQuizType: v })) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, questionTypes.map((qt) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: qt.code, value: qt.code }, qt.name)))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, null, "Difficulty"), /* @__PURE__ */ React119__default.createElement("div", { className: "flex items-center space-x-4 pt-2" }, standardDifficulties.map((diff2) => /* @__PURE__ */ React119__default.createElement("div", { key: diff2, className: "flex items-center space-x-2" }, /* @__PURE__ */ React119__default.createElement(Checkbox2, { id: `diff-${diff2}`, checked: (formState.difficulty || []).includes(diff2), onCheckedChange: (checked) => {
77928
- const current = formState.difficulty || [];
77929
- const newDiff = checked ? [...current, diff2] : current.filter((d) => d !== diff2);
77930
- setFormState((s2) => ({ ...s2, difficulty: newDiff }));
77931
- } }), /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: `diff-${diff2}` }, diff2))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "suggestContext" }, "Suggest Context (comma-separated codes)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "suggestContext", value: formState.suggestContext || "", onChange: (e2) => setFormState((s2) => ({ ...s2, suggestContext: e2.target.value })), placeholder: "e.g., A, B, D, G, H" })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "exampleEn" }, "Example (English)"), /* @__PURE__ */ React119__default.createElement(Textarea, { id: "exampleEn", value: formState.exampleEn || "", onChange: (e2) => setFormState((s2) => ({ ...s2, exampleEn: e2.target.value })), placeholder: "English example prompt..." })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "exampleVi" }, "Example (Vietnamese)"), /* @__PURE__ */ React119__default.createElement(Textarea, { id: "exampleVi", value: formState.exampleVi || "", onChange: (e2) => setFormState((s2) => ({ ...s2, exampleVi: e2.target.value })), placeholder: "Vietnamese example prompt..." }))), /* @__PURE__ */ React119__default.createElement(DialogFooter, null, /* @__PURE__ */ React119__default.createElement(Button, { type: "button", variant: "outline", onClick: () => setIsDialogOpen(false), disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__default.createElement(Button, { type: "submit", onClick: handleSubmit, disabled: isPending }, isPending && /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Save")))), /* @__PURE__ */ React119__default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React119__default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React119__default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React119__default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React119__default.createElement(AlertDialogDescription2, null, 'This will permanently delete "', itemToDelete?.code, '".')), /* @__PURE__ */ React119__default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React119__default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__default.createElement(AlertDialogAction2, { onClick: confirmDelete, disabled: isPending, className: "bg-destructive hover:bg-destructive/90" }, isPending && /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Delete"))))));
77919
+ return /* @__PURE__ */ React119__default.createElement(Card, null, /* @__PURE__ */ React119__default.createElement(CardHeader, null, /* @__PURE__ */ React119__default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React119__default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React119__default.createElement(Settings2, { className: "mr-2 h-5 w-5 text-primary" }), " Manage Approaches"), /* @__PURE__ */ React119__default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React119__default.createElement(MetadataImportControls, { metadataName: "Approaches", onImport: handleImport }), /* @__PURE__ */ React119__default.createElement(Button, { onClick: handleAddItem, size: "sm" }, /* @__PURE__ */ React119__default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Approach")))), /* @__PURE__ */ React119__default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React119__default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : items.length === 0 ? /* @__PURE__ */ React119__default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No Approaches found.") : /* @__PURE__ */ React119__default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React119__default.createElement(Table2, null, /* @__PURE__ */ React119__default.createElement(TableHeader, null, /* @__PURE__ */ React119__default.createElement(TableRow, null, /* @__PURE__ */ React119__default.createElement(TableHead, null, "Approach ID"), /* @__PURE__ */ React119__default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React119__default.createElement(TableHead, null, "Verb (VI)"), /* @__PURE__ */ React119__default.createElement(TableHead, null, "Cognitive Level"), /* @__PURE__ */ React119__default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React119__default.createElement(TableBody, null, items.map((item) => /* @__PURE__ */ React119__default.createElement(TableRow, { key: item.id }, /* @__PURE__ */ React119__default.createElement(TableCell, { className: "font-Medium" }, item.code), /* @__PURE__ */ React119__default.createElement(TableCell, null, item.name), /* @__PURE__ */ React119__default.createElement(TableCell, null, item.verbVi), /* @__PURE__ */ React119__default.createElement(TableCell, null, item.bloomLevelCode), /* @__PURE__ */ React119__default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React119__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleEditItem(item), className: "mr-2" }, /* @__PURE__ */ React119__default.createElement(PenLine, { className: "h-4 w-4" })), /* @__PURE__ */ React119__default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteItem(item), className: "text-destructive hover:text-destructive" }, /* @__PURE__ */ React119__default.createElement(Trash2, { className: "h-4 w-4" })))))))), /* @__PURE__ */ React119__default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React119__default.createElement(DialogContent2, { className: "sm:max-w-2xl max-h-[90vh] overflow-y-auto" }, /* @__PURE__ */ React119__default.createElement(DialogHeader, null, /* @__PURE__ */ React119__default.createElement(DialogTitle2, null, currentItem ? "Edit Approach" : "Add New Approach")), /* @__PURE__ */ React119__default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "code" }, "Approach Code"), /* @__PURE__ */ React119__default.createElement(Input, { id: "code", value: formState.code || "", onChange: (e2) => setFormState((s2) => ({ ...s2, code: e2.target.value.toUpperCase() })), placeholder: "e.g., REM-FAC-IDT-MCQ", disabled: !!currentItem })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "name" }, "Name / Description"), /* @__PURE__ */ React119__default.createElement(Input, { id: "name", value: formState.name || "", onChange: (e2) => setFormState((s2) => ({ ...s2, name: e2.target.value })), placeholder: "e.g., Identify a Fact" }))), /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "verbEn" }, "Verb (English)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "verbEn", value: formState.verbEn || "", onChange: (e2) => setFormState((s2) => ({ ...s2, verbEn: e2.target.value })), placeholder: "e.g., Identify" })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "verbVi" }, "Verb (Vietnamese)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "verbVi", value: formState.verbVi || "", onChange: (e2) => setFormState((s2) => ({ ...s2, verbVi: e2.target.value })), placeholder: "e.g., Nh\u1EADn d\u1EA1ng" }))), /* @__PURE__ */ React119__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4" }, /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "bloomLevelCode" }, "Cognitive Level"), /* @__PURE__ */ React119__default.createElement(Select2, { value: formState.bloomLevelCode, onValueChange: (v) => setFormState((s2) => ({ ...s2, bloomLevelCode: v })) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, bloomLevels.map((level) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: level.code, value: level.code }, level.name))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "knowledgeDimension" }, "Knowledge Dimension"), /* @__PURE__ */ React119__default.createElement(Select2, { value: formState.knowledgeDimension, onValueChange: (v) => setFormState((s2) => ({ ...s2, knowledgeDimension: v })) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, knowledgeDimensions.map((kd) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: kd, value: kd }, kd))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "iSpringQuizType" }, "iSpring Quiz Type"), /* @__PURE__ */ React119__default.createElement(Select2, { value: formState.iSpringQuizType, onValueChange: (v) => setFormState((s2) => ({ ...s2, iSpringQuizType: v })) }, /* @__PURE__ */ React119__default.createElement(SelectTrigger2, null, /* @__PURE__ */ React119__default.createElement(SelectValue2, null)), /* @__PURE__ */ React119__default.createElement(SelectContent2, null, questionTypes.map((qt) => /* @__PURE__ */ React119__default.createElement(SelectItem2, { key: qt.code, value: qt.code }, qt.name)))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, null, "Difficulty"), /* @__PURE__ */ React119__default.createElement("div", { className: "flex items-center space-x-4 pt-2" }, standardDifficulties.map((diff2) => /* @__PURE__ */ React119__default.createElement("div", { key: diff2, className: "flex items-center space-x-2" }, /* @__PURE__ */ React119__default.createElement(
77920
+ Checkbox2,
77921
+ {
77922
+ id: `diff-${diff2}`,
77923
+ checked: (formState.difficulty || []).includes(diff2),
77924
+ onCheckedChange: (checked) => {
77925
+ const current = formState.difficulty || [];
77926
+ const newDiff = checked ? [...current, diff2] : current.filter((d) => d !== diff2);
77927
+ setFormState((s2) => ({ ...s2, difficulty: newDiff }));
77928
+ }
77929
+ }
77930
+ ), /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: `diff-${diff2}` }, diff2))))), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "suggestContext" }, "Suggest Context (comma-separated codes)"), /* @__PURE__ */ React119__default.createElement(Input, { id: "suggestContext", value: formState.suggestContext || "", onChange: (e2) => setFormState((s2) => ({ ...s2, suggestContext: e2.target.value })), placeholder: "e.g., A, B, D, G, H" })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "exampleEn" }, "Example (English)"), /* @__PURE__ */ React119__default.createElement(Textarea, { id: "exampleEn", value: formState.exampleEn || "", onChange: (e2) => setFormState((s2) => ({ ...s2, exampleEn: e2.target.value })), placeholder: "English example prompt..." })), /* @__PURE__ */ React119__default.createElement("div", null, /* @__PURE__ */ React119__default.createElement(Label2, { htmlFor: "exampleVi" }, "Example (Vietnamese)"), /* @__PURE__ */ React119__default.createElement(Textarea, { id: "exampleVi", value: formState.exampleVi || "", onChange: (e2) => setFormState((s2) => ({ ...s2, exampleVi: e2.target.value })), placeholder: "Vietnamese example prompt..." }))), /* @__PURE__ */ React119__default.createElement(DialogFooter, null, /* @__PURE__ */ React119__default.createElement(Button, { type: "button", variant: "outline", onClick: () => setIsDialogOpen(false), disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__default.createElement(Button, { type: "submit", onClick: handleSubmit, disabled: isPending }, isPending && /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Save")))), /* @__PURE__ */ React119__default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React119__default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React119__default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React119__default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React119__default.createElement(AlertDialogDescription2, null, 'This will permanently delete "', itemToDelete?.code, '".')), /* @__PURE__ */ React119__default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React119__default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__default.createElement(AlertDialogAction2, { onClick: confirmDelete, disabled: isPending, className: "bg-destructive hover:bg-destructive/90" }, isPending && /* @__PURE__ */ React119__default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Delete"))))));
77932
77931
  }
77933
77932
 
77934
77933
  // src/react-ui/components/metadata/MetadataTabs.tsx