Joe Cohen and I explored the usability and interaction design for handling repeating events in Calagator.
We looked iCal, Google Calendar, Yahoo Calendar and Microsoft Outlook for any advice.
We also looked at a usability study by the folks who wrote "things" - the URL is here:
http://culturedcode.com/things/blog/2008/02/habemus-dialogum-we-have-a-dialog.htmlOut this we found that the pattern for defining repeating events was not intractable, although a bit intimidating at first.
We produced a small piece of javascript that exercises a simple repeating event utility. This is not *quite* complete because the year case needs a bit of work - but in general it should handle the daily, weekly and monthly cases and we'll try to post up an amendment for the year case soon.
Here is the javascript source code - hope this helps:
<form id="calagator_repeat_form">
Repeat the event titled "my event" on every
<input id="calagator_repeat_rate" style="width:32px" value="1"></input>
<select id="calagator_repeat_period" onchange="calagator_repeat_configure_period()">
<option selected>days</option>
<option>weeks</option>
<option>months</option>
<option>years</option>
</select>
on the
<select id="calagator_repeat_week" onchange="calagator_repeat_configure_week()">
<option>specific</option>
<option>first</option>
<option>second</option>
<option>third</option>
<option>fourth</option>
<option>fifth</option>
<option>last</option>
</select>
<span id="calagator_repeat_month">
<input type=checkbox value="1">jan</input>
<input type=checkbox value="2">feb</input>
<input type=checkbox value="3">mar</input>
<input type=checkbox value="4">apr</input>
<input type=checkbox value="5">may</input>
<input type=checkbox value="6">jun</input>
<input type=checkbox value="7">jul</input>
<input type=checkbox value="1">aug</input>
<input type=checkbox value="2">sep</input>
<input type=checkbox value="3">oct</input>
<input type=checkbox value="4">nov</input>
<input type=checkbox value="4">dec</input>
</span>
<span id="calagator_repeat_day_of_month">
<input type=checkbox value="1">1</input>
<input type=checkbox value="2">2</input>
<input type=checkbox value="3">3</input>
<input type=checkbox value="4">4</input>
<input type=checkbox value="5">5</input>
<input type=checkbox value="6">6</input>
<input type=checkbox value="7">7</input>
<input type=checkbox value="1">8</input>
<input type=checkbox value="2">9</input>
<input type=checkbox value="3">10</input>
<input type=checkbox value="4">11</input>
<input type=checkbox value="5">12</input>
<input type=checkbox value="6">13</input>
<input type=checkbox value="7">14</input>
<input type=checkbox value="1">15</input>
<input type=checkbox value="2">16</input>
<input type=checkbox value="3">17</input>
<input type=checkbox value="4">18</input>
<input type=checkbox value="5">19</input>
<input type=checkbox value="6">20</input>
<input type=checkbox value="7">21</input>
<input type=checkbox value="1">22</input>
<input type=checkbox value="2">23</input>
<input type=checkbox value="3">24</input>
<input type=checkbox value="4">25</input>
<input type=checkbox value="5">26</input>
<input type=checkbox value="6">27</input>
<input type=checkbox value="7">28</input>
<input type=checkbox value="7">29</input>
<input type=checkbox value="7">30</input>
<input type=checkbox value="7">31</input>
</span>
<span id="calagator_repeat_day_of_week">
<input type=checkbox value="sun">sun</input>
<input type=checkbox value="mon">mon</input>
<input type=checkbox value="tue">tue</input>
<input type=checkbox value="wed">wed</input>
<input type=checkbox value="thu">thu</input>
<input type=checkbox value="fri">fri</input>
<input type=checkbox value="sat">sat</input>
</span>
</form>
<script>
// TODO: anselm this should all become an object
var form = document.getElementById("calagator_repeat_form");
var period = document.getElementById("calagator_repeat_period");
var week = document.getElementById("calagator_repeat_week");
var moy = document.getElementById("calagator_repeat_month");
var dow = document.getElementById("calagator_repeat_day_of_week");
var dom = document.getElementById("calagator_repeat_day_of_month");
function calagator_repeat_show_all() {
week.style.display = "inline";
dow.style.display = "inline";
dom.style.display = "inline";
moy.style.display = "inline";
}
function calagator_repeat_configure_period() {
calagator_repeat_show_all();
week.value = "specific";
if(period.value == "days" || period.value == "weeks") {
week.style.display = "none";
dom.style.display = "none";
moy.style.display = "none";
}
else if( period.value == "months" ) {
dow.style.display = "none";
moy.style.display = "none";
}
else if( period.value == "years" ) {
dom.style.display="none";
moy.style.display = "inline";
}
}
function calagator_repeat_configure_week() {
calagator_repeat_show_all();
if(period.value == "months") {
//dow.style.display = "none";
moy.style.display = "none";
if(week.value == "specific") {
dow.style.display = "none";
} else {
dom.style.display = "none";
}
}
else if(period.value=="years") {
}
}
calagator_repeat_configure_period();
</script>