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]
host = https://www.transifex.net
host = https://www.transifex.com
[sogo.ui-mailerui]
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
Author: Jean Raby <jraby@inverse.ca>
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)
------------------

View File

@ -27,13 +27,13 @@ vtodo_class2 = "(Vertrauliche Aufgabe)";
/* Invitation */
"Event Invitation: \"%{Summary}\"" = "Termineinladung: \"%{Summary}\"";
"(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}";
/* Deletion */
"Event Cancelled: \"%{Summary}\"" = "Termin abgesagt: \"%{Summary}\"";
"%{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} 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:"
= "Folgendes wurde am Termin \"%{Summary}\" geändert:";
"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 */
"Accepted invitation: \"%{Summary}\"" = "Einladung zugestimmt: \"%{Summary}\"";

View File

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

View File

@ -35,6 +35,7 @@ Mailer_OBJC_FILES += \
\
EOQualifier+MailDAV.m \
NSData+Mail.m \
NSDictionary+Mail.m \
NSString+Mail.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];
[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;
}

View File

@ -38,6 +38,7 @@
#import <SoObjects/SOGo/NSDictionary+Utilities.h>
#import "NSDictionary+Mail.h"
#import "SOGoMailObject.h"
#import "SOGoMailManager.h"
@ -201,21 +202,9 @@ static BOOL debugOn = NO;
- (NSString *) filename
{
NSString *filename;
NSDictionary *parameters;
[self partInfo];
filename = [[partInfo objectForKey: @"parameterList"]
objectForKey: @"name"];
if (!filename)
{
parameters = [[partInfo objectForKey: @"disposition"]
objectForKey: @"parameterList"];
filename = [parameters objectForKey: @"filename"];
}
return filename;
return [partInfo filename];
}
/* 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/SOGoUserDefaults.h>
#import "NSDictionary+Mail.h"
#import "NSString+Mail.h"
#import "SOGoMailForward.h"
#import "SOGoMailObject+Draft.h"
@ -250,39 +251,10 @@
intoArray: (NSMutableArray *) keys
withPath: (NSString *) path
{
NSDictionary *disposition, *currentFile;
NSString *filename, *mimeType;
NSDictionary *currentFile;
disposition = [part objectForKey: @"disposition"];
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];
}
}
}
filename = [part filename];
mimeType = [NSString stringWithFormat: @"%@/%@",
[part objectForKey: @"type"],

View File

@ -26,6 +26,24 @@ MailPartViewers_OBJC_FILES += \
UIxMailPartICalViewer.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 += \
product.plist \

View File

@ -2,3 +2,10 @@ ifeq ($(HAS_LIBRARY_ssl),yes)
ADDITIONAL_CPPFLAGS += -DHAVE_OPENSSL=1
BUNDLE_LIBS += -lcrypto
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) 2006-2013 Inverse inc.
This file is part of SOGo.
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
This file is part of SOGo.
@ -33,6 +33,7 @@
#import <SOGo/NSString+Utilities.h>
#import <Mailer/NSData+Mail.h>
#import <Mailer/NSDictionary+Mail.h>
#import <Mailer/SOGoMailBodyPart.h>
#import "MailerUI/WOContext+UIxMailer.h"
@ -210,22 +211,7 @@
- (NSString *) filename
{
NSDictionary *parameters;
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;
return [bodyInfo filename];
}
- (NSString *) filenameForDisplay
@ -280,7 +266,7 @@
NSMutableString *filename;
NSString *extension;
filename = [NSMutableString stringWithString: [bodyPart filename]];
filename = [self filename];
if (![filename length])
[filename appendFormat: @"%@-%@",
[self labelForKey: @"Untitled"],
@ -323,22 +309,22 @@
NSString *mimeImageFile, *mimeImageUrl;
mimeImageFile = [NSString stringWithFormat: @"mime-%@-%@.png",
[bodyInfo objectForKey: @"type"],
[bodyInfo objectForKey: @"subtype"]];
[bodyInfo objectForKey: @"type"],
[bodyInfo objectForKey: @"subtype"]];
mimeImageUrl = [self urlForResourceFilename: mimeImageFile];
if ( [mimeImageUrl length] == 0 )
{
mimeImageFile = [NSString stringWithFormat: @"mime-%@.png",
[bodyInfo objectForKey: @"type"]];
mimeImageUrl = [self urlForResourceFilename: mimeImageFile];
}
if ([mimeImageUrl length] == 0)
{
mimeImageFile = [NSString stringWithFormat: @"mime-%@.png",
[bodyInfo objectForKey: @"type"]];
mimeImageUrl = [self urlForResourceFilename: mimeImageFile];
}
if ( [mimeImageUrl length] == 0 )
{
mimeImageUrl = [self urlForResourceFilename: @"mime-unknown.png"];
}
if ([mimeImageUrl length] == 0)
{
mimeImageUrl = [self urlForResourceFilename: @"mime-unknown.png"];
}
return mimeImageUrl;
}

View File

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

View File

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

View File

@ -44,7 +44,7 @@
"Welsh" = "Cymraeg";
"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 an expired password." = "Váš účet byl zablokován z důvodu expirovaného hesla.";

View File

@ -10,15 +10,15 @@
"Connect" = "Anmelden";
"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";
"alternativeBrowserSafari" = "Sie können auch Safari benutzen.";
"Download" = "Herunterladen";
"Language:" = "Sprache:";
"choose" = "Auswählen";
"choose" = "Auswählen ...";
"Arabic" = "العربية";
"Catalan" = "Català";
"Czech" = "Česky";
@ -46,7 +46,7 @@
"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.";
"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.";
"Login failed due to unhandled error case: " = "Die Anmeldung ist aufgrund eines unbehandelten Fehlers fehlgeschlagen: ";
"Change your Password" = "Bitte Passwort ändern";

View File

@ -18,7 +18,7 @@
"Delete" = "Löschen";
/* 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) */
"Enable vacation auto reply" = "Automatische Abwesenheitsnachricht aktivieren";
@ -36,7 +36,7 @@
/* forward messages */
"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."
= "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.";
"Show time as busy outside working hours" = "Zeiten außerhalb der Arbeitszeit als belegt anzeigen";
"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"
= "Akustisches Signal zur Terminerinnerung";
"Default reminder :" = "Standard Terminerinnerung:";
"firstWeekOfYear_January1" = "Beginnt am 1.Januar";
"firstWeekOfYear_January1" = "Beginnt am 1. Januar";
"firstWeekOfYear_First4DayWeek" = "Erste 4 Tage Woche";
"firstWeekOfYear_FirstFullWeek" = "Erste ganze Woche";
@ -168,7 +168,7 @@
"Email:" = "E-Mail-Adresse:";
"Reply To Email:" = "\"Antworten An\" E-Mail-Adresse (Reply-To):";
"Signature:" = "Signatur:";
"(Click to create)" = "(Klick zum Erstellen)";
"(Click to create)" = "(Zum Erstellen klicken)";
"Signature" = "Signatur";
"Please enter your signature below:" = "Bitte fügen Sie die Signatur hier ein:";
@ -193,17 +193,17 @@
/* Event+task categories */
"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 */
"Calendar" = "Kalender";
"Contacts" = "Adressbuch";
"Mail" = "Mail";
"Mail" = "E-Mail";
"Last" = "Zuletzt benutztes";
"Default module :" = "Vorgegebenes Modul:";
"Language :" = "Sprache :";
"choose" = "Auswählen";
"choose" = "Auswählen ...";
"Arabic" = "العربية";
"Catalan" = "Català";
"Czech" = "Česky";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -214,8 +214,6 @@
- (BOOL) showCompletedTasks
{
BOOL show;
[self _setupContext];
return [[us objectForKey: @"ShowCompletedTasks"] boolValue];
@ -237,6 +235,32 @@
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
{
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 */
- (void) setCurrentDay:(NSCalendarDate *) _day

View File

@ -872,10 +872,16 @@ iRANGE(2);
- (NSString *) organizerName
{
NSDictionary *profile;
NSString *s;
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

View File

@ -55,6 +55,11 @@
pageName = "UIxCalMainView";
actionName = "saveSelectedList";
};
saveListState = {
protectedBy = "View";
pageName = "UIxCalMainView";
actionName = "saveListState";
};
dateselector = {
protectedBy = "View";
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>
<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>
<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>
<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"/>

View File

@ -45,7 +45,10 @@
><div var:class="clickableHourCellClass"
var:day="currentTableDay.shortDateString"
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>
</var:foreach>

View File

@ -1,63 +1,43 @@
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE container>
<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">
<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">
<div class="menu" id="currentViewMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li>
<li><var:string label:value="Previous Day"/></li>
<li><var:string label:value="Next Day"/></li>
<li><!-- separator --></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="View Raw Source"/></li>
</ul>
</div>
<a href="#"
class="leftNavigationArrow"
var:date="prevDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-left.png"/></a>
<span class="daysHeader">
<span class="day2"><a href="#"
var:date="dayBeforePrevDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="dayBeforeYesterdayName"
/></a></span
><span class="day1"><a href="#"
var:date="prevDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="yesterdayName"
/></a></span
><span class="day0"><var:string value="currentDayName" /></span
><span class="day1"><a href="#"
var:date="nextDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="tomorrowName"
/></a></span
><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>
<div class="menu" id="currentViewMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li>
<li><var:string label:value="Previous Day"/></li>
<li><var:string label:value="Next Day"/></li>
<li><!-- separator --></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="View Raw Source"/></li>
</ul>
</div>
<span class="daysHeader">
<span class="day1">
<a href="#"
var:date="prevDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-left.png"/></a>
</span>
<span class="day0"><var:string value="currentDayName"/></span>
<span class="day1">
<a href="#"
var:date="nextDayQueryParameters.day"
onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-right.png"/></a>
</span>
<a href="#" id="listCollapse"><img var:class="collapseBtnClass" rsrc:src="collapse.png"/></a>
</span>
<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="rightPanel">
<div class="tabsContainer" id="schedulerTabs">
<div class="tabsContainer" id="schedulerTabs" var:style="listStateStyle">
<ul>
<li target="eventsListView" var:class="eventsTabClass"
><span><var:string label:value="Events" /></span></li>
@ -202,7 +202,7 @@
</div>
</div>
</div>
<div id="rightDragHandle" class="dragHandle"><!-- space --></div>
<div id="calendarView"><!-- space --></div>
<div id="rightDragHandle" class="dragHandle" var:style="listStateStyle"><!-- space --></div>
<div id="calendarView" var:style="listStateStyle"><!-- space --></div>
</div>
</var:component>

View File

@ -1,77 +1,58 @@
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE container>
<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">
<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">
<div class="menu" id="currentViewMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li>
<li><var:string label:value="Previous Month"/></li>
<li><var:string label:value="Next Month"/></li>
<li><!-- separator --></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="View Raw Source"/></li>
</ul>
</div>
<a href="#"
class="leftNavigationArrow"
var:date="prevMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-left.png"/></a>
<span class="monthsHeader">
<span class="month2"><a href="#"
var:date="monthBeforePrevMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"
><var:string value="monthNameOfTwoMonthAgo"
/></a></span
><span class="month1"><a href="#"
var:date="prevMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"
><var:string value="monthNameOfOneMonthAgo"
/></a></span
><span class="month0"><var:string value="monthNameOfThisMonth" /></span
><span class="month1"><a href="#"
var:date="nextMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"
><var:string value="monthNameOfNextMonth"
/></a></span
><span class="month2"><a href="#"
var:date="monthAfterNextMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"
><var:string value="monthNameOfTheMonthAfterNextMonth"
/></a></span
></span>
<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="menu" id="currentViewMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li>
<li><var:string label:value="Previous Month"/></li>
<li><var:string label:value="Next Month"/></li>
<li><!-- separator --></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="View Raw Source"/></li>
</ul>
</div>
<span class="monthsHeader">
<span class="month1">
<a href="#"
var:date="prevMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-left.png"/></a>
</span>
<span class="month0"><var:string value="monthNameOfThisMonth" /></span>
<span class="month1">
<a href="#"
var:date="nextMonthQueryParameters.month"
onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-right.png"/></a>
</span>
<a href="#" id="listCollapse"><img var:class="collapseBtnClass" rsrc:src="collapse.png"/></a>
</span>
<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>
></div>
</var:foreach>
</var:foreach>
</var:foreach>
</div>
</div>
</div>
</div>
</container>
</container>

View File

@ -1,63 +1,43 @@
<?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">
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">
<div class="menu" id="currentViewMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li>
<li><var:string label:value="Previous Week"/></li>
<li><var:string label:value="Next Week"/></li>
<li><!-- separator --></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="View Raw Source"/></li>
</ul>
</div>
<a href="#"
class="leftNavigationArrow"
var:date="prevWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><img rsrc:src="arrow-left.png"/></a>
<div class="menu" id="currentViewMenu">
<ul>
<li><var:string label:value="New Event..."/></li>
<li><var:string label:value="New Task..."/></li>
<li><!-- separator --></li>
<li><var:string label:value="Previous Week"/></li>
<li><var:string label:value="Next Week"/></li>
<li><!-- separator --></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="View Raw Source"/></li>
</ul>
</div>
<span class="weeksHeader">
<span class="week2"><a href="#"
var:date="weekBeforePrevWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="weekBeforeLastWeekName"
/></a></span
><span class="week1"><a href="#"
var:date="prevWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"
><var:string value="lastWeekName"
/></a></span
><span class="week0"><var:string value="currentWeekName" /></span
><span class="week1"><a href="#"
var:date="nextWeekQueryParameters.day"
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>
<span class="week1">
<a href="#"
var:date="prevWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-left.png"/></a>
</span>
<span class="week0"><var:string value="currentWeekName" /></span>
<span class="week1">
<a href="#"
var:date="nextWeekQueryParameters.day"
onclick="return onCalendarGotoDay(this);"><img rsrc:src="arrow-right.png"/></a>
</span>
<a href="#" id="listCollapse"><img var:class="collapseBtnClass" rsrc:src="collapse.png"/></a>
</span>
<div id="calendarContent">
<var:component
className="UIxCalDayTable"
startDate="startDate"
const:CSSClass="weekOverview"
const:numberOfDays="7" />
className="UIxCalDayTable"
startDate="startDate"
const:CSSClass="weekOverview"
const:numberOfDays="7" />
</div>
</container>

View File

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

View File

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

View File

@ -319,23 +319,23 @@ SPAN.weeksHeader,
SPAN.monthsHeader
{ display: block;
white-space: nowrap;
text-align: center;
background-color: #DFDFDF;
overflow: hidden;
width: 100%;
margin: 0px;
height: 3em;
padding: 2px 1.5em;
padding: 2px 0px;
border-bottom: 1px solid #ccc; }
SPAN.daysHeader SPAN,
SPAN.weeksHeader SPAN,
SPAN.monthsHeader SPAN
{ display: block;
{ font-size: large;
margin: .1em;
float: left;
width: 18%;
padding: 0px;
padding: 6px 12px;
text-align: center;
line-height: 1.5em;
border: 1px solid transparent;
vertical-align: top; }
@ -343,67 +343,51 @@ SPAN.daysHeader A,
SPAN.weeksHeader A,
SPAN.monthsHeader A
{ border: 1px solid transparent;
color: #000;
line-height: 1.5em;
padding: 0px .5em; }
padding: 0px 0.7em; }
A.leftNavigationArrow,
A.rightNavigationArrow
{ border: 1px solid transparent;
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
.day1 A:hover,
.week1 A:hover,
.month1 A:hover
{ border-top: 1px solid #fff;
border-left: 1px solid #fff;
border-bottom: 1px solid #828482;
border-right: 1px solid #828482; }
A.leftNavigationArrow:active,
A.rightNavigationArrow:active,
SPAN.daysHeader A:active,
SPAN.weeksHeader A:active,
SPAN.monthsHeader A:active
.day1 A:active,
.week1 A:active,
.month1 A:active
{ border-top: 1px solid #828482;
border-left: 1px solid #828482;
border-bottom: 1px solid #fff;
border-right: 1px solid #fff; }
SPAN.week2, SPAN.month2
{ 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
#listCollapse
{ position: absolute;
display: block;
top: .5em;
left: .5em; }
top: .2em;
right: 0;
margin: 0.5em 1em; }
A.rightNavigationArrow
{ position: absolute;
display: block;
top: .5em;
right: .5em; }
#listCollapse img
{ position: absolute; }
#listCollapse img.collapse
{ 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#daysView
@ -595,6 +579,14 @@ DIV.daysViewFor7Days#daysView DIV.selectedDay.weekEndDay DIV.clickableHourCell,
DIV.daysViewFor7Days#daysView DIV.selectedDay DIV.clickableHourCell.outOfDay
{ background-color: #f5dd92; }
.minutes15, .minutes30, .minutes45
{ display: block;
height: 9px;
border-bottom: 1px dotted #eee; }
.minutes30
{ border-bottom: 1px dotted #ccc; }
DIV.weekOf4
{ height: 25%; }

View File

@ -723,9 +723,9 @@ function onViewEventCallback(http) {
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()) {
left = cellPosition[0] - divDimensions["width"] + 10;
left = cellPosition[0] - divDimensions["width"];
div.removeClassName("left");
div.addClassName("right");
}
@ -748,14 +748,14 @@ function onViewEventCallback(http) {
para = $(paras[1]);
if (data["calendar"].length) {
// 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();
} else
para.hide();
para = $(paras[2]);
if (data["location"].length) {
para.down("SPAN", 1).update(data["location"]);
para.down("SPAN", 1).update(data["location"].escapeHTML());
para.show();
} else
para.hide();
@ -3205,6 +3205,11 @@ function deletePersonalCalendarCallback(http) {
}
function configureLists() {
// Move calendar view if lists are collapsed
if (!$("schedulerTabs").visible()) {
$('calendarView').setStyle({ top: '0' }).show();
}
// TASK LIST
var list = $("tasksList");
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) {
var target = Event.element(event);
if (target.tagName != "INPUT") {
@ -3367,7 +3403,7 @@ function initScheduler() {
// Calendar import form
$("uploadCancel").observe("click", hideCalendarImport);
$("uploadOK").observe("click", hideImportResults);
$("calendarView").on("click", "#listCollapse", onListCollapse);
Event.observe(document, "keydown", onDocumentKeydown);
}

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 963 B

View File

@ -60,7 +60,6 @@ LABEL
H6
{ font-size: 11px;
color: #9ABCD8;
color: #627e9c;
text-transform: uppercase;
margin: 10px 0px 5px 0px;
@ -1168,6 +1167,7 @@ span.cke_skin_kama
DIV#linkBanner,
DIV#toolbar,
DIV.menu,
DIV.filterPanel,
DIV.tabsContainer
{ 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
MINOR_VERSION=0
SUBMINOR_VERSION=6b
SUBMINOR_VERSION=7