mirror of
				https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
				synced 2025-10-30 01:25:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package viewmodels
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"slices"
 | |
| 	"sort"
 | |
| 	"strconv"
 | |
| 
 | |
| 	"github.com/Theodor-Springmann-Stiftung/kgpz_web/providers/xmlprovider"
 | |
| )
 | |
| 
 | |
| type IssuesByMonth map[int][]IssueViewModel
 | |
| 
 | |
| type YearViewModel struct {
 | |
| 	Year           string
 | |
| 	AvailableYears []string
 | |
| 	Issues         IssuesByMonth
 | |
| }
 | |
| 
 | |
| func YearView(year string, lib *xmlprovider.Library) (*YearViewModel, error) {
 | |
| 	res := YearViewModel{Year: year}
 | |
| 	res.Issues = make(IssuesByMonth, 12)
 | |
| 	last := ""
 | |
| 
 | |
| 	lib.Issues.Items.Range(func(key, value interface{}) bool {
 | |
| 		k := key.(string)
 | |
| 		if len(k) < 4 {
 | |
| 			return true
 | |
| 		}
 | |
| 
 | |
| 		date := k[0:4]
 | |
| 		if date != last {
 | |
| 			res.PushAvailable(date)
 | |
| 			last = date
 | |
| 		}
 | |
| 
 | |
| 		if date == year {
 | |
| 			issue := value.(xmlprovider.Issue)
 | |
| 			res.PushIssue(issue)
 | |
| 		}
 | |
| 		return true
 | |
| 	})
 | |
| 
 | |
| 	if len(res.Issues) == 0 {
 | |
| 		return nil, errors.New("No issues found for year " + year)
 | |
| 	}
 | |
| 
 | |
| 	res.Sort()
 | |
| 
 | |
| 	return &res, nil
 | |
| }
 | |
| 
 | |
| func (y *YearViewModel) Sort() {
 | |
| 	y.SortAvailableYears()
 | |
| 	y.Issues.Sort()
 | |
| }
 | |
| 
 | |
| func (y *YearViewModel) PushIssue(i xmlprovider.Issue) {
 | |
| 	iv, err := FromIssue(i)
 | |
| 	if err != nil {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	list, ok := y.Issues[iv.Month]
 | |
| 	if !ok {
 | |
| 		list = []IssueViewModel{}
 | |
| 	} else {
 | |
| 		for _, issue := range list {
 | |
| 			if issue.Number.No == iv.Number.No {
 | |
| 				return
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	y.Issues[iv.Month] = append(list, *iv)
 | |
| }
 | |
| 
 | |
| func (y *YearViewModel) PushAvailable(s string) {
 | |
| 
 | |
| 	if !slices.Contains(y.AvailableYears, s) {
 | |
| 		y.AvailableYears = append(y.AvailableYears, s)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (y *YearViewModel) SortAvailableYears() {
 | |
| 	sort.Slice(y.AvailableYears, func(i, j int) bool {
 | |
| 		iint, err := strconv.Atoi(y.AvailableYears[i])
 | |
| 		if err != nil {
 | |
| 			return true
 | |
| 		}
 | |
| 		jint, err := strconv.Atoi(y.AvailableYears[j])
 | |
| 		if err != nil {
 | |
| 			return false
 | |
| 		}
 | |
| 		return iint < jint
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func (ibm *IssuesByMonth) Sort() {
 | |
| 	for _, issues := range *ibm {
 | |
| 		sort.Slice(issues, func(i, j int) bool {
 | |
| 			return issues[i].Number.No < issues[j].Number.No
 | |
| 		})
 | |
| 	}
 | |
| }
 | 
