[Jifty-commit] r4199 - in apps/Skedjul: . etc lib/Skedjul/Action lib/Skedjul/Model share share/web/static share/web/static/css share/web/static/js share/web/templates share/web/templates/_elements share/web/templates/calendar share/web/templates/fragments share/web/templates/fragments/calendar web

jifty-commit at lists.jifty.org jifty-commit at lists.jifty.org
Wed Oct 3 12:15:58 EDT 2007


Author: jesse
Date: Wed Oct  3 12:15:54 2007
New Revision: 4199

Added:
   apps/Skedjul/share/
   apps/Skedjul/share/web/
   apps/Skedjul/share/web/static/
   apps/Skedjul/share/web/static/css/
   apps/Skedjul/share/web/static/css/app.css
   apps/Skedjul/share/web/static/css/hcalendar.css   (contents, props changed)
   apps/Skedjul/share/web/static/css/minicalendar.css   (contents, props changed)
   apps/Skedjul/share/web/static/js/
   apps/Skedjul/share/web/static/js/hcalendar.js
   apps/Skedjul/share/web/templates/
   apps/Skedjul/share/web/templates/_elements/
   apps/Skedjul/share/web/templates/_elements/accept_invites
   apps/Skedjul/share/web/templates/_elements/braindump_events
   apps/Skedjul/share/web/templates/_elements/javascript
   apps/Skedjul/share/web/templates/_elements/nav
   apps/Skedjul/share/web/templates/_elements/new_event
   apps/Skedjul/share/web/templates/_elements/this_week
   apps/Skedjul/share/web/templates/_elements/today
   apps/Skedjul/share/web/templates/calendar/
   apps/Skedjul/share/web/templates/calendar/day
   apps/Skedjul/share/web/templates/calendar/list
   apps/Skedjul/share/web/templates/calendar/month
   apps/Skedjul/share/web/templates/calendar/two_weeks
   apps/Skedjul/share/web/templates/calendar/week
   apps/Skedjul/share/web/templates/create_event
   apps/Skedjul/share/web/templates/event
   apps/Skedjul/share/web/templates/fragments/
   apps/Skedjul/share/web/templates/fragments/calendar/
   apps/Skedjul/share/web/templates/fragments/calendar/day
   apps/Skedjul/share/web/templates/home
   apps/Skedjul/share/web/templates/login
Removed:
   apps/Skedjul/web/
Modified:
   apps/Skedjul/   (props changed)
   apps/Skedjul/etc/config.yml
   apps/Skedjul/lib/Skedjul/Action/CreateEvent.pm
   apps/Skedjul/lib/Skedjul/Model/Attendee.pm
   apps/Skedjul/lib/Skedjul/Model/Event.pm

Log:
 r21931 at hualien (orig r6081):  jesse | 2007-02-09 14:42:52 -0500
 


Modified: apps/Skedjul/etc/config.yml
==============================================================================
--- apps/Skedjul/etc/config.yml	(original)
+++ apps/Skedjul/etc/config.yml	Wed Oct  3 12:15:54 2007
@@ -1,5 +1,7 @@
 ---
 framework:
+  DevelMode: 0
+  AdminMode: 0
   Database:
     Database: skedjul
     Driver: Pg

Modified: apps/Skedjul/lib/Skedjul/Action/CreateEvent.pm
==============================================================================
--- apps/Skedjul/lib/Skedjul/Action/CreateEvent.pm	(original)
+++ apps/Skedjul/lib/Skedjul/Action/CreateEvent.pm	Wed Oct  3 12:15:54 2007
@@ -13,6 +13,7 @@
         render_as => 'Textarea',
         label     => 'Attendees',
         type      => 'text',
