Index: openacs-4/packages/calendar/www/view-week-display.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/calendar/www/view-week-display.tcl,v diff -u -r1.18 -r1.18.2.1 --- openacs-4/packages/calendar/www/view-week-display.tcl 16 Aug 2006 17:52:14 -0000 1.18 +++ openacs-4/packages/calendar/www/view-week-display.tcl 9 Feb 2007 16:07:38 -0000 1.18.2.1 @@ -1,3 +1,29 @@ +#Expects: +# date (required but empty string okay): YYYY-MM-DD +# show_calendar_name_p (optional): 0 or 1 +# url_stub_callback (optional): + +#Display constants, should match up with default styles in calendar.css. +set day_width 70 +set width_units px +set hour_height_inside 43 +set hour_height_sep 3 +set hour_height_units px +set event_bump_delta 10 + +set time_of_day_width 70 +set event_left_base 0 +set day_left_base 0 +set previous_intervals [list] + +set adjusted_start_display_hour 9 +set adjusted_end_display_hour 21 + +for {set i 0} {$i < 10} {incr i} { + #defaults + set day_width_$i $day_width +} + if {[info exists url_stub_callback]} { # This parameter is only set if this file is called from .LRN. # This way I make sure that for the time being this adp/tcl @@ -7,16 +33,15 @@ set portlet_mode_p 0 } +set current_date $date + if {[info exists portlet_mode_p] && $portlet_mode_p} { - if {![info exists return_url]} { - set return_url [ad_urlencode "../"] - } - set item_template "\${url_stub}cal-item-view?show_cal_nav=0&return_url=${return_url}&action=edit&cal_item_id=\$item_id" + set event_url_template "\${url_stub}cal-item-view?show_cal_nav=0&return_url=[ad_urlencode "../"]&action=edit&cal_item_id=\$item_id" set url_stub_callback "calendar_portlet_display::get_url_stub" set page_num_formvar [export_form_vars page_num] set page_num_urlvar "&page_num=$page_num" } else { - set item_template "cal-item-view?cal_item_id=\$item_id" + set event_url_template "cal-item-view?cal_item_id=\$item_id" set url_stub_callback "" set page_num_formvar "" set page_num_urlvar "" @@ -61,7 +86,9 @@ multirow create items \ event_name \ event_url \ + description \ calendar_name \ + weekday \ status_summary \ start_date \ day_of_week \ @@ -70,7 +97,11 @@ end_time \ no_time_p \ add_url \ - day_url + day_url \ + style_class \ + top \ + height \ + left # Convert date from user timezone to system timezone set first_weekday_of_the_week_tz [lc_time_conn_to_system "$first_weekday_of_the_week 00:00:00"] @@ -80,7 +111,14 @@ set interval_limitation_clause [db_map dbqd.calendar.www.views.week_interval_limitation] set additional_limitations_clause "" set additional_select_clause " , (to_date(start_date,'YYYY-MM-DD HH24:MI:SS') - to_date(:first_weekday_of_the_week_tz, 'YYYY-MM-DD HH24:MI:SS')) as day_of_week" +if { [exists_and_not_null cal_system_type] } { + append additional_limitations_clause " and system_type = :cal_system_type " +} +set loop_day_of_week 0 +set max_bumps 0 +set all_day_events 0 + db_foreach dbqd.calendar.www.views.select_items {} { # Convert from system timezone to user timezone set ansi_start_date [lc_time_system_to_conn $ansi_start_date] @@ -94,24 +132,6 @@ set start_time [lc_time_fmt $ansi_start_date "%X"] set end_time [lc_time_fmt $ansi_end_date "%X"] - # need to add dummy entries to show all days - for { } { $current_weekday < $day_of_week } { incr current_weekday } { - set ansi_this_date [dt_julian_to_ansi [expr $first_weekday_julian + $current_weekday]] - multirow append items \ - "" \ - "" \ - "" \ - "" \ - [lc_time_fmt $ansi_this_date "%x"] \ - $current_weekday \ - [lc_time_fmt $ansi_this_date %A] \ - "" \ - "" \ - "" \ - "${base_url}cal-item-new?date=${ansi_this_date}&start_time=&end_time=&return_url=$return_url" \ - "?view=day&date=$ansi_this_date&page_num_urlvar" - } - set ansi_this_date [dt_julian_to_ansi [expr $first_weekday_julian + $current_weekday]] if {[string equal $start_time "12:00 AM"] && [string equal $end_time "12:00 AM"]} { set no_time_p t @@ -129,10 +149,108 @@ set url_stub $url_stubs($calendar_id) } + if { $day_of_week != $loop_day_of_week } { + set day_width_$loop_day_of_week [expr ($day_width) + (($max_bumps+$all_day_events) * $event_bump_delta) + 5] + set event_left_base 0 + for {set i 0} {$i < $day_of_week} {incr i} { + incr event_left_base [set day_width_$i] + } + set loop_day_of_week $day_of_week + set all_day_events 0 + set max_bumps 0 + set previous_intervals [list] + } + + if {[string equal $no_time_p t]} { + #All day event + set top_hour 0 + set top_minutes 0 + set bottom_hour 24 + set bottom_minutes 0 + } else { + + set top_hour $start_hour + set top_minutes $start_minutes + set bottom_hour $end_hour + set bottom_minutes $end_minutes + + if { $start_hour < $adjusted_start_display_hour && \ + [string equal \ + [string range $ansi_start_date 0 9] \ + [string range $ansi_end_date 0 9]] } { + set adjusted_start_display_hour $start_hour + } + + if { $end_hour > $adjusted_end_display_hour && \ + [string equal \ + [string range $ansi_start_date 0 9] \ + [string range $ansi_end_date 0 9]] } { + set adjusted_end_display_hour $end_hour + } + + +# if { $start_hour < 9 } { +# set top_hour 9 +# set top_minutes 0 +# } elseif { $start_hour > 21 } { +# set top_hour 22 +# set top_minutes 0 +# } else { +# set top_hour $start_hour +# set top_minutes $start_minutes +# } + +# if { $end_hour < 9 } { +# set bottom_hour 9 +# set bottom_minutes 0 +# } elseif { $end_hour > 21 } { +# set bottom_hour 22 +# set bottom_minutes 0 +# } else { +# set bottom_hour $end_hour +# set bottom_minutes $end_minutes +# } + + } + + set top [expr ($top_hour * ($hour_height_inside+$hour_height_sep)) \ + + ($top_minutes*$hour_height_inside/60)] + set bottom [expr ($bottom_hour * ($hour_height_inside+$hour_height_sep)) \ + + ($bottom_minutes*$hour_height_inside/60)] + set height [expr $bottom - $top - 3] + + set left $event_left_base + + set start_seconds [clock scan $ansi_start_date] + set end_seconds [clock scan $ansi_end_date] + + #Assumption: for any given day we will loop through all-day events + #before looping through regular events. + set bumps 0 + if {$start_hour == 0 && $start_minutes == 0 && $end_hour == 0 && $end_minutes == 0} { + #All-day event. + incr event_left_base $event_bump_delta + incr all_day_events + } else { + #Regular event. + foreach {previous_start previous_end} $previous_intervals { + if { ($start_seconds >= $previous_start && $start_seconds < $previous_end) || ($previous_start >= $start_seconds && $previous_start < $end_seconds) } { + incr bumps + } + } + if { $bumps > $max_bumps } { + set max_bumps $bumps + } + } + incr top [expr $bumps*5] + incr left [expr $bumps*$event_bump_delta] + multirow append items \ - $name \ - [subst $item_template] \ + "$name" \ + [subst $event_url_template] \ + $description \ $calendar_name \ + $start_date_weekday \ $status_summary \ $start_date \ $day_of_week \ @@ -141,27 +259,33 @@ $end_time \ $no_time_p \ "?view=day&date=$ansi_start_date&page_num_urlvar" \ - "${base_url}cal-item-new?date=${ansi_this_date}&start_time=&end_time=&return_url=$return_url" + "${base_url}cal-item-new?date=${ansi_this_date}&start_time=&end_time=" \ + "calendar-Item" \ + $top \ + $height \ + $left + set current_weekday $day_of_week + + lappend previous_intervals $start_seconds $end_seconds + } -if {$current_weekday < 7} { - # need to add dummy entries to show all hours - for { } { $current_weekday < 7 } { incr current_weekday } { - set ansi_this_date [dt_julian_to_ansi [expr $first_weekday_julian + $current_weekday]] - multirow append items \ - "" \ - "" \ - "" \ - "" \ - [lc_time_fmt $ansi_this_date "%x"] \ - $current_weekday \ - [lc_time_fmt $ansi_this_date %A] \ - "" \ - "" \ - "" \ - "${base_url}cal-item-new?date=${ansi_this_date}&start_time=&end_time=&return_url=$return_url" \ - "?view=day&date=$ansi_this_date&page_num_urlvar" +# Set day width for the final iteration of the loop +set day_width_$loop_day_of_week [expr ($day_width) + (($max_bumps+$all_day_events) * $event_bump_delta) + 5] + +#Now correct the top attribute for the adjusted start. +if { $adjusted_start_display_hour != 0 } { + set num_items [multirow size items] + for {set i 1} {$i <= $num_items } {incr i} { + if { [multirow get items $i no_time_p] } { + multirow set items $i height \ + [expr ($adjusted_end_display_hour-$adjusted_start_display_hour+1)*($hour_height_inside+$hour_height_sep)] + } else { + set currval [multirow get items $i top] + multirow set items $i top \ + [expr $currval - ($adjusted_start_display_hour*($hour_height_inside+$hour_height_sep))] + } } } @@ -175,3 +299,52 @@ set next_week_url "?view=week&date=[ad_urlencode [dt_julian_to_ansi [expr $first_weekday_julian + 7]]]" } +#Calendar grid. +set grid_start $adjusted_start_display_hour +set grid_first_hour [lc_time_fmt "$current_date $grid_start:00:00" "%X"] +set grid_hour $grid_start +set grid_first_date "x" +incr grid_start + +multirow create grid hour +for { set grid_hour $grid_start } { $grid_hour <= $adjusted_end_display_hour } { incr grid_hour } { + set localized_grid_hour [lc_time_fmt "$current_date $grid_hour:00:00" "%X"] + multirow append grid $localized_grid_hour +} +set week_start_month [lc_time_fmt $first_weekday_date "%B"] +set week_start_day [lc_time_fmt $first_weekday_date "%d"] +set week_start_year [lc_time_fmt $first_weekday_date "%Y"] +set week_end_month [lc_time_fmt $last_weekday_date "%B"] +set week_end_day [lc_time_fmt $last_weekday_date "%d"] +set week_end_year [lc_time_fmt $last_weekday_date "%Y"] + +set week_days [lc_get abday] +set first_weekday_date_secs [clock scan "-24 hours" -base [clock scan "1 day" -base [clock scan $first_weekday_date]]] +set next_week [clock format [expr $first_weekday_date_secs + (7*86400)] -format "%Y-%m-%d"] +set last_week [clock format [expr $first_weekday_date_secs - (7*86400)] -format "%Y-%m-%d"] + +multirow create days_of_week width day_short monthday weekday_date +for {set i 0} {$i < 7} {incr i} { + set weekday_secs [expr $first_weekday_date_secs + ($i*86400)] + set trimmed_month \ + [string trimleft [clock format $weekday_secs -format "%m"] 0] + set trimmed_day \ + [string trimleft [clock format $weekday_secs -format "%d"] 0] + set weekday_date [clock format $weekday_secs -format "%Y-%m-%d"] + #TODO: localize_me + set weekday_monthday "$trimmed_month/$trimmed_day" + multirow append days_of_week [set day_width_$i] [lindex $week_days [expr [expr $i + $first_day_of_week] % 7]] $weekday_monthday $weekday_date +} + +set week_width $time_of_day_width +for {set i 0} {$i < 7} {incr i} { + incr week_width [set day_width_$i] +} + +set nav_url_base [ad_conn url]?[export_vars -url -entire_form -exclude {date view}] + +if { [info exists export] && [string equal $export print] } { + set print_html [template::adp_parse [acs_root_dir]/packages/calendar/www/view-print-display [list &items items show_calendar_name_p $show_calendar_name_p]] + ns_return 200 text/html $print_html + ad_script_abort +}