]> git.plutz.net Git - webpoll/commitdiff
formset for separate times
authorPaul Hänsch <paul@plutz.net>
Sun, 25 Jul 2021 18:27:55 +0000 (20:27 +0200)
committerPaul Hänsch <paul@plutz.net>
Sun, 25 Jul 2021 18:27:55 +0000 (20:27 +0200)
newdate.sh
webpoll.css

index f486ebb86a24458dc33bb52d1751aef40504fd38..790d7400ed0027bf1aa6daecf6c3eed719d4ff7d 100755 (executable)
@@ -1,21 +1,79 @@
 #!/bin/sh
 
+fs_timeofday() {
+  local todall="$(DBM "$file" get todall)" time c=0
+  cat <<-EOF
+       [fieldset .timeofday
+         [label .todstart Start Time (optional):
+         ]
+         [label .todend   End Time (optional):
+         ]
+         $(for time in ${todall:--}; do
+           c=$((c + 1))
+           printf '
+             <input name="todstart" value="%s" placeholder="HH:MM" list="dlist_timeofday"
+                    pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
+             <input name="todend"   value="%s" placeholder="HH:MM"   list="dlist_timeofday"
+                    pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
+             [submit "todremove" "%i" -]
+           ' "${time%-*}" "${time#*-}" "${c}"
+         done)
+         [submit "addtime" "global" + Add Time Option]
+         [checkbox "none" "none" .splittimes disabled=disabled] [submit "splittimes" "yes" Separate Time Options per Day]
+       ]
+       EOF
+}
+
+fs_splittimes() {
+  local day times time c
+  cat <<-EOF
+       [fieldset .splittimes
+         [checkbox "none" "none" .splittimes checked disabled=disabled] [submit "splittimes" "no" Separate Time Options per Day]
+         $(for day in $(DBM "$file" get dates); do 
+            date -d $day +"[h2 . %A - %B %_d, %Y]"
+           times=$(DBM "$file" get "tod_$day")
+           for time in ${times:--}; do
+             c=$((c + 1))
+             printf '
+               <input name="todstart_%s" value="%s" placeholder="HH:MM" list="dlist_timeofday"
+                      pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
+               <input name="todend_%s"   value="%s" placeholder="HH:MM"   list="dlist_timeofday"
+                      pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
+               [submit "todremove" "%i" -]
+             ' "$day" "${time%-*}" "$day" "${time#*-}" "${c}"
+           done
+           printf '[submit "addtime" "%s" + Add Time Option]' "$day"
+         done)
+       ]
+       EOF
+}
+
 if [ "$REQUEST_METHOD" = POST ]; then
   id="${PATH_INFO%/newdate}"; id="${id#/}"
   file="$_DATA/$id"
   month="$(POST month |grep -m 1 -xE '[0-9]{4}-(0[1-9]|1[012])')"
   todremove="$(POST todremove |grep -m 1 -xE '[0-9]+')"
+  splittimes="$(POST splittimes |grep -m 1 -xE 'yes|no')"
+  addtime="$(POST addtime)"
+
+  [ "$splittimes" ] && DBM "$file" set splittimes "$splittimes" || splittimes="$(DBM "$file" get splittimes || printf no)"
+
   DBM "$file" set title "$(POST title)"
   DBM "$file" set description "$(POST description)"
   DBM "$file" set dates "$(
-    for date in $(seq 1 $(POST_COUNT date)); do
-      POST date "$date"
+    for date in $(seq 0 $(POST_COUNT date)); do
+      [ "$date" -eq 0 ] \
+      && POST date_add \
+      || POST date "$date"
       printf \\n
     done \
+    | grep -vxF "$(POST date_remove)" \
     | grep -xE '^[0-9]{4}-((01|03|05|07|08|10|12)-([012][0-9]|3[01])|(04|06|09|11)-([012][0-9]|30)|02-[012][0-9])$' \
     | sort -u
   )"
-  DBM "$file" set todall "$(
+
+  # Store common time options "todall"
+  [ "$splittimes" = no ] && DBM "$file" set todall "$(
     for todcount in $(seq 1 $(POST_COUNT todstart)); do
       [ "$todremove" -eq "$todcount" ] 2>&- && continue;
       todstart="$(POST todstart "$todcount")"
@@ -26,16 +84,30 @@ if [ "$REQUEST_METHOD" = POST ]; then
       || { [ "${todstart%:??}" -ge 0 -a  "${todstart#*:}" -ge 0 ] 2>&- && printf '%02i:%02i-\n' "${todstart%:??}" "${todstart#*:}"; }
     done |grep -xE '^([01][0-9]|2[0-3]):([0-5][0-9])-(([01][0-9]|2[0-3]):([0-5][0-9]))?$' |sort -u
   )"
