Fix deletion of classification images and library

This commit is contained in:
Nicolas Mowen 2025-11-06 15:55:05 -07:00
parent 88b6bd7535
commit ca91d3d82b
2 changed files with 19 additions and 15 deletions

View File

@ -662,8 +662,11 @@ def delete_classification_dataset_images(
if os.path.isfile(file_path): if os.path.isfile(file_path):
os.unlink(file_path) os.unlink(file_path)
if os.path.exists(folder) and not os.listdir(folder):
os.rmdir(folder)
return JSONResponse( return JSONResponse(
content=({"success": True, "message": "Successfully deleted faces."}), content=({"success": True, "message": "Successfully deleted images."}),
status_code=200, status_code=200,
) )
@ -723,7 +726,7 @@ def categorize_classification_image(request: Request, name: str, body: dict = No
os.unlink(training_file) os.unlink(training_file)
return JSONResponse( return JSONResponse(
content=({"success": True, "message": "Successfully deleted faces."}), content=({"success": True, "message": "Successfully categorized image."}),
status_code=200, status_code=200,
) )
@ -761,7 +764,7 @@ def delete_classification_train_images(request: Request, name: str, body: dict =
os.unlink(file_path) os.unlink(file_path)
return JSONResponse( return JSONResponse(
content=({"success": True, "message": "Successfully deleted faces."}), content=({"success": True, "message": "Successfully deleted images."}),
status_code=200, status_code=200,
) )

View File

@ -183,11 +183,12 @@ export default function ModelTrainingView({ model }: ModelTrainingViewProps) {
); );
const onDelete = useCallback( const onDelete = useCallback(
(ids: string[], isName: boolean = false) => { (ids: string[], isName: boolean = false, category?: string) => {
const targetCategory = category || pageToggle;
const api = const api =
pageToggle == "train" targetCategory == "train"
? `/classification/${model.name}/train/delete` ? `/classification/${model.name}/train/delete`
: `/classification/${model.name}/dataset/${pageToggle}/delete`; : `/classification/${model.name}/dataset/${targetCategory}/delete`;
axios axios
.post(api, { ids }) .post(api, { ids })
@ -432,7 +433,7 @@ type LibrarySelectorProps = {
dataset: { [id: string]: string[] }; dataset: { [id: string]: string[] };
trainImages: string[]; trainImages: string[];
setPageToggle: (toggle: string) => void; setPageToggle: (toggle: string) => void;
onDelete: (ids: string[], isName: boolean) => void; onDelete: (ids: string[], isName: boolean, category?: string) => void;
onRename: (old_name: string, new_name: string) => void; onRename: (old_name: string, new_name: string) => void;
}; };
function LibrarySelector({ function LibrarySelector({
@ -448,7 +449,7 @@ function LibrarySelector({
// data // data
const [confirmDelete, setConfirmDelete] = useState<string | null>(null); const [confirmDelete, setConfirmDelete] = useState<string | null>(null);
const [renameClass, setRenameFace] = useState<string | null>(null); const [renameClass, setRenameClass] = useState<string | null>(null);
const pageTitle = useMemo(() => { const pageTitle = useMemo(() => {
if (pageToggle != "train") { if (pageToggle != "train") {
return pageToggle; return pageToggle;
@ -463,12 +464,12 @@ function LibrarySelector({
// interaction // interaction
const handleDeleteFace = useCallback( const handleDeleteCategory = useCallback(
(name: string) => { (name: string) => {
// Get all image IDs for this face // Get all image IDs for this category
const imageIds = dataset?.[name] || []; const imageIds = dataset?.[name] || [];
onDelete(imageIds, true); onDelete(imageIds, true, name);
setPageToggle("train"); setPageToggle("train");
}, },
[dataset, onDelete, setPageToggle], [dataset, onDelete, setPageToggle],
@ -476,7 +477,7 @@ function LibrarySelector({
const handleSetOpen = useCallback( const handleSetOpen = useCallback(
(open: boolean) => { (open: boolean) => {
setRenameFace(open ? renameClass : null); setRenameClass(open ? renameClass : null);
}, },
[renameClass], [renameClass],
); );
@ -503,7 +504,7 @@ function LibrarySelector({
className="text-white" className="text-white"
onClick={() => { onClick={() => {
if (confirmDelete) { if (confirmDelete) {
handleDeleteFace(confirmDelete); handleDeleteCategory(confirmDelete);
setConfirmDelete(null); setConfirmDelete(null);
} }
}} }}
@ -521,7 +522,7 @@ function LibrarySelector({
description={t("renameCategory.desc", { name: renameClass })} description={t("renameCategory.desc", { name: renameClass })}
onSave={(newName) => { onSave={(newName) => {
onRename(renameClass!, newName); onRename(renameClass!, newName);
setRenameFace(null); setRenameClass(null);
}} }}
defaultValue={renameClass || ""} defaultValue={renameClass || ""}
regexPattern={/^[\p{L}\p{N}\s'_-]{1,50}$/u} regexPattern={/^[\p{L}\p{N}\s'_-]{1,50}$/u}
@ -588,7 +589,7 @@ function LibrarySelector({
className="size-7 lg:opacity-0 lg:transition-opacity lg:group-hover:opacity-100" className="size-7 lg:opacity-0 lg:transition-opacity lg:group-hover:opacity-100"
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
setRenameFace(id); setRenameClass(id);
}} }}
> >
<LuPencil className="size-4 text-primary" /> <LuPencil className="size-4 text-primary" />