]> err.no Git - scalable-opengroupware.org/commitdiff
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1021 d1b88da0-ebda-0310...
authorwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Mon, 12 Feb 2007 20:56:24 +0000 (20:56 +0000)
committerwolfgang <wolfgang@d1b88da0-ebda-0310-925b-ed51d893ca5b>
Mon, 12 Feb 2007 20:56:24 +0000 (20:56 +0000)
37 files changed:
ChangeLog
OGoContentStore/appointment.ocs
OGoContentStore/contact.ocs
OGoContentStore/sql/folderinfo-create.sqlite [deleted file]
OGoContentStore/sql/foldertablecreate-helge-privcal.sqlite [deleted file]
OGoContentStore/sql/generate-folderinfo-sql-for-users-sqlite.sh [deleted file]
OGoContentStore/sql/generate-folderinfo-sql-for-users-sqlite1table.sh [deleted file]
SOPE/NGCards/CardGroup.m
SOPE/NGCards/ChangeLog
SOPE/NGCards/versitCardsSaxDriver/GNUmakefile
SoObjects/Appointments/SOGoAppointmentFolder.m
SoObjects/Contacts/SOGoContactFolders.h
SoObjects/Contacts/SOGoContactFolders.m
SoObjects/Contacts/SOGoContactGCSFolder.m
SoObjects/Contacts/SOGoContactLDAPFolder.m
SoObjects/Mailer/SOGoMailFolder.m
SoObjects/SOGo/GNUmakefile
SoObjects/SOGo/GNUmakefile.preamble
SoObjects/SOGo/SOGoFolder.h
SoObjects/SOGo/SOGoFolder.m
SoObjects/common.make
UI/Contacts/English.lproj/Localizable.strings
UI/Contacts/French.lproj/Localizable.strings
UI/Contacts/UIxContactFoldersView.m
UI/Contacts/product.plist
UI/SOGoUI/UIxComponent.m
UI/Scheduler/French.lproj/Localizable.strings
UI/Scheduler/UIxCalDayTable.m
UI/Scheduler/UIxCalView.m
UI/Templates/ContactsUI/UIxContactsListViewContainer.wox
UI/Templates/MailerUI/UIxMailFilterPanel.wox
UI/Templates/MailerUI/UIxMailMainFrame.wox
UI/Templates/SchedulerUI/UIxAppointmentProposal.wox
UI/Templates/SchedulerUI/UIxTaskProposal.wox
UI/WebServerResources/ContactsUI.js
UI/WebServerResources/UIxAppointmentEditor.css
UI/WebServerResources/UIxContactEditor.css

index 2b5cfc959bd47eeb8bbca6cbb22ad67d3dd4d3b1..bab0b29e976dfdbeb42f0d65ad14650e3968388b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,42 @@
+2007-02-09  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
+
+       * SoObjects/Contacts/SOGoContactFolders.m ([SOGoContactFolders
+       -appendPersonalSourcesInContext:context]): release connectoin
+       channel when everything is done.
+
+       * UI/Contacts/UIxContactFoldersView.m ([UIxContactFoldersView
+       -newAbAction]): new action method to crate a new contact folder
+       from the web UI.
+
+       * SoObjects/SOGo/SOGoFolder.m ([SOGoFolder -create]): new method
+       that requests the folder manager to create a folder table with the
+       specified type at the specified path. The type is taken from [self
+       folderType].
+
+       * SoObjects/Contacts/SOGoContactGCSFolder.m ([SOGoContactGCSFolder
+       -folderType]): implemented.
+
+       * SoObjects/Appointments/SOGoAppointmentFolder.m
+       ([SOGoAppointmentFolder -folderType]): implemented.
+
+       * SoObjects/Contacts/SOGoContactFolders.m ([SOGoContactFolders
+       -appendPersonalSourcesInContext:context]): we now fetch all
+       folders with type "Contact" that belong to the current user.
+       ([SOGoContactFolders -newFolderWithName:name]): new method to
+       create a new contact folder.
+
+       * UI/SOGoUI/UIxComponent.m ([UIxComponent -userFolderPath]): treat
+       resulting url with [NSString+Utilities hostlessURL] instead of
+       using NSURL. This is because the url in question sometimes has a
+       hostname and sometimes not. "hostlessURL" ensure the hostname is
+       removed anyway.
+       ([UIxComponent -applicationPath]): same as above.
+
+2007-02-08  Ludovic Marcotte <ludovic@inverse.ca>
+
+       * SoObjects/Mailer/SOGoMailFolder.m: priorize the lookup of
+       folders before doing the one on messages.
+
 2007-02-08  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
 
        * SoObjects/SOGo/NSArray+Utilities.m: added an implementation of
@@ -10,9 +49,8 @@
 
 2007-02-07  Ludovic Marcotte <ludovic@inverse.ca>
 
-       * UI/Scheduler/English.lproj/Localizable.strings
-         Fixed typo for "Agendas" 
-
+       * UI/Scheduler/English.lproj/Localizable.strings: fixed typo for
+       "Agendas"
 
 2007-02-05  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
 