+  [ "$addtime" = global ] && DBM "$file" append todall "${BR}-"
+
+  # Store per-date time options "tod_YYYY-mm-dd"
+  [ "$splittimes" = yes ] && for date in $(DBM "$file" get dates); do
+    todremove="$(POST todremove_$date |grep -m 1 -xE '[0-9]+')"
+    DBM "$file" set "tod_$date" "$(
+      for todcount in $(seq 1 $(POST_COUNT "todstart_${date}")); do
+        [ "$todremove" -eq "$todcount" ] 2>&- && continue;
+        todstart="$(POST "todstart_${date}" "$todcount")"
+        todend="$(POST "todend_${date}" "$todcount")"
+        [ "${todstart%:??}" -lt "${todend%:??}" -o "${todstart%:??}" -eq "${todend%:??}" -a "${todstart#*:}" -lt "${todend#*:}" ] \
+        2>&- \
+        && { printf '%02i:%02i-%02i:%02i\n' "${todstart%:??}" "${todstart#*:}" "${todend%:??}" "${todend#*:}"; }\
+        || { [ "${todstart%:??}" -ge 0 -a  "${todstart#*:}" -ge 0 ] 2>&- && printf '%02i:%02i-\n' "${todstart%:??}" "${todstart#*:}"; }
+      done |grep -xE '^([01][0-9]|2[0-3]):([0-5][0-9])-(([01][0-9]|2[0-3]):([0-5][0-9]))?$' |sort -u
+    )"
+    [ "$addtime" = "$date" ] && DBM "$file" append "tod_${date}" "${BR}-"
+  done
+
   if [ "$(POST cancel)" = cancel ]; then
     rm -- "$file"
     REDIRECT "$_BASE/"
-  elif [ "$(POST addtime)" = global ]; then
-    DBM "$file" append todall "${BR}-"
-    REDIRECT "$_BASE$PATH_INFO${month:+?month=}${month}"
-  elif [ "$month" ]; then
-    REDIRECT "$_BASE$PATH_INFO?month=$month"
   else
-    REDIRECT "$_BASE$PATH_INFO"
+    REDIRECT "$_BASE$PATH_INFO${month:+?month=}${month}"
   fi
 else
   id="${PATH_INFO%/newdate}"; id="${id#/}"
@@ -47,7 +119,7 @@ else
   dates="$(DBM "$file" get dates)"
   days="$(printf %s "$dates" |sed -E "/^${month}-/!d; s;^.*-([0-9]{2})$;\1;g")"
   additional="$(printf %s "$dates" |sed -E "/^${month}-/d;")"
-  todall="$(DBM "$file" get todall)"
+  splittimes="$(DBM "$file" get splittimes || printf no)"
 
   yield_page "$(pagename "$id")" "newdate" <<-EOF
        $(dlist_timeofday)
@@ -57,27 +129,11 @@ else
          [fieldset .date
            $(printf '[hidden "date" "%s"]' $additional)
            [submit "month" "$prev" Previous Month]
-           $(w_month multiple date "$month" $days)
+           $([ "$splittimes" = yes ] && w_month submit date "$month" $days || w_month multiple date "$month" $days)
            [submit "month" "$next" Next Month]
            [hidden "month" "$month"]
          ]
-         [fieldset .timeofday
-           [label .todstart Start Time (optional):
-           ]
-           [label .todend   End Time (optional):
-           ]
-           $(c=0; for time in ${todall:--}; do
-             c=$((c + 1))
-             printf '
-               <input name="todstart" value="%s" placeholder="HH:MM" list="dlist_timeofday"
-                       pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
-               <input name="todend"   value="%s" placeholder="HH:MM"   list="dlist_timeofday"
-                       pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
-               [submit "todremove" "%i" -]
-             ' "${time%-*}" "${time#*-}" "${c}"
-           done)
-           [submit "addtime" "global" + Add time option]
-         ]
+         $([ "$splittimes" = "yes" ] && fs_splittimes || fs_timeofday )
          [submit "cancel" "cancel" Cancel]
          [submit "post" "post" Post Event]
        ]
index 5803ec68202c9f64c20d52efc823f742a1508fe5..6473a1456fe4cf79dcd53f756967144a02d9bf0d 100644 (file)
@@ -10,9 +10,11 @@ body.newdate form {
   max-width: 100%;
 }
 body.newdate form fieldset.date,
-body.newdate form fieldset.timeofday {
+body.newdate form fieldset.timeofday,
+body.newdate form fieldset.splittimes {
   display: inline-block;
   vertical-align: top;
+  margin: .5em 0 1em 0;
 }
 
 body.newdate form { width: 24em; }
@@ -21,7 +23,8 @@ body.newdate form textarea[name=description] {
   width: 100%;
 }
 body.newdate form fieldset.date,
-body.newdate form fieldset.timeofday {
+body.newdate form fieldset.timeofday,
+body.newdate form fieldset.splittimes {
   width: 100%;
 }
 
@@ -32,7 +35,8 @@ body.newdate form fieldset.timeofday {
     width: 100%;
   }
   body.newdate form fieldset.date,
-  body.newdate form fieldset.timeofday {
+  body.newdate form fieldset.timeofday,
+  body.newdate form fieldset.splittimes {
     width: 49.5%; width: calc(50% - .375ex);
   }
 }
@@ -81,17 +85,22 @@ body.newdate form .timeofday label.todend {
   font-size: .75em;
   width: 49%; width: calc(50% - .5ex);
 }
-body.newdate form .timeofday > input[name=todstart],
-body.newdate form .timeofday > input[name=todend] {
+body.newdate form fieldset > input[name^=todstart],
+body.newdate form fieldset > input[name^=todend] {
   display: inline-block;
   margin: 0;
   width: 49%; width: calc(50% - .5ex);
   text-align: right;
 }
-body.newdate form .timeofday > input[name=todend] {
-  width: 40%; width: calc(50% - 4.375ex);
+body.newdate form fieldset > input[name^=todend] {
+  width: 40%; widtfieldset% - 4.375ex);
 }
 
-body.newdate form .timeofday button[name=addtime] {
+body.newdate form fieldset button[name^=addtime] {
   width: 100%;
 }
+
+body.newdate form .timeofday input.splittimes,
+body.newdate form .splittimes input.splittimes { width: 1.5em; height: 1.5em; }
+body.newdate form .timeofday button[name=splittimes] { margin-top: 1.5em;}
+