diff --git a/ChangeLog b/ChangeLog index b26e7d206..27ab6fd09 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2011-06-13 Francis Lachapelle + + * UI/WebServerResources/SOGoTimePicker.js: new interface to add a + time picker widget to an input field. + + * UI/Scheduler/UIxTimeDateControl.m: replaced hours and minutes + popup menu by one input field. + + * UI/WebServerResources/UIxAppointmentEditor.js: idem. + + * UI/WebServerResources/UIxTaskEditor.js: idem. + + * UI/Scheduler/UIxAppointmentEditor.m (-newStartDate): round + minutes to the nearest 15-minute. + + * UI/Scheduler/UIxTaskEditor.m (-newStartDate): idem. + 2011-06-08 Francis Lachapelle * UI/WebServerResources/MailerUI.js (initMailer): added the Thread diff --git a/UI/Scheduler/UIxAppointmentEditor.m b/UI/Scheduler/UIxAppointmentEditor.m index 5d07ecd6f..9a466803e 100644 --- a/UI/Scheduler/UIxAppointmentEditor.m +++ b/UI/Scheduler/UIxAppointmentEditor.m @@ -210,7 +210,7 @@ NSCalendarDate *newStartDate, *now; NSTimeZone *timeZone; SOGoUserDefaults *ud; - int hour; + int hour, minute; unsigned int uStart, uEnd; newStartDate = [self selectedDate]; @@ -226,12 +226,15 @@ { uEnd = [ud dayEndHour]; hour = [now hourOfDay]; + minute = [now minuteOfHour]; + if (minute % 15) + minute += 15 - (minute % 15); if (hour < uStart) newStartDate = [now hour: uStart minute: 0]; else if (hour > uEnd) newStartDate = [[now tomorrow] hour: uStart minute: 0]; else - newStartDate = now; + newStartDate = [now hour: [now hourOfDay] minute: minute]; } else newStartDate = [newStartDate hour: uStart minute: 0]; diff --git a/UI/Scheduler/UIxCalListingActions.m b/UI/Scheduler/UIxCalListingActions.m index cbe79cf3b..2e32bf7a6 100644 --- a/UI/Scheduler/UIxCalListingActions.m +++ b/UI/Scheduler/UIxCalListingActions.m @@ -280,6 +280,7 @@ static NSArray *tasksFields = nil; ... */ + //NSLog(@"***[UIxCalListingActions _fixDates:] %@", [theRecord objectForKey: @"c_title"]); if (dayBasedView || [[theRecord objectForKey: @"c_isallday"] boolValue]) { for (count = 0; count < 2; count++) @@ -288,6 +289,7 @@ static NSArray *tasksFields = nil; aDate = [theRecord objectForKey: aDateField]; daylightOffset = (int) ([userTimeZone secondsFromGMTForDate: aDate] - [userTimeZone secondsFromGMTForDate: startDate]); + //NSLog(@"***[UIxCalListingActions _fixDates:] %@ = %@ (%i)", aDateField, aDate, daylightOffset); if (daylightOffset) { aDate = [aDate dateByAddingYears: 0 months: 0 days: 0 hours: 0 @@ -413,6 +415,7 @@ static NSArray *tasksFields = nil; date = [NSCalendarDate dateWithTimeIntervalSince1970: seconds]; // Adjust for daylight saving time? (wrt to startDate) + //NSLog(@"***[UIxCalListingActions _formattedDateForSeconds] user timezone is %@", userTimeZone); [date setTimeZone: userTimeZone]; if (forAllDay) formattedDate = [dateFormatter formattedDate: date]; @@ -975,6 +978,11 @@ _computeBlocksPosition (NSArray *blocks) for (count = 0; count < max; count++) { event = [events objectAtIndex: count]; +// NSLog(@"***[UIxCalListingActions eventsBlocksAction] %i = %@ : %@ / %@ / %@", count, +// [event objectAtIndex: eventTitleIndex], +// [event objectAtIndex: eventStartDateIndex], +// [event objectAtIndex: eventEndDateIndex], +// [event objectAtIndex: eventRecurrenceIdIndex]); eventNbr = [NSNumber numberWithUnsignedInt: count]; isAllDay = [[event objectAtIndex: eventIsAllDayIndex] boolValue]; if (dayBasedView && isAllDay) diff --git a/UI/Scheduler/UIxTaskEditor.m b/UI/Scheduler/UIxTaskEditor.m index ea37ed390..8d07b7d3f 100644 --- a/UI/Scheduler/UIxTaskEditor.m +++ b/UI/Scheduler/UIxTaskEditor.m @@ -257,7 +257,7 @@ NSCalendarDate *newStartDate, *now; NSTimeZone *timeZone; SOGoUserDefaults *ud; - int hour; + int hour, minute; unsigned int uStart, uEnd; newStartDate = [self selectedDate]; @@ -273,12 +273,15 @@ { uEnd = [ud dayEndHour]; hour = [now hourOfDay]; + minute = [now minuteOfHour]; + if (minute % 15) + minute += 15 - (minute % 15); if (hour < uStart) newStartDate = [now hour: uStart minute: 0]; else if (hour > uEnd) newStartDate = [[now tomorrow] hour: uStart minute: 0]; else - newStartDate = now; + newStartDate = [now hour: [now hourOfDay] minute: minute]; } else newStartDate = [newStartDate hour: uStart minute: 0]; @@ -302,8 +305,14 @@ { startDate = [todo startDate]; dueDate = [todo due]; - hasStartDate = (startDate != nil); - hasDueDate = (dueDate != nil); + if (startDate) + hasStartDate = YES; + else + startDate = [self newStartDate]; + if (dueDate) + hasDueDate = YES; + else + dueDate = [self newStartDate]; ASSIGN (status, [todo status]); if ([status isEqualToString: @"COMPLETED"]) { diff --git a/UI/Scheduler/UIxTimeDateControl.h b/UI/Scheduler/UIxTimeDateControl.h index bfe490d1b..8314fd246 100644 --- a/UI/Scheduler/UIxTimeDateControl.h +++ b/UI/Scheduler/UIxTimeDateControl.h @@ -33,36 +33,23 @@ NSString *controlID; NSString *label; NSCalendarDate *date; - id hour; - id minute; - id second; + NSString *time; id day; id month; id year; BOOL displayTimeControl; - unsigned int startHour; - unsigned int endHour; - NSNumber *currentHour; - NSNumber *currentMinute; BOOL isDisabled; } -- (void) setDayStartHour: (unsigned int) hour; -- (void) setDayEndHour: (unsigned int) hour; - - (void)setControlID:(NSString *)_controlID; - (NSString *)controlID; - (void)setLabel:(NSString *)_label; - (NSString *)label; - (void)setDate:(NSCalendarDate *)_date; - (NSCalendarDate *)date; +- (void)setTime:(NSString *)_time; +- (NSString *)time; -- (void)setHour:(id)_hour; -- (id)hour; -- (void)setMinute:(id)_minute; -- (id)minute; -- (void)setSecond:(id)_second; -- (id)second; - (void)setDay:(id)_day; - (id)day; - (void)setMonth:(id)_month; diff --git a/UI/Scheduler/UIxTimeDateControl.m b/UI/Scheduler/UIxTimeDateControl.m index dca9fce1d..445cfde19 100644 --- a/UI/Scheduler/UIxTimeDateControl.m +++ b/UI/Scheduler/UIxTimeDateControl.m @@ -45,9 +45,7 @@ [controlID release]; [label release]; [date release]; - [hour release]; - [minute release]; - [second release]; + [time release]; [day release]; [month release]; [year release]; @@ -56,23 +54,28 @@ /* accessors */ -- (void)setControlID:(NSString *)_controlID { +- (void)setControlID:(NSString *)_controlID +{ ASSIGNCOPY(controlID, _controlID); } -- (NSString *)controlID { + +- (NSString *)controlID +{ return controlID; } -- (void)setLabel:(NSString *)_label { + +- (void)setLabel:(NSString *)_label +{ ASSIGNCOPY(label, _label); } -- (NSString *)label { +- (NSString *)label +{ return label; } - (void) setDate: (NSCalendarDate *) _date { SOGoUserDefaults *ud; - int minuteValue; if (!_date) _date = [NSCalendarDate date]; @@ -81,148 +84,63 @@ [_date setTimeZone: [ud timeZone]]; [self _setDate: _date]; + [self setTime: [_date descriptionWithCalendarFormat: @"%H:%M"]]; - minuteValue = [_date minuteOfHour]; - if (minuteValue % 15) - minuteValue += 15 - (minuteValue % 15); - [self setHour: [NSNumber numberWithInt: [_date hourOfDay]]]; - [self setMinute: [NSNumber numberWithInt: minuteValue]]; [self setYear: [NSNumber numberWithInt: [_date yearOfCommonEra]]]; [self setMonth: [NSNumber numberWithInt: [_date monthOfYear]]]; [self setDay: [NSNumber numberWithInt: [_date dayOfMonth]]]; } -- (void)_setDate:(NSCalendarDate *)_date { +- (void)_setDate:(NSCalendarDate *)_date +{ ASSIGN(date, _date); } -- (NSCalendarDate *)date { +- (NSCalendarDate *)date +{ return date; } -- (void)setHour:(id)_hour { - ASSIGN(hour, _hour); +- (void) setTime: (NSString *)_time +{ + ASSIGN(time, _time); } -- (id)hour { - return hour; -} -- (void)setMinute:(id)_minute { - ASSIGN(minute, _minute); -} -- (id)minute { - return minute; -} -- (void)setSecond:(id)_second { - ASSIGN(second, _second); -} -- (id)second { - return second; +- (NSString *) time +{ + return time; } -- (void)setDay:(id)_day { +- (void)setDay:(id)_day +{ ASSIGN(day, _day); } -- (id)day { + +- (id)day +{ return day; } -- (void)setMonth:(id)_month { + +- (void)setMonth:(id)_month +{ ASSIGN(month, _month); } -- (id)month { + +- (id)month +{ return month; } -- (void)setYear:(id)_year { + +- (void)setYear:(id)_year +{ ASSIGN(year, _year); } -- (id)year { + +- (id)year +{ return year; } -- (void) setDayStartHour: (unsigned int) aStartHour -{ - startHour = aStartHour; -} - -- (void) setDayEndHour: (unsigned int) anEndHour -{ - endHour = anEndHour; -} - -- (void) setHourOption: (NSNumber *) option -{ - currentHour = option; -} - -- (BOOL) isCurrentHour -{ - return [currentHour isEqual: hour]; -} - -- (BOOL) isCurrentMinute -{ - return [currentMinute isEqual: minute]; -} - -- (int) hourValue -{ - return [currentHour intValue]; -} - -- (NSString *) hourLabel -{ - return [NSString stringWithFormat: @"%.2d", [currentHour intValue]]; -} - -- (NSArray *) selectableHours -{ - NSMutableArray *hours; - unsigned int h; - - hours = [NSMutableArray array]; - for (h = startHour; h < (endHour + 1); h++) - [hours addObject: [NSNumber numberWithInt: h]]; - - return hours; -} - -- (NSString *) hourSelectId -{ - return [[self controlID] stringByAppendingString:@"_time_hour"]; -} - -- (void) setMinuteOption: (NSNumber *) option -{ - currentMinute = option; -} - -- (int) minuteValue -{ - return [currentMinute intValue]; -} - -- (NSString *) minuteLabel -{ - return [NSString stringWithFormat: @"%.2d", [currentMinute intValue]]; -} - -- (NSArray *) selectableMinutes -{ - NSMutableArray *minutes; - unsigned int m; - - minutes = [NSMutableArray array]; - for (m = 0; m < 60; m += 15) - [minutes addObject: [NSNumber numberWithInt: m]]; - - return minutes; -} - -- (NSString *) minuteSelectId -{ - return [[self controlID] stringByAppendingString:@"_time_minute"]; -} - - (NSString *) timeID { return [[self controlID] stringByAppendingString:@"_time"]; @@ -249,8 +167,9 @@ inContext: (WOContext *) _ctx { NSCalendarDate *d; - unsigned _year, _month, _day, _hour, _minute, _second; + unsigned _year, _month, _day, _hour, _minute;//, _second; SOGoUserDefaults *ud; + NSArray *_time; /* call super, so that the form values are applied on the popups */ [super takeValuesFromRequest:_rq inContext:_ctx]; @@ -258,18 +177,18 @@ _year = [[self year] intValue]; if (_year > 0) { - [self setHour: [_rq formValueForKey: [self hourSelectId]]]; - [self setMinute: [_rq formValueForKey: [self minuteSelectId]]]; + [self setTime: [_rq formValueForKey: [self timeID]]]; _month = [[self month] intValue]; _day = [[self day] intValue]; - _hour = [[self hour] intValue]; - _minute = [[self minute] intValue]; - _second = [[self second] intValue]; + _time = [[self time] componentsSeparatedByString: @":"]; + _hour = [[_time objectAtIndex: 0] intValue]; + _minute = [[_time objectAtIndex: 1] intValue]; +// _second = [[self second] intValue]; ud = [[context activeUser] userDefaults]; d = [NSCalendarDate dateWithYear: _year month: _month day: _day - hour: _hour minute: _minute second: _second + hour: _hour minute: _minute second: 0 timeZone: [ud timeZone]]; [self _setDate: d]; } diff --git a/UI/Templates/SchedulerUI/UIxComponentEditor.wox b/UI/Templates/SchedulerUI/UIxComponentEditor.wox index 4ccd91a18..c715278fe 100644 --- a/UI/Templates/SchedulerUI/UIxComponentEditor.wox +++ b/UI/Templates/SchedulerUI/UIxComponentEditor.wox @@ -12,7 +12,7 @@ title="name" var:toolbar="toolbar" const:cssFiles="UIxComponentEditor.css" - const:jsFiles="skycalendar.js,UIxComponentEditor.js,SOGoAutoCompletion.js"> + const:jsFiles="skycalendar.js,UIxComponentEditor.js,SOGoAutoCompletion.js,SOGoTimePicker.js">