ad_page_contract {
Creating a new Calendar Item
@author Dirk Gomez (openacs@dirkgomez.de)
@author Ben Adida (ben@openforce.net)
@creation-date May 29, 2002
@cvs-id $Id: cal-item-new.tcl,v 1.41 2018/04/30 13:54:38 gustafn Exp $
} {
{calendar_id:naturalnum ""}
cal_item_id:naturalnum,optional
item_type_id:naturalnum,optional
{date ""}
{julian_date ""}
{start_time ""}
{end_time ""}
{view "day"}
{return_url:localurl "./"}
}
auth::require_login
set package_id [ad_conn package_id]
set user_id [ad_conn user_id]
if {![info exists item_type_id]} {
set item_type_id ""
}
set date [calendar::adjust_date -date $date -julian_date $julian_date]
set ansi_date $date
set calendar_list [calendar::calendar_list]
set calendar_options [calendar::calendar_list -privilege create]
# Header stuff
template::add_body_handler -event "load" -script "TimePChanged();"
template::head::add_css -href "/resources/calendar/calendar.css" -media all
template::head::add_css -alternate -href "/resources/calendar/calendar-hc.css" -title "highContrast"
# TODO: Move into ad_form
if { ![ad_form_new_p -key cal_item_id] } {
set calendar_id [db_string get_calendar_id {
select on_which_calendar as calendar_id
from cal_items
where cal_item_id = :cal_item_id
} -default ""]
} else {
set calendar_id [lindex $calendar_options 0 1]
}
# TODO: Move into ad_form
if { [info exists cal_item_id] && $cal_item_id ne "" } {
set page_title [_ calendar.Calendar_Edit_Item]
set ad_form_mode display
} else {
set page_title [_ calendar.Calendar_Add_Item]
set ad_form_mode edit
}
ad_form -name cal_item -export { return_url } -form {
{cal_item_id:key}
{title:text(text)
{label "[_ calendar.Title_1]"}
{html {size 45 maxlength 255}}
}
{date:date
{label "[_ calendar.Date_1]"}
{format "YYYY MM DD"}
{after_html { \[[_ calendar.y-m-d]\]} }
}
{time_p:text(radio)
{label " "}
{options {{"[_ calendar.All_Day_Event]" 0}
{"[_ calendar.Use_Hours_Below]" 1} }}
}
{start_time:date,optional
{label "[_ calendar.Start_Time]"}
{format {[lc_get formbuilder_time_format]}}
}
{end_time:date,optional
{label "[_ calendar.End_Time]"}
{format {[lc_get formbuilder_time_format]}}
}
{location:text(text),optional
{label "[_ calendar.Location]"}
{html {size 44 maxlength 255}}
}
{description:text(textarea),optional
{label "[_ calendar.Description]"}
{html {cols 45 rows 10}}
}
{related_link_url:text(text),optional
{label "[_ calendar.RelatedLink]"}
{html {size 45 maxlength 255}}
}
{related_link_text:text(hidden),optional
}
{redirect_to_rel_link_p:text(hidden),optional
}
{calendar_id:integer(radio)
{label "[_ calendar.Sharing]"}
{options $calendar_options}
}
}
template::add_body_script -script {
function TimePChanged(elm) {
var form_name = "cal_item";
if (elm == null) return;
if (document.forms == null) return;
if (document.forms[form_name] == null) return;
if (elm.value == 0) {
disableTime(form_name);
} else {
enableTime(form_name);
}
}
}
if { [ad_form_new_p -key cal_item_id] } {
ad_form -extend -name cal_item -form {
{repeat_p:text(radio)
{label "[_ calendar.Repeat_1]"}
{options {{"[_ calendar.Yes]" 1}
{"[_ calendar.No]" 0} }}
}
}
} else {
ad_form -extend -name cal_item -form {
{edit_what:text(radio)
{label "[_ calendar.Apply_Changes_to]"}
{options {{"[_ calendar.This_Event]" this}
{"[_ calendar.All_Past_and_Future_Events]" all}
{"[_ calendar.This_and_All_Future_Events]" future}}}
}
}
}
#----------------------------------------------------------------------
# LARS: Hack to make enable/disable time widgets work with i18n
#----------------------------------------------------------------------
set format_string [lc_get formbuilder_time_format]
multirow create time_format_elms name
while { $format_string ne "" } {
# Snip off the next token
regexp {([^/\-.: ]*)([/\-.: ]*)(.*)} \
$format_string match word sep format_string
# Extract the trailing "t", if any
regexp -nocase $template::util::date::token_exp $word \
match token type
# Output the widget
set fragment_def $template::util::date::fragment_widgets([string toupper $token])
multirow append time_format_elms [lindex $fragment_def 1]
}
#----------------------------------------------------------------------
# Finishing definition of form
#----------------------------------------------------------------------
set cal_item_types [calendar::get_item_types -calendar_id $calendar_id]
if {[llength $cal_item_types] > 1} {
ad_form -extend -name cal_item -form {
{item_type_id:integer(select),optional
{label "[_ calendar.Type_1]"}
{options {$cal_item_types} }
{help_text "[_ calendar.Type_Help]"}
}
}
}
ad_form -extend -name cal_item -validate {
{title {[string length $title] <= 4000}
"Title is too long"
}
{description {[string equal [set msg [ad_html_security_check $description]] ""]}
$msg
}
} -new_request {
# Seamlessly create a private calendar if the user doesn't have one
if { ![calendar::have_private_p -party_id $user_id] } {
set calendar_id [calendar::new \
-owner_id $user_id \
-private_p "t" \
-calendar_name "Personal" \
-package_id $package_id]
}
set date [calendar::from_sql_datetime -sql_date $ansi_date -format "YYY-MM-DD"]
set repeat_p 0
if {[info exists start_time] && $start_time ne "" && $start_time != 0} {
# Set the start time
set start_hour $start_time
set start_time "{} {} {} $start_time 0 {} {HH24:MI}"
set end_time "{} {} {} [expr {$start_hour + 1}] 0 {} {HH24:MI}"
set time_p 1
} else {
set time_p 0
set start_hour $start_time
set start_time "{} {} {} 0 0 {} {HH24:MI}"
set end_time "{} {} {} 0 0 {} {HH24:MI}"
set js "disableTime('cal_item');"
}
# set the calendar_id before setting item_types form element (see top of script) DAVEB
set calendar_id [lindex $calendar_options 0 1]
} -edit_request {
calendar::item::get -cal_item_id $cal_item_id -array cal_item
permission::require_write_permission -object_id $cal_item_id -creation_user $cal_item(creation_user)
set cal_item_id $cal_item(cal_item_id)
set n_attachments $cal_item(n_attachments)
set ansi_start_date $cal_item(start_date_ansi)
set ansi_end_date $cal_item(end_date_ansi)
set start_time $cal_item(start_time)
set end_time $cal_item(end_time)
set title $cal_item(name)
set description $cal_item(description)
set location $cal_item(location)
set related_link_url $cal_item(related_link_url)
set related_link_text $cal_item(related_link_text)
set redirect_to_rel_link_p $cal_item(redirect_to_rel_link_p)
set repeat_p $cal_item(recurrence_id)
set item_type $cal_item(item_type)
set item_type_id $cal_item(item_type_id)
set calendar_id $cal_item(calendar_id)
set time_p $cal_item(time_p)
if { $time_p == 0 } {
set js "disableTime('cal_item');"
} else {
set js "enableTime('cal_item');"
}
if { $repeat_p eq "" } {
set repeat_p 0
} else {
set repeat_p 1
}
# Make the user explicitly choose edit all or not
# this is a usability issue, since it prevents unexpected
# behavior. According to carlb, this is how palm os works
# and that sounds like a reasonable interface to emulate
# set edit_what $repeat_p
if { !$repeat_p } {
element set_properties cal_item edit_what -widget hidden
element set_value cal_item edit_what 0
}
set date [calendar::from_sql_datetime -sql_date $ansi_start_date -format "YYY-MM-DD"]
set start_time [template::util::date::from_ansi $ansi_start_date [lc_get formbuilder_time_format]]
set end_time [template::util::date::from_ansi $ansi_end_date [lc_get formbuilder_time_format]]
} -new_data {
set formatted_date ""
append formatted_date \
[template::util::date::get_property year $date] " " \
[template::util::date::get_property month $date] " " \
[template::util::date::get_property day $date]
set date $formatted_date
set start_date [calendar::to_sql_datetime -date $date -time $start_time -time_p $time_p]
set end_date [calendar::to_sql_datetime -date $date -time $end_time -time_p $time_p]
if { ![calendar::personal_p -calendar_id $calendar_id] } {
permission::require_permission -object_id $calendar_id -privilege create
}
set cal_item_id [calendar::item::new \
-start_date $start_date \
-end_date $end_date \
-name $title \
-description $description \
-location $location \
-related_link_url $related_link_url \
-related_link_text $related_link_text \
-redirect_to_rel_link_p $redirect_to_rel_link_p \
-calendar_id $calendar_id \
-item_type_id $item_type_id]
if {$repeat_p} {
ad_returnredirect [export_vars -base cal-item-create-recurrence { return_url cal_item_id}]
} else {
if {$return_url ne "./" } {
ad_returnredirect $return_url
} else {
ad_returnredirect [export_vars -base cal-item-view { cal_item_id }]
}
}
ad_script_abort
} -edit_data {
#
# Format date
#
set formatted_date ""
append formatted_date \
[template::util::date::get_property year $date] " " \
[template::util::date::get_property month $date] " " \
[template::util::date::get_property day $date]
set date $formatted_date
# Require write permission on the item and create on the calendar into which we're putting it
permission::require_write_permission -object_id $cal_item_id
if { ![calendar::personal_p -calendar_id $calendar_id] } {
permission::require_permission -object_id $calendar_id -privilege create
}
# set up the datetimes
set start_date [calendar::to_sql_datetime -date $date -time $start_time -time_p $time_p]
set end_date [calendar::to_sql_datetime -date $date -time $end_time -time_p $time_p]
set edit_all_p 0
set edit_past_events_p 0
if {[info exists edit_what]} {
switch $edit_what {
this {
set edit_all_p 0
set edit_past_events_p 0
}
all {
set edit_all_p 1
set edit_past_events_p 1
}
future {
set edit_all_p 1
set edit_past_events_p 0
}
}
}
# Do the edit
calendar::item::edit \
-cal_item_id $cal_item_id \
-start_date $start_date \
-end_date $end_date \
-name $title \
-description $description \
-location $location \
-related_link_url $related_link_url \
-related_link_text $related_link_text \
-redirect_to_rel_link_p $redirect_to_rel_link_p \
-item_type_id $item_type_id \
-edit_all_p $edit_all_p \
-edit_past_events_p $edit_past_events_p \
-calendar_id $calendar_id
if {$return_url ne "./" } {
ad_returnredirect $return_url
} else {
ad_returnredirect [export_vars -base cal-item-view { cal_item_id }]
}
ad_script_abort
} -on_request {
template::add_event_listener -id cal_item:elements:time_p:0 -script {TimePChanged(this);}
template::add_event_listener -id cal_item:elements:time_p:1 -script {TimePChanged(this);}
template::add_event_listener -id cal_item.date-button -script {showCalendarWithDateWidget('date', 'y-m-d');}
template::add_body_script -script {
if (document.forms["cal_item"].time_p[0].checked == true ) {
// All day event
disableTime("cal_item");
} else {
enableTime("cal_item");
}
}
}
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End: