2 * Ext JS Library 0.30
\r
3 * Copyright(c) 2006-2009, Ext JS, LLC.
\r
4 * licensing@extjs.com
\r
6 * http://extjs.com/license
\r
9 TaskGrid = function(){
\r
12 var completeColumn = new CompleteColumn();
\r
13 var reminderColumn = new ReminderColumn();
\r
15 TaskGrid.superclass.constructor.call(this, {
\r
17 store: tx.data.tasks,
\r
18 sm: new Ext.grid.RowSelectionModel({moveEditorOnEnter: false}),
\r
19 clicksToEdit: 'auto',
\r
20 enableColumnHide:false,
\r
21 enableColumnMove:false,
\r
24 iconCls:'icon-folder',
\r
26 plugins: [completeColumn, reminderColumn],
\r
36 editor: new Ext.form.TextField({
\r
44 dataIndex: 'listId',
\r
45 editor: new ListSelector({
\r
48 renderer : function(v){
\r
49 return tx.data.lists.getName(v);
\r
57 renderer: Ext.util.Format.dateRenderer('D m/d/Y'),
\r
58 dataIndex: 'dueDate',
\r
59 groupRenderer: Ext.util.Format.createTextDateRenderer(),
\r
61 editor: new Ext.form.DateField({
\r
68 view: new TaskView()
\r
71 // Keep the visible date groups in the grid accurate
\r
74 var col = this.getColumnModel().getColumnById('dueDate');
\r
75 if(col.groupRenderer.date.getTime() != new Date().clearTime().getTime()){
\r
76 col.groupRenderer = Ext.util.Format.createTextDateRenderer();
\r
77 tx.data.tasks.applyGrouping();
\r
84 this.on('rowcontextmenu', this.onRowContext, this);
\r
87 Ext.extend(TaskGrid, Ext.grid.EditorGridPanel, {
\r
88 onCellDblClick: function(g, row){
\r
89 clearTimeout(this.autoEditTimer); // allow dbl click without starting edit
\r
90 var id = this.store.getAt(row).id;
\r
92 Ext.air.NativeWindowManager.getTaskWindow(id);
\r
96 onAutoEditClick : function(e, t){
\r
97 clearTimeout(this.autoEditTimer);
\r
101 var row = this.view.findRowIndex(t);
\r
102 var col = this.view.findCellIndex(t);
\r
103 if(row !== false && col !== false){
\r
104 if(this.selModel.isSelected(row) && this.selModel.getCount() === 1){
\r
105 this.autoEditTimer = this.startEditing.defer(300, this, [row, col]);
\r
110 onRowContext : function(grid, row, e){
\r
111 if(!this.menu){ // create context menu on first right click
\r
112 this.menu = new Ext.menu.Menu({
\r
118 handler:function(){
\r
119 Ext.each(this.selModel.getSelections(), function(r){
\r
120 Ext.air.NativeWindowManager.getTaskWindow(r.id);
\r
124 tx.actions.complete,
\r
125 tx.actions.deleteTask
\r
129 if(!this.selModel.isSelected(row)){
\r
130 this.selModel.selectRow(row);
\r
133 this.menu.showAt(e.getXY());
\r
138 TaskView = Ext.extend(Ext.grid.GroupingView, {
\r
141 emptyText: 'There are no tasks to show in this list.',
\r
144 header: Templates.gridHeader
\r
146 getRowClass : function(r){
\r
149 return 'task-completed';
\r
151 if(d.dueDate && d.dueDate.getTime() < new Date().clearTime().getTime()){
\r
152 return 'task-overdue';
\r
159 TaskHeader = function(grid){
\r
160 grid.on('resize', syncFields);
\r
161 grid.on('columnresize', syncFields);
\r
163 // The fields in the grid's header
\r
164 var ntTitle = this.ntTitle = new Ext.form.TextField({
\r
165 renderTo: 'new-task-title',
\r
166 emptyText: 'Add a task...'
\r
169 var ntCat = new ListSelector({
\r
170 renderTo: 'new-task-cat',
\r
172 store:tx.data.lists,
\r
173 listenForLoad: true
\r
176 var ntDue = new Ext.form.DateField({
\r
177 renderTo: 'new-task-due',
\r
183 // syncs the header fields' widths with the grid column widths
\r
184 function syncFields(){
\r
185 var cm = grid.getColumnModel();
\r
186 ntTitle.setSize(cm.getColumnWidth(1)-2);
\r
187 ntCat.setSize(cm.getColumnWidth(2)-4);
\r
188 ntDue.setSize(cm.getColumnWidth(3)-4);
\r
192 var editing = false, focused = false, userTriggered = false;
\r
195 setFocus.defer(20, window, [true]);
\r
201 specialkey: function(f, e){
\r
202 if(e.getKey()==e.ENTER && (!f.isExpanded || !f.isExpanded())){
\r
203 userTriggered = true;
\r
212 ntTitle.on(handlers);
\r
213 ntCat.on(handlers);
\r
214 ntDue.on(handlers);
\r
216 ntTitle.on('focus', function(){
\r
224 ntCat.setValue(tx.data.getActiveListId());
\r
228 function setFocus(v){
\r
231 // when a field in the add bar is blurred, this determines
\r
232 // whether a new task should be created
\r
234 if(editing && !focused){
\r
235 var title = ntTitle.getValue();
\r
236 if(!Ext.isEmpty(title)){
\r
237 tx.data.tasks.createTask(title, ntCat.getRawValue(), ntDue.getValue());
\r
238 ntTitle.setValue('');
\r
239 if(userTriggered){ // if they entered to add the task, then go to a new add automatically
\r
240 userTriggered = false;
\r
241 ntTitle.focus.defer(100, ntTitle);
\r