merge of '8e91e5d3f8f29fee9018d49992181eb3b9eaa2e9'

and 'd0d6b4a5eda37be3f072033f5b46b9807f76a4e3'

Monotone-Parent: 8e91e5d3f8f29fee9018d49992181eb3b9eaa2e9
Monotone-Parent: d0d6b4a5eda37be3f072033f5b46b9807f76a4e3
Monotone-Revision: b1db9e0afb3cef83b2163571fce22ed0438d1af9

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-06-07T23:25:14
Monotone-Branch: ca.inverse.sogo
This commit is contained in:
Wolfgang Sourdeau
2007-06-07 23:25:14 +00:00
15 changed files with 842 additions and 801 deletions
+8
View File
@@ -1,5 +1,13 @@
2007-06-07 Wolfgang Sourdeau <wsourdeau@inverse.ca>
* UI/Scheduler/UIxCalListingActions.m ([UIxCalListingActions
-_setupContext]): take the range of dates specified by the popup
into account.
* UI/Scheduler/UIxCalListingActions.[hm]: new subclass of
WODirectAction that returns WOResponse objects with the events or
todos satisfying the parameters passed in the url.
* UI/Scheduler/UIxAppointmentEditor.m ([UIxAppointmentEditor
-takeValuesFromRequest:_rqinContext:_ctx]): take the new ivar
"isAllDay" into account and compute the amount of days to pass to
+2 -2
View File
@@ -20,8 +20,6 @@ SchedulerUI_OBJC_FILES = \
\
UIxComponent+Scheduler.m \
UIxCalView.m \
UIxCalAptListView.m \
UIxCalTasksListView.m \
UIxCalDayView.m \
UIxCalMulticolumnDayView.m \
UIxCalWeekView.m \
@@ -29,6 +27,8 @@ SchedulerUI_OBJC_FILES = \
UIxCalMonthViewOld.m \
UIxAptTableView.m \
\
UIxCalListingActions.m \
\
UIxAttendeesEditor.m \
UIxComponentEditor.m \
UIxCalendarSelector.m \
-43
View File
@@ -1,43 +0,0 @@
/* UIxCalAptListView.h - this file is part of SOGo
*
* Copyright (C) 2006 Inverse groupe conseil
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef UIXCALAPTLISTVIEW_H
#define UIXCALAPTLISTVIEW_H
#import "UIxCalView.h"
@class NSDictionary;
@interface UIxCalAptListView : UIxCalView
{
NSCalendarDate *startDate;
NSCalendarDate *endDate;
NSDictionary *currentAppointment;
}
- (void) setCurrentAppointment: (NSDictionary *) apt;
- (NSDictionary *) currentAppointment;
@end
#endif /* UIXCALAPTLIST_H */
-183
View File
@@ -1,183 +0,0 @@
/* UIxCalAptListView.m - this file is part of SOGo
*
* Copyright (C) 2006 Inverse groupe conseil
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <Appointments/SOGoAppointmentFolder.h>
#import <SOGoUI/SOGoDateFormatter.h>
#import "UIxCalAptListView.h"
@implementation UIxCalAptListView
- (id) init
{
if ((self = [super init]))
{
startDate = nil;
endDate = nil;
}
return self;
}
- (void) setCurrentAppointment: (NSDictionary *) apt
{
currentAppointment = apt;
}
- (NSDictionary *) currentAppointment
{
return currentAppointment;
}
- (NSCalendarDate *) startDate
{
NSCalendarDate *today;
NSString *filterPopup;
if (!startDate)
{
filterPopup = [self queryParameterForKey: @"filterpopup"];
today = [[NSCalendarDate date] beginOfDay];
if (!filterPopup || ![filterPopup length])
startDate = today;
else if ([filterPopup isEqualToString: @"view_selectedday"])
startDate = [[self selectedDate] beginOfDay];
else if ([filterPopup isEqualToString: @"view_thismonth"])
startDate = [today firstDayOfMonth];
else if ([filterPopup isEqualToString: @"view_all"])
startDate = [NSCalendarDate dateWithTimeIntervalSince1970: 0];
else
startDate = today;
}
return startDate;
}
- (NSCalendarDate *) endDate
{
NSCalendarDate *today;
NSString *filterPopup;
if (!endDate)
{
filterPopup = [self queryParameterForKey: @"filterpopup"];
today = [[NSCalendarDate date] endOfDay];
if (!filterPopup || ![filterPopup length]
|| [filterPopup isEqualToString: @"view_today"])
endDate = today;
else if ([filterPopup isEqualToString: @"view_all"]
|| [filterPopup isEqualToString: @"view_future"])
endDate = [NSCalendarDate dateWithTimeIntervalSince1970: 0x7fffffff];
else if ([filterPopup isEqualToString: @"view_thismonth"])
endDate = [today lastDayOfMonth];
else if ([filterPopup isEqualToString: @"view_selectedday"])
endDate = [[self selectedDate] endOfDay];
else if ([filterPopup isEqualToString: @"view_next7"])
endDate = [today dateByAddingYears: 0 months: 0 days: 7];
else if ([filterPopup isEqualToString: @"view_next14"])
endDate = [today dateByAddingYears: 0 months: 0 days: 14];
else if ([filterPopup isEqualToString: @"view_next31"])
endDate = [today dateByAddingYears: 0 months: 1 days: 0];
else
endDate = today;
}
return endDate;
}
- (SOGoDateFormatter *) itemDateFormatter
{
SOGoDateFormatter *fmt;
fmt = [[SOGoDateFormatter alloc] initWithLocale: [self locale]];
[fmt autorelease];
[fmt setFullWeekdayNameAndDetails];
return fmt;
}
- (NSString *) currentStartTime
{
NSCalendarDate *date;
date = [NSCalendarDate dateWithTimeIntervalSince1970:
[[currentAppointment objectForKey: @"startdate"]
intValue]];
[date setTimeZone: timeZone];
return [[self itemDateFormatter] stringForObjectValue: date];
}
- (NSString *) currentEndTime
{
NSCalendarDate *date;
date = [NSCalendarDate dateWithTimeIntervalSince1970:
[[currentAppointment objectForKey: @"enddate"]
intValue]];
[date setTimeZone: timeZone];
return [[self itemDateFormatter] stringForObjectValue: date];
}
- (NSString *) currentLocation
{
return [currentAppointment objectForKey: @"location"];
}
- (NSString *) currentSerialDay
{
NSCalendarDate *date;
int intDate;
intDate = [[currentAppointment objectForKey: @"startdate"] intValue];
date = [NSCalendarDate dateWithTimeIntervalSince1970: intDate];
[date setTimeZone: timeZone];
return [NSString stringWithFormat: @"%d%.2d%.2d",
[date yearOfCommonEra],
[date monthOfYear],
[date dayOfMonth]];
}
- (NSString *) currentSerialHour
{
NSCalendarDate *date;
int intDate;
intDate = [[currentAppointment objectForKey: @"startdate"] intValue];
date = [NSCalendarDate dateWithTimeIntervalSince1970: intDate];
[date setTimeZone: timeZone];
return [NSString stringWithFormat: @"%.2d%.2d",
[date hourOfDay],
[date minuteOfHour]];
}
@end
@@ -1,4 +1,4 @@
/* UIxCalTasksListView.h - this file is part of SOGo
/* UIxCalListingActions.h - this file is part of SOGo
*
* Copyright (C) 2006 Inverse groupe conseil
*
@@ -20,29 +20,32 @@
* Boston, MA 02111-1307, USA.
*/
#ifndef UIXCALTASKSLISTVIEW_H
#define UIXCALTASKSLISTVIEW_H
#ifndef UIXCALLISTINGACTIONVIEW_H
#define UIXCALLISTINGACTIONVIEW_H
#import "UIxCalView.h"
@class NSDictionary;
#import <NGObjWeb/WODirectAction.h>
@class NSCalendarDate;
@class NSMutableDictionary;
@class NSString;
@class NSTimeZone;
@interface UIxCalTasksListView : UIxCalView
@class WOResponse;
@class WORequest;
@interface UIxCalListingActions : WODirectAction
{
NSMutableDictionary *componentsData;
NSCalendarDate *startDate;
NSCalendarDate *endDate;
BOOL knowsToShow;
BOOL showCompleted;
NSDictionary *currentTask;
NSString *userLogin;
WORequest *request;
}
- (void) setCurrentTask: (NSDictionary *) task;
- (NSDictionary *) currentTask;
- (WOResponse *) eventsListAction;
- (WOResponse *) tasksListAction;
@end
#endif /* UIXCALTASKSLIST_H */
#endif /* UIXCALLISTINGACTION_H */
+404
View File
@@ -0,0 +1,404 @@
/* UIxCalListingActions.m - this file is part of SOGo
*
* Copyright (C) 2006 Inverse groupe conseil
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSNull.h>
#import <Foundation/NSString.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WORequest.h>
#import <NGObjWeb/WOResponse.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <SoObjects/SOGo/SOGoUser.h>
#import <SoObjects/SOGo/NSCalendarDate+SOGo.h>
#import <SoObjects/SOGo/NSArray+Utilities.h>
#import <SoObjects/SOGo/NSObject+Utilities.h>
#import <SoObjects/Appointments/SOGoAppointmentFolder.h>
#import "UIxCalListingActions.h"
@implementation UIxCalListingActions
- (id) init
{
if ((self = [super init]))
{
componentsData = [NSMutableDictionary new];
startDate = nil;
endDate = nil;
request = nil;
// knowsToShow = NO;
// showCompleted = NO;
}
return self;
}
- (void) dealloc
{
[componentsData release];
[startDate release];
[endDate release];
[super dealloc];
}
- (void) _setupDatesWithPopup: (NSString *) popupValue
andUserTZ: (NSTimeZone *) userTZ
{
NSCalendarDate *newDate;
NSString *param;
if ([popupValue isEqualToString: @"view_today"])
{
newDate = [NSCalendarDate calendarDate];
[newDate setTimeZone: userTZ];
startDate = [newDate beginOfDay];
endDate = [newDate endOfDay];
}
else if ([popupValue isEqualToString: @"view_all"])
{
startDate = nil;
endDate = nil;
}
else if ([popupValue isEqualToString: @"view_next7"])
{
newDate = [NSCalendarDate calendarDate];
[newDate setTimeZone: userTZ];
startDate = [newDate beginOfDay];
endDate = [[startDate dateByAddingYears: 0 months: 0 days: 6] endOfDay];
}
else if ([popupValue isEqualToString: @"view_next14"])
{
newDate = [NSCalendarDate calendarDate];
[newDate setTimeZone: userTZ];
startDate = [newDate beginOfDay];
endDate = [[startDate dateByAddingYears: 0 months: 0 days: 13] endOfDay];
}
else if ([popupValue isEqualToString: @"view_next31"])
{
newDate = [NSCalendarDate calendarDate];
[newDate setTimeZone: userTZ];
startDate = [newDate beginOfDay];
endDate = [[startDate dateByAddingYears: 0 months: 0 days: 30] endOfDay];
}
else if ([popupValue isEqualToString: @"view_thismonth"])
{
newDate = [NSCalendarDate calendarDate];
[newDate setTimeZone: userTZ];
startDate = [[newDate firstDayOfMonth] beginOfDay];
endDate = [[newDate lastDayOfMonth] endOfDay];
}
else if ([popupValue isEqualToString: @"view_future"])
{
newDate = [NSCalendarDate calendarDate];
[newDate setTimeZone: userTZ];
startDate = [newDate beginOfDay];
endDate = [NSCalendarDate distantFuture];
}
else if ([popupValue isEqualToString: @"view_selectedday"])
{
param = [request formValueForKey: @"day"];
if ([param length] > 0)
startDate = [[NSCalendarDate dateFromShortDateString: param
andShortTimeString: nil
inTimeZone: userTZ] beginOfDay];
else
{
newDate = [NSCalendarDate calendarDate];
[newDate setTimeZone: userTZ];
startDate = [newDate beginOfDay];
}
endDate = [startDate endOfDay];
}
}
- (void) _setupContext
{
SOGoUser *user;
NSTimeZone *userTZ;
NSString *param;
user = [context activeUser];
userLogin = [user login];
userTZ = [user timeZone];
request = [context request];
param = [request formValueForKey: @"filterpopup"];
if ([param length] > 0)
[self _setupDatesWithPopup: param andUserTZ: userTZ];
else
{
param = [request formValueForKey: @"sd"];
if ([param length] > 0)
startDate = [[NSCalendarDate dateFromShortDateString: param
andShortTimeString: nil
inTimeZone: userTZ] beginOfDay];
else
startDate = nil;
param = [request formValueForKey: @"sd"];
if ([param length] > 0)
endDate = [[NSCalendarDate dateFromShortDateString: param
andShortTimeString: nil
inTimeZone: userTZ] endOfDay];
else
endDate = nil;
}
}
- (void) _updatePrivacyInComponent: (NSMutableDictionary *) component
fromFolder: (SOGoAppointmentFolder *) folder
{
int privacyFlag;
NSString *roleString;
privacyFlag = [[component objectForKey: @"classification"] intValue];
roleString = [folder roleForComponentsWithAccessClass: privacyFlag
forUser: userLogin];
if ([roleString isEqualToString: @"ComponentDAndTViewer"])
{
[component setObject: @"" forKey: @"title"];
[component setObject: @"" forKey: @"location"];
}
}
- (SOGoAppointmentFolder *) _aptFolder: (NSString *) folder
withClientObject: (SOGoAppointmentFolder *) clientObject
{
SOGoAppointmentFolder *aptFolder;
NSArray *folderParts;
if ([folder isEqualToString: @"/"])
aptFolder = clientObject;
else
{
folderParts = [folder componentsSeparatedByString: @":"];
aptFolder
= [clientObject lookupCalendarFolderForUID:
[folderParts objectAtIndex: 0]];
}
return aptFolder;
}
- (NSArray *) _activeCalendarFolders
{
NSMutableArray *activeFolders;
NSEnumerator *folders;
NSDictionary *currentFolderDict;
SOGoAppointmentFolder *currentFolder, *clientObject;
activeFolders = [NSMutableArray new];
[activeFolders autorelease];
clientObject = [self clientObject];
folders = [[clientObject calendarFolders] objectEnumerator];
currentFolderDict = [folders nextObject];
while (currentFolderDict)
{
if ([[currentFolderDict objectForKey: @"active"] boolValue])
{
currentFolder
= [self _aptFolder: [currentFolderDict objectForKey: @"folder"]
withClientObject: clientObject];
[activeFolders addObject: currentFolder];
}
currentFolderDict = [folders nextObject];
}
return activeFolders;
}
- (NSArray *) _fetchFields: (NSArray *) fields
forComponentOfType: (NSString *) component
{
NSEnumerator *folders, *currentInfos;
SOGoAppointmentFolder *currentFolder;
NSMutableDictionary *infos, *currentInfo, *newInfo;
NSString *owner, *uid;
NSNull *marker;
marker = [NSNull null];
infos = [NSMutableDictionary dictionary];
folders = [[self _activeCalendarFolders] objectEnumerator];
currentFolder = [folders nextObject];
while (currentFolder)
{
owner = [currentFolder ownerInContext: context];
currentInfos = [[currentFolder fetchCoreInfosFrom: startDate
to: endDate
component: component] objectEnumerator];
newInfo = [currentInfos nextObject];
while (newInfo)
{
uid = [newInfo objectForKey: @"uid"];
currentInfo = [infos objectForKey: uid];
if (!currentInfo
|| [owner isEqualToString: userLogin])
{
[self _updatePrivacyInComponent: newInfo
fromFolder: currentFolder];
[newInfo setObject: owner forKey: @"owner"];
[infos setObject: [newInfo objectsForKeys: fields
notFoundMarker: marker]
forKey: uid];
}
newInfo = [currentInfos nextObject];
}
currentFolder = [folders nextObject];
}
return [infos allValues];
}
- (WOResponse *) _responseWithData: (NSArray *) data
{
WOResponse *response;
response = [context response];
[response setHeader: @"text/plain; charset=utf-8"
forKey: @"content-type"];
[response setStatus: 200];
[response appendContentString: [data jsonRepresentation]];
return response;
}
- (WOResponse *) eventsListAction
{
NSArray *fields;
NSArray *events;
[self _setupContext];
fields = [NSArray arrayWithObjects: @"c_name", @"owner", @"status",
@"title", @"startdate", @"enddate", @"location", nil];
events = [self _fetchFields: fields forComponentOfType: @"vevent"];
return [self _responseWithData: events];
}
- (NSString *) _getStatusClassForStatusCode: (int) statusCode
andEndDateStamp: (unsigned int) endDateStamp
{
NSCalendarDate *taskDate, *now;
NSString *statusClass;
if (statusCode == 1)
statusClass = @"completed";
else
{
if (endDateStamp)
{
now = [NSCalendarDate calendarDate];
taskDate
= [NSCalendarDate dateWithTimeIntervalSince1970: endDateStamp];
if ([taskDate earlierDate: now] == taskDate)
statusClass = @"overdue";
else
{
if ([taskDate isToday])
statusClass = @"duetoday";
else
statusClass = @"duelater";
}
}
else
statusClass = @"duelater";
}
return statusClass;
}
- (WOResponse *) tasksListAction
{
NSEnumerator *tasks;
NSMutableArray *filteredTasks, *filteredTask;
BOOL showCompleted;
NSArray *fields, *task;
int statusCode;
unsigned int endDateStamp;
NSString *statusFlag;
filteredTasks = [NSMutableArray array];
[self _setupContext];
fields = [NSArray arrayWithObjects: @"c_name", @"owner", @"status",
@"title", @"enddate", nil];
tasks = [[self _fetchFields: fields
forComponentOfType: @"vtodo"] objectEnumerator];
showCompleted = [[request formValueForKey: @"show-completed"] intValue];
task = [tasks nextObject];
while (task)
{
statusCode = [[task objectAtIndex: 2] intValue];
if (statusCode != 1 || showCompleted)
{
filteredTask = [NSMutableArray arrayWithArray: task];
endDateStamp = [[task objectAtIndex: 4] intValue];
statusFlag = [self _getStatusClassForStatusCode: statusCode
andEndDateStamp: endDateStamp];
[filteredTask addObject: statusFlag];
[filteredTasks addObject: filteredTask];
}
task = [tasks nextObject];
}
return [self _responseWithData: filteredTasks];
}
// - (BOOL) shouldDisplayCurrentTask
// {
// if (!knowsToShow)
// {
// showCompleted
// = [[self queryParameterForKey: @"show-completed"] intValue];
// knowsToShow = YES;
// }
// return ([[currentTask objectForKey: @"status"] intValue] != 1
// || showCompleted);
// }
// - (BOOL) shouldShowCompletedTasks
// {
// if (!knowsToShow)
// {
// showCompleted
// = [[self queryParameterForKey: @"show-completed"] intValue];
// knowsToShow = YES;
// }
// return showCompleted;
// }
@end
-177
View File
@@ -1,177 +0,0 @@
/* UIxCalTasksListView.m - this file is part of SOGo
*
* Copyright (C) 2006 Inverse groupe conseil
*
* Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
*
* This file is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This file is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSDate.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <Foundation/NSValue.h>
#import <NGExtensions/NSCalendarDate+misc.h>
#import <Appointments/SOGoAppointmentFolder.h>
#import <SOGoUI/SOGoDateFormatter.h>
#import "UIxCalTasksListView.h"
@implementation UIxCalTasksListView
- (id) init
{
if ((self = [super init]))
{
startDate = nil;
endDate = nil;
knowsToShow = NO;
showCompleted = NO;
}
return self;
}
- (void) setCurrentTask: (NSDictionary *) task
{
currentTask = task;
}
- (NSDictionary *) currentTask
{
return currentTask;
}
- (NSCalendarDate *) startDate
{
return nil;
}
- (NSCalendarDate *) endDate
{
return nil;
}
- (NSString *) getStatusClassForTask: (NSDictionary *) task
{
NSCalendarDate *taskDate, *now;
NSString *statusClass, *allClasses;
NSNumber *taskDueStamp;
if ([[task objectForKey: @"status"] intValue] == 1)
statusClass = @"completed";
else
{
taskDueStamp = [task objectForKey: @"enddate"];
if ([taskDueStamp intValue])
{
now = [NSCalendarDate calendarDate];
taskDate = [NSCalendarDate dateWithTimeIntervalSince1970:
[taskDueStamp intValue]];
if ([taskDate earlierDate: now] == taskDate)
statusClass = @"overdue";
else
{
if ([taskDate isToday])
statusClass = @"duetoday";
else
statusClass = @"duelater";
}
}
else
statusClass = @"duelater";
}
allClasses = [NSString stringWithFormat: @"%@ ownerIs%@",
statusClass,
[task objectForKey: @"owner"]];
return allClasses;
}
- (WOResponse *) tasksListAction
{
WOResponse *response;
NSDictionary *tasks;
NSMutableArray *filteredTasks;
BOOL showCompleted;
unsigned i, count;
response = [context response];
filteredTasks = [NSMutableArray new];
[filteredTasks autorelease];
tasks = [self _fetchCoreInfosForComponent: @"vtodo"];
showCompleted = [[self queryParameterForKey: @"show-completed"] intValue];
count = [tasks count];
for (i = 0; i < count; i++) {
NSDictionary *task;
NSArray *filteredTask;
task = [tasks objectAtIndex: i];
if ([[task objectForKey: @"status"] intValue] != 1
|| showCompleted)
{
filteredTask = [NSArray arrayWithObjects:
[task objectForKey: @"c_name"],
[task objectForKey: @"owner"],
[task objectForKey: @"status"],
[task objectForKey: @"title"],
[self getStatusClassForTask: task],
nil];
[filteredTasks addObject: filteredTask];
}
}
[response setStatus: 200];
[response appendContentString: [filteredTasks jsonRepresentation]];
return response;
}
- (BOOL) shouldDisplayCurrentTask
{
if (!knowsToShow)
{
showCompleted
= [[self queryParameterForKey: @"show-completed"] intValue];
knowsToShow = YES;
}
return ([[currentTask objectForKey: @"status"] intValue] != 1
|| showCompleted);
}
- (BOOL) shouldShowCompletedTasks
{
if (!knowsToShow)
{
showCompleted
= [[self queryParameterForKey: @"show-completed"] intValue];
knowsToShow = YES;
}
return showCompleted;
}
- (BOOL) isCurrentTaskCompleted
{
return ([[currentTask objectForKey: @"status"] intValue] == 1);
}
@end
+211 -209
View File
@@ -1,224 +1,226 @@
{
{ /* -*-javascript-*- */
requires = ( MAIN, MainUI, CommonUI, Appointments, Contacts, ContactsUI );
publicResources = (
previous_week.gif,
next_week.gif,
icon_view_overview.gif,
icon_view_overview_inactive.gif,
icon_view_chart.gif,
icon_view_chart_inactive.gif,
icon_view_list.gif,
icon_view_list_inactive.gif,
icon_view_columns.gif,
icon_view_columns_inactive.gif,
icon_popupcalendar.gif,
first.gif,
previous.gif,
next.gif,
last.gif,
skycalendar.html,
skycalendar.js,
green_corner.gif,
invisible_space_2.gif,
cycles.plist,
previous_week.gif,
next_week.gif,
icon_view_overview.gif,
icon_view_overview_inactive.gif,
icon_view_chart.gif,
icon_view_chart_inactive.gif,
icon_view_list.gif,
icon_view_list_inactive.gif,
icon_view_columns.gif,
icon_view_columns_inactive.gif,
icon_popupcalendar.gif,
first.gif,
previous.gif,
next.gif,
last.gif,
skycalendar.html,
skycalendar.js,
green_corner.gif,
invisible_space_2.gif,
cycles.plist,
);
factories = {
};
categories = {
SOGoAppointmentFolder = {
slots = {
toolbar = {
protectedBy = "View";
value = "SOGoAppointmentFolder.toolbar";
};
};
methods = {
view = {
protectedBy = "View";
pageName = "UIxCalMainView";
};
dateselector = {
protectedBy = "View";
pageName = "UIxCalDateSelector";
};
aptlist = {
protectedBy = "View";
pageName = "UIxCalAptListView";
};
taskslist = {
protectedBy = "View";
pageName = "UIxCalTasksListView";
};
dayview = {
protectedBy = "View";
pageName = "UIxCalDayView";
};
multicolumndayview = {
protectedBy = "View";
pageName = "UIxCalMulticolumnDayView";
};
weekview = {
protectedBy = "View";
pageName = "UIxCalWeekView";
};
monthview = {
protectedBy = "View";
pageName = "UIxCalMonthView";
};
newevent = {
protectedBy = "Add Documents, Images, and Files";
pageName = "UIxAppointmentEditor";
actionName = "new";
};
newtask = {
protectedBy = "Add Documents, Images, and Files";
pageName = "UIxTaskEditor";
actionName = "new";
};
show = {
protectedBy = "View";
pageName = "UIxCalView";
actionName = "redirectForUIDs";
};
proposal = {
protectedBy = "View";
pageName = "UIxAppointmentProposal";
};
proposalSearch = {
protectedBy = "View";
pageName = "UIxAppointmentProposal";
actionName = "proposalSearch";
};
batchDelete = {
protectedBy = "Delete Objects";
pageName = "UIxCalMainView";
actionName = "batchDelete";
};
updateCalendars = {
protectedBy = "View";
pageName = "UIxCalMainView";
actionName = "updateCalendars";
};
editAttendees = {
protectedBy = "View";
pageName = "UIxAttendeesEditor";
SOGoAppointmentFolder = {
slots = {
toolbar = {
protectedBy = "View";
value = "SOGoAppointmentFolder.toolbar";
};
};
userRights = {
protectedBy = "ReadAcls";
pageName = "UIxCalUserRightsEditor";
};
saveUserRights = {
protectedBy = "SaveAcls";
pageName = "UIxCalUserRightsEditor";
actionName = "saveUserRights";
methods = {
view = {
protectedBy = "View";
pageName = "UIxCalMainView";
};
dateselector = {
protectedBy = "View";
pageName = "UIxCalDateSelector";
};
eventslist = {
protectedBy = "View";
actionClass = "UIxCalListingActions";
actionName = "eventsList";
};
taskslist = {
protectedBy = "View";
actionClass = "UIxCalListingActions";
actionName = "tasksList";
};
dayview = {
protectedBy = "View";
pageName = "UIxCalDayView";
};
multicolumndayview = {
protectedBy = "View";
pageName = "UIxCalMulticolumnDayView";
};
weekview = {
protectedBy = "View";
pageName = "UIxCalWeekView";
};
monthview = {
protectedBy = "View";
pageName = "UIxCalMonthView";
};
newevent = {
protectedBy = "Add Documents, Images, and Files";
pageName = "UIxAppointmentEditor";
actionName = "new";
};
newtask = {
protectedBy = "Add Documents, Images, and Files";
pageName = "UIxTaskEditor";
actionName = "new";
};
show = {
protectedBy = "View";
pageName = "UIxCalView";
actionName = "redirectForUIDs";
};
proposal = {
protectedBy = "View";
pageName = "UIxAppointmentProposal";
};
proposalSearch = {
protectedBy = "View";
pageName = "UIxAppointmentProposal";
actionName = "proposalSearch";
};
batchDelete = {
protectedBy = "Delete Objects";
pageName = "UIxCalMainView";
actionName = "batchDelete";
};
updateCalendars = {
protectedBy = "View";
pageName = "UIxCalMainView";
actionName = "updateCalendars";
};
editAttendees = {
protectedBy = "View";
pageName = "UIxAttendeesEditor";
};
userRights = {
protectedBy = "ReadAcls";
pageName = "UIxCalUserRightsEditor";
};
saveUserRights = {
protectedBy = "SaveAcls";
pageName = "UIxCalUserRightsEditor";
actionName = "saveUserRights";
};
};
};
};
SOGoCalendarComponent = {
};
};
SOGoCalendarComponent = {
};
SOGoAppointmentObject = {
slots = {
toolbar = {
protectedBy = "View";
value = "SOGoAppointmentObject.toolbar";
};
};
methods = {
view = {
protectedBy = "ViewAllComponent";
pageName = "UIxAppointmentView";
};
delete = {
protectedBy = "Delete Objects";
pageName = "UIxAppointmentView";
actionName = "delete";
};
edit = {
protectedBy = "ViewAllComponent";
pageName = "UIxAppointmentEditor";
};
editAsAppointment = {
protectedBy = "ViewAllComponent";
pageName = "UIxAppointmentEditor";
};
save = {
protectedBy = "ModifyComponent";
pageName = "UIxAppointmentEditor";
actionName = "save";
};
saveAsAppointment = {
protectedBy = "ModifyComponent";
pageName = "UIxAppointmentEditor";
actionName = "save";
};
accept = {
protectedBy = "RespondToComponent";
pageName = "UIxAppointmentEditor";
actionName = "accept";
};
decline = {
protectedBy = "RespondToComponent";
pageName = "UIxAppointmentEditor";
actionName = "decline";
};
};
};
SOGoAppointmentObject = {
slots = {
toolbar = {
protectedBy = "View";
value = "SOGoAppointmentObject.toolbar";
};
};
methods = {
view = {
protectedBy = "ViewAllComponent";
pageName = "UIxAppointmentView";
};
delete = {
protectedBy = "Delete Objects";
pageName = "UIxAppointmentView";
actionName = "delete";
};
edit = {
protectedBy = "ViewAllComponent";
pageName = "UIxAppointmentEditor";
};
editAsAppointment = {
protectedBy = "ViewAllComponent";
pageName = "UIxAppointmentEditor";
};
save = {
protectedBy = "ModifyComponent";
pageName = "UIxAppointmentEditor";
actionName = "save";
};
saveAsAppointment = {
protectedBy = "ModifyComponent";
pageName = "UIxAppointmentEditor";
actionName = "save";
};
accept = {
protectedBy = "RespondToComponent";
pageName = "UIxAppointmentEditor";
actionName = "accept";
};
decline = {
protectedBy = "RespondToComponent";
pageName = "UIxAppointmentEditor";
actionName = "decline";
};
};
};
SOGoTaskObject = {
slots = {
toolbar = {
protectedBy = "View";
value = "SOGoAppointmentObject.toolbar";
};
};
methods = {
view = {
protectedBy = "ViewAllComponent";
pageName = "UIxTaskView";
};
delete = {
protectedBy = "Delete Objects";
pageName = "UIxTaskView";
actionName = "delete";
};
edit = {
protectedBy = "ViewAllComponent";
pageName = "UIxTaskEditor";
};
editAsTask = {
protectedBy = "ViewAllComponent";
pageName = "UIxTaskEditor";
};
save = {
protectedBy = "ModifyComponent";
pageName = "UIxTaskEditor";
actionName = "save";
};
saveAsTask = {
protectedBy = "ModifyComponent";
pageName = "UIxTaskEditor";
actionName = "save";
};
changeStatus = {
protectedBy = "ModifyComponent";
pageName = "UIxTaskEditor";
actionName = "changeStatus";
};
accept = {
protectedBy = "RespondToComponent";
pageName = "UIxTaskEditor";
actionName = "accept";
};
decline = {
protectedBy = "RespondToComponent";
pageName = "UIxTaskEditor";
actionName = "decline";
};
};
};
SOGoTaskObject = {
slots = {
toolbar = {
protectedBy = "View";
value = "SOGoAppointmentObject.toolbar";
};
};
methods = {
view = {
protectedBy = "ViewAllComponent";
pageName = "UIxTaskView";
};
delete = {
protectedBy = "Delete Objects";
pageName = "UIxTaskView";
actionName = "delete";
};
edit = {
protectedBy = "ViewAllComponent";
pageName = "UIxTaskEditor";
};
editAsTask = {
protectedBy = "ViewAllComponent";
pageName = "UIxTaskEditor";
};
save = {
protectedBy = "ModifyComponent";
pageName = "UIxTaskEditor";
actionName = "save";
};
saveAsTask = {
protectedBy = "ModifyComponent";
pageName = "UIxTaskEditor";
actionName = "save";
};
changeStatus = {
protectedBy = "ModifyComponent";
pageName = "UIxTaskEditor";
actionName = "changeStatus";
};
accept = {
protectedBy = "RespondToComponent";
pageName = "UIxTaskEditor";
actionName = "accept";
};
decline = {
protectedBy = "RespondToComponent";
pageName = "UIxTaskEditor";
actionName = "decline";
};
};
};
};
}
@@ -1,61 +0,0 @@
<?xml version="1.0" standalone="yes"?>
<table id="appointmentsList" multiselect="yes"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant"
xmlns:rsrc="OGo:url"
xmlns:label="OGo:label">
<tr class="tableview"
><td class="tbtv_headercell tbtv_subject_headercell"
><var:component className="UIxSortableTableHeader"
label:label="Title"
const:sortKey="Title"
const:href="aptlist"
var:queryDictionary="context.request.formValues"
/></td
><td class="tbtv_headercell headerDateTime"
><var:component className="UIxSortableTableHeader"
label:label="Start"
const:sortKey="Start"
const:href="aptlist"
var:queryDictionary="context.request.formValues"
/></td
><td class="tbtv_headercell headerDateTime"
><var:component className="UIxSortableTableHeader"
label:label="End"
const:sortKey="End"
const:href="aptlist"
var:queryDictionary="context.request.formValues"
/></td
><td class="tbtv_headercell headerLocation"
><var:component className="UIxSortableTableHeader"
label:label="Location"
const:sortKey="Location"
const:href="aptlist"
var:queryDictionary="context.request.formValues"
/></td
></tr>
<var:foreach list="fetchCoreAppointmentsInfos" item="currentAppointment"
><tr class="tableview appointmentRow"
var:id="currentAppointment.c_name"
var:owner="currentAppointment.owner"
onclick="return onAppointmentClick(event);"
ondblclick="return editDoubleClickedEvent(this);"
oncontextmenu="return onAppointmentContextMenu(event, this);"
var:day="currentSerialDay"
var:hour="currentSerialHour"
><td onmousedown="return false;"
class="subjectCell"
><var:string value="currentAppointment.title"
const:escapeHTML="NO"
/></td
><td onmousedown="return false;"
><var:string value="currentStartTime"/></td
><td onmousedown="return false;"
><var:string value="currentEndTime"/></td
><td onmousedown="return false;"
><var:string value="currentLocation" /></td
></tr
></var:foreach>
</table>
+17 -8
View File
@@ -28,7 +28,7 @@
></ul>
</div>
<div class="menu" id="appointmentsListMenu">
<div class="menu" id="eventsListMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><!-- separator --></li>
@@ -74,19 +74,28 @@
var:calendarFolders="calendarFolders" /></div>
</div>
<div id="tasksListView"
><var:component className="UIxCalTasksListView"
/></div>
<div id="tasksListView">
<label><input id="showHideCompletedTasks"
type="checkbox" class="checkBox"
/><var:string label:value="Show completed tasks"/></label>
<ul id="tasksList"><!-- space --></ul>
</div>
</div>
<div id="verticalDragHandle" class="dragHandle"><!-- space --></div>
<div id="rightPanel">
<var:component className="UIxCalFilterPanel" />
<div id="appointmentsListView"
oncontextmenu="return onAppointmentContextMenu(event, this);"
><var:component className="UIxCalAptListView"
/></div>
<div id="eventsListView">
<table id="eventsList">
<tr>
<td class="headerCell"><span class="sortableTableHeader"><var:string label:value="Title"/></span></td>
<td class="headerCell headerDateTime"><span class="sortableTableHeader"><var:string label:value="Start"/></span></td>
<td class="headerCell headerDateTime"><span class="sortableTableHeader"><var:string label:value="End"/></span></td>
<td class="headerCell"><span class="sortableTableHeader"><var:string label:value="Location"/></span></td>
</tr>
</table>
</div>
<div id="rightDragHandle" class="dragHandle"><!-- space --></div>
<div id="calendarView"><!-- space --></div>
</div>
@@ -1,18 +0,0 @@
<?xml version="1.0" standalone="yes"?>
<container
xmlns="http://www.w3.org/1999/xhtml"
xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant"
xmlns:rsrc="OGo:url"
xmlns:label="OGo:label">
<h2><var:string label:value="Tasks" /></h2>
<label><input class="checkBox"
var:checked="shouldShowCompletedTasks"
type="checkbox"
onclick="return onShowCompletedTasks(this);"
/><var:string label:value="Show completed tasks"
/></label>
<ul id="tasksList" multiselect="yes">
</ul>
<var:string value="fetchCoreTasksInfos.jsonRepresentation"/>
</container>
@@ -77,6 +77,28 @@ Date.prototype.daysUpTo = function(otherDate) {
return days;
}
Date.prototype.getDayString = function() {
var newString = this.getYear() + 1900;
var month = '' + (this.getMonth() + 1);
if (month.length == 1)
month = '0' + month;
newString += month;
var day = '' + this.getDate();
if (day.length == 1)
day = '0' + day;
newString += day;
return newString;
}
Date.prototype.getHourString = function() {
var newString = this.getHours() + '00';
if (newString.length == 3)
newString = '0' + newString;
return newString;
}
Date.prototype.stringWithSeparator = function(separator) {
var month = '' + (this.getMonth() + 1);
var day = '' + this.getDate();
+145 -78
View File
@@ -74,10 +74,10 @@ function editEvent() {
for (var i = 0; i < nodes.length; i++)
_editEventId(nodes[i].getAttribute("id"),
nodes[i].getAttribute("owner"));
nodes[i].owner);
} else if (selectedCalendarCell) {
_editEventId(selectedCalendarCell.getAttribute("aptCName"),
selectedCalendarCell.getAttribute("owner"));
selectedCalendarCell.owner);
}
return false; /* stop following the link */
@@ -102,7 +102,7 @@ function deleteEvent() {
if (listOfSelection == $("tasksList"))
label = labels["taskDeleteConfirmation"].decodeEntities();
else
label = labels["appointmentDeleteConfirmation"].decodeEntities();
label = labels["eventDeleteConfirmation"].decodeEntities();
if (confirm(label)) {
if (document.deleteEventAjaxRequest) {
@@ -113,7 +113,7 @@ function deleteEvent() {
var owners = new Array();
for (var i = 0; i < nodes.length; i++) {
var owner = nodes[i].getAttribute("owner");
var owner = nodes[i].owner;
if (!sortedNodes[owner]) {
sortedNodes[owner] = new Array();
owners.push(owner);
@@ -129,14 +129,14 @@ function deleteEvent() {
}
}
else if (selectedCalendarCell) {
var label = labels["appointmentDeleteConfirmation"].decodeEntities();
var label = labels["eventDeleteConfirmation"].decodeEntities();
if (confirm(label)) {
if (document.deleteEventAjaxRequest) {
document.deleteEventAjaxRequest.aborted = true;
document.deleteEventAjaxRequest.abort();
}
eventsToDelete.push([selectedCalendarCell.getAttribute("aptCName")]);
ownersOfEventsToDelete.push(selectedCalendarCell.getAttribute("owner"));
ownersOfEventsToDelete.push(selectedCalendarCell.owner);
_batchDeleteEvents();
}
}
@@ -177,7 +177,7 @@ function modifyEventCallback(http) {
if (queryParameters["mail-invitation"].toLowerCase() == "yes")
closeInvitationWindow();
else {
window.opener.setTimeout("refreshAppointmentsAndDisplay();", 100);
window.opener.setTimeout("refreshEventsAndDisplay();", 100);
window.setTimeout("window.close();", 100);
}
}
@@ -202,7 +202,7 @@ function deleteEventCallback(http) {
_batchDeleteEvents();
else {
document.deleteEventAjaxRequest = null;
refreshAppointments();
refreshEvents();
refreshTasks();
changeCalendarDisplay();
}
@@ -213,21 +213,21 @@ function deleteEventCallback(http) {
function editDoubleClickedEvent() {
_editEventId(this.getAttribute("id"),
this.getAttribute("owner"));
this.owner);
return false;
}
function onSelectAll() {
var list = $("appointmentsList");
list.selectRowsMatchingClass("appointmentRow");
var list = $("eventsList");
list.selectRowsMatchingClass("eventRow");
return false;
}
function displayAppointment(event) {
function displayEvent(event) {
_editEventId(this.getAttribute("aptCName"),
this.getAttribute("owner"));
this.owner);
preventDefault(event);
event.stopPropagation();
@@ -253,7 +253,7 @@ function onDaySelect(node) {
changeCalendarDisplay( { "day": day } );
if (needRefresh)
refreshAppointments();
refreshEvents();
return false;
}
@@ -302,22 +302,62 @@ function dateSelectorCallback(http) {
log ("dateSelectorCallback Ajax error");
}
function appointmentsListCallback(http) {
var div = $("appointmentsListView");
function eventsListCallback(http) {
var div = $("eventsListView");
if (http.readyState == 4
&& http.status == 200) {
document.appointmentsListAjaxRequest = null;
div.innerHTML = http.responseText;
document.eventsListAjaxRequest = null;
var table = $("eventsList").tBodies[0];
var params = parseQueryParameters(http.callbackData);
sortKey = params["sort"];
sortOrder = params["desc"];
var list = $("appointmentsList");
Event.observe(list, "mousedown", onAppointmentsSelectionChange.bindAsEventListener(list), true);
configureSortableTableHeaders();
var data = http.responseText.evalJSON(true);
for (var i = 0; i < data.length; i++) {
var row = document.createElement("tr");
table.appendChild(row);
$(row).addClassName("eventRow");
row.setAttribute("id", data[i][0]);
row.owner = data[i][1];
var startDate = new Date();
startDate.setTime(data[i][4] * 1000);
row.day = startDate.getDayString();
row.hour = startDate.getHourString();
Event.observe(row, "click", onEventClick.bindAsEventListener(row));
Event.observe(row, "dblclick", editDoubleClickedEvent.bindAsEventListener(row));
Event.observe(row, "contextmenu",
onEventContextMenu.bindAsEventListener(row));
var td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][3]));
td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][4]));
td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][5]));
td = document.createElement("td");
row.appendChild(td);
Event.observe(td, "mousedown",
listRowMouseDownHandler.bindAsEventListener(td), true);
td.appendChild(document.createTextNode(data[i][6]));
}
}
else
log ("appointmentsListCallback Ajax error");
log ("eventsListCallback Ajax error");
}
function tasksListCallback(http) {
@@ -327,23 +367,20 @@ function tasksListCallback(http) {
&& http.status == 200) {
document.tasksListAjaxRequest = null;
var list = $("tasksList");
var newList = document.createElement("ul");
newList.setAttribute("multiselect", "yes");
newList.setAttribute("id", "tasksList");
var scroll = list.scrollTop;
var data = http.responseText.evalJSON(true);
for (var i = 0; i < data.length; i++) {
//log(i + " = " + data[i][3]);
var listItem = document.createElement("li");
newList.appendChild(listItem);
list.appendChild(listItem);
//Event.observe(listItem, "mousedown", listRowMouseDownHandler); // causes problem with Safari
Event.observe(listItem, "click", onRowClick);
Event.observe(listItem, "dblclick", editDoubleClickedEvent.bindAsEventListener(listItem));
listItem.setAttribute("id", data[i][0]);
listItem.setAttribute("owner", data[i][1]);
$(listItem).addClassName(data[i][4]);
$(listItem).addClassName(data[i][5]);
var owner = data[i][1];
listItem.owner = owner;
$(listItem).addClassName("ownerIs" + owner);
var input = document.createElement("input");
input.setAttribute("type", "checkbox");
listItem.appendChild(input);
@@ -355,10 +392,7 @@ function tasksListCallback(http) {
listItem.appendChild(document.createTextNode(data[i][3]));
}
Event.observe(newList, "mousedown", onTasksSelectionChange.bindAsEventListener(newList), true);
newList.scrollTop = scroll;
list.parentNode.replaceChild(newList, list);
list.scrollTop = list.previousScroll;
if (http.callbackData) {
var selectedNodesId = http.callbackData;
@@ -533,11 +567,11 @@ function calendarDisplayCallback(http) {
scrollDayView(hour);
contentView = $("daysView");
}
var appointments = document.getElementsByClassName("appointment", contentView);
for (var i = 0; i < appointments.length; i++) {
Event.observe(appointments[i], "mousedown", listRowMouseDownHandler);
Event.observe(appointments[i], "click", onCalendarSelectAppointment.bindAsEventListener(appointments[i]));
Event.observe(appointments[i], "dblclick", displayAppointment.bindAsEventListener(appointments[i]));
var events = document.getElementsByClassName("event", contentView);
for (var i = 0; i < events.length; i++) {
Event.observe(events[i], "mousedown", listRowMouseDownHandler);
Event.observe(events[i], "click", onCalendarSelectEvent.bindAsEventListener(events[i]));
Event.observe(events[i], "dblclick", displayEvent.bindAsEventListener(events[i]));
}
var days = document.getElementsByClassName("day", contentView);
if (currentView == "monthview")
@@ -578,27 +612,27 @@ function popupCalendar(node) {
return false;
}
function onAppointmentContextMenu(event, element) {
var topNode = $("appointmentsList");
function onEventContextMenu(event) {
var topNode = $("eventsList");
// log(topNode);
var menu = $("appointmentsListMenu");
var menu = $("eventsListMenu");
Event.observe(menu, "hideMenu", onAppointmentContextMenuHide);
popupMenu(event, "appointmentsListMenu", element);
Event.observe(menu, "hideMenu", onEventContextMenuHide);
popupMenu(event, "eventsListMenu", this);
var topNode = $("appointmentsList");
var topNode = $("eventsList");
var selectedNodes = topNode.getSelectedRows();
topNode.menuSelectedRows = selectedNodes;
for (var i = 0; i < selectedNodes.length; i++)
selectedNodes[i].deselect();
topNode.menuSelectedEntry = element;
element.select();
topNode.menuSelectedEntry = this;
this.select();
}
function onAppointmentContextMenuHide(event) {
var topNode = $("appointmentsList");
function onEventContextMenuHide(event) {
var topNode = $("eventsList");
if (topNode.menuSelectedEntry) {
topNode.menuSelectedEntry.deselect();
@@ -614,7 +648,7 @@ function onAppointmentContextMenuHide(event) {
}
}
function onAppointmentsSelectionChange() {
function onEventsSelectionChange() {
listOfSelection = this;
this.removeClassName("_unfocused");
$("tasksList").addClassName("_unfocused");
@@ -623,17 +657,21 @@ function onAppointmentsSelectionChange() {
function onTasksSelectionChange() {
listOfSelection = this;
this.removeClassName("_unfocused");
$("appointmentsList").addClassName("_unfocused");
$("eventsList").addClassName("_unfocused");
}
function _loadAppointmentHref(href) {
if (document.appointmentsListAjaxRequest) {
document.appointmentsListAjaxRequest.aborted = true;
document.appointmentsListAjaxRequest.abort();
function _loadEventHref(href) {
if (document.eventsListAjaxRequest) {
document.eventsListAjaxRequest.aborted = true;
document.eventsListAjaxRequest.abort();
}
var url = ApplicationBaseURL + href;
document.appointmentsListAjaxRequest
= triggerAjaxRequest(url, appointmentsListCallback, href);
document.eventsListAjaxRequest
= triggerAjaxRequest(url, eventsListCallback, href);
var table = $("eventsList").tBodies[0];
while (table.rows.length > 1)
table.removeChild(table.rows[1]);
return false;
}
@@ -645,33 +683,42 @@ function _loadTasksHref(href) {
}
url = ApplicationBaseURL + href;
var selectedIds = $("tasksList").getSelectedNodesId();
var tasksList = $("tasksList");
var selectedIds;
if (tasksList)
selectedIds = tasksList.getSelectedNodesId();
else
selectedIds = null;
document.tasksListAjaxRequest
= triggerAjaxRequest(url, tasksListCallback, selectedIds);
tasksList.previousScroll = tasksList.scrollTop;
while (tasksList.childNodes.length)
tasksList.removeChild(tasksList.childNodes[0]);
return true;
}
function onHeaderClick(event) {
// log("onHeaderClick: " + this.link);
_loadAppointmentHref(this.link);
_loadEventHref(this.link);
preventDefault(event);
}
function refreshAppointments() {
return _loadAppointmentHref("aptlist?desc=" + sortOrder
+ "&sort=" + sortKey
+ "&day=" + currentDay
+ "&filterpopup=" + listFilter);
function refreshEvents() {
return _loadEventHref("eventslist?desc=" + sortOrder
+ "&sort=" + sortKey
+ "&day=" + currentDay
+ "&filterpopup=" + listFilter);
}
function refreshTasks() {
return _loadTasksHref("taskslist?show-completed=" + showCompletedTasks);
}
function refreshAppointmentsAndDisplay() {
refreshAppointments();
function refreshEventsAndDisplay() {
refreshEvents();
changeCalendarDisplay();
}
@@ -681,10 +728,10 @@ function onListFilterChange() {
listFilter = node.value;
// log ("listFilter = " + listFilter);
return refreshAppointments();
return refreshEvents();
}
function onAppointmentClick(event) {
function onEventClick(event) {
var target = getTarget(event);
var node = target.getParentWithTagName("tr");
var day = node.getAttribute("day");
@@ -771,8 +818,8 @@ function onSearchFormSubmit() {
return false;
}
function onCalendarSelectAppointment() {
var list = $("appointmentsList");
function onCalendarSelectEvent() {
var list = $("eventsList");
list.deselectAll();
var aptCName = this.getAttribute("aptCName");
@@ -809,7 +856,7 @@ function onCalendarSelectDay(event) {
}
if (needRefresh)
refreshAppointments();
refreshEvents();
}
function changeWeekCalendarDisplayOfSelectedDay(node) {
@@ -849,15 +896,15 @@ function changeMonthCalendarDisplayOfSelectedDay(node) {
node.addClassName("selectedDay");
}
function onShowCompletedTasks(node) {
showCompletedTasks = (node.checked ? 1 : 0);
function onShowCompletedTasks(event) {
showCompletedTasks = (this.checked ? 1 : 0);
return refreshTasks();
return refreshTasks();
}
function updateTaskStatus(event) {
var taskId = this.parentNode.getAttribute("id");
var taskOwner = this.parentNode.getAttribute("owner");
var taskOwner = this.parentNode.owner;
var newStatus = (this.checked ? 1 : 0);
var http = createHTTPClient();
@@ -917,7 +964,7 @@ function updateCalendarStatus(event) {
}
else {
updateCalendarsList();
refreshAppointments();
refreshEvents();
refreshTasks();
changeCalendarDisplay();
}
@@ -930,7 +977,7 @@ function calendarStatusCallback(http) {
if (http.status == 204 ||
(isSafari() && typeof(http.status) == 'undefined') ||
http.status == 1223) {
refreshAppointments();
refreshEvents();
refreshTasks();
changeCalendarDispla4y();
}
@@ -1022,7 +1069,7 @@ function getMenus() {
dateMenu.push(onYearMenuItemClick);
menus["yearListMenu"] = dateMenu;
menus["appointmentsListMenu"] = new Array(onMenuNewEventClick, "-",
menus["eventsListMenu"] = new Array(onMenuNewEventClick, "-",
onMenuNewTaskClick,
editEvent, deleteEvent, "-",
onSelectAll, "-",
@@ -1058,7 +1105,7 @@ function configureDragHandles() {
handle = $("rightDragHandle");
if (handle) {
handle.addInterface(SOGoDragHandlesInterface);
handle.upperBlock=$("appointmentsListView");
handle.upperBlock=$("eventsListView");
handle.lowerBlock=$("calendarView");
}
}
@@ -1166,10 +1213,30 @@ function configureSearchField() {
Event.observe(searchValue, "keydown", onSearchKeyDown.bindAsEventListener(searchValue));
}
function configureLists() {
var list = $("tasksList");
list.multiselect = true;
Event.observe(list, "mousedown",
onTasksSelectionChange.bindAsEventListener(list));
var input = $("showHideCompletedTasks");
Event.observe(input, "change",
onShowCompletedTasks.bindAsEventListener(input));
list = $("eventsList");
list.multiselect = true;
Event.observe(list, "mousedown",
onEventsSelectionChange.bindAsEventListener(list));
var div = list.parentNode;
Event.observe(div, "contextmenu",
onEventContextMenu.bindAsEventListener(div));
}
function initCalendars() {
if (!document.body.hasClassName("popup")) {
initCalendarSelector();
configureSearchField();
configureLists();
var selector = $("calendarSelector");
if (selector)
selector.attachMenu("calendarsMenu");
+4
View File
@@ -387,6 +387,7 @@ td.tbtv_actcell
padding-left: 4px;
padding-right: 4px; }
TD.headerCell,
TD.tbtv_headercell,
TD.tbtv_navcell
{ background-color: #d4d0c8;
@@ -397,12 +398,14 @@ TD.tbtv_navcell
-moz-border-bottom-colors: #000 #9c9a94 transparent;
-moz-border-right-colors: #000 #9c9a94 transparent; }
TD.headerCell:active,
TD.tbtv_headercell:active
{ background-color: #DCDAD5;
border: 1px solid #9c9a94;
-moz-border-bottom-colors: #9c9a94;
-moz-border-right-colors: #9c9a94; }
TD.headerCell SPAN,
td.tbtv_headercell SPAN
{ float: left;
width: 100%; }
@@ -422,6 +425,7 @@ td.tbtv_headercell a:hover
/* background-color: #C4C0B8; */
}
TD.headerCell IMG.tbtv_sortcell,
td.tbtv_headercell img.tbtv_sortcell
{ float: right;
text-align: right;
+12 -8
View File
@@ -424,9 +424,17 @@ function isNodeSelected(node) {
}
function acceptMultiSelect(node) {
var accept = ('' + node.getAttribute('multiselect')).toLowerCase();
var response = false;
var attribute = node.getAttribute('multiselect');
if (attribute) {
log("node '" + node.getAttribute("id")
+ "' is still using old-stylemultiselect!");
response = (attribute.toLowerCase() == 'yes');
}
else
response = node.multiselect;
return (accept == 'yes');
return response;
}
function onRowClick(event) {
@@ -1170,12 +1178,8 @@ function onBodyClickContextMenu(event) {
function configureSortableTableHeaders() {
var headers = document.getElementsByClassName("sortableTableHeader");
for (var i = 0; i < headers.length; i++) {
var anchor = $(headers[i]).childNodesWithTag("a")[0];
if (!anchor.link) {
anchor.link = anchor.getAttribute("href");
anchor.href = "#";
Event.observe(anchor, "click", onHeaderClick.bindAsEventListener(anchor), true);
}
var header = headers[i];
Event.observe(header, "click", onHeaderClick.bindAsEventListener(header));
}
}