You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.7 KiB
85 lines
2.7 KiB
import React, { useState, useEffect } from 'react'; |
|
import { Dialog, Grid, Typography, TextField, Button } from '@material-ui/core'; |
|
import { Autocomplete } from '@material-ui/lab'; |
|
|
|
var cloneDeep = require('lodash/cloneDeep'); |
|
|
|
export interface SongProperties { |
|
title: String, |
|
artistId: Number | undefined, |
|
} |
|
|
|
export interface ArtistProperties { |
|
name: String, |
|
id: Number, |
|
} |
|
|
|
export interface IProps { |
|
dialogOpen: boolean, |
|
onClose?: () => void, |
|
onChangeSongProperties?: (props: SongProperties) => void, |
|
songProperties: SongProperties, |
|
onSubmit?: () => void, |
|
artists: ArtistProperties[], |
|
} |
|
|
|
export default function EditSongDialog(props: IProps) { |
|
const onTitleChange = (title: String) => { |
|
if (props.onChangeSongProperties) { |
|
const p = cloneDeep(props.songProperties); |
|
p.title = title; |
|
props.onChangeSongProperties(p); |
|
} |
|
}; |
|
const onArtistChange = (artist: Number | undefined) => { |
|
if (props.onChangeSongProperties) { |
|
const p = cloneDeep(props.songProperties); |
|
p.artistId = artist; |
|
props.onChangeSongProperties(p); |
|
} |
|
}; |
|
|
|
return <Dialog |
|
open={props.dialogOpen} |
|
onClose={props.onClose} |
|
> |
|
<Typography variant='h6' gutterBottom> |
|
Song Details |
|
</Typography> |
|
<Grid container spacing={3}> |
|
<Grid item xs={12}> |
|
<TextField |
|
label="Song Title" |
|
value={props.songProperties.title} |
|
onChange={(i: any) => onTitleChange(i.target.value)} |
|
fullWidth |
|
/> |
|
</Grid> |
|
<Grid item xs={12}> |
|
{ // TODO: this autocomplete is not controlled but does send updates to the parent |
|
// right away. In other words, there is no way to affect its value from outside |
|
// the dialog. |
|
} |
|
<Autocomplete |
|
options={props.artists} |
|
getOptionLabel={(option) => option.name as string} |
|
onChange={(event, newValue) => { |
|
if(newValue) { |
|
onArtistChange(newValue.id); |
|
} else { |
|
onArtistChange(undefined); |
|
} |
|
}} |
|
renderInput={ |
|
(params) => |
|
<TextField {...params} |
|
label="Artist" |
|
fullWidth |
|
/> |
|
} |
|
/> |
|
</Grid> |
|
</Grid> |
|
<Button variant="contained" onClick={props.onSubmit}>Submit</Button> |
|
</Dialog> |
|
} |