From: znek Date: Thu, 16 Dec 2004 19:52:40 +0000 (+0000) Subject: Schedule view and associated functionality, work in progress X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f5fe5f14c903b343a2d96af6ccba1111cbfacc21;p=scalable-opengroupware.org Schedule view and associated functionality, work in progress git-svn-id: http://svn.opengroupware.org/SOGo/trunk@477 d1b88da0-ebda-0310-925b-ed51d893ca5b --- diff --git a/OGoContentStore/ChangeLog b/OGoContentStore/ChangeLog index a49c40a7..fe5320fa 100644 --- a/OGoContentStore/ChangeLog +++ b/OGoContentStore/ChangeLog @@ -1,3 +1,13 @@ +2004-12-15 Marcus Mueller + + * OCSiCalFieldExtractor.m: partmails + cn's are concatenated by '\n' + now - this directly eliminates any ambiguities. Also, instead of + using 'email' for partmails and orgmail, the extractor uses the + 'rfc822Email' value which strips away any preceeding 'mailto:' + prefix, compacting the representation and speeding up comparison. + Also, "iscycle", "isallday" and "isopaque" are now provided by + NGiCal and thus always extracted (v0.9.17) + 2004-12-13 Marcus Mueller * sql/generate-folderinfo-sql-for-user.sh: fixed critical error in diff --git a/OGoContentStore/OCSiCalFieldExtractor.m b/OGoContentStore/OCSiCalFieldExtractor.m index 81f76f17..c1b9492f 100644 --- a/OGoContentStore/OCSiCalFieldExtractor.m +++ b/OGoContentStore/OCSiCalFieldExtractor.m @@ -86,13 +86,11 @@ static OCSiCalFieldExtractor *extractor = nil; status = [[_event status] uppercaseString]; participants = [_event attendees]; - partmails = [participants valueForKey:@"email"]; - partmails = [partmails componentsJoinedByString:@", "]; + partmails = [participants valueForKey:@"rfc822Email"]; + partmails = [partmails componentsJoinedByString:@"\n"]; participants = [participants valueForKey:@"cn"]; - participants = [participants componentsJoinedByString:@", "]; + participants = [participants componentsJoinedByString:@"\n"]; - // TODO: cyclic/allday (not supported by NGiCal) - /* build row */ row = [NSMutableDictionary dictionaryWithCapacity:8]; @@ -101,7 +99,14 @@ static OCSiCalFieldExtractor *extractor = nil; [row setObject:uid forKey:@"uid"]; else [self logWithFormat:@"WARNING: could not extract a uid from event!"]; - + + [row setObject:[NSNumber numberWithBool:[_event isAllDay]] + forKey:@"isallday"]; + [row setObject:[NSNumber numberWithBool:[_event isRecurrent]] + forKey:@"iscycle"]; + [row setObject:[NSNumber numberWithBool:[_event isOpaque]] + forKey:@"isopaque"]; + if ([title isNotNull]) [row setObject:title forKey:@"title"]; if ([location isNotNull]) [row setObject:location forKey:@"location"]; if ([sequence isNotNull]) [row setObject:sequence forKey:@"sequence"]; @@ -137,14 +142,11 @@ static OCSiCalFieldExtractor *extractor = nil; [row setObject:[NSNumber numberWithBool:YES] forKey:@"ispublic"]; } - // TODO: fix transparency when it's supported in iCalEvent - [row setObject:[NSNumber numberWithBool:NO] forKey:@"isopaque"]; - organizer = [_event organizer]; if (organizer) { NSString *email; - email = [organizer valueForKey:@"email"]; + email = [organizer valueForKey:@"rfc822Email"]; if (email) [row setObject:email forKey:@"orgmail"]; } diff --git a/OGoContentStore/Version b/OGoContentStore/Version index c585d0f5..f4834424 100644 --- a/OGoContentStore/Version +++ b/OGoContentStore/Version @@ -2,8 +2,9 @@ MAJOR_VERSION=0 MINOR_VERSION=9 -SUBMINOR_VERSION:=16 +SUBMINOR_VERSION:=17 +# v0.9.17 requires libNGiCal v4.5.37 # v0.9.11 requires libFoundation v1.0.63 # v0.9.11 requires libNGExtensions v4.3.125 # v0.9.7 requires libGDLAccess v1.1.35 diff --git a/SOGo/Main/ChangeLog b/SOGo/Main/ChangeLog index 3df83e9f..ab345bcf 100644 --- a/SOGo/Main/ChangeLog +++ b/SOGo/Main/ChangeLog @@ -1,3 +1,8 @@ +2004-12-15 Marcus Mueller + + * SOGoUserHomePage.m: added defaultAction to redirect to + "Calendar/" (v0.9.17) + 2004-12-08 Marcus Mueller * SOGoProductLoader.m, sogod.m: changed to use NGLogging (v0.9.16) diff --git a/SOGo/Main/SOGoUserHomePage.m b/SOGo/Main/SOGoUserHomePage.m index 941e2a29..6b6a5d64 100644 --- a/SOGo/Main/SOGoUserHomePage.m +++ b/SOGo/Main/SOGoUserHomePage.m @@ -91,4 +91,10 @@ return [self relativePathToUserFolderSubPath:@"Mail/"]; } +/* actions */ + +- (id)defaultAction { + return [self redirectToLocation:[self relativeCalendarPath]]; +} + @end /* SOGoUserHomePage */ diff --git a/SOGo/Main/Version b/SOGo/Main/Version index 3b517c7b..83dc5440 100644 --- a/SOGo/Main/Version +++ b/SOGo/Main/Version @@ -1,5 +1,5 @@ # $Id$ -SUBMINOR_VERSION:=16 +SUBMINOR_VERSION:=17 # v0.9.16 requires NGExtensions v4.5.136 diff --git a/SOGo/SOGo.xcode/project.pbxproj b/SOGo/SOGo.xcode/project.pbxproj index 9c9dbfaa..3ea15f34 100644 --- a/SOGo/SOGo.xcode/project.pbxproj +++ b/SOGo/SOGo.xcode/project.pbxproj @@ -1469,6 +1469,33 @@ refType = 4; sourceTree = ""; }; + AD7BA88A0770A62B008F4F3D = { + children = ( + AD7BA88D0770A67D008F4F3D, + AD7BA88C0770A67D008F4F3D, + ); + isa = PBXGroup; + name = News; + refType = 4; + sourceTree = ""; + }; + AD7BA88C0770A67D008F4F3D = { + fileEncoding = 4; + isa = PBXFileReference; + lastKnownFileType = text.xml; + path = UIxCalScheduleOverview.wox; + refType = 4; + sourceTree = ""; + }; + AD7BA88D0770A67D008F4F3D = { + fileEncoding = 5; + indentWidth = 2; + isa = PBXFileReference; + lastKnownFileType = sourcecode.c.objc; + path = UIxCalScheduleOverview.m; + refType = 4; + sourceTree = ""; + }; AD88394906EF807D00981A3E = { fileEncoding = 5; indentWidth = 2; @@ -4241,6 +4268,7 @@ E87208FF0692E3D30099CBBD, E87209040692E3D30099CBBD, E87209050692E3D30099CBBD, + AD7BA88A0770A62B008F4F3D, AD0137A406DF8875000910D8, AD73BEE206CFA17700226A2D, ADE2C28F06B7C7EA0065D56F, diff --git a/SOGo/SoObjects/Appointments/SOGoAppointmentFolder.m b/SOGo/SoObjects/Appointments/SOGoAppointmentFolder.m index 6a79ba32..a5371bff 100644 --- a/SOGo/SoObjects/Appointments/SOGoAppointmentFolder.m +++ b/SOGo/SoObjects/Appointments/SOGoAppointmentFolder.m @@ -179,7 +179,7 @@ static NSTimeZone *MET = nil; to:(NSCalendarDate *)_endDate { EOQualifier *qualifier; - NSArray *fields, *records; + NSArray *records; NSString *sql; if (_folder == nil) { @@ -444,8 +444,8 @@ static NSTimeZone *MET = nil; uri = [[_ctx request] uri]; if (![uri hasSuffix:@"/"]) uri = [uri stringByAppendingString:@"/"]; - uri = [uri stringByAppendingString:@"weekoverview"]; - + uri = [uri stringByAppendingString:@"schedule"]; + r = [_ctx response]; [r setStatus:302 /* moved */]; [r setHeader:uri forKey:@"location"]; diff --git a/SOGo/SoObjects/Appointments/Version b/SOGo/SoObjects/Appointments/Version index 3fe6c413..63f19036 100644 --- a/SOGo/SoObjects/Appointments/Version +++ b/SOGo/SoObjects/Appointments/Version @@ -1,6 +1,6 @@ # Version file -SUBMINOR_VERSION:=20 +SUBMINOR_VERSION:=22 # v0.9.19 requires NGiCal v4.5.36 # v0.9.13 requires libSOGo v0.9.26 diff --git a/SOGo/SoObjects/ChangeLog b/SOGo/SoObjects/ChangeLog index 8f7cb0ea..9818b304 100644 --- a/SOGo/SoObjects/ChangeLog +++ b/SOGo/SoObjects/ChangeLog @@ -1,5 +1,10 @@ 2004-12-15 Marcus Mueller + * Appointments/SOGoAppointmentFolder.m: default redirect is now + "schedule" instead of "weekoverview" (0.9.22) + + * Appointments/SOGoAppointmentFolder.m: cleanup (v0.9.21) + * Appointments/SOGoAppointmentFolder.m: compile fix (v0.9.20) 2004-12-13 Marcus Mueller diff --git a/SOGo/UI/Common/ChangeLog b/SOGo/UI/Common/ChangeLog index 50966c62..cce2575a 100644 --- a/SOGo/UI/Common/ChangeLog +++ b/SOGo/UI/Common/ChangeLog @@ -1,3 +1,7 @@ +2004-12-16 Marcus Mueller + + * calendar.css: added CSS for "Schedule" (v0.9.31) + 2004-12-09 Marcus Mueller * UIxPageFrame.[wox,m]: added -ownerInContext debug info (v0.9.30) diff --git a/SOGo/UI/Common/Version b/SOGo/UI/Common/Version index cd3c0f2b..d6d5bf5b 100644 --- a/SOGo/UI/Common/Version +++ b/SOGo/UI/Common/Version @@ -1,5 +1,5 @@ # Version file -SUBMINOR_VERSION:=30 +SUBMINOR_VERSION:=31 # v0.9.28 requires NGExtensions v4.5.136 diff --git a/SOGo/UI/Common/calendar.css b/SOGo/UI/Common/calendar.css index b3dda7eb..81ea3a6b 100644 --- a/SOGo/UI/Common/calendar.css +++ b/SOGo/UI/Common/calendar.css @@ -33,6 +33,48 @@ } +/* schedule */ + +.schedoverview { + font-family: Arial, Helvetica, Verdana, Geneva, Tahoma, sans-serif; + letter-spacing: 0pt; + font-size: 10pt; +} + +th.schedoverview_title { + font-size: 10pt; + font-weight: bold; + text-align: left; + background-color: #e8e8e0; + vertical-align: top; +} + +th.schedoverview { + font-size: 10pt; + font-weight: bold; + text-align: left; + vertical-align: top; +} + +td.schedoverview { + font-size: 10pt; + text-align: left; + vertical-align: top; +} + +.schedoverview a { + color: #000000; + font-family: Arial, Helvetica, Verdana, Geneva, Tahoma, sans-serif; + font-size: 10pt; + letter-spacing: 0pt; + padding: 0px; + text-decoration: none; +} +.schedoverview a:hover { + text-decoration: underline; +} + + /* day overview */ .dayoverview_content { diff --git a/SOGo/UI/Scheduler/ChangeLog b/SOGo/UI/Scheduler/ChangeLog index 3c8e469e..1284cce4 100644 --- a/SOGo/UI/Scheduler/ChangeLog +++ b/SOGo/UI/Scheduler/ChangeLog @@ -1,4 +1,25 @@ -2004-12-15 Marcus Mueller +2004-12-16 Marcus Mueller + + * v0.9.103 + + * UIxCalScheduleOverview.[wox,m]: the entry point for agenor, + presenting the upcoming schedule to users. This is still incomplete, + but nevertheless functional. + + * English.lproj/default.strings: new localizations for the schedule + view. + + * product.plist: added new actions and schedule view + + * UIxCalSelectTab.[wox,m]: added new "Schedule" tab + + * UIxAppointmentEditor.m: default participants are selected from + current calendarUIDs - that is, if you've selected multiple calendars + and then create a new appointment, all currently viewed calendar + owners are added to the new appointment as default participants. + + * UIxAppointmentView.m: added "accept" and "reject" actions - no + function yet. * UIxAppointmentProposal.m: compile fix (v0.9.102) diff --git a/SOGo/UI/Scheduler/English.lproj/default.strings b/SOGo/UI/Scheduler/English.lproj/default.strings index a70917af..fca12bbe 100644 --- a/SOGo/UI/Scheduler/English.lproj/default.strings +++ b/SOGo/UI/Scheduler/English.lproj/default.strings @@ -73,7 +73,7 @@ /* Misc */ "OpenGroupware.org" = "OpenGroupware.org"; - +"Forbidden" = "Forbidden"; /* Button titles */ @@ -86,6 +86,18 @@ "Cancel" = "Cancel"; +/* Schedule */ + +"Schedule" = "Schedule"; +"No appointments found" = "You don't have any appointments in the near future."; +"Meetings proposed by you" = "Meetings proposed by you"; +"Meetings proposed to you" = "Meetings proposed to you"; +"sched_startDateFormat" = "%d.%m. %H:%M"; +"action" = "Actions"; +"accept" = "Accept"; +"reject" = "Reject"; + + /* Appointments */ "Appointment viewer" = "Appointment Viewer"; diff --git a/SOGo/UI/Scheduler/GNUmakefile b/SOGo/UI/Scheduler/GNUmakefile index 090c1911..ffd914f7 100644 --- a/SOGo/UI/Scheduler/GNUmakefile +++ b/SOGo/UI/Scheduler/GNUmakefile @@ -47,6 +47,7 @@ SchedulerUI_OBJC_FILES = \ UIxTimeSelector.m \ UIxTimeDateControl.m \ UIxCalInlineAptView.m \ + UIxCalScheduleOverview.m \ SchedulerUI_RESOURCE_FILES += \ Version \ @@ -79,6 +80,7 @@ SchedulerUI_RESOURCE_FILES += \ UIxTimeSelector.wox \ UIxTimeDateControl.wox \ UIxCalInlineAptView.wox \ + UIxCalScheduleOverview.wox \ SchedulerUI_RESOURCE_FILES += \ images/next_week.gif \ diff --git a/SOGo/UI/Scheduler/UIxAppointmentEditor.m b/SOGo/UI/Scheduler/UIxAppointmentEditor.m index cb7bb3b3..f595fa67 100644 --- a/SOGo/UI/Scheduler/UIxAppointmentEditor.m +++ b/SOGo/UI/Scheduler/UIxAppointmentEditor.m @@ -429,7 +429,7 @@ Update: remember that there are group folders as well. */ NSString *uri, *objectId, *method; - + objectId = [NSClassFromString(@"SOGoAppointmentFolder") globallyUniqueObjectId]; if ([objectId length] == 0) { @@ -440,6 +440,29 @@ method = [NSString stringWithFormat:@"Calendar/%@/edit", objectId]; method = [[self userFolderPath] stringByAppendingPathComponent:method]; + /* add all current calendarUIDs as default participants */ + if ([[self clientObject] respondsToSelector:@selector(calendarUIDs)]) { + AgenorUserManager *um; + NSArray *uids; + NSMutableArray *emails; + NSString *ps; + unsigned i, count; + + um = [AgenorUserManager sharedUserManager]; + uids = [[self clientObject] calendarUIDs]; + count = [uids count]; + emails = [NSMutableArray arrayWithCapacity:count]; + + for (i = 0; i < count; i++) { + NSString *email; + + email = [um getEmailForUID:[uids objectAtIndex:i]]; + if (email) + [emails addObject:email]; + } + ps = [emails componentsJoinedByString:@","]; + [self setQueryParameter:ps forKey:@"ps"]; + } uri = [self completeHrefForMethod:method]; return [self redirectToLocation:uri]; } diff --git a/SOGo/UI/Scheduler/UIxAppointmentView.m b/SOGo/UI/Scheduler/UIxAppointmentView.m index 9346d774..44f9b9b1 100644 --- a/SOGo/UI/Scheduler/UIxAppointmentView.m +++ b/SOGo/UI/Scheduler/UIxAppointmentView.m @@ -214,4 +214,20 @@ return [self redirectToLocation:url]; } +- (id)acceptAction { + if ([self appointment] == nil) { + return [NSException exceptionWithHTTPStatus:404 + reason:@"could not locate appointment"]; + } + return self; +} + +- (id)rejectAction { + if ([self appointment] == nil) { + return [NSException exceptionWithHTTPStatus:404 + reason:@"could not locate appointment"]; + } + return self; +} + @end /* UIxAppointmentView */ diff --git a/SOGo/UI/Scheduler/UIxCalScheduleOverview.m b/SOGo/UI/Scheduler/UIxCalScheduleOverview.m new file mode 100644 index 00000000..2736ba93 --- /dev/null +++ b/SOGo/UI/Scheduler/UIxCalScheduleOverview.m @@ -0,0 +1,196 @@ +/* + Copyright (C) 2004 SKYRIX Software AG + + This file is part of OpenGroupware.org + + OGo is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + OGo 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 Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with OGo; see the file COPYING. If not, write to the + Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + */ + +#include + +@class NSMutableArray; + +@interface UIxCalScheduleOverview : UIxComponent +{ + NSMutableArray *userApts; + NSMutableArray *foreignApts; + id item; +} + +- (NSCalendarDate *)startDate; +- (NSCalendarDate *)endDate; + +- (NSArray *)userAppointments; +- (NSArray *)foreignAppointments; + +- (BOOL)hasUserAppointments; +- (BOOL)hasForeignAppointments; +- (BOOL)hasAnyAppointments; + +- (void)fetchInfos; + +- (NSString *)appointmentBaseURL; + +@end + +#include +#include "UIxComponent+Agenor.h" +#include "SoObjects/Appointments/SOGoAppointmentFolder.h" +#include "common.h" + +@implementation UIxCalScheduleOverview + +- (void)dealloc { + [self->userApts release]; + [self->foreignApts release]; + [self->item release]; + [super dealloc]; +} + + +/* accessors */ + +- (void)setItem:(id)_item { + ASSIGN(self->item, _item); +} +- (id)item { + return self->item; +} + +- (BOOL)hasUserAppointments { + return [[self userAppointments] count] > 0; +} +- (BOOL)hasForeignAppointments { + return [[self foreignAppointments] count] > 0; +} +- (BOOL)hasAnyAppointments { + return ([self hasUserAppointments] || + [self hasForeignAppointments]) ? YES : NO; +} + +- (NSString *)participants { + NSString *s; + + s = [self->item valueForKey:@"participants"]; + if (!s) + return @""; + if ([s length] > 100) + s = [NSString stringWithFormat:@"%@...", [s substringToIndex:100]]; + return s; +} + + +/* fetching */ + +- (NSCalendarDate *)startDate { + return [[NSCalendarDate date] beginOfDay]; +} + +/* ZNeK: is a month ok? */ +- (NSCalendarDate *)endDate { + NSCalendarDate *date; + + date = [NSCalendarDate date]; + date = [date dateByAddingYears:0 months:1 days:0 + hours:0 minutes:0 seconds:0]; + date = [date endOfDay]; + return date; +} + +- (NSArray *)userAppointments { + if (!self->userApts) { + [self fetchInfos]; + } + return self->userApts; +} + +- (NSArray *)foreignAppointments { + if (!self->foreignApts) { + [self fetchInfos]; + } + return self->foreignApts; +} + +- (void)fetchInfos { + static NSArray *orders = nil; + id aptFolder; + NSArray *apts; + NSString *userEmail; + unsigned i, count; + + if (!orders) { + orders = [[NSArray alloc] initWithObjects:@"startDate", nil]; + } + + aptFolder = [self clientObject]; + apts = [aptFolder fetchCoreInfosFrom:[self startDate] + to:[self endDate]]; + userEmail = [self emailForUser]; + count = [apts count]; + + self->userApts = [[NSMutableArray alloc] initWithCapacity:count]; + self->foreignApts = [[NSMutableArray alloc] initWithCapacity:count]; + + for (i = 0; i < count; i++) { + id apt; + NSString *orgEmail; + + apt = [apts objectAtIndex:i]; + orgEmail = [apt objectForKey:@"orgmail"]; + if (orgEmail && [orgEmail isEqualToString:userEmail]) + [self->userApts addObject:apt]; + else + [self->foreignApts addObject:apt]; + } + [self->userApts sortedArrayUsingKeyOrderArray:orders]; + [self->foreignApts sortedArrayUsingKeyOrderArray:orders]; +} + + +/* URLs */ + +- (NSString *)appointmentBaseURL { + id pkey; + + if (![(pkey = [self->item valueForKey:@"uid"]) isNotNull]) + return nil; + + return [[self clientObject] baseURLForAptWithUID:[pkey stringValue] + inContext:[self context]]; +} +- (NSString *)appointmentViewURL { + return [[self appointmentBaseURL] stringByAppendingPathComponent:@"view"]; +} +- (NSString *)acceptAppointmentURL { + return [[self appointmentBaseURL] stringByAppendingPathComponent:@"accept"]; +} +- (NSString *)rejectAppointmentURL { + return [[self appointmentBaseURL] stringByAppendingPathComponent:@"reject"]; +} + + +/* access protection */ + +- (BOOL)canAccess { + NSString *owner; + + owner = [[self clientObject] ownerInContext:[self context]]; + if (!owner) + return NO; + return [[[[self context] activeUser] login] isEqualToString:owner]; +} + +@end diff --git a/SOGo/UI/Scheduler/UIxCalScheduleOverview.wox b/SOGo/UI/Scheduler/UIxCalScheduleOverview.wox new file mode 100644 index 00000000..3acd437f --- /dev/null +++ b/SOGo/UI/Scheduler/UIxCalScheduleOverview.wox @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + +
+ + + + + +
+ + + + - + + + + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
+ +
+ + + + + + +
+ +
+
+

+ workflow
+ ========
+ + in fact, the workflow we wish to implement is : + person A sets a meeting with B and C + when he sets it, he clicks on a button : either "propose" or + "propose and mail" (obvious) + In both case, when B and C logs into SOGo, they see, in their + 'news page', that a new meeting has beeing proposed + then by clicking on it, they can accept it + on the news, you have to show : meetings proposed to the person + logging in, meetings proposed BY the person logging in, + and their different acceptance + + if you reject the meeting, it still appears in the news page + as refused + + We have still two issues : ergonomic and functionnal + + The ergonomic one : I propose two sections in the news page, + with each being a table, containing, each line, an apt, + with title, day, hour, participants (truncated), the line + being green if it has been accepted by all, red if rejected + by someone + grey if in another state + + the functionnal : a meeting that is still not accepted by + everyone must appear in each participant's view, and be + counted in the conflict manager, or not ? + it's an open point +

+
+
+ + + +
+ + +
+
+
+
+
\ No newline at end of file diff --git a/SOGo/UI/Scheduler/UIxCalSelectTab.m b/SOGo/UI/Scheduler/UIxCalSelectTab.m index fcd77366..ea97c4a5 100644 --- a/SOGo/UI/Scheduler/UIxCalSelectTab.m +++ b/SOGo/UI/Scheduler/UIxCalSelectTab.m @@ -91,6 +91,9 @@ /* hrefs */ +- (NSString *)scheduletabLink { + return [self completeHrefForMethod:@"schedule"]; +} - (NSString *)daytabLink { return [self completeHrefForMethod:@"dayoverview"]; diff --git a/SOGo/UI/Scheduler/UIxCalSelectTab.wox b/SOGo/UI/Scheduler/UIxCalSelectTab.wox index d253e366..9b921062 100644 --- a/SOGo/UI/Scheduler/UIxCalSelectTab.wox +++ b/SOGo/UI/Scheduler/UIxCalSelectTab.wox @@ -4,12 +4,19 @@ xmlns:var="http://www.skyrix.com/od/binding" xmlns:const="http://www.skyrix.com/od/constant" xmlns:rsrc="OGo:url" + xmlns:label="OGo:label" xmlns:uix="OGo:uix" var:selection="selection" const:tabStyle="tab" const:selectedTabStyle="tab_selected" const:bodyStyle="tabview_body" > + + + diff --git a/SOGo/UI/Scheduler/product.plist b/SOGo/UI/Scheduler/product.plist index 0cf550ea..c7496614 100644 --- a/SOGo/UI/Scheduler/product.plist +++ b/SOGo/UI/Scheduler/product.plist @@ -77,6 +77,10 @@ protectedBy = "View"; pageName = "UIxCalYearOverview"; }; + schedule = { + protectedBy = "View"; + pageName = "UIxCalScheduleOverview"; + }; new = { protectedBy = "View"; pageName = "UIxAppointmentEditor"; @@ -114,6 +118,16 @@ pageName = "UIxAppointmentView"; actionName = "delete"; }; + accept = { + protectedBy = "View"; + pageName = "UIxAppointmentView"; + actionName = "accept"; + }; + reject = { + protectedBy = "View"; + pageName = "UIxAppointmentView"; + actionName = "reject"; + }; edit = { protectedBy = "View"; pageName = "UIxAppointmentEditor";