aboutsummaryrefslogtreecommitdiff
path: root/plugins/caldav
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/caldav')
-rw-r--r--plugins/caldav/plugin.go16
-rw-r--r--plugins/caldav/public/update-event.html11
-rw-r--r--plugins/caldav/routes.go26
3 files changed, 38 insertions, 15 deletions
diff --git a/plugins/caldav/plugin.go b/plugins/caldav/plugin.go
index caeb12a..e8d14a9 100644
--- a/plugins/caldav/plugin.go
+++ b/plugins/caldav/plugin.go
@@ -10,6 +10,11 @@ import (
"git.sr.ht/~emersion/alps"
)
+const (
+ inputDateLayout = "2006-01-02"
+ inputTimeLayout = "15:04"
+)
+
func sanityCheckURL(u *url.URL) error {
req, err := http.NewRequest(http.MethodOptions, u.String(), nil)
if err != nil {
@@ -61,13 +66,16 @@ func newPlugin(srv *alps.Server) (alps.Plugin, error) {
p.TemplateFuncs(template.FuncMap{
"formatinputdate": func(t time.Time) string {
- return t.Format("2006-01-02")
+ if t.IsZero() {
+ return ""
+ }
+ return t.Format(inputDateLayout)
},
- "ornow": func(t time.Time) time.Time {
+ "formatinputtime": func(t time.Time) string {
if t.IsZero() {
- return time.Now()
+ return ""
}
- return t
+ return t.Format(inputTimeLayout)
},
})
diff --git a/plugins/caldav/public/update-event.html b/plugins/caldav/public/update-event.html
index 0decb5a..ae091bd 100644
--- a/plugins/caldav/public/update-event.html
+++ b/plugins/caldav/public/update-event.html
@@ -15,13 +15,14 @@
<input type="text" name="summary" id="summary" value="{{.Event.Props.Text "SUMMARY"}}">
<br>
- <!-- TODO: inputs with time -->
- <label for="start">Start date:</label>
- <input type="date" name="start" id="start" value="{{.Event.DateTimeStart nil | ornow | formatinputdate}}"/>
+ <label for="start-date">Start date:</label>
+ <input type="date" name="start-date" id="start-date" value="{{.Event.DateTimeStart nil | formatinputdate}}"/>
+ <input type="time" name="start-time" id="start-time" value="{{.Event.DateTimeStart nil | formatinputtime}}"/>
<br>
- <label for="end">End date:</label>
- <input type="date" name="end" id="end" value="{{.Event.DateTimeEnd nil | ornow | formatinputdate}}"/>
+ <label for="end-date">End date:</label>
+ <input type="date" name="end-date" id="end-date" value="{{.Event.DateTimeEnd nil | formatinputdate}}"/>
+ <input type="time" name="end-time" id="end-time" value="{{.Event.DateTimeEnd nil | formatinputtime}}"/>
<br>
<label for="description">Description:</label><br>
diff --git a/plugins/caldav/routes.go b/plugins/caldav/routes.go
index f0c9573..f9e6bd5 100644
--- a/plugins/caldav/routes.go
+++ b/plugins/caldav/routes.go
@@ -53,6 +53,21 @@ func parseObjectPath(s string) (string, error) {
return string(p), nil
}
+func parseTime(dateStr, timeStr string) (time.Time, error) {
+ layout := inputDateLayout
+ s := dateStr
+ if timeStr != "" {
+ layout = inputDateLayout + "T" + inputTimeLayout
+ s = dateStr + "T" + timeStr
+ }
+ t, err := time.Parse(layout, s)
+ if err != nil {
+ err = fmt.Errorf("malformed date: %v", err)
+ return time.Time{}, echo.NewHTTPError(http.StatusBadRequest, err)
+ }
+ return t, nil
+}
+
func registerRoutes(p *alps.GoPlugin, u *url.URL) {
p.GET("/calendar", func(ctx *alps.Context) error {
var start time.Time
@@ -242,15 +257,14 @@ func registerRoutes(p *alps.GoPlugin, u *url.URL) {
summary := ctx.FormValue("summary")
description := ctx.FormValue("description")
- start, err := time.Parse("2006-01-02", ctx.FormValue("start"))
+ // TODO: whole-day events
+ start, err := parseTime(ctx.FormValue("start-date"), ctx.FormValue("start-time"))
if err != nil {
- err = fmt.Errorf("malformed start date: %v", err)
- return echo.NewHTTPError(http.StatusBadRequest, err)
+ return err
}
- end, err := time.Parse("2006-01-02", ctx.FormValue("end"))
+ end, err := parseTime(ctx.FormValue("end-date"), ctx.FormValue("end-time"))
if err != nil {
- err = fmt.Errorf("malformed end date: %v", err)
- return echo.NewHTTPError(http.StatusBadRequest, err)
+ return err
}
if start.After(end) {
return echo.NewHTTPError(http.StatusBadRequest, "event start is after its end")