Merge to 2.0.7

maint-2.1.1
Francis Lachapelle 2013-07-19 13:46:37 -04:00
commit 885e59a2af
50 changed files with 1915 additions and 1108 deletions

View File

@ -1,5 +1,5 @@
[main] [main]
host = https://www.transifex.net host = https://www.transifex.com
[sogo.ui-mailerui] [sogo.ui-mailerui]
source_file = UI/MailerUI/English.lproj/Localizable.strings source_file = UI/MailerUI/English.lproj/Localizable.strings

209
ChangeLog
View File

@ -1,3 +1,212 @@
commit d5f76ac832912402d714dd13291c43aa9f84940f
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jul 19 13:39:18 2013 -0400
Improve CSS print media
M UI/WebServerResources/generic.css
commit 12b7fea82543c105a39854eb4bc3f9e68cc080e7
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jul 19 13:37:13 2013 -0400
Documentation - bump version to 2.0.7
M Documentation/SOGo Installation Guide.odt
M Documentation/SOGo Mobile Devices Configuration.odt
M Documentation/SOGo Mozilla Thunderbird Configuration.odt
M Documentation/SOGo Native Microsoft Outlook Configuration.odt
commit 1c82af8842ac78b70d8e40a4d78e866522adf139
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jul 19 11:29:10 2013 -0400
Updated pt_BR, cs, nl, de, pl and ru translations
M .tx/config
M NEWS
M SoObjects/Appointments/German.lproj/Localizable.strings
M UI/MainUI/Czech.lproj/Localizable.strings
M UI/MainUI/German.lproj/Localizable.strings
M UI/PreferencesUI/German.lproj/Localizable.strings
M UI/PreferencesUI/Russian.lproj/Localizable.strings
M UI/Scheduler/BrazilianPortuguese.lproj/Localizable.strings
M UI/Scheduler/Czech.lproj/Localizable.strings
M UI/Scheduler/Dutch.lproj/Localizable.strings
M UI/Scheduler/German.lproj/Localizable.strings
M UI/Scheduler/Polish.lproj/Localizable.strings
M UI/Scheduler/Russian.lproj/Localizable.strings
commit 6cef5245e10515b1199102cf2c19d48364862027
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jul 19 11:27:17 2013 -0400
Bump version to 2.0.7
M NEWS
M Version
commit 0069a4200b1d087c9d931289cd57746aaa4e23bd
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Fri Jul 19 10:43:21 2013 -0400
Handle possible jQuery error with DnD of contacts
M UI/WebServerResources/ContactsUI.js
commit e24c20c48af0e5eadcb4f8a8683bae15e22ae100
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Fri Jul 19 10:11:08 2013 -0400
Reverted patch
M SOPE/GDLContentStore/EOQualifier+GCS.m
M SOPE/GDLContentStore/GCSFolder.m
commit 256b679798404db77fa85b53df6bcf815c8e4007
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Jul 18 11:46:49 2013 -0400
Bug fix for #2366
M NEWS
M SoObjects/Mailer/SOGoMailBaseObject.m
commit b85ed0db1c1bf37d0f1ec870c8c0a88566954ec6
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jul 18 11:32:29 2013 -0400
Fix blur of active element on click on a draggable
This bug has yet to be officially part of jQuery UI, therefore this
commit updates jquery-ui to version 1.10.3 patched with commit fcd1caf:
https://github.com/jquery/jquery-ui/commit/fcd1cafac8afe3a947676ec018e844eeada5b9de
M NEWS
M UI/WebServerResources/jquery-ui.js
commit 048bae2fc510f0cdd39b07d23bb23cf492001921
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Jul 18 10:52:37 2013 -0400
Applied patch from bug #2235
M SOPE/GDLContentStore/EOQualifier+GCS.m
M SOPE/GDLContentStore/GCSFolder.m
commit 19e542396bc32debab6f53b229166c57d05e4599
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Jul 18 10:25:39 2013 -0400
Applied patch from bug #2360
M UI/MailPartViewers/GNUmakefile
M UI/MailPartViewers/GNUmakefile.preamble
M UI/MailerUI/GNUmakefile
commit 249a1fcf14f80e1f7a612ae9faa710488e716140
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Wed Jul 17 14:57:07 2013 -0400
Bubble box of event should not overlap event cell
M NEWS
M UI/WebServerResources/SchedulerUI.js
commit 7dad5ad84ed5a59409ce7f0083e750ac079beb16
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Jul 16 15:20:26 2013 -0400
Updated for v2.0.7
M NEWS
commit 16105d37b83a2632e5389407b783ef062939f9c6
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Jul 16 15:18:04 2013 -0400
Properly handle RFC2231 everywhere
M SoObjects/Mailer/GNUmakefile
A SoObjects/Mailer/NSDictionary+Mail.h
A SoObjects/Mailer/NSDictionary+Mail.m
M SoObjects/Mailer/SOGoMailBodyPart.m
M SoObjects/Mailer/SOGoMailObject+Draft.m
M UI/MailPartViewers/UIxMailPartViewer.m
commit e08ebd2390ad81bcf7d63c200de85eddbf80bcd6
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Tue Jul 16 11:31:08 2013 -0400
Fix for bugs #2368 and #2369
M SoObjects/Appointments/SOGoAptMailNotification.m
M UI/MailPartViewers/UIxMailPartICalViewer.m
M UI/MailerUI/UIxMailListActions.m
M UI/Templates/Appointments/SOGoAptMailInvitation.wox
M UI/WebServerResources/SchedulerUI.js
commit 03553980fd2abb2da397c0810fd8f6d70ba26d65
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jul 11 13:55:03 2013 -0400
Update NEWS file and add missing image
M NEWS
A UI/WebServerResources/collapse.png
commit 33fd60efb335b180938492eddb75ab59591d4153
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jul 11 13:50:44 2013 -0400
Calendar: print gridlines to 15-minute intervals
M UI/Templates/SchedulerUI/UIxCalDayTable.wox
M UI/WebServerResources/SchedulerUI.css
M UI/WebServerResources/SchedulerUIDnD.js
commit b8e2255a071dcb2fd2172a73e95d38600d41c1bf
Author: Francis Lachapelle <flachapelle@inverse.ca>
Date: Thu Jul 11 13:46:38 2013 -0400
Set the events/tasks list collapsable
M UI/Scheduler/UIxCalMainView.m
M UI/Scheduler/UIxCalView.m
M UI/Scheduler/product.plist
M UI/Templates/SchedulerUI/UIxCalDayView.wox
M UI/Templates/SchedulerUI/UIxCalMainView.wox
M UI/Templates/SchedulerUI/UIxCalMonthView.wox
M UI/Templates/SchedulerUI/UIxCalWeekView.wox
M UI/WebServerResources/SOGoTabsController.js
M UI/WebServerResources/SchedulerUI.css
M UI/WebServerResources/SchedulerUI.js
commit e687dbf155963e1931fd2f7ac58bd2f4cf862dca
Author: Ludovic Marcotte <lmarcotte@inverse.ca>
Date: Thu Jul 4 13:11:02 2013 -0400
If the organizer's name is non-existent, use the email address
M UI/Scheduler/UIxComponentEditor.m
commit f42d52743df169d6bfdc58428e920dd6208a1879
Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jun 27 11:35:17 2013 -0400
bump version to 2.0.6b
M Version
commit 70cd64a626470e0c07ac0f8cb7119cab6e763bfa
Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jun 27 11:34:06 2013 -0400
Update ChangeLog
M ChangeLog
commit 4359b05da8ba291b9bbc00e330d65575a4dbb253 commit 4359b05da8ba291b9bbc00e330d65575a4dbb253
Author: Jean Raby <jraby@inverse.ca> Author: Jean Raby <jraby@inverse.ca>
Date: Thu Jun 27 11:33:44 2013 -0400 Date: Thu Jun 27 11:33:44 2013 -0400

17
NEWS
View File