index b1d267e29cf171bc8d745f3cb743f2e0a183a114..8e014e4a798fd839d85c5d55a33b450dc11b4f03 100644 (file)
@@ -4,6 +4,11 @@
   extractorClassName = "OCSiCalFieldExtractor";
 
   fields = (
+    {
+      columnName = c_name;
+      sqlType    = "VARCHAR(256)";
+      allowsNull = NO;
+    },
     {
       columnName = uid;
       sqlType    = "VARCHAR(256)";
index a08d2234ffa66acc28c0c471aa5dc0f0d2285f87..29fa99155ed99bbc5d7610b6bfa7b52caee34ad8 100644 (file)
@@ -4,6 +4,11 @@
   extractorClassName= "OCSContactFieldExtractor";
 
   fields = (
+    {
+      columnName = c_name;
+      sqlType    = "VARCHAR(256)";
+      allowsNull = NO;
+    },
     {
       columnName = givenname;
       sqlType    = "VARCHAR(256)";
diff --git a/OGoContentStore/sql/folderinfo-create.sqlite b/OGoContentStore/sql/folderinfo-create.sqlite
deleted file mode 100644 (file)
index cb5e585..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
---
--- (C) 2005 SKYRIX Software AG
---
--- TODO:
---   add a unique constraints on path
-
--- DROP TABLE SOGo_folder_info;
-
-CREATE TABLE SOGo_folder_info (
-  c_folder_id      INTEGER PRIMARY KEY,
-  c_path           VARCHAR(255)  NOT NULL, /* the full path to the folder */
-  c_path1          VARCHAR(255)  NOT NULL, /* parts (for fast queries) */
-  c_path2          VARCHAR(255)  NULL,     /* parts (for fast queries) */
-  c_path3          VARCHAR(255)  NULL,     /* parts (for fast queries) */
-  c_path4          VARCHAR(255)  NULL,     /* parts (for fast queries) */
-  c_foldername     VARCHAR(255)  NOT NULL, /* last path component */
-  c_location       VARCHAR(2048) NOT NULL, /* URL to folder */
-  c_quick_location VARCHAR(2048) NULL,     /* URL to quicktable of folder */
-  c_folder_type    VARCHAR(255)  NOT NULL  /* the folder type ... */
-);
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername,
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users', 
-    'Users',
-    NULL,
-    NULL,
-    NULL,
-    'Users', 
-    'sqlite://localhost/tmp/sogo-registry.sqlite/SOGo_user_folder_blob', 
-    'sqlite://localhost/tmp/sogo-registry.sqlite/SOGo_user_folder_quick', 
-    'Container' );
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/helge', 
-    'Users',
-    'helge',
-    NULL,
-    NULL,
-    'helge', 
-    'sqlite://localhost/tmp/sogo-registry.sqlite/SOGo_user_folder_blob',
-    'sqlite://localhost/tmp/sogo-registry.sqlite/SOGo_user_folder_quick', 
-    'Container' );
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/helge/Calendar', 
-    'Users',
-    'helge',
-    'Calendar',
-     NULL,
-    'Calendar', 
-    'sqlite://localhost/tmp/sogo-registry.sqlite/SOGo_helge_privcal_blob', 
-    'sqlite://localhost/tmp/sogo-registry.sqlite/SOGo_helge_privcal_quick', 
-    'Appointment' );
diff --git a/OGoContentStore/sql/foldertablecreate-helge-privcal.sqlite b/OGoContentStore/sql/foldertablecreate-helge-privcal.sqlite
deleted file mode 100644 (file)
index 4b324bb..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-  (C) 2005 SKYRIX Software AG
-*/
-
-DROP TABLE SOGo_helge_privcal_quick;
-DROP TABLE SOGo_helge_privcal;
-
-CREATE TABLE SOGo_helge_privcal_quick (
-  c_name       VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  uid          VARCHAR(256)    NOT NULL,
-  startdate    INT             NOT NULL,
-  enddate      INT             NOT NULL,
-  cycleenddate INT             NULL,     /* enddate for cyclic events */
-  title        VARCHAR(1000)   NOT NULL,
-  cycleinfo    VARCHAR(1000)   NULL,     /* property list with cycle infos */
-  participants VARCHAR(100000) NOT NULL, /* the CNs of the participants */
-  isallday     INT             NULL,
-  iscycle      INT             NULL,     /* client needs to fetch to resolve */
-  ispublic     INT             NOT NULL,
-  status       INT             NOT NULL,
-  isopaque     INT             NULL,
-  priority     INT             NOT NULL, -- for marking high prio apts
-  location     VARCHAR(256)    NULL,
-  orgmail      VARCHAR(256)    NULL,
-  partmails    VARCHAR(100000) NOT NULL, /* the emails of the participants */
-  partstates   VARCHAR(256)    NOT NULL, /* the status of each participant */
-  sequence     INT             NULL      /* the iCal sequence              */
-);
-
-CREATE TABLE SOGo_helge_privcal_blob (
-  c_name         VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  c_content      VARCHAR(100000) NOT NULL, /* the BLOB        */
-  c_creationdate INT             NOT NULL, /* creation date   */
-  c_lastmodified INT             NOT NULL, /* last modification (UPDATE) */
-  c_version      INT             NOT NULL  /* version counter */
-);
diff --git a/OGoContentStore/sql/generate-folderinfo-sql-for-users-sqlite.sh b/OGoContentStore/sql/generate-folderinfo-sql-for-users-sqlite.sh
deleted file mode 100755 (executable)
index 19b702c..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/bash
-#
-# Usage: generate-folderinfo-sql-for-users user1 [user2] [user3] [...]
-#
-
-DB="/tmp/sogo-registry.sqlite"
-
-while [ "$1" != "" ]; do
-USER_ID=$1
-USER_TABLE=`echo $USER_ID | tr -s [:punct:] _`
-cat << EOF
-DELETE FROM SOGo_folder_info WHERE c_path2 = '${USER_ID}';
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/${USER_ID}', 
-    'Users',
-    '${USER_ID}',
-    NULL,
-    NULL,
-    '${USER_ID}', 
-    'sqlite://localhost${DB}/SOGo_user_folder_blob', 
-    'sqlite://localhost${DB}/SOGo_user_folder_quick', 
-    'Container' );
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/${USER_ID}/Calendar', 
-    'Users',
-    '${USER_ID}',
-    'Calendar',
-     NULL,
-    'Calendar', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_privcal_blob', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_privcal_quick', 
-    'Appointment' );
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/${USER_ID}/Contacts', 
-    'Users',
-    '${USER_ID}',
-    'Contacts',
-     NULL,
-    'Contacts', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_contacts_blob', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_contacts_quick', 
-    'Contact' );
-
-DROP TABLE SOGo_${USER_TABLE}_privcal_quick;
-DROP TABLE SOGo_${USER_TABLE}_privcal_blob;
-
-CREATE TABLE SOGo_${USER_TABLE}_privcal_quick (
-  c_name       VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  uid          VARCHAR(256)    NOT NULL,
-  startdate    INT             NOT NULL,
-  enddate      INT             NOT NULL,
-  cycleenddate INT             NULL,     /* enddate for cyclic events */
-  title        VARCHAR(1000)   NOT NULL,
-  cycleinfo    VARCHAR(1000)   NULL,     /* property list with cycle infos */
-  participants VARCHAR(100000) NOT NULL, /* the CNs of the participants */
-  isallday     INT             NULL,
-  iscycle      INT             NULL,     /* client needs to fetch to resolve */
-  ispublic     INT             NOT NULL,
-  status       INT             NOT NULL,
-  isopaque     INT             NULL,
-  priority     INT             NOT NULL, -- for marking high prio apts
-  location     VARCHAR(256)    NULL,
-  orgmail      VARCHAR(256)    NULL,
-  partmails    VARCHAR(100000) NOT NULL, /* the emails of the participants */
-  partstates   VARCHAR(256)    NOT NULL, /* the status of each participant */
-  sequence     INT             NULL      /* the iCal sequence */
-);
-
-CREATE TABLE SOGo_${USER_TABLE}_privcal_blob (
-  c_name         VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  c_content      VARCHAR(100000) NOT NULL, /* the BLOB */
-  c_creationdate INT             NOT NULL, /* creation date */
-  c_lastmodified INT             NOT NULL, /* last modification (UPDATE) */
-  c_version      INT             NOT NULL  /* version counter */
-);
-
-DROP TABLE SOGo_${USER_TABLE}_contacts_quick;
-DROP TABLE SOGo_${USER_TABLE}_contacts_blob;
-
-CREATE TABLE SOGo_${USER_TABLE}_contacts_quick (
-  c_name          VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  givenname       VARCHAR(256),
-  cn              VARCHAR(256),
-  sn              VARCHAR(256),
-  l               VARCHAR(256),
-  mail            VARCHAR(256),
-  o               VARCHAR(256),
-  ou              VARCHAR(256),
-  telephonenumber VARCHAR(256)
-);
-
-CREATE TABLE SOGo_${USER_TABLE}_contacts_blob (
-  c_name         VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  c_content      VARCHAR(100000) NOT NULL, /* the BLOB */
-  c_creationdate INT             NOT NULL, /* creation date */
-  c_lastmodified INT             NOT NULL, /* last modification (UPDATE) */
-  c_version      INT             NOT NULL  /* version counter */
-);
-
-EOF
-shift
-done
diff --git a/OGoContentStore/sql/generate-folderinfo-sql-for-users-sqlite1table.sh b/OGoContentStore/sql/generate-folderinfo-sql-for-users-sqlite1table.sh
deleted file mode 100755 (executable)
index 3b1a7a9..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/bin/bash
-#
-# Usage: generate-folderinfo-sql-for-users user1 [user2] [user3] [...]
-#
-
-DB="/tmp/sogo-registry.sqlite"
-
-while [ "$1" != "" ]; do
-USER_ID=$1
-USER_TABLE=`echo $USER_ID | tr -s [:punct:] _`
-
-cat << EOF
-DELETE FROM SOGo_folder_info WHERE c_path2 = '${USER_ID}';
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/${USER_ID}', 
-    'Users',
-    '${USER_ID}',
-    NULL,
-    NULL,
-    '${USER_ID}', 
-    'sqlite://localhost${DB}/SOGo_user_folder_blob', 
-    'sqlite://localhost${DB}/SOGo_user_folder_quick', 
-    'Container' );
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/${USER_ID}/Calendar', 
-    'Users',
-    '${USER_ID}',
-    'Calendar',
-     NULL,
-    'Calendar', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_privcal', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_privcal', 
-    'Appointment' );
-
-INSERT INTO SOGo_folder_info 
-  ( c_path, c_path1, c_path2, c_path3, c_path4, c_foldername, 
-    c_location, c_quick_location, c_folder_type ) 
-VALUES 
-  ( '/Users/${USER_ID}/Contacts', 
-    'Users',
-    '${USER_ID}',
-    'Contacts',
-     NULL,
-    'Contacts', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_contacts', 
-    'sqlite://localhost${DB}/SOGo_${USER_TABLE}_contacts', 
-    'Contact' );
-
-
-DROP   TABLE SOGo_${USER_TABLE}_privcal;
-CREATE TABLE SOGo_${USER_TABLE}_privcal (
-  c_name         VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  c_content      VARCHAR(100000) NOT NULL, /* the BLOB */
-  c_creationdate INT             NOT NULL, /* creation date */
-  c_lastmodified INT             NOT NULL, /* last modification (UPDATE) */
-  c_version      INT             NOT NULL, /* version counter */
-
-  /* quick fields */
-  uid          VARCHAR(256)    NOT NULL,
-  startdate    INT             NOT NULL,
-  enddate      INT             NOT NULL,
-  cycleenddate INT             NULL,     /* enddate for cyclic events */
-  title        VARCHAR(1000)   NOT NULL,
-  cycleinfo    VARCHAR(1000)   NULL,     /* property list with cycle infos */
-  participants VARCHAR(100000) NOT NULL, /* the CNs of the participants */
-  isallday     INT             NULL,
-  iscycle      INT             NULL,     /* client needs to fetch to resolve */
-  ispublic     INT             NOT NULL,
-  status       INT             NOT NULL,
-  priority     INT             NOT NULL, -- for marking high prio apts
-  isopaque     INT             NULL,
-  location     VARCHAR(256)    NULL,
-  orgmail      VARCHAR(256)    NULL,
-  partmails    VARCHAR(100000) NOT NULL, /* the emails of the participants */
-  partstates   VARCHAR(256)    NOT NULL, /* the status of each participant */
-  sequence     INT             NULL      /* the iCal sequence */
-);
-
-
-DROP   TABLE SOGo_${USER_TABLE}_contacts;
-CREATE TABLE SOGo_${USER_TABLE}_contacts (
-  c_name         VARCHAR(256)    NOT NULL PRIMARY KEY, /* the filename */
-  c_content      VARCHAR(100000) NOT NULL, /* the BLOB */
-  c_creationdate INT             NOT NULL, /* creation date */
-  c_lastmodified INT             NOT NULL, /* last modification (UPDATE) */
-  c_version      INT             NOT NULL, /* version counter */
-
-  /* quick fields */
-  givenname       VARCHAR(256),
-  cn              VARCHAR(256),
-  sn              VARCHAR(256),
-  l               VARCHAR(256),
-  mail            VARCHAR(256),
-  o               VARCHAR(256),
-  ou              VARCHAR(256),
-  telephonenumber VARCHAR(256)
-);
-
-EOF
-shift
-done
index 90700c8aec9b74c6ad0e54f9dd8445cce4bbe2aa..b7b60ca7118c4cdca638de4b8ff2bfe606617943 100644 (file)
@@ -43,10 +43,15 @@ static NGCardsSaxHandler *sax = nil;
   
   if (!parser)
     {
+#if 1
+      parser = [[SaxXMLReaderFactory standardXMLReaderFactory]
+                 createXMLReaderWithName: @"VSCardSaxDriver"];
+      [parser retain];
+#else
       parser =
         [[[SaxXMLReaderFactory standardXMLReaderFactory] 
-           createXMLReaderForMimeType:@"text/x-vcard"]
-          retain];
+           createXMLReaderForMimeType:@"text/x-vcard"] retain];
+#endif
       if (parser)
         {
           [parser setContentHandler:sax];
index 5dc47b5ebc7dbd4196f895f2bb1195f9e8da80af..e5dea66158efee885650290e4d3e6da8d7067532 100644 (file)
@@ -1,3 +1,10 @@
+2007-02-09  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
+
+       * CardGroup.m ([CardGroup +cardParser]): find the correct parser
+       by requesting a parser by name instead of by mime-type. This way,
+       any parser which would declare the same types would not
+       enter in conflict.
+
 2007-02-08  Wolfgang Sourdeau  <wsourdeau@inverse.ca>
 
        * CardElement.m ([CardElement -namedValue:aValueName]): use
index 82c2d316deb6284e48829d80450887f9ae32adec..0782266b89bf4e4ba6c76c27cf4c4b746d7537b8 100644 (file)
@@ -8,7 +8,7 @@ BUNDLE_NAME        = versitCardsSaxDriver
 BUNDLE_EXTENSION   = .sax
 BUNDLE_INSTALL_DIR = $(GNUSTEP_INSTALLATION_DIR)/Library/SaxDrivers-$(MAJOR_VERSION).$(MINOR_VERSION)/
 
-versitCardsSaxDriver_PRINCIPAL_CLASS = VSSaxDriver
+versitCardsSaxDriver_PRINCIPAL_CLASS = VSCardSaxDriver
 
 versitCardsSaxDriver_PCH_FILE = common.h
 
index a85e2900af8a5338afd0f6dbc06ba06e8d0b5149..9d4ceb742e5cbd9a5d27dec15e6a7b5be7f2331c 100644 (file)
 #import <SaxObjC/SaxObjC.h>
 #import <NGCards/NGCards.h>
 #import <NGObjWeb/SoObject+SoDAV.h>
+#import <NGObjWeb/WOContext.h>
+#import <NGObjWeb/WOMessage.h>
 #import <NGExtensions/NGCalendarDateRange.h>
 
-#import <NGObjWeb/SoClassSecurityInfo.h>
+// #import <NGObjWeb/SoClassSecurityInfo.h>
 #import <SOGo/SOGoCustomGroupFolder.h>
 #import <SOGo/AgenorUserManager.h>
 #import <SOGo/SOGoPermissions.h>
@@ -58,7 +60,7 @@ static NSNumber   *sharedYes = nil;
 {
   NGLoggerManager *lm;
   static BOOL     didInit = NO;
-  SoClassSecurityInfo *securityInfo;
+//   SoClassSecurityInfo *securityInfo;
 
   if (didInit) return;
   didInit = YES;
@@ -1081,6 +1083,11 @@ static NSNumber   *sharedYes = nil;
 
 /* folder type */
 
+- (NSString *) folderType
+{
+  return @"Appointment";
+}
+
 - (NSString *) outlookFolderClass
 {
   return @"IPF.Appointment";
index f75db750d0a77b6241321912e50de270c2fb0da8..0272f3bbb0940bd62cdc019b0761178c5d34ec9c 100644 (file)
@@ -27,6 +27,7 @@
 
 @class NSMutableDictionary;
 @class NSString;
+@class WOResponse;
 
 @interface SOGoContactFolders : SOGoObject
 {
@@ -40,6 +41,8 @@
 
 - (NSArray *) contactFolders;
 
+- (WOResponse *) newFolderWithName: (NSString *) name;
+
 @end
 
 #endif /* SOGOCONTACTFOLDERS_H */
index e47adecb18cc5d23ae0b3da534be6a5048b488f8..4e57d72d51f3194d5e0e0850737190c6898c6910 100644 (file)
 #import <NGObjWeb/WOContext+SoObjects.h>
 #import <NGObjWeb/SoUser.h>
 
+#import <GDLContentStore/GCSFolderManager.h>
+#import <GDLContentStore/GCSChannelManager.h>
+#import <GDLAccess/EOAdaptorChannel.h>
+#import <GDLContentStore/NSURL+GCS.h>
+
 #import <SoObjects/SOGo/SOGoPermissions.h>
 
 #import "common.h"
 - (void) appendPersonalSourcesInContext: (WOContext *) context;
 {
   SOGoContactGCSFolder *ab;
+  GCSChannelManager *cm;
+  EOAdaptorChannel *fc;
+  NSURL *folderLocation;
+  NSString *sql;
+  NSArray *attrs;
+  NSDictionary *row;
+
+  cm = [GCSChannelManager defaultChannelManager];
+  folderLocation
+    = [[GCSFolderManager defaultFolderManager] folderInfoLocation];
+  fc = [cm acquireOpenChannelForURL: folderLocation];
+  if (fc)
+    {
+      sql
+        = [NSString stringWithFormat: @"SELECT c_path4, c_foldername FROM %@"
+                    @" WHERE c_path2 = '%@' AND c_folder_type = 'Contact'",
+                    [folderLocation gcsTableName],
+                    [self ownerInContext: nil]];
+      [fc evaluateExpressionX: sql];
+      attrs = [fc describeResults: NO];
+      row = [fc fetchAttributes: attrs withZone: NULL];
+      while (row)
+        {
+          ab = [SOGoContactGCSFolder contactFolderWithName: [row objectForKey: @"c_path4"]
+                                     andDisplayName: [row objectForKey: @"c_foldername"]
+                                     inContainer: self];
+          [ab setOCSPath: [NSString stringWithFormat: @"%@/%@",
+                                    OCSPath, [row objectForKey: @"c_path4"]]];
+          [contactFolders setObject: ab forKey: [row objectForKey: @"c_path4"]];
+          row = [fc fetchAttributes: attrs withZone: NULL];
+        }
+
+      [cm releaseChannel: fc];
+//       sql = [sql stringByAppendingFormat:@" WHERE %@ = '%@'", 
+//                  uidColumnName, [self uid]];
+    }
+}
+
+- (WOResponse *) newFolderWithName: (NSString *) name
+{
+  SOGoContactGCSFolder *newFolder;
+  WOResponse *response;
+
+  newFolder = [SOGoContactGCSFolder contactFolderWithName: name
+                                    andDisplayName: name
+                                    inContainer: [self clientObject]];
+  if ([newFolder isKindOfClass: [NSException class]])
+    response = (WOResponse *) newFolder;
+  else
+    {
+      [newFolder setOCSPath: [NSString stringWithFormat: @"%@/%@",
+                                       OCSPath, name]];
+      if ([newFolder create])
+        {
+          response = [WOResponse new];
+          [response setStatus: 201];
+          [response autorelease];
+        }
+      else
+        response = [NSException exceptionWithHTTPStatus: 400
+                                reason: @"The new folder could not be created"];
+    }
 
-  ab = [SOGoContactGCSFolder contactFolderWithName: @"personal"
-                             andDisplayName: @"Personal Addressbook"
-                             inContainer: self];
-  [ab setOCSPath: [NSString stringWithFormat: @"%@/%@",
-                            OCSPath, @"personal"]];
-  [contactFolders setObject: ab forKey: @"personal"];
+  return response;
 }
 
 - (void) appendSystemSourcesInContext: (WOContext *) context;
index 6dd136bb57dfb4fbd9d3f13fd592425c0f422931..828be57a4de502a52040904b52ad079c69f7041a 100644 (file)
 
 /* folder type */
 
+- (NSString *) folderType
+{
+  return @"Contact";
+}
+
 - (NSString *)outlookFolderClass {
   return @"IPF.Contact";
 }
index 073055678b9a563f295df389cc78499caba7c140..b14734e802acc7112e6de48d7e7413d7135aa4f5 100644 (file)
@@ -90,7 +90,7 @@
   if ((self = [self initWithName: aName
                     inContainer: aContainer]))
     [self setDisplayName: aDisplayName];
-
+  
   return self;
 }
 
index d6bf24cd30d700cea863092afb89ee228220e0bb..cf537404ab475c03c2e22b2bd8df5118aaed11eb 100644 (file)
@@ -294,15 +294,15 @@ static BOOL useAltNamespace = NO;
     */
     return [self lookupImap4Message:_key inContext:_ctx];
   }
+
+  obj = [self lookupImap4Folder:_key  inContext:_ctx];
+  if (obj != nil)
+    return obj;
   
   /* check attributes directly bound to the app */
   if ((obj = [super lookupName:_key inContext:_ctx acquire:NO]))
     return obj;
   
-  obj = [self lookupImap4Folder:_key  inContext:_ctx];
-  if (obj != nil)
-    return obj;
-  
   /* return 404 to stop acquisition */
   return _acquire
     ? [NSException exceptionWithHTTPStatus:404 /* Not Found */]
index ffcc0cb0ee1a8e63405857e9e895a335c92a64c5..e5e5dc49641344a77e2bdaa23e16fdf69c5e0cc6 100644 (file)
@@ -78,6 +78,7 @@ agenor_defaults_OBJC_FILES   += agenor_defaults.m
 ADDITIONAL_TOOL_LIBS += -Lobj -lSOGo$(LIBRARY_NAME_SUFFIX)
 
 -include GNUmakefile.preamble
+include ../common.make
 include $(GNUSTEP_MAKEFILES)/library.make
 include $(GNUSTEP_MAKEFILES)/tool.make
 -include GNUmakefile.postamble
index 0a7155d9b7901c7c255f89bb17c323040fa88589..f49ab0b73216ea4ca252e673edf9a64694e9a023 100644 (file)
@@ -2,18 +2,7 @@
 
 libSOGo_INCLUDE_DIRS += -I.. -I../../..
 
-ifneq ($(GNUSTEP_BUILD_DIR),)
-       RELBUILD_DIR_libOGoContentStore = \
-               $(GNUSTEP_BUILD_DIR)/../../OGoContentStore/$(GNUSTEP_OBJ_DIR_NAME)
-else
-       RELBUILD_DIR_libOGoContentStore = \
-               ../../OGoContentStore/$(GNUSTEP_OBJ_DIR)
-endif
-
-SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
-
-libSOGo_LIB_DIRS +=                            \
-       -L$(RELBUILD_DIR_libOGoContentStore) -L$(RELBUILD_DIR_libOGoContentStore)/../../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)
+SYSTEM_LIB_DIR += -L/usr/local/lib
 
 libSOGo_LIBRARIES_DEPEND_UPON += \
        -lOGoContentStore       \
@@ -27,9 +16,9 @@ libSOGo_LIBRARIES_DEPEND_UPON += \
 
 ADDITIONAL_TOOL_LIBS += \
         -L$(GNUSTEP_OBJ_DIR)/ \
-        $(libSOGO_LIB_DIRS) \
+        -lSOGo \
        -lGDLContentStore -lGDLAccess   \
+        -lNGCards                       \
        -lNGLdap                        \
        -lNGExtensions -lEOControl      \
        -lDOM -lSaxObjC
-
index b4a6b92bd9789bb2bd8d886d983371e0244ecdfd..50c9f8e42352911907edbd477fbf0e36b83b26b9 100644 (file)
@@ -62,6 +62,8 @@
 
 - (NSString *)outlookFolderClass;
 
+- (BOOL) create;
+
 @end
 
 @interface SOGoFolder (GroupDAVExtensions)
index d60a898150f3da079f7e1e3f5a44a9a89a48102d..27eabccae0e6cd5ee5f731e1522cc2ff8d4b9a9c 100644 (file)
 */
 
 #import <NGObjWeb/SoObject.h>
+#import <GDLContentStore/GCSFolderManager.h>
+#import <GDLContentStore/GCSFolder.h>
+#import <GDLContentStore/GCSFolderType.h>
 
-#include "SOGoFolder.h"
-#include "common.h"
-#include <GDLContentStore/GCSFolderManager.h>
-#include <GDLContentStore/GCSFolder.h>
-#include <unistd.h>
-#include <stdlib.h>
+#import "SOGoFolder.h"
+#import "common.h"
+#import <unistd.h>
+#import <stdlib.h>
 
 #import "SOGoAclsFolder.h"
 
@@ -83,6 +84,7 @@
   
   ASSIGNCOPY(self->ocsPath, _path);
 }
