From f9ddd3140ad29181db64f6fa3b20f66fd96fa111 Mon Sep 17 00:00:00 2001 From: jeffvli Date: Wed, 19 Jul 2023 01:36:21 -0700 Subject: [PATCH] Add search to playlist list --- .../components/playlist-list-header.tsx | 51 +++++++++++++++++-- .../playlists/routes/playlist-list-route.tsx | 5 +- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/renderer/features/playlists/components/playlist-list-header.tsx b/src/renderer/features/playlists/components/playlist-list-header.tsx index 5b615ba3..daa8457a 100644 --- a/src/renderer/features/playlists/components/playlist-list-header.tsx +++ b/src/renderer/features/playlists/components/playlist-list-header.tsx @@ -1,16 +1,25 @@ -import { MutableRefObject } from 'react'; +import { ChangeEvent, MutableRefObject } from 'react'; import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact'; -import { Flex, Stack } from '@mantine/core'; +import { Flex, Group, Stack } from '@mantine/core'; import { openModal, closeAllModals } from '@mantine/modals'; -import { PageHeader, SpinnerIcon, Paper, Button } from '/@/renderer/components'; +import { PageHeader, SpinnerIcon, Paper, Button, SearchInput } from '/@/renderer/components'; import { VirtualInfiniteGridRef } from '/@/renderer/components/virtual-grid'; import { CreatePlaylistForm } from '/@/renderer/features/playlists/components/create-playlist-form'; import { PlaylistListHeaderFilters } from '/@/renderer/features/playlists/components/playlist-list-header-filters'; import { LibraryHeaderBar } from '/@/renderer/features/shared'; import { useContainerQuery } from '/@/renderer/hooks'; -import { useCurrentServer } from '/@/renderer/store'; -import { ServerType } from '/@/renderer/types'; +import { + PlaylistListFilter, + useCurrentServer, + useListStoreActions, + usePlaylistListFilter, + usePlaylistListStore, +} from '/@/renderer/store'; +import { ListDisplayType, ServerType } from '/@/renderer/types'; +import debounce from 'lodash/debounce'; import { RiFileAddFill } from 'react-icons/ri'; +import { LibraryItem } from '/@/renderer/api/types'; +import { useListFilterRefresh } from '../../../hooks/use-list-filter-refresh'; interface PlaylistListHeaderProps { gridRef: MutableRefObject; @@ -19,8 +28,12 @@ interface PlaylistListHeaderProps { } export const PlaylistListHeader = ({ itemCount, tableRef, gridRef }: PlaylistListHeaderProps) => { + const pageKey = 'playlist'; const cq = useContainerQuery(); const server = useCurrentServer(); + const { setFilter, setTablePagination } = useListStoreActions(); + const filter = usePlaylistListFilter({ key: pageKey }); + const { display } = usePlaylistListStore({ key: pageKey }); const handleCreatePlaylistModal = () => { openModal({ @@ -33,6 +46,27 @@ export const PlaylistListHeader = ({ itemCount, tableRef, gridRef }: PlaylistLis }); }; + const { handleRefreshGrid, handleRefreshTable } = useListFilterRefresh({ + itemType: LibraryItem.PLAYLIST, + server, + }); + + const handleSearch = debounce((e: ChangeEvent) => { + const searchTerm = e.target.value === '' ? undefined : e.target.value; + const updatedFilters = setFilter({ + data: { searchTerm }, + itemType: LibraryItem.PLAYLIST, + key: pageKey, + }) as PlaylistListFilter; + + if (display === ListDisplayType.TABLE || display === ListDisplayType.TABLE_PAGINATED) { + handleRefreshTable(tableRef, updatedFilters); + setTablePagination({ data: { currentPage: 0 }, key: pageKey }); + } else { + handleRefreshGrid(gridRef, updatedFilters); + } + }, 500); + return ( + + + diff --git a/src/renderer/features/playlists/routes/playlist-list-route.tsx b/src/renderer/features/playlists/routes/playlist-list-route.tsx index 86f0085b..07286c9f 100644 --- a/src/renderer/features/playlists/routes/playlist-list-route.tsx +++ b/src/renderer/features/playlists/routes/playlist-list-route.tsx @@ -6,19 +6,22 @@ import { PlaylistListContent } from '/@/renderer/features/playlists/components/p import { PlaylistListHeader } from '/@/renderer/features/playlists/components/playlist-list-header'; import { usePlaylistList } from '/@/renderer/features/playlists/queries/playlist-list-query'; import { AnimatedPage } from '/@/renderer/features/shared'; -import { useCurrentServer } from '/@/renderer/store'; +import { useCurrentServer, usePlaylistListFilter } from '/@/renderer/store'; const PlaylistListRoute = () => { const gridRef = useRef(null); const tableRef = useRef(null); const server = useCurrentServer(); + const playlistListFilter = usePlaylistListFilter({ key: 'playlist' }); + const itemCountCheck = usePlaylistList({ options: { cacheTime: 1000 * 60 * 60 * 2, staleTime: 1000 * 60 * 60 * 2, }, query: { + ...playlistListFilter, limit: 1, sortBy: PlaylistListSort.NAME, sortOrder: SortOrder.ASC,