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:
parent
909a2f42bc
commit
fe3f254dfc
|
|
@ -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}?`,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user