1 <% @header[("title", ["Polls"])];
3 val pollAdmin = Group.inGroupName "poll";
5 ref editingPoll = NONE;
8 if $"cmd" = "list" then
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 %>
19 elseif $"vote" <> "" then
21 val id = Web.stoi ($"vote");
22 val poll = Poll.lookupPoll id %>
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>
35 <form action="poll" method="post">
36 <input type="hidden" name="vote2" value="<% id %>">
37 <% val choices = Poll.listChoicesWithMyVotes id;
38 if #votes poll = 1 then %>
40 <option value="">Abstain</option>
42 <select name="v" multiple size="<% length choices %>">
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">
50 <% elseif $"vote2" <> "" then
51 val id = Web.stoi ($"vote2");
52 val poll = Poll.lookupPoll id;
53 editingPoll := SOME id;
55 val votes = case Web.getMultiParam "v" of
57 | v => map Web.stoi v;
59 if length votes > #votes poll then
60 %><h3>You can't vote for that many different choices!</h3><%
61 elseif not (Poll.noDupes votes) then
62 %><h3>You can't vote multiple times for the same choice!</h3><%
64 Poll.vote (Init.getUserId (), id, votes)
65 %><h3>Thanks for voting!</h3>
68 elseif $"cmd" = "add" then
70 val starts = $"starts";
72 val votes = Web.stoi ($"votes");
74 %><h3>Your poll must have a title.</h3><%
75 elseif not pollAdmin and not (Poll.dateGeNow starts) then
76 %><h3>That start date is in the past!</h3><%
77 elseif not pollAdmin and not (Poll.dateLe (starts, ends)) then
78 %><h3>The end date comes before the start date!</h3><%
79 elseif votes <= 0 then
80 %><h3>You must specify a positive number of votes per person.</h3><%
82 val id = Poll.addPoll (Init.getUserId(), title, $"descr", starts, ends, votes);
83 editingPoll := SOME id;
84 %><h3>Poll added!</h3><%
87 elseif $"mod" <> "" then
89 val poll = Poll.lookupPoll (Web.stoi ($"mod"));
91 Poll.requireCanModify poll %>
94 <form action="poll" method="post">
95 <input type="hidden" name="id" value="<% $"mod" %>">
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>
102 <tr> <td><input type="submit" name="cmd" value="Save"></td> </tr>
106 <% elseif $"cmd" = "Save" then
107 val poll = Poll.lookupPoll (Web.stoi ($"id"));
109 Poll.requireCanModify poll;
111 val title = $"title";
112 val starts = $"starts";
114 val votes = Web.stoi ($"votes");
116 %><h3>Your poll must have a title.</h3><%
117 elseif not pollAdmin and not (Poll.dateGeNow starts) then
118 %><h3>That start date is in the past!</h3><%
119 elseif not pollAdmin and not (Poll.dateLe (starts, ends)) then
120 %><h3>The end date comes before the start date!</h3><%
121 elseif votes <= 0 then
122 %><h3>You must specify a positive number of votes per person.</h3><%
124 Poll.modPoll {poll with title = title, descr = $"descr", starts = starts, ends = ends, votes = votes};
125 editingPoll := SOME (#id poll);
126 %><h3>Poll record saved.</h3><%
129 elseif $"del" <> "" then
130 Group.requireGroupName "poll";
132 val poll = Poll.lookupPoll (Web.stoi ($"del")) %>
133 <h3>Are you sure you want to delete poll <a href="poll?id=<% #id poll %>"><% Web.html (#title poll) %></a>?</h3>
134 <a href="poll?del2=<% $"del" %>">Yes, delete <% Web.html (#title poll) %>!</a>
136 <% elseif $"del2" <> "" then
137 Group.requireGroupName "poll";
138 val poll = Poll.lookupPoll (Web.stoi ($"del2"));
139 Poll.deletePoll (Web.stoi ($"del2")) %>
140 <h3><% Web.html (#title poll) %> deleted!</h3>
142 <% elseif $"addChoice" <> "" then
143 val id = Web.stoi ($"addChoice");
144 editingPoll := SOME id;
145 val descr = $"descr";
147 %><h3>Your poll choice must have a description.</h3><%
149 val id = Poll.addChoice (id, Web.stor ($"seq"), descr);
150 %><h3>Choice added!</h3><%
153 elseif $"modChoice" <> "" then
155 val id = Web.stoi ($"modChoice");
156 val cho = Poll.lookupChoice id;
157 val poll = Poll.lookupPoll (#pol cho);
158 Poll.requireCanModify poll %>
160 <form action="poll" method="post">
161 <input type="hidden" name="saveChoice" value="<% id %>">
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>
165 <tr> <td><input type="submit" value="Save"></td> </tr>
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";
177 %><h3>Your poll choice must have a description.</h3><%
179 Poll.modChoice {cho with seq = Web.stor ($"seq"), descr = descr};
180 %><h3>Choice saved!</h3><%
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 %>
189 <h3>Are you sure you want to delete choice "<% Web.html (#descr cho) %>"</a>?</h3>
190 <a href="poll?delChoice2=<% $"delChoice" %>">Yes, delete "<% Web.html (#descr cho) %>"!</a>
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) %>
199 <h3>"<% Web.html (#descr cho) %>" deleted!</h3>
201 <% elseif $"report" <> "" then
203 val id = Web.stoi ($"report");
205 val poll = Poll.lookupPoll id;
206 val canModify = Poll.canModify poll %>
212 foreach user in Poll.listPollVoters id do
218 %><a href="user?id=<% #id user %>"><% #name user %></a><%
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>
224 <tr> <td>Start:</td> <td><% Web.html (#starts poll) %></td> </tr>
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>
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>
237 foreach user in Poll.listVoters (#id cho) do
243 %><a href="user?id=<% #id user %>"><% #name user %></a><%
249 <% elseif $"id" <> "" then
250 editingPoll := SOME (Web.stoi ($"id"))
254 <% switch editingPoll of
256 val poll = Poll.lookupPoll id;
257 val canModify = Poll.canModify poll %>
259 <table class="blanks">
260 <% if canModify then %><tr> <td></td> <td><a href="poll?mod=<% id %>">Edit poll data</a></td> </tr><% end %>
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>
269 <h3>Choices<% if Poll.takingVotes poll then %><a href="poll?vote=<% id %>">(Vote!)</a><% end %></h3>
271 <p><% Poll.countVoters (#id poll) %> people have voted.</p>
273 <% if Poll.takingVotes poll then %>
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>
289 foreach cho in Poll.listChoices id do %>
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>
299 <a href="poll?report=<% id %>">Vote Report</a>
301 <% if canModify then %>
303 <h3>Add a new choice</h3>
305 <form action="poll" method="post">
306 <input type="hidden" name="addChoice" value="<% id %>">
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>
310 <tr> <td><input type="submit" value="Add"></td> </tr>
316 if showNormal then %>
318 <a href="poll?cmd=list">Show all polls</a><br>
320 <h3>Create a poll</h3>
322 <form action="poll" method="post">
323 <input type="hidden" name="cmd" value="add">
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>
330 <tr> <td><input type="submit" value="Create"></td> </tr>