diff --git a/src/components/EntityList.jsx b/src/components/EntityList.jsx index 0aee37b..ca5f099 100644 --- a/src/components/EntityList.jsx +++ b/src/components/EntityList.jsx @@ -2,6 +2,14 @@ import React from "react"; import {Link} from "react-router-dom"; import "./EntityList.scss" +const EntityHeader = (props) => { + return ( +
+ {props.title} +
+ ) +} + const EntityPlaceholder = (props) => { return (
  • @@ -50,10 +58,16 @@ export const EntityList = (props) => { if(props.placeholder){ entities = []; for(const i of Array(props.size).keys()){ - entities.push() + entities.push(); } }else{ - entities = props.list.items.map(item => ); + let mapped = props.list.map(group => { + let header = group.header ? : null; + let items = group.items.map(item => ); + items.unshift(header); + return items; + }); + entities = [].concat.apply([], mapped); } const className = props.grid ? "grid" : "column"; diff --git a/src/components/EntityList.scss b/src/components/EntityList.scss index f81d877..13c2d9f 100644 --- a/src/components/EntityList.scss +++ b/src/components/EntityList.scss @@ -1,5 +1,11 @@ // Base .entity-list { + .entity-header{ + font-size: 1.2em; + font-weight: 500; + border-bottom: solid var(--line-width) var(--accent); + } + .entity-item { a { text-decoration: none; @@ -29,29 +35,31 @@ // Column mode .entity-list.column { - - .entity-item .entity-container { - display: flex; - justify-content: space-between; - - a { + .entity-item{ + margin-bottom: 1em; + .entity-container { display: flex; - flex-direction: row; - align-items: center; + justify-content: space-between; - padding: 1em 1em; - - flex-grow: 2; - .body { + a { display: flex; - flex-direction: column; - } - } + flex-direction: row; + align-items: center; - .widget { - display: flex; - align-items: center; - padding-right: 1em; + padding: 1em 1em; + + flex-grow: 2; + .body { + display: flex; + flex-direction: column; + } + } + + .widget { + display: flex; + align-items: center; + padding-right: 1em; + } } } } diff --git a/src/views/Artist.jsx b/src/views/Artist.jsx index 3720bd1..8117ac4 100644 --- a/src/views/Artist.jsx +++ b/src/views/Artist.jsx @@ -26,9 +26,9 @@ const Discs = (props) => { 'title': disc.title, 'subtitle': disc.artist.name })); - const list = { + const list = [{ 'items': items - } + }] discsComponent = }else{ discsComponent =

    El artista no tiene discos

    diff --git a/src/views/Disc.jsx b/src/views/Disc.jsx index 1b7d234..d0f03f6 100644 --- a/src/views/Disc.jsx +++ b/src/views/Disc.jsx @@ -31,9 +31,9 @@ const Versions = (props) => { })); - const list = { + const list = [{ 'items': items - } + }]; versionsComponent = } diff --git a/src/views/Release.jsx b/src/views/Release.jsx index caba231..a39049d 100644 --- a/src/views/Release.jsx +++ b/src/views/Release.jsx @@ -10,32 +10,34 @@ import {EntityList} from "../components/EntityList"; const Recordings = (props) => { - const recordings = props.recordings ? props.recordings : null; - - let recordingsComponent = ; - if(recordings) { - const items = recordings.map((recording) => ({ - 'id': recording.id, - 'link': props.makeLink(recording.id), - 'title': recording.title, - 'subtitle': ( - {recording.length &&
    [{toDuration(recording.length)}]
    } - {recording.disambiguation &&
    {capitalize(recording.disambiguation)}
    } -
    ), - 'selected': props.selected === recording.id, - 'widget': + const medias = props.medias ? props.medias: null; + let mediasComponent = ; + if(medias) { + const list= medias.map((media) => ({ + 'header': media.format + ' ' + media.position, + 'items': media.recordings.map((recording) => ({ + 'id': recording.id, + 'link': props.makeLink(recording.id), + 'title': recording.title, + 'subtitle': ( + {recording.length && +
    [{toDuration(recording.length)}]
    } + {recording.disambiguation && +
    {capitalize(recording.disambiguation)}
    } +
    ), + 'selected': props.selected === recording.id, + 'widget': + })) })); - const list = { - 'items': items - } - recordingsComponent = + + mediasComponent = } return (

    Canciones

    - {recordingsComponent} + {mediasComponent}
    ) } @@ -61,14 +63,14 @@ export const ReleaseView = (props) => { const mbid = props.match.params.mbid; const [release, setRelease] = useState(null); - const [recordings, setRecordings] = useState(null); + const [medias, setMedias] = useState(null); const currentRecording = props.location.hash ? props.location.hash.slice(1) : null useEffect(() => { if (mbid) { getRelease(mbid).then((result) => setRelease(result)); getReleaseSongs(mbid).then((result) => { - setRecordings(result.medias[0].recordings); + setMedias(result.medias); }); } }, [mbid]) @@ -85,7 +87,7 @@ export const ReleaseView = (props) => { {release && - diff --git a/src/views/Search.jsx b/src/views/Search.jsx index 0e72180..c8161b3 100644 --- a/src/views/Search.jsx +++ b/src/views/Search.jsx @@ -49,9 +49,9 @@ const SearchSongs = (props) => { 'subtitle': song.artist.name }; }); - const list = { + const list = [{ 'items': items - } + }] songsComponent = } @@ -111,9 +111,9 @@ const SearchDiscs = (props) => { 'title': disc.title, 'subtitle': disc.artist.name })); - const list = { + const list = [{ 'items': items - } + }] discsComponent = } @@ -172,9 +172,9 @@ const SearchArtists = (props) => { 'title': artist.name, 'subtitle': [artist.type, artist.country].filter(Boolean).join(' - ') })); - const list = { + const list = [{ 'items': items - } + }]; artistsContent = }