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