@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.
- package/dist/authoring.cjs +78 -79
- package/dist/authoring.d.cts +1 -1
- package/dist/authoring.d.ts +1 -1
- package/dist/authoring.mjs +78 -79
- package/dist/react-ui.cjs +78 -79
- package/dist/react-ui.d.cts +1 -1
- package/dist/react-ui.d.ts +1 -1
- package/dist/react-ui.mjs +78 -79
- package/dist/{toaster-DAXYZdrz.d.ts → toaster-B2MPZYhi.d.ts} +2 -1
- package/dist/{toaster-6AR8w2TO.d.cts → toaster-Bvhmyef9.d.cts} +2 -1
- package/package.json +1 -1
package/dist/authoring.mjs
CHANGED
|
@@ -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(
|
|
71609
|
+
const [inputValue, setInputValue] = React119.useState("");
|
|
71610
71610
|
React119.useEffect(() => {
|
|
71611
|
-
|
|
71612
|
-
|
|
71613
|
-
|
|
71614
|
-
|
|
71615
|
-
|
|
71616
|
-
|
|
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
|
|
71620
|
-
|
|
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:
|
|
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 [
|
|
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
|
-
|
|
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(
|
|
72985
|
-
|
|
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 (!
|
|
72992
|
-
setError("Please
|
|
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:
|
|
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:
|
|
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:
|
|
73065
|
+
generatedResult = await generateSequenceQuestion({ ...baseClientInput, numberOfItems: 4 }, geminiKey);
|
|
73039
73066
|
break;
|
|
73040
73067
|
case "matching":
|
|
73041
|
-
generatedResult = await generateMatchingQuestion({ ...baseClientInput, numberOfPairs:
|
|
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-[
|
|
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(
|
|
77928
|
-
|
|
77929
|
-
|
|
77930
|
-
|
|
77931
|
-
|
|
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
|