Commit | Line | Data |
---|---|---|
e68ddb80 AC |
1 | <% @header[("title", ["Polls"])]; |
2 | ||
3 | val pollAdmin = Group.inGroupName "poll"; | |
4 | ||
5 | ref editingPoll = NONE; | |
6 | ref showNormal = true; | |
7 | ||
8 | if $"cmd" = "list" then | |
9 | showNormal := false %> | |
10 | ||
b6dd1aaf | 11 | <h2>All polls</h2> |
e68ddb80 AC |
12 | |
13 | <% foreach pol in Poll.listPolls () do %> | |
14 | <li> <a href="poll?id=<% #id pol %>"><% Web.html (#title pol) %></a> | |
15 | <% if pollAdmin then %><a href="poll?del=<% #id pol %>">[Delete]</a> <% end %> | |
16 | </li> | |
17 | <% end | |
18 | ||
56dbfc30 AC |
19 | elseif $"vote" <> "" then |
20 | showNormal := false; | |
21 | val id = Web.stoi ($"vote"); | |
22 | val poll = Poll.lookupPoll id %> | |
23 | ||
b6dd1aaf AC |
24 | <table class="blanks"> |
25 | <tr> <td>Poll#:</td> <td><% id %></td> </tr> | |
26 | <tr> <td>Title:</td> <td><% Web.html (#title poll) %></td> </tr> | |
27 | <tr> <td>Start:</td> <td><% Web.html (#starts poll) %></td> </tr> | |
28 | <tr> <td>End:</td> <td><% Web.html (#ends poll) %></td> </tr> | |
29 | <tr> <td>Votes/person:</td> <td><% #votes poll %></td> </tr> | |
30 | <tr> <td>Description:</td> <td><% Web.htmlNl (#descr poll) %></td> </tr> | |
56dbfc30 AC |
31 | </table> |
32 | ||
b6dd1aaf | 33 | <h3>Choices</h3> |
56dbfc30 | 34 | |
a4ccdb5e | 35 | <form action="poll" method="post"> |
56dbfc30 AC |
36 | <input type="hidden" name="vote2" value="<% id %>"> |
37 | <% val choices = Poll.listChoicesWithMyVotes id; | |
38 | if #votes poll = 1 then %> | |
39 | <select name="v"> | |
40 | <option value="">Abstain</option> | |
41 | <% else %> | |
42 | <select name="v" multiple size="<% length choices %>"> | |
43 | <% end | |
44 | foreach (you, cho) in choices do %> | |
45 | <option value="<% #id cho %>"<% if you then %> selected<% end %>><% Web.html (#descr cho) %></option> | |
46 | <% end %></select><br><br> | |
47 | <input type="submit" value="Vote"> | |
48 | </form> | |
49 | ||
50 | <% elseif $"vote2" <> "" then | |
51 | val id = Web.stoi ($"vote2"); | |
52 | val poll = Poll.lookupPoll id; | |
53 | editingPoll := SOME id; | |
54 | ||
55 | val votes = case Web.getMultiParam "v" of | |
56 | [""] => [] | |
57 | | v => map Web.stoi v; | |
58 | ||
59 | if length votes > #votes poll then | |
b6dd1aaf | 60 | %><h3>You can't vote for that many different choices!</h3><% |
56dbfc30 | 61 | elseif not (Poll.noDupes votes) then |
b6dd1aaf | 62 | %><h3>You can't vote multiple times for the same choice!</h3><% |
56dbfc30 AC |
63 | else |
64 | Poll.vote (Init.getUserId (), id, votes) | |
b6dd1aaf | 65 | %><h3>Thanks for voting!</h3> |
56dbfc30 AC |
66 | <% end |
67 | ||
e68ddb80 AC |
68 | elseif $"cmd" = "add" then |
69 | val title = $"title"; | |
70 | val starts = $"starts"; | |
71 | val ends = $"ends"; | |
72 | val votes = Web.stoi ($"votes"); | |
73 | if title = "" then | |
b6dd1aaf | 74 | %><h3>Your poll must have a title.</h3><% |
93f77ca7 | 75 | elseif not pollAdmin and not (Poll.dateGeNow starts) then |
b6dd1aaf | 76 | %><h3>That start date is in the past!</h3><% |
93f77ca7 | 77 | elseif not pollAdmin and not (Poll.dateLe (starts, ends)) then |
b6dd1aaf | 78 | %><h3>The end date comes before the start date!</h3><% |
e68ddb80 | 79 | elseif votes <= 0 then |
b6dd1aaf | 80 | %><h3>You must specify a positive number of votes per person.</h3><% |
e68ddb80 AC |
81 | else |
82 | val id = Poll.addPoll (Init.getUserId(), title, $"descr", starts, ends, votes); | |
83 | editingPoll := SOME id; | |
b6dd1aaf | 84 | %><h3>Poll added!</h3><% |
e68ddb80 AC |
85 | end |
86 | ||
87 | elseif $"mod" <> "" then | |
88 | showNormal := false; | |
89 | val poll = Poll.lookupPoll (Web.stoi ($"mod")); | |
90 | ||
91 | Poll.requireCanModify poll %> | |
b6dd1aaf | 92 | <h3>Modify poll</h3> |
e68ddb80 | 93 | |
a4ccdb5e | 94 | <form action="poll" method="post"> |
e68ddb80 | 95 | <input type="hidden" name="id" value="<% $"mod" %>"> |
b6dd1aaf AC |
96 | <table class="blanks"> |
97 | <tr> <td>Title:</td> <td><input name="title" value="<% Web.html (#title poll) %>"></td> </tr> | |
98 | <tr> <td>Start date:</td> <td><input name="starts" value="<% Web.html (#starts poll) %>"></td> </tr> | |
99 | <tr> <td>End date:</td> <td><input name="ends" value="<% Web.html (#ends poll) %>"></td> </tr> | |
100 | <tr> <td>Max votes/person:</td> <td><input name="votes" value="<% #votes poll %>"></td> </tr> | |
101 | <tr> <td>Description:</td> <td><textarea name="descr" wrap="soft" rows="5" cols="80"><% Web.html (#descr poll) %></textarea></td> </tr> | |
e68ddb80 AC |
102 | <tr> <td><input type="submit" name="cmd" value="Save"></td> </tr> |
103 | </table> | |
104 | </form> | |
105 | ||
106 | <% elseif $"cmd" = "Save" then | |
107 | val poll = Poll.lookupPoll (Web.stoi ($"id")); | |
108 | ||
109 | Poll.requireCanModify poll; | |
110 | ||
111 | val title = $"title"; | |
112 | val starts = $"starts"; | |
113 | val ends = $"ends"; | |
114 | val votes = Web.stoi ($"votes"); | |
115 | if title = "" then | |
b6dd1aaf | 116 | %><h3>Your poll must have a title.</h3><% |
93f77ca7 | 117 | elseif not pollAdmin and not (Poll.dateGeNow starts) then |
b6dd1aaf | 118 | %><h3>That start date is in the past!</h3><% |
93f77ca7 | 119 | elseif not pollAdmin and not (Poll.dateLe (starts, ends)) then |
b6dd1aaf | 120 | %><h3>The end date comes before the start date!</h3><% |
e68ddb80 | 121 | elseif votes <= 0 then |
b6dd1aaf | 122 | %><h3>You must specify a positive number of votes per person.</h3><% |
e68ddb80 AC |
123 | else |
124 | Poll.modPoll {poll with title = title, descr = $"descr", starts = starts, ends = ends, votes = votes}; | |
125 | editingPoll := SOME (#id poll); | |
b6dd1aaf | 126 | %><h3>Poll record saved.</h3><% |
e68ddb80 AC |
127 | end |
128 | ||
129 | elseif $"del" <> "" then | |
130 | Group.requireGroupName "poll"; | |
131 | showNormal := false; | |
132 | val poll = Poll.lookupPoll (Web.stoi ($"del")) %> | |
b6dd1aaf | 133 | <h3>Are you sure you want to delete poll <a href="poll?id=<% #id poll %>"><% Web.html (#title poll) %></a>?</h3> |
e68ddb80 AC |
134 | <a href="poll?del2=<% $"del" %>">Yes, delete <% Web.html (#title poll) %>!</a> |
135 | ||
136 | <% elseif $"del2" <> "" then | |
137 | Group.requireGroupName "poll"; | |
138 | val poll = Poll.lookupPoll (Web.stoi ($"del2")); | |
139 | Poll.deletePoll (Web.stoi ($"del2")) %> | |
b6dd1aaf | 140 | <h3><% Web.html (#title poll) %> deleted!</h3> |
e68ddb80 AC |
141 | |
142 | <% elseif $"addChoice" <> "" then | |
143 | val id = Web.stoi ($"addChoice"); | |
144 | editingPoll := SOME id; | |
145 | val descr = $"descr"; | |
146 | if descr = "" then | |
b6dd1aaf | 147 | %><h3>Your poll choice must have a description.</h3><% |
e68ddb80 AC |
148 | else |
149 | val id = Poll.addChoice (id, Web.stor ($"seq"), descr); | |
b6dd1aaf | 150 | %><h3>Choice added!</h3><% |
e68ddb80 AC |
151 | end |
152 | ||
153 | elseif $"modChoice" <> "" then | |
154 | showNormal := false; | |
155 | val id = Web.stoi ($"modChoice"); | |
156 | val cho = Poll.lookupChoice id; | |
157 | val poll = Poll.lookupPoll (#pol cho); | |
158 | Poll.requireCanModify poll %> | |
159 | ||
a4ccdb5e | 160 | <form action="poll" method="post"> |
e68ddb80 | 161 | <input type="hidden" name="saveChoice" value="<% id %>"> |
b6dd1aaf AC |
162 | <table class="blanks"> |
163 | <tr> <td>Text:</td> <td><input name="descr" value="<% Web.html (#descr cho) %>"></td> </tr> | |
164 | <tr> <td>Sequence#:</td> <td><input name="seq" value="<% #seq cho %>"></td> </tr> | |
e68ddb80 AC |
165 | <tr> <td><input type="submit" value="Save"></td> </tr> |
166 | </table> | |
167 | </form> | |
168 | ||
169 | <% elseif $"saveChoice" <> "" then | |
170 | val id = Web.stoi ($"saveChoice"); | |
171 | val cho = Poll.lookupChoice id; | |
172 | val poll = Poll.lookupPoll (#pol cho); | |
173 | Poll.requireCanModify poll; | |
174 | editingPoll := SOME (#id poll); | |
175 | val descr = $"descr"; | |
176 | if descr = "" then | |
b6dd1aaf | 177 | %><h3>Your poll choice must have a description.</h3><% |
e68ddb80 AC |
178 | else |
179 | Poll.modChoice {cho with seq = Web.stor ($"seq"), descr = descr}; | |
b6dd1aaf | 180 | %><h3>Choice saved!</h3><% |
e68ddb80 AC |
181 | end |
182 | ||
183 | elseif $"delChoice" <> "" then | |
184 | val id = Web.stoi ($"delChoice"); | |
185 | val cho = Poll.lookupChoice id; | |
186 | val poll = Poll.lookupPoll (#pol cho); | |
187 | Poll.requireCanModify poll; | |
188 | showNormal := false %> | |
b6dd1aaf | 189 | <h3>Are you sure you want to delete choice "<% Web.html (#descr cho) %>"</a>?</h3> |
e68ddb80 AC |
190 | <a href="poll?delChoice2=<% $"delChoice" %>">Yes, delete "<% Web.html (#descr cho) %>"!</a> |
191 | ||
192 | <% elseif $"delChoice2" <> "" then | |
193 | val id = Web.stoi ($"delChoice2"); | |
194 | val cho = Poll.lookupChoice id; | |
195 | val poll = Poll.lookupPoll (#pol cho); | |
196 | Poll.requireCanModify poll; | |
197 | Poll.deleteChoice id; | |
198 | editingPoll := SOME (#id poll) %> | |
b6dd1aaf | 199 | <h3>"<% Web.html (#descr cho) %>" deleted!</h3> |
e68ddb80 | 200 | |
56dbfc30 AC |
201 | <% elseif $"report" <> "" then |
202 | showNormal := false; | |
203 | val id = Web.stoi ($"report"); | |
204 | ||
205 | val poll = Poll.lookupPoll id; | |
206 | val canModify = Poll.canModify poll %> | |
207 | ||
b6dd1aaf | 208 | <h3>Vote Report</h3> |
56dbfc30 | 209 | |
1d2cae17 AC |
210 | <p>Voters: |
211 | <% ref first = true; | |
212 | foreach user in Poll.listPollVoters id do | |
213 | if first then | |
214 | first := false | |
215 | else | |
216 | %>, <% | |
217 | end | |
218 | %><a href="user?id=<% #id user %>"><% #name user %></a><% | |
219 | end %></p> | |
220 | ||
b6dd1aaf AC |
221 | <table class="blanks"> |
222 | <tr> <td>Poll#</b>:</td> <td><% id %></td> </tr> | |
223 | <tr> <td>Title</b>:</td> <td><% Web.html (#title poll) %></td> </tr> | |
bf47b57b | 224 | <tr> <td>Start:</td> <td><% Web.html (#starts poll) %></td> </tr> |
b6dd1aaf AC |
225 | <tr> <td>End:</td> <td><% Web.html (#ends poll) %></td> </tr> |
226 | <tr> <td>Votes/person:</td> <td><% #votes poll %></td> </tr> | |
227 | <tr> <td>Description:</td> <td><% Web.htmlNl (#descr poll) %></td> </tr> | |
56dbfc30 AC |
228 | </table> |
229 | ||
230 | <br><hr><br> | |
231 | ||
232 | <table> | |
233 | <tr> <td><b>Votes</b></td> <td><b>Choice</b></td> <td><b>Voters</b></td> </tr> | |
234 | <% foreach (_, total, cho) in Poll.listChoicesWithVotes id do %> | |
235 | <tr> <td><% total %></td> <td><% Web.html (#descr cho) %></td> <td> | |
236 | <% ref first = true; | |
237 | foreach user in Poll.listVoters (#id cho) do | |
238 | if first then | |
239 | first := false | |
240 | else | |
241 | %>, <% | |
242 | end | |
243 | %><a href="user?id=<% #id user %>"><% #name user %></a><% | |
244 | end | |
245 | %></td> </tr><% | |
246 | end %> | |
247 | </table> | |
248 | ||
e68ddb80 AC |
249 | <% elseif $"id" <> "" then |
250 | editingPoll := SOME (Web.stoi ($"id")) | |
251 | ||
252 | end %> | |
253 | ||
254 | <% switch editingPoll of | |
255 | SOME id => | |
56dbfc30 AC |
256 | val poll = Poll.lookupPoll id; |
257 | val canModify = Poll.canModify poll %> | |
e68ddb80 | 258 | |
b6dd1aaf | 259 | <table class="blanks"> |
e68ddb80 | 260 | <% if canModify then %><tr> <td></td> <td><a href="poll?mod=<% id %>">Edit poll data</a></td> </tr><% end %> |
b6dd1aaf AC |
261 | <tr> <td>Poll#:</td> <td><% id %></td> </tr> |
262 | <tr> <td>Title:</td> <td><% Web.html (#title poll) %></td> </tr> | |
263 | <tr> <td>Start:</td> <td><% Web.html (#starts poll) %></td> </tr> | |
264 | <tr> <td>End:</td> <td><% Web.html (#ends poll) %></td> </tr> | |
265 | <tr> <td>Votes/person:</td> <td><% #votes poll %></td> </tr> | |
266 | <tr> <td>Description:</td> <td><% Web.htmlNl (#descr poll) %></td> </tr> | |
e68ddb80 AC |
267 | </table> |
268 | ||
b6dd1aaf | 269 | <h3>Choices<% if Poll.takingVotes poll then %><a href="poll?vote=<% id %>">(Vote!)</a><% end %></h3> |
e68ddb80 | 270 | |
1d2cae17 AC |
271 | <p><% Poll.countVoters (#id poll) %> people have voted.</p> |
272 | ||
56dbfc30 AC |
273 | <% if Poll.takingVotes poll then %> |
274 | <table> | |
275 | <tr> <td><b>You</b></td> <td><b>Total</b></td> </tr> | |
276 | <% foreach (you, total, cho) in Poll.listChoicesWithVotes id do %> | |
277 | <tr> <td align="center"><% if you then %>X<% end %></td> | |
278 | <td align="center"><% total %></td> | |
279 | <td><% Web.html (#descr cho) %></td> | |
280 | <% if canModify then %> | |
281 | <td><i>(<% #seq cho %>)</i> | |
282 | <a href="poll?modChoice=<% #id cho %>">[Modify]</a> | |
283 | <a href="poll?delChoice=<% #id cho %>">[Delete]</a></td> | |
284 | <% end %></tr> | |
285 | <% end %> | |
286 | </table> | |
287 | ||
56dbfc30 AC |
288 | <% else |
289 | foreach cho in Poll.listChoices id do %> | |
e68ddb80 AC |
290 | <li> <% Web.html (#descr cho) %> |
291 | <% if canModify then %> | |
292 | <i>(<% #seq cho %>)</i> | |
293 | <a href="poll?modChoice=<% #id cho %>">[Modify]</a> | |
294 | <a href="poll?delChoice=<% #id cho %>">[Delete]</a> | |
295 | <% end %></li> | |
56dbfc30 AC |
296 | <% end |
297 | end %> | |
e68ddb80 | 298 | |
b90b0980 AC |
299 | <a href="poll?report=<% id %>">Vote Report</a> |
300 | ||
e68ddb80 AC |
301 | <% if canModify then %> |
302 | <br><hr><br> | |
b6dd1aaf | 303 | <h3>Add a new choice</h3> |
e68ddb80 | 304 | |
a4ccdb5e | 305 | <form action="poll" method="post"> |
e68ddb80 | 306 | <input type="hidden" name="addChoice" value="<% id %>"> |
b6dd1aaf AC |
307 | <table class="blanks"> |
308 | <tr> <td>Text:</td> <td><input name="descr"></td> </tr> | |
309 | <tr> <td>Sequence#:</td> <td><input name="seq" value="<% Poll.nextSeq id %>"></td> </tr> | |
e68ddb80 AC |
310 | <tr> <td><input type="submit" value="Add"></td> </tr> |
311 | </table> | |
312 | </form> | |
313 | ||
314 | <% end %> | |
315 | <% | NONE => | |
316 | if showNormal then %> | |
317 | ||
318 | <a href="poll?cmd=list">Show all polls</a><br> | |
319 | ||
b6dd1aaf | 320 | <h3>Create a poll</h3> |
e68ddb80 | 321 | |
a4ccdb5e | 322 | <form action="poll" method="post"> |
e68ddb80 | 323 | <input type="hidden" name="cmd" value="add"> |
b6dd1aaf AC |
324 | <table class="blanks"> |
325 | <tr> <td>Title:</td> <td><input name="title"></td> </tr> | |
326 | <tr> <td>Start date:</td> <td><input name="starts"></td> </tr> | |
327 | <tr> <td>End date:</td> <td><input name="ends"></td> </tr> | |
328 | <tr> <td>Max votes/person:</td> <td><input name="votes"></td> </tr> | |
329 | <tr> <td>Description:</td> <td><textarea name="descr" wrap="soft" rows="5" cols="80"></textarea></td> </tr> | |
e68ddb80 AC |
330 | <tr> <td><input type="submit" value="Create"></td> </tr> |
331 | </table> | |
332 | </form> | |
333 | ||
334 | <% end | |
335 | end %> | |
336 | ||
337 | <% @footer[] %> |