+
 - (NSString *)ocsPath {
   return self->ocsPath;
 }
   return folder;
 }
 
+- (NSString *) folderType
+{
+  return @"";
+}
+
+- (BOOL) create
+{
+  NSException *result;
+
+  [GCSFolderType setFolderNamePrefix: @"SOGo_"];
+
+  result = [[self folderManager] createFolderOfType: [self folderType]
+                                 atPath: ocsPath];
+
+  return (result == nil);
+}
+
 - (NSArray *)fetchContentObjectNames {
   NSArray *fields, *records;
   
index 064352a90314b090fc6d0524a2739ed9a86d254e..096c7a6de687108797b219f124c5870cf91d1496 100644 (file)
@@ -14,7 +14,8 @@ WOBUNDLE_INSTALL_DIR = $(BUNDLE_INSTALL_DIR)
 
 ADDITIONAL_INCLUDE_DIRS += \
        -I.. \
-       -I../..
+       -I../.. \
+        -I../../SOPE
 
 ADDITIONAL_LIB_DIRS += \
         -L../SOGo/$(GNUSTEP_OBJ_DIR)/ \
index 95e560d96994b6844a0a8539504df9ba08bd1bc3..c29237cced118d4d339bd0dd6c4d47d96122076c 100644 (file)
@@ -86,5 +86,8 @@
 "Add Assistant" = "Add Assistant";
 "Add Delegate" = "Add Delegate";
 
-"Add an Addressbook..." = "Add an Addressbook...";
+"New Addressbook..." = "New Addressbook...";
+"Subscribe to an Addressbook..." = "Subscribe to an Addressbook...";
 "Remove the selected Addressbook" = "Remove the selected Addressbook";
+
+"Name of the Address Book" = "Name of the Address Book";
index dd95584bdeab62f4d4de6f13d9a59f52def19488..7ecdeb34f8bc3b2e1995d51d81e1f3ea5197173c 100644 (file)
@@ -88,5 +88,8 @@
 "Add Assistant" = "Ajouter comme assistant";
 "Add Delegate" = "Ajouter comme délégué";
 
-"Add an Addressbook..." = "Ajouter un carnet d'adresses...";
+"New Addressbook..." = "Nouveau carnet d'adresses...";
+"Subscribe to an Addressbook..." = "S'inscrire à un carnet d'adresses...";
 "Remove the selected Addressbook" = "Enlever le carnet d'adresses sélectionné";
+
+"Name of the Address Book" = "Nom du carnet d'adresses";
index 4219446d01c2f2419e44f32ef2248c55d13ed428..6a1b106a1d3bd32a0b5228e20e444e40e15be302 100644 (file)
@@ -25,6 +25,7 @@
 #import <NGObjWeb/NSException+HTTP.h>
 #import <NGObjWeb/SoObject.h>
 #import <NGObjWeb/WOResponse.h>
+#import <NGObjWeb/WOContext.h>
 
 #import <SoObjects/SOGo/SOGoUser.h>
 #import <SoObjects/SOGo/NSString+Utilities.h>
   return [self _selectActionForApplication: @"new"];
 }
 
