1d60fc821578019f4c6a376aaba8fab8ff8f3f4c
[tine20] / tine20 / Tasks / js / TaskGridPanel.js
1 /*
2  * Tine 2.0
3  * 
4  * @package     Tasks
5  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
6  * @author      Cornelius Weiss <c.weiss@metaways.de>
7  * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
8  *
9  */
10
11 Ext.namespace('Tine.Tasks');
12
13 /**
14  * Tasks grid panel
15  * 
16  * @namespace   Tine.Tasks
17  * @class       Tine.Tasks.TaskGridPanel
18  * @extends     Tine.widgets.grid.GridPanel
19  * 
20  * <p>Tasks Grid Panel</p>
21  * <p><pre>
22  * </pre></p>
23  * 
24  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
25  * @author      Cornelius Weiss <c.weiss@metaways.de>
26  * @copyright   Copyright (c) 2007-2008 Metaways Infosystems GmbH (http://www.metaways.de)
27  * 
28  * @param       {Object} config
29  * @constructor
30  * Create a new Tine.Tasks.TaskGridPanel
31  */
32 Tine.Tasks.TaskGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
33     /**
34      * record class
35      * @cfg {Tine.Tasks.Model.Task} recordClass
36      */
37     recordClass: Tine.Tasks.Model.Task,
38     
39     /**
40      * @private grid cfg
41      */
42     defaultSortInfo: {field: 'due', dir: 'ASC'},
43     gridConfig: {
44         clicksToEdit: 'auto',
45         quickaddMandatory: 'summary',
46         resetAllOnNew: false,
47         autoExpandColumn: 'summary',
48         // drag n drop
49         enableDragDrop: true,
50         ddGroup: 'containerDDGroup'
51     },
52     
53     // specialised translations
54     // ngettext('Do you really want to delete the selected task?', 'Do you really want to delete the selected tasks?', n);
55     i18nDeleteQuestion: ['Do you really want to delete the selected task?', 'Do you really want to delete the selected tasks?'],
56     
57     /**
58      * @private
59      */
60     initComponent: function() {
61         this.recordProxy = Tine.Tasks.JsonBackend;
62         this.gridConfig.cm = this.getColumnModel();
63         
64         this.defaultFilters = [
65             {field: 'container_id', operator: 'equals', value: {path: Tine.Tinebase.container.getMyNodePath()}}
66         ];
67         Tine.Tasks.TaskGridPanel.superclass.initComponent.call(this);
68         
69         // the editGrids onEditComplete calls the focusCell after a edit operation
70         // this leads to a 'flicker' effect we dont want!
71         // mhh! but disabling this, breaks keynav 
72         //this.grid.view.focusCell = Ext.emptyFn;
73     },
74     
75     /**
76      * returns cm
77      * @return Ext.grid.ColumnModel
78      * @private
79      */
80     getColumnModel: function(){
81         return new Ext.grid.ColumnModel({
82         defaults: {
83             sortable: true,
84             resizable: true
85         },
86         columns: [
87         {   id: 'tags', header: this.app.i18n._('Tags'), width: 40,  dataIndex: 'tags', sortable: false, renderer: Tine.Tinebase.common.tagsRenderer 
88         }, {
89             id: 'lead',
90             header: this.app.i18n._('Lead'),
91             width: 150,
92             dataIndex: 'relations',
93             renderer: Tine.widgets.grid.RendererManager.get('Tasks', 'Task', 'lead'),
94             sortable: false
95         }, {
96             id: 'summary',
97             header: this.app.i18n._("Summary"),
98             width: 400,
99             dataIndex: 'summary',
100             quickaddField: new Ext.form.TextField({
101                 emptyText: this.app.i18n._('Add a task...')
102             })
103         }, {
104             id: 'due',
105             header: this.app.i18n._("Due Date"),
106             width: 145,
107             dataIndex: 'due',
108             renderer: Tine.Tinebase.common.dateTimeRenderer,
109             editor: new Ext.ux.form.DateTimeField({
110                 defaultTime: '12:00',
111                 allowBlank: true
112             }),
113             quickaddField: new Ext.ux.form.DateTimeField({
114                 defaultTime: '12:00',
115                 allowBlank: true
116             })
117         }, {
118             id: 'priority',
119             header: this.app.i18n._("Priority"),
120             width: 65,
121             dataIndex: 'priority',
122             renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Tasks', 'taskPriority'),
123             editor: {
124                 xtype: 'widget-keyfieldcombo',
125                 app: 'Tasks',
126                 keyFieldName: 'taskPriority'
127             },
128             quickaddField: new Tine.Tinebase.widgets.keyfield.ComboBox({
129                 app: 'Tasks',
130                 keyFieldName: 'taskPriority',
131                 value: 'NORMAL'
132             })
133         }, {
134             id: 'percent',
135             header: this.app.i18n._("Percent"),
136             width: 50,
137             dataIndex: 'percent',
138             renderer: Ext.ux.PercentRenderer,
139             editor: new Ext.ux.PercentCombo({
140                 autoExpand: true,
141                 blurOnSelect: true
142             }),
143             quickaddField: new Ext.ux.PercentCombo({
144                 autoExpand: true
145             })
146         }, {
147             id: 'status',
148             header: this.app.i18n._("Status"),
149             width: 85,
150             dataIndex: 'status',
151             renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Tasks', 'taskStatus'),
152             editor: {
153                 xtype: 'widget-keyfieldcombo',
154                 app: 'Tasks',
155                 keyFieldName: 'taskStatus'
156             },
157             quickaddField: new Tine.Tinebase.widgets.keyfield.ComboBox({
158                 app: 'Tasks',
159                 keyFieldName: 'taskStatus',
160                 value: 'NEEDS-ACTION'
161             })
162         }, {
163             id: 'creation_time',
164             header: this.app.i18n._("Creation Time"),
165             hidden: true,
166             width: 90,
167             dataIndex: 'creation_time',
168             renderer: Tine.Tinebase.common.dateTimeRenderer
169         }, {
170             id: 'completed',
171             header: this.app.i18n._("Completed"),
172             hidden: true,
173             width: 90,
174             dataIndex: 'completed',
175             renderer: Tine.Tinebase.common.dateTimeRenderer
176         }, {
177             id: 'organizer',
178             header: this.app.i18n._('Responsible'),
179             width: 200,
180             dataIndex: 'organizer',
181             renderer: Tine.Tinebase.common.accountRenderer,
182             quickaddField: Tine.widgets.form.RecordPickerManager.get('Addressbook', 'Contact', {
183                 userOnly: true,
184                 useAccountRecord: true,
185                 blurOnSelect: true,
186                 selectOnFocus: true,
187                 allowEmpty: true,
188                 value: Tine.Tinebase.registry.get('currentAccount')
189             })
190           // TODO add customfields and modlog columns, atm they break the layout :(
191         }]/*.concat(this.getModlogColumns().concat(this.getCustomfieldColumns()))*/});
192     },
193
194     /**
195      * Return CSS class to apply to rows depending upon due status
196      * 
197      * @param {Tine.Tasks.Model.Task} record
198      * @param {Integer} index
199      * @return {String}
200      */
201     getViewRowClass: function(record, index) {
202         var due = record.get('due');
203          
204         var className = '';
205         
206         if(record.get('status') == 'COMPLETED') {
207             className += 'tasks-grid-completed';
208         } else  if (due) {
209             var dueDay = due.format('Y-m-d');
210             var today = new Date().format('Y-m-d');
211
212             if (dueDay == today) {
213                 className += 'tasks-grid-duetoday';
214             } else if (dueDay < today) {
215                 className += 'tasks-grid-overdue';
216             }
217             
218         }
219         return className;
220     }
221 });