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 groowt.view.component.web.BaseWebViewComponent
|
||||
|
||||
import java.time.format.DateTimeFormatter
|
||||
|
||||
class CompositionListing extends BaseWebViewComponent {
|
||||
|
||||
final Composition composition
|
||||
@ -11,4 +13,8 @@ class CompositionListing extends BaseWebViewComponent {
|
||||
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
|
||||
---
|
||||
<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
|
||||
|
||||
import com.jessebrault.site.composition.Composition
|
||||
import com.jessebrault.site.composition.CompositionContainer
|
||||
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.text.Text
|
||||
import com.jessebrault.ssg.view.WvcPageView
|
||||
import jakarta.inject.Inject
|
||||
|
||||
@ -12,14 +11,18 @@ import jakarta.inject.Inject
|
||||
class CompositionsPage extends WvcPageView {
|
||||
|
||||
private final TitleMaker titleMaker
|
||||
final Set<Composition> compositions
|
||||
final CompositionContainer compositions
|
||||
final List<String> categories
|
||||
|
||||
@Inject
|
||||
CompositionsPage(TitleMaker titleMaker, @InjectTexts('/compositions/*.md') Set<Text> compositions) {
|
||||
CompositionsPage(
|
||||
TitleMaker titleMaker,
|
||||
CompositionContainer compositions,
|
||||
@Global('compositionCategories') List<String> categories
|
||||
) {
|
||||
this.titleMaker = titleMaker
|
||||
this.compositions = compositions.collect {
|
||||
new Composition(it, it.frontMatter.title)
|
||||
}
|
||||
this.compositions = compositions
|
||||
this.categories = categories
|
||||
}
|
||||
|
||||
String getTitle() {
|
||||
|
@ -2,8 +2,14 @@
|
||||
package com.jessebrault.site
|
||||
---
|
||||
<StandardPage title={title}>
|
||||
<article>
|
||||
<section>
|
||||
<h1>Compositions</h1>
|
||||
<Each items={compositions} transform={<CompositionListing (it) />} />
|
||||
</article>
|
||||
<Each
|
||||
items={categories}
|
||||
transform={<CompositionCategory
|
||||
category={it}
|
||||
compositions={compositions.getByCategory(it)}
|
||||
/>}
|
||||
/>
|
||||
</section>
|
||||
</StandardPage>
|
||||
|
@ -2,15 +2,20 @@ package com.jessebrault.site.composition
|
||||
|
||||
import com.jessebrault.ssg.text.Text
|
||||
import groovy.transform.EqualsAndHashCode
|
||||
import groovy.transform.NullCheck
|
||||
import groovy.transform.ToString
|
||||
import groovy.transform.TupleConstructor
|
||||
import org.jetbrains.annotations.Nullable
|
||||
|
||||
import java.time.LocalDate
|
||||
|
||||
@TupleConstructor(defaults = false)
|
||||
@NullCheck(includeGenerated = true)
|
||||
@EqualsAndHashCode
|
||||
@ToString
|
||||
class Composition {
|
||||
final Text text
|
||||
final String title
|
||||
Text text
|
||||
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.ssg.buildscript.BuildScriptBase
|
||||
import groovy.transform.BaseScript
|
||||
@ -14,10 +15,12 @@ build {
|
||||
globals {
|
||||
siteTagLine = 'Conductor and Composer'
|
||||
menuItems = ['Biography', 'Compositions']
|
||||
compositionCategories = ['Chamber']
|
||||
}
|
||||
objectFactoryBuilder.configure {
|
||||
configureRegistry {
|
||||
bind(TitleMaker, toSelf())
|
||||
bind(CompositionContainer, toSelf())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,10 @@
|
||||
---
|
||||
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_.
|
||||
|
Loading…
Reference in New Issue
Block a user