Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / docs / source / TaskGrid.html
diff --git a/docs/source/TaskGrid.html b/docs/source/TaskGrid.html
new file mode 100644 (file)
index 0000000..0fe659f
--- /dev/null
@@ -0,0 +1,251 @@
+<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