+- (id <WOActionResults>) newAbAction
+{
+  id <WOActionResults> response;
+  NSString *name;
+
+  name = [self queryParameterForKey: @"name"];
+  if ([name length] > 0)
+    response = [[self clientObject] newFolderWithName: name];
+  else
+    response = [NSException exceptionWithHTTPStatus: 400
+                            reason: @"The name is missing"];
+  
+  return response;
+}
+
 - (id) selectForSchedulerAction
 {
   return [self _selectActionForApplication: @"scheduler-contacts"];
index 7dce9f599b0994d20c842d978113f00c329c8344..a3424d7ba40b810bbf37c30f68bc9c576a0236ff 100644 (file)
               pageName    = "UIxContactFoldersView";
               actionName  = "new";
            };
+           newAb = {
+              protectedBy = "View";
+              pageName    = "UIxContactFoldersView";
+              actionName  = "newAb";
+           };
            scheduler-contacts = {
               protectedBy = "View";
               pageName    = "UIxContactFoldersView";
index 59ab845d6144ef34ea6d9a7f9dc5b684cbd34445..9c179e8b3ab0aa723f1a605f8a7d8558634ecc83 100644 (file)
@@ -285,7 +285,6 @@ static BOOL uixDebugEnabled = NO;
 - (NSString *) userFolderPath
 {
   WOContext *ctx;
-  NSString  *url, *path;
   NSEnumerator *objects;
   SOGoObject *currentObject;
   BOOL found;
@@ -301,16 +300,12 @@ static BOOL uixDebugEnabled = NO;
     else
       currentObject = [objects nextObject];
 
-  url = [currentObject baseURLInContext:ctx];
-  path = [[NSURL URLWithString:url] path];
-
-  return path;
+  return [[currentObject baseURLInContext:ctx] hostlessURL];
 }
 
 - (NSString *) applicationPath
 {
   SOGoObject *currentClient, *parent;
-  NSString *url;
   BOOL found;
   Class objectClass, groupFolderClass, userFolderClass;
   WOContext *ctx;
@@ -333,9 +328,8 @@ static BOOL uixDebugEnabled = NO;
     }
 
   ctx = [self context];
-  url = [currentClient baseURLInContext: ctx];
 
-  return [[NSURL URLWithString: url] path];
+  return [[currentClient baseURLInContext:ctx] hostlessURL];
 }
 
 - (NSString *) resourcesPath