@ -1,3 +1,20 @@
2.0.7 (2013-07-19)
------------------
New features
- print gridlines of calendar in 15-minute intervals
- allow the events/tasks lists to be collapsable
Enhancements
- bubble box of events no longer overlaps the current event
- now pass the x-originating-ip using the IMAP ID extension (#2366)
- updated BrazilianPortuguese, Czech, Dutch, German, Polish and Russian translations
Bug fixes
- properly handle RFC2231 everywhere
- fixed minor XSS issues
- fixed jquery-ui not bluring the active element when clicking on a draggable
2.0.6b (2013-06-27) 2.0.6b (2013-06-27)
------------------ ------------------

View File

@ -27,13 +27,13 @@ vtodo_class2 = "(Vertrauliche Aufgabe)";
/* Invitation */ /* Invitation */
"Event Invitation: \"%{Summary}\"" = "Termineinladung: \"%{Summary}\""; "Event Invitation: \"%{Summary}\"" = "Termineinladung: \"%{Summary}\"";
"(sent by %{SentBy}) " = "(gesendet von %{SentBy}) "; "(sent by %{SentBy}) " = "(gesendet von %{SentBy}) ";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText} Hat Sie eingeladen zu %{Summary}.\n\nBeginn: %{StartDate}\nEnde: %{EndDate}\nBeschreibung: %{Description}"; "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" = "%{Organizer} %{SentByText} Hat Sie eingeladen zu \"%{Summary}\".\n\nBeginn: %{StartDate}\nEnde: %{EndDate}\nBeschreibung: %{Description}";
"%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText} hat Sie eingeladen zu \"%{Summary}\".\n\nBeginn: %{StartDate} um %{StartTime}\nEnde: %{EndDate} um %{EndTime}\nBeschreibung: %{Description}"; "%{Organizer} %{SentByText}has invited you to %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" = "%{Organizer} %{SentByText} hat Sie eingeladen zu \"%{Summary}\".\n\nBeginn: %{StartDate} um %{StartTime}\nEnde: %{EndDate} um %{EndTime}\nBeschreibung: %{Description}";
/* Deletion */ /* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Termin abgesagt: \"%{Summary}\""; "Event Cancelled: \"%{Summary}\"" = "Termin abgesagt: \"%{Summary}\"";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}" "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate}\nEnd: %{EndDate}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} hat den folgenden Termin abgesagt: %{Summary}.\n\nBeginn: %{StartDate}\nEnde: %{EndDate}\nBeschreibung: %{Description}"; = "%{Organizer} %{SentByText} hat den folgenden Termin abgesagt: \"%{Summary}\".\n\nBeginn: %{StartDate}\nEnde: %{EndDate}\nBeschreibung: %{Description}";
"%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}" "%{Organizer} %{SentByText}has cancelled this event: %{Summary}.\n\nStart: %{StartDate} at %{StartTime}\nEnd: %{EndDate} at %{EndTime}\nDescription: %{Description}"
= "%{Organizer} %{SentByText} hat diesen Termin abgesagt: \"%{Summary}\".\n\nBeginn: %{StartDate} um %{StartTime}\nEnde: %{EndDate} um %{EndTime}\nBeschreibung: %{Description}"; = "%{Organizer} %{SentByText} hat diesen Termin abgesagt: \"%{Summary}\".\n\nBeginn: %{StartDate} um %{StartTime}\nEnde: %{EndDate} um %{EndTime}\nBeschreibung: %{Description}";
@ -45,7 +45,7 @@ vtodo_class2 = "(Vertrauliche Aufgabe)";
"The following parameters have changed in the \"%{Summary}\" meeting:" "The following parameters have changed in the \"%{Summary}\" meeting:"
= "Folgendes wurde am Termin \"%{Summary}\" geändert:"; = "Folgendes wurde am Termin \"%{Summary}\" geändert:";
"Please accept or decline those changes." "Please accept or decline those changes."
= "Bitte akzeptieren Sie diese Änderung oder lehnen Sie ab."; = "Bitte akzeptieren Sie diese Änderung oder lehnen Sie diese ab.";
/* Reply */ /* Reply */
"Accepted invitation: \"%{Summary}\"" = "Einladung zugestimmt: \"%{Summary}\""; "Accepted invitation: \"%{Summary}\"" = "Einladung zugestimmt: \"%{Summary}\"";

View File

@ -140,9 +140,14 @@
return newEndDate; return newEndDate;
} }
- (NSString *) location
{
return [[apt location] stringByEscapingHTMLString];
}
- (NSString *) summary - (NSString *) summary
{ {
return [apt summary]; return [[apt summary] stringByEscapingHTMLString];
} }
- (void) setOrganizerName: (NSString *) theString - (void) setOrganizerName: (NSString *) theString

View File

@ -35,6 +35,7 @@ Mailer_OBJC_FILES += \
\ \
EOQualifier+MailDAV.m \ EOQualifier+MailDAV.m \
NSData+Mail.m \ NSData+Mail.m \
NSDictionary+Mail.m \
NSString+Mail.m \ NSString+Mail.m \
SOGoUser+Mailer.m SOGoUser+Mailer.m

View File

@ -0,0 +1,34 @@
/* NSDictionary+Mail.h - this file is part of SOGo
*
* Copyright (C) 2013 Inverse inc.
*
* 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 NSDICTIONARY_MAIL_H
#define NSDICTIONARY_MAIL_H
#import <Foundation/NSDictionary.h>
@class NSString;
@interface NSDictionary (SOGoExtension)
- (NSString *) filename;
@end
#endif /* NSDICTIONARY_MAIL_H */

View File