+        sort_order => '6.5',
         default_value => Jifty->web->current_user->user_object->email,
         autocompleter => sub {
             my $value = shift;

Modified: apps/Skedjul/lib/Skedjul/Model/Attendee.pm
==============================================================================
--- apps/Skedjul/lib/Skedjul/Model/Attendee.pm	(original)
+++ apps/Skedjul/lib/Skedjul/Model/Attendee.pm	Wed Oct  3 12:15:54 2007
@@ -16,6 +16,8 @@
 
 package Skedjul::Model::Attendee;
 use base qw/Skedjul::Record/;
+use Skedjul::Model::Event;
+use Skedjul::Model::User;
 
 # Your model-specific methods go here.
 

Modified: apps/Skedjul/lib/Skedjul/Model/Event.pm
==============================================================================
--- apps/Skedjul/lib/Skedjul/Model/Event.pm	(original)
+++ apps/Skedjul/lib/Skedjul/Model/Event.pm	Wed Oct  3 12:15:54 2007
@@ -7,14 +7,14 @@
 # Your column definitions go here.  See L<Jifty::DBI::Schema> for
 # documentation about how to write column definitions.
 
-column timezone =>
-    type is 'text';
+
+column title =>
+    type is 'text', 
+    default is q{A boring meeting. Couldn't you go do something fun instead?};
 
 column event_type =>
     type is 'text',
     valid_values are qw(meeting deadline);
-column privacy =>
-    valid_values are qw(public private);
 
 column starts =>
     type is 'timestamp',
@@ -23,14 +23,17 @@
     type is 'timestamp',
     filters( are qw/Jifty::DBI::Filter::DateTime/);
 
+column privacy =>
+    valid_values (are qw(public private)),
+    default is 'public';
+
+column timezone =>
+    type is 'text';
+
 
 column location =>
     type is 'text';
 
-column title =>
-    type is 'text', 
-    default is q{A boring meeting. Couldn't you go do something fun instead?};
-
 column description =>
     type is 'text';
 

Added: apps/Skedjul/share/web/static/css/app.css
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/static/css/app.css	Wed Oct  3 12:15:54 2007
@@ -0,0 +1 @@
+ at import "hcalendar.css";

Added: apps/Skedjul/share/web/static/css/hcalendar.css
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/static/css/hcalendar.css	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,50 @@
+//td {
+//  border: solid 2px;
+//}
+
+//table {
+//  border: dashed 1px;
+//}
+
+.calHeader {
+  font-size:16px;
+  font-family:arial, helvetica; 
+  font-weight:bold;
+  text-align: center;
+}
+
+
+.calDay {
+  background-color:#EDECD8; 
+  height:80px; 
+  width: 90px;
+  vertical-align: top;
+}
+.calDayToday {
+  background-color:#F5F4ED; 
+}
+.calEmptyDay {
+  background-color:#EEEEEE; 
+}
+
+.calDayLabel { 
+  font-size:10px; 
+  font-family:verdana, arial, helvetica; 
+  color:#00F;
+  text-align: right;
+}
+
+.calEvent				{ font-size:10px; line-height:16px; font-family:verdana, arial, helvetica; color:#000 }
+
+td.calColumnHeader {
+  background-color:#72747A; 
+  font-size:12px; 
+  font-family:arial, helvetica; 
+  color:#FFFFFF; 
+  font-weight:bold;
+  text-align: center;
+}
+
+tr.calAbbrevColumnHeader {
+  display: none;
+}

Added: apps/Skedjul/share/web/static/css/minicalendar.css
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/static/css/minicalendar.css	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,56 @@
+//td {
+//  border: solid 2px;
+//}
+
+//table {
+//  border: dashed 1px;
+//}
+
+.calHeader {
+  font-size:16px;
+  font-family:arial, helvetica; 
+  font-weight:bold;
+  text-align: center;
+}
+
+
+.calDay {
+  background-color:#EDECD8; 
+//  height:80px; 
+//  width: 90px;
+  vertical-align: top;
+}
+.calDayToday {
+  background-color:#F5F4ED; 
+}
+.calEmptyDay {
+  background-color:#EEEEEE; 
+}
+
+.calEventDay {
+  border: dashed 1px;
+}
+
+.calDayLabel { 
+  font-size:10px; 
+  font-family:verdana, arial, helvetica; 
+  color:#00F;
+  text-align: right;
+}
+
+.calEvent				{
+  display: none;
+}
+
+td.calAbbrevColumnHeader {
+  background-color:#72747A; 
+  font-size:12px; 
+  font-family:arial, helvetica; 
+  color:#FFFFFF; 
+  font-weight:bold;
+  text-align: center;
+}
+
+tr.calColumnHeader {
+  display: none;
+}

Added: apps/Skedjul/share/web/static/js/hcalendar.js
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/static/js/hcalendar.js	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,259 @@
+/* JSCalendar. 5/17/2005
+
+MIT license:
+
+Copyright (c) 2005 David Glasser
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+*/
+
+/* CONFIG */
+
+var dayNames = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
+var dayAbbrevs = new Array("S", "M", "T", "W", "T", "F", "S");
+var firstDayOfWeek = 0;
+var DEBUG = 1;
+
+/* stolen from somebody's blog */
+
+function addLoadEvent(func) {
+  var oldonload = window.onload;
+  if (typeof window.onload != 'function') {
+    window.onload = func;
+  } else {
+    window.onload = function() {
+      oldonload();
+      func();
+    }
+  }
+}
+
+/* this function borrowed from prototype.js */
+document.getElementsByClassName = function(className) {
+  var children = document.getElementsByTagName('*') || document.all;
+  var elements = new Array();
+
+  for (var i = 0; i < children.length; i++) {
+    var child = children[i];
+    if (hasClass(child, className)) {
+      elements.push(child);
+    }
+  }
+
+  return elements;
+}
+
+function hasClass (elt, cls) {
+  var classNames = elt.className.split(' ');
+  for (var j = 0; j < classNames.length; j++) {
+    if (classNames[j] == cls) {
+      return true;
+    }
+  }
+  return false;
+}
+
+function debug(message) {
+  if (DEBUG)
+    alert(message);
+}
+
+var globalDateHash = new Object();
+
+function findHCalendarEvents () {
+  if (!(document.getElementById && document.createElement)) {
+    debug("No DOM!");
+    return;
+  }
+  var outputDiv = document.getElementById('jhCalendar');
+  
+  if (outputDiv == null) {
+    debug("jhCalendar not found!")
+    return;
+  }
+    
+  var events = document.getElementsByClassName("vevent");
+  for (var i = 0; i < events.length; i++) {
+    processEvent(events[i]);
+  }
+  
+
+  
+  for (year in globalDateHash) {
+    for (month in globalDateHash[year]) {
+      var mt = makeMonthTable(globalDateHash[year][month], year, month);
+      outputDiv.appendChild(mt);
+    }
+  }
+}
+
+function processEvent(ev) {
+  var kids = ev.getElementsByTagName('*') || ev.all;
+  var eventHash = {};
+  var dateInfo;
+  for (var i = 0; i < kids.length; i++) {
+    var kid = kids[i];
+    if (hasClass(kid, 'summary')) {
+      eventHash.summary = kid.cloneNode(true); // true means a "deep" cloning
+    } else if (hasClass(kid, 'dtstart')) {
+      dateInfo = parseDT(kid);
+    }
+  }
+  if (dateInfo == null) {
+    debug("didn't find dtstart for " + ev);
+    return;
+  }
+  if (globalDateHash[ dateInfo[0] ] == null)
+    globalDateHash[ dateInfo[0] ] = new Object();
+  if (globalDateHash[ dateInfo[0] ][ dateInfo[1] ] == null)
+    globalDateHash[ dateInfo[0] ][ dateInfo[1] ] = new Object();
+  if (globalDateHash[ dateInfo[0] ][ dateInfo[1] ][ dateInfo[2] ] == null)
+    globalDateHash[ dateInfo[0] ][ dateInfo[1] ][ dateInfo[2] ] = new Array();
+    
+  globalDateHash[ dateInfo[0] ][ dateInfo[1] ][ dateInfo[2] ].push(eventHash);
+  return;
+}
+
+function parseDT(dt) {
+  var dtText;
+  if (dt.nodeName == 'ABBR' && dt.title) {
+    dtText = dt.title;
+  } else {
+    dtText = dt.firstChild.data;
+  }
+  var result = dtText.match( /^(\d{4})(\d{2})(\d{2})/ );
+  if (result == null) {
+    debug("didn't recognize DT: " + dtText);
+  }
+  
+  return [result[1], result[2], result[3]];
+}
+
+var monthLength = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
+
+// TODO deal with leap year
+getMonthLength = function(year, month) {
+  return monthLength[month - 1];
+}
+
+function makeMonthTable (monthHash, year, month) {
+  currentMonthLength = getMonthLength(year, month);
+  
+  var today = new Date;
+  var todayYear = today.getFullYear();
+  var todayMonth = today.getMonth() + 1;
+  var todayDay = today.getDate();
+    
+  var days = new Array(currentMonthLength+1); // We are going to index this array starting at 1.  Because I said so.
+  for (var i = 1; i <= currentMonthLength; i++) {
+    days[i] = document.createElement('TD');
+    days[i].className = 'calDay';
+    if (todayYear == year && todayMonth == month && todayDay == i) {
+      days[i].className += ' calDayToday';
+    }
+    var dayLabel = document.createElement('DIV');
+    dayLabel.className = 'calDayLabel';
+    days[i].appendChild(dayLabel);
+    dayLabel.appendChild(document.createTextNode(i));
+  }
+  
+  // populate days here
+
+  for (var day in monthHash) {
+    var dayEvents = monthHash[day];
+    for (var i = 0; i < dayEvents.length; i++) {
+      var eventDiv = document.createElement('DIV');
+      eventDiv.className = 'calEvent';
+      eventDiv.appendChild(dayEvents[i].summary);
+      dayTD = days[day-0];
+      dayTD.appendChild(eventDiv);
+      if (! hasClass(dayTD, 'calEventDay')) {
+        dayTD.className += ' calEventDay';
+      }
+      
+    }
+  }
+    
+  var monthTable = document.createElement('TABLE');
+  monthTable.className = 'calTable';
+  var tbody = monthTable.appendChild(document.createElement("TBODY"));
+  
+  var titleRow = document.createElement('TR');
+  tbody.appendChild(titleRow);
+  var titleTD = document.createElement('TD');
+  titleTD.setAttribute("colspan", 7);
+  titleTD.className = 'calHeader';
+  
+  titleRow.appendChild(titleTD);
+  titleTD.appendChild(document.createTextNode(month + "/" + year));
+  
+  var headerRow = document.createElement('TR');
+  headerRow.className = 'calColumnHeader';
+  tbody.appendChild(headerRow);
+  for (var i = 0; i <= 6; i++) {
+    var headerElement = document.createElement('TD');
+    headerElement.className = 'calColumnHeader';
+    headerElement.appendChild(document.createTextNode(dayNames[(i+firstDayOfWeek) % 7]));
+    headerRow.appendChild(headerElement);
+  }
+
+  var miniHeaderRow = document.createElement('TR');
+  miniHeaderRow.className = 'calAbbrevColumnHeader';
+  tbody.appendChild(miniHeaderRow);
+  for (var i = 0; i <= 6; i++) {
+    var headerElement = document.createElement('TD');
+    headerElement.className = 'calAbbrevColumnHeader';
+    headerElement.appendChild(document.createTextNode(dayAbbrevs[(i+firstDayOfWeek) % 7]));
+    miniHeaderRow.appendChild(headerElement);
+  }
+  
+  var dateToCheck = new Date();
+  dateToCheck.setYear(year);
+  dateToCheck.setMonth(month-1);
+  dateToCheck.setDate(1);
+  var dayOfFirstOfMonth = dateToCheck.getDay();
+
+  var row = tbody.appendChild(document.createElement("TR"));
+  // We add 14 (could have gotten away with 7) so that we don't get (-3) % 7 == -3
+  for (var i = 0; i < (dayOfFirstOfMonth - firstDayOfWeek + 14) % 7; i++) {
+    var emptyDay = document.createElement('TD');
+    emptyDay.className = 'calDay calEmptyDay';
+    row.appendChild(emptyDay);
+  }
+  
+  for (var i = 1; i <= currentMonthLength; i++) {
+    if (row.childNodes.length == 7) {
+      row = tbody.appendChild(document.createElement("TR"));
+    }
+    row.appendChild(days[i]);
+  }
+  
+  while (row.childNodes.length < 7) {
+      var emptyDay = document.createElement('TD');
+      emptyDay.className = 'calDay calEmptyDay';
+      row.appendChild(emptyDay);
+  }
+  
+  return monthTable;
+}
+
+
+
+addLoadEvent(findHCalendarEvents);

Added: apps/Skedjul/share/web/templates/_elements/accept_invites
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/_elements/accept_invites	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,20 @@
+<% Jifty->web->form->start %>
+<h2>Unconfirmed invitations</h2>
+<dl>
+% while (my $event = $invites->next()) {
+% my $accept  = Jifty->web->new_action( class => 'AcceptInvitation', arguments => { id => $event->id } );
+% my $decline = Jifty->web->form->add_action( class => 'DeclineInvitation', arguments => { id => $event->id } );
+<% $accept->form_field("id") %><% $decline->form_field("id") %>
+<dt><%$event->starts %> - <%$event->ends%></dt>
+<dd><% Jifty->web->link( label =>$event->title, url => '/event/'.$event->id)  %>
+[ <% Jifty->web->link( label => "Accept",  submit => $accept ) %>
+| <% Jifty->web->link( label => "Decline", submit => $decline ) %> ]
+</dd>
+% }
+</dl>
+<% Jifty->web->form->end %>
+<%init>
+my $invites = Skedjul::Model::EventCollection->new();
+$invites->unconfirmed(Jifty->web->current_user);
+return unless $invites->count;
+</%init>

Added: apps/Skedjul/share/web/templates/_elements/braindump_events
==============================================================================

Added: apps/Skedjul/share/web/templates/_elements/javascript
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/_elements/javascript	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,10 @@
+  <script type="text/javascript" src="/js/json.js"></script>
+  <script type="text/javascript" src="/js/prototype.js"></script>
+  <script type="text/javascript" src="/js/behaviour.js"></script>
+  <script type="text/javascript" src="/js/scriptaculous/scriptaculous.js"></script>
+  <script type="text/javascript" src="/js/jifty.js"></script>
+  <script type="text/javascript" src="/js/combobox.js"></script>
+  <script type="text/javascript" src="/js/key_bindings.js"></script>
+  <script type="text/javascript" src="/js/bps_util.js"></script>
+  <script type="text/javascript" src="/js/rico.js"></script>
+  <script type="text/javascript" src="/js/app_behaviour.js"></script>

Added: apps/Skedjul/share/web/templates/_elements/nav
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/_elements/nav	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,13 @@
+<%init>
+my $top = Jifty->web->navigation;
+$top->child(Home         => url => "/" );
+$top->child(Today        => url => "/calendar/day" );
+$top->child("This week"  => url => "/calendar/week" );
+$top->child("This month" => url => "/calendar/month" );
+
+$top->child("My invites" => url => "/invites" );
+$top->child("Search"     => url => "/events" );
+$top->child("People"     => url => "/people" );
+
+$top->child("About"      => url => "/about" );
+</%init>
\ No newline at end of file

Added: apps/Skedjul/share/web/templates/_elements/new_event
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/_elements/new_event	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,10 @@
+<%init>
+my $action = Jifty->web->new_action( class =>'CreateEvent', moniker => 'create_task');
+</%init>
+<h2>Who? What? When? Where? New event!</h2>
+% Jifty->web->form->start;
+% foreach my $arg ($action->argument_names) { 
+<%$action->form_field($arg)%>
+%}
+<%Jifty->web->form->submit(label =>'Create')%>
+% Jifty->web->form->end;

Added: apps/Skedjul/share/web/templates/_elements/this_week
==============================================================================

Added: apps/Skedjul/share/web/templates/_elements/today
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/_elements/today	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,2 @@
+<% Jifty->web->region( name => 'today', path => '/fragments/calendar/day') %>
+

Added: apps/Skedjul/share/web/templates/calendar/day
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/calendar/day	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,3 @@
+<&|/_elements/wrapper, title => "Daily calendar"&>
+<% Jifty->web->region( name => 'day_calendar', path => '/fragments/calendar/day') %>
+</&>

Added: apps/Skedjul/share/web/templates/calendar/list
==============================================================================

Added: apps/Skedjul/share/web/templates/calendar/month
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/calendar/month	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,29 @@
+<%args>
+$year => undef
+$month => undef
+</%args>
+<%init>
+my $events = Skedjul::Model::EventCollection->new();
+my $start_date = DateTime->new( year => $year,
+                                month => $month,
+                                day => 1
+                              );
+
+my $end_date = $start_date->clone;
+$end_date->add(months => 1);
+$end_date->subtract(seconds => 1);
+
+
+
+$events->attendee(Jifty->web->current_user);
+$events->between( $start_date->ymd." ".$start_date->hms => $end_date->ymd." ". $end_date->hms);
+</%init>
+<&|/_elements/wrapper, title => "Monthly calendar" &>
+% while (my $event = $events->next) {
+<div class="vevent">
+    <span class="summary"><%$event->title%></span>
+    <abbr class="dtstart" title="<%$event->starts->ymd('')%>"><%$event->starts%></abbr>
+</div>
+% }
+<div id="jhCalendar"/>
+</&>

Added: apps/Skedjul/share/web/templates/calendar/two_weeks
==============================================================================

Added: apps/Skedjul/share/web/templates/calendar/week
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/calendar/week	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,46 @@
+<&|/_elements/wrapper, title => "Weekly calendar"&>
+
+<%perl>
+for my $week (0..1) {
+for my $day (0..6) {
+  my $today = $starts->clone->add( days => $week*7 + $day );
+  my $tomorrow = $today->clone->add( days => 1 );
+
+
+  my $events = Skedjul::Model::EventCollection->new();
+  $events->between($today => $tomorrow);
+  $events->attendee(Jifty->web->current_user);
+</%perl>
+<div style="width: 12%; border: 1px solid black; float: left">
+<b><% $today->day_name %>, <% $today->month_name %> <% $today->day_of_month %></b>
+<dl>
+%   while (my $e = $events->next) {
+<dt>
+%     if ($e->starts < $today) {
+        (cont'd)
+%     } else {
+        <% $e->starts->strftime("%H:%M") %>
+%     }
+      -
+%     if ($e->ends > $tomorrow) {
+        (cont'd)
+%     } else {
+        <% $e->ends->day == $today->day ? $e->ends->strftime("%H:%M") : "midnight" %>
+%     }
+</dt><dd><% Jifty->web->tangent( label => $e->title, url => "/event/".$e->id ) %></dd>
+%   }
+</dl>
+<% Jifty->web->tangent( label => "Add an event", url => "/event/create", parameters => {day => $today->ymd}) %>
+</div>
+% }
+<br style="clear: left" />
+% }
+
+</&>
+<%args>
+$starts => undef
+</%args>
+<%init>
+$starts = $starts ? DateTime::Format::ISO8601->parse_datetime($starts) : DateTime->now;
+$starts->truncate( to => "week" );
+</%init>
\ No newline at end of file

Added: apps/Skedjul/share/web/templates/create_event
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/create_event	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,15 @@
+<%args>
+$action
+$day => undef
+</%args>
+<%init>
+$action->form_field($_)->default_value($day) for qw/starts ends/;
+</%init>
+<&|/_elements/wrapper, title => "New event" &>
+% Jifty->web->form->start;
+% foreach my $arg ($action->argument_names) { 
+<%$action->form_field($arg)%>
+%}
+<%Jifty->web->return(submit => $action, label =>'Create')%>
+% Jifty->web->form->end;
+</&>

Added: apps/Skedjul/share/web/templates/event
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/event	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,14 @@
+<%args>
+$action
+$event
+</%args>
+<%init>
+</%init>
+<&|/_elements/wrapper, title => $event->title &>
+% Jifty->web->form->start;
+% foreach my $arg ($action->argument_names) { 
+<%$action->form_field($arg)%>
+%}
+<%Jifty->web->return(submit => $action, label =>'Save changes')%>
+% Jifty->web->form->end;
+</&>

Added: apps/Skedjul/share/web/templates/fragments/calendar/day
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/fragments/calendar/day	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,24 @@
+<% Jifty->web->form->start %>
+<h1>What's on tap for <%$datetime%></h1>
+<dl>
+% while (my $e = $events->next) {
+<dt><% $e->starts%> - <%$e->ends%></dt>
+<dd><% Jifty->web->link( label => $e->title || "Untitled event", url => "/event/".$e->id) %></dd>
+% }
+</dl>
+  <% Jifty->web->link( label => "Previous day", onclick => { args => { date => $datetime->clone->subtract(days=>1)."" }})%>
+  <% Jifty->web->link( label => "Next day", onclick => { args => { date => $datetime->clone->add(days=>1)."" }})%>
+<% Jifty->web->form->end %>
+</div>
+<%args>
+$date => undef
+</%args>
+<%init>
+
+$date ||= DateTime->now;
+my $datetime = DateTime::Format::ISO8601->parse_datetime($date);
+my $events = Skedjul::Model::EventCollection->new();
+$events->attendee(Jifty->web->current_user);
+$events->between($datetime => $datetime->clone->add(days=>1));
+</%init>
+

Added: apps/Skedjul/share/web/templates/home
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/home	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,7 @@
+<&| /_elements/wrapper, title => 'Skedjul for Best Practical'&>
+<& /_elements/accept_invites &>
+<& /_elements/braindump_events &>
+<& /_elements/today &>
+<& /_elements/this_week &>
+<& /_elements/new_event &>
+</&>

Added: apps/Skedjul/share/web/templates/login
==============================================================================
--- (empty file)
+++ apps/Skedjul/share/web/templates/login	Wed Oct  3 12:15:54 2007
@@ -0,0 +1,34 @@
+<&| /_elements/wrapper, title => "Welcome!" &>
+<h2>What is this thing?</h2>
+
+<div id="overview">
+<p>We're still in a "friends and family" preview phase. Not everything here works like we want it to. Some of it because it's not done yet, some of it because we broke it while making other stuff work right.</p>
+<p><b>These are not the droids you're looking for.</b> 
+%# But they will help you keep track of everything you're working on, either alone or with a team.  Sign up, log in, and start getting crossing things off your list.
+</p></div>
+
+<h2>Getting started</h2>
+<div id="signup">
+<p>Welcome to Best Practical's private calendaring server. It's basic</p>
+%#<p>It only takes a few clicks to set up a free account. Until we're in beta, <i>everything</i> is free. <%Jifty->web->link( url => "/welcome/signup", label => "Join us now.")%></p>
+</div>
+<div id="login-box">
+<h2>Login</h2>
+<% Jifty->web->form->start(call => $next, name => "loginbox") %>
+<% $action->form_field('email') %>
+<% $action->form_field('password') %>
+<% $action->form_field('remember') %>
+<% Jifty->web->form->submit(label => 'Login', submit => $action) %>
+<% Jifty->web->form->end %>
+</div>
+%#<p><%Jifty->web->link( url => "/welcome/lostpass.html", label =>"Forgot your password?")%></p>
+
+</&>
+<%init> 
+$m->redirect('/home') if Jifty->web->current_user->id;
+
+my $action = Jifty->web->new_action(class => 'Login', moniker => 'loginbox' );
+
+my $next = Jifty->web->request->continuation
+  || Jifty::Continuation->new(request => Jifty::Request->new(path => "/home"));
+</%init>


More information about the Jifty-commit mailing list