index 6c797a613ab3f0c40c1a61e57b84a4a8741f0f08..348dcb48995ff75b55a8c334c9067cde49fa27e0 100644 (file)
@@ -27,7 +27,7 @@
 "Week"          = "Semaine";
 "this week"     = "cette semaine";
 
-"Week %d" = "Semaine nú %d";
+"Week %d" = "Semaine nº %d";
 
 /* Month */
 
index 59fea714be6e4b71d9715897a05b1e741ff4d587..9357b8e32125a71505ba06eea900bf334d51642e 100644 (file)
   NSEnumerator *aptsEnumerator;
   NSDictionary *currentDayAppointment;
   NSCalendarDate *start, *end;
+  int endHour;
 
   if (!allAppointments)
     {
   [filteredAppointments autorelease];
 
   start = [currentTableDay hour: [self dayStartHour] minute: 0];
-  end = [currentTableDay hour: [self dayEndHour] minute: 0];
+  endHour = [self dayEndHour];
+  if (endHour < 24)
+    end = [currentTableDay hour: [self dayEndHour] minute: 0];
+  else
+    end = [[currentTableDay tomorrow] hour: 0 minute: 0];
 
   aptsEnumerator = [allAppointments objectEnumerator];
   currentDayAppointment = [aptsEnumerator nextObject];
index ea5fedf0d8c66874cf719372a082ace9f3f6e212..b56c24291e62ce7d5efd1606cbd3a94b79b3f66e 100644 (file)
@@ -401,7 +401,7 @@ static BOOL shouldDisplayWeekend = NO;
 
 - (unsigned) dayEndHour
 {
-  return 24;
+  return 23;
 }
 
 - (BOOL) shouldDisplayWeekend
index f0a71c1399b0be7f6ad27c9d6114d88f1535c46f..084a6630d344338216697b1bca581daf41dc105f 100644 (file)
 
       <form name="searchform" var:href="view" var:_sort="sortKey"
         onsubmit="return onSearchFormSubmit();" method="GET">
-<!--   var:if condition="isPopup" const:negate="YES"> -->
-          <var:if condition="hideFolderTree" const:negate="YES">
+<!--   var:if condition="isPopup" const:negate="YES" -->
+<!--          <var:if condition="hideFolderTree" const:negate="YES" -->
             <div class="contactFoldersList" id="contactFoldersList">
               <div class="titlediv"
               ><var:string label:value="Address Books"
                 /></div>
-            <var:if var:condition="isPopup" const:negate="YES"
-              ><div class="toolbar">
-                <a href="#" class="toolbarButton" onclick="return onAddressBookAdd(this);"
+            <!-- var:if var:condition="isPopup" const:negate="YES" -->
+            <div class="toolbar" id="abToolbar">
+                <a href="#" class="toolbarButton"
                   ><span class="toolbarButton"
-                    ><img rsrc:src="add-addressbook.png" label:title="Add an Addressbook..."
+                    ><img rsrc:src="add-addressbook.png" label:title="New Addressbook..."
                       /></span></a
-                  ><a href="#" class="toolbarButton" onclick="return onAddressBookRemove(this);"
+                  ><a href="#" class="toolbarButton"
+                  ><span class="toolbarButton"
+                    ><img rsrc:src="add-user-addressbook.png" label:title="Subscribe to an Addressbook..."
+                      /></span></a
+                  ><a href="#" class="toolbarButton"
                   ><span class="toolbarButton"
                     ><img rsrc:src="remove-addressbook.png" label:title="Remove the selected Addressbook"
                       /></span></a
-                  ></div></var:if>
+                  ></div><!-- var:if -->
 
             <ul id="contactFolders"
               var:additional-addressbooks="additionalAddressBooks">
@@ -81,7 +85,7 @@
           </div>
 
           <div class="dragHandle" id="dragHandle"><!-- space --></div>
-        </var:if>
+        <!-- var:if -->
 
         <div id="rightPanel">
           <var:component className="UIxContactsFilterPanel" qualifier="qualifier" />
index 0e3805a46495044a85a7f56d128c6bca881576e1..c3647767211e961fe5d27d4b488d1942a45b04b5 100644 (file)
@@ -3,6 +3,7 @@
     xmlns="http://www.w3.org/1999/xhtml"
     xmlns:var="http://www.skyrix.com/od/binding"
     xmlns:const="http://www.skyrix.com/od/constant"
+    xmlns:label="OGo:label"
     >
     <div class="menu" id="searchMenu">
       <ul id="searchOptions">
index 4c1afc879e90d3cd5cfcddc28dccdf1a6782c8be..80925409b3cfccb6c6460a3c7e5b5c7e2bc6d283 100644 (file)
         <div id="mailboxContent"><!-- space --></div>
         <div class="dragHandle" id="rightDragHandle"><!-- space --></div>
         <div id="messageContent"><!-- space --></div>
-        <script type="text/javascript">
-          initMailboxSelection('<var:string value="mailFolderName" />');
-        </script>
-      </div>
-    </form>
+      <script type="text/javascript">
+        initMailboxSelection('<var:string value="mailFolderName" />');
+      </script>
+    </div>
 
     <var:string value="errorAlertJavaScript" const:escapeHTML="NO" />
   </var:component>
index 8c7f0eceff8fa84dc27401c8adc7d74f5ef812b0..ddbe269c6c95393839b42e6d537d4971195de594 100644 (file)
               </td>
 <!--              <td align="left" bgcolor="#FFFFF0">
                 <span class="aptview_text">
-                  <!-- use '1' instead of 'YES', otherwise breaks on OSX -->
+                  ! use '1' instead of 'YES', otherwise breaks on OSX -->
 <!--                  <var:component className="AnaisAttendeeSelector"
                                  const:selectorID="participant"
                                  const:division="CC"
index 8c7f0eceff8fa84dc27401c8adc7d74f5ef812b0..71fd7257498da566d303df8643234c82acdde86a 100644 (file)
                   <var:component className="UIxContactSelector"
                     const:selectorId="participants" />
               </td>
-<!--              <td align="left" bgcolor="#FFFFF0">
+<!--              <td align="left" bgcolor="#FFFFF0"
                 <span class="aptview_text">
-                  <!-- use '1' instead of 'YES', otherwise breaks on OSX -->
+                   use '1' instead of 'YES', otherwise breaks on OSX -->
 <!--                  <var:component className="AnaisAttendeeSelector"
                                  const:selectorID="participant"
                                  const:division="CC"
index 58fd986de769e9acb1f6fd51f5518cdf0593db59..b0333f8a4a9c198e439036584eb9155ad9612cb7 100644 (file)
@@ -106,9 +106,14 @@ function CurrentContactFolderURL() {
 function openContactsFolder(contactsFolder, params, external)
 {
   if (contactsFolder != currentContactFolder || params) {
-    if (contactsFolder == currentContactFolder)
-      selection = $("contactsList").getSelectedRowsId();
-    else
+     if (contactsFolder == currentContactFolder) {
+        var contactsList = $("contactsList");
+        if (contactsList)
+           selection = contactsList.getSelectedRowsId();
+        else
+           window.alert("no contactsList");
+     }
+     else
       selection = null;
 
     currentContactFolder = contactsFolder;
@@ -158,7 +163,7 @@ function contactsListCallback(http)
     configureSortableTableHeaders();
   }
   else
-    log ("ajax fuckage");
+    log ("ajax fuckage 1");
 }
 
 function onContactFoldersContextMenu(event)
@@ -266,7 +271,7 @@ function contactLoadCallback(http)
     div.innerHTML = content;
   }
   else
-    log ("ajax fuckage");
+    log ("ajax fuckage 2");
 }
 
 var rowSelectionCount = 0;
