forked from akai/readest
feat: add support for renaming bookshelf groups (#2639)
This commit is contained in:
@@ -795,5 +795,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_few": "هل أنت متأكد من حذف {{count}} ملفات محددة؟",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "هل أنت متأكد من حذف {{count}} ملفًا محددًا؟",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "هل أنت متأكد من حذف {{count}} ملف محدد؟",
|
||||
"Cloud Storage Usage": "استخدام التخزين السحابي"
|
||||
"Cloud Storage Usage": "استخدام التخزين السحابي",
|
||||
"Rename Group": "إعادة تسمية المجموعة"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "{{total}}টির মধ্যে {{current}} পৃষ্ঠা",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "আপনি কি নিশ্চিত যে {{count}}টি নির্বাচিত ফাইল মুছতে চান?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "আপনি কি নিশ্চিত যে {{count}}টি নির্বাচিত ফাইল মুছতে চান?",
|
||||
"Cloud Storage Usage": "ক্লাউড স্টোরেজ ব্যবহৃত"
|
||||
"Cloud Storage Usage": "ক্লাউড স্টোরেজ ব্যবহৃত",
|
||||
"Rename Group": "গ্রুপের নাম পরিবর্তন করুন"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "ཡིག་ཆ",
|
||||
"Page {{current}} of {{total}}": "ཤོག་ངོས་ {{total}} ནས་ {{current}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "ཁྱེད་ཀྱིས་འདེམས་པའི་ཡིག་ཆ་ {{count}} བསུབས་དགོས་པ་ངེས་ཡིན་ན?",
|
||||
"Cloud Storage Usage": "སྤྲིན་གནས་སྣོད་གསོག་ལུས་སྐོར།"
|
||||
"Cloud Storage Usage": "སྤྲིན་གནས་སྣོད་གསོག་ལུས་སྐོར།",
|
||||
"Rename Group": "ཚོགས་མིང་བསྒྱུར་བ།"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "Seite {{current}} von {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Möchten Sie {{count}} ausgewählte Datei wirklich löschen?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Möchten Sie {{count}} ausgewählte Dateien wirklich löschen?",
|
||||
"Cloud Storage Usage": "Cloud-Speichernutzung"
|
||||
"Cloud Storage Usage": "Cloud-Speichernutzung",
|
||||
"Rename Group": "Gruppe umbenennen"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "Σελίδα {{current}} από {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Σίγουρα θέλετε να διαγράψετε {{count}} επιλεγμένο αρχείο;",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Σίγουρα θέλετε να διαγράψετε {{count}} επιλεγμένα αρχεία;",
|
||||
"Cloud Storage Usage": "Χρήση αποθήκευσης cloud"
|
||||
"Cloud Storage Usage": "Χρήση αποθήκευσης cloud",
|
||||
"Rename Group": "Μετονομασία ομάδας"
|
||||
}
|
||||
|
||||
@@ -768,5 +768,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "¿Seguro que deseas eliminar {{count}} archivo seleccionado?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "¿Seguro que deseas eliminar {{count}} archivos seleccionados?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "¿Seguro que deseas eliminar {{count}} archivos seleccionados?",
|
||||
"Cloud Storage Usage": "Uso de almacenamiento en la nube"
|
||||
"Cloud Storage Usage": "Uso de almacenamiento en la nube",
|
||||
"Rename Group": "Renombrar grupo"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "صفحه {{current}} از {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "آیا از حذف {{count}} فایل انتخابشده مطمئن هستید؟",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "آیا از حذف {{count}} فایل انتخابشده مطمئن هستید؟",
|
||||
"Cloud Storage Usage": "استفاده از فضای ذخیرهسازی ابری"
|
||||
"Cloud Storage Usage": "استفاده از فضای ذخیرهسازی ابری",
|
||||
"Rename Group": "تغییر نام گروه"
|
||||
}
|
||||
|
||||
@@ -768,5 +768,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Voulez-vous vraiment supprimer {{count}} fichier sélectionné ?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "Voulez-vous vraiment supprimer {{count}} fichiers sélectionnés ?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Voulez-vous vraiment supprimer {{count}} fichiers sélectionnés ?",
|
||||
"Cloud Storage Usage": "Utilisation du stockage cloud"
|
||||
"Cloud Storage Usage": "Utilisation du stockage cloud",
|
||||
"Rename Group": "Renommer le groupe"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "पृष्ठ {{current}} / {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "क्या आप वाकई {{count}} चयनित फ़ाइल हटाना चाहते हैं?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "क्या आप वाकई {{count}} चयनित फ़ाइलें हटाना चाहते हैं?",
|
||||
"Cloud Storage Usage": "क्लाउड स्टोरेज उपयोग"
|
||||
"Cloud Storage Usage": "क्लाउड स्टोरेज उपयोग",
|
||||
"Rename Group": "समूह का नाम बदलें"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "file",
|
||||
"Page {{current}} of {{total}}": "Halaman {{current}} dari {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Yakin ingin menghapus {{count}} file yang dipilih?",
|
||||
"Cloud Storage Usage": "Penggunaan Penyimpanan Cloud"
|
||||
"Cloud Storage Usage": "Penggunaan Penyimpanan Cloud",
|
||||
"Rename Group": "Ganti Nama Grup"
|
||||
}
|
||||
|
||||
@@ -768,5 +768,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Sei sicuro di voler eliminare {{count}} file selezionato?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "Sei sicuro di voler eliminare {{count}} file selezionati?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Sei sicuro di voler eliminare {{count}} file selezionati?",
|
||||
"Cloud Storage Usage": "Utilizzo archiviazione cloud"
|
||||
"Cloud Storage Usage": "Utilizzo archiviazione cloud",
|
||||
"Rename Group": "Rinomina gruppo"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "ファイル",
|
||||
"Page {{current}} of {{total}}": "ページ {{current}} / {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "選択した {{count}} 件のファイルを削除してもよろしいですか?",
|
||||
"Cloud Storage Usage": "クラウドストレージ使用量"
|
||||
"Cloud Storage Usage": "クラウドストレージ使用量",
|
||||
"Rename Group": "グループ名を変更"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "파일",
|
||||
"Page {{current}} of {{total}}": "페이지 {{current}} / {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "선택한 {{count}}개의 파일을 삭제하시겠습니까?",
|
||||
"Cloud Storage Usage": "클라우드 저장소 사용량"
|
||||
"Cloud Storage Usage": "클라우드 저장소 사용량",
|
||||
"Rename Group": "그룹 이름 바꾸기"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "fail",
|
||||
"Page {{current}} of {{total}}": "Halaman {{current}} daripada {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Adakah anda pasti mahu memadam {{count}} fail yang dipilih?",
|
||||
"Cloud Storage Usage": "Penggunaan Storan Awan"
|
||||
"Cloud Storage Usage": "Penggunaan Storan Awan",
|
||||
"Rename Group": "Namakan Semula Kumpulan"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "Pagina {{current}} van {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Weet je zeker dat je {{count}} geselecteerd bestand wilt verwijderen?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Weet je zeker dat je {{count}} geselecteerde bestanden wilt verwijderen?",
|
||||
"Cloud Storage Usage": "Cloudopslaggebruik"
|
||||
"Cloud Storage Usage": "Cloudopslaggebruik",
|
||||
"Rename Group": "Groep hernoemen"
|
||||
}
|
||||
|
||||
@@ -777,5 +777,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_few": "Czy na pewno chcesz usunąć {{count}} wybrane pliki?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "Czy na pewno chcesz usunąć {{count}} wybranych plików?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Czy na pewno chcesz usunąć {{count}} wybrany plik?",
|
||||
"Cloud Storage Usage": "Użycie pamięci w chmurze"
|
||||
"Cloud Storage Usage": "Użycie pamięci w chmurze",
|
||||
"Rename Group": "Zmień nazwę grupy"
|
||||
}
|
||||
|
||||
@@ -768,5 +768,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Tem certeza de que deseja apagar {{count}} ficheiro selecionado?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "Tem certeza de que deseja apagar {{count}} ficheiros selecionados?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Tem certeza de que deseja apagar {{count}} ficheiro selecionado?",
|
||||
"Cloud Storage Usage": "Uso de Armazenamento na Nuvem"
|
||||
"Cloud Storage Usage": "Uso de Armazenamento na Nuvem",
|
||||
"Rename Group": "Renomear Grupo"
|
||||
}
|
||||
|
||||
@@ -777,5 +777,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_few": "Вы уверены, что хотите удалить {{count}} выбранных файла?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "Вы уверены, что хотите удалить {{count}} выбранных файлов?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Вы уверены, что хотите удалить {{count}} выбранный файл?",
|
||||
"Cloud Storage Usage": "Использование облачного хранилища"
|
||||
"Cloud Storage Usage": "Использование облачного хранилища",
|
||||
"Rename Group": "Переименовать группу"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "පිටුව {{current}} / {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "තෝරාගත් ගොනුව මකන්නට විශ්වාසද?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "තෝරාගත් ගොනු මකන්නට විශ්වාසද?",
|
||||
"Cloud Storage Usage": "කලාප ගබඩා භාවිතය"
|
||||
"Cloud Storage Usage": "කලාප ගබඩා භාවිතය",
|
||||
"Rename Group": "කණ්ඩායම නැවත නම් කරන්න"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "Sida {{current}} av {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Är du säker på att du vill radera filen?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Är du säker på att du vill radera filerna?",
|
||||
"Cloud Storage Usage": "Användning av molnlagring"
|
||||
"Cloud Storage Usage": "Användning av molnlagring",
|
||||
"Rename Group": "Byt namn på grupp"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "பக்கம் {{current}} / {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "இந்த கோப்பை நீக்க விரும்புகிறீர்களா?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "இந்த கோப்புகளை நீக்க விரும்புகிறீர்களா?",
|
||||
"Cloud Storage Usage": "மேக சேமிப்பு பயன்பாடு"
|
||||
"Cloud Storage Usage": "மேக சேமிப்பு பயன்பாடு",
|
||||
"Rename Group": "குழுவை மறுபெயரிடவும்"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "ไฟล์",
|
||||
"Page {{current}} of {{total}}": "หน้า {{current}} จาก {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "คุณแน่ใจหรือว่าต้องการลบไฟล์ที่เลือก?",
|
||||
"Cloud Storage Usage": "การใช้งานพื้นที่เก็บข้อมูลคลาวด์"
|
||||
"Cloud Storage Usage": "การใช้งานพื้นที่เก็บข้อมูลคลาวด์",
|
||||
"Rename Group": "เปลี่ยนชื่อกลุ่ม"
|
||||
}
|
||||
|
||||
@@ -759,5 +759,6 @@
|
||||
"Page {{current}} of {{total}}": "{{total}} sayfa içinde {{current}}. sayfa",
|
||||
"Are you sure to delete {{count}} selected file(s)?_one": "Seçilen {{count}} dosyayı silmek istediğinizden emin misiniz?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Seçilen {{count}} dosyayı silmek istediğinizden emin misiniz?",
|
||||
"Cloud Storage Usage": "Bulut Depolama Kullanımı"
|
||||
"Cloud Storage Usage": "Bulut Depolama Kullanımı",
|
||||
"Rename Group": "Grubu Yeniden Adlandır"
|
||||
}
|
||||
|
||||
@@ -777,5 +777,6 @@
|
||||
"Are you sure to delete {{count}} selected file(s)?_few": "Ви впевнені, що хочете видалити {{count}} файли?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_many": "Ви впевнені, що хочете видалити {{count}} файлів?",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Ви впевнені, що хочете видалити {{count}} файлів?",
|
||||
"Cloud Storage Usage": "Використання хмарного сховища"
|
||||
"Cloud Storage Usage": "Використання хмарного сховища",
|
||||
"Rename Group": "Перейменувати групу"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "tệp",
|
||||
"Page {{current}} of {{total}}": "Trang {{current}} trên {{total}}",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "Bạn có chắc muốn xóa {{count}} tệp đã chọn không?",
|
||||
"Cloud Storage Usage": "Sử dụng lưu trữ đám mây"
|
||||
"Cloud Storage Usage": "Sử dụng lưu trữ đám mây",
|
||||
"Rename Group": "Đổi tên nhóm"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "文件",
|
||||
"Page {{current}} of {{total}}": "第 {{current}} 页,共 {{total}} 页",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "确定要删除已选择的 {{count}} 个文件吗?",
|
||||
"Cloud Storage Usage": "云存储使用情况"
|
||||
"Cloud Storage Usage": "云存储使用情况",
|
||||
"Rename Group": "重命名分组"
|
||||
}
|
||||
|
||||
@@ -750,5 +750,6 @@
|
||||
"files": "檔案",
|
||||
"Page {{current}} of {{total}}": "第 {{current}} 頁,共 {{total}} 頁",
|
||||
"Are you sure to delete {{count}} selected file(s)?_other": "確定要刪除已選擇的 {{count}} 個檔案嗎?",
|
||||
"Cloud Storage Usage": "雲端儲存使用情況"
|
||||
"Cloud Storage Usage": "雲端儲存使用情況",
|
||||
"Rename Group": "重新命名"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import clsx from 'clsx';
|
||||
import React, { useEffect, useRef, useState } from 'react';
|
||||
import { MdCheck, MdChevronRight } from 'react-icons/md';
|
||||
import { MdCheck, MdChevronRight, MdEdit } from 'react-icons/md';
|
||||
import { HiOutlineFolder, HiOutlineFolderAdd, HiOutlineFolderRemove } from 'react-icons/hi';
|
||||
import { IoMdArrowBack } from 'react-icons/io';
|
||||
|
||||
@@ -31,14 +31,23 @@ const GroupingModal: React.FC<GroupingModalProps> = ({
|
||||
}) => {
|
||||
const _ = useTranslation();
|
||||
const { appService } = useEnv();
|
||||
const { setLibrary, addGroup, getGroups, getGroupsByParent, getParentPath, refreshGroups } =
|
||||
useLibraryStore();
|
||||
const {
|
||||
setLibrary,
|
||||
addGroup,
|
||||
getGroups,
|
||||
getGroupId,
|
||||
getGroupsByParent,
|
||||
getParentPath,
|
||||
refreshGroups,
|
||||
} = useLibraryStore();
|
||||
|
||||
const [currentPath, setCurrentPath] = useState<string | undefined>(undefined);
|
||||
const [showInput, setShowInput] = useState(false);
|
||||
const [editGroupName, setEditGroupName] = useState('');
|
||||
const [selectedGroup, setSelectedGroup] = useState<BookGroupType | null>(null);
|
||||
const [newGroup, setNewGroup] = useState<BookGroupType | null>(null);
|
||||
const [isRenaming, setIsRenaming] = useState(false);
|
||||
const [originalGroupName, setOriginalGroupName] = useState<string | null>(null);
|
||||
|
||||
const divRef = useKeyDownActions({ onCancel, onConfirm });
|
||||
const editorRef = useRef<HTMLInputElement>(null);
|
||||
@@ -59,6 +68,11 @@ const GroupingModal: React.FC<GroupingModalProps> = ({
|
||||
.map((hash) => libraryBooks.find((book) => book.hash === hash)?.groupId)
|
||||
.some((group) => group && group !== BOOK_UNGROUPED_NAME);
|
||||
|
||||
const canRenameGroup = selectedBooks.length === 1 && selectedBooks.every((id) => !isMd5(id));
|
||||
const currentGroupForRename = canRenameGroup
|
||||
? allGroups.find((group) => group.id === selectedBooks[0])
|
||||
: null;
|
||||
|
||||
const generateNextUntitledGroupName = () => {
|
||||
const baseName = _('Untitled Group');
|
||||
const basePattern = parentGroupName
|
||||
@@ -86,6 +100,17 @@ const GroupingModal: React.FC<GroupingModalProps> = ({
|
||||
const nextName = generateNextUntitledGroupName();
|
||||
setEditGroupName(nextName);
|
||||
setShowInput(true);
|
||||
setIsRenaming(false);
|
||||
setOriginalGroupName(null);
|
||||
};
|
||||
|
||||
const handleRenameGroup = () => {
|
||||
if (!currentGroupForRename) return;
|
||||
|
||||
setEditGroupName(currentGroupForRename.name);
|
||||
setOriginalGroupName(currentGroupForRename.name);
|
||||
setShowInput(true);
|
||||
setIsRenaming(true);
|
||||
};
|
||||
|
||||
const handleRemoveFromGroup = () => {
|
||||
@@ -112,17 +137,44 @@ const GroupingModal: React.FC<GroupingModalProps> = ({
|
||||
const handleConfirmCreateGroup = () => {
|
||||
let groupName = editGroupName.trim();
|
||||
if (groupName) {
|
||||
if (currentPath && !groupName.startsWith(currentPath + '/')) {
|
||||
groupName = `${currentPath}/${groupName}`;
|
||||
}
|
||||
if (isRenaming && originalGroupName) {
|
||||
// Renaming existing group
|
||||
const oldGroupName = originalGroupName;
|
||||
|
||||
const newGroup = addGroup(groupName);
|
||||
setNewGroup(newGroup);
|
||||
setSelectedGroup(newGroup);
|
||||
setShowInput(false);
|
||||
const parentGroup = getParentPath(groupName);
|
||||
if (parentGroup) {
|
||||
setCurrentPath(parentGroup);
|
||||
// Update the group name for all books in this group and nested groups
|
||||
libraryBooks.forEach((book) => {
|
||||
if (book.groupName === oldGroupName) {
|
||||
book.groupName = groupName;
|
||||
book.groupId = getGroupId(book.groupName);
|
||||
book.updatedAt = Date.now();
|
||||
} else if (book.groupName?.startsWith(oldGroupName + '/')) {
|
||||
book.groupName = book.groupName.replace(oldGroupName, groupName);
|
||||
book.groupId = getGroupId(book.groupName);
|
||||
book.updatedAt = Date.now();
|
||||
}
|
||||
});
|
||||
|
||||
setLibrary([...libraryBooks]);
|
||||
appService?.saveLibraryBooks(libraryBooks);
|
||||
|
||||
refreshGroups();
|
||||
setShowInput(false);
|
||||
setIsRenaming(false);
|
||||
setOriginalGroupName(null);
|
||||
} else {
|
||||
// Creating new group
|
||||
if (currentPath && !groupName.startsWith(currentPath + '/')) {
|
||||
groupName = `${currentPath}/${groupName}`;
|
||||
}
|
||||
|
||||
const newGroup = addGroup(groupName);
|
||||
setNewGroup(newGroup);
|
||||
setSelectedGroup(newGroup);
|
||||
setShowInput(false);
|
||||
const parentGroup = getParentPath(groupName);
|
||||
if (parentGroup) {
|
||||
setCurrentPath(parentGroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -205,25 +257,32 @@ const GroupingModal: React.FC<GroupingModalProps> = ({
|
||||
|
||||
{/* Action buttons */}
|
||||
<div className={clsx('mt-4 grid grid-cols-1 gap-2 text-base md:grid-cols-2')}>
|
||||
{isSelectedBooksHasGroup && (
|
||||
<button
|
||||
onClick={handleRemoveFromGroup}
|
||||
className='flex items-center space-x-2 p-2 text-blue-500'
|
||||
>
|
||||
<HiOutlineFolderRemove size={iconSize} />
|
||||
<span className='truncate'>{_('Remove From Group')}</span>
|
||||
</button>
|
||||
)}
|
||||
<button
|
||||
onClick={handleRemoveFromGroup}
|
||||
className='flex items-center space-x-2 p-2 text-blue-500 disabled:text-gray-400'
|
||||
disabled={!isSelectedBooksHasGroup}
|
||||
>
|
||||
<HiOutlineFolderRemove size={iconSize} />
|
||||
<span className='truncate'>{_('Remove From Group')}</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={handleCreateGroup}
|
||||
className='flex items-center space-x-2 p-2 text-blue-500'
|
||||
className='flex items-center space-x-2 p-2 text-blue-500 disabled:text-gray-400'
|
||||
>
|
||||
<HiOutlineFolderAdd size={iconSize} />
|
||||
<span className='truncate'>{_('Create New Group')}</span>
|
||||
</button>
|
||||
<button
|
||||
onClick={handleRenameGroup}
|
||||
className='flex items-center space-x-2 p-2 text-blue-500 disabled:text-gray-400'
|
||||
disabled={!canRenameGroup}
|
||||
>
|
||||
<MdEdit size={iconSize} />
|
||||
<span className='truncate'>{_('Rename Group')}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Create group input */}
|
||||
{/* Create/Rename group input */}
|
||||
{showInput && (
|
||||
<div className='mt-4 space-y-2'>
|
||||
<div className='flex items-center gap-2'>
|
||||
@@ -234,7 +293,11 @@ const GroupingModal: React.FC<GroupingModalProps> = ({
|
||||
onChange={(e) => setEditGroupName(e.target.value)}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') handleConfirmCreateGroup();
|
||||
if (e.key === 'Escape') setShowInput(false);
|
||||
if (e.key === 'Escape') {
|
||||
setShowInput(false);
|
||||
setIsRenaming(false);
|
||||
setOriginalGroupName(null);
|
||||
}
|
||||
e.stopPropagation();
|
||||
}}
|
||||
className='input input-ghost w-full border-0 px-2 text-base !outline-none sm:text-sm'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { create } from 'zustand';
|
||||
import { Book, BookGroupType, BooksGroup } from '@/types/book';
|
||||
import { EnvConfigType, isTauriAppPlatform } from '@/services/environment';
|
||||
import { BOOK_UNGROUPED_ID, BOOK_UNGROUPED_NAME } from '@/services/constants';
|
||||
import { BOOK_UNGROUPED_NAME } from '@/services/constants';
|
||||
import { md5Fingerprint } from '@/utils/md5';
|
||||
|
||||
interface LibraryState {
|
||||
@@ -94,19 +94,12 @@ export const useLibraryStore = create<LibraryState>((set, get) => ({
|
||||
const groups: Record<string, string> = {};
|
||||
|
||||
library.forEach((book) => {
|
||||
if (
|
||||
book.groupId &&
|
||||
book.groupName &&
|
||||
book.groupId !== BOOK_UNGROUPED_ID &&
|
||||
book.groupName !== BOOK_UNGROUPED_NAME &&
|
||||
!book.deletedAt
|
||||
) {
|
||||
groups[book.groupId] = book.groupName;
|
||||
if (book.groupName && book.groupName !== BOOK_UNGROUPED_NAME && !book.deletedAt) {
|
||||
groups[md5Fingerprint(book.groupName)] = book.groupName;
|
||||
let nextSlashIndex = book.groupName.indexOf('/', 0);
|
||||
while (nextSlashIndex > 0) {
|
||||
const groupName = book.groupName.substring(0, nextSlashIndex);
|
||||
const groupId = md5Fingerprint(groupName);
|
||||
groups[groupId] = groupName;
|
||||
groups[md5Fingerprint(groupName)] = groupName;
|
||||
nextSlashIndex = book.groupName.indexOf('/', nextSlashIndex + 1);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user