From 29d373df8f2b25ef5866f63d354d3553b3bbbead Mon Sep 17 00:00:00 2001 From: =?utf8?q?Paul=20H=C3=A4nsch?= Date: Sun, 25 Jul 2021 04:45:18 +0200 Subject: [PATCH] add fields or time selection --- index.cgi | 61 ++++++++++++++++++++++++++++++++++++----------- webpoll.css | 68 ++++++++++++++++++++++++++++++++++++++++++++++------- widgets.sh | 9 +++++++ 3 files changed, 115 insertions(+), 23 deletions(-) diff --git a/index.cgi b/index.cgi index d1469cd..37fb901 100755 --- a/index.cgi +++ b/index.cgi @@ -63,18 +63,35 @@ pagename() { /*/newdate) id="${PATH_INFO%/newdate}"; id="${id#/}" file="$_DATA/$id" - month="$(POST month |grep -m1 -xE '[0-9]{4}-(0[1-9]|1[012])')" + month="$(POST month |grep -m 1 -xE '[0-9]{4}-(0[1-9]|1[012])')" + todremove="$(POST todremove |grep -m 1 -xE '[0-9]+')" 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" printf \\n - done |sort + done \ + | 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 "$( + for todcount in $(seq 1 $(POST_COUNT todstart)); do + [ "$todremove" -eq "$todcount" ] 2>&- && continue; + todstart="$(POST todstart "$todcount")" + todend="$(POST todend "$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 )" 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 @@ -95,7 +112,7 @@ case ${PATH_INFO} in $(if [ "$recent" ]; then printf '[h2 Recent Polls][ul .recent' for page in $recent; do - [ -f "$_DATA/$(printf %s "$page" |checkid)" ] \ + [ -f "$_DATA/$(checkid "$page")" ] \ && printf '[li [a href="./%s" . %s]]' "$page" "$(pagename "$page" |HTML)" done printf ']' @@ -113,14 +130,37 @@ case ${PATH_INFO} in 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)" + yield_page "$(pagename "$id")" "newdate" <<-EOF + $(dlist_timeofday) [form method=post [input name=title value="$(DBM "$file" get title |HTML)" placeholder="Title"] [textarea name=description placeholder="Description" . $(DBM "$file" get description |HTML)] - [submit "month" "$prev" Previous Month] - $(w_month multiple date "$month" $days) - [submit "month" "$next" Next Month] - $(printf '[hidden "date" "%s"]' $additional) + [fieldset .date + $(printf '[hidden "date" "%s"]' $additional) + [submit "month" "$prev" Previous Month] + $(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 ' + + + [submit "todremove" "%i" -] + ' "${time%-*}" "${time#*-}" "${c}" + done) + [submit "addtime" "global" + Add time option] + ] [submit "cancel" "cancel" Cancel] [submit "post" "post" Post Event] ] @@ -128,12 +168,5 @@ case ${PATH_INFO} in ;; /*/newoptions);; *);; - /) yield_page <<-EOF - $(w_month none date 2019-12 24 25 26) - $(w_month select date 2020-01) - $(w_month multiple date 2020-02) - EOF - return 0 - ;; esac diff --git a/webpoll.css b/webpoll.css index b7d845a..5803ec6 100644 --- a/webpoll.css +++ b/webpoll.css @@ -7,30 +7,56 @@ body.home form { body.newdate form { text-align: center; margin: auto; - max-width: 24em; + max-width: 100%; +} +body.newdate form fieldset.date, +body.newdate form fieldset.timeofday { + display: inline-block; + vertical-align: top; } +body.newdate form { width: 24em; } body.newdate form input[name=title], body.newdate form textarea[name=description] { - display: block; width: 100%; +} +body.newdate form fieldset.date, +body.newdate form fieldset.timeofday { + width: 100%; +} + +@media(min-width: 48em) { + body.newdate form { width: 48em; } + body.newdate form input[name=title], + body.newdate form textarea[name=description] { + width: 100%; + } + body.newdate form fieldset.date, + body.newdate form fieldset.timeofday { + width: 49.5%; width: calc(50% - .375ex); + } +} + +body.newdate form input[name=title], +body.newdate form textarea[name=description] { + display: block; margin-bottom: .75em; } body.newdate form textarea[name=description] { height: 8em; } -body.newdate form button[name=month] { +body.newdate form .date button[name=month] { display: inline-block; - width: calc(50% - 9em); + padding: 0; + height: 3.25em; + width: 2em; width: calc(50% - 9em); vertical-align: middle; color: transparent; overflow: hidden; - height: 4em; border: none; } -body.newdate form textarea + button[name=month]:before, -body.newdate form table + button[name=month]:before { +body.newdate form .date button[name=month]:before { display: block; content: '<'; font-size: 2em; @@ -38,10 +64,34 @@ body.newdate form table + button[name=month]:before { margin-top: .375em; color: #666; } -body.newdate form table + button[name=month]:before { +body.newdate form .date table + button[name=month]:before { content: '>'; } -body.newdate form table.calendar { +body.newdate form .date table.calendar { vertical-align: middle; } + +body.newdate form .timeofday label.todstart, +body.newdate form .timeofday label.todend { + display: inline-block; + margin: 0; + font-weight: bold; + text-align: left; + font-size: .75em; + width: 49%; width: calc(50% - .5ex); +} +body.newdate form .timeofday > input[name=todstart], +body.newdate form .timeofday > 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 .timeofday button[name=addtime] { + width: 100%; +} diff --git a/widgets.sh b/widgets.sh index 5e7132e..4d3df23 100755 --- a/widgets.sh +++ b/widgets.sh @@ -94,3 +94,12 @@ w_month() { fi printf ']]' } + +dlist_timeofday() { + local step="${1:-15}" id="${2:-dlist_timeofday}" + printf '[datalist id="%s"\n' $id + for h in $(seq 0 23); do for m in $(seq 0 "$step" 59); do + printf '[option value="%i:%02i"]\n' $h $m + done; done + printf ']\n' +} -- 2.39.2