diff options
| author | (quasar) nebula <qznebula@protonmail.com> | 2026-06-10 10:32:21 -0300 |
|---|---|---|
| committer | (quasar) nebula <qznebula@protonmail.com> | 2026-06-10 10:32:21 -0300 |
| commit | 8ac83829b4f1add4c57504210d08758e63540853 (patch) | |
| tree | 1a5f793d626f51ad405d49680c254a964f3c038c /src/data/things | |
| parent | 52272a8da9a798803abd1176a8294845e8567641 (diff) | |
data: Track: 'Name Detail: section'
Diffstat (limited to 'src/data/things')
| -rw-r--r-- | src/data/things/Track.js | 39 | ||||
| -rw-r--r-- | src/data/things/album/TrackSection.js | 46 |
2 files changed, 67 insertions, 18 deletions
diff --git a/src/data/things/Track.js b/src/data/things/Track.js index 1f7375be..f6b3346c 100644 --- a/src/data/things/Track.js +++ b/src/data/things/Track.js @@ -169,12 +169,12 @@ export class Track extends Thing { input.updateValue({ validate: anyOf( - isBoolean, - is('album'), + is(false), + is('album', 'section'), isDirectory, strictArrayOf( anyOf( - is('album'), + is('album', 'section'), isDirectory))), }), }), @@ -781,21 +781,37 @@ export class Track extends Thing { }) => (nameDetail === 'album' ? null + : nameDetail === 'section' + ? null : nameDetail), }, ], nameDetailAcrossWiki: [ withPropertyFromObject('album', V('nameDetailForTracks')), + withPropertyFromObject('trackSection', V('nameDetailForTracks')), { - dependencies: ['_nameDetail', '#album.nameDetailForTracks'], + dependencies: [ + '_nameDetail', + '#album.nameDetailForTracks', + '#trackSection.nameDetailForTracks', + ], + compute: ({ - ['_nameDetail']: nameDetail, - ['#album.nameDetailForTracks']: nameDetailFromAlbum, + ['_nameDetail']: + nameDetail, + + ['#album.nameDetailForTracks']: + albumNameDetailForTracks, + + ['#trackSection.nameDetailForTracks']: + trackSectionNameDetailForTracks, }) => (nameDetail === 'album' - ? nameDetailFromAlbum + ? albumNameDetailForTracks + : nameDetail === 'section' + ? trackSectionNameDetailForTracks : nameDetail), }, ], @@ -1062,7 +1078,14 @@ export class Track extends Thing { 'Name Detail': {property: 'nameDetail'}, 'Directory': {property: 'directory'}, - 'Suffix Directory': {property: 'suffixDirectory'}, + + 'Suffix Directory': { + property: 'suffixDirectory', + transform: value => + (value === true + ? 'album' + : value), + }, 'Reference By Directory': {property: 'referenceByDirectory'}, diff --git a/src/data/things/album/TrackSection.js b/src/data/things/album/TrackSection.js index 00963d1b..0e6adb6d 100644 --- a/src/data/things/album/TrackSection.js +++ b/src/data/things/album/TrackSection.js @@ -13,6 +13,7 @@ import { isDirectory, isExcludingURLsReason, isNumber, + isString, } from '#validators'; import {withLengthOfList, withNearbyItemFromList, withPropertyFromObject} @@ -48,6 +49,22 @@ export class TrackSection extends Thing { name: name(V('Unnamed Track Section')), + // Track sections don't have a Name Detail themselves, but they do provide + // a value which tracks can reference via 'Name Detail: section'. + nameDetailForTracks: { + flags: {update: true, expose: true}, + + update: {validate: isString}, + + expose: { + dependencies: ['name'], + transform: (value, {name}) => + (value + ? value + : name), + }, + }, + unqualifiedDirectory: directory(), directorySuffixForTracks: [ @@ -55,18 +72,25 @@ export class TrackSection extends Thing { validate: input.value(isDirectory), }), - withPropertyFromObject('album', V('directorySuffixForTracks')), - exposeDependency('#album.directorySuffixForTracks'), + { + dependencies: ['unqualifiedDirectory', 'name', 'nameDetailForTracks'], + compute: ({unqualifiedDirectory, name, nameDetailForTracks}) => + (nameDetailForTracks === name + ? unqualifiedDirectory + : getKebabCase(nameDetailForTracks)), + }, ], - suffixTrackDirectoriesByDefault: [ - exposeUpdateValueOrContinue({ - validate: input.value(isBoolean), - }), - - withPropertyFromObject('album', V('suffixTrackDirectoriesByDefault')), - exposeDependency('#album.suffixTrackDirectoriesByDefault'), - ], + // Not quite a flag, because it supports (and defaults to) null. + // The value false means to explicitly ignore that the album is + // providing Suffix Track Directories: true. The value true means + // to use the TRACK SECTION's own directory suffix. The value null + // defers to the album's suffixTrackDirectoriesByDefault, which is + // simply true or false. + suffixTrackDirectoriesByDefault: { + flags: {expose: true, update: true}, + update: {validate: isBoolean}, + }, color: [ exposeUpdateValueOrContinue({ @@ -204,6 +228,8 @@ export class TrackSection extends Thing { static [Thing.yamlDocumentSpec] = { fields: { 'Section': {property: 'name'}, + 'Name Detail For Tracks': {property: 'nameDetailForTracks'}, + 'Directory Suffix': {property: 'directorySuffixForTracks'}, 'Suffix Track Directories': {property: 'suffixTrackDirectoriesByDefault'}, |