@ -0,0 +1,73 @@
/* NSDictionary+Mail.m - this file is part of SOGo
*
* Copyright (C) 2013 Inverse inc.
*
* 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/NSDictionary.h>
#import <Foundation/NSString.h>
#import "NSDictionary+Mail.h"
@implementation NSDictionary (SOGoExtension)
- (NSString *) filename
{
NSDictionary *parameters;
NSString *filename;
filename = [[self objectForKey: @"parameterList"]
objectForKey: @"name"];
if (!filename)
{
parameters = [[self objectForKey: @"disposition"]
objectForKey: @"parameterList"];
filename = [parameters objectForKey: @"filename"];
// We might have something like filename*=UTF-8''foobar
// See RFC2231 for details. If it was folded before, it will
// be unfolded when we get here.
if (!filename)
{
filename = [parameters objectForKey: @"filename*"];
if (filename)
{
NSRange r;
filename = [filename stringByUnescapingURL];
// We skip up to the language
r = [filename rangeOfString: @"'"];
if (r.length)
{
r = [filename rangeOfString: @"'" options: 0 range: NSMakeRange(r.location+1, [filename length]-r.location-1)];
if (r.length)
filename = [filename substringFromIndex: r.location+1];
}
}
}
}
return filename;
}
@end

View File

@ -151,6 +151,22 @@ static BOOL debugOn = YES;
newConnection = (NGImap4Connection *) [NSNull null]; newConnection = (NGImap4Connection *) [NSNull null];
[self errorWithFormat:@"Could not connect IMAP4"]; [self errorWithFormat:@"Could not connect IMAP4"];
} }
else
{
// If the server has the ID capability (RFC 2971), we set the x-originating-ip
// accordingly for the IMAP connection.
NSString *remoteHost;
remoteHost = [[context request] headerForKey: @"x-webobjects-remote-host"];
if (remoteHost)
{
if ([[[[newConnection client] capability] objectForKey: @"capability"] containsObject: @"id"])
{
[[newConnection client] processCommand: [NSString stringWithFormat: @"ID (\"x-originating-ip\" \"%@\")", remoteHost]];
}
}
}
return newConnection; return newConnection;
} }

View File

@ -38,6 +38,7 @@
#import <SoObjects/SOGo/NSDictionary+Utilities.h> #import <SoObjects/SOGo/NSDictionary+Utilities.h>
#import "NSDictionary+Mail.h"
#import "SOGoMailObject.h" #import "SOGoMailObject.h"
#import "SOGoMailManager.h" #import "SOGoMailManager.h"
@ -201,21 +202,9 @@ static BOOL debugOn = NO;
- (NSString *) filename - (NSString *) filename
{ {
NSString *filename;
NSDictionary *parameters;
[self partInfo]; [self partInfo];
filename = [[partInfo objectForKey: @"parameterList"] return [partInfo filename];
objectForKey: @"name"];
if (!filename)
{
parameters = [[partInfo objectForKey: @"disposition"]
objectForKey: @"parameterList"];
filename = [parameters objectForKey: @"filename"];
}
return filename;
} }
/* We overwrite the super's class method in order to make sure /* We overwrite the super's class method in order to make sure

View File

@ -34,6 +34,7 @@
#import <SoObjects/SOGo/SOGoUser.h> #import <SoObjects/SOGo/SOGoUser.h>
#import <SoObjects/SOGo/SOGoUserDefaults.h> #import <SoObjects/SOGo/SOGoUserDefaults.h>
#import "NSDictionary+Mail.h"
#import "NSString+Mail.h" #import "NSString+Mail.h"
#import "SOGoMailForward.h" #import "SOGoMailForward.h"
#import "SOGoMailObject+Draft.h" #import "SOGoMailObject+Draft.h"
@ -250,39 +251,10 @@
intoArray: (NSMutableArray *) keys intoArray: (NSMutableArray *) keys
withPath: (NSString *) path withPath: (NSString *) path
{ {
NSDictionary *disposition, *currentFile;
NSString *filename, *mimeType; NSString *filename, *mimeType;
NSDictionary *currentFile;
disposition = [part objectForKey: @"disposition"]; filename = [part filename];
filename = [[disposition objectForKey: @"parameterList"]
objectForKey: @"filename"];
// We might have something like filename*=UTF-8''foobar
// See RFC2231 for details. If it was folded before, it will
// be unfolded when we get here.
if (!filename)
{
filename = [[disposition objectForKey: @"parameterList"]
objectForKey: @"filename*"];
if (filename)
{
NSRange r;
filename = [filename stringByUnescapingURL];
// We skip up to the language
r = [filename rangeOfString: @"'"];
if (r.length)
{
r = [filename rangeOfString: @"'" options: 0 range: NSMakeRange(r.location+1, [filename length]-r.location-1)];
if (r.length)
filename = [filename substringFromIndex: r.location+1];
}
}
}
mimeType = [NSString stringWithFormat: @"%@/%@", mimeType = [NSString stringWithFormat: @"%@/%@",
[part objectForKey: @"type"], [part objectForKey: @"type"],

View File

@ -26,6 +26,24 @@ MailPartViewers_OBJC_FILES += \
UIxMailPartICalViewer.m \ UIxMailPartICalViewer.m \
\ \
UIxMailPartICalActions.m \ UIxMailPartICalActions.m \
../../SoObjects/Mailer/SOGoMailBodyPart.m \
../../SoObjects/Mailer/SOGoHTMLMailBodyPart.m \
../../SoObjects/Mailer/SOGoCalendarMailBodyPart.m \
../../SoObjects/Mailer/SOGoMailAccounts.m \
../../SoObjects/Mailer/SOGoMailBaseObject.m \
../../SoObjects/Mailer/SOGoMailAccount.m \
../../SoObjects/Mailer/SOGoMailNamespace.m \
../../SoObjects/Mailer/SOGoDraftsFolder.m \
../../SoObjects/Mailer/SOGoSentFolder.m \
../../SoObjects/Mailer/SOGoTrashFolder.m \
../../SoObjects/Mailer/SOGoMailFolder.m \
../../SoObjects/Mailer/SOGoDraftObject.m \
../../SoObjects/Mailer/SOGoMailObject.m \
../../SoObjects/Appointments/SOGoEMailAlarmsManager.m \
../../SoObjects/Appointments/SOGoAppointmentObject.m \
../../SoObjects/Appointments/SOGoComponentOccurence.m \
../../SoObjects/Appointments/SOGoAppointmentOccurence.m \
../../SoObjects/Appointments/SOGoCalendarComponent.m
MailPartViewers_RESOURCE_FILES += \ MailPartViewers_RESOURCE_FILES += \
product.plist \ product.plist \

View File

@ -2,3 +2,10 @@ ifeq ($(HAS_LIBRARY_ssl),yes)
ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1 ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1
BUNDLE_LIBS += -lcrypto BUNDLE_LIBS += -lcrypto
endif endif
ADDITIONAL_CPPFLAGS += \
-Wall -DCOMPILE_FOR_GSTEP_MAKE=1 \
-DUIX_MAILER_MAJOR_VERSION="@\"$(MAJOR_VERSION)\"" \
-DUIX_MAILER_MINOR_VERSION="@\"$(MINOR_VERSION)\"" \
-DUIX_MAILER_SUBMINOR_VERSION="@\"$(SUBMINOR_VERSION)\""

View File

@ -1,6 +1,7 @@
/* /*
Copyright (C) 2004-2005 SKYRIX Software AG Copyright (C) 2004-2005 SKYRIX Software AG
Copyright (C) 2006-2013 Inverse inc.
This file is part of SOGo. This file is part of SOGo.
SOGo is free software; you can redistribute it and/or modify it under SOGo is free software; you can redistribute it and/or modify it under

View File

@ -1,5 +1,5 @@
/* /*
Copyright (C) 2007-2009 Inverse inc. Copyright (C) 2007-2013 Inverse inc.
Copyright (C) 2004-2005 SKYRIX Software AG Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOGo. This file is part of SOGo.
@ -33,6 +33,7 @@
#import <SOGo/NSString+Utilities.h> #import <SOGo/NSString+Utilities.h>
#import <Mailer/NSData+Mail.h> #import <Mailer/NSData+Mail.h>
#import <Mailer/NSDictionary+Mail.h>
#import <Mailer/SOGoMailBodyPart.h> #import <Mailer/SOGoMailBodyPart.h>
#import "MailerUI/WOContext+UIxMailer.h" #import "MailerUI/WOContext+UIxMailer.h"
@ -210,22 +211,7 @@
- (NSString *) filename - (NSString *) filename
{ {
NSDictionary *parameters; return [bodyInfo filename];
NSString *filename;
filename = nil;
parameters = [bodyInfo valueForKey: @"parameterList"];
if (parameters)
filename = [parameters valueForKey: @"name"];
if (!filename)
{
parameters = [[bodyInfo valueForKey: @"disposition"]
valueForKey: @"parameterList"];
filename = [parameters valueForKey: @"filename"];
}
return filename;
} }
- (NSString *) filenameForDisplay - (NSString *) filenameForDisplay
@ -280,7 +266,7 @@
NSMutableString *filename; NSMutableString *filename;
NSString *extension; NSString *extension;
filename = [NSMutableString stringWithString: [bodyPart filename]]; filename = [self filename];
if (![filename length]) if (![filename length])
[filename appendFormat: @"%@-%@", [filename appendFormat: @"%@-%@",
[self labelForKey: @"Untitled"], [self labelForKey: @"Untitled"],
@ -323,22 +309,22 @@
NSString *mimeImageFile, *mimeImageUrl; NSString *mimeImageFile, *mimeImageUrl;
mimeImageFile = [NSString stringWithFormat: @"mime-%@-%@.png", mimeImageFile = [NSString stringWithFormat: @"mime-%@-%@.png",
[bodyInfo objectForKey: @"type"], [bodyInfo objectForKey: @"type"],
[bodyInfo objectForKey: @"subtype"]]; [bodyInfo objectForKey: @"subtype"]];
mimeImageUrl = [self urlForResourceFilename: mimeImageFile]; mimeImageUrl = [self urlForResourceFilename: mimeImageFile];
if ( [mimeImageUrl length] == 0 ) if ([mimeImageUrl length] == 0)
{ {
mimeImageFile = [NSString stringWithFormat: @"mime-%@.png", mimeImageFile = [NSString stringWithFormat: @"mime-%@.png",
[bodyInfo objectForKey: @"type"]]; [bodyInfo objectForKey: @"type"]];
mimeImageUrl = [self urlForResourceFilename: mimeImageFile]; mimeImageUrl = [self urlForResourceFilename: mimeImageFile];
} }
if ( [mimeImageUrl length] == 0 ) if ([mimeImageUrl length] == 0)
{ {
mimeImageUrl = [self urlForResourceFilename: @"mime-unknown.png"]; mimeImageUrl = [self urlForResourceFilename: @"mime-unknown.png"];
} }
return mimeImageUrl; return mimeImageUrl;
} }

View File

@ -32,6 +32,7 @@ MailerUI_OBJC_FILES += \
UIxMailWindowCloser.m \ UIxMailWindowCloser.m \
\ \
UIxMailUserRightsEditor.m \ UIxMailUserRightsEditor.m \
../MailPartViewers/UIxMailRenderingContext.m \
UIxMailUserDelegationEditor.m \ UIxMailUserDelegationEditor.m \
# UIxMailEditorAction.m \ # UIxMailEditorAction.m \
# UIxMailReplyAction.m \ # UIxMailReplyAction.m \

View File

@ -753,7 +753,7 @@
// To // To
to = [[message objectForKey: @"envelope"] to]; to = [[message objectForKey: @"envelope"] to];
if ([to count] > 0) if ([to count] > 0)
[msg addObject: [addressFormatter stringForArray: to]]; [msg addObject: [[addressFormatter stringForArray: to] stringByEscapingHTMLString]];
else else
[msg addObject: @""]; [msg addObject: @""];
@ -778,7 +778,7 @@
// From // From
from = [[message objectForKey: @"envelope"] from]; from = [[message objectForKey: @"envelope"] from];
if ([from count] > 0) if ([from count] > 0)
[msg addObject: [addressFormatter stringForArray: from]]; [msg addObject: [[addressFormatter stringForArray: from] stringByEscapingHTMLString]];
else else
[msg addObject: @""]; [msg addObject: @""];

View File

@ -44,7 +44,7 @@
"Welsh" = "Cymraeg"; "Welsh" = "Cymraeg";
"About" = "O aplikaci"; "About" = "O aplikaci";
"AboutBox" = "SOGo je plně vybavený groupwarový server vyvíjený Inverse, který je zaměřený na jednoduchost a škálovatelnost.<br/><br/>SOGo poskytuje bohaté webové prostředí založené na technologii AJAX a podporuje i mnoho kalendářových klientů pracujících se standardními protokoly CalDAV a CardDAV.<br/><br/>SOGo je distribuováno pod licencí <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPL</a> verze 2 nebo novější a některé části jsou distribuovány pod licencí GNU LGPL verze 2. Toto je svobodný software: můžete ho svobodně měnit a šířit dále. Neexistuje ŽÁDNÁ ZÁRUKA v rozsahu upraveném zákonem.<br/><br/>\nRůzné možnosti podpory naleznete na <a href=\"http://www.sogo.nu/en/support/community.html\">této stránce</a>."; "AboutBox" = "SOGo je plně vybavený groupwarový server vyvíjený Inverse, který je zaměřený na jednoduchost a škálovatelnost.<br/><br/>\nSOGo poskytuje bohaté webové prostředí založené na technologii AJAX a podporuje i mnoho kalendářových klientů pracujících se standardními protokoly CalDAV a CardDAV.<br/><br/>\nSOGo je distribuováno pod licencí <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPL</a> verze 2 nebo novější a některé části jsou distribuovány pod licencí GNU LGPL verze 2. Toto je svobodný software: můžete ho svobodně měnit a šířit dále. Neexistuje ŽÁDNÁ ZÁRUKA v rozsahu upraveném zákonem.<br/><br/>\nRůzné možnosti podpory naleznete na <a href=\"http://www.sogo.nu/en/support/community.html\">této stránce</a>.";
"Your account was locked due to too many failed attempts." = "Váš účet byl zablokován z důvodu mnoha neúspěšných pokusů o přihlášení."; "Your account was locked due to too many failed attempts." = "Váš účet byl zablokován z důvodu mnoha neúspěšných pokusů o přihlášení.";
"Your account was locked due to an expired password." = "Váš účet byl zablokován z důvodu expirovaného hesla."; "Your account was locked due to an expired password." = "Váš účet byl zablokován z důvodu expirovaného hesla.";

View File

@ -10,15 +10,15 @@
"Connect" = "Anmelden"; "Connect" = "Anmelden";
"Wrong username or password." = "Falscher Benutzername oder falsches Passwort"; "Wrong username or password." = "Falscher Benutzername oder falsches Passwort";
"cookiesNotEnabled" = "Verbindung zu SOGo ist nicht möglich, da Cookies in Ihrem Browser deaktiviert sind. Bitte aktivieren Sie Cookies in Ihrem Browser."; "cookiesNotEnabled" = "Anmeldung an SOGo ist nicht möglich, da Cookies in Ihrem Browser deaktiviert sind. Bitte aktivieren Sie Cookies in Ihrem Browser und versuchen Sie es erneut.";
"browserNotCompatible" = "Wir haben festgestellt, dass Ihre Browserversion im Moment nicht von SOGo unterstützt wird. Klicken Sie unten auf den Link, um die aktuelle Version Ihres Browsers zu installieren."; "browserNotCompatible" = "Wir haben festgestellt, dass Ihre Browserversion im Moment nicht von SOGo unterstützt wird. Wir empfehlen Firefox zu verwenden. Klicken Sie unten auf den Link, um die aktuelle Version dieses Browsers zu installieren.";
"alternativeBrowsers" = "Sie können auch die folgenden Browser benutzen"; "alternativeBrowsers" = "Sie können auch die folgenden Browser benutzen";
"alternativeBrowserSafari" = "Sie können auch Safari benutzen."; "alternativeBrowserSafari" = "Sie können auch Safari benutzen.";
"Download" = "Herunterladen"; "Download" = "Herunterladen";
"Language:" = "Sprache:"; "Language:" = "Sprache:";
"choose" = "Auswählen"; "choose" = "Auswählen ...";
"Arabic" = "العربية"; "Arabic" = "العربية";
"Catalan" = "Català"; "Catalan" = "Català";
"Czech" = "Česky"; "Czech" = "Česky";
@ -46,7 +46,7 @@
"About" = "Über"; "About" = "Über";
"AboutBox" = "Entwickelt von Inverse. SOGo ist ein vollständiger Groupware-Server mit Fokus auf Skalierbarkeit und Unkompliziertheit.<br/><br/>\nSOGo bietet ein umfangreiches, auf AJAX basierendes Web-Interface. Durch die Verwendung von Protokollstandards wie etwa CalDAV und CardDAV werden verschiedene native Clients unterstützt.<br/><br/>\nSOGo wird unter der <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPLv2</a> oder höher, Teile unter der <a href=\"http://gnu.org/licenses/lgpl.html\">GNU LGPLv2</a> angeboten. Dies ist freie Software: Sie haben die Freiheit sie zu verändern und erneut zu verbreiten. Es besteht KEINE GEWÄHRLEISTUNG, soweit dies gesetzlich zulässig ist.<br/><br/>\nAuf <a href=\"http://www.sogo.nu/en/support/community.html\">dieser Seite</a> (in englischer Sprache) können Sie sich über weitere Support-Möglichkeiten informieren."; "AboutBox" = "Entwickelt von Inverse. SOGo ist ein vollständiger Groupware-Server mit Fokus auf Skalierbarkeit und Unkompliziertheit.<br/><br/>\nSOGo bietet ein umfangreiches, auf AJAX basierendes Web-Interface. Durch die Verwendung von Protokollstandards wie etwa CalDAV und CardDAV werden verschiedene native Clients unterstützt.<br/><br/>\nSOGo wird unter der <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPLv2</a> oder höher, Teile unter der <a href=\"http://gnu.org/licenses/lgpl.html\">GNU LGPLv2</a> angeboten. Dies ist freie Software: Sie haben die Freiheit sie zu verändern und erneut zu verbreiten. Es besteht KEINE GEWÄHRLEISTUNG, soweit dies gesetzlich zulässig ist.<br/><br/>\nAuf <a href=\"http://www.sogo.nu/en/support/community.html\">dieser Seite</a> (in englischer Sprache) können Sie sich über weitere Support-Möglichkeiten informieren.";
"Your account was locked due to too many failed attempts." = "Ihr Konto wurde wegen zu vieler fehlgeschlagener Versuche gesperrt."; "Your account was locked due to too many failed attempts." = "Ihr Konto wurde wegen zu vieler fehlgeschlagener Anmeldeversuche gesperrt.";
"Your account was locked due to an expired password." = "Ihr Konto wurde wegen eines abgelaufenen Passwortes gesperrt."; "Your account was locked due to an expired password." = "Ihr Konto wurde wegen eines abgelaufenen Passwortes gesperrt.";
"Login failed due to unhandled error case: " = "Die Anmeldung ist aufgrund eines unbehandelten Fehlers fehlgeschlagen: "; "Login failed due to unhandled error case: " = "Die Anmeldung ist aufgrund eines unbehandelten Fehlers fehlgeschlagen: ";
"Change your Password" = "Bitte Passwort ändern"; "Change your Password" = "Bitte Passwort ändern";

View File

@ -18,7 +18,7 @@
"Delete" = "Löschen"; "Delete" = "Löschen";
/* contacts categories */ /* contacts categories */
"contacts_category_labels" = "Geschäftspartner, Familie, Freund, Kollegin, Konkurrenten, Kunden, Lieferant, Presse, VIP"; "contacts_category_labels" = "Familie, Freund, Geschäftspartner, Kollegin, Konkurrenten, Kunden, Lieferant, Presse, VIP";
/* vacation (auto-reply) */ /* vacation (auto-reply) */
"Enable vacation auto reply" = "Automatische Abwesenheitsnachricht aktivieren"; "Enable vacation auto reply" = "Automatische Abwesenheitsnachricht aktivieren";
@ -36,7 +36,7 @@
/* forward messages */ /* forward messages */
"Forward incoming messages" = "Ankommende Nachrichten weiterleiten"; "Forward incoming messages" = "Ankommende Nachrichten weiterleiten";
"Keep a copy" = "Kopie behalten"; "Keep a copy" = "Eine Kopie behalten";
"Please specify an address to which you want to forward your messages." "Please specify an address to which you want to forward your messages."
= "Bitte Adresse angeben, an die Ihre Nachrichten weitergeleitet werden sollen."; = "Bitte Adresse angeben, an die Ihre Nachrichten weitergeleitet werden sollen.";
@ -96,12 +96,12 @@
"Day start time must be prior to day end time." = "Der Tagesanfang muss vor dem Tagesende liegen."; "Day start time must be prior to day end time." = "Der Tagesanfang muss vor dem Tagesende liegen.";
"Show time as busy outside working hours" = "Zeiten außerhalb der Arbeitszeit als belegt anzeigen"; "Show time as busy outside working hours" = "Zeiten außerhalb der Arbeitszeit als belegt anzeigen";
"First week of year :" = "Erste Woche des Jahres:"; "First week of year :" = "Erste Woche des Jahres:";
"Enable reminders for Calendar items" = "Terminerinnerung aktivieren"; "Enable reminders for Calendar items" = "Termin- und Aufgabenerinnerungen aktivieren";
"Play a sound when a reminder comes due" "Play a sound when a reminder comes due"
= "Akustisches Signal zur Terminerinnerung"; = "Akustisches Signal zur Terminerinnerung";
"Default reminder :" = "Standard Terminerinnerung:"; "Default reminder :" = "Standard Terminerinnerung:";
"firstWeekOfYear_January1" = "Beginnt am 1.Januar"; "firstWeekOfYear_January1" = "Beginnt am 1. Januar";
"firstWeekOfYear_First4DayWeek" = "Erste 4 Tage Woche"; "firstWeekOfYear_First4DayWeek" = "Erste 4 Tage Woche";
"firstWeekOfYear_FirstFullWeek" = "Erste ganze Woche"; "firstWeekOfYear_FirstFullWeek" = "Erste ganze Woche";
@ -168,7 +168,7 @@
"Email:" = "E-Mail-Adresse:"; "Email:" = "E-Mail-Adresse:";
"Reply To Email:" = "\"Antworten An\" E-Mail-Adresse (Reply-To):"; "Reply To Email:" = "\"Antworten An\" E-Mail-Adresse (Reply-To):";
"Signature:" = "Signatur:"; "Signature:" = "Signatur:";
"(Click to create)" = "(Klick zum Erstellen)"; "(Click to create)" = "(Zum Erstellen klicken)";
"Signature" = "Signatur"; "Signature" = "Signatur";
"Please enter your signature below:" = "Bitte fügen Sie die Signatur hier ein:"; "Please enter your signature below:" = "Bitte fügen Sie die Signatur hier ein:";
@ -193,17 +193,17 @@
/* Event+task categories */ /* Event+task categories */
"category_none" = "Keine"; "category_none" = "Keine";
"calendar_category_labels" = "Jubiläum,Geburtstag,Geschäft,Anrufe,Klienten,Konkurrenz,Kunde,Favoriten,Fortsetzung,Geschenke,Ferien,Ideen,Besprechung,Fragen,Verschiedenes,Persönlich,Projekte,Feiertag,Status,Lieferanten,Reise,Urlaub"; "calendar_category_labels" = "Anrufe,Besprechung,Favoriten,Feiertag,Ferien,Fortsetzung,Fragen,Geburtstag,Geschäft,Geschenke,Ideen,Jubiläum,Klienten,Konkurrenz,Kunde,Lieferanten,Persönlich,Projekte,Reise,Status,Urlaub,Verschiedenes";
/* Default module */ /* Default module */
"Calendar" = "Kalender"; "Calendar" = "Kalender";
"Contacts" = "Adressbuch"; "Contacts" = "Adressbuch";
"Mail" = "Mail"; "Mail" = "E-Mail";
"Last" = "Zuletzt benutztes"; "Last" = "Zuletzt benutztes";
"Default module :" = "Vorgegebenes Modul:"; "Default module :" = "Vorgegebenes Modul:";
"Language :" = "Sprache :"; "Language :" = "Sprache :";
"choose" = "Auswählen"; "choose" = "Auswählen ...";
"Arabic" = "العربية"; "Arabic" = "العربية";
"Catalan" = "Català"; "Catalan" = "Català";
"Czech" = "Česky"; "Czech" = "Česky";

