Fix playlist form

- Invalid initial state and definition for public playlist
This commit is contained in:
jeffvli 2023-05-30 19:34:07 -07:00
parent 6d092d9ebc
commit 9c1a2a4a8d
4 changed files with 16 additions and 58 deletions

View file

@ -97,7 +97,7 @@ export const CreatePlaylistForm = ({ onCancel }: CreatePlaylistFormProps) => {
{isPublicDisplayed && ( {isPublicDisplayed && (
<Switch <Switch
label="Is public?" label="Is public?"
{...form.getInputProps('ndParams.public')} {...form.getInputProps('_custom.navidrome.public', { type: 'checkbox' })}
/> />
)} )}
{server?.type === ServerType.NAVIDROME && ( {server?.type === ServerType.NAVIDROME && (

View file

@ -2,21 +2,12 @@ import { ColDef, RowDoubleClickedEvent } from '@ag-grid-community/core';
import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact'; import type { AgGridReact as AgGridReactType } from '@ag-grid-community/react/lib/agGridReact';
import { Box, Group } from '@mantine/core'; import { Box, Group } from '@mantine/core';
import { closeAllModals, openModal } from '@mantine/modals'; import { closeAllModals, openModal } from '@mantine/modals';
import { useQueryClient } from '@tanstack/react-query';
import { MutableRefObject, useMemo, useRef } from 'react'; import { MutableRefObject, useMemo, useRef } from 'react';
import { RiMoreFill } from 'react-icons/ri'; import { RiMoreFill } from 'react-icons/ri';
import { generatePath, useNavigate, useParams } from 'react-router'; import { generatePath, useNavigate, useParams } from 'react-router';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import styled from 'styled-components'; import styled from 'styled-components';
import { api } from '/@/renderer/api'; import { LibraryItem, QueueSong } from '/@/renderer/api/types';
import { queryKeys } from '/@/renderer/api/query-keys';
import {
LibraryItem,
QueueSong,
SortOrder,
UserListQuery,
UserListSort,
} from '/@/renderer/api/types';
import { Button, ConfirmModal, DropdownMenu, MotionGroup, toast } from '/@/renderer/components'; import { Button, ConfirmModal, DropdownMenu, MotionGroup, toast } from '/@/renderer/components';
import { import {
getColumnDefs, getColumnDefs,
@ -29,7 +20,7 @@ import {
SMART_PLAYLIST_SONG_CONTEXT_MENU_ITEMS, SMART_PLAYLIST_SONG_CONTEXT_MENU_ITEMS,
} from '/@/renderer/features/context-menu/context-menu-items'; } from '/@/renderer/features/context-menu/context-menu-items';
import { usePlayQueueAdd } from '/@/renderer/features/player'; import { usePlayQueueAdd } from '/@/renderer/features/player';
import { UpdatePlaylistForm } from '/@/renderer/features/playlists/components/update-playlist-form'; import { openUpdatePlaylistModal } from '/@/renderer/features/playlists/components/update-playlist-form';
import { useDeletePlaylist } from '/@/renderer/features/playlists/mutations/delete-playlist-mutation'; import { useDeletePlaylist } from '/@/renderer/features/playlists/mutations/delete-playlist-mutation';
import { usePlaylistDetail } from '/@/renderer/features/playlists/queries/playlist-detail-query'; import { usePlaylistDetail } from '/@/renderer/features/playlists/queries/playlist-detail-query';
import { usePlaylistSongListInfinite } from '/@/renderer/features/playlists/queries/playlist-song-list-query'; import { usePlaylistSongListInfinite } from '/@/renderer/features/playlists/queries/playlist-song-list-query';
@ -67,7 +58,6 @@ export const PlaylistDetailContent = ({ tableRef }: PlaylistDetailContentProps)
const server = useCurrentServer(); const server = useCurrentServer();
const detailQuery = usePlaylistDetail({ query: { id: playlistId }, serverId: server?.id }); const detailQuery = usePlaylistDetail({ query: { id: playlistId }, serverId: server?.id });
const playButtonBehavior = usePlayButtonBehavior(); const playButtonBehavior = usePlayButtonBehavior();
const queryClient = useQueryClient();
const playlistSongsQueryInfinite = usePlaylistSongListInfinite({ const playlistSongsQueryInfinite = usePlaylistSongListInfinite({
options: { options: {
@ -158,47 +148,6 @@ export const PlaylistDetailContent = ({ tableRef }: PlaylistDetailContentProps)
}); });
}; };
const openUpdatePlaylistModal = async () => {
const query: UserListQuery = {
sortBy: UserListSort.NAME,
sortOrder: SortOrder.ASC,
startIndex: 0,
};
if (!server) return;
const users = await queryClient.fetchQuery({
queryFn: ({ signal }) =>
api.controller.getUserList({ apiClientProps: { server, signal }, query }),
queryKey: queryKeys.users.list(server?.id || '', query),
});
openModal({
children: (
<UpdatePlaylistForm
body={{
_custom: {
navidrome: {
owner: detailQuery?.data?.owner || undefined,
ownerId: detailQuery?.data?.ownerId || undefined,
public: detailQuery?.data?.public || false,
rules: detailQuery?.data?.rules || undefined,
sync: detailQuery?.data?.sync || undefined,
},
},
comment: detailQuery?.data?.description || undefined,
genres: detailQuery?.data?.genres,
name: detailQuery?.data?.name,
}}
query={{ id: playlistId }}
users={users?.items}
onCancel={closeAllModals}
/>
),
title: 'Edit playlist',
});
};
const handleRowDoubleClick = (e: RowDoubleClickedEvent<QueueSong>) => { const handleRowDoubleClick = (e: RowDoubleClickedEvent<QueueSong>) => {
if (!e.data) return; if (!e.data) return;
@ -242,7 +191,14 @@ export const PlaylistDetailContent = ({ tableRef }: PlaylistDetailContentProps)
</DropdownMenu.Item> </DropdownMenu.Item>
))} ))}
<DropdownMenu.Divider /> <DropdownMenu.Divider />
<DropdownMenu.Item onClick={openUpdatePlaylistModal}>Edit playlist</DropdownMenu.Item> <DropdownMenu.Item
onClick={() => {
if (!detailQuery.data || !server) return;
openUpdatePlaylistModal({ playlist: detailQuery.data, server });
}}
>
Edit playlist
</DropdownMenu.Item>
<DropdownMenu.Item onClick={openDeletePlaylist}>Delete playlist</DropdownMenu.Item> <DropdownMenu.Item onClick={openDeletePlaylist}>Delete playlist</DropdownMenu.Item>
</DropdownMenu.Dropdown> </DropdownMenu.Dropdown>
</DropdownMenu> </DropdownMenu>

View file

@ -70,7 +70,7 @@ export const SaveAsPlaylistForm = ({
{isPublicDisplayed && ( {isPublicDisplayed && (
<Switch <Switch
label="Is Public?" label="Is Public?"
{...form.getInputProps('public')} {...form.getInputProps('_custom.navidrome.public', { type: 'checkbox' })}
/> />
)} )}
<Group position="right"> <Group position="right">

View file

@ -88,13 +88,13 @@ export const UpdatePlaylistForm = ({ users, query, body, onCancel }: UpdatePlayl
/> />
<Select <Select
data={userList || []} data={userList || []}
{...form.getInputProps('ndParams.ownerId')} {...form.getInputProps('_custom.navidrome.ownerId')}
label="Owner" label="Owner"
/> />
{isPublicDisplayed && ( {isPublicDisplayed && (
<Switch <Switch
label="Is Public?" label="Is Public?"
{...form.getInputProps('public')} {...form.getInputProps('_custom.navidrome.public', { type: 'checkbox' })}
/> />
)} )}
<Group position="right"> <Group position="right">
@ -138,6 +138,8 @@ export const openUpdatePlaylistModal = async (args: {
queryKey: queryKeys.users.list(server?.id || '', query), queryKey: queryKeys.users.list(server?.id || '', query),
}); });
console.log('playlist', playlist);
openModal({ openModal({
children: ( children: (
<UpdatePlaylistForm <UpdatePlaylistForm