1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
import {input, V} from '#composite';
import Thing from '#thing';
import {anyOf, is, isCountingNumber, validateReference} from '#validators';
import {exposeConstant, exposeDependency} from '#composite/control-flow';
import {withResolvedReference} from '#composite/wiki-data';
import {referenceList, soupyFind} from '#composite/wiki-properties';
import {HomepageLayoutRow} from './HomepageLayoutRow.js';
export class HomepageLayoutAlbumGridRow extends HomepageLayoutRow {
static [Thing.friendlyName] = `Homepage Album Grid Row`;
static [Thing.getPropertyDescriptors] = (opts, {Album, Group} = opts) => ({
// Update & expose
sourceGroup: [
{
flags: {expose: true, update: true, compose: true},
update: {
validate:
anyOf(
is('new-releases', 'new-additions'),
validateReference(Group[Thing.referenceType])),
},
expose: {
transform: (value, continuation) =>
(value === 'new-releases' || value === 'new-additions'
? value
: continuation(value)),
},
},
withResolvedReference({
ref: input.updateValue(),
find: soupyFind.input('group'),
}),
exposeDependency('#resolvedReference'),
],
sourceAlbums: referenceList({
class: input.value(Album),
find: soupyFind.input('album'),
}),
countAlbumsFromGroup: {
flags: {update: true, expose: true},
update: {validate: isCountingNumber},
},
// Expose only
isHomepageLayoutAlbumGridRow: exposeConstant(V(true)),
type: exposeConstant(V('album grid')),
});
static [Thing.yamlDocumentSpec] = {
fields: {
'Group': {property: 'sourceGroup'},
'Count': {property: 'countAlbumsFromGroup'},
'Albums': {property: 'sourceAlbums'},
},
};
}
|