diff options
Diffstat (limited to 'src/data/things/group.js')
-rw-r--r-- | src/data/things/group.js | 98 |
1 files changed, 73 insertions, 25 deletions
diff --git a/src/data/things/group.js b/src/data/things/group.js index 0dbbbb7f..b40d15b4 100644 --- a/src/data/things/group.js +++ b/src/data/things/group.js @@ -1,15 +1,18 @@ export const GROUP_DATA_FILE = 'groups.yaml'; import {input} from '#composite'; -import find from '#find'; import Thing from '#thing'; +import {parseAnnotatedReferences, parseSerieses} from '#yaml'; import { + annotatedReferenceList, color, contentString, directory, name, referenceList, + seriesList, + soupyFind, urls, wikiData, } from '#composite/wiki-properties'; @@ -17,7 +20,7 @@ import { export class Group extends Thing { static [Thing.referenceType] = 'group'; - static [Thing.getPropertyDescriptors] = ({Album}) => ({ + static [Thing.getPropertyDescriptors] = ({Album, Artist}) => ({ // Update & expose name: name('Unnamed Group'), @@ -27,22 +30,28 @@ export class Group extends Thing { urls: urls(), - featuredAlbums: referenceList({ - class: input.value(Album), - find: input.value(find.album), - data: 'albumData', - }), + closelyLinkedArtists: annotatedReferenceList({ + class: input.value(Artist), + find: soupyFind.input('artist'), - // Update only + reference: input.value('artist'), + thing: input.value('artist'), + }), - albumData: wikiData({ + featuredAlbums: referenceList({ class: input.value(Album), + find: soupyFind.input('album'), }), - groupCategoryData: wikiData({ - class: input.value(GroupCategory), + serieses: seriesList({ + group: input.myself(), }), + // Update only + + find: soupyFind(), + reverse: soupyFind(), + // Expose only descriptionShort: { @@ -61,9 +70,9 @@ export class Group extends Thing { flags: {expose: true}, expose: { - dependencies: ['this', 'albumData'], - compute: ({this: group, albumData}) => - albumData?.filter((album) => album.groups.includes(group)) ?? [], + dependencies: ['this', 'reverse'], + compute: ({this: group, reverse}) => + reverse.albumsWhoseGroupsInclude(group), }, }, @@ -71,9 +80,9 @@ export class Group extends Thing { flags: {expose: true}, expose: { - dependencies: ['this', 'groupCategoryData'], - compute: ({this: group, groupCategoryData}) => - groupCategoryData.find((category) => category.groups.includes(group)) + dependencies: ['this', 'reverse'], + compute: ({this: group, reverse}) => + reverse.groupCategoriesWhichInclude(group, {unique: true}) ?.color, }, }, @@ -82,9 +91,9 @@ export class Group extends Thing { flags: {expose: true}, expose: { - dependencies: ['this', 'groupCategoryData'], - compute: ({this: group, groupCategoryData}) => - groupCategoryData.find((category) => category.groups.includes(group)) ?? + dependencies: ['this', 'reverse'], + compute: ({this: group, reverse}) => + reverse.groupCategoriesWhichInclude(group, {unique: true}) ?? null, }, }, @@ -97,6 +106,25 @@ export class Group extends Thing { }, }; + static [Thing.reverseSpecs] = { + groupsCloselyLinkedTo: { + bindTo: 'groupData', + + referencing: group => + group.closelyLinkedArtists + .map(({artist, ...referenceDetails}) => ({ + group, + artist, + referenceDetails, + })), + + referenced: ({artist}) => [artist], + + tidy: ({group, referenceDetails}) => + ({group, ...referenceDetails}), + }, + }; + static [Thing.yamlDocumentSpec] = { fields: { 'Group': {property: 'name'}, @@ -104,8 +132,22 @@ export class Group extends Thing { 'Description': {property: 'description'}, 'URLs': {property: 'urls'}, + 'Closely Linked Artists': { + property: 'closelyLinkedArtists', + transform: value => + parseAnnotatedReferences(value, { + referenceField: 'Artist', + referenceProperty: 'artist', + }), + }, + 'Featured Albums': {property: 'featuredAlbums'}, + 'Series': { + property: 'serieses', + transform: parseSerieses, + }, + 'Review Points': {ignore: true}, }, }; @@ -174,17 +216,23 @@ export class GroupCategory extends Thing { groups: referenceList({ class: input.value(Group), - find: input.value(find.group), - data: 'groupData', + find: soupyFind.input('group'), }), // Update only - groupData: wikiData({ - class: input.value(Group), - }), + find: soupyFind(), }); + static [Thing.reverseSpecs] = { + groupCategoriesWhichInclude: { + bindTo: 'groupCategoryData', + + referencing: groupCategory => [groupCategory], + referenced: groupCategory => groupCategory.groups, + }, + }; + static [Thing.yamlDocumentSpec] = { fields: { 'Category': {property: 'name'}, |