("train");
+ const [pageToggle, setPageToggle] = useOptimisticState(page, setPage, 100);
+
+ // dataset
+
+ const { data: trainImages } = useSWR(`classification/${model.name}/train`);
+ const { data: dataset } = useSWR(`classification/${model.name}/dataset`);
+
+ // actions
+
+ const trainModel = useCallback(() => {
+ axios.post(`classification/${model.name}/train`);
+ }, [model]);
+
return (
-
- {model.name} ({model.state_config != null ? "State" : "Object"}{" "}
- Classification)
-
+
+ {}}
+ onRename={() => {}}
+ />
+
+
);
}
+
+type LibrarySelectorProps = {
+ pageToggle: string | undefined;
+ dataset: { [id: string]: string[] };
+ trainImages: string[];
+ setPageToggle: (toggle: string) => void;
+ onDelete: (name: string, ids: string[], isName: boolean) => void;
+ onRename: (old_name: string, new_name: string) => void;
+};
+function LibrarySelector({
+ pageToggle,
+ dataset,
+ trainImages,
+ setPageToggle,
+ onDelete,
+ onRename,
+}: LibrarySelectorProps) {
+ const { t } = useTranslation(["views/faceLibrary"]);
+ const [confirmDelete, setConfirmDelete] = useState
(null);
+ const [renameFace, setRenameFace] = useState(null);
+
+ const handleDeleteFace = useCallback(
+ (name: string) => {
+ // Get all image IDs for this face
+ const imageIds = dataset?.[name] || [];
+
+ onDelete(name, imageIds, true);
+ setPageToggle("train");
+ },
+ [dataset, onDelete, setPageToggle],
+ );
+
+ const handleSetOpen = useCallback(
+ (open: boolean) => {
+ setRenameFace(open ? renameFace : null);
+ },
+ [renameFace],
+ );
+
+ return (
+ <>
+
+
+ {
+ onRename(renameFace!, newName);
+ setRenameFace(null);
+ }}
+ defaultValue={renameFace || ""}
+ regexPattern={/^[\p{L}\p{N}\s'_-]{1,50}$/u}
+ regexErrorMessage={t("description.invalidName")}
+ />
+
+
+
+
+
+
+ setPageToggle("train")}
+ >
+ {t("train.title")}
+
+ ({trainImages.length})
+
+
+ {trainImages.length > 0 && Object.keys(dataset).length > 0 && (
+ <>
+
+
+ {t("collections")}
+
+ >
+ )}
+ {Object.keys(dataset).map((id) => (
+
+ setPageToggle(id)}
+ >
+ {id}
+
+ ({dataset?.[id].length})
+
+
+
+
+
+
+
+
+ {t("button.renameFace")}
+
+
+
+
+
+
+
+ {t("button.deleteFace")}
+
+
+
+
+ ))}
+
+
+ >
+ );
+}