all repos — homestead @ c1c8d38ce51b2b830bdeacfa1db2959910f7cf9e

Code for my website

calendar: differentiate between confirmed and tentative periods replace golang-ical import with vimagination.zapto.org/ics

Alan Pearce
commit

c1c8d38ce51b2b830bdeacfa1db2959910f7cf9e

parent

4c07535d9120fb999b0c008f1866972865f424f7

M go.modgo.mod
@@ -14,7 +14,6 @@ github.com/andybalholm/brotli v1.1.1
github.com/antchfx/xmlquery v1.4.4 github.com/antchfx/xpath v1.3.3 github.com/ardanlabs/conf/v3 v3.4.0 - github.com/arran4/golang-ical v0.3.2 github.com/benpate/digit v0.13.4 github.com/crewjam/csp v0.0.2 github.com/deckarep/golang-set/v2 v2.7.0
@@ -34,6 +33,7 @@ go.hacdias.com/indielib v0.4.3
go.uber.org/zap v1.27.0 modernc.org/sqlite v1.36.0 tailscale.com v1.82.4 + vimagination.zapto.org/ics v1.0.0 ) require (
@@ -160,6 +160,7 @@ modernc.org/libc v1.61.13 // indirect
modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.8.2 // indirect moul.io/zapfilter v1.7.0 // indirect + vimagination.zapto.org/parser v1.0.3 // indirect willnorris.com/go/microformats v1.2.1-0.20240301064101-b5d1b9d2120e // indirect willnorris.com/go/webmention v0.0.0-20220108183051-4a23794272f0 // indirect )
M go.sumgo.sum
@@ -41,8 +41,6 @@ github.com/ardanlabs/conf/v3 v3.4.0 h1:Qy7/doJjhsv7Lvzqd9tbvH8fAZ9jzqKtwnwcmZ+sxGs=
github.com/ardanlabs/conf/v3 v3.4.0/go.mod h1:OIi6NK95fj8jKFPdZ/UmcPlY37JBg99hdP9o5XmNK9c= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/arran4/golang-ical v0.3.2 h1:MGNjcXJFSuCXmYX/RpZhR2HDCYoFuK8vTPFLEdFC3JY= -github.com/arran4/golang-ical v0.3.2/go.mod h1:xblDGxxIUMWwFZk9dlECUlc1iXNV65LJZOTHLVwu8bo= github.com/aws/aws-sdk-go-v2 v1.36.0 h1:b1wM5CcE65Ujwn565qcwgtOTT1aT4ADOHHgglKjG7fk= github.com/aws/aws-sdk-go-v2 v1.36.0/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= github.com/aws/aws-sdk-go-v2/config v1.29.5 h1:4lS2IB+wwkj5J43Tq/AwvnscBerBJtQQ6YS7puzCI1k=
@@ -571,6 +569,11 @@ software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k=
software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= tailscale.com v1.82.4 h1:J8QEVQ2DOM0Oy0Ac2UkdBpi8bDvTaGEgd+bBz3g2o7w= tailscale.com v1.82.4/go.mod h1:iU6kohVzG+bP0/5XjqBAnW8/6nSG/Du++bO+x7VJZD0= +vimagination.zapto.org/ics v1.0.0 h1:WWC1R5kyj+/86FG6ngGuGWcm046O1rjRfYSLpXm5XaE= +vimagination.zapto.org/ics v1.0.0/go.mod h1:w/Bwf1Da6CLMMVLZGICQFsvlpKcRHeh7UO1brwEmPuQ= +vimagination.zapto.org/parser v1.0.0/go.mod h1:WT+8/T+qTZDNVO5GcXv8pWSn7AIWakJZWMN1mL662WY= +vimagination.zapto.org/parser v1.0.3 h1:92c0HzyclrZa+ywEa/ensE69Baol0/tXqU6ExsS9olM= +vimagination.zapto.org/parser v1.0.3/go.mod h1:/H483adsvbp1SLfB0xfFBVfh+mze11+FHwCijc0rpCc= willnorris.com/go/microformats v1.2.1-0.20240301064101-b5d1b9d2120e h1:TRIOwo0NxN4KVSgYlYmiQktd9I96YgZ3942/JVzhwTM= willnorris.com/go/microformats v1.2.1-0.20240301064101-b5d1b9d2120e/go.mod h1:zzo0hFA/E/nl1ZAjXiXA7KCKwCTdgBU+7HXltGgHeGA= willnorris.com/go/webmention v0.0.0-20220108183051-4a23794272f0 h1:V5+O+YZHchEwu6ZmPcqT1dQ+mHgE356Q+w9SVOQ+QZg=
M gomod2nix.tomlgomod2nix.toml
@@ -52,9 +52,6 @@ hash = "sha256-Ent9bgBTjKS8/61LKrIu/JcBI/Qsv6EEIojwsMjCgdY="
[mod."github.com/ardanlabs/conf/v3"] version = "v3.4.0" hash = "sha256-FwIPi48V6Vmt3E41CZ2PO2m3Rg59PAM41k1RGVkpOWo=" - [mod."github.com/arran4/golang-ical"] - version = "v0.3.2" - hash = "sha256-afFuM8b+llveV5vlwx4rb4nAd10Us5L4nSgaC95eIN8=" [mod."github.com/aws/aws-sdk-go-v2"] version = "v1.36.0" hash = "sha256-j1XPvTErqlSE8iJzi3nZPeDV8oOt+UWhRuK7TyJwIK8="
@@ -457,6 +454,12 @@ hash = "sha256-H6j5h8w123Y7d0zvKGkL5jiRYICtjmgzd2P/eeNaLrs="
[mod."tailscale.com"] version = "v1.82.4" hash = "sha256-19yfGXKlpMUy7F4PgtWKk7cVpHYOtxpOojWspeNiMhA=" + [mod."vimagination.zapto.org/ics"] + version = "v1.0.0" + hash = "sha256-EsfFiyljYm0y2nlZyXa+yvkZC4LyT9EGmb5raAiMK54=" + [mod."vimagination.zapto.org/parser"] + version = "v1.0.3" + hash = "sha256-hzPZC7//0dWXzY7RwUNwufLL4qhQhKrawlnJoYkDgic=" [mod."willnorris.com/go/microformats"] version = "v1.2.1-0.20240301064101-b5d1b9d2120e" hash = "sha256-7pXSTRKqzgN1CaeB1bep+V24O6yNIPNDNDL6AZPiI8A="
M internal/calendar/calendar.gointernal/calendar/calendar.go
@@ -13,8 +13,8 @@ "time"
"github.com/Southclaws/fault" "github.com/Southclaws/fault/fmsg" - ical "github.com/arran4/golang-ical" "go.alanpearce.eu/x/log" + ical "vimagination.zapto.org/ics" "go.alanpearce.eu/homestead/internal/cache" "go.alanpearce.eu/homestead/internal/config"
@@ -38,9 +38,10 @@ *ical.Calendar
} type Busy struct { - ical.VBusy + ical.FreeBusy StartTime Date EndTime Date + Type ical.ParamFreeBusyType } type Date struct {
@@ -97,7 +98,7 @@ return err
} defer f.Close() - c.Calendar, err = ical.ParseCalendar(f) + c.Calendar, err = ical.Decode(f) if err != nil { c.log.Warn("error parsing calendar", "error", err)
@@ -157,34 +158,25 @@ if c.Calendar == nil {
return nil, fault.New("calendar not initialised") } - in := c.Busys() - bs := make([]*Busy, 0, len(in)) - - for _, b := range in { - st, err := b.GetStartAt() - if err != nil { - c.log.Warn("could not get start time", "event", b.Id(), "error", err) - - continue - } + bs := make([]*Busy, 0, len(c.FreeBusy)) - et, err := b.GetEndAt() - if err != nil { - c.log.Warn("could not get end time", "event", b.Id(), "error", err) + for _, fb := range c.FreeBusy { + for _, b := range fb.FreeBusy { + st := b.Start + et := b.End - continue - } + if st.Before(from) && et.Before(from) || + st.After(to) && et.After(to) { + continue + } - if st.Before(from) && et.Before(from) || - st.After(to) && et.After(to) { - continue + bs = append(bs, &Busy{ + FreeBusy: fb, + Type: *b.FreeBusyType, + StartTime: Date{Time: st.Time}, + EndTime: Date{Time: et.Time}, + }) } - - bs = append(bs, &Busy{ - VBusy: *b, - StartTime: Date{Time: st}, - EndTime: Date{Time: et}, - }) } slices.SortFunc(bs, func(a, b *Busy) int {
@@ -241,7 +233,7 @@ return nil, fault.Wrap(err, fmsg.With("could not get events"))
} for _, ev := range evs { - c.log.Debug("processing event", "id", ev.Id()) + c.log.Debug("processing event", "id", ev.UID) cd.BusyPeriods = append(cd.BusyPeriods, ev) }
M templates/calendar.gotemplates/calendar.go
@@ -7,6 +7,7 @@
g "go.alanpearce.eu/gomponents" c "go.alanpearce.eu/gomponents/components" . "go.alanpearce.eu/gomponents/html" + "vimagination.zapto.org/ics" "go.alanpearce.eu/homestead/internal/calendar" )
@@ -48,7 +49,10 @@ g.Text(date.Format("Mon _2"))),
), g.Map(date.BusyPeriods, func(e *calendar.Busy) g.Node { return Div( - Class("event"), + c.Classes{ + "event": true, + "tentative": e.Type == ics.FreeBusyTypeBusyTentative, + }, TitleAttr( fmt.Sprintf( "%s–%s",
@@ -64,6 +68,9 @@ g.Text("–"),
g.If(e.EndTime.After(date.EndOfDay()), CTime(date.EndOfDay()), CTime(e.EndTime), + ), + g.If(e.Type == ics.FreeBusyTypeBusyTentative, + g.Text("?"), ), ) }),
M templates/style.csstemplates/style.css
@@ -269,7 +269,6 @@ gap: 0.5ch;
} .day { - padding: 0.2ch 0.5ch 0.5ch; min-height: 6rem; }
@@ -289,6 +288,10 @@ }
.event { font-size: 0.9rem; +} + +.tentative { + opacity: 0.75; } .today {