]> git.plutz.net Git - webpoll/blob - newdate.sh
Merge commit '79b11c6e49fd72ab72cad311429711dd8ce6bfd6'
[webpoll] / newdate.sh
1 #!/bin/sh
2
3 fs_timeofday() {
4   local todall="$(DBM "$file" get todall)" time c=0
5   cat <<-EOF
6         [fieldset .timeofday
7           [label .todstart Start Time (optional):
8           ]
9           [label .todend   End Time (optional):
10           ]
11           $(for time in ${todall:--}; do
12             c=$((c + 1))
13             printf '
14               <input name="todstart" value="%s" placeholder="HH:MM" list="dlist_timeofday"
15                      pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
16               <input name="todend"   value="%s" placeholder="HH:MM"   list="dlist_timeofday"
17                      pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
18               [submit "todremove" "%i" -]
19             ' "${time%-*}" "${time#*-}" "${c}"
20           done)
21           [submit "addtime" "global" + Add Time Option]
22           [checkbox "none" "none" .splittimes disabled=disabled] [submit "splittimes" "yes" Separate Time Options per Day]
23         ]
24         EOF
25 }
26
27 fs_splittimes() {
28   local days day times time c
29   days="$(DBM "$file" get dates)"
30   cat <<-EOF
31         [fieldset .splittimes
32           [checkbox "none" "none" .splittimes checked disabled=disabled] [submit "splittimes" "no" Separate Time Options per Day]
33           $([ ! "$days" ] && printf '[p You have not selected any days yet.]\n')
34           $(for day in $days; do 
35             date -d $day +"[h2 . %A - %B %_d, %Y]"
36             times=$(DBM "$file" get "tod_$day")
37             for time in ${times:--}; do
38               c=$((c + 1))
39               printf '
40                 <input name="todstart_%s" value="%s" placeholder="HH:MM" list="dlist_timeofday"
41                        pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
42                 <input name="todend_%s"   value="%s" placeholder="HH:MM"   list="dlist_timeofday"
43                        pattern="^(0?\[0-9\]|1\[0-9\]|2\[0-3\]):(\[0-5\]\[0-9\])$"/>
44                 [submit "todremove" "%i" -]
45               ' "$day" "${time%-*}" "$day" "${time#*-}" "${c}"
46             done
47             printf '[submit "addtime" "%s" + Add Time Option]' "$day"
48           done)
49         ]
50         EOF
51 }
52
53 if [ "$REQUEST_METHOD" = POST ]; then
54   id="${PATH_INFO%/newdate}"; id="${id#/}"
55   file="$_DATA/$id"
56   month="$(POST month |grep -m 1 -xE '[0-9]{4}-(0[1-9]|1[012])')"
57   todremove="$(POST todremove |grep -m 1 -xE '[0-9]+')"
58   splittimes="$(POST splittimes |grep -m 1 -xE 'yes|no')"
59   addtime="$(POST addtime)"
60
61   if [ "$splittimes" = yes ]; then
62     DBM "$file" set splittimes "$splittimes"
63     splittimes="no"   # receive remainder of todall form
64   elif [ "$splittimes" = no ]; then
65     DBM "$file" set splittimes "$splittimes"
66     splittimes="yes"  # receive remainder of splittimes form
67   else
68     splittimes="$(DBM "$file" get splittimes || printf no)"
69   fi
70
71   DBM "$file" set title "$(POST title)"
72   DBM "$file" set description "$(POST description)"
73   # Store common time options "todall"
74   [ "$splittimes" = no ] && DBM "$file" set todall "$(
75     for todcount in $(seq 1 $(POST_COUNT todstart)); do
76       [ "$todremove" -eq "$todcount" ] 2>&- && continue;
77       todstart="$(POST todstart "$todcount")"
78       todend="$(POST todend "$todcount")"
79       [ "${todstart%:??}" -lt "${todend%:??}" -o "${todstart%:??}" -eq "${todend%:??}" -a "${todstart#*:}" -lt "${todend#*:}" ] \
80       2>&- \
81       && { printf '%02i:%02i-%02i:%02i\n' "${todstart%:??}" "${todstart#*:}" "${todend%:??}" "${todend#*:}"; }\
82       || { [ "${todstart%:??}" -ge 0 -a  "${todstart#*:}" -ge 0 ] 2>&- && printf '%02i:%02i-\n' "${todstart%:??}" "${todstart#*:}"; }
83     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
84   )"
85   [ "$addtime" = global ] && DBM "$file" append todall "${BR}-"
86
87   # Store per-date time options "tod_YYYY-mm-dd"
88   [ "$splittimes" = yes ] && for date in $(DBM "$file" get dates); do
89     todremove="$(POST todremove_$date |grep -m 1 -xE '[0-9]+')"
90     DBM "$file" set "tod_$date" "$(
91       for todcount in $(seq 1 $(POST_COUNT "todstart_${date}")); do
92         [ "$todremove" -eq "$todcount" ] 2>&- && continue;
93         todstart="$(POST "todstart_${date}" "$todcount")"
94         todend="$(POST "todend_${date}" "$todcount")"
95         [ "${todstart%:??}" -lt "${todend%:??}" -o "${todstart%:??}" -eq "${todend%:??}" -a "${todstart#*:}" -lt "${todend#*:}" ] \
96         2>&- \
97         && { printf '%02i:%02i-%02i:%02i\n' "${todstart%:??}" "${todstart#*:}" "${todend%:??}" "${todend#*:}"; }\
98         || { [ "${todstart%:??}" -ge 0 -a  "${todstart#*:}" -ge 0 ] 2>&- && printf '%02i:%02i-\n' "${todstart%:??}" "${todstart#*:}"; }
99       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
100     )"
101     [ "$addtime" = "$date" ] && DBM "$file" append "tod_${date}" "${BR}-"
102   done
103
104   DBM "$file" set dates "$(
105     for date in $(seq 0 $(POST_COUNT date)); do
106       [ "$date" -eq 0 ] \
107       && POST date_add \
108       || POST date "$date"
109       printf \\n
110     done \
111     | grep -vxF "$(POST date_remove)" \
112     | 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])$' \
113     | sort -u
114   )"
115
116   if [ "$(POST cancel)" = cancel ]; then
117     rm -- "$file"
118     REDIRECT "$_BASE/"
119   elif [ "$(POST post)" = post ]; then
120     REDIRECT "$_BASE${PATH_INFO%/*}"
121   else
122     REDIRECT "$_BASE$PATH_INFO${month:+?month=}${month}"
123   fi
124 else
125   id="${PATH_INFO%/newdate}"; id="${id#/}"
126   file="$_DATA/$id"
127   month="$(GET month |grep -m1 -xE '[0-9]{4}-(0[1-9]|1[012])' || date +%Y-%m)"
128   Y="${month%-*}"; m="${month#*-}"; Y=${Y#0}; m=${m#0};
129   [ "$m" = 1 ] && prev=$(printf '%04i-%02i' $((Y - 1)) 12) || prev=$(printf '%04i-%02i' $Y $((m - 1)))
130   [ "$m" = 12 ] && next=$(printf '%04i-%02i' $((Y + 1)) 01) || next=$(printf '%04i-%02i' $Y $((m + 1)))
131   dates="$(DBM "$file" get dates)"
132   days="$(printf %s "$dates" |sed -E "/^${month}-/!d; s;^.*-([0-9]{2})$;\1;g")"
133   additional="$(printf %s "$dates" |sed -E "/^${month}-/d;")"
134   splittimes="$(DBM "$file" get splittimes || printf no)"
135
136   yield_page "$(pagename "$id")" "newdate" <<-EOF
137         $(dlist_timeofday)
138         [form method=post
139           [input name=title value="$(DBM "$file" get title |HTML)" placeholder="Title"]
140           [textarea name=description placeholder="Description" . $(DBM "$file" get description |HTML)]
141           [fieldset .date
142             $(printf '[hidden "date" "%s"]' $additional)
143             [submit "month" "$prev" Previous Month]
144             $([ "$splittimes" = yes ] && w_month submit date "$month" $days || w_month multiple date "$month" $days)
145             [submit "month" "$next" Next Month]
146             [hidden "month" "$month"]
147           ]
148           $([ "$splittimes" = "yes" ] && fs_splittimes || fs_timeofday )
149           [submit "cancel" "cancel" Cancel]
150           [submit "post" "post" Post Event]
151         ]
152         EOF
153 fi