feat: folder multi-select mode with checkboxes, shows contacts from multiple folders
This commit is contained in:
@@ -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>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user