Add Calendar Events widget, integrate ICS calendar parsing, and refine related UI components
This commit is contained in:
@@ -78,7 +78,7 @@ func createTableForMonth(widget *text.Text) error {
|
||||
}
|
||||
}
|
||||
var str string
|
||||
if err := widget.Write("│"); err != nil {
|
||||
if err := widget.Write("│", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if field == 0 {
|
||||
@@ -96,7 +96,7 @@ func createTableForMonth(widget *text.Text) error {
|
||||
return err
|
||||
}
|
||||
if index%7 == 6 {
|
||||
if err := widget.Write("│\n"); err != nil {
|
||||
if err := widget.Write("│\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
89
widgets/calendarEvents.go
Normal file
89
widgets/calendarEvents.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package widgets
|
||||
|
||||
import (
|
||||
"ArinDash/apis/calendar"
|
||||
"ArinDash/util"
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/mum4k/termdash/cell"
|
||||
"github.com/mum4k/termdash/terminal/terminalapi"
|
||||
"github.com/mum4k/termdash/widgetapi"
|
||||
"github.com/mum4k/termdash/widgets/text"
|
||||
)
|
||||
|
||||
type CalendarEventsOptions struct {
|
||||
}
|
||||
|
||||
func CalendarEvents() CalendarEventsOptions {
|
||||
widgetOptions["CalendarEventsOptions"] = createCalendarEventsOptions
|
||||
return CalendarEventsOptions{}
|
||||
}
|
||||
|
||||
func createCalendarEventsOptions(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget {
|
||||
widget := util.PanicOnErrorWithResult(text.New(text.WrapAtWords()))
|
||||
go util.Periodic(ctx, 1*time.Hour, func() error {
|
||||
widget.Reset()
|
||||
calendarEvents := calendar.FetchEvents()
|
||||
for _, event := range calendarEvents {
|
||||
var color cell.Color
|
||||
onlySummary := false
|
||||
if isToday(event.Start) {
|
||||
color = cell.ColorGreen
|
||||
} else if event.Start.After(time.Now().AddDate(0, 0, 7)) {
|
||||
color = cell.ColorGray
|
||||
onlySummary = true
|
||||
} else {
|
||||
color = cell.ColorWhite
|
||||
}
|
||||
summary := event.Summary
|
||||
if onlySummary {
|
||||
summary = fmt.Sprintf("%s %s", event.Start.Format(time.DateOnly), event.Summary)
|
||||
}
|
||||
if err := widget.Write(fmt.Sprintf("%s %s\n", event.Icon, summary), text.WriteCellOpts(cell.FgColor(color), cell.Bold())); err != nil {
|
||||
return err
|
||||
}
|
||||
if !onlySummary {
|
||||
var date string
|
||||
if event.Start == event.End {
|
||||
date = formatDate(event.Start)
|
||||
} else {
|
||||
date = fmt.Sprintf("%s - %s", formatDate(event.Start), formatDate(event.End))
|
||||
}
|
||||
if err := widget.Write(fmt.Sprintf("%s\n", date), text.WriteCellOpts(cell.FgColor(color), cell.Dim())); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := widget.Write(fmt.Sprintf("%s\n", event.Description), text.WriteCellOpts(cell.FgColor(color))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := widget.Write(fmt.Sprintf("%s\n\n", event.Location), text.WriteCellOpts(cell.FgColor(color))); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
return widget
|
||||
}
|
||||
|
||||
func isToday(date time.Time) bool {
|
||||
year, month, day := date.Date()
|
||||
return year == time.Now().Year() && month == time.Now().Month() && day == time.Now().Day()
|
||||
}
|
||||
|
||||
func isTomorrow(date time.Time) bool {
|
||||
year, month, day := date.Date()
|
||||
return year == time.Now().Year() && month == time.Now().Month() && day == time.Now().AddDate(0, 0, 1).Day()
|
||||
}
|
||||
|
||||
func formatDate(date time.Time) string {
|
||||
if isToday(date) {
|
||||
return fmt.Sprintf("Today at %s", date.Format(time.TimeOnly))
|
||||
} else if isTomorrow(date) {
|
||||
return fmt.Sprintf("Tomorrow at %s", date.Format(time.TimeOnly))
|
||||
}
|
||||
return date.Format(time.DateTime)
|
||||
}
|
||||
@@ -33,10 +33,10 @@ func createDockerList(ctx context.Context, _ terminalapi.Terminal, _ interface{}
|
||||
}
|
||||
|
||||
sort.Slice(ms, func(i, j int) bool { return ms[i].CPUPercent > ms[j].CPUPercent })
|
||||
if err := list.Write(fmt.Sprintf("%-40s | %-6s | %-6s | %s\n", "Name", "CPU", "MEM", "Status"), text.WriteReplace()); err != nil {
|
||||
if err := list.Write(fmt.Sprintf("%-30s | %-6s | %-6s | %s\n", "Name", "CPU", "MEM", "Status"), text.WriteReplace(), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprintf("─────────────────────────────────────────┼────────┼────────┼─────────────────────\n")); err != nil {
|
||||
if err := list.Write(fmt.Sprintf("───────────────────────────────┼────────┼────────┼─────────────────────\n"), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, m := range ms {
|
||||
@@ -53,22 +53,28 @@ func createDockerList(ctx context.Context, _ terminalapi.Terminal, _ interface{}
|
||||
if strings.Contains(m.Status, "Paused") {
|
||||
status = cell.ColorBlue
|
||||
}
|
||||
if err := list.Write(fmt.Sprintf("%-40s", m.Name), text.WriteCellOpts(cell.FgColor(status))); err != nil {
|
||||
var name string
|
||||
if len(m.Name) > 30 {
|
||||
name = m.Name[:27] + "..."
|
||||
} else {
|
||||
name = m.Name
|
||||
}
|
||||
if err := list.Write(fmt.Sprintf("%-30s", name), text.WriteCellOpts(cell.FgColor(status))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprint(" | ")); err != nil {
|
||||
if err := list.Write(fmt.Sprint(" │ "), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := writePercent(m.CPUPercent, list); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprint(" | ")); err != nil {
|
||||
if err := list.Write(fmt.Sprint(" │ "), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := writePercent(m.MemPercent, list); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprint(" | ")); err != nil {
|
||||
if err := list.Write(fmt.Sprint(" │ "), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprintf("%s\n", m.Status), text.WriteCellOpts(cell.FgColor(status))); err != nil {
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/mum4k/termdash/cell"
|
||||
"github.com/mum4k/termdash/terminal/terminalapi"
|
||||
"github.com/mum4k/termdash/widgetapi"
|
||||
"github.com/mum4k/termdash/widgets/text"
|
||||
@@ -26,19 +27,19 @@ func createPiholeStats(ctx context.Context, _ terminalapi.Terminal, _ interface{
|
||||
ph := pihole.Connect()
|
||||
go util.Periodic(ctx, 1*time.Minute, func() error {
|
||||
summary := ph.Summary()
|
||||
if err := list.Write(fmt.Sprintf("Blocked Domains: %d\n", summary.Gravity.DomainsBeingBlocked), text.WriteReplace()); err != nil {
|
||||
if err := list.Write(fmt.Sprintf("Blocked Domains: %d\n", summary.Gravity.DomainsBeingBlocked), text.WriteReplace(), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprint("---------------------------\n")); err != nil {
|
||||
if err := list.Write(fmt.Sprint("───────────────────────────\n"), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprintf("Total Queries: %d\n", summary.Queries.Total)); err != nil {
|
||||
if err := list.Write(fmt.Sprintf("Total Queries: %d\n", summary.Queries.Total), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprintf("Blocked Queries: %d\n", summary.Queries.Blocked)); err != nil {
|
||||
if err := list.Write(fmt.Sprintf("Blocked Queries: %d\n", summary.Queries.Blocked), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := list.Write(fmt.Sprintf("Unique Domains: %d\n", summary.Queries.UniqueDomains)); err != nil {
|
||||
if err := list.Write(fmt.Sprintf("Unique Domains: %d\n", summary.Queries.UniqueDomains), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user