Compositions page and listings working.
This commit is contained in:
parent
4d5b84bdbe
commit
333087f053
@ -0,0 +1,22 @@
|
|||||||
|
package com.jessebrault.site
|
||||||
|
|
||||||
|
import com.jessebrault.site.composition.Composition
|
||||||
|
import groowt.view.component.web.BaseWebViewComponent
|
||||||
|
|
||||||
|
class CompositionCategory extends BaseWebViewComponent {
|
||||||
|
|
||||||
|
final String category
|
||||||
|
private final Set<Composition> compositions
|
||||||
|
|
||||||
|
CompositionCategory(Map attr) {
|
||||||
|
this.category = attr.category
|
||||||
|
this.compositions = attr.compositions
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Composition> getCompositions() {
|
||||||
|
this.compositions.sort { c0, c1 ->
|
||||||
|
c1.date <=> c0.date
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,6 +3,8 @@ package com.jessebrault.site
|
|||||||
import com.jessebrault.site.composition.Composition
|
import com.jessebrault.site.composition.Composition
|
||||||
import groowt.view.component.web.BaseWebViewComponent
|
import groowt.view.component.web.BaseWebViewComponent
|
||||||
|
|
||||||
|
import java.time.format.DateTimeFormatter
|
||||||
|
|
||||||
class CompositionListing extends BaseWebViewComponent {
|
class CompositionListing extends BaseWebViewComponent {
|
||||||
|
|
||||||
final Composition composition
|
final Composition composition
|
||||||
@ -11,4 +13,8 @@ class CompositionListing extends BaseWebViewComponent {
|
|||||||
this.composition = composition
|
this.composition = composition
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String renderDate() {
|
||||||
|
composition.date.format(DateTimeFormatter.ofPattern('yyyy'))
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
package com.jessebrault.site
|
||||||
|
---
|
||||||
|
<article>
|
||||||
|
<h3>$category</h3>
|
||||||
|
<Each items={compositions} transform={<CompositionListing (it) />} />
|
||||||
|
</article>
|
@ -1,4 +1,19 @@
|
|||||||
---
|
---
|
||||||
package com.jessebrault.site
|
package com.jessebrault.site
|
||||||
---
|
---
|
||||||
<p>$composition.title</p>
|
<div class="composition-listing">
|
||||||
|
<div class="info-row-1">
|
||||||
|
<h4 class="title">$composition.title</h4>
|
||||||
|
<WhenNotNull item={composition.subTitle} render={<h5 class="sub-title">$it</h5>} />
|
||||||
|
<WhenNotNull item={composition.version} render={<span class="version">$it</span>} />
|
||||||
|
</div>
|
||||||
|
<div class="info-row-2">
|
||||||
|
<span class="instrumentation">$composition.instrumentation</span>
|
||||||
|
</div>
|
||||||
|
<WhenNotNull item={composition.shortInfo} render={
|
||||||
|
<div class="info-row-3"><span class="short-info">$composition.shortInfo</span></div>
|
||||||
|
} />
|
||||||
|
<div class="date-column">
|
||||||
|
<span class="date">${renderDate()}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
package com.jessebrault.site
|
package com.jessebrault.site
|
||||||
|
|
||||||
import com.jessebrault.site.composition.Composition
|
import com.jessebrault.site.composition.CompositionContainer
|
||||||
import com.jessebrault.site.util.TitleMaker
|
import com.jessebrault.site.util.TitleMaker
|
||||||
import com.jessebrault.ssg.di.InjectTexts
|
import com.jessebrault.ssg.di.Global
|
||||||
import com.jessebrault.ssg.page.PageSpec
|
import com.jessebrault.ssg.page.PageSpec
|
||||||
import com.jessebrault.ssg.text.Text
|
|
||||||
import com.jessebrault.ssg.view.WvcPageView
|
import com.jessebrault.ssg.view.WvcPageView
|
||||||
import jakarta.inject.Inject
|
import jakarta.inject.Inject
|
||||||
|
|
||||||
@ -12,14 +11,18 @@ import jakarta.inject.Inject
|
|||||||
class CompositionsPage extends WvcPageView {
|
class CompositionsPage extends WvcPageView {
|
||||||
|
|
||||||
private final TitleMaker titleMaker
|
private final TitleMaker titleMaker
|
||||||
final Set<Composition> compositions
|
final CompositionContainer compositions
|
||||||
|
final List<String> categories
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
CompositionsPage(TitleMaker titleMaker, @InjectTexts('/compositions/*.md') Set<Text> compositions) {
|
CompositionsPage(
|
||||||
|
TitleMaker titleMaker,
|
||||||
|
CompositionContainer compositions,
|
||||||
|
@Global('compositionCategories') List<String> categories
|
||||||
|
) {
|
||||||
this.titleMaker = titleMaker
|
this.titleMaker = titleMaker
|
||||||
this.compositions = compositions.collect {
|
this.compositions = compositions
|
||||||
new Composition(it, it.frontMatter.title)
|
this.categories = categories
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String getTitle() {
|
String getTitle() {
|
||||||
|
@ -2,8 +2,14 @@
|
|||||||
package com.jessebrault.site
|
package com.jessebrault.site
|
||||||
---
|
---
|
||||||
<StandardPage title={title}>
|
<StandardPage title={title}>
|
||||||
<article>
|
<section>
|
||||||
<h1>Compositions</h1>
|
<h1>Compositions</h1>
|
||||||
<Each items={compositions} transform={<CompositionListing (it) />} />
|
<Each
|
||||||
</article>
|
items={categories}
|
||||||
|
transform={<CompositionCategory
|
||||||
|
category={it}
|
||||||
|
compositions={compositions.getByCategory(it)}
|
||||||
|
/>}
|
||||||
|
/>
|
||||||
|
</section>
|
||||||
</StandardPage>
|
</StandardPage>
|
||||||
|
@ -2,15 +2,20 @@ package com.jessebrault.site.composition
|
|||||||
|
|
||||||
import com.jessebrault.ssg.text.Text
|
import com.jessebrault.ssg.text.Text
|
||||||
import groovy.transform.EqualsAndHashCode
|
import groovy.transform.EqualsAndHashCode
|
||||||
import groovy.transform.NullCheck
|
|
||||||
import groovy.transform.ToString
|
import groovy.transform.ToString
|
||||||
import groovy.transform.TupleConstructor
|
import org.jetbrains.annotations.Nullable
|
||||||
|
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
@TupleConstructor(defaults = false)
|
|
||||||
@NullCheck(includeGenerated = true)
|
|
||||||
@EqualsAndHashCode
|
@EqualsAndHashCode
|
||||||
@ToString
|
@ToString
|
||||||
class Composition {
|
class Composition {
|
||||||
final Text text
|
Text text
|
||||||
final String title
|
String title
|
||||||
|
@Nullable String subTitle
|
||||||
|
@Nullable String version
|
||||||
|
String instrumentation
|
||||||
|
@Nullable String shortInfo
|
||||||
|
LocalDate date
|
||||||
|
Set<String> categories
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package com.jessebrault.site.composition
|
||||||
|
|
||||||
|
import com.jessebrault.ssg.di.InjectTexts
|
||||||
|
import com.jessebrault.ssg.text.Text
|
||||||
|
import jakarta.inject.Inject
|
||||||
|
|
||||||
|
import java.time.LocalDate
|
||||||
|
|
||||||
|
class CompositionContainer {
|
||||||
|
|
||||||
|
private final Set<Composition> compositions
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
CompositionContainer(@InjectTexts('/compositions/*.md') Set<Text> compositionTexts) {
|
||||||
|
this.compositions = compositionTexts.collect { text ->
|
||||||
|
new Composition(
|
||||||
|
text: text,
|
||||||
|
title: text.frontMatter.title,
|
||||||
|
subTitle: text.frontMatter.subTitle,
|
||||||
|
version: text.frontMatter.version,
|
||||||
|
instrumentation: text.frontMatter.instrumentation,
|
||||||
|
shortInfo: text.frontMatter.shortInfo,
|
||||||
|
date: LocalDate.parse(text.frontMatter.date),
|
||||||
|
categories: text.frontMatter.categories as Set<String>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Composition> getAll() {
|
||||||
|
this.compositions
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Composition> getByCategory(String category) {
|
||||||
|
this.compositions.findAll { it.categories.contains(category) }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
import com.jessebrault.site.composition.CompositionContainer
|
||||||
import com.jessebrault.site.util.TitleMaker
|
import com.jessebrault.site.util.TitleMaker
|
||||||
import com.jessebrault.ssg.buildscript.BuildScriptBase
|
import com.jessebrault.ssg.buildscript.BuildScriptBase
|
||||||
import groovy.transform.BaseScript
|
import groovy.transform.BaseScript
|
||||||
@ -14,10 +15,12 @@ build {
|
|||||||
globals {
|
globals {
|
||||||
siteTagLine = 'Conductor and Composer'
|
siteTagLine = 'Conductor and Composer'
|
||||||
menuItems = ['Biography', 'Compositions']
|
menuItems = ['Biography', 'Compositions']
|
||||||
|
compositionCategories = ['Chamber']
|
||||||
}
|
}
|
||||||
objectFactoryBuilder.configure {
|
objectFactoryBuilder.configure {
|
||||||
configureRegistry {
|
configureRegistry {
|
||||||
bind(TitleMaker, toSelf())
|
bind(TitleMaker, toSelf())
|
||||||
|
bind(CompositionContainer, toSelf())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
---
|
---
|
||||||
title: Spirit Travels
|
title: Spirit Travels
|
||||||
|
version: Chamber orchestra version
|
||||||
|
instrumentation: For fl, ob, cl, hn, 2 perc, pno, and strings 2.2.2.2.1.
|
||||||
|
shortInfo: <em>In memoriam</em> Jane H. Kim.
|
||||||
|
date: 2023-12-01
|
||||||
|
categories:
|
||||||
|
- Chamber
|
||||||
---
|
---
|
||||||
Information about _Spirit Travels_.
|
Information about _Spirit Travels_.
|
||||||
|
Loading…
Reference in New Issue
Block a user