7147727146485bb6bcac8f8931c594ede98ecb97
[tine20] / tine20 / Addressbook / js / Model.js
1 /*
2  * Tine 2.0
3  * 
4  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
5  * @author      Cornelius Weiss <c.weiss@metaways.de>
6  * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
7  */
8  
9 /*global Ext, Tine*/
10  
11 Ext.ns('Tine.Addressbook.Model');
12
13 // TODO: move this into model definition and replace uscases (?) with getter fn
14 Tine.Addressbook.Model.ContactArray = Tine.Tinebase.Model.genericFields.concat([
15     {name: 'id', omitDuplicateResolving: true},
16     {name: 'tid', omitDuplicateResolving: true},
17     {name: 'private', omitDuplicateResolving: true},
18     {name: 'cat_id', omitDuplicateResolving: true},
19     {name: 'n_family', label: 'Last Name', group: 'Name' },//_('Last Name') _('Name')
20     {name: 'n_given', label: 'First Name', group: 'Name' }, //_('First Name')
21     {name: 'n_middle', label: 'Middle Name', group: 'Name' }, //_('Middle Name')
22     {name: 'n_prefix', label: 'Title', group: 'Name' }, //_('Title')
23     {name: 'n_suffix', label: 'Suffix', group: 'Name'}, //_('Suffix')
24     {name: 'n_fn', label: 'Display Name', group: 'Name', omitDuplicateResolving: true }, //_('Display Name')
25     {name: 'n_fileas', group: 'Name', omitDuplicateResolving: true },
26     {name: 'bday', label: 'Birthday', type: 'date', dateFormat: Date.patterns.ISO8601Long }, //_('Birthday')
27     {name: 'org_name', label: 'Company', group: 'Company' }, //_('Company')
28     {name: 'org_unit', label: 'Unit', group: 'Company' }, //_('Unit')
29     {name: 'salutation', label: 'Salutation', group: 'Name' }, //_('Salutation')
30     {name: 'title', label: 'Job Title', group: 'Company' }, //_('Job Title')
31     {name: 'role', label: 'Job Role', group: 'Company' }, //_('Job Role')
32     {name: 'assistent', group: 'Company', omitDuplicateResolving: true},
33     {name: 'room', label: 'Room', group: 'Company' }, //_('Room')
34     {name: 'adr_one_street', label: 'Street (Company Address)', group: 'Company Address' }, //_('Street (Company Address)')  _('Company Address')
35     {name: 'adr_one_street2', label: 'Street 2 (Company Address)', group: 'Company Address' }, //_('Street 2 (Company Address)')
36     {name: 'adr_one_locality', label: 'City (Company Address)', group: 'Company Address' }, //_('City (Company Address)')
37     {name: 'adr_one_region', label: 'Region (Company Address)', group: 'Company Address' }, //_('Region (Company Address)')
38     {name: 'adr_one_postalcode', label: 'Postal Code (Company Address)', group: 'Company Address' }, //_('Postal Code (Company Address)')
39     {name: 'adr_one_countryname', label: 'Country (Company Address)', group: 'Company Address' }, //_('Country (Company Address)')
40     {name: 'adr_one_lon', group: 'Company Address', omitDuplicateResolving: true },
41     {name: 'adr_one_lat', group: 'Company Address', omitDuplicateResolving: true },
42     {name: 'label', omitDuplicateResolving: true},
43     {name: 'adr_two_street', label: 'Street (Private Address)', group: 'Private Address' }, //_('Street (Private Address)')  _('Private Address')
44     {name: 'adr_two_street2', label: 'Street 2 (Private Address)', group: 'Private Address' }, //_('Street 2 (Private Address)')
45     {name: 'adr_two_locality', label: 'City (Private Address)', group: 'Private Address' }, //_('City (Private Address)')
46     {name: 'adr_two_region', label: 'Region (Private Address)', group: 'Private Address' }, //_('Region (Private Address)')
47     {name: 'adr_two_postalcode', label: 'Postal Code (Private Address)', group: 'Private Address' }, //_('Postal Code (Private Address)')
48     {name: 'adr_two_countryname', label: 'Country (Private Address)', group: 'Private Address' }, //_('Country (Private Address)')
49     {name: 'adr_two_lon', group: 'Private Address', omitDuplicateResolving: true},
50     {name: 'adr_two_lat', group: 'Private Address', omitDuplicateResolving: true},
51     {name: 'tel_work', label: 'Phone', group: 'Company Communication' }, //_('Phone') _('Company Communication') 
52     {name: 'tel_cell', label: 'Mobile', group: 'Company Communication' }, //_('Mobile')
53     {name: 'tel_fax', label: 'Fax', group: 'Company Communication' }, //_('Fax')
54     {name: 'tel_assistent', group: 'contact_infos', omitDuplicateResolving: true },
55     {name: 'tel_car', group: 'contact_infos', omitDuplicateResolving: true },
56     {name: 'tel_pager', group: 'contact_infos', omitDuplicateResolving: true },
57     {name: 'tel_home', label: 'Phone (private)', group: 'Private Communication' }, //_('Phone (private)') _('Private Communication') 
58     {name: 'tel_fax_home', label: 'Fax (private)', group: 'Private Communication' }, //_('Fax (private)')
59     {name: 'tel_cell_private', label: 'Mobile (private)', group: 'Private Communication' }, //_('Mobile (private)')
60     {name: 'tel_other', group: 'contact_infos', omitDuplicateResolving: true },
61     {name: 'tel_prefer', group: 'contact_infos', omitDuplicateResolving: true},
62     {name: 'email', label: 'E-Mail', group: 'Company Communication' }, //_('E-Mail')
63     {name: 'email_home', label: 'E-Mail (private)', group: 'Private Communication' }, //_('E-Mail (private)')
64     {name: 'url', label: 'Web', group: 'Company Communication' }, //_('Web')
65     {name: 'url_home', label: 'Web (private)', group: 'Private Communication' }, //_('Web (private)')
66     {name: 'freebusy_uri', omitDuplicateResolving: true},
67     {name: 'calendar_uri', omitDuplicateResolving: true},
68     {name: 'note', label: 'Description' }, //_('Description')
69     {name: 'tz', omitDuplicateResolving: true},
70     {name: 'pubkey', omitDuplicateResolving: true},
71     {name: 'jpegphoto', omitDuplicateResolving: true},
72     {name: 'account_id', omitDuplicateResolving: true},
73     {name: 'tags'},
74     {name: 'notes', omitDuplicateResolving: true},
75     {name: 'relations', omitDuplicateResolving: true},
76     {name: 'customfields', omitDuplicateResolving: true},
77     {name: 'type', omitDuplicateResolving: true}
78 ]);
79
80 /**
81  * @namespace   Tine.Addressbook.Model
82  * @class       Tine.Addressbook.Model.Contact
83  * @extends     Tine.Tinebase.data.Record
84  * @constructor
85  * Model of a contact<br>
86  * 
87  * @author      Cornelius Weiss <c.weiss@metaways.de>
88  */
89 Tine.Addressbook.Model.Contact = Tine.Tinebase.data.Record.create(Tine.Addressbook.Model.ContactArray, {
90     appName: 'Addressbook',
91     modelName: 'Contact',
92     idProperty: 'id',
93     titleProperty: 'n_fn',
94     // ngettext('Contact', 'Contacts', n); gettext('Contacts');
95     recordName: 'Contact',
96     recordsName: 'Contacts',
97     containerProperty: 'container_id',
98     // ngettext('Addressbook', 'Addressbooks', n); gettext('Addressbooks');
99     containerName: 'Addressbook',
100     containersName: 'Addressbooks',
101     copyOmitFields: ['account_id', 'type'],
102     
103     /**
104      * returns true if record has an email address
105      * @return {Boolean}
106      */
107     hasEmail: function() {
108         return this.get('email') || this.get('email_home');
109     },
110     
111     /**
112      * returns true prefered email if available
113      * @return {String}
114      */
115     getPreferedEmail: function(prefered) {
116         var prefered = prefered || 'email',
117             other = prefered == 'email' ? 'email_home' : 'email';
118             
119         return (this.get(prefered) || this.get(other));
120     }
121 });
122
123 /**
124  * get filtermodel of contact model
125  * 
126  * @namespace Tine.Addressbook.Model
127  * @static
128  * @return {Array} filterModel definition
129  */ 
130 Tine.Addressbook.Model.Contact.getFilterModel = function() {
131     var app = Tine.Tinebase.appMgr.get('Addressbook');
132     
133     var typeStore = [['contact', app.i18n._('Contact')], ['user', app.i18n._('User Account')]];
134     
135     return [
136         {label: _('Quick Search'),                                                      field: 'query',              operators: ['contains']},
137         {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Addressbook.Model.Contact},
138         {filtertype: 'addressbook.listMember', app: app},
139         {label: app.i18n._('First Name'),                                               field: 'n_given' },
140         {label: app.i18n._('Last Name'),                                                field: 'n_family'},
141         {label: app.i18n._('Company'),                                                  field: 'org_name'},
142         {label: app.i18n._('Unit'),                                                     field: 'org_unit'},
143         {label: app.i18n._('Phone'),                                                    field: 'telephone',          operators: ['contains']},
144         {label: app.i18n._('Job Title'),                                                field: 'title'},
145         {label: app.i18n._('Description'),                                              field: 'note'},
146         {label: app.i18n._('E-Mail'),                                                   field: 'email_query',        operators: ['contains']},
147         {filtertype: 'tinebase.tag', app: app},
148 //        {label: app.i18n._('Job Role'),                                                 field: 'role'},
149 //        {label: app.i18n._('Birthday'),    field: 'bday', valueType: 'date'},
150         {label: app.i18n._('Street') + ' (' + app.i18n._('Company Address') + ')',      field: 'adr_one_street',     defaultOperator: 'equals'},
151         {label: app.i18n._('Region') + ' (' + app.i18n._('Company Address') + ')',      field: 'adr_one_region',     defaultOperator: 'equals'},
152         {label: app.i18n._('Postal Code') + ' (' + app.i18n._('Company Address') + ')', field: 'adr_one_postalcode', defaultOperator: 'equals'},
153         {label: app.i18n._('City') + '  (' + app.i18n._('Company Address') + ')',       field: 'adr_one_locality'},
154         {label: app.i18n._('Country') + '  (' + app.i18n._('Company Address') + ')',    field: 'adr_one_countryname', valueType: 'country'},
155         {label: app.i18n._('Street') + ' (' + app.i18n._('Private Address') + ')',      field: 'adr_two_street',     defaultOperator: 'equals'},
156         {label: app.i18n._('Region') + ' (' + app.i18n._('Private Address') + ')',      field: 'adr_two_region',     defaultOperator: 'equals'},
157         {label: app.i18n._('Postal Code') + ' (' + app.i18n._('Private Address') + ')', field: 'adr_two_postalcode', defaultOperator: 'equals'},
158         {label: app.i18n._('City') + ' (' + app.i18n._('Private Address') + ')',        field: 'adr_two_locality'},
159         {label: app.i18n._('Country') + '  (' + app.i18n._('Private Address') + ')',    field: 'adr_two_countryname', valueType: 'country'},
160         {label: app.i18n._('Type'), defaultValue: 'contact', valueType: 'combo',        field: 'type',               store: typeStore},
161         {label: _('Last Modified Time'),                                                field: 'last_modified_time', valueType: 'date'},
162         {label: _('Last Modified By'),                                                  field: 'last_modified_by',   valueType: 'user'},
163         {label: _('Creation Time'),                                                     field: 'creation_time',      valueType: 'date'},
164         {label: _('Created By'),                                                        field: 'created_by',         valueType: 'user'}
165     ];
166 };
167     
168 /**
169  * default timesheets backend
170  */
171 Tine.Addressbook.contactBackend = new Tine.Tinebase.data.RecordProxy({
172     appName: 'Addressbook',
173     modelName: 'Contact',
174     recordClass: Tine.Addressbook.Model.Contact
175 });
176
177 /**
178  * list model
179  */
180 Tine.Addressbook.Model.List = Tine.Tinebase.data.Record.create([
181    {name: 'id'},
182    {name: 'container_id'},
183    {name: 'created_by'},
184    {name: 'creation_time'},
185    {name: 'last_modified_by'},
186    {name: 'last_modified_time'},
187    {name: 'is_deleted'},
188    {name: 'deleted_time'},
189    {name: 'deleted_by'},
190    {name: 'name'},
191    {name: 'description'},
192    {name: 'members'},
193    {name: 'email'},
194    {name: 'type'},
195    {name: 'group_id'}
196 ], {
197     appName: 'Addressbook',
198     modelName: 'List',
199     idProperty: 'id',
200     titleProperty: 'name',
201     // ngettext('List', 'Lists', n); gettext('Lists');
202     recordName: 'List',
203     recordsName: 'Lists',
204     containerProperty: 'container_id',
205     // ngettext('Addressbook', 'Addressbooks', n); gettext('Addressbooks');
206     containerName: 'Addressbook',
207     containersName: 'Addressbooks',
208     copyOmitFields: ['group_id']
209 });