Ext.namespace('Zarafa.contact');
/**
* @class Zarafa.contact.Actions
* Common actions which can be used within {@link Ext.Button buttons}
* or other {@link Ext.Component components} with action handlers.
* @singleton
*/
Zarafa.contact.Actions = {
/**
* Opens a contact or distlist content panel based on the message class of record.
* Function will check record's message_class, If it is
* IPM.Contact It will open contact content panel - Zarafa.contact.dialogs.ContactContentPanel
* IPM.DistList It will open distlist content panel - Zarafa.contact.dialogs.DistListContentPanel
*
* @param {Zarafa.core.data.IPMRecord|Zarafa.core.data.IPMRecord[]} record
* The record/records which will be loaded in content panel for editing.
* @param {Object} config (optional) Configuration object for creating a ContentPanel
*/
openDialog : function(record, config)
{
if(Array.isArray(record)) {
for(var index = 0, len = record.length; index < len; index++) {
Zarafa.contact.Actions.openDialog(record[index], config);
}
return;
}
if(record.isMessageClass('IPM.Contact', true)) {
this.openContactContent(record, config);
} else if (record.isMessageClass('IPM.DistList', true)) {
this.openDistlistContent(record, config);
}
},
/**
* Opens a {@link Zarafa.contact.dialogs.ContactContentPanel ContactContentPanel}.
* @param {Zarafa.core.data.IPMRecord|Zarafa.core.data.IPMRecord[]} record
* The record/records which will be loaded in content panel for editing.
* @param {Object} config (optional) Configuration object
*/
openContactContent : function(record, config)
{
if(Array.isArray(record)) {
for(var index = 0, len = record.length; index < len; index++) {
Zarafa.contact.Actions.openContactContent(record[index], config);
}
return;
}
if(!Ext.isEmpty(record)) {
Zarafa.core.data.UIFactory.openCreateRecord(record, config);
}
},
/**
* Opens a {@link Zarafa.contact.dialogs.ContactContentPanel ContactContentPanel}.
* @param {Zarafa.contact.ContactContextModel} model
* model object that will be used to create a new {@link Zarafa.core.data.IPMRecord IPMRecord}
* in {@link Zarafa.core.data.IPMStore IPMStore}.
* @param {Object} config (optional) Configuration object
*/
openCreateContactContent : function(model, config)
{
var record = model.createRecord(undefined, false);
Zarafa.contact.Actions.openContactContent(record, config);
},
/**
* Opens a {@link Zarafa.contact.dialogs.DistlistContentPanel DistlistContentPanel}.
* @param {Zarafa.core.data.IPMRecord|Zarafa.core.data.IPMRecord[]} record
* The record/records which will be loaded in content panel for editing.
* in {@link Zarafa.core.data.IPMStore IPMStore}.
* @param {Object} config (optional) Configuration object
*/
openDistlistContent : function(record, config)
{
if(Array.isArray(record)) {
for(var index = 0, len = record.length; index < len; index++) {
Zarafa.contact.Actions.openDistlistContent(record[index], config);
}
return;
}
if(!Ext.isEmpty(record)) {
Zarafa.core.data.UIFactory.openCreateRecord(record, config);
}
},
/**
* Function will open a new {@link Zarafa.contact.dialogs.ContactContentPanel}
* with all information prefilled to add a recipient as a contact.
*
* @param {Ext.Button} button button object.
* @param {EventObject} event The click event object.
* @private
*/
openRecipientContactContent: function(button, event) {
// When the button belongs to one of the currently opened popout windows then
// it is required to bring the main webapp window to front prior to switching to the contact context.
if (!Zarafa.core.BrowserWindowMgr.isOwnedByMainWindow(button)) {
Zarafa.core.BrowserWindowMgr.switchFocusToMainWindow(button);
}
var contactRecord = this.getModel().createRecord();
var record = button.getRecords();
Zarafa.core.data.UIFactory.openCreateRecord(contactRecord);
contactRecord.beginEdit();
contactRecord.set('display_name', record.get('display_name'));
contactRecord.set('email_address_1', record.get('smtp_address'));
contactRecord.set('email_address_type_1', record.get('address_type'));
contactRecord.updateAddressbookProps();
// Use the same logic as the {@link Zarafa.contact.dialogs.ContactDetailTab ContactDetailTab}
// to set the given_name and surname.
var ContactParser = new Zarafa.contact.data.ContactDetailsParser();
var data = ContactParser.parseNameInfo(record.get('display_name'));
contactRecord.set('given_name', data['given_name']);
contactRecord.set('surname', data['surname']);
contactRecord.endEdit();
},
/**
* Opens a {@link Zarafa.contact.dialogs.DistlistContentPanel DistlistContentPanel}
* @param {Zarafa.contact.ContactContextModel} model
* model object that will be used to create a new {@link Zarafa.core.data.IPMRecord IPMRecord}
* @param {Object} config (optional) Configuration object
*/
openCreateDistlistContent : function(model, config)
{
var record = model.createRecord(undefined, true);
Zarafa.contact.Actions.openDistlistContent(record, config);
},
/**
* Function will open {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* @param {Zarafa.core.data.IPMRecord} record record that will be loaded in
* {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* @param {Object} config Configuration object, containing:
* - {@link Zarafa.contact.data.ContactDetailsParser} parser parser that will be used
* to parse details of full name and load the data in
* {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* - {@link Object} parsedData a hash map of already parsed data of full name that
* will be loaded in {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
*/
openDetailedNameContent : function(record, config)
{
if(!Ext.isEmpty(record)) {
var componentType = Zarafa.core.data.SharedComponentType['contact.dialog.contact.namedetails'];
config = Ext.applyIf(config || {}, {
modal : true
});
Zarafa.core.data.UIFactory.openLayerComponent(componentType, record, config);
}
},
/**
* Function will open {@link Zarafa.contact.dialogs.ContactAddressContentPanel ContactAddressContentPanel}.
* @param {Zarafa.core.data.IPMRecord} record record that will be loaded in
* {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* @param {Object} config A configuration object, containing:
* - {@link Zarafa.contact.data.ContactDetailsParser} parser parser that will be used
* to parse details of full name and load the data in
* {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* - {@link Object} parsedData a hash map of already parsed data of full name that
* will be loaded in {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* - {@link String} property property that will be modified.
*/
openDetailedAddressContent : function(record, config)
{
if(!Ext.isEmpty(record)) {
var componentType = Zarafa.core.data.SharedComponentType['contact.dialog.contact.addressdetails'];
config = Ext.applyIf(config || {}, {
modal : true
});
Zarafa.core.data.UIFactory.openLayerComponent(componentType, record, config);
}
},
/**
* Function will open {@link Zarafa.contact.dialogs.ContactAddressContentPanel ContactAddressContentPanel}.
* @param {Zarafa.core.data.IPMRecord} record record that will be loaded in
* {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* @param {Object} config Configuration object containing:
* - {@link Zarafa.contact.data.ContactDetailsParser} parser parser that will be used
* to parse details of full name and load the data in
* {@link Zarafa.contact.dialogs.ContactNameContentPanel ContactNameContentPanel}.
* - {@link String} property property that will be modified.
*/
openDetailedPhoneContent : function(record, config)
{
if(!Ext.isEmpty(record)) {
var componentType = Zarafa.core.data.SharedComponentType['contact.dialog.contact.phonedetails'];
config = Ext.applyIf(config || {}, {
modal : true
});
Zarafa.core.data.UIFactory.openLayerComponent(componentType, record, config);
}
},
* Opens a {@link Zarafa.addressbook.dialogs.ABMultiUserSelectionContentPanel ABMultiUserSelectionContentPanel}
* for configuring the categories of the given {@link Zarafa.core.data.IPMRecord records}.
*
* @param {Zarafa.core.data.IPMRecord} record The record, or records for which the categories
* must be configured
* @param {Object} config (optional) Configuration object
*/
openMembersSelectionContent : function(record, config)
{
if(Array.isArray(record)) {
for(var index = 0, len = record.length; index < len; index++) {
Zarafa.contact.Actions.openMembersSelectionContent(record[index], config);
}
return;
}
// Create a copy of the record, we don't want the changes
// to be activated until the user presses the Ok button.
var copy = record.copy();
var store = copy.getSubStore('members');
Zarafa.common.Actions.openABUserMultiSelectionContent({
callback : function() {
record.applyData(copy);
},
convert : function(user) {
return user.convertToDistlistMember();
},
store : store,
selectionCfg : [{
xtype : 'zarafa.memberboxfield',
fieldLabel : _('Members') + ':',
height : 50,
boxStore : store,
flex : 1
}]
});
},
/**
* Function will open a modal dialog to add external contact in distribution list,
* It will open with two fields name and email address.
* Function will open {@link Zarafa.contact.dialogs.DistlistExternalMemberContentPanel DistlistExternalMemberContentPanel}.
* @param {Zarafa.contact.DistlistMemberRecord} record The member record which is shown in dialog
* @param {Object} config Configuration object containing
* - {@link Zarafa.core.data.IPMRecord} parentRecord The parent distribution list record.
*/
openDistlistExternalMemberContent : function(record, config)
{
var componentType = Zarafa.core.data.SharedComponentType['contact.dialog.distlist.externalmember'];
config = Ext.applyIf(config || {}, {
modal : true
});
Zarafa.core.data.UIFactory.openLayerComponent(componentType, record, config);
},
/**
* Function will open a
* {@link Zarafa.contact.dialogs.ContactContentPanel} for contact members,
* {@link Zarafa.contact.dialogs.DistlistContentPanel} for distlist members,
* {Zarafa.addressbook.dialogs.ABUserDetailContentPanel} for addressbook users,
* {Zarafa.addressbook.dialogs.ABGroupDetailContentPanel} for addressbook groups,
* and {Zarafa.contact.dialogs.DistlistExternalMemberContentPanel} for external members.
*
* @param {Zarafa.contact.DistlistMemberRecord} record The distlist member record
* @param {Zarafa.core.data.IPMRecord} parentRecord The distlist record which
* contains memberStore for distribution list members
*/
openDistlistMember : function(record, parentRecord)
{
if (record) {
var openRecord;
switch(record.get('distlist_type')){
case Zarafa.core.mapi.DistlistType.DL_USER:
case Zarafa.core.mapi.DistlistType.DL_USER2:
case Zarafa.core.mapi.DistlistType.DL_USER3:
case Zarafa.core.mapi.DistlistType.DL_DIST:
// Contacts and distribution list from contact folders
openRecord = record.convertToContactRecord();
break;
case Zarafa.core.mapi.DistlistType.DL_USER_AB:
case Zarafa.core.mapi.DistlistType.DL_DIST_AB:
// contacts and distribution list from Addressbook
// implement at server mapisession->openentry.
openRecord = record.convertToAddressBookRecord();
break;
case Zarafa.core.mapi.DistlistType.DL_EXTERNAL_MEMBER:
/* falls through */
default:
// External/oneoff contacts
Zarafa.contact.Actions.openDistlistExternalMemberContent(record, { parentRecord : parentRecord });
break;
}
if(openRecord) {
// FIXME: We put the abRecord into the ShadowStore to be able
// to open it, and obtain all details. However, we also need to
// find a point where we can remove it again.
container.getShadowStore().add(openRecord);
Zarafa.core.data.UIFactory.openViewRecord(openRecord);
}
}
}
};