@thanh01.pmt/interactive-quiz-kit 1.0.71 → 1.0.73
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/ai.cjs +24 -14
- package/dist/ai.mjs +24 -14
- package/dist/authoring.cjs +311 -56
- package/dist/authoring.d.cts +1 -1
- package/dist/authoring.d.ts +1 -1
- package/dist/authoring.mjs +311 -56
- package/dist/react-ui.cjs +311 -56
- package/dist/react-ui.d.cts +1 -1
- package/dist/react-ui.d.ts +1 -1
- package/dist/react-ui.mjs +311 -56
- package/dist/{toaster-BWaJj0l-.d.cts → toaster-6AR8w2TO.d.cts} +3 -3
- package/dist/{toaster-BVaUJA6E.d.ts → toaster-DAXYZdrz.d.ts} +3 -3
- package/package.json +1 -1
package/dist/authoring.cjs
CHANGED
|
@@ -8832,12 +8832,10 @@ init_react_shim();
|
|
|
8832
8832
|
// src/services/TopicDataService.ts
|
|
8833
8833
|
init_react_shim();
|
|
8834
8834
|
var TopicDataService = class {
|
|
8835
|
-
// ... saveData, mergeData, getData, clearData methods remain the same ...
|
|
8836
8835
|
static saveData(data) {
|
|
8837
8836
|
try {
|
|
8838
8837
|
if (typeof window === "undefined") return;
|
|
8839
|
-
|
|
8840
|
-
localStorage.setItem(this.STORAGE_KEY, serializedData);
|
|
8838
|
+
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
|
|
8841
8839
|
} catch (error) {
|
|
8842
8840
|
console.error("Error saving learning objectives to Local Storage:", error);
|
|
8843
8841
|
}
|
|
@@ -8848,8 +8846,7 @@ var TopicDataService = class {
|
|
|
8848
8846
|
newData.forEach((newLo) => {
|
|
8849
8847
|
loMap.set(newLo.code, newLo);
|
|
8850
8848
|
});
|
|
8851
|
-
|
|
8852
|
-
this.saveData(mergedData);
|
|
8849
|
+
this.saveData(Array.from(loMap.values()));
|
|
8853
8850
|
}
|
|
8854
8851
|
static getData() {
|
|
8855
8852
|
try {
|
|
@@ -8864,7 +8861,7 @@ var TopicDataService = class {
|
|
|
8864
8861
|
}
|
|
8865
8862
|
static clearData() {
|
|
8866
8863
|
try {
|
|
8867
|
-
if (typeof window
|
|
8864
|
+
if (typeof window !== "undefined") return;
|
|
8868
8865
|
localStorage.removeItem(this.STORAGE_KEY);
|
|
8869
8866
|
} catch (error) {
|
|
8870
8867
|
console.error("Error clearing learning objectives from Local Storage:", error);
|
|
@@ -8878,6 +8875,12 @@ var TopicDataService = class {
|
|
|
8878
8875
|
const headerLine = lines.shift();
|
|
8879
8876
|
const headers = headerLine.split(" ").map((h2) => h2.trim());
|
|
8880
8877
|
const headerMap = headers.map((h2) => this.HEADER_MAP[h2] || null);
|
|
8878
|
+
const requiredHeaders = ["LO ID", "LO Name", "Subject", "Subject Code", "Category", "Category Code", "Topic", "Topic Code", "Grade", "Grade Code"];
|
|
8879
|
+
const missingHeaders = requiredHeaders.filter((h2) => !headers.includes(h2));
|
|
8880
|
+
if (missingHeaders.length > 0) {
|
|
8881
|
+
const errorMsg = `Invalid TSV header. Missing required columns: ${missingHeaders.join(", ")}`;
|
|
8882
|
+
return { data: [], errors: [errorMsg] };
|
|
8883
|
+
}
|
|
8881
8884
|
const data = [];
|
|
8882
8885
|
const errors2 = [];
|
|
8883
8886
|
lines.forEach((line, index3) => {
|
|
@@ -8886,29 +8889,30 @@ var TopicDataService = class {
|
|
|
8886
8889
|
headerMap.forEach((propName, i) => {
|
|
8887
8890
|
if (propName) {
|
|
8888
8891
|
const value = values[i]?.trim() || "";
|
|
8889
|
-
if (
|
|
8892
|
+
if (["keywords", "stemElements", "bloomLevelsGuideline"].includes(propName)) {
|
|
8890
8893
|
rowObject[propName] = value.split(",").map((s2) => s2.trim()).filter(Boolean);
|
|
8891
8894
|
} else {
|
|
8892
8895
|
rowObject[propName] = value;
|
|
8893
8896
|
}
|
|
8894
8897
|
}
|
|
8895
8898
|
});
|
|
8896
|
-
if (!rowObject.code) {
|
|
8897
|
-
errors2.push(`Line ${index3 + 2}: Missing required
|
|
8899
|
+
if (!rowObject.code || !rowObject.name) {
|
|
8900
|
+
errors2.push(`Line ${index3 + 2}: Missing required values for 'LO ID' or 'LO Name'.`);
|
|
8898
8901
|
return;
|
|
8899
8902
|
}
|
|
8900
|
-
if (!rowObject.name) {
|
|
8901
|
-
rowObject.name = rowObject.code;
|
|
8902
|
-
}
|
|
8903
8903
|
const learningObjective = {
|
|
8904
8904
|
id: generateUniqueId("lo_"),
|
|
8905
8905
|
code: rowObject.code,
|
|
8906
8906
|
name: rowObject.name,
|
|
8907
8907
|
description: rowObject.description,
|
|
8908
8908
|
subject: rowObject.subject || "",
|
|
8909
|
+
subjectCode: rowObject.subjectCode,
|
|
8909
8910
|
category: rowObject.category || "",
|
|
8911
|
+
categoryCode: rowObject.categoryCode,
|
|
8910
8912
|
topic: rowObject.topic || "",
|
|
8913
|
+
topicCode: rowObject.topicCode,
|
|
8911
8914
|
grade: rowObject.grade || "",
|
|
8915
|
+
gradeCode: rowObject.gradeCode,
|
|
8912
8916
|
keywords: rowObject.keywords || [],
|
|
8913
8917
|
stemElements: rowObject.stemElements || [],
|
|
8914
8918
|
bloomLevelsGuideline: rowObject.bloomLevelsGuideline || []
|
|
@@ -8939,17 +8943,23 @@ var TopicDataService = class {
|
|
|
8939
8943
|
}
|
|
8940
8944
|
};
|
|
8941
8945
|
TopicDataService.STORAGE_KEY = "interactive_quiz_kit_learning_objectives";
|
|
8942
|
-
// Define a map for flexible header mapping
|
|
8943
8946
|
TopicDataService.HEADER_MAP = {
|
|
8944
8947
|
"LO ID": "code",
|
|
8945
8948
|
"LO Name": "name",
|
|
8946
|
-
// Ready for future addition
|
|
8947
8949
|
"LO Description": "description",
|
|
8948
8950
|
"Subject": "subject",
|
|
8951
|
+
"Subject Code": "subjectCode",
|
|
8952
|
+
// New
|
|
8949
8953
|
"Category": "category",
|
|
8954
|
+
"Category Code": "categoryCode",
|
|
8955
|
+
// New
|
|
8950
8956
|
"Topic": "topic",
|
|
8957
|
+
"Topic Code": "topicCode",
|
|
8958
|
+
// New
|
|
8951
8959
|
"Keywords": "keywords",
|
|
8952
8960
|
"Grade": "grade",
|
|
8961
|
+
"Grade Code": "gradeCode",
|
|
8962
|
+
// New
|
|
8953
8963
|
"STEM Element(s)": "stemElements",
|
|
8954
8964
|
"Bloom\u2019s Level(s) Guideline": "bloomLevelsGuideline"
|
|
8955
8965
|
};
|
|
@@ -77294,15 +77304,27 @@ function QuestionTypeManager({ initialData, isLoading: isLoadingProp, onAdd, onU
|
|
|
77294
77304
|
|
|
77295
77305
|
// src/react-ui/components/metadata/LearningObjectiveManager.tsx
|
|
77296
77306
|
init_react_shim();
|
|
77297
|
-
function LearningObjectiveManager({
|
|
77307
|
+
function LearningObjectiveManager({
|
|
77308
|
+
initialData,
|
|
77309
|
+
subjects: subjectsProp,
|
|
77310
|
+
isLoading: isLoadingProp,
|
|
77311
|
+
onAdd,
|
|
77312
|
+
onUpdate,
|
|
77313
|
+
onDelete,
|
|
77314
|
+
onBulkAdd
|
|
77315
|
+
}) {
|
|
77298
77316
|
const [items, setItems] = React119.useState([]);
|
|
77299
77317
|
const [subjects, setSubjects] = React119.useState([]);
|
|
77300
77318
|
const [isLoading, setIsLoading] = React119.useState(true);
|
|
77301
77319
|
const [isDialogOpen, setIsDialogOpen] = React119.useState(false);
|
|
77302
77320
|
const [isAlertOpen, setIsAlertOpen] = React119.useState(false);
|
|
77303
|
-
const [currentItem, setCurrentItem] = React119.useState(
|
|
77321
|
+
const [currentItem, setCurrentItem] = React119.useState(
|
|
77322
|
+
null
|
|
77323
|
+
);
|
|
77304
77324
|
const [formState, setFormState] = React119.useState({});
|
|
77305
|
-
const [itemToDelete, setItemToDelete] = React119.useState(
|
|
77325
|
+
const [itemToDelete, setItemToDelete] = React119.useState(
|
|
77326
|
+
null
|
|
77327
|
+
);
|
|
77306
77328
|
const [isPending, startTransition] = React119.useTransition();
|
|
77307
77329
|
const { toast: toast2 } = useToast();
|
|
77308
77330
|
const isControlled = initialData !== void 0;
|
|
@@ -77313,7 +77335,11 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
|
|
|
77313
77335
|
setItems(MetadataService.getLearningObjectives());
|
|
77314
77336
|
setSubjects(MetadataService.getSubjects());
|
|
77315
77337
|
} catch (error) {
|
|
77316
|
-
toast2({
|
|
77338
|
+
toast2({
|
|
77339
|
+
title: "Error",
|
|
77340
|
+
description: "Failed to refresh data.",
|
|
77341
|
+
variant: "destructive"
|
|
77342
|
+
});
|
|
77317
77343
|
} finally {
|
|
77318
77344
|
setIsLoading(false);
|
|
77319
77345
|
}
|
|
@@ -77333,7 +77359,9 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
|
|
|
77333
77359
|
};
|
|
77334
77360
|
const handleAddItem = () => {
|
|
77335
77361
|
setCurrentItem(null);
|
|
77336
|
-
setFormState({
|
|
77362
|
+
setFormState({
|
|
77363
|
+
subjectCode: subjects.length > 0 ? subjects[0].code : ""
|
|
77364
|
+
});
|
|
77337
77365
|
setIsDialogOpen(true);
|
|
77338
77366
|
};
|
|
77339
77367
|
const handleEditItem = (item) => {
|
|
@@ -77355,9 +77383,16 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
|
|
|
77355
77383
|
MetadataService.deleteLearningObjective(itemToDelete.code);
|
|
77356
77384
|
refreshData();
|
|
77357
77385
|
}
|
|
77358
|
-
toast2({
|
|
77386
|
+
toast2({
|
|
77387
|
+
title: "Success",
|
|
77388
|
+
description: `Learning Objective "${itemToDelete.name}" deleted.`
|
|
77389
|
+
});
|
|
77359
77390
|
} catch (error) {
|
|
77360
|
-
toast2({
|
|
77391
|
+
toast2({
|
|
77392
|
+
title: "Error",
|
|
77393
|
+
description: error.message,
|
|
77394
|
+
variant: "destructive"
|
|
77395
|
+
});
|
|
77361
77396
|
} finally {
|
|
77362
77397
|
setIsAlertOpen(false);
|
|
77363
77398
|
setItemToDelete(null);
|
|
@@ -77366,7 +77401,11 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
|
|
|
77366
77401
|
};
|
|
77367
77402
|
const handleSubmit = () => {
|
|
77368
77403
|
if (!formState.name?.trim() || !formState.code?.trim()) {
|
|
77369
|
-
toast2({
|
|
77404
|
+
toast2({
|
|
77405
|
+
title: "Validation Error",
|
|
77406
|
+
description: "Code and Name are required.",
|
|
77407
|
+
variant: "destructive"
|
|
77408
|
+
});
|
|
77370
77409
|
return;
|
|
77371
77410
|
}
|
|
77372
77411
|
startTransition(async () => {
|
|
@@ -77375,75 +77414,291 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
|
|
|
77375
77414
|
if (isControlled && onUpdate) {
|
|
77376
77415
|
await onUpdate({ ...currentItem, ...formState });
|
|
77377
77416
|
} else {
|
|
77378
|
-
MetadataService.updateLearningObjective(
|
|
77417
|
+
MetadataService.updateLearningObjective(
|
|
77418
|
+
currentItem.id,
|
|
77419
|
+
formState
|
|
77420
|
+
);
|
|
77379
77421
|
refreshData();
|
|
77380
77422
|
}
|
|
77381
|
-
toast2({
|
|
77423
|
+
toast2({
|
|
77424
|
+
title: "Success",
|
|
77425
|
+
description: "Learning Objective updated."
|
|
77426
|
+
});
|
|
77382
77427
|
} else {
|
|
77383
77428
|
if (isControlled && onAdd) {
|
|
77384
77429
|
await onAdd(formState);
|
|
77385
77430
|
} else {
|
|
77386
|
-
MetadataService.addLearningObjective(
|
|
77431
|
+
MetadataService.addLearningObjective(
|
|
77432
|
+
formState
|
|
77433
|
+
);
|
|
77387
77434
|
refreshData();
|
|
77388
77435
|
}
|
|
77389
|
-
toast2({
|
|
77436
|
+
toast2({
|
|
77437
|
+
title: "Success",
|
|
77438
|
+
description: "Learning Objective added."
|
|
77439
|
+
});
|
|
77390
77440
|
}
|
|
77391
77441
|
setIsDialogOpen(false);
|
|
77392
77442
|
} catch (error) {
|
|
77393
|
-
toast2({
|
|
77443
|
+
toast2({
|
|
77444
|
+
title: "Error",
|
|
77445
|
+
description: error.message,
|
|
77446
|
+
variant: "destructive"
|
|
77447
|
+
});
|
|
77394
77448
|
}
|
|
77395
77449
|
});
|
|
77396
77450
|
};
|
|
77397
77451
|
const handleImport = async (records) => {
|
|
77398
|
-
console.log(
|
|
77452
|
+
console.log(
|
|
77453
|
+
`[LO Manager] handleImport called with ${records.length} raw records.`
|
|
77454
|
+
);
|
|
77399
77455
|
if (!onBulkAdd) {
|
|
77400
77456
|
console.error("[LO Manager] onBulkAdd handler is not provided.");
|
|
77401
77457
|
return;
|
|
77402
77458
|
}
|
|
77403
77459
|
const parseStringToArray = (input) => {
|
|
77404
77460
|
if (Array.isArray(input)) return input;
|
|
77405
|
-
if (typeof input === "string")
|
|
77461
|
+
if (typeof input === "string")
|
|
77462
|
+
return input.split(",").map((s2) => s2.trim()).filter(Boolean);
|
|
77406
77463
|
return [];
|
|
77407
77464
|
};
|
|
77408
|
-
const validationResult = records.reduce(
|
|
77409
|
-
|
|
77410
|
-
|
|
77411
|
-
|
|
77412
|
-
|
|
77413
|
-
|
|
77414
|
-
|
|
77415
|
-
|
|
77416
|
-
|
|
77417
|
-
|
|
77418
|
-
|
|
77419
|
-
|
|
77420
|
-
|
|
77421
|
-
|
|
77422
|
-
|
|
77423
|
-
|
|
77424
|
-
|
|
77425
|
-
|
|
77426
|
-
|
|
77427
|
-
|
|
77428
|
-
|
|
77429
|
-
|
|
77430
|
-
|
|
77431
|
-
|
|
77465
|
+
const validationResult = records.reduce(
|
|
77466
|
+
(acc, rec) => {
|
|
77467
|
+
if (typeof rec["LO ID"] === "string" && rec["LO ID"].trim() && typeof rec["LO Description"] === "string" && rec["LO Description"].trim()) {
|
|
77468
|
+
acc.valid.push({
|
|
77469
|
+
code: rec["LO ID"],
|
|
77470
|
+
name: rec["LO ID"],
|
|
77471
|
+
description: rec["LO Description"],
|
|
77472
|
+
subject: rec["Subject"] || "",
|
|
77473
|
+
subjectCode: rec["Subject Code"] || rec["Subject"],
|
|
77474
|
+
category: rec["Category"] || "",
|
|
77475
|
+
categoryCode: rec["Category Code"] || rec["Category"],
|
|
77476
|
+
topic: rec["Topic"] || "",
|
|
77477
|
+
topicCode: rec["Topic Code"] || rec["Topic"],
|
|
77478
|
+
grade: rec["Grade"] || "",
|
|
77479
|
+
gradeCode: rec["Grade Code"] || rec["Grade"],
|
|
77480
|
+
keywords: parseStringToArray(rec["Keywords"]),
|
|
77481
|
+
stemElements: parseStringToArray(
|
|
77482
|
+
rec["STEM Element(s)"]
|
|
77483
|
+
),
|
|
77484
|
+
bloomLevelsGuideline: parseStringToArray(
|
|
77485
|
+
rec["Bloom\u2019s Level(s) Guideline"]
|
|
77486
|
+
)
|
|
77487
|
+
});
|
|
77488
|
+
} else {
|
|
77489
|
+
acc.invalidCount++;
|
|
77490
|
+
}
|
|
77491
|
+
return acc;
|
|
77492
|
+
},
|
|
77493
|
+
{ valid: [], invalidCount: 0 }
|
|
77494
|
+
);
|
|
77495
|
+
console.log(
|
|
77496
|
+
`[LO Manager] Validation complete. ${validationResult.valid.length} valid records found.`
|
|
77497
|
+
);
|
|
77432
77498
|
if (validationResult.invalidCount > 0) {
|
|
77433
77499
|
toast2({
|
|
77434
77500
|
title: "Import Warning",
|
|
77435
|
-
description: `${validationResult.invalidCount} records had invalid or missing '
|
|
77501
|
+
description: `${validationResult.invalidCount} records had invalid or missing 'LO ID' or 'LO Description' fields and were ignored.`,
|
|
77436
77502
|
variant: "destructive"
|
|
77437
77503
|
});
|
|
77438
77504
|
}
|
|
77439
77505
|
if (validationResult.valid.length > 0) {
|
|
77440
|
-
console.log(
|
|
77506
|
+
console.log(
|
|
77507
|
+
"[LO Manager] Calling onBulkAdd prop with validated data..."
|
|
77508
|
+
);
|
|
77441
77509
|
await onBulkAdd(validationResult.valid);
|
|
77442
77510
|
} else {
|
|
77443
77511
|
console.log("[LO Manager] No valid records to import.");
|
|
77444
77512
|
}
|
|
77445
77513
|
};
|
|
77446
|
-
return /* @__PURE__ */ React119__namespace.default.createElement(Card, null, /* @__PURE__ */ React119__namespace.default.createElement(CardHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React119__namespace.default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React119__namespace.default.createElement(Lightbulb, { className: "mr-2 h-5 w-5 text-primary" }), " Manage Learning Objectives"), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React119__namespace.default.createElement(MetadataImportControls, { metadataName: "Learning Objectives", onImport: handleImport }), /* @__PURE__ */ React119__namespace.default.createElement(Button, { onClick: handleAddItem, size: "sm" }, /* @__PURE__ */ React119__namespace.default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Learning Objective")))), /* @__PURE__ */ React119__namespace.default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : items.length === 0 ? /* @__PURE__ */ React119__namespace.default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No Learning Objectives found.") : /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(Table2, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(TableRow, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Subject"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Topic"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React119__namespace.default.createElement(TableBody, null, items.map((item) => /* @__PURE__ */ React119__namespace.default.createElement(TableRow, { key: item.id }, /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-mono text-xs" }, item.code), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-medium" }, item.name), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.subject || item.subjectCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.topic || item.topicCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React119__namespace.default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleEditItem(item), className: "mr-2" }, /* @__PURE__ */ React119__namespace.default.createElement(PenLine, { className: "h-4 w-4" })), /* @__PURE__ */ React119__namespace.default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteItem(item), className: "text-destructive hover:text-destructive" }, /* @__PURE__ */ React119__namespace.default.createElement(Trash2, { className: "h-4 w-4" })))))))), /* @__PURE__ */ React119__namespace.default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React119__namespace.default.createElement(DialogContent2, { className: "sm:max-w-2xl max-h-[90vh] overflow-y-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(DialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(DialogTitle2, null, currentItem ? "Edit Learning Objective" : "Add New Learning Objective")), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "code" }, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "code", value: formState.code || "", onChange: (e2) => handleFormChange("code", e2.target.value.toUpperCase()), disabled: !!currentItem })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "name" }, "Name (Description)"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "name", value: formState.name || "", onChange: (e2) => handleFormChange("name", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subject" }, "Subject Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "subject", value: formState.subject || "", onChange: (e2) => handleFormChange("subject", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject Code"), /* @__PURE__ */ React119__namespace.default.createElement(EditableCombobox, { options: subjects.map((s2) => ({ value: s2.code, label: s2.name })), value: formState.subjectCode || "", onChange: (val) => handleFormChange("subjectCode", val), placeholder: "Select a subject..." }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "category" }, "Category Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "category", value: formState.category || "", onChange: (e2) => handleFormChange("category", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "categoryCode" }, "Category Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "categoryCode", value: formState.categoryCode || "", onChange: (e2) => handleFormChange("categoryCode", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topic" }, "Topic Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "topic", value: formState.topic || "", onChange: (e2) => handleFormChange("topic", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topicCode" }, "Topic Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "topicCode", value: formState.topicCode || "", onChange: (e2) => handleFormChange("topicCode", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "grade" }, "Grade Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "grade", value: formState.grade || "", onChange: (e2) => handleFormChange("grade", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "gradeCode" }, "Grade Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "gradeCode", value: formState.gradeCode || "", onChange: (e2) => handleFormChange("gradeCode", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "keywords" }, "Keywords (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(Textarea, { id: "keywords", value: formState.keywords?.join(", ") || "", onChange: (e2) => handleFormChange("keywords", e2.target.value.split(",").map((s2) => s2.trim())) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "stemElements" }, "STEM Elements (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(Textarea, { id: "stemElements", value: formState.stemElements?.join(", ") || "", onChange: (e2) => handleFormChange("stemElements", e2.target.value.split(",").map((s2) => s2.trim())) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "bloomLevelsGuideline" }, "Bloom's Guideline (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(Textarea, { id: "bloomLevelsGuideline", value: formState.bloomLevelsGuideline?.join(", ") || "", onChange: (e2) => handleFormChange("bloomLevelsGuideline", e2.target.value.split(",").map((s2) => s2.trim())) }))), /* @__PURE__ */ React119__namespace.default.createElement(DialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(Button, { type: "button", variant: "outline", onClick: () => setIsDialogOpen(false), disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__namespace.default.createElement(Button, { type: "submit", onClick: handleSubmit, disabled: isPending || !formState.name?.trim() || !formState.code?.trim() }, isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Save")))), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogDescription2, null, 'This will permanently delete "', itemToDelete?.name, '".')), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogAction2, { onClick: confirmDelete, disabled: isPending, className: "bg-destructive hover:bg-destructive/90" }, isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Delete"))))));
|
|
77514
|
+
return /* @__PURE__ */ React119__namespace.default.createElement(Card, null, /* @__PURE__ */ React119__namespace.default.createElement(CardHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React119__namespace.default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React119__namespace.default.createElement(Lightbulb, { className: "mr-2 h-5 w-5 text-primary" }), " ", "Manage Learning Objectives"), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77515
|
+
MetadataImportControls,
|
|
77516
|
+
{
|
|
77517
|
+
metadataName: "Learning Objectives",
|
|
77518
|
+
onImport: handleImport
|
|
77519
|
+
}
|
|
77520
|
+
), /* @__PURE__ */ React119__namespace.default.createElement(Button, { onClick: handleAddItem, size: "sm" }, /* @__PURE__ */ React119__namespace.default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Learning Objective")))), /* @__PURE__ */ React119__namespace.default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : items.length === 0 ? /* @__PURE__ */ React119__namespace.default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No Learning Objectives found.") : /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(Table2, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(TableRow, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Subject"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Topic"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React119__namespace.default.createElement(TableBody, null, items.map((item) => /* @__PURE__ */ React119__namespace.default.createElement(TableRow, { key: item.id }, /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-mono text-xs" }, item.code), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-medium" }, item.name), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.subject || item.subjectCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.topic || item.topicCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77521
|
+
Button,
|
|
77522
|
+
{
|
|
77523
|
+
variant: "ghost",
|
|
77524
|
+
size: "icon",
|
|
77525
|
+
onClick: () => handleEditItem(item),
|
|
77526
|
+
className: "mr-2"
|
|
77527
|
+
},
|
|
77528
|
+
/* @__PURE__ */ React119__namespace.default.createElement(PenLine, { className: "h-4 w-4" })
|
|
77529
|
+
), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77530
|
+
Button,
|
|
77531
|
+
{
|
|
77532
|
+
variant: "ghost",
|
|
77533
|
+
size: "icon",
|
|
77534
|
+
onClick: () => handleDeleteItem(item),
|
|
77535
|
+
className: "text-destructive hover:text-destructive"
|
|
77536
|
+
},
|
|
77537
|
+
/* @__PURE__ */ React119__namespace.default.createElement(Trash2, { className: "h-4 w-4" })
|
|
77538
|
+
))))))), /* @__PURE__ */ React119__namespace.default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React119__namespace.default.createElement(DialogContent2, { className: "sm:max-w-2xl max-h-[90vh] overflow-y-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(DialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(DialogTitle2, null, currentItem ? "Edit Learning Objective" : "Add New Learning Objective")), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "code" }, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77539
|
+
Input,
|
|
77540
|
+
{
|
|
77541
|
+
id: "code",
|
|
77542
|
+
value: formState.code || "",
|
|
77543
|
+
onChange: (e2) => handleFormChange(
|
|
77544
|
+
"code",
|
|
77545
|
+
e2.target.value.toUpperCase()
|
|
77546
|
+
),
|
|
77547
|
+
disabled: !!currentItem
|
|
77548
|
+
}
|
|
77549
|
+
)), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "name" }, "Name (Description)"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77550
|
+
Input,
|
|
77551
|
+
{
|
|
77552
|
+
id: "name",
|
|
77553
|
+
value: formState.name || "",
|
|
77554
|
+
onChange: (e2) => handleFormChange(
|
|
77555
|
+
"name",
|
|
77556
|
+
e2.target.value
|
|
77557
|
+
)
|
|
77558
|
+
}
|
|
77559
|
+
))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subject" }, "Subject Name"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77560
|
+
Input,
|
|
77561
|
+
{
|
|
77562
|
+
id: "subject",
|
|
77563
|
+
value: formState.subject || "",
|
|
77564
|
+
onChange: (e2) => handleFormChange(
|
|
77565
|
+
"subject",
|
|
77566
|
+
e2.target.value
|
|
77567
|
+
)
|
|
77568
|
+
}
|
|
77569
|
+
)), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject Code"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77570
|
+
EditableCombobox,
|
|
77571
|
+
{
|
|
77572
|
+
options: subjects.map((s2) => ({
|
|
77573
|
+
value: s2.code,
|
|
77574
|
+
label: s2.name
|
|
77575
|
+
})),
|
|
77576
|
+
value: formState.subjectCode || "",
|
|
77577
|
+
onChange: (val) => handleFormChange("subjectCode", val),
|
|
77578
|
+
placeholder: "Select a subject..."
|
|
77579
|
+
}
|
|
77580
|
+
))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "category" }, "Category Name"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77581
|
+
Input,
|
|
77582
|
+
{
|
|
77583
|
+
id: "category",
|
|
77584
|
+
value: formState.category || "",
|
|
77585
|
+
onChange: (e2) => handleFormChange(
|
|
77586
|
+
"category",
|
|
77587
|
+
e2.target.value
|
|
77588
|
+
)
|
|
77589
|
+
}
|
|
77590
|
+
)), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "categoryCode" }, "Category Code"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77591
|
+
Input,
|
|
77592
|
+
{
|
|
77593
|
+
id: "categoryCode",
|
|
77594
|
+
value: formState.categoryCode || "",
|
|
77595
|
+
onChange: (e2) => handleFormChange(
|
|
77596
|
+
"categoryCode",
|
|
77597
|
+
e2.target.value
|
|
77598
|
+
)
|
|
77599
|
+
}
|
|
77600
|
+
))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topic" }, "Topic Name"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77601
|
+
Input,
|
|
77602
|
+
{
|
|
77603
|
+
id: "topic",
|
|
77604
|
+
value: formState.topic || "",
|
|
77605
|
+
onChange: (e2) => handleFormChange(
|
|
77606
|
+
"topic",
|
|
77607
|
+
e2.target.value
|
|
77608
|
+
)
|
|
77609
|
+
}
|
|
77610
|
+
)), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topicCode" }, "Topic Code"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77611
|
+
Input,
|
|
77612
|
+
{
|
|
77613
|
+
id: "topicCode",
|
|
77614
|
+
value: formState.topicCode || "",
|
|
77615
|
+
onChange: (e2) => handleFormChange(
|
|
77616
|
+
"topicCode",
|
|
77617
|
+
e2.target.value
|
|
77618
|
+
)
|
|
77619
|
+
}
|
|
77620
|
+
))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "grade" }, "Grade Name"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77621
|
+
Input,
|
|
77622
|
+
{
|
|
77623
|
+
id: "grade",
|
|
77624
|
+
value: formState.grade || "",
|
|
77625
|
+
onChange: (e2) => handleFormChange(
|
|
77626
|
+
"grade",
|
|
77627
|
+
e2.target.value
|
|
77628
|
+
)
|
|
77629
|
+
}
|
|
77630
|
+
)), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "gradeCode" }, "Grade Code"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77631
|
+
Input,
|
|
77632
|
+
{
|
|
77633
|
+
id: "gradeCode",
|
|
77634
|
+
value: formState.gradeCode || "",
|
|
77635
|
+
onChange: (e2) => handleFormChange(
|
|
77636
|
+
"gradeCode",
|
|
77637
|
+
e2.target.value
|
|
77638
|
+
)
|
|
77639
|
+
}
|
|
77640
|
+
))), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "keywords" }, "Keywords (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77641
|
+
Textarea,
|
|
77642
|
+
{
|
|
77643
|
+
id: "keywords",
|
|
77644
|
+
value: formState.keywords?.join(", ") || "",
|
|
77645
|
+
onChange: (e2) => handleFormChange(
|
|
77646
|
+
"keywords",
|
|
77647
|
+
e2.target.value.split(",").map((s2) => s2.trim())
|
|
77648
|
+
)
|
|
77649
|
+
}
|
|
77650
|
+
)), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "stemElements" }, "STEM Elements (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77651
|
+
Textarea,
|
|
77652
|
+
{
|
|
77653
|
+
id: "stemElements",
|
|
77654
|
+
value: formState.stemElements?.join(", ") || "",
|
|
77655
|
+
onChange: (e2) => handleFormChange(
|
|
77656
|
+
"stemElements",
|
|
77657
|
+
e2.target.value.split(",").map((s2) => s2.trim())
|
|
77658
|
+
)
|
|
77659
|
+
}
|
|
77660
|
+
)), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "bloomLevelsGuideline" }, "Bloom's Guideline (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77661
|
+
Textarea,
|
|
77662
|
+
{
|
|
77663
|
+
id: "bloomLevelsGuideline",
|
|
77664
|
+
value: formState.bloomLevelsGuideline?.join(
|
|
77665
|
+
", "
|
|
77666
|
+
) || "",
|
|
77667
|
+
onChange: (e2) => handleFormChange(
|
|
77668
|
+
"bloomLevelsGuideline",
|
|
77669
|
+
e2.target.value.split(",").map((s2) => s2.trim())
|
|
77670
|
+
)
|
|
77671
|
+
}
|
|
77672
|
+
))), /* @__PURE__ */ React119__namespace.default.createElement(DialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77673
|
+
Button,
|
|
77674
|
+
{
|
|
77675
|
+
type: "button",
|
|
77676
|
+
variant: "outline",
|
|
77677
|
+
onClick: () => setIsDialogOpen(false),
|
|
77678
|
+
disabled: isPending
|
|
77679
|
+
},
|
|
77680
|
+
"Cancel"
|
|
77681
|
+
), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77682
|
+
Button,
|
|
77683
|
+
{
|
|
77684
|
+
type: "submit",
|
|
77685
|
+
onClick: handleSubmit,
|
|
77686
|
+
disabled: isPending || !formState.name?.trim() || !formState.code?.trim()
|
|
77687
|
+
},
|
|
77688
|
+
isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }),
|
|
77689
|
+
" ",
|
|
77690
|
+
"Save"
|
|
77691
|
+
)))), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogDescription2, null, 'This will permanently delete "', itemToDelete?.name, '".')), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__namespace.default.createElement(
|
|
77692
|
+
AlertDialogAction2,
|
|
77693
|
+
{
|
|
77694
|
+
onClick: confirmDelete,
|
|
77695
|
+
disabled: isPending,
|
|
77696
|
+
className: "bg-destructive hover:bg-destructive/90"
|
|
77697
|
+
},
|
|
77698
|
+
isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }),
|
|
77699
|
+
" ",
|
|
77700
|
+
"Delete"
|
|
77701
|
+
))))));
|
|
77447
77702
|
}
|
|
77448
77703
|
|
|
77449
77704
|
// src/react-ui/components/metadata/ContextManager.tsx
|
package/dist/authoring.d.cts
CHANGED
|
@@ -2,7 +2,7 @@ export { B as BaseQuestion, e as BlocklyProgrammingQuestion, C as CodingQuestion
|
|
|
2
2
|
export { APIKeyService, AchievementService, Approach, ApproachTableRawDifficulty, BloomLevelName, BloomLevelType, Category, CodeNamedEntity, Context, GEMINI_API_KEY_SERVICE_NAME, GradeLevel, KnowledgeCardService, KnowledgeDimension, LearningObjective, MetadataService, PracticeHistoryService, QuestionBankService, QuestionImportService, QuestionInBank, QuestionTypeType, QuizEditorService, QuizEngine, QuizEngineCallbacks, QuizEngineConstructorOptions, QuoteService, SCORMService, StandardDifficulty, Subject, Topic, UserConfigService, cn, emptyQuiz, exportQuizAsSCORMZip, generateLauncherHTML, generateSCORMManifest, generateUniqueId, sampleQuiz } from './index.cjs';
|
|
3
3
|
export { i as Achievement, j as AchievementDefinition, r as ActivityCalendarData, u as AnalysisReport, A as AnswerDetail, x as ChatContext, C as ChatMessage, v as DashboardCardConfig, D as DashboardCardId, w as DashboardLayout, y as Goal, G as GoalType, t as ImageContextItem, I as ImportError, K as KnowledgeCard, L as LearningAnalysis, e as PerformanceByBloomLevel, b as PerformanceByCategory, d as PerformanceByDifficulty, P as PerformanceByLearningObjective, c as PerformanceByTopic, f as PerformanceMetric, s as PerformanceSummary, k as PracticeDifficulty, n as PracticeSession, p as PracticeSessionSummary, o as PracticeStats, m as PracticeSuggestion, l as PracticeSuggestionTopic, q as PracticeTopicSummary, g as QuestionReview, Q as QuizResultType, h as QuizReviewContent, R as RoadmapItem, T as TestCaseResult, U as UserAnswerType, a as UserAnswers, W as WeeklyRoadmap } from './ai-ecosystem-DyQYZbyX.cjs';
|
|
4
4
|
export { AssessAndMapDocumentClientInput, AssessAndMapDocumentOutput, BloomLevelStringsForAI, GenerateCodingQuestionClientInput, GenerateCodingQuestionOutput, GenerateFillInTheBlanksQuestionClientInput, GenerateFillInTheBlanksQuestionOutput, GenerateLearningAnalysisClientInput, GenerateLearningAnalysisOutput, GenerateMCQQuestionClientInput, GenerateMCQQuestionOutput, GenerateMRQQuestionClientInput, GenerateMRQQuestionOutput, GenerateMatchingQuestionClientInput, GenerateMatchingQuestionOutput, GenerateMotivationalQuoteClientInput, GenerateMotivationalQuoteOutput, GenerateNumericQuestionClientInput, GenerateNumericQuestionOutput, GeneratePracticeSuggestionClientInput, GeneratePracticeSuggestionOutput, GenerateQuestionsFromQuizPlanClientInput, GenerateQuestionsFromQuizPlanOutput, GenerateQuizFromTextClientInput, GenerateQuizFromTextOutput, GenerateQuizPlanClientInput, GenerateQuizPlanOutput, GenerateQuizReviewClientInput, GenerateQuizReviewOutput, GenerateSequenceQuestionClientInput, GenerateSequenceQuestionOutput, GenerateShortAnswerQuestionClientInput, GenerateShortAnswerQuestionOutput, GenerateSingleKnowledgeCardClientInput, GenerateSingleKnowledgeCardOutput, GenerateTrueFalseQuestionClientInput, GenerateTrueFalseQuestionOutput, PlanKnowledgeCardsClientInput, PlanKnowledgeCardsOutput, PlannedQuestion, assessAndMapDocument, generateCodingQuestion, generateFillInTheBlanksQuestion, generateLearningAnalysis, generateMCQQuestion, generateMRQQuestion, generateMatchingQuestion, generateMotivationalQuote, generateNumericQuestion, generatePracticeSuggestion, generateQuestionsFromQuizPlan, generateQuizFromText, generateQuizPlan, generateQuizReview, generateSequenceQuestion, generateShortAnswerQuestion, generateSingleKnowledgeCard, generateTrueFalseQuestion, planKnowledgeCards } from './ai.cjs';
|
|
5
|
-
export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-
|
|
5
|
+
export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-6AR8w2TO.cjs';
|
|
6
6
|
import 'clsx';
|
|
7
7
|
import 'zod';
|
|
8
8
|
import 'react';
|
package/dist/authoring.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { B as BaseQuestion, e as BlocklyProgrammingQuestion, C as CodingQuestion
|
|
|
2
2
|
export { APIKeyService, AchievementService, Approach, ApproachTableRawDifficulty, BloomLevelName, BloomLevelType, Category, CodeNamedEntity, Context, GEMINI_API_KEY_SERVICE_NAME, GradeLevel, KnowledgeCardService, KnowledgeDimension, LearningObjective, MetadataService, PracticeHistoryService, QuestionBankService, QuestionImportService, QuestionInBank, QuestionTypeType, QuizEditorService, QuizEngine, QuizEngineCallbacks, QuizEngineConstructorOptions, QuoteService, SCORMService, StandardDifficulty, Subject, Topic, UserConfigService, cn, emptyQuiz, exportQuizAsSCORMZip, generateLauncherHTML, generateSCORMManifest, generateUniqueId, sampleQuiz } from './index.js';
|
|
3
3
|
export { i as Achievement, j as AchievementDefinition, r as ActivityCalendarData, u as AnalysisReport, A as AnswerDetail, x as ChatContext, C as ChatMessage, v as DashboardCardConfig, D as DashboardCardId, w as DashboardLayout, y as Goal, G as GoalType, t as ImageContextItem, I as ImportError, K as KnowledgeCard, L as LearningAnalysis, e as PerformanceByBloomLevel, b as PerformanceByCategory, d as PerformanceByDifficulty, P as PerformanceByLearningObjective, c as PerformanceByTopic, f as PerformanceMetric, s as PerformanceSummary, k as PracticeDifficulty, n as PracticeSession, p as PracticeSessionSummary, o as PracticeStats, m as PracticeSuggestion, l as PracticeSuggestionTopic, q as PracticeTopicSummary, g as QuestionReview, Q as QuizResultType, h as QuizReviewContent, R as RoadmapItem, T as TestCaseResult, U as UserAnswerType, a as UserAnswers, W as WeeklyRoadmap } from './ai-ecosystem-Qa_SdE2T.js';
|
|
4
4
|
export { AssessAndMapDocumentClientInput, AssessAndMapDocumentOutput, BloomLevelStringsForAI, GenerateCodingQuestionClientInput, GenerateCodingQuestionOutput, GenerateFillInTheBlanksQuestionClientInput, GenerateFillInTheBlanksQuestionOutput, GenerateLearningAnalysisClientInput, GenerateLearningAnalysisOutput, GenerateMCQQuestionClientInput, GenerateMCQQuestionOutput, GenerateMRQQuestionClientInput, GenerateMRQQuestionOutput, GenerateMatchingQuestionClientInput, GenerateMatchingQuestionOutput, GenerateMotivationalQuoteClientInput, GenerateMotivationalQuoteOutput, GenerateNumericQuestionClientInput, GenerateNumericQuestionOutput, GeneratePracticeSuggestionClientInput, GeneratePracticeSuggestionOutput, GenerateQuestionsFromQuizPlanClientInput, GenerateQuestionsFromQuizPlanOutput, GenerateQuizFromTextClientInput, GenerateQuizFromTextOutput, GenerateQuizPlanClientInput, GenerateQuizPlanOutput, GenerateQuizReviewClientInput, GenerateQuizReviewOutput, GenerateSequenceQuestionClientInput, GenerateSequenceQuestionOutput, GenerateShortAnswerQuestionClientInput, GenerateShortAnswerQuestionOutput, GenerateSingleKnowledgeCardClientInput, GenerateSingleKnowledgeCardOutput, GenerateTrueFalseQuestionClientInput, GenerateTrueFalseQuestionOutput, PlanKnowledgeCardsClientInput, PlanKnowledgeCardsOutput, PlannedQuestion, assessAndMapDocument, generateCodingQuestion, generateFillInTheBlanksQuestion, generateLearningAnalysis, generateMCQQuestion, generateMRQQuestion, generateMatchingQuestion, generateMotivationalQuote, generateNumericQuestion, generatePracticeSuggestion, generateQuestionsFromQuizPlan, generateQuizFromText, generateQuizPlan, generateQuizReview, generateSequenceQuestion, generateShortAnswerQuestion, generateSingleKnowledgeCard, generateTrueFalseQuestion, planKnowledgeCards } from './ai.js';
|
|
5
|
-
export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-
|
|
5
|
+
export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-DAXYZdrz.js';
|
|
6
6
|
import 'clsx';
|
|
7
7
|
import 'zod';
|
|
8
8
|
import 'react';
|