karusic/front/src/components/popup/TrackEditPopUp.tsx

193 lines
6.2 KiB
TypeScript

import { useRef, useState } from 'react';
import { Button, Text, useDisclosure } from '@chakra-ui/react';
import { MdAdminPanelSettings, MdDeleteForever, MdEdit } from 'react-icons/md';
import { useNavigate, useParams } from 'react-router-dom';
import { TrackResource, TrackUpdate, ZodTrackUpdate } from '@/back-api';
import { FormGroupShow } from '@/components/form/FormGroup';
import { FormInput } from '@/components/form/FormInput';
import { FormNumber } from '@/components/form/FormNumber';
import { FormSelect } from '@/components/form/FormSelect';
import { FormSelectMultiple } from '@/components/form/FormSelectMultiple';
import { FormTextarea } from '@/components/form/FormTextarea';
import { ConfirmPopUp } from '@/components/popup/ConfirmPopUp';
import {
DialogBody,
DialogContent,
DialogFooter,
DialogHeader,
DialogRoot,
} from '@/components/ui/dialog';
import { useOrderedAlbums } from '@/service/Album';
import { useOrderedArtists } from '@/service/Artist';
import { useOrderedGenders } from '@/service/Gender';
import { useServiceContext } from '@/service/ServiceContext';
import { useSpecificTrack, useTrackService } from '@/service/Track';
import { isNullOrUndefined } from '@/utils/validator';
import { Formidable, useFormidable } from '../formidable';
export type TrackEditPopUpProps = {};
export const TrackEditPopUp = ({}: TrackEditPopUpProps) => {
const { trackId } = useParams();
const trackIdInt = isNullOrUndefined(trackId)
? undefined
: parseInt(trackId, 10);
const { session } = useServiceContext();
const { dataGenders } = useOrderedGenders(undefined);
const { dataArtist } = useOrderedArtists(undefined);
const { dataAlbums } = useOrderedAlbums(undefined);
const { store } = useTrackService();
const { dataTrack } = useSpecificTrack(trackIdInt);
const [admin, setAdmin] = useState(false);
const navigate = useNavigate();
const disclosure = useDisclosure();
const onClose = () => {
navigate('../../', { relative: 'path' });
};
const onRemove = () => {
if (isNullOrUndefined(trackIdInt)) {
return;
}
store.remove(
trackIdInt,
TrackResource.remove({
restConfig: session.getRestConfig(),
params: {
id: trackIdInt,
},
})
);
onClose();
};
const initialRef = useRef<HTMLButtonElement>(null);
const finalRef = useRef<HTMLButtonElement>(null);
const form = useFormidable<Partial<TrackUpdate>>({
initialValues: dataTrack,
deltaConfig: { omit: ['covers'] },
});
const onSave = async (data: TrackUpdate) => {
if (isNullOrUndefined(trackIdInt)) {
return;
}
console.log(`onSave = ${JSON.stringify(data, null, 2)}`);
const { track, ...rest } = data;
let trackNumber: undefined | number = undefined;
if (track !== undefined && track !== null) {
trackNumber = parseInt(`${track}`, 10);
}
store.update(
TrackResource.put({
restConfig: session.getRestConfig(),
data: ZodTrackUpdate.parse({ track: trackNumber, ...rest }),
params: {
id: trackIdInt,
},
})
);
};
return (
<DialogRoot
//initialFocusRef={initialRef}
//finalFocusRef={finalRef}
//closeOnOverlayClick={false}
onOpenChange={onClose}
open={true}
data-testid="track-edit-pop-up"
>
{/* <DialogOverlay /> */}
<DialogContent>
<Formidable.From form={form} onSubmit={onSave}>
<DialogHeader>Edit Track</DialogHeader>
{/* <DialogCloseButton ref={finalRef} /> */}
<DialogBody pb={6} gap="0px" paddingLeft="18px">
{admin && (
<>
<FormGroupShow isRequired label="Id">
<Text>{dataTrack?.id}</Text>
</FormGroupShow>
<FormGroupShow label="Data Id">
<Text>{dataTrack?.dataId}</Text>
</FormGroupShow>
<FormGroupShow label="Action(s):">
<Button
onClick={disclosure.onOpen}
marginRight="auto"
colorPalette="@danger"
>
<MdDeleteForever /> Remove Media
</Button>
</FormGroupShow>
<ConfirmPopUp
disclosure={disclosure}
title="Remove track"
body={`Remove Media [${dataTrack?.id}] ${dataTrack?.name}`}
confirmTitle="Remove"
onConfirm={onRemove}
/>
</>
)}
{!admin && (
<>
<FormInput
name="name"
isRequired
label="Title"
ref={initialRef}
/>
<FormTextarea name="description" label="Description" />
<FormSelect
name="genderId"
options={dataGenders}
label="Gender"
/>
<FormSelectMultiple
name="artists"
options={dataArtist}
label="Artist(s)"
/>
<FormSelect name="albumId" options={dataAlbums} label="Album" />
<FormNumber
name="track"
label="Track n°"
step={1}
//defaultValue={0}
min={0}
max={1000}
/>
</>
)}
</DialogBody>
<DialogFooter>
<Button
onClick={() => setAdmin((value) => !value)}
marginRight="auto"
>
{admin ? (
<>
<MdEdit />
Edit
</>
) : (
<>
<MdAdminPanelSettings />
Admin
</>
)}
</Button>
{!admin && form.isFormModified && (
<Button colorScheme="blue" mr={3} type="submit">
Save
</Button>
)}
<Button onClick={onClose}>Cancel</Button>
</DialogFooter>
</Formidable.From>
</DialogContent>
</DialogRoot>
);
};