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

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

View File

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

View File

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

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

View File

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