b9614be887c794e7ee48026245aac48c30a2a042
[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: 'attachments', omitDuplicateResolving: true},
78     {name: 'type', omitDuplicateResolving: true}
79 ]);
80
81 /**
82  * @namespace   Tine.Addressbook.Model
83  * @class       Tine.Addressbook.Model.Contact
84  * @extends     Tine.Tinebase.data.Record
85  * @constructor
86  * Model of a contact<br>
87  * 
88  * @author      Cornelius Weiss <c.weiss@metaways.de>
89  */
90 Tine.Addressbook.Model.Contact = Tine.Tinebase.data.Record.create(Tine.Addressbook.Model.ContactArray, {
91     appName: 'Addressbook',
92     modelName: 'Contact',
93     idProperty: 'id',
94     titleProperty: 'n_fn',
95     // ngettext('Contact', 'Contacts', n); gettext('Contacts');
96     recordName: 'Contact',
97     recordsName: 'Contacts',
98     containerProperty: 'container_id',
99     // ngettext('Addressbook', 'Addressbooks', n); gettext('Addressbooks');
100     containerName: 'Addressbook',
101     containersName: 'Addressbooks',
102     copyOmitFields: ['account_id', 'type'],
103     
104     /**
105      * returns true if record has an email address
106      * @return {Boolean}
107      */
108     hasEmail: function() {
109         return this.get('email') || this.get('email_home');
110     },
111     
112     /**
113      * returns true prefered email if available
114      * @return {String}
115      */
116     getPreferedEmail: function(prefered) {
117         var prefered = prefered || 'email',
118             other = prefered == 'email' ? 'email_home' : 'email';
119             
120         return (this.get(prefered) || this.get(other));
121     }
122 });
123
124 /**
125  * get filtermodel of contact model
126  * 
127  * @namespace Tine.Addressbook.Model
128  * @static
129  * @return {Array} filterModel definition
130  */ 
131 Tine.Addressbook.Model.Contact.getFilterModel = function() {
132     var app = Tine.Tinebase.appMgr.get('Addressbook');
133     
134     var typeStore = [['contact', app.i18n._('Contact')], ['user', app.i18n._('User Account')]];
135     
136     return [
137         {label: _('Quick search'),                                                      field: 'query',              operators: ['contains']},
138         {filtertype: 'tine.widget.container.filtermodel', app: app, recordClass: Tine.Addressbook.Model.Contact},
139         {filtertype: 'addressbook.listMember', app: app},
140         {label: app.i18n._('First Name'),                                               field: 'n_given' },
141         {label: app.i18n._('Last Name'),                                                field: 'n_family'},
142         {label: app.i18n._('Company'),                                                  field: 'org_name'},
143         {label: app.i18n._('Unit'),                                                     field: 'org_unit'},
144         {label: app.i18n._('Phone'),                                                    field: 'telephone',          operators: ['contains']},
145         {label: app.i18n._('Job Title'),                                                field: 'title'},
146         {label: app.i18n._('Description'),                                              field: 'note'},
147         {label: app.i18n._('E-Mail'),                                                   field: 'email_query',        operators: ['contains']},
148         {filtertype: 'tinebase.tag', app: app},
149 //        {label: app.i18n._('Job Role'),                                                 field: 'role'},
150 //        {label: app.i18n._('Birthday'),    field: 'bday', valueType: 'date'},
151         {label: app.i18n._('Street') + ' (' + app.i18n._('Company Address') + ')',      field: 'adr_one_street',     defaultOperator: 'equals'},
152         {label: app.i18n._('Region') + ' (' + app.i18n._('Company Address') + ')',      field: 'adr_one_region',     defaultOperator: 'equals'},
153         {label: app.i18n._('Postal Code') + ' (' + app.i18n._('Company Address') + ')', field: 'adr_one_postalcode', defaultOperator: 'equals'},
154         {label: app.i18n._('City') + '  (' + app.i18n._('Company Address') + ')',       field: 'adr_one_locality'},
155         {label: app.i18n._('Country') + '  (' + app.i18n._('Company Address') + ')',    field: 'adr_one_countryname', valueType: 'country'},
156         {label: app.i18n._('Street') + ' (' + app.i18n._('Private Address') + ')',      field: 'adr_two_street',     defaultOperator: 'equals'},
157         {label: app.i18n._('Region') + ' (' + app.i18n._('Private Address') + ')',      field: 'adr_two_region',     defaultOperator: 'equals'},
158         {label: app.i18n._('Postal Code') + ' (' + app.i18n._('Private Address') + ')', field: 'adr_two_postalcode', defaultOperator: 'equals'},
159         {label: app.i18n._('City') + ' (' + app.i18n._('Private Address') + ')',        field: 'adr_two_locality'},
160         {label: app.i18n._('Country') + '  (' + app.i18n._('Private Address') + ')',    field: 'adr_two_countryname', valueType: 'country'},
161         {label: app.i18n._('Type'), defaultValue: 'contact', valueType: 'combo',        field: 'type',               store: typeStore},
162         {label: _('Last Modified Time'),                                                field: 'last_modified_time', valueType: 'date'},
163         {label: _('Last Modified By'),                                                  field: 'last_modified_by',   valueType: 'user'},
164         {label: _('Creation Time'),                                                     field: 'creation_time',      valueType: 'date'},
165         {label: _('Created By'),                                                        field: 'created_by',         valueType: 'user'}
166     ];
167 };
168     
169 /**
170  * default timesheets backend
171  */
172 Tine.Addressbook.contactBackend = new Tine.Tinebase.data.RecordProxy({
173     appName: 'Addressbook',
174     modelName: 'Contact',
175     recordClass: Tine.Addressbook.Model.Contact
176 });
177
178 /**
179  * list model
180  */
181 Tine.Addressbook.Model.List = Tine.Tinebase.data.Record.create([
182    {name: 'id'},
183    {name: 'container_id'},
184    {name: 'created_by'},
185    {name: 'creation_time'},
186    {name: 'last_modified_by'},
187    {name: 'last_modified_time'},
188    {name: 'is_deleted'},
189    {name: 'deleted_time'},
190    {name: 'deleted_by'},
191    {name: 'name'},
192    {name: 'description'},
193    {name: 'members'},
194    {name: 'email'},
195    {name: 'type'},
196    {name: 'group_id'}
197 ], {
198     appName: 'Addressbook',
199     modelName: 'List',
200     idProperty: 'id',
201     titleProperty: 'name',
202     // ngettext('List', 'Lists', n); gettext('Lists');
203     recordName: 'List',
204     recordsName: 'Lists',
205     containerProperty: 'container_id',
206     // ngettext('Addressbook', 'Addressbooks', n); gettext('Addressbooks');
207     containerName: 'Addressbook',
208     containersName: 'Addressbooks',
209     copyOmitFields: ['group_id']
210 });