+++ /dev/null
-<html>\r
-<head>\r
- <title>The source code</title>\r
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
-</head>\r
-<body onload="prettyPrint();">\r
- <pre class="prettyprint lang-js">TaskGrid = function(){\r
- \r
- // custom columns\r
- var completeColumn = new CompleteColumn();\r
- var reminderColumn = new ReminderColumn();\r
- \r
- TaskGrid.superclass.constructor.call(this, {\r
- id:'tasks-grid',\r
- store: tx.data.tasks,\r
- sm: new Ext.grid.RowSelectionModel({moveEditorOnEnter: false}),\r
- clicksToEdit: 'auto',\r
- enableColumnHide:false,\r
- enableColumnMove:false,\r
- autoEncode: true,\r
- title:'All Tasks',\r
- iconCls:'icon-folder',\r
- region:'center',\r
- plugins: [completeColumn, reminderColumn],\r
- margins:'3 3 3 0',\r
- columns: [\r
- completeColumn,\r
- {\r
- header: "Task",\r
- width:400,\r
- sortable: true,\r
- dataIndex: 'title',\r
- id:'task-title',\r
- editor: new Ext.form.TextField({\r
- allowBlank: false\r
- })\r
- },\r
- {\r
- header: "List",\r
- width:150,\r
- sortable: true,\r
- dataIndex: 'listId',\r
- editor: new ListSelector({\r
- store:tx.data.lists\r
- }),\r
- renderer : function(v){\r
- return tx.data.lists.getName(v);\r
- }\r
- },\r
- {\r
- id:'dueDate',\r
- header: "Due Date",\r
- width: 150,\r
- sortable: true,\r
- renderer: Ext.util.Format.dateRenderer('D m/d/Y'),\r
- dataIndex: 'dueDate',\r
- groupRenderer: Ext.util.Format.createTextDateRenderer(),\r
- groupName: 'Due',\r
- editor: new Ext.form.DateField({\r
- format : "m/d/Y"\r
- })\r
- },\r
- reminderColumn\r
- ],\r
-\r
- view: new TaskView()\r
- });\r
- \r
- // Keep the visible date groups in the grid accurate\r
- Ext.TaskMgr.start({\r
- run: function(){\r
- var col = this.getColumnModel().getColumnById('dueDate');\r
- if(col.groupRenderer.date.getTime() != new Date().clearTime().getTime()){\r
- col.groupRenderer = Ext.util.Format.createTextDateRenderer();\r
- tx.data.tasks.applyGrouping();\r
- }\r
- },\r
- interval: 60000,\r
- scope: this\r
- });\r
- \r
- this.on('rowcontextmenu', this.onRowContext, this);\r
-};\r
-\r
-Ext.extend(TaskGrid, Ext.grid.EditorGridPanel, {\r
- onCellDblClick: function(g, row){\r
- clearTimeout(this.autoEditTimer); // allow dbl click without starting edit\r
- var id = this.store.getAt(row).id;\r
- \r
- Ext.air.NativeWindowManager.getTaskWindow(id);\r
- },\r
-\r
- // private\r
- onAutoEditClick : function(e, t){\r
- clearTimeout(this.autoEditTimer);\r
- if(e.button !== 0){\r
- return;\r
- }\r
- var row = this.view.findRowIndex(t);\r
- var col = this.view.findCellIndex(t);\r
- if(row !== false && col !== false){\r
- if(this.selModel.isSelected(row) && this.selModel.getCount() === 1){\r
- this.autoEditTimer = this.startEditing.defer(300, this, [row, col]);\r
- }\r
- }\r
- },\r
- \r
- onRowContext : function(grid, row, e){\r
- if(!this.menu){ // create context menu on first right click\r
- this.menu = new Ext.menu.Menu({\r
- id:'tasks-ctx',\r
- listWidth: 200,\r
- items: [{\r
- text:'Open',\r
- scope: this,\r
- handler:function(){\r
- Ext.each(this.selModel.getSelections(), function(r){\r
- Ext.air.NativeWindowManager.getTaskWindow(r.id);\r
- });\r
- }\r
- },'-',\r
- tx.actions.complete,\r
- tx.actions.deleteTask\r
- ]\r
- });\r
- }\r
- if(!this.selModel.isSelected(row)){\r
- this.selModel.selectRow(row);\r
- }\r
- \r
- this.menu.showAt(e.getXY());\r
- }\r
-})\r
-\r
-\r
-TaskView = Ext.extend(Ext.grid.GroupingView, {\r
- forceFit:true,\r
- ignoreAdd: true,\r
- emptyText: 'There are no tasks to show in this list.',\r
-\r
- templates: {\r
- header: Templates.gridHeader\r
- },\r
- getRowClass : function(r){\r
- var d = r.data;\r
- if(d.completed){\r
- return 'task-completed';\r
- }\r
- if(d.dueDate && d.dueDate.getTime() < new Date().clearTime().getTime()){\r
- return 'task-overdue';\r
- }\r
- return '';\r
- }\r
-});\r
-\r
-\r
-TaskHeader = function(grid){\r
- grid.on('resize', syncFields);\r
- grid.on('columnresize', syncFields);\r
- \r
- // The fields in the grid's header\r
- var ntTitle = this.ntTitle = new Ext.form.TextField({\r
- renderTo: 'new-task-title',\r
- emptyText: 'Add a task...'\r
- });\r
-\r
- var ntCat = new ListSelector({\r
- renderTo: 'new-task-cat',\r
- disabled:true,\r
- store:tx.data.lists,\r
- listenForLoad: true\r
- });\r
-\r
- var ntDue = new Ext.form.DateField({\r
- renderTo: 'new-task-due',\r
- value: new Date(),\r
- disabled:true,\r
- format : "m/d/Y"\r
- });\r
-\r
- // syncs the header fields' widths with the grid column widths\r
- function syncFields(){\r
- var cm = grid.getColumnModel();\r
- ntTitle.setSize(cm.getColumnWidth(1)-2);\r
- ntCat.setSize(cm.getColumnWidth(2)-4);\r
- ntDue.setSize(cm.getColumnWidth(3)-4);\r
- }\r
- syncFields();\r
-\r
- var editing = false, focused = false, userTriggered = false;\r
- var handlers = {\r
- focus: function(){\r
- setFocus.defer(20, window, [true]);\r
- },\r
- blur: function(){\r
- focused = false;\r
- doBlur.defer(250);\r
- },\r
- specialkey: function(f, e){\r
- if(e.getKey()==e.ENTER && (!f.isExpanded || !f.isExpanded())){\r
- userTriggered = true;\r
- e.stopEvent();\r
- f.el.blur();\r
- if(f.triggerBlur){\r
- f.triggerBlur();\r
- }\r
- }\r
- }\r
- }\r
- ntTitle.on(handlers);\r
- ntCat.on(handlers);\r
- ntDue.on(handlers);\r
-\r
- ntTitle.on('focus', function(){\r
- focused = true;\r
- if(!editing){\r
- ntCat.enable();\r
- ntDue.enable();\r
- syncFields();\r
- editing = true;\r
- \r
- ntCat.setValue(tx.data.getActiveListId());\r
- }\r
- });\r
-\r
- function setFocus(v){\r
- focused = v;\r
- }\r
- // when a field in the add bar is blurred, this determines\r
- // whether a new task should be created\r
- function doBlur(){\r
- if(editing && !focused){\r
- var title = ntTitle.getValue();\r
- if(!Ext.isEmpty(title)){\r
- tx.data.tasks.createTask(title, ntCat.getRawValue(), ntDue.getValue());\r
- ntTitle.setValue('');\r
- if(userTriggered){ // if they entered to add the task, then go to a new add automatically\r
- userTriggered = false;\r
- ntTitle.focus.defer(100, ntTitle);\r
- }\r
- }\r
- ntCat.disable();\r
- ntDue.disable();\r
- editing = false;\r
- }\r
- }\r
-};\r
-</pre> \r
-</body>\r
-</html>
\ No newline at end of file