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