Merge branch '2014.11' into 2014.11-develop
[tine20] / tine20 / Calendar / js / Model.js
index 4809e6c..c27a86b 100644 (file)
@@ -3,7 +3,7 @@
  * 
  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
  * @author      Cornelius Weiss <c.weiss@metaways.de>
- * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
+ * @copyright   Copyright (c) 2007-2015 Metaways Infosystems GmbH (http://www.metaways.de)
  */
 
 Ext.ns('Tine.Calendar', 'Tine.Calendar.Model');
@@ -81,6 +81,11 @@ Tine.Calendar.Model.Event = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model
      * @type Boolean
      */
     outOfFilter: false,
+
+    /**
+     * default duration for new events
+     */
+    defaultEventDuration: 60,
     
     /**
      * returns displaycontainer with orignialcontainer as fallback
@@ -131,7 +136,7 @@ Tine.Calendar.Model.Event = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model
      * @return {Boolean}
      */
     isRecurInstance: function() {
-        return this.id && this.id.match(/^fakeid/);
+        return this.id && Ext.isFunction(this.id.match) && this.id.match(/^fakeid/);
     },
     
     /**
@@ -164,6 +169,7 @@ Tine.Calendar.Model.Event.getDefaultData = function() {
     var app = Tine.Tinebase.appMgr.get('Calendar'),
         prefs = app.getRegistry().get('preferences'),
         defaultAttendeeStrategy = prefs.get('defaultAttendeeStrategy') || 'me',
+        interval = prefs.get('interval') || 15,
         mainScreen = app.getMainScreen(),
         centerPanel = mainScreen.getCenterPanel(),
         westPanel = mainScreen.getWestPanel(),
@@ -180,18 +186,12 @@ Tine.Calendar.Model.Event.getDefaultData = function() {
     var data = {
         summary: '',
         dtstart: dtstart,
-        dtend: dtstart.add(Date.HOUR, 1),
+        dtend: dtstart.add(Date.MINUTE, Tine.Calendar.Model.Event.getMeta('defaultEventDuration')),
         container_id: container,
         transp: 'OPAQUE',
         editGrant: true,
         organizer: organizer,
-        attendee: Tine.Calendar.Model.Event.getDefaultAttendee(organizer, container) /*[
-            Ext.apply(Tine.Calendar.Model.Attender.getDefaultData(), {
-                user_type: 'user',
-                user_id: Tine.Tinebase.registry.get('userContact'),
-                status: 'ACCEPTED'
-            })
-        ]*/
+        attendee: Tine.Calendar.Model.Event.getDefaultAttendee(organizer, container)
     };
     
     if (prefs.get('defaultalarmenabled')) {
@@ -321,6 +321,20 @@ Tine.Calendar.Model.Event.getFilterModel = function() {
     ];
 };
 
+// register grants for calendar containers
+Tine.widgets.container.GrantsManager.register('Calendar_Model_Event', function(container) {
+    var grants = Tine.widgets.container.GrantsManager.defaultGrants();
+
+    if (container.type == 'personal') {
+        grants.push('freebusy');
+    }
+    if (container.type == 'personal' && container.capabilites_private) {
+        grants.push('private');
+    }
+
+    return grants;
+});
+
 // register calendar filters in addressbook
 Tine.widgets.grid.ForeignRecordFilter.OperatorRegistry.register('Addressbook', 'Contact', {
     foreignRecordClass: 'Calendar.Event',
@@ -632,19 +646,19 @@ Tine.Calendar.Model.Attender.getAttendeeStore = function(attendeeData) {
  * @static
  */
 Tine.Calendar.Model.Attender.getAttendeeStore.getMyAttenderRecord = function(attendeeStore) {
-        var currentAccountId = Tine.Tinebase.registry.get('currentAccount').accountId;
-        var myRecord = false;
-        
-        attendeeStore.each(function(attender) {
-            var userAccountId = attender.getUserAccountId();
-            if (userAccountId == currentAccountId) {
-                myRecord = attender;
-                return false;
-            }
-        }, this);
-        
-        return myRecord;
-    }
+    var currentAccountId = Tine.Tinebase.registry.get('currentAccount').accountId;
+    var myRecord = false;
+
+    attendeeStore.each(function(attender) {
+        var userAccountId = attender.getUserAccountId();
+        if (userAccountId == currentAccountId) {
+            myRecord = attender;
+            return false;
+        }
+    }, this);
+
+    return myRecord;
+};
     
 /**
  * returns attendee record of given attendee if exists, else false
@@ -654,13 +668,47 @@ Tine.Calendar.Model.Attender.getAttendeeStore.getAttenderRecord = function(atten
     var attendeeRecord = false;
     
     attendeeStore.each(function(r) {
-        if (r.get('user_type') == attendee.get('user_type') && r.getUserId() == attendee.getUserId()) {
+        var attendeeType = [attendee.get('user_type')];
+
+        // add groupmember for user
+        if (attendeeType[0] == 'user') {
+            attendeeType.push('groupmember');
+        }
+
+        if (attendeeType.indexOf(r.get('user_type')) >= 0 && r.getUserId() == attendee.getUserId()) {
             attendeeRecord = r;
             return false;
         }
     }, this);
     
     return attendeeRecord;
+};
+
+/**
+ * returns attendee data
+ * optinally fills into event record
+ */
+Tine.Calendar.Model.Attender.getAttendeeStore.getData = function(attendeeStore, event) {
+    var attendeeData = [];
+
+    Tine.Tinebase.common.assertComparable(attendeeData);
+
+    attendeeStore.each(function (attender) {
+        var user_id = attender.get('user_id');
+        if (user_id/* && user_id.id*/) {
+            if (typeof user_id.get == 'function') {
+                attender.data.user_id = user_id.data;
+            }
+
+            attendeeData.push(attender.data);
+        }
+    }, this);
+
+    if (event) {
+        event.set('attendee', attendeeData);
+    }
+
+    return attendeeData;
 }
 
 /**
@@ -675,6 +723,8 @@ Tine.Calendar.Model.Resource = Tine.Tinebase.data.Record.create(Tine.Tinebase.Mo
     {name: 'description'},
     {name: 'email'},
     {name: 'is_location', type: 'bool'},
+    {name: 'status', type: 'keyField', keyFieldConfigName: 'attendeeStatus'},
+    {name: 'suppress_notification', type: 'bool'},
     {name: 'tags'},
     {name: 'notes'},
     {name: 'grants'}