@@ -590,7 +595,7 @@ function addressBooksCallback(http) {
     document.addressBooksAjaxRequest = null;
   }
   else
-    log ("ajax fuckage");
+    log ("ajax fuckage 3");
 }
 
 function onContactMailTo(node) {
@@ -605,7 +610,38 @@ function refreshContacts(contactId) {
   return false;
 }
 
-function onAddressBookAdd(node) {
+function onAddressBookNew(event) {
+  var name = window.prompt(labels["Name of the Address Book"].decodeEntities());
+  if (name) {
+    if (document.newAbAjaxRequest) {
+      document.newAbAjaxRequest.aborted = true;
+      document.newAbAjaxRequest.abort();
+    }
+    var url = ApplicationBaseURL + "/newAb?name=" + name;
+    document.newAbAjaxRequest
+       = triggerAjaxRequest(url, newAbCallback, name);
+  }
+  event.preventDefault();
+}
+
+function newAbCallback(http) {
+  if (http.readyState == 4
+      && http.status == 201) {
+     var ul = $("contactFolders");
+     var name = http.callbackData;
+     var li = document.createElement("li");
+     li.setAttribute("id", "/" + name);
+     li.appendChild(document.createTextNode(name));
+     li.addEventListener("mousedown", listRowMouseDownHandler, false);
+     li.addEventListener("click", onRowClick, false);
+     li.addEventListener("contextmenu", onContactFoldersContextMenu, false);
+     ul.appendChild(li);
+  }
+  else
+    log ("ajax fuckage 4:" + http.status);
+}
+
+function onAddressBookAdd(event) {
   var selector = $("contactFolders");
   var selectorURL = '?popup=YES&selectorId=contactFolders';
 
@@ -618,13 +654,13 @@ function onAddressBookAdd(node) {
   var w = window.open(urlstr, "Addressbook",
                       "width=640,height=400,resizable=1,scrollbars=0");
   w.selector = selector;
-  w.opener = this;
+  w.opener = window;
   w.focus();
 
-  return false;
+  event.preventDefault();
 }
 
-function onAddressBookRemove(node) {
+function onAddressBookRemove(event) {
   var selector = $("contactFolders");
   var nodes = selector.getSelectedNodes();
   if (nodes.length > 0) {
@@ -642,7 +678,7 @@ function onAddressBookRemove(node) {
     }
   }
 
-  return false;
+  event.preventDefault();
 }
 
 function configureDragHandles() {
@@ -677,6 +713,14 @@ function lookupDeniedFolders() {
   return rights;
 }
 
+function configureAbToolbar() {
+  var toolbar = $("abToolbar");
+  var links = toolbar.childNodesWithTag("a");
+  links[0].addEventListener("click", onAddressBookNew, false);
+  links[1].addEventListener("click", onAddressBookAdd, false);
+  links[2].addEventListener("click", onAddressBookRemove, false);
+}
+
 function configureContactFolders() {
   var contactFolders = $("contactFolders");
   if (contactFolders) {
@@ -726,6 +770,7 @@ function initializeMenus() {
 
 var initContacts = {
   handleEvent: function (event) {
+    configureAbToolbar();
     configureContactFolders();
 //     initDnd();
   }
index ffb011cb5a1dbc7abf8bd027c20ec94b0e6a3d78..21709aa25f3acab821a40fd6f4069724b4ed3e3b 100644 (file)
@@ -7,9 +7,11 @@ DIV.appointmentLabel
 
 DIV#editorTabs
 {
+  position: absolute;
+  top: 4.5em;
   left: 0px;
   right: 0px;
-  height: 38em;
+  bottom: 0px;
 }
 
 DIV#editorTabs > DIV.tab
@@ -84,7 +86,7 @@ TEXTAREA
   top: 0px;
   left: 8em;
   vertical-align: bottom;
-  height: 10em;
+  bottom: 1em;
   right: 1em;
   padding-bottom: 1em; }
 
index 944ad84b4687ff22655f678b51abe67bc1a16d0e..d3cb3271538a137a1525aa2452e7ad4bd26bfc48 100644 (file)
@@ -55,5 +55,4 @@ DIV.tab TD.secondColumn INPUT.textField
 { width: 40%; }
 
 #otherInfos TEXTAREA
-{ width: 70%;
-  height: 10em; }
+{ width: 70%; }