From 3bd26b63adf49ec1b3f52897008738f13b864451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Fri, 19 Nov 2021 16:45:06 +0100 Subject: Add basic rrule tab. --- module/calp/html/view/calendar/week.scm | 73 ++++++++++++++++++++++++++++++++- static/components/edit-rrule.ts | 51 +++++++++++++++++++++++ static/components/vevent-block.ts | 4 ++ static/elements.ts | 2 + 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 static/components/edit-rrule.ts diff --git a/module/calp/html/view/calendar/week.scm b/module/calp/html/view/calendar/week.scm index 6e0fbc4d..e13a0ae3 100644 --- a/module/calp/html/view/calendar/week.scm +++ b/module/calp/html/view/calendar/week.scm @@ -82,6 +82,9 @@ ,(block-template) ) + (template (@ (id "vevent-edit-rrule")) + ,(vevent-edit-rrule-template)) + ;; Based on popup:s output (template (@ (id "popup-template")) @@ -108,8 +111,11 @@ (tab-element (@ (label-title "Redigera") (label "🖊")) - (vevent-edit (@ (class "populate-with-uid"))) - ) + (vevent-edit (@ (class "populate-with-uid")))) + (tab-element + (@ (label-tile "Upprepningar") + (label "↺")) + (vevent-edit-rrule (@ (class "populate-with-uid")))) ,@(when (debug) `((tab-element (@ (label-title "Debug") @@ -148,6 +154,69 @@ "CONTENT MISSING"))))) ))) +(define (week-day-select args) + `(select (@ ,@args) + (option "-") + ,@(map (lambda (x) `(option (@ (value ,(car x))) ,(cadr x))) + '((MO "Monday") + (TU "Tuesday") + (WE "Wednesday") + (TH "Thursday") + (FR "Friday") + (SA "Saturday") + (SU "Sunday"))))) + +(define (vevent-edit-rrule-template) + `(div (@ (class "eventtext")) + (h2 "Upprepningar") + (dl + (dt "Frequency") + (dd (select (@ (name "freq")) + (option "-") + ,@(map (lambda (x) `(option (@ (value ,x)) ,(string-titlecase (symbol->string x)))) + '(SECONDLY MINUTELY HOURLY DAILY WEEKLY MONTHLY YEARLY)))) + + (dt "Until") + (dd (date-time-input (@ (name "until")))) + + (dt "Conut") + (dd (input (@ (type "number") (name "count") (min 0)))) + + (dt "Interval") + (dd (input (@ (type "number") (name "interval") ; min and max depend on FREQ + ))) + + ,@(concatenate + (map (lambda (pair) + (define name (list-ref pair 0)) + (define pretty-name (list-ref pair 1)) + (define min (list-ref pair 2)) + (define max (list-ref pair 3)) + `((dt ,pretty-name) + (dd (input-list (@ (name ,name)) + (input (@ (type "number") + (min ,min) (max ,max))))))) + '((bysecond "By Second" 0 60) + (byminute "By Minute" 0 59) + (byhour "By Hour" 0 23) + (bymonthday "By Month Day" -31 31) ; except 0 + (byyearday "By Year Day" -366 366) ; except 0 + (byweekno "By Week Number" -53 53) ; except 0 + (bymonth "By Month" 1 12) + (bysetpos "By Set Position" -366 366) ; except 0 + ))) + + ;; (dt "By Week Day") + ;; (dd (input-list (@ (name "byweekday")) + ;; (input (@ (type number) + ;; (min -53) (max 53) ; except 0 + ;; )) + ;; ,(week-day-select '()) + ;; )) + + (dt "Weekstart") + (dd ,(week-day-select '((name "wkst"))))))) + ;; based on the output of fmt-single-event (define (description-template) '(div (@ (class " vevent eventtext summary-tab " ())) diff --git a/static/components/edit-rrule.ts b/static/components/edit-rrule.ts new file mode 100644 index 00000000..a4d09083 --- /dev/null +++ b/static/components/edit-rrule.ts @@ -0,0 +1,51 @@ +export { EditRRule } + +import { ComponentVEvent } from './vevent' +import { VEvent } from '../vevent' +import { vcal_objects } from '../globals' + +import { RecurrenceRule } from '../vevent' + +/* */ +class EditRRule extends ComponentVEvent { + + constructor() { + super(); + + let frag = this.template.content.cloneNode(true) as DocumentFragment + let body = frag.firstElementChild! + this.replaceChildren(body); + } + + connectedCallback() { + this.redraw(vcal_objects.get(this.uid)!) + } + + redraw(data: VEvent) { + + let rrule = data.getProperty('rrule') + if (!rrule) return; + rrule = rrule as RecurrenceRule + + for (let el of this.querySelectorAll('[name]')) { + + /* + el ought to be one of the tag types: + , ,