From 1484155c211fe8452344ffdc501e858706ecbc51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Wed, 29 Sep 2021 23:36:21 +0200 Subject: Start rework on js setup. --- module/calp/html/vcomponent.scm | 335 ++++++++++++++++---------------- module/calp/html/view/calendar.scm | 64 +++--- module/calp/html/view/calendar/week.scm | 93 ++++++++- module/vcomponent/vdir/save-delete.scm | 2 +- 4 files changed, 304 insertions(+), 190 deletions(-) (limited to 'module') diff --git a/module/calp/html/vcomponent.scm b/module/calp/html/vcomponent.scm index 105c6cc5..4b3e9ec7 100644 --- a/module/calp/html/vcomponent.scm +++ b/module/calp/html/vcomponent.scm @@ -62,54 +62,56 @@ optional: (attributes '()) key: (fmt-header list)) ;; (format (current-error-port) "fmt-single-event: ~a~%" (prop ev 'X-HNH-FILENAME)) - `(div (@ ,@(assq-merge - attributes - `((data-bindby "bind_view") - (class " eventtext summary-tab " - ,(when (and (prop ev 'PARTSTAT) - (eq? 'TENTATIVE (prop ev 'PARTSTAT))) - " tentative "))))) - (h3 ,(fmt-header - (when (prop ev 'RRULE) - `(span (@ (class "repeating")) "↺")) - `(span (@ (class "bind summary") - (data-property "summary")) - ,(prop ev 'SUMMARY)))) - (div - ,(call-with-values (lambda () (fmt-time-span ev)) - (case-lambda [(start) - `(div (time (@ (class "bind dtstart") - (data-property "dtstart") - (data-fmt ,(string-append "~L" start)) - (datetime ,(datetime->string - (as-datetime (prop ev 'DTSTART)) - "~1T~3"))) - ,(datetime->string - (as-datetime (prop ev 'DTSTART)) - start)))] - [(start end) - `(div (time (@ (class "bind dtstart") - (data-property "dtstart") - (data-fmt ,(string-append "~L" start)) - (datetime ,(datetime->string - (as-datetime (prop ev 'DTSTART)) - "~1T~3"))) - ,(datetime->string (as-datetime (prop ev 'DTSTART)) - start)) - " — " - (time (@ (class "bind dtend") - (data-property "dtend") - (data-fmt ,(string-append "~L" end)) - (datetime ,(datetime->string - (as-datetime (prop ev 'DTSTART)) - "~1T~3"))) - ,(datetime->string (as-datetime (prop ev 'DTEND)) - end)))])) - - ;; TODO add optional fields when added in frontend - ;; Possibly by always having them here, just hidden. - - (div (@ (class "fields")) + `(vevent-description + (@ ,@(assq-merge + attributes + `( + (class " vevent eventtext summary-tab " + ,(when (and (prop ev 'PARTSTAT) + (eq? 'TENTATIVE (prop ev 'PARTSTAT))) + " tentative ")) + (data-uid ,(prop ev 'UID))))) + (h3 ,(fmt-header + (when (prop ev 'RRULE) + `(span (@ (class "repeating")) "↺")) + `(span (@ (class "bind summary") + (data-property "summary")) + ,(prop ev 'SUMMARY)))) + (div + ,(call-with-values (lambda () (fmt-time-span ev)) + (case-lambda [(start) + `(div (time (@ (class "bind dtstart") + (data-property "dtstart") + (data-fmt ,(string-append "~L" start)) + (datetime ,(datetime->string + (as-datetime (prop ev 'DTSTART)) + "~1T~3"))) + ,(datetime->string + (as-datetime (prop ev 'DTSTART)) + start)))] + [(start end) + `(div (time (@ (class "bind dtstart") + (data-property "dtstart") + (data-fmt ,(string-append "~L" start)) + (datetime ,(datetime->string + (as-datetime (prop ev 'DTSTART)) + "~1T~3"))) + ,(datetime->string (as-datetime (prop ev 'DTSTART)) + start)) + " — " + (time (@ (class "bind dtend") + (data-property "dtend") + (data-fmt ,(string-append "~L" end)) + (datetime ,(datetime->string + (as-datetime (prop ev 'DTSTART)) + "~1T~3"))) + ,(datetime->string (as-datetime (prop ev 'DTEND)) + end)))])) + + ;; TODO add optional fields when added in frontend + ;; Possibly by always having them here, just hidden. + + (div (@ (class "fields")) ,(when (and=> (prop ev 'LOCATION) (negate string-null?)) `(div (b "Plats: ") (div (@ (class "bind location") (data-property "location")) @@ -118,7 +120,7 @@ ,(awhen (prop ev 'DESCRIPTION) `(div (@ (class "bind description") (data-property "description")) - ,(format-description ev it))) + ,(format-description ev it))) ,@(awhen (prop* ev 'ATTACH) ;; attach satisfies @code{vline?} @@ -193,123 +195,127 @@ `(div (@ (class "last-modified")) "Senast ändrad " ,(datetime->string (prop ev 'LAST-MODIFIED) "~1 ~H:~M")))) - ))) + ))) (define*-public (fmt-for-edit ev optional: (attributes '()) key: (fmt-header list)) - `(div (@ (class " eventtext edit-tab ") - (data-bindby "bind_edit")) - (form (@ (class "edit-form")) - (div (@ (class "dropdown-goes-here"))) - (h3 (input (@ (type "text") - (placeholder "Sammanfattning") - (name "summary") (required) - (class "bind") (data-property "summary") - (value ,(prop ev 'SUMMARY))))) - - ,(let ((start (prop ev 'DTSTART)) - (end (prop ev 'DTEND))) - `(div (@ (class "timeinput")) - - ,@(with-label - "Starttid" - `(div (@ (class "date-time bind") - (data-bindby "bind_date_time") - (name "dtstart")) - (input (@ (type "date") - (value ,(date->string (as-date start))))) - (input (@ (type "time") - (value ,(time->string (as-time start) "~H:~M")) - ,@(when (date? start) '((disabled))) - )))) - - ;; TODO some way to add an endtime if missing beforehand - ;; TODO, actually proper support for event without end times - ,@(when end - (with-label - "Sluttid" - `(div (@ (class "date-time bind") - (data-bindby "bind_date_time") - (name "dtend")) - (input (@ (type "date") - (value ,(date->string (as-date end))))) - (input (@ (type "time") - (value ,(time->string (as-time end) "~H:~M")) - ,@(when (date? end) '((disabled)))))))) - - (div - ,@(with-label - "Heldag?" - `(input (@ (type "checkbox") - (class "bind") - (data-bindby "bind_wholeday") - (name "wholeday") - ,@(when (date? start) '((checked))))))) - - )) - - ,@(with-label - "Plats" - `(input (@ (placeholder "Plats") - (name "location") - (type "text") - (class "bind") (data-property "location") - (value ,(or (prop ev 'LOCATION) ""))))) - - ,@(with-label - "Beskrivning" - `(textarea (@ (placeholder "Beskrivning") - (class "bind") (data-property "description") - (name "description")) - ,(prop ev 'DESCRIPTION))) - - ,@(with-label - "Kategorier" - ;; It would be better if these input-list's worked on the same - ;; class=bind system as the fields above. The problem with that - ;; is however that each input-list requires different search - ;; and join procedures. Currently this is bound in the JS, see - ;; [CATEGORIES_BIND]. - ;; It matches on ".input-list[data-property='categories']". - `(div (@ (class "input-list") - (data-property "categories")) - ,@(awhen (prop ev 'CATEGORIES) - (map (lambda (c) - `(input (@ (size 2) - (class "unit") - (value ,c)))) - it)) - - (input (@ (class "unit final") - (size 2) - (type "text") + `(vevent-edit (@ (class "vevent") + (data-uid ,(prop ev 'UID))))) + +(define-public (edit-template) + `(div (@ (class " eventtext edit-tab ")) + (form (@ (class "edit-form")) + (div (@ (class "dropdown-goes-here"))) + (h3 (input (@ (type "text") + (placeholder "Sammanfattning") + (name "summary") (required) + (class "bind") (data-property "summary") + ; (value ,(prop ev 'SUMMARY)) + ))) + + (div (@ (class "timeinput")) + + ,@(with-label + "Starttid" + `(div (@ (class "date-time") + (name "dtstart")) + (input (@ (type "date") + ; (value ,(date->string (as-date start))) + )) + (input (@ (type "time") + ; (value ,(time->string (as-time start) "~H:~M")) + ; ,@(when (date? start) '((disabled))) + )))) + + ;; TODO some way to add an endtime if missing beforehand + ;; TODO, actually proper support for event without end times + ,@(with-label + "Sluttid" + `(div (@ (class "date-time") + (name "dtend")) + (input (@ (type "date") + ; (value ,(date->string (as-date end))) + )) + (input (@ (type "time") + ; (value ,(time->string (as-time end) "~H:~M")) + ; ,@(when (date? end) '((disabled))) + )))) + + (div + ,@(with-label + "Heldag?" + `(input (@ (type "checkbox") + (name "wholeday") + ; ,@(when (date? start) '((checked))) )))) - (hr) - - ;; For custom user fields - ;; TODO these are currently not bound to anything, so entering data - ;; here does nothing. Bigest hurdle to overcome is supporting arbitrary - ;; fields which will come and go in the JavaScript. - ;; TODO also, all (most? maybe not LAST-MODIFIED) remaining properties - ;; should be exposed here. - (div (@ (class "input-list")) - (div (@ (class "unit final newfield")) - (input (@ (type "text") - (list "known-fields") - (placeholder "Nytt fält"))) - (select (@ (name "TYPE")) - (option (@ (value "TEXT")) "Text")) - (span - (input (@ (type "text") - (placeholder "Värde")))))) - - (hr) - - - (input (@ (type "submit"))) - ))) + ) + + ,@(with-label + "Plats" + `(input (@ (placeholder "Plats") + (name "location") + (type "text") + (data-property "location") + ; (value ,(or (prop ev 'LOCATION) "")) + ))) + + ,@(with-label + "Beskrivning" + `(textarea (@ (placeholder "Beskrivning") + (data-property "description") + (name "description")) + ; ,(prop ev 'DESCRIPTION) + )) + + ,@(with-label + "Kategorier" + ;; It would be better if these input-list's worked on the same + ;; class=bind system as the fields above. The problem with that + ;; is however that each input-list requires different search + ;; and join procedures. Currently this is bound in the JS, see + ;; [CATEGORIES_BIND]. + ;; It matches on ".input-list[data-property='categories']". + `(div (@ (class "input-list") + (data-property "categories")) + #; + ,@(awhen (prop ev 'CATEGORIES) + (map (lambda (c) + `(input (@ (size 2) + (class "unit") + (value ,c)))) + it)) + + (input (@ (class "unit final") + (size 2) + (type "text") + )))) + + (hr) + + ;; For custom user fields + ;; TODO these are currently not bound to anything, so entering data + ;; here does nothing. Bigest hurdle to overcome is supporting arbitrary + ;; fields which will come and go in the JavaScript. + ;; TODO also, all (most? maybe not LAST-MODIFIED) remaining properties + ;; should be exposed here. + (div (@ (class "input-list")) + (div (@ (class "unit final newfield")) + (input (@ (type "text") + (list "known-fields") + (placeholder "Nytt fält"))) + (select (@ (name "TYPE")) + (option (@ (value "TEXT")) "Text")) + (span + (input (@ (type "text") + (placeholder "Värde")))))) + + (hr) + + + (input (@ (type "submit"))) + ))) ;; Single event in side bar (text objects) @@ -357,12 +363,12 @@ `((a (@ (href "#" ,(html-id ev)) (class "hidelink")) - (div (@ ,@(assq-merge + (vevent-block (@ ,@(assq-merge extra-attributes `((id ,(html-id ev)) (data-calendar ,(html-attr (or (prop (parent ev) 'NAME) "unknown"))) ;; (data-bindon "bind_view") - (class "event CAL_" ,(html-attr (or (prop (parent ev) 'NAME) + (class "vevent event CAL_" ,(html-attr (or (prop (parent ev) 'NAME) "unknown")) ,(when (and (prop ev 'PARTSTAT) (eq? 'TENTATIVE (prop ev 'PARTSTAT))) @@ -371,6 +377,7 @@ (eq? 'TRANSPARENT (prop ev 'TRANSP))) " transparent") ) + (data-uid ,(prop ev 'UID)) (onclick "toggle_popup('popup' + this.id)") ))) ;; Inner div to prevent overflow. Previously "overflow: none" @@ -391,10 +398,12 @@ ,(when (and=> (prop ev 'DESCRIPTION) (negate string-null?)) `(span (@ (class "description")) "🗎"))) + #; (div (@ (style "display:none !important;")) ,((@ (vcomponent xcal output) ns-wrap) ((@ (vcomponent xcal output) vcomponent->sxcal) - ev))))))) + ev))) + )))) (define (repeat-info event) diff --git a/module/calp/html/view/calendar.scm b/module/calp/html/view/calendar.scm index 4574f517..00451984 100644 --- a/module/calp/html/view/calendar.scm +++ b/module/calp/html/view/calendar.scm @@ -111,12 +111,16 @@ (script (@ (defer) (src "/static/clock.js"))) (script (@ (defer) (src "/static/popup.js"))) (script (@ (defer) (src "/static/rrule.js"))) - (script (@ (defer) (src "/static/binders.js"))) + ;; (script (@ (defer) (src "/static/binders.js"))) (script (@ (defer) (src "/static/server_connect.js"))) - (script (@ (defer) (src "/static/input_list.js"))) + ;; (script (@ (defer) (src "/static/input_list.js"))) (script (@ (defer) (src "/static/date_time.js"))) - (script (@ (defer) (src "/static/vcal.js"))) + ;; (script (@ (defer) (src "/static/vcal.js"))) (script (@ (defer) (src "/static/script.js"))) + (script (@ (defer) (src "/static/globals.js"))) + + ;; on load + ,(calendar-styles calendars) ,@(when (debug) @@ -251,15 +255,15 @@ `(li (@ (class "CAL_" ,(html-attr (prop calendar 'NAME)))) (a (@ (href "/search?" - ,((@ (web uri-query) encode-query-parameters) - `((q . (and (date/-time<=? - ,(current-datetime) - (prop event 'DTSTART)) - ;; TODO this seems to miss some calendars, - ;; I belive it's due to some setting X-WR-CALNAME, - ;; which is only transfered /sometimes/ into NAME. - (string=? ,(->string (prop calendar 'NAME)) - (or (prop (parent event) 'NAME) "")))))))) + ,((@ (web uri-query) encode-query-parameters) + `((q . (and (date/-time<=? + ,(current-datetime) + (prop event 'DTSTART)) + ;; TODO this seems to miss some calendars, + ;; I belive it's due to some setting X-WR-CALNAME, + ;; which is only transfered /sometimes/ into NAME. + (string=? ,(->string (prop calendar 'NAME)) + (or (prop (parent event) 'NAME) "")))))))) ,(prop calendar 'NAME)))) calendars)) (div (@ (id "calendar-dropdown-template") (class "template")) @@ -311,17 +315,19 @@ ;; it. description: "")))) (event (car (children cal)))) - `((div (@ (class "template event-container") (id "event-template") - ;; Only needed to create a duration. So actual dates - ;; dosen't matter - (data-start "2020-01-01") - (data-end "2020-01-02")) - ,(caddar ; strip tag - (make-block event `((class " generated "))))) + `( + ;; (div (@ (class "template event-container") (id "event-template") + ;; ;; Only needed to create a duration. So actual dates + ;; ;; dosen't matter + ;; (data-start "2020-01-01") + ;; (data-end "2020-01-02")) + ;; ,(caddar ; strip tag + ;; (make-block event `((class " generated "))))) ;; TODO merge this into the event-set, add attribute ;; for non-displaying elements. - (div (@ (class "template") (id "popup-template")) - ,(popup event (string-append "popup" (html-id event)))))) + ;; (div (@ (class "template") (id "popup-template")) + ;; ,(popup event (string-append "popup" (html-id event)))) + )) ;; Auto-complets when adding new fields to a component ;; Any string is however still valid. @@ -344,4 +350,18 @@ RDATE RRULE ACTION REPEAT TRIGGER CREATED DTSTAMP LAST-MODIFIED SEQUENCE REQUEST-STATUS - )))))) + ))) + + (div (@ (style "display:none !important;") + (id "xcal-data")) + ,((@ (vcomponent xcal output) ns-wrap) + (map (@ (vcomponent xcal output) vcomponent->sxcal) + (stream->list + (filter-sorted-stream + (lambda (ev) + ((@ (vcomponent datetime) event-overlaps?) + ev start-date + (date+ end-date (date day: 1)))) + events)))))) + + )) diff --git a/module/calp/html/view/calendar/week.scm b/module/calp/html/view/calendar/week.scm index 556c3d85..340db7d5 100644 --- a/module/calp/html/view/calendar/week.scm +++ b/module/calp/html/view/calendar/week.scm @@ -52,10 +52,95 @@ ,@(for event in (stream->list (events-between start-date end-date events)) - ((@ (calp html vcomponent ) popup) event (string-append "popup" (html-id event)))) - - ))))) - + ((@ (calp html vcomponent ) popup) + event (string-append "popup" (html-id event)))) + + )) + ;; description in sidebar / tab of popup + (template (@ (id "vevent-description")) + ,(description-template) + ) + + ;; edit tab of popup + (template (@ (id "vevent-edit")) + ,((@ (calp html vcomponent) edit-template))) + + ;; "physical" block + (template (@ (id "vevent-block")) + ,(block-template) + ) + + ))) + +;; based on the output of fmt-single-event +(define (description-template) + '(div (@ (class " eventtext summary-tab " ())) + (h3 ((span (@ (class "repeating")) "↺") + (span (@ (class "bind summary") + (data-property "summary")) + "Test"))) + (div (div (time (@ (class "bind dtstart") + (data-property "dtstart") + (data-fmt "~L~H:~M") + (datetime "2021-09-29T19:56:46")) + "19:56") + "\xa0—\xa0" + (time (@ (class "bind dtend") + (data-property "dtend") + (data-fmt "~L~H:~M") + (datetime "2021-09-29T19:56:46")) + "20:56")) + (div (@ (class "fields")) + (div (b "Plats: ") + (div (@ (class "bind location") + (data-property "location")) + "Alsättersgatan 13")) + (div (@ (class "bind description") + (data-property "description")) + ("With a description")) + (div (@ (class "categories")) + (a (@ (class "category") + (href "/search/?" + "q=%28member%20%22test%22%20%28or%20%28prop%20event%20%28quote%20CATEGORIES%29%29%20%28quote%20%28%29%29%29%29")) + test)) + (div (@ (class "rrule")) + "Upprepas " + "varje vecka" + ".") + (div (@ (class "last-modified")) + "Senast ändrad " + "2021-09-29 19:56"))))) + +(define (block-template) + `(div (@ ; (id ,(html-id ev)) + (data-calendar "unknown") + (class "event CAL_unknown" + ;; ,(when (and (prop ev 'PARTSTAT) + ;; (eq? 'TENTATIVE (prop ev 'PARTSTAT))) + ;; " tentative") + ;; ,(when (and (prop ev 'TRANSP) + ;; (eq? 'TRANSPARENT (prop ev 'TRANSP))) + ;; " transparent") + ) + (onclick "toggle_popup('popup' + this.id)") + ) + ;; Inner div to prevent overflow. Previously "overflow: none" + ;; was set on the surounding div, but the popup /needs/ to + ;; overflow (for the tabs?). + (div (@ (class "event-body")) + `(span (@ (class "repeating")) ; "↺" + ) + (span (@ (class "bind summary") + (data-property "summary")) + ; ,(format-summary ev (prop ev 'SUMMARY)) + ) + `(span (@ (class "bind location") + (data-property "location"))) + ;; Document symbol when we have text + `(span (@ (class "description")) + ; "🗎" + )) + ) ) (define (time-marker-div) diff --git a/module/vcomponent/vdir/save-delete.scm b/module/vcomponent/vdir/save-delete.scm index d17b595e..b3c7f9c5 100644 --- a/module/vcomponent/vdir/save-delete.scm +++ b/module/vcomponent/vdir/save-delete.scm @@ -11,7 +11,7 @@ (define-module (vcomponent vdir save-delete) :use-module (calp util) - :use-module ((calp util exceptions) :select (assert)) + :use-module ((calp util exceptions) :select (assert)) :use-module (vcomponent ical output) :use-module (vcomponent) :use-module ((calp util io) :select (with-atomic-output-to-file)) -- cgit v1.2.3 From e28b54810bb42b21a069a1257cf5e59e06c735a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Thu, 30 Sep 2021 01:47:38 +0200 Subject: Replace today-button with web component. --- module/calp/html/view/calendar.scm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'module') diff --git a/module/calp/html/view/calendar.scm b/module/calp/html/view/calendar.scm index 00451984..53e928f6 100644 --- a/module/calp/html/view/calendar.scm +++ b/module/calp/html/view/calendar.scm @@ -150,6 +150,7 @@ (footer (@ (style "grid-area: footer")) (span "Page generated " ,(date->string (current-date))) + (span "Current time " (current-time (@ (interval 1)))) (span (a (@ (href ,(repo-url))) "Source Code"))) @@ -166,13 +167,14 @@ ,(btn href: (date->string (set (day start-date) 1) "/month/~1.html") "månadsvy") - ,(btn id: "today-button" - href: (string-append - "/today?" (case intervaltype - [(month) "view=month"] - [(week) "view=week"] - [else ""])) - "idag")) + (today-button + (a (@ (class "btn") + (href ,(string-append + "/today?" (case intervaltype + [(month) "view=month"] + [(week) "view=week"] + [else ""])))) + (div "idag")))) (div (@ (id "jump-to")) ;; Firefox's accessability complain about each date -- cgit v1.2.3 From 927bd58d3340965328f0ccd05f865175b49a6ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Fri, 1 Oct 2021 03:34:06 +0200 Subject: Got date-times working in new system. --- module/calp/html/vcomponent.scm | 121 +++++++++++++++----------------- module/calp/html/view/calendar/week.scm | 49 +++++++------ 2 files changed, 83 insertions(+), 87 deletions(-) (limited to 'module') diff --git a/module/calp/html/vcomponent.scm b/module/calp/html/vcomponent.scm index 4b3e9ec7..63b3df3b 100644 --- a/module/calp/html/vcomponent.scm +++ b/module/calp/html/vcomponent.scm @@ -206,11 +206,12 @@ (define-public (edit-template) `(div (@ (class " eventtext edit-tab ")) (form (@ (class "edit-form")) + ;; TODO actually have calendar list here, since we are just a template (div (@ (class "dropdown-goes-here"))) (h3 (input (@ (type "text") (placeholder "Sammanfattning") (name "summary") (required) - (class "bind") (data-property "summary") + (class "interactive") (data-property "summary") ; (value ,(prop ev 'SUMMARY)) ))) @@ -218,36 +219,22 @@ ,@(with-label "Starttid" - `(div (@ (class "date-time") - (name "dtstart")) - (input (@ (type "date") - ; (value ,(date->string (as-date start))) - )) - (input (@ (type "time") - ; (value ,(time->string (as-time start) "~H:~M")) - ; ,@(when (date? start) '((disabled))) - )))) - - ;; TODO some way to add an endtime if missing beforehand - ;; TODO, actually proper support for event without end times + '(date-time-input (@ (name "dtstart") + (class "interactive") + (data-property "dtstart") + ))) + ,@(with-label "Sluttid" - `(div (@ (class "date-time") - (name "dtend")) - (input (@ (type "date") - ; (value ,(date->string (as-date end))) - )) - (input (@ (type "time") - ; (value ,(time->string (as-time end) "~H:~M")) - ; ,@(when (date? end) '((disabled))) - )))) + '(date-time-input (@ (name "dtend") + (class "interactive") + (data-property "dtend")))) (div ,@(with-label "Heldag?" `(input (@ (type "checkbox") (name "wholeday") - ; ,@(when (date? start) '((checked))) )))) ) @@ -257,6 +244,7 @@ `(input (@ (placeholder "Plats") (name "location") (type "text") + (class "interactive") (data-property "location") ; (value ,(or (prop ev 'LOCATION) "")) ))) @@ -264,54 +252,55 @@ ,@(with-label "Beskrivning" `(textarea (@ (placeholder "Beskrivning") + (class "interactive") (data-property "description") (name "description")) ; ,(prop ev 'DESCRIPTION) )) - ,@(with-label - "Kategorier" - ;; It would be better if these input-list's worked on the same - ;; class=bind system as the fields above. The problem with that - ;; is however that each input-list requires different search - ;; and join procedures. Currently this is bound in the JS, see - ;; [CATEGORIES_BIND]. - ;; It matches on ".input-list[data-property='categories']". - `(div (@ (class "input-list") - (data-property "categories")) - #; - ,@(awhen (prop ev 'CATEGORIES) - (map (lambda (c) - `(input (@ (size 2) - (class "unit") - (value ,c)))) - it)) - - (input (@ (class "unit final") - (size 2) - (type "text") - )))) - - (hr) - - ;; For custom user fields - ;; TODO these are currently not bound to anything, so entering data - ;; here does nothing. Bigest hurdle to overcome is supporting arbitrary - ;; fields which will come and go in the JavaScript. - ;; TODO also, all (most? maybe not LAST-MODIFIED) remaining properties - ;; should be exposed here. - (div (@ (class "input-list")) - (div (@ (class "unit final newfield")) - (input (@ (type "text") - (list "known-fields") - (placeholder "Nytt fält"))) - (select (@ (name "TYPE")) - (option (@ (value "TEXT")) "Text")) - (span - (input (@ (type "text") - (placeholder "Värde")))))) - - (hr) + ;; ,@(with-label + ;; "Kategorier" + ;; ;; It would be better if these input-list's worked on the same + ;; ;; class=bind system as the fields above. The problem with that + ;; ;; is however that each input-list requires different search + ;; ;; and join procedures. Currently this is bound in the JS, see + ;; ;; [CATEGORIES_BIND]. + ;; ;; It matches on ".input-list[data-property='categories']". + ;; `(div (@ (class "input-list") + ;; (data-property "categories")) + ;; #; + ;; ,@(awhen (prop ev 'CATEGORIES) + ;; (map (lambda (c) + ;; `(input (@ (size 2) + ;; (class "unit") + ;; (value ,c)))) + ;; it)) + + ;; (input (@ (class "unit final") + ;; (size 2) + ;; (type "text") + ;; )))) + + ;; (hr) + + ;; ;; For custom user fields + ;; ;; TODO these are currently not bound to anything, so entering data + ;; ;; here does nothing. Bigest hurdle to overcome is supporting arbitrary + ;; ;; fields which will come and go in the JavaScript. + ;; ;; TODO also, all (most? maybe not LAST-MODIFIED) remaining properties + ;; ;; should be exposed here. + ;; (div (@ (class "input-list")) + ;; (div (@ (class "unit final newfield")) + ;; (input (@ (type "text") + ;; (list "known-fields") + ;; (placeholder "Nytt fält"))) + ;; (select (@ (name "TYPE")) + ;; (option (@ (value "TEXT")) "Text")) + ;; (span + ;; (input (@ (type "text") + ;; (placeholder "Värde")))))) + + ;; (hr) (input (@ (type "submit"))) diff --git a/module/calp/html/view/calendar/week.scm b/module/calp/html/view/calendar/week.scm index 340db7d5..c2165a8e 100644 --- a/module/calp/html/view/calendar/week.scm +++ b/module/calp/html/view/calendar/week.scm @@ -75,46 +75,53 @@ ;; based on the output of fmt-single-event (define (description-template) '(div (@ (class " eventtext summary-tab " ())) - (h3 ((span (@ (class "repeating")) "↺") + (h3 ((span (@ (class "repeating")) ; "↺" + ) (span (@ (class "bind summary") - (data-property "summary")) - "Test"))) + (data-property "summary"))))) (div (div (time (@ (class "bind dtstart") (data-property "dtstart") (data-fmt "~L~H:~M") - (datetime "2021-09-29T19:56:46")) - "19:56") + (datetime ; "2021-09-29T19:56:46" + )) + ; "19:56" + ) "\xa0—\xa0" (time (@ (class "bind dtend") (data-property "dtend") (data-fmt "~L~H:~M") - (datetime "2021-09-29T19:56:46")) - "20:56")) + (datetime ; "2021-09-29T19:56:46" + )) + ; "20:56" + )) (div (@ (class "fields")) (div (b "Plats: ") (div (@ (class "bind location") (data-property "location")) - "Alsättersgatan 13")) + ; "Alsättersgatan 13" + )) (div (@ (class "bind description") (data-property "description")) - ("With a description")) - (div (@ (class "categories")) - (a (@ (class "category") - (href "/search/?" - "q=%28member%20%22test%22%20%28or%20%28prop%20event%20%28quote%20CATEGORIES%29%29%20%28quote%20%28%29%29%29%29")) - test)) - (div (@ (class "rrule")) - "Upprepas " - "varje vecka" - ".") + ; "With a description" + ) + ;; (div (@ (class "categories")) + ;; (a (@ (class "category") + ;; (href "/search/?" + ;; "q=%28member%20%22test%22%20%28or%20%28prop%20event%20%28quote%20CATEGORIES%29%29%20%28quote%20%28%29%29%29%29")) + ;; test)) + ;; (div (@ (class "rrule")) + ;; "Upprepas " + ;; "varje vecka" + ;; ".") (div (@ (class "last-modified")) - "Senast ändrad " - "2021-09-29 19:56"))))) + "Senast ändrad -" + ; "2021-09-29 19:56" + ))))) (define (block-template) `(div (@ ; (id ,(html-id ev)) (data-calendar "unknown") - (class "event CAL_unknown" + (class "event CAL_unknown" ;; ,(when (and (prop ev 'PARTSTAT) ;; (eq? 'TENTATIVE (prop ev 'PARTSTAT))) ;; " tentative") -- cgit v1.2.3 From 81adf54a8a36beba9622c1929937c871a751b2d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Fri, 1 Oct 2021 03:37:31 +0200 Subject: Remove old date_time system. --- module/calp/html/view/calendar.scm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'module') diff --git a/module/calp/html/view/calendar.scm b/module/calp/html/view/calendar.scm index 53e928f6..f8188352 100644 --- a/module/calp/html/view/calendar.scm +++ b/module/calp/html/view/calendar.scm @@ -114,7 +114,7 @@ ;; (script (@ (defer) (src "/static/binders.js"))) (script (@ (defer) (src "/static/server_connect.js"))) ;; (script (@ (defer) (src "/static/input_list.js"))) - (script (@ (defer) (src "/static/date_time.js"))) + ;; (script (@ (defer) (src "/static/date_time.js"))) ;; (script (@ (defer) (src "/static/vcal.js"))) (script (@ (defer) (src "/static/script.js"))) (script (@ (defer) (src "/static/globals.js"))) -- cgit v1.2.3 From 98a56b782d1ced056c77019e88b4bcea4a270f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Fri, 1 Oct 2021 11:49:26 +0200 Subject: Reintroduce dateonly for date-time-input:s. --- module/calp/html/vcomponent.scm | 1 + 1 file changed, 1 insertion(+) (limited to 'module') diff --git a/module/calp/html/vcomponent.scm b/module/calp/html/vcomponent.scm index 63b3df3b..b32bc0c4 100644 --- a/module/calp/html/vcomponent.scm +++ b/module/calp/html/vcomponent.scm @@ -235,6 +235,7 @@ "Heldag?" `(input (@ (type "checkbox") (name "wholeday") + (onclick "wholeday_checkbox(this)") )))) ) -- cgit v1.2.3 From 3cf3e26352698f1dc4b7447563bfc1605173f9f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Sun, 3 Oct 2021 00:48:11 +0200 Subject: Repair debug buttons. --- module/calp/html/vcomponent.scm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'module') diff --git a/module/calp/html/vcomponent.scm b/module/calp/html/vcomponent.scm index b32bc0c4..5600646a 100644 --- a/module/calp/html/vcomponent.scm +++ b/module/calp/html/vcomponent.scm @@ -616,9 +616,13 @@ "som xCal"))) ,@(when (debug) `((ul - (li (button (@ (onclick "console.log(event_to_jcal(event_from_popup(this.closest('.popup-container'))));")) "js")) - (li (button (@ (onclick "console.log(jcal_to_xcal(event_to_jcal(event_from_popup(this.closest('.popup-container')))));")) "xml")) - (li (button (@ (onclick "console.log(event_from_popup(this.closest('.popup-container')))")) "this")) + ;; this.closest('.vevent').dataset['uid'] + (li (button (@ (onclick ,(format #f "console.log(vcal_objects['~a'].to_jcal())" + (prop ev 'UID)))) "js")) + (li (button (@ (onclick ,(format #f "console.log(jcal_to_xcal(vcal_objects['~a'].to_jcal()))" + (prop ev 'UID)))) "xml")) + (li (button (@ (onclick ,(format #f "console.log(vcal_objects['~a'])" + (prop ev 'UID)))) "this")) )))) )) -- cgit v1.2.3 From a64c2a665af1abe0b91f1c5eb1f97df91ed8a4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Sun, 3 Oct 2021 17:48:13 +0200 Subject: Further work, rework popup. --- module/calp/html/vcomponent.scm | 18 ++++++++------ module/calp/html/view/calendar.scm | 1 + module/calp/html/view/calendar/week.scm | 42 ++++++++++++++++++++++++++++++--- 3 files changed, 51 insertions(+), 10 deletions(-) (limited to 'module') diff --git a/module/calp/html/vcomponent.scm b/module/calp/html/vcomponent.scm index 5600646a..c5ae452d 100644 --- a/module/calp/html/vcomponent.scm +++ b/module/calp/html/vcomponent.scm @@ -1,5 +1,6 @@ (define-module (calp html vcomponent) :use-module (calp util) + :use-module ((calp util exceptions) :select (warning)) :use-module (vcomponent) :use-module (srfi srfi-1) :use-module (srfi srfi-26) @@ -66,10 +67,9 @@ (@ ,@(assq-merge attributes `( - (class " vevent eventtext summary-tab " - ,(when (and (prop ev 'PARTSTAT) - (eq? 'TENTATIVE (prop ev 'PARTSTAT))) - " tentative ")) + (class ,(when (and (prop ev 'PARTSTAT) + (eq? 'TENTATIVE (prop ev 'PARTSTAT))) + " tentative ")) (data-uid ,(prop ev 'UID))))) (h3 ,(fmt-header (when (prop ev 'RRULE) @@ -368,7 +368,8 @@ " transparent") ) (data-uid ,(prop ev 'UID)) - (onclick "toggle_popup('popup' + this.id)") + ;; TODO figure out stable way to get popup for element + ;; (onclick "toggle_popup('popup' + this.id)") ))) ;; Inner div to prevent overflow. Previously "overflow: none" ;; was set on the surounding div, but the popup /needs/ to @@ -571,10 +572,13 @@ )))) + + (define-public (popup ev id) - `(div (@ (id ,id) (class "popup-container CAL_" + (warning "popup is deprecated") + `(div (@ (id ,id) (class "popup-container CAL_" ,(html-attr (or (prop (parent ev) 'NAME) - "unknown"))) + "unknown"))) (onclick "event.stopPropagation()")) ;; TODO all (?) code uses .popup-container as the popup, while .popup sits and does nothing. ;; Do something about this? diff --git a/module/calp/html/view/calendar.scm b/module/calp/html/view/calendar.scm index f8188352..f447773d 100644 --- a/module/calp/html/view/calendar.scm +++ b/module/calp/html/view/calendar.scm @@ -117,6 +117,7 @@ ;; (script (@ (defer) (src "/static/date_time.js"))) ;; (script (@ (defer) (src "/static/vcal.js"))) (script (@ (defer) (src "/static/script.js"))) + (script (@ (defer) (src "/static/vevent.js"))) (script (@ (defer) (src "/static/globals.js"))) ;; on load diff --git a/module/calp/html/view/calendar/week.scm b/module/calp/html/view/calendar/week.scm index c2165a8e..5361ab65 100644 --- a/module/calp/html/view/calendar/week.scm +++ b/module/calp/html/view/calendar/week.scm @@ -14,6 +14,9 @@ events-between)) :use-module ((calp html vcomponent) :select (make-block) ) + :use-module ((calp html components) + :select (btn tabset #; #; form with-label + )) :use-module ((vcomponent group) :select (group-stream get-groups-between)) ) @@ -52,10 +55,16 @@ ,@(for event in (stream->list (events-between start-date end-date events)) - ((@ (calp html vcomponent ) popup) - event (string-append "popup" (html-id event)))) + `(popup-element + (@ (class "vevent") + (data-uid ,(prop event 'UID))) + ) + #; + ((@ (calp html vcomponent ) popup) ; + event (string-append "popup" (html-id event)))) )) + ;; description in sidebar / tab of popup (template (@ (id "vevent-description")) ,(description-template) @@ -70,11 +79,38 @@ ,(block-template) ) + ;; Based on popup:s output + (template + (@ (id "popup-template")) + (div (@ ; (id ,id) + (class "popup-container CAL_" + #; + ,(html-attr (or (prop (parent ev) 'NAME) ; + "unknown"))) + (onclick "event.stopPropagation()")) + (div (@ (class "popup")) + (nav (@ (class "popup-control")) + ,(btn "×" + title: "Stäng" + onclick: "" + ;; onclick: "close_popup(document.getElementById(this.closest('.popup-container').id))" + class: '("close-tooltip"))) + + ,(tabset + `(("📅" title: "Översikt" + (vevent-description (@ (class "populate-with-uid"))) + ) + + ,@(when (edit-mode) + `(("📅" title: "Redigera" + (vevent-edit (@ (class "populate-with-uid")))))))))) + ) + ))) ;; based on the output of fmt-single-event (define (description-template) - '(div (@ (class " eventtext summary-tab " ())) + '(div (@ (class " vevent eventtext summary-tab " ())) (h3 ((span (@ (class "repeating")) ; "↺" ) (span (@ (class "bind summary") -- cgit v1.2.3 From 4cf9587a5188e5853bbcf97b71109e7cb9331d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Sun, 3 Oct 2021 21:54:30 +0200 Subject: work --- module/calp/html/vcomponent.scm | 19 ++++++++++++------- module/calp/html/view/calendar.scm | 15 +++------------ module/calp/html/view/calendar/week.scm | 25 +++++++++++++++---------- 3 files changed, 30 insertions(+), 29 deletions(-) (limited to 'module') diff --git a/module/calp/html/vcomponent.scm b/module/calp/html/vcomponent.scm index c5ae452d..1b97e9b8 100644 --- a/module/calp/html/vcomponent.scm +++ b/module/calp/html/vcomponent.scm @@ -22,6 +22,7 @@ format-summary format-recurrence-rule )) + :use-module ((calp util config) :select (get-config)) ) (define-public (compact-event-list list) @@ -203,11 +204,19 @@ `(vevent-edit (@ (class "vevent") (data-uid ,(prop ev 'UID))))) -(define-public (edit-template) +(define-public (edit-template calendars) `(div (@ (class " eventtext edit-tab ")) (form (@ (class "edit-form")) - ;; TODO actually have calendar list here, since we are just a template - (div (@ (class "dropdown-goes-here"))) + (select (@ (class "calendar-selection")) + (option "- Choose a Calendar -") + ,@(let ((dflt (get-config 'default-calendar))) + (map (lambda (calendar) + (define name (prop calendar 'NAME)) + `(option (@ (value ,(html-attr name)) + ,@(when (string=? name dflt) + '((selected)))) + ,name)) + calendars))) (h3 (input (@ (type "text") (placeholder "Sammanfattning") (name "summary") (required) @@ -605,10 +614,6 @@ `(("📅" title: "Redigera" ,(fmt-for-edit ev)))) - ,@(when (debug) - `(("🐸" title: "Debug" - (div - (pre ,(prop ev 'UID)))))) ("⤓" title: "Nedladdning" (div (@ (class "eventtext") (style "font-family:sans")) diff --git a/module/calp/html/view/calendar.scm b/module/calp/html/view/calendar.scm index f447773d..dfcd2264 100644 --- a/module/calp/html/view/calendar.scm +++ b/module/calp/html/view/calendar.scm @@ -269,18 +269,9 @@ (or (prop (parent event) 'NAME) "")))))))) ,(prop calendar 'NAME)))) calendars)) - (div (@ (id "calendar-dropdown-template") (class "template")) - (select - (option "- Choose a Calendar -") - ,@(let ((dflt (get-config 'default-calendar))) - (map (lambda (calendar) - (define name (prop calendar 'NAME)) - `(option (@ (value ,(html-attr name)) - ,@(when (string=? name dflt) - '((selected)))) - ,name)) - calendars))) - ))) + ;; (div (@ (id "calendar-dropdown-template") (class "template")) + ;; ) + )) ;; List of events (div (@ (class "eventlist") diff --git a/module/calp/html/view/calendar/week.scm b/module/calp/html/view/calendar/week.scm index 5361ab65..9911b162 100644 --- a/module/calp/html/view/calendar/week.scm +++ b/module/calp/html/view/calendar/week.scm @@ -22,7 +22,7 @@ ) -(define*-public (render-calendar key: events start-date end-date #:allow-other-keys) +(define*-public (render-calendar key: calendars events start-date end-date #:allow-other-keys) (let* ((long-events short-events (partition long-event? (stream->list (events-between start-date end-date events)))) (range (date-range start-date end-date))) `((script "const VIEW='week';") @@ -56,6 +56,7 @@ ,@(for event in (stream->list (events-between start-date end-date events)) `(popup-element + ;; TODO (@ (class "vevent") (data-uid ,(prop event 'UID))) ) @@ -72,7 +73,9 @@ ;; edit tab of popup (template (@ (id "vevent-edit")) - ,((@ (calp html vcomponent) edit-template))) + ,((@ (calp html vcomponent) edit-template) + calendars + )) ;; "physical" block (template (@ (id "vevent-block")) @@ -83,11 +86,11 @@ (template (@ (id "popup-template")) (div (@ ; (id ,id) - (class "popup-container CAL_" - #; - ,(html-attr (or (prop (parent ev) 'NAME) ; - "unknown"))) - (onclick "event.stopPropagation()")) + (class "popup-container CAL_" + #; + ,(html-attr (or (prop (parent ev) 'NAME) ; + "unknown"))) + (onclick "event.stopPropagation()")) (div (@ (class "popup")) (nav (@ (class "popup-control")) ,(btn "×" @@ -98,13 +101,15 @@ ,(tabset `(("📅" title: "Översikt" - (vevent-description (@ (class "populate-with-uid"))) + (vevent-description + (@ (class "vevent populate-with-uid"))) ) ,@(when (edit-mode) `(("📅" title: "Redigera" - (vevent-edit (@ (class "populate-with-uid")))))))))) - ) + (vevent-edit (@ (class "populate-with-uid")))))) + + ))))) ))) -- cgit v1.2.3 From bb59ca85ff27a51a2c532d330b3b5f947ac7fb9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 4 Oct 2021 17:36:44 +0200 Subject: Work on calendar from event in frontend, broken. --- module/calp/html/vcomponent.scm | 2 +- module/calp/html/view/calendar.scm | 56 +++++++++++++++++++------------------- module/vcomponent/xcal/output.scm | 5 +++- 3 files changed, 33 insertions(+), 30 deletions(-) (limited to 'module') diff --git a/module/calp/html/vcomponent.scm b/module/calp/html/vcomponent.scm index 1b97e9b8..09d0038b 100644 --- a/module/calp/html/vcomponent.scm +++ b/module/calp/html/vcomponent.scm @@ -208,7 +208,7 @@ `(div (@ (class " eventtext edit-tab ")) (form (@ (class "edit-form")) (select (@ (class "calendar-selection")) - (option "- Choose a Calendar -") + (option "- Choose a Calendar -") ,@(let ((dflt (get-config 'default-calendar))) (map (lambda (calendar) (define name (prop calendar 'NAME)) diff --git a/module/calp/html/view/calendar.scm b/module/calp/html/view/calendar.scm index dfcd2264..94175071 100644 --- a/module/calp/html/view/calendar.scm +++ b/module/calp/html/view/calendar.scm @@ -294,34 +294,34 @@ ;; This would idealy be a