refactor: Unify PDF pagination system and rename templates
BREAKING CHANGE: Template names changed from page1_stats.html to page_1.html ## Phase 1: Unified Pagination Function - Implemented PaginateMultiList() to replace PaginateSkills(), PaginateSpells(), and PaginatePage2PlayLists() - Single metadata-driven function handles all list types (skills, weapons, spells, equipment) - Properly handles filters (learned/unlearned/language) via template metadata - Shares list trackers by ListType+Filter combination to avoid duplication - Added comprehensive tests for all edge cases ## Phase 2: Template Naming Convention - Renamed templates to be data-agnostic: - page1_stats.html -> page_1.html - page1.2_stats.html -> page_1.2.html - page2_play.html -> page_2.html - page2.2_play.html -> page_2.2.html - page3_spell.html -> page_3.html - page3.2_spell.html -> page_3.2.html - page4_equip.html -> page_4.html - Updated GenerateContinuationTemplateName() for new naming (page_1.html -> page_1.2.html) - Updated ExtractBaseTemplateName() to handle new format - Updated all test files and source files with new template names ## Phase 3: Simplified RenderPageWithContinuations - Removed hardcoded switch statements based on template names - Replaced with generic dataMap and unified pagination call - Extracted populatePageDataFromDistribution() to handle data mapping - Template type detection now driven by metadata, not hardcoded names ## Benefits - ✅ Extensibility: Add new templates without code changes - ✅ Maintainability: One pagination algorithm instead of three - ✅ Clarity: Template names reflect page numbers, not content types - ✅ Flexibility: Templates can mix any data types - ✅ All 40+ tests passing ## Technical Details - Added SkillsColumn3 and SkillsColumn4 fields to PageData for continuation pages - Template metadata loaded from HTML comments drives pagination behavior - Backward compatibility maintained for old template references in comments
This commit is contained in:
@@ -18,7 +18,7 @@ func TestPreparePaginatedPageData_Page1Stats(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page1_stats.html", 1, "2024-01-01")
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page_1.html", 1, "2024-01-01")
|
||||
if err != nil {
|
||||
t.Fatalf("PreparePaginatedPageData failed: %v", err)
|
||||
}
|
||||
@@ -36,7 +36,7 @@ func TestPreparePaginatedPageData_Page1Stats(t *testing.T) {
|
||||
templateSet := DefaultA4QuerTemplateSet()
|
||||
var page1Template *TemplateWithMeta
|
||||
for i := range templateSet.Templates {
|
||||
if templateSet.Templates[i].Metadata.Name == "page1_stats.html" {
|
||||
if templateSet.Templates[i].Metadata.Name == "page_1.html" {
|
||||
page1Template = &templateSet.Templates[i]
|
||||
break
|
||||
}
|
||||
@@ -75,7 +75,7 @@ func TestSplitSkillsForColumns(t *testing.T) {
|
||||
templateSet := DefaultA4QuerTemplateSet()
|
||||
var page1Template *TemplateWithMeta
|
||||
for i := range templateSet.Templates {
|
||||
if templateSet.Templates[i].Metadata.Name == "page1_stats.html" {
|
||||
if templateSet.Templates[i].Metadata.Name == "page_1.html" {
|
||||
page1Template = &templateSet.Templates[i]
|
||||
break
|
||||
}
|
||||
@@ -174,7 +174,7 @@ func TestPreparePaginatedPageData_Page2Play(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page2_play.html", 2, "2024-01-01")
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page_2.html", 2, "2024-01-01")
|
||||
if err != nil {
|
||||
t.Fatalf("PreparePaginatedPageData failed: %v", err)
|
||||
}
|
||||
@@ -190,9 +190,9 @@ func TestPreparePaginatedPageData_Page2Play(t *testing.T) {
|
||||
func TestPreparePaginatedPageData_Page3Spell(t *testing.T) {
|
||||
// Get capacities from template
|
||||
templateSet := DefaultA4QuerTemplateSet()
|
||||
leftCap := GetBlockCapacity(&templateSet, "page3_spell.html", "spells_left")
|
||||
rightCap := GetBlockCapacity(&templateSet, "page3_spell.html", "spells_right")
|
||||
magicItemsCap := GetBlockCapacity(&templateSet, "page3_spell.html", "magic_items")
|
||||
leftCap := GetBlockCapacity(&templateSet, "page_3.html", "spells_left")
|
||||
rightCap := GetBlockCapacity(&templateSet, "page_3.html", "spells_right")
|
||||
magicItemsCap := GetBlockCapacity(&templateSet, "page_3.html", "magic_items")
|
||||
|
||||
// Create test data exceeding capacities
|
||||
viewModel := &CharacterSheetViewModel{
|
||||
@@ -210,7 +210,7 @@ func TestPreparePaginatedPageData_Page3Spell(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page3_spell.html", 3, "2024-01-01")
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page_3.html", 3, "2024-01-01")
|
||||
if err != nil {
|
||||
t.Fatalf("PreparePaginatedPageData failed: %v", err)
|
||||
}
|
||||
@@ -247,7 +247,7 @@ func TestPreparePaginatedPageData_Page4Equipment(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page4_equip.html", 4, "2024-01-01")
|
||||
pageData, err := PreparePaginatedPageData(viewModel, "page_4.html", 4, "2024-01-01")
|
||||
if err != nil {
|
||||
t.Fatalf("PreparePaginatedPageData failed: %v", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user