View File

@ -141,6 +141,7 @@
"messageforward_inline" = "В теле письма"; "messageforward_inline" = "В теле письма";
"messageforward_attached" = "Приложенным файлом"; "messageforward_attached" = "Приложенным файлом";
"When replying to a message:" = "При ответе на сообщение:";
"replyplacement_above" = "Начинать мой ответ над цитируемым текстом"; "replyplacement_above" = "Начинать мой ответ над цитируемым текстом";
"replyplacement_below" = "Начинать мой ответ под цитируемым текстом"; "replyplacement_below" = "Начинать мой ответ под цитируемым текстом";
"And place my signature" = "И поместить мою подпись"; "And place my signature" = "И поместить мою подпись";
@ -149,12 +150,17 @@
"Compose messages in" = "Compose messages in"; "Compose messages in" = "Compose messages in";
"composemessagestype_html" = "HTML"; "composemessagestype_html" = "HTML";
"composemessagestype_text" = "Plain text"; "composemessagestype_text" = "Plain text";
"Display remote inline images" = "Показать встроенные изображения из сети";
"displayremoteinlineimages_never" = "Никогда";
"displayremoteinlineimages_always" = "Всегда";
/* IMAP Accounts */ /* IMAP Accounts */
"New Mail Account" = "New Mail Account"; "New Mail Account" = "New Mail Account";
"Server Name:" = "Server Name:"; "Server Name:" = "Server Name:";
"Port:" = "Port:"; "Port:" = "Port:";
"Encryption:" = "Шифрование:";
"None" = "Нет";
"User Name:" = "User Name:"; "User Name:" = "User Name:";
"Password:" = "Пароль:"; "Password:" = "Пароль:";
@ -247,6 +253,7 @@
"match any of the following rules:" = "отвечают любому из следующих правил:"; "match any of the following rules:" = "отвечают любому из следующих правил:";
"match all messages" = "все сообщения"; "match all messages" = "все сообщения";
"Perform these actions:" = "Произвести следующие действия:"; "Perform these actions:" = "Произвести следующие действия:";
"Untitled Filter" = "Фильтр без названия";
"Subject" = "Subject"; "Subject" = "Subject";
"From" = "From"; "From" = "From";

