fix level/module removal behavior and reduce creation popups

Use module delete operations for level/module removal so removed levels disappear correctly, and suppress success toasts for module/sub-module creation to keep the flow cleaner and faster.

Made-with: Cursor
This commit is contained in:
Yared Yemane 2026-04-14 05:58:51 -07:00
parent 909a2f42bc
commit fe3f254dfc

View File

@ -37,6 +37,7 @@ import {
createHumanLanguageLesson, createHumanLanguageLesson,
createModuleInLevel, createModuleInLevel,
createSubModuleInModule, createSubModuleInModule,
deleteModule,
deleteCourse, deleteCourse,
deleteCourseSubCategory, deleteCourseSubCategory,
deleteQuestionSet, deleteQuestionSet,
@ -185,6 +186,7 @@ type CefrLevel = (typeof CEFR_LEVELS)[number]
type PendingRemove = { type PendingRemove = {
ids: number[] ids: number[]
target: "sub_module" | "module"
key: string key: string
successMessage: string successMessage: string
title: string title: string
@ -523,7 +525,6 @@ export function HumanLanguagePage() {
const next = nextMissingPositive(usedNumbers) const next = nextMissingPositive(usedNumbers)
const title = `Module-${next}` const title = `Module-${next}`
await createModuleInLevel(levelNode.level_id, title, `${level} ${title}`, next) await createModuleInLevel(levelNode.level_id, title, `${level} ${title}`, next)
toast.success(`${title} created`)
await loadHierarchy() await loadHierarchy()
} catch (error) { } catch (error) {
console.error("Failed to create module:", error) console.error("Failed to create module:", error)
@ -555,7 +556,6 @@ export function HumanLanguagePage() {
const next = nextMissingPositive(usedNumbers) const next = nextMissingPositive(usedNumbers)
const title = `Module-${moduleNo}.${next}` const title = `Module-${moduleNo}.${next}`
await createSubModuleInModule(moduleId, title, `${level} ${title}`, next) await createSubModuleInModule(moduleId, title, `${level} ${title}`, next)
toast.success(`Sub-module ${moduleNo}.${next} created`)
await loadHierarchy() await loadHierarchy()
} catch (error) { } catch (error) {
console.error("Failed to create sub-module:", error) console.error("Failed to create sub-module:", error)
@ -572,13 +572,17 @@ export function HumanLanguagePage() {
const executePendingRemove = async () => { const executePendingRemove = async () => {
if (!pendingRemove) return if (!pendingRemove) return
const { ids, key, successMessage } = pendingRemove const { ids, target, key, successMessage } = pendingRemove
setPendingRemove(null) setPendingRemove(null)
setDeletingKey(key) setDeletingKey(key)
try { try {
for (const id of ids) { for (const id of ids) {
if (target === "module") {
await deleteModule(id)
} else {
await deleteSubModule(id) await deleteSubModule(id)
} }
}
toast.success(successMessage) toast.success(successMessage)
await loadHierarchy() await loadHierarchy()
} catch (error) { } catch (error) {
@ -1357,7 +1361,7 @@ export function HumanLanguagePage() {
const levelNode = course.levels.find((item) => item.level.toUpperCase() === level) const levelNode = course.levels.find((item) => item.level.toUpperCase() === level)
const modules = levelNode?.modules ?? [] const modules = levelNode?.modules ?? []
const levelKey = `${course.course_id}-${level}` const levelKey = `${course.course_id}-${level}`
const levelRemoveIds = modules.flatMap((m) => m.sub_modules.map((s) => s.id)) const levelRemoveIds = modules.map((m) => m.id)
const canRemoveLevel = levelRemoveIds.length > 0 const canRemoveLevel = levelRemoveIds.length > 0
return ( return (
<div key={levelKey} className="overflow-hidden rounded-xl border border-grayScale-200/90 bg-white shadow-sm"> <div key={levelKey} className="overflow-hidden rounded-xl border border-grayScale-200/90 bg-white shadow-sm">
@ -1383,6 +1387,7 @@ export function HumanLanguagePage() {
onClick={() => onClick={() =>
requestRemove({ requestRemove({
ids: levelRemoveIds, ids: levelRemoveIds,
target: "module",
key: `level-${course.course_id}-${level}`, key: `level-${course.course_id}-${level}`,
successMessage: `Level ${level} removed`, successMessage: `Level ${level} removed`,
title: `Remove level ${level}?`, title: `Remove level ${level}?`,
@ -1468,7 +1473,8 @@ export function HumanLanguagePage() {
disabled={deletingKey === `module-${module.id}`} disabled={deletingKey === `module-${module.id}`}
onClick={() => onClick={() =>
requestRemove({ requestRemove({
ids: module.sub_modules.map((s) => s.id), ids: [module.id],
target: "module",
key: `module-${module.id}`, key: `module-${module.id}`,
successMessage: `Module ${module.title} removed`, successMessage: `Module ${module.title} removed`,
title: `Remove ${module.title}?`, title: `Remove ${module.title}?`,
@ -1541,6 +1547,7 @@ export function HumanLanguagePage() {
onClick={() => onClick={() =>
requestRemove({ requestRemove({
ids: [subModule.id], ids: [subModule.id],
target: "sub_module",
key: `submodule-${subModule.id}`, key: `submodule-${subModule.id}`,
successMessage: `Sub-module ${subModule.title} removed`, successMessage: `Sub-module ${subModule.title} removed`,
title: `Remove ${subModule.title}?`, title: `Remove ${subModule.title}?`,