From 8ac83829b4f1add4c57504210d08758e63540853 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Wed, 10 Jun 2026 10:32:21 -0300 Subject: data: Track: 'Name Detail: section' --- src/data/things/Track.js | 39 +++++++++++++++++++++++------ src/data/things/album/TrackSection.js | 46 +++++++++++++++++++++++++++-------- 2 files changed, 67 insertions(+), 18 deletions(-) (limited to 'src/data/things') 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'}, -- cgit 1.3.0-6-gf8a5