View File

@ -179,6 +179,8 @@
"Reminder:" = "Lembrete:"; "Reminder:" = "Lembrete:";
"General:" = "Geral:"; "General:" = "Geral:";
"Reply:" = "Responder:"; "Reply:" = "Responder:";
"Created by:" = "Criado por:";
"Target:" = "Marca:"; "Target:" = "Marca:";
@ -373,6 +375,9 @@
"Show Time as Free" = "Exibir Hora como Livre"; "Show Time as Free" = "Exibir Hora como Livre";
/* email notifications */
"Send Appointment Notifications" = "Enviar Notificações de Apontamento";
/* validation errors */ /* validation errors */
validate_notitle = "Nenhum título informado, continue?"; validate_notitle = "Nenhum título informado, continue?";

View File

@ -179,6 +179,8 @@
"Reminder:" = "Připomenutí:"; "Reminder:" = "Připomenutí:";
"General:" = "Obecný:"; "General:" = "Obecný:";
"Reply:" = "Odpověď:"; "Reply:" = "Odpověď:";
"Created by:" = "Vytvořeno:";
"Target:" = "Vložte adresu webové stránky nebo dokumentu."; "Target:" = "Vložte adresu webové stránky nebo dokumentu.";
@ -373,6 +375,9 @@
"Show Time as Free" = "Čas zobrazit jako volný"; "Show Time as Free" = "Čas zobrazit jako volný";
/* email notifications */
"Send Appointment Notifications" = "Poslat připomenutí";
/* validation errors */ /* validation errors */
validate_notitle = "Název nebyl nastaven, pokračovat?"; validate_notitle = "Název nebyl nastaven, pokračovat?";

View File

@ -179,6 +179,8 @@
"Reminder:" = "Alarm:"; "Reminder:" = "Alarm:";
"General:" = "Algemeen:"; "General:" = "Algemeen:";
"Reply:" = "Antwoord:"; "Reply:" = "Antwoord:";
"Created by:" = "Aangemaakt door:";
"Target:" = "Bestemming:"; "Target:" = "Bestemming:";
@ -373,6 +375,9 @@
"Show Time as Free" = "Toon tijd als vrij"; "Show Time as Free" = "Toon tijd als vrij";
/* email notifications */
"Send Appointment Notifications" = "Stuur afspraakmeldingen";
/* validation errors */ /* validation errors */
validate_notitle = "U heeft geen titel opgegeven. Wilt u doorgaan?"; validate_notitle = "U heeft geen titel opgegeven. Wilt u doorgaan?";

View File

@ -179,6 +179,8 @@
"Reminder:" = "Erinnerung:"; "Reminder:" = "Erinnerung:";
"General:" = "Generell:"; "General:" = "Generell:";
"Reply:" = "Antwort:"; "Reply:" = "Antwort:";
"Created by:" = "Erstellt von:";
"Target:" = "Ziel:"; "Target:" = "Ziel:";
@ -373,6 +375,9 @@
"Show Time as Free" = "Zeige Zeit als Verfügbar"; "Show Time as Free" = "Zeige Zeit als Verfügbar";
/* email notifications */
"Send Appointment Notifications" = "Verabredungsbenachrichtigungen senden";
/* validation errors */ /* validation errors */
validate_notitle = "Sie haben keinen Titel eingegeben. Wollen Sie trotzdem fortfahren?"; validate_notitle = "Sie haben keinen Titel eingegeben. Wollen Sie trotzdem fortfahren?";

View File

@ -179,6 +179,8 @@
"Reminder:" = "Przypomnienie:"; "Reminder:" = "Przypomnienie:";
"General:" = "Ogólne:"; "General:" = "Ogólne:";
"Reply:" = "Odpowiedź:"; "Reply:" = "Odpowiedź:";
"Created by:" = "Stworzone przez:";
"Target:" = "Cel:"; "Target:" = "Cel:";
@ -373,6 +375,9 @@
"Show Time as Free" = "Pokaż czas jako wolny"; "Show Time as Free" = "Pokaż czas jako wolny";
/* email notifications */
"Send Appointment Notifications" = "Wyślij powiadomienia o spotkaniu";
/* validation errors */ /* validation errors */
validate_notitle = "Nie podano tytułu, kontynuować?"; validate_notitle = "Nie podano tytułu, kontynuować?";

View File

@ -179,6 +179,8 @@
"Reminder:" = "Напоминание:"; "Reminder:" = "Напоминание:";
"General:" = "Общее:"; "General:" = "Общее:";
"Reply:" = "Ответ:"; "Reply:" = "Ответ:";
"Created by:" = "Создано:";
"Target:" = "Цель:"; "Target:" = "Цель:";
@ -373,6 +375,9 @@
"Show Time as Free" = "Отображать время как свободное"; "Show Time as Free" = "Отображать время как свободное";
/* email notifications */
"Send Appointment Notifications" = "Отправлять напоминания о встречах";
/* validation errors */ /* validation errors */
validate_notitle = "Нет названия. Продолжить?"; validate_notitle = "Нет названия. Продолжить?";

View File

