feat: folder multi-select mode with checkboxes, shows contacts from multiple folders

This commit is contained in:
Agent Zero
2026-07-28 12:22:30 +02:00
parent 77284cbf10
commit 78738f5aa9
2 changed files with 121 additions and 24 deletions
+9 -3
View File
@@ -50,6 +50,7 @@ export function ContactsListPage() {
const [groupState, setGroupState] = useState<GroupState>(emptyGroupState);
const [viewsOpen, setViewsOpen] = useState(true);
const [foldersOpen, setFoldersOpen] = useState(true);
const [multiSelectFolders, setMultiSelectFolders] = useState<string[]>([]);
const [savedViews, setSavedViews] = useState<{ id: string; name: string; filterState: FilterState; sortState: SortState; groupState: GroupState; selectedFilter: ContactFilter; viewMode: ContactViewMode }[]>([]);
const [activeViewId, setActiveViewId] = useState<string | null>(null);
const openWindow = useWindowStore((s) => s.openWindow);
@@ -113,7 +114,10 @@ export function ContactsListPage() {
// Filter by tag client-side if tag filter is active, then apply FilterPanel conditions
const filteredContacts = useMemo(() => {
let result = contacts;
if (tagFilter) {
// Multi-select folder filter — show contacts from multiple folders
if (multiSelectFolders.length > 0) {
result = result.filter((c) => c.folder_id != null && multiSelectFolders.includes(c.folder_id));
} else if (tagFilter) {
result = result.filter((c) => {
if (!c.tags) return false;
return c.tags.split(',').map((t) => t.trim()).includes(tagFilter);
@@ -124,7 +128,7 @@ export function ContactsListPage() {
// Apply SortPanel sorting
result = applySorting(result, sortState);
return result;
}, [contacts, tagFilter, filterState, sortState]);
}, [contacts, tagFilter, filterState, sortState, multiSelectFolders]);
// Apply GroupPanel grouping
const groupedContacts = useMemo(() => applyGrouping(filteredContacts, groupState), [filteredContacts, groupState]);
@@ -370,7 +374,7 @@ export function ContactsListPage() {
];
registerItems('contacts', items);
return () => unregisterPlugin('contacts');
}, [handleSearch, handleCreate, handleSelectFilter, handleSaveView, applySavedView, deleteSavedView, t, registerItems, unregisterPlugin, selectedFilter, viewMode, sortOptions, viewModeOptions, filterState, contactType, sortState, groupState, savedViews, activeViewId]);
}, [handleSearch, handleCreate, handleSelectFilter, handleSaveView, applySavedView, deleteSavedView, t, registerItems, unregisterPlugin, selectedFilter, viewMode, sortOptions, viewModeOptions, filterState, contactType, sortState, groupState, savedViews, activeViewId, multiSelectFolders]);
return (
<div className="flex flex-col h-full" data-testid="contacts-list-page">
@@ -486,6 +490,8 @@ export function ContactsListPage() {
onSelect={handleSelectFilter}
tags={allTags}
contacts={contacts}
multiSelectFolders={multiSelectFolders}
onMultiSelectChange={setMultiSelectFolders}
/>
</div>
)}