diff options
Diffstat (limited to 'src/content/dependencies/generateAlbumAdditionalFilesList.js')
-rw-r--r-- | src/content/dependencies/generateAlbumAdditionalFilesList.js | 127 |
1 files changed, 82 insertions, 45 deletions
diff --git a/src/content/dependencies/generateAlbumAdditionalFilesList.js b/src/content/dependencies/generateAlbumAdditionalFilesList.js index 23f32bf..9818a43 100644 --- a/src/content/dependencies/generateAlbumAdditionalFilesList.js +++ b/src/content/dependencies/generateAlbumAdditionalFilesList.js @@ -1,59 +1,96 @@ +import {stitchArrays} from '#sugar'; + export default { contentDependencies: [ 'generateAdditionalFilesList', + 'generateAdditionalFilesListChunk', + 'generateAdditionalFilesListChunkItem', 'linkAlbumAdditionalFile', + 'transformContent', ], - extraDependencies: [ - 'getSizeOfAdditionalFile', - 'html', - 'urls', - ], + extraDependencies: ['getSizeOfAdditionalFile', 'html', 'urls'], - data(album, additionalFiles) { - return { - albumDirectory: album.directory, - fileLocations: additionalFiles.flatMap(({files}) => files), - }; - }, + relations: (relation, album, additionalFiles) => ({ + list: + relation('generateAdditionalFilesList', additionalFiles), - relations(relation, album, additionalFiles) { - return { - additionalFilesList: - relation('generateAdditionalFilesList', additionalFiles), - - additionalFileLinks: - Object.fromEntries( - additionalFiles - .flatMap(({files}) => files) - .map(file => [ - file, - relation('linkAlbumAdditionalFile', album, file), - ])), - }; - }, + chunks: + additionalFiles + .map(() => relation('generateAdditionalFilesListChunk')), + + chunkDescriptions: + additionalFiles + .map(({description}) => + (description + ? relation('transformContent', description) + : null)), + + chunkItems: + additionalFiles + .map(({files}) => + (files ?? []) + .map(() => relation('generateAdditionalFilesListChunkItem'))), + + chunkItemFileLinks: + additionalFiles + .map(({files}) => + (files ?? []) + .map(file => relation('linkAlbumAdditionalFile', album, file))), + }), + + data: (album, additionalFiles) => ({ + albumDirectory: album.directory, + + chunkTitles: + additionalFiles + .map(({title}) => title), + + chunkItemLocations: + additionalFiles + .map(({files}) => files ?? []), + }), slots: { showFileSizes: {type: 'boolean', default: true}, }, - generate(data, relations, slots, { - getSizeOfAdditionalFile, - urls, - }) { - return relations.additionalFilesList - .slots({ - fileLinks: relations.additionalFileLinks, - fileSizes: - Object.fromEntries(data.fileLocations.map(file => [ - file, - (slots.showFileSizes - ? getSizeOfAdditionalFile( - urls - .from('media.root') - .to('media.albumAdditionalFile', data.albumDirectory, file)) - : 0), - ])), - }); - }, + generate: (data, relations, slots, {getSizeOfAdditionalFile, urls}) => + relations.list.slots({ + chunks: + stitchArrays({ + chunk: relations.chunks, + description: relations.chunkDescriptions, + title: data.chunkTitles, + }).map(({chunk, title, description}) => + chunk.slots({ + title, + description: + (description + ? description.slot('mode', 'inline') + : null), + })), + + chunkItems: + stitchArrays({ + items: relations.chunkItems, + fileLinks: relations.chunkItemFileLinks, + locations: data.chunkItemLocations, + }).map(({items, fileLinks, locations}) => + stitchArrays({ + item: items, + fileLink: fileLinks, + location: locations, + }).map(({item, fileLink, location}) => + item.slots({ + fileLink: fileLink, + fileSize: + (slots.showFileSizes + ? getSizeOfAdditionalFile( + urls + .from('media.root') + .to('media.albumAdditionalFile', data.albumDirectory, location)) + : 0), + }))), + }), }; |