@ -214,8 +214,6 @@
- (BOOL) showCompletedTasks - (BOOL) showCompletedTasks
{ {
BOOL show;
[self _setupContext]; [self _setupContext];
return [[us objectForKey: @"ShowCompletedTasks"] boolValue]; return [[us objectForKey: @"ShowCompletedTasks"] boolValue];
@ -237,6 +235,32 @@
return [self responseWithStatus: 204]; return [self responseWithStatus: 204];
} }
- (WOResponse *) saveListStateAction
{
WORequest *request;
NSString *state;
[self _setupContext];
request = [context request];
state = [request formValueForKey: @"state"];
[moduleSettings setObject: state
forKey: @"ListState"];
[us synchronize];
return [self responseWithStatus: 204];
}
- (NSString *) listStateStyle
{
NSString *state;
[self _setupContext];
state = [moduleSettings objectForKey: @"ListState"];
return (state && [state compare: @"collapse"] == NSOrderedSame)? @"display: none;" : @"";
}
- (unsigned int) firstDayOfWeek - (unsigned int) firstDayOfWeek
{ {
SOGoUserDefaults *ud; SOGoUserDefaults *ud;

View File

@ -343,6 +343,26 @@
} }
} }
- (NSString *) collapseBtnClass
{
NSString *module, *state;
NSMutableDictionary *moduleSettings;
SOGoUser *activeUser;
SOGoAppointmentFolders *clientObject;
SOGoUserSettings *us;
activeUser = [context activeUser];
clientObject = [self clientObject];
module = [clientObject nameInContainer];
us = [activeUser userSettings];
moduleSettings = [us objectForKey: module];
state = [moduleSettings objectForKey: @"ListState"];
return (state && [state compare: @"collapse"] == NSOrderedSame)? @"rise" : @"collapse";
}
/* current day related */ /* current day related */
- (void) setCurrentDay:(NSCalendarDate *) _day - (void) setCurrentDay:(NSCalendarDate *) _day

View File

@ -872,10 +872,16 @@ iRANGE(2);
- (NSString *) organizerName - (NSString *) organizerName
{ {
NSDictionary *profile; NSDictionary *profile;
NSString *s;
profile = [[[self organizerProfile] allValues] lastObject]; profile = [[[self organizerProfile] allValues] lastObject];
s = [profile objectForKey: @"name"];
return [profile objectForKey: @"name"]; if ([s length] == 0)
s = [profile objectForKey: @"email"];
return s;
} }
- (NSString *) jsonOrganizer - (NSString *) jsonOrganizer

View File

@ -55,6 +55,11 @@
pageName = "UIxCalMainView"; pageName = "UIxCalMainView";
actionName = "saveSelectedList"; actionName = "saveSelectedList";
}; };
saveListState = {
protectedBy = "View";
pageName = "UIxCalMainView";
actionName = "saveListState";
};
dateselector = { dateselector = {
protectedBy = "View"; protectedBy = "View";
pageName = "UIxCalDateSelector"; pageName = "UIxCalDateSelector";

View File

@ -24,9 +24,9 @@ h1, dd, .dl-list dt { margin-left: 130px; }
<small><var:string value="organizerName" const:escapeHTML="NO"/><var:string value="sentByText" const:escapeHTML="NO"/></small></h1> <small><var:string value="organizerName" const:escapeHTML="NO"/><var:string value="sentByText" const:escapeHTML="NO"/></small></h1>
<dl class="dl-horizontal"> <dl class="dl-horizontal">
<var:if condition="apt.location.length" <var:if condition="location.length"
><dt><var:string label:value="location_label" const:escapeHTML="NO"/></dt> ><dt><var:string label:value="location_label" const:escapeHTML="NO"/></dt>
<dd><var:string value="apt.location" const:escapeHTML="NO"/></dd></var:if> <dd><var:string value="location" const:escapeHTML="NO"/></dd></var:if>
<dt><var:string label:value="startDate_label" const:escapeHTML="NO"/></dt> <dt><var:string label:value="startDate_label" const:escapeHTML="NO"/></dt>
<dd><var:string value="formattedAptStartDate" const:escapeHTML="NO" <dd><var:string value="formattedAptStartDate" const:escapeHTML="NO"
/><var:if condition="formattedAptStartTime.length"> - <var:string value="formattedAptStartTime" const:escapeHTML="NO"/> <var:string value="viewTZ" const:escapeHTML="NO"/> /><var:if condition="formattedAptStartTime.length"> - <var:string value="formattedAptStartTime" const:escapeHTML="NO"/> <var:string value="viewTZ" const:escapeHTML="NO"/>

View File

@ -45,7 +45,10 @@
><div var:class="clickableHourCellClass" ><div var:class="clickableHourCellClass"
var:day="currentTableDay.shortDateString" var:day="currentTableDay.shortDateString"
var:hour="currentAppointmentHour"> var:hour="currentAppointmentHour">
</div></var:foreach></div> <span class="minutes15"><!-- space --></span>
<span class="minutes30"><!-- space --></span>
<span class="minutes45"><!-- space --></span>
</div></var:foreach></div>
<div class="events"><!-- space --></div> <div class="events"><!-- space --></div>
</div> </div>
</var:foreach> </var:foreach>

View File

@ -1,63 +1,43 @@
<?xml version="1.0" standalone="yes"?> <?xml version="1.0" standalone="yes"?>
<!DOCTYPE container> <container
<container xmlns="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml" xmlns:var="http://www.skyrix.com/od/binding"
xmlns:var="http://www.skyrix.com/od/binding" xmlns:const="http://www.skyrix.com/od/constant"
xmlns:const="http://www.skyrix.com/od/constant" xmlns:rsrc="OGo:url"
xmlns:rsrc="OGo:url" xmlns:label="OGo:label">
xmlns:label="OGo:label">
<div class="menu" id="currentViewMenu"> <div class="menu" id="currentViewMenu">
<ul> <ul>
<li><var:string label:value="New Event..."/></li> <li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li> <li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li> <li><!-- separator --></li>
<li><var:string label:value="Previous Day"/></li> <li><var:string label:value="Previous Day"/></li>
<li><var:string label:value="Next Day"/></li> <li><var:string label:value="Next Day"/></li>
<li><!-- separator --></li> <li><!-- separator --></li>
<li><var:string label:value="Delete Event"/></li> <li><var:string label:value="Delete Event"/></li>
<li><var:string label:value="Copy event to my calendar"/></li> <li><var:string label:value="Copy event to my calendar"/></li>
<li><var:string label:value="View Raw Source"/></li> <li><var:string label:value="View Raw Source"/></li>
</ul> </ul>
</div> </div>
<a href="#" <span class="daysHeader">
class="leftNavigationArrow" <span class="day1">
var:date="prevDayQueryParameters.day" <a href="#"
onclick="return onCalendarGotoDay(this);" var:date="prevDayQueryParameters.day"
><img rsrc:src="arrow-left.png"/></a> onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-left.png"/></a>
<span class="daysHeader"> </span>
<span class="day2"><a href="#" <span class="day0"><var:string value="currentDayName"/></span>
var:date="dayBeforePrevDayQueryParameters.day" <span class="day1">
onclick="return onCalendarGotoDay(this);" <a href="#"
><var:string value="dayBeforeYesterdayName" var:date="nextDayQueryParameters.day"
/></a></span onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-right.png"/></a>
><span class="day1"><a href="#" </span>
var:date="prevDayQueryParameters.day" <a href="#" id="listCollapse"><img var:class="collapseBtnClass" rsrc:src="collapse.png"/></a>
onclick="return onCalendarGotoDay(this);" </span>
><var:string value="yesterdayName" <div id="calendarContent">
/></a></span <var:component
><span class="day0"><var:string value="currentDayName" /></span className="UIxCalDayTable"
><span class="day1"><a href="#" startDate="startDate"
var:date="nextDayQueryParameters.day" const:CSSClass="dayOverview"
onclick="return onCalendarGotoDay(this);" const:numberOfDays="1" />
><var:string value="tomorrowName" </div>
/></a></span </container>
><span class="day2"><a href="#"
var:date="dayAfterNextDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="dayAfterTomorrowName"
/></a></span
></span>
<a href="#"
class="rightNavigationArrow"
var:date="nextDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-right.png"/></a>
<div id="calendarContent">
<var:component
className="UIxCalDayTable"
startDate="startDate"
const:CSSClass="dayOverview"
const:numberOfDays="1" />
</div>
</container>

View File

@ -147,7 +147,7 @@
<div id="verticalDragHandle" class="dragHandle"><!-- space --></div> <div id="verticalDragHandle" class="dragHandle"><!-- space --></div>
<div id="rightPanel"> <div id="rightPanel">
<div class="tabsContainer" id="schedulerTabs"> <div class="tabsContainer" id="schedulerTabs" var:style="listStateStyle">
<ul> <ul>
<li target="eventsListView" var:class="eventsTabClass" <li target="eventsListView" var:class="eventsTabClass"
><span><var:string label:value="Events" /></span></li> ><span><var:string label:value="Events" /></span></li>
@ -202,7 +202,7 @@
</div> </div>
</div> </div>
</div> </div>
<div id="rightDragHandle" class="dragHandle"><!-- space --></div> <div id="rightDragHandle" class="dragHandle" var:style="listStateStyle"><!-- space --></div>
<div id="calendarView"><!-- space --></div> <div id="calendarView" var:style="listStateStyle"><!-- space --></div>
</div> </div>
</var:component> </var:component>

View File

@ -1,77 +1,58 @@
<?xml version="1.0" standalone="yes"?> <?xml version="1.0" standalone="yes"?>
<!DOCTYPE container> <!DOCTYPE container>
<container <container
xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"
xmlns:var="http://www.skyrix.com/od/binding" xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant" xmlns:const="http://www.skyrix.com/od/constant"
xmlns:rsrc="OGo:url" xmlns:rsrc="OGo:url"
xmlns:label="OGo:label"> xmlns:label="OGo:label">
<div class="menu" id="currentViewMenu"> <div class="menu" id="currentViewMenu">
<ul> <ul>
<li><var:string label:value="New Event..."/></li> <li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li> <li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li> <li><!-- separator --></li>
<li><var:string label:value="Previous Month"/></li> <li><var:string label:value="Previous Month"/></li>
<li><var:string label:value="Next Month"/></li> <li><var:string label:value="Next Month"/></li>
<li><!-- separator --></li> <li><!-- separator --></li>
<li><var:string label:value="Delete Event"/></li> <li><var:string label:value="Delete Event"/></li>
<li><var:string label:value="Copy event to my calendar"/></li> <li><var:string label:value="Copy event to my calendar"/></li>
<li><var:string label:value="View Raw Source"/></li> <li><var:string label:value="View Raw Source"/></li>
</ul> </ul>
</div> </div>
<a href="#" <span class="monthsHeader">
class="leftNavigationArrow" <span class="month1">
var:date="prevMonthQueryParameters.month" <a href="#"
onclick="return onCalendarGotoDay(this);" var:date="prevMonthQueryParameters.month"
><img rsrc:src="arrow-left.png"/></a> onclick="return onCalendarGotoDay(this);"
<span class="monthsHeader"> ><img rsrc:src="arrow-left.png"/></a>
<span class="month2"><a href="#" </span>
var:date="monthBeforePrevMonthQueryParameters.month" <span class="month0"><var:string value="monthNameOfThisMonth" /></span>
onclick="return onCalendarGotoDay(this);" <span class="month1">
><var:string value="monthNameOfTwoMonthAgo" <a href="#"
/></a></span var:date="nextMonthQueryParameters.month"
><span class="month1"><a href="#" onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-right.png"/></a>
var:date="prevMonthQueryParameters.month" </span>
onclick="return onCalendarGotoDay(this);" <a href="#" id="listCollapse"><img var:class="collapseBtnClass" rsrc:src="collapse.png"/></a>
><var:string value="monthNameOfOneMonthAgo" </span>
/></a></span <div id="calendarContent">
><span class="month0"><var:string value="monthNameOfThisMonth" /></span <div class="monthView">
><span class="month1"><a href="#" <var:foreach list="headerDaysToDisplay" item="currentTableDay"
var:date="nextMonthQueryParameters.month" ><div var:class="headerDayCellClasses"
onclick="return onCalendarGotoDay(this);" ><var:string value="labelForCurrentDayToDisplay"
><var:string value="monthNameOfNextMonth" /></div></var:foreach>
/></a></span <div class="days" const:id="monthDaysView"
><span class="month2"><a href="#" ><var:foreach list="weeksToDisplay" item="currentWeek"
var:date="monthAfterNextMonthQueryParameters.month" ><var:foreach list="currentWeek" item="currentTableDay"
onclick="return onCalendarGotoDay(this);" ><div var:class="dayCellClasses"
><var:string value="monthNameOfTheMonthAfterNextMonth" var:day="currentTableDay.shortDateString"
/></a></span var:day-number="currentDayNumber"
></span> var:id="currentDayId"
<a href="#"
class="rightNavigationArrow"
var:date="nextMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-right.png"/></a>
<div id="calendarContent">
<div class="monthView">
<var:foreach list="headerDaysToDisplay" item="currentTableDay"
><div var:class="headerDayCellClasses"
><var:string value="labelForCurrentDayToDisplay"
/></div></var:foreach>
<div class="days" const:id="monthDaysView"
><var:foreach list="weeksToDisplay" item="currentWeek"
><var:foreach list="currentWeek" item="currentTableDay"
><div var:class="dayCellClasses"
var:day="currentTableDay.shortDateString"
var:day-number="currentDayNumber"
var:id="currentDayId"
><div class="dayHeader"><var:string value="dayHeaderNumber"/></div ><div class="dayHeader"><var:string value="dayHeaderNumber"/></div
></div> ></div>
</var:foreach>
</var:foreach> </var:foreach>
</var:foreach> </div>
</div> </div>
</div> </div>
</div> </container>
</container>

View File

@ -1,63 +1,43 @@
<?xml version="1.0" standalone="yes"?> <?xml version="1.0" standalone="yes"?>
<container <container
xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"
xmlns:var="http://www.skyrix.com/od/binding" xmlns:var="http://www.skyrix.com/od/binding"
xmlns:const="http://www.skyrix.com/od/constant" xmlns:const="http://www.skyrix.com/od/constant"
xmlns:rsrc="OGo:url" xmlns:rsrc="OGo:url"
xmlns:label="OGo:label"> xmlns:label="OGo:label">
<div class="menu" id="currentViewMenu"> <div class="menu" id="currentViewMenu">
<ul> <ul>
<li><var:string label:value="New Event..."/></li> <li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li> <li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li> <li><!-- separator --></li>
<li><var:string label:value="Previous Week"/></li> <li><var:string label:value="Previous Week"/></li>
<li><var:string label:value="Next Week"/></li> <li><var:string label:value="Next Week"/></li>
<li><!-- separator --></li> <li><!-- separator --></li>
<li><var:string label:value="Delete Event"/></li> <li><var:string label:value="Delete Event"/></li>
<li><var:string label:value="Copy event to my calendar"/></li> <li><var:string label:value="Copy event to my calendar"/></li>
<li><var:string label:value="View Raw Source"/></li> <li><var:string label:value="View Raw Source"/></li>
</ul> </ul>
</div> </div>
<a href="#"
class="leftNavigationArrow"
var:date="prevWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-left.png"/></a>
<span class="weeksHeader"> <span class="weeksHeader">
<span class="week2"><a href="#" <span class="week1">
var:date="weekBeforePrevWeekQueryParameters.day" <a href="#"
onclick="return onCalendarGotoDay(this);" var:date="prevWeekQueryParameters.day"
><var:string value="weekBeforeLastWeekName" onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-left.png"/></a>
/></a></span </span>
><span class="week1"><a href="#" <span class="week0"><var:string value="currentWeekName" /></span>
var:date="prevWeekQueryParameters.day" <span class="week1">
onclick="return onCalendarGotoDay(this);" <a href="#"
><var:string value="lastWeekName" var:date="nextWeekQueryParameters.day"
/></a></span onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-right.png"/></a>
><span class="week0"><var:string value="currentWeekName" /></span </span>
><span class="week1"><a href="#" <a href="#" id="listCollapse"><img var:class="collapseBtnClass" rsrc:src="collapse.png"/></a>
var:date="nextWeekQueryParameters.day" </span>
onclick="return onCalendarGotoDay(this);"
><var:string value="nextWeekName"
/></a></span
><span class="week2"><a href="#"
var:date="weekAfterNextWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="weekAfterNextWeekName"
/></a></span
></span>
<a href="#"
class="rightNavigationArrow"
var:date="nextWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-right.png"/></a>
<div id="calendarContent"> <div id="calendarContent">
<var:component <var:component
className="UIxCalDayTable" className="UIxCalDayTable"
startDate="startDate" startDate="startDate"
const:CSSClass="weekOverview" const:CSSClass="weekOverview"
const:numberOfDays="7" /> const:numberOfDays="7" />
</div> </div>
</container> </container>

View File

@ -1502,18 +1502,18 @@ function unsetCategoryOnNode(contactNode, category) {
function configureDraggables() { function configureDraggables() {
if ($("contactFolders")) { if ($("contactFolders")) {
var rows = jQuery("tr.vcard"); var rows = jQuery("tr.vcard");
rows.draggable("destroy"); try { rows.draggable("destroy"); } catch (e) {}
rows.draggable({ rows.draggable({
helper: function (event) { return '<div id="dragDropVisual"></div>'; }, helper: function (event) { return '<div id="dragDropVisual"></div>'; },
start: startDragging, start: startDragging,
drag: whileDragging, drag: whileDragging,
stop: stopDragging, stop: stopDragging,
appendTo: 'body', appendTo: 'body',
cursorAt: { right: 25 }, cursorAt: { right: 25 },
scroll: false, scroll: false,
distance: 4, distance: 4,
zIndex: 20 zIndex: 20
}); });
} }
} }

View File

@ -67,6 +67,7 @@ SOGoTabsController.prototype = {
attachToTabsContainer: function STC_attachToTabsContainer(container) { attachToTabsContainer: function STC_attachToTabsContainer(container) {
this.container = container; this.container = container;
container.controller = this;
this.onTabMouseDownBound this.onTabMouseDownBound
= this.onTabMouseDown.bindAsEventListener(this); = this.onTabMouseDown.bindAsEventListener(this);
this.onTabClickBound this.onTabClickBound

View File

@ -319,23 +319,23 @@ SPAN.weeksHeader,
SPAN.monthsHeader SPAN.monthsHeader
{ display: block; { display: block;
white-space: nowrap; white-space: nowrap;
text-align: center;
background-color: #DFDFDF; background-color: #DFDFDF;
overflow: hidden; overflow: hidden;
width: 100%; width: 100%;
margin: 0px; margin: 0px;
height: 3em; height: 3em;
padding: 2px 1.5em; padding: 2px 0px;
border-bottom: 1px solid #ccc; } border-bottom: 1px solid #ccc; }
SPAN.daysHeader SPAN, SPAN.daysHeader SPAN,
SPAN.weeksHeader SPAN, SPAN.weeksHeader SPAN,
SPAN.monthsHeader SPAN SPAN.monthsHeader SPAN
{ display: block; { font-size: large;
margin: .1em; margin: .1em;
float: left; padding: 6px 12px;
width: 18%;
padding: 0px;
text-align: center; text-align: center;
line-height: 1.5em;
border: 1px solid transparent; border: 1px solid transparent;
vertical-align: top; } vertical-align: top; }
@ -343,67 +343,51 @@ SPAN.daysHeader A,
SPAN.weeksHeader A, SPAN.weeksHeader A,
SPAN.monthsHeader A SPAN.monthsHeader A
{ border: 1px solid transparent; { border: 1px solid transparent;
color: #000;
line-height: 1.5em; line-height: 1.5em;
padding: 0px .5em; } padding: 0px 0.7em; }
A.leftNavigationArrow, .day1 A:hover,
A.rightNavigationArrow .week1 A:hover,
{ border: 1px solid transparent; .month1 A:hover
padding: .5em;
text-align: center;
vertical-align: bottom; }
A.leftNavigationArrow:hover,
A.rightNavigationArrow:hover,
SPAN.daysHeader A:hover,
SPAN.weeksHeader A:hover,
SPAN.monthsHeader A:hover
{ border-top: 1px solid #fff; { border-top: 1px solid #fff;
border-left: 1px solid #fff; border-left: 1px solid #fff;
border-bottom: 1px solid #828482; border-bottom: 1px solid #828482;
border-right: 1px solid #828482; } border-right: 1px solid #828482; }
A.leftNavigationArrow:active, .day1 A:active,
A.rightNavigationArrow:active, .week1 A:active,
SPAN.daysHeader A:active, .month1 A:active
SPAN.weeksHeader A:active,
SPAN.monthsHeader A:active
{ border-top: 1px solid #828482; { border-top: 1px solid #828482;
border-left: 1px solid #828482; border-left: 1px solid #828482;
border-bottom: 1px solid #fff; border-bottom: 1px solid #fff;
border-right: 1px solid #fff; } border-right: 1px solid #fff; }
SPAN.week2, SPAN.month2 #listCollapse
{ font-size: small; }
SPAN.day2, SPAN.week1, SPAN.month1
{ font-size: medium; }
SPAN.day1, SPAN.week0, SPAN.month0
{ font-size: large; }
SPAN.day0
{ font-size: x-large; }
SPAN.day0, SPAN.week0, SPAN.month0
{ border-top: 1px solid #909090 !important;
border-left: 1px solid #909090 !important;
border-bottom: 1px solid #FFFFFF !important;
border-right: 1px solid #FFFFFF !important;
background-color: #ddd; }
A.leftNavigationArrow
{ position: absolute; { position: absolute;
display: block; top: .2em;
top: .5em; right: 0;
left: .5em; } margin: 0.5em 1em; }
A.rightNavigationArrow #listCollapse img
{ position: absolute; { position: absolute; }
display: block;
top: .5em; #listCollapse img.collapse
right: .5em; } { clip: rect(0 18px 18px 0);
left: 0;
top: 0; }
#listCollapse img.collapse:hover
{ clip: rect(0 36px 18px 18px);
left: -18px; }
#listCollapse img.rise
{ clip: rect(18px 18px 36px 0);
left: 0;
top: -18px; }
#listCollapse img.rise:hover
{ clip: rect(18px 36px 36px 18px);
left: -18px; }
DIV#calendarHeader, DIV#calendarHeader,
DIV#daysView DIV#daysView
@ -595,6 +579,14 @@ DIV.daysViewFor7Days#daysView DIV.selectedDay.weekEndDay DIV.clickableHourCell,
DIV.daysViewFor7Days#daysView DIV.selectedDay DIV.clickableHourCell.outOfDay DIV.daysViewFor7Days#daysView DIV.selectedDay DIV.clickableHourCell.outOfDay
{ background-color: #f5dd92; } { background-color: #f5dd92; }
.minutes15, .minutes30, .minutes45
{ display: block;
height: 9px;
border-bottom: 1px dotted #eee; }
.minutes30
{ border-bottom: 1px dotted #ccc; }
DIV.weekOf4 DIV.weekOf4
{ height: 25%; } { height: 25%; }

View File

@ -723,9 +723,9 @@ function onViewEventCallback(http) {
top -= cell.up("DIV.day").scrollTop; top -= cell.up("DIV.day").scrollTop;
} }
left = cellPosition[0] + cellDimensions["width"] - parseInt(cellDimensions["width"]/3); left = cellPosition[0] + cellDimensions["width"] + 4;
if (left + divDimensions["width"] > window.width()) { if (left + divDimensions["width"] > window.width()) {
left = cellPosition[0] - divDimensions["width"] + 10; left = cellPosition[0] - divDimensions["width"];
div.removeClassName("left"); div.removeClassName("left");
div.addClassName("right"); div.addClassName("right");
} }
@ -748,14 +748,14 @@ function onViewEventCallback(http) {
para = $(paras[1]); para = $(paras[1]);
if (data["calendar"].length) { if (data["calendar"].length) {
// Remove owner email from calendar's name // Remove owner email from calendar's name
para.down("SPAN", 1).update(data["calendar"].replace(/ \<.*\>/, "")); para.down("SPAN", 1).update(data["calendar"].escapeHTML());
para.show(); para.show();
} else } else
para.hide(); para.hide();
para = $(paras[2]); para = $(paras[2]);
if (data["location"].length) { if (data["location"].length) {
para.down("SPAN", 1).update(data["location"]); para.down("SPAN", 1).update(data["location"].escapeHTML());
para.show(); para.show();
} else } else
para.hide(); para.hide();
@ -3205,6 +3205,11 @@ function deletePersonalCalendarCallback(http) {
} }
function configureLists() { function configureLists() {
// Move calendar view if lists are collapsed
if (!$("schedulerTabs").visible()) {
$('calendarView').setStyle({ top: '0' }).show();
}
// TASK LIST // TASK LIST
var list = $("tasksList"); var list = $("tasksList");
list.multiselect = true; list.multiselect = true;
@ -3292,6 +3297,37 @@ function drawNowLine() {
} }
} }
function onListCollapse(event, element) {
var img = element.select('img').first();
var tabs = $("schedulerTabs");
var handle = $("rightDragHandle");
var view = jQuery("#calendarView");
var state = 'collapse';
if (tabs.visible()) {
img.removeClassName('collapse').addClassName('rise');
handle.hide();
view.animate({ top: '0' }, 200, function() {
tabs.hide();
});
}
else {
state = 'rise';
img.removeClassName('rise').addClassName('collapse');
tabs.show();
tabs.controller.onWindowResize();
view.animate({ top: handle.getStyle('top') }, 200, function() {
handle.show();
});
}
var url = ApplicationBaseURL + "saveListState";
var params = "state=" + state;
triggerAjaxRequest(url, null, null, params,
{ "Content-type": "application/x-www-form-urlencoded" });
}
function onDocumentKeydown(event) { function onDocumentKeydown(event) {
var target = Event.element(event); var target = Event.element(event);
if (target.tagName != "INPUT") { if (target.tagName != "INPUT") {
@ -3367,7 +3403,7 @@ function initScheduler() {
// Calendar import form // Calendar import form
$("uploadCancel").observe("click", hideCalendarImport); $("uploadCancel").observe("click", hideCalendarImport);
$("uploadOK").observe("click", hideImportResults); $("uploadOK").observe("click", hideImportResults);
$("calendarView").on("click", "#listCollapse", onListCollapse);
Event.observe(document, "keydown", onDocumentKeydown); Event.observe(document, "keydown", onDocumentKeydown);
} }

View File

@ -1007,6 +1007,10 @@ SOGoEventDragController.prototype = {
onDragStart: function SEDC_onDragStart(event) { onDragStart: function SEDC_onDragStart(event) {
var target = getTarget(event); var target = getTarget(event);
if (eventIsLeftClick(event) && (target.nodeType == 1)) { if (eventIsLeftClick(event) && (target.nodeType == 1)) {
if (target.hasClassName("minutes15") ||
target.hasClassName("minutes30") ||
target.hasClassName("minutes45"))
target = target.parentNode;
if ((!this.eventCells if ((!this.eventCells
&& (target.hasClassName("clickableHourCell") && (target.hasClassName("clickableHourCell")
|| target.hasClassName("day")) || target.hasClassName("day"))

Binary file not shown.

After

Width:  |  Height:  |  Size: 963 B

View File

@ -60,7 +60,6 @@ LABEL
H6 H6
{ font-size: 11px; { font-size: 11px;
color: #9ABCD8;
color: #627e9c; color: #627e9c;
text-transform: uppercase; text-transform: uppercase;
margin: 10px 0px 5px 0px; margin: 10px 0px 5px 0px;
@ -1168,6 +1167,7 @@ span.cke_skin_kama
DIV#linkBanner, DIV#linkBanner,
DIV#toolbar, DIV#toolbar,
DIV.menu, DIV.menu,
DIV.filterPanel,
DIV.tabsContainer DIV.tabsContainer
{ display: none; } { display: none; }
} }

1903
UI/WebServerResources/jquery-ui.js vendored 100644 → 100755

File diff suppressed because it is too large Load Diff

View File

@ -4,4 +4,4 @@
MAJOR_VERSION=2 MAJOR_VERSION=2
MINOR_VERSION=0 MINOR_VERSION=0
SUBMINOR_VERSION=6b SUBMINOR_VERSION=7