Compositions page and listings working.

This commit is contained in:
JesseBrault0709 2024-06-01 10:18:29 +02:00
parent 4d5b84bdbe
commit 333087f053
10 changed files with 128 additions and 18 deletions

View File

@ -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
}
}
}

View File

@ -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'))
}
} }

View File

@ -0,0 +1,7 @@
---
package com.jessebrault.site
---
<article>
<h3>$category</h3>
<Each items={compositions} transform={<CompositionListing (it) />} />
</article>

View File

@ -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>

View File

@ -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() {

View File

@ -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>

View File

@ -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
} }

View File

@ -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) }
}
}

View File

@ -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())
} }
} }
} }

View File

@ -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_.