]> git.proxmox.com Git - extjs.git/blame - extjs/examples/classic/simple-tasks/app/view/tasks/Grid.js
add extjs 6.0.1 sources
[extjs.git] / extjs / examples / classic / simple-tasks / app / view / tasks / Grid.js
CommitLineData
6527f429
DM
1/**\r
2 * @class SimpleTasks.view.tasks.List\r
3 * @extends Ext.grid.Panel\r
4 * The tasks list view. A grid that displays a list of tasks.\r
5 */\r
6Ext.define('SimpleTasks.view.tasks.Grid', {\r
7 extend: 'Ext.grid.Panel',\r
8 xtype: 'taskGrid',\r
9 requires: [\r
10 'SimpleTasks.ux.DragDrop',\r
11 'SimpleTasks.ux.StatusColumn',\r
12 'SimpleTasks.ux.ReminderColumn',\r
13 'Ext.grid.plugin.CellEditing',\r
14 'Ext.grid.column.Action',\r
15 'Ext.grid.column.Date',\r
16 'Ext.grid.feature.Grouping',\r
17 'Ext.grid.plugin.DragDrop',\r
18 'Ext.ux.TreePicker'\r
19 ],\r
20 store: 'Tasks',\r
21\r
22 viewConfig: {\r
23 plugins: {\r
24 ptype: 'gridviewdragdrop',\r
25 ddGroup: 'task',\r
26 dragText: 'Drag task to change list',\r
27 enableDrop: false\r
28 },\r
29 getRowClass: function(record, rowIndex, rowParams, store){\r
30 var due = record.get('due');\r
31 if(record.get('done')) {\r
32 return 'tasks-completed-task';\r
33 } else if(due && (due < Ext.Date.clearTime(new Date()))) {\r
34 return 'tasks-overdue-task';\r
35 }\r
36 }\r
37 },\r
38\r
39 dockedItems: [\r
40 {\r
41 xtype: 'taskForm',\r
42 dock: 'top',\r
43 // the grid's column headers are a docked item with a weight of 100.\r
44 // giving this a weight of 101 causes it to be docked under the column headers\r
45 weight: 101,\r
46 bodyStyle: {\r
47 'background-color': '#E4E5E7'\r
48 }\r
49 }\r
50 ],\r
51\r
52 /**\r
53 * @event editclick\r
54 * Fires when an edit icon is clicked\r
55 * @param {Ext.grid.View} view\r
56 * @param {Number} rowIndex\r
57 * @param {Number} colIndex\r
58 * @param {Ext.grid.column.Action} column\r
59 * @param {EventObject} e\r
60 */\r
61\r
62 /**\r
63 * @event deleteclick\r
64 * Fires when a delete icon is clicked\r
65 * @param {Ext.grid.View} view\r
66 * @param {Number} rowIndex\r
67 * @param {Number} colIndex\r
68 * @param {Ext.grid.column.Action} column\r
69 * @param {EventObject} e\r
70 */\r
71\r
72 /**\r
73 * @event edit\r
74 * Fires when a record is edited using the CellEditing plugin or the statuscolumn\r
75 * @param {SimpleTasks.model.Task} task The task record that was edited\r
76 */\r
77\r
78 /**\r
79 * @event reminderselect\r
80 * Fires when a reminder time is selected from the reminder column's dropdown menu\r
81 * @param {SimpleTasks.model.Task} task the underlying record of the row that was clicked to show the reminder menu\r
82 * @param {String|Number} value The value that was selected\r
83 */\r
84\r
85 initComponent: function() {\r
86 var me = this,\r
87 cellEditingPlugin = Ext.create('Ext.grid.plugin.CellEditing'),\r
88 groupingFeature = Ext.create('Ext.grid.feature.Grouping', {\r
89 groupHeaderTpl: [\r
90 '{groupValue:this.renderDueDate}',\r
91 {\r
92 renderDueDate: me.renderDueDate\r
93 }\r
94 ],\r
95 enableGroupingMenu: false\r
96 });\r
97\r
98 me.plugins = [cellEditingPlugin];\r
99\r
100 me.features = [groupingFeature];\r
101\r
102 me.columns = {\r
103 defaults: {\r
104 draggable: false,\r
105 resizable: false,\r
106 hideable: false\r
107 },\r
108 items: [\r
109 {\r
110 xtype: 'statuscolumn',\r
111 dataIndex: 'done',\r
112 cls: 'tasks-icon-column-header tasks-done-column-header',\r
113 width: 24,\r
114 align: 'center',\r
115 menuDisabled: true,\r
116 sortable: false,\r
117 listeners: {\r
118 'checkchange': Ext.bind(me.handleCheckChange, me)\r
119 }\r
120 },\r
121 {\r
122 text: 'Title',\r
123 dataIndex: 'title',\r
124 flex: 1,\r
125 emptyCellText: '',\r
126 editor: {\r
127 xtype: 'textfield',\r
128 selectOnFocus: true\r
129 }\r
130 },\r
131 {\r
132 text: 'List',\r
133 dataIndex: 'list_id',\r
134 width: 200,\r
135 editor: {\r
136 xtype: 'treepicker',\r
137 displayField: 'name',\r
138 store: Ext.create('SimpleTasks.store.Lists', {storeId: 'Lists-TaskGrid' })\r
139 },\r
140 renderer: me.renderList\r
141 },\r
142 {\r
143 xtype: 'datecolumn',\r
144 text: 'Due Date',\r
145 dataIndex: 'due',\r
146 width: 100,\r
147 editor: 'datefield',\r
148 format: 'n/j/Y',\r
149 emptyCellText: ''\r
150 },\r
151 {\r
152 xtype: 'remindercolumn',\r
153 dataIndex: 'reminder',\r
154 cls: 'tasks-icon-column-header tasks-reminder-column-header',\r
155 width: 24,\r
156 tooltip: 'Set Reminder',\r
157 menuPosition: 'tr-br',\r
158 menuDisabled: true,\r
159 sortable: false,\r
160 emptyCellText: '',\r
161 listeners: {\r
162 select: Ext.bind(me.handleReminderSelect, me)\r
163 }\r
164 },\r
165 {\r
166 xtype: 'actioncolumn',\r
167 cls: 'tasks-icon-column-header tasks-edit-column-header',\r
168 width: 24,\r
169 icon: 'resources/images/edit_task.png',\r
170 iconCls: 'x-hidden',\r
171 tooltip: 'Edit',\r
172 menuDisabled: true,\r
173 sortable: false,\r
174 handler: Ext.bind(me.handleEditClick, me)\r
175 },\r
176 {\r
177 xtype: 'actioncolumn',\r
178 cls: 'tasks-icon-column-header tasks-delete-column-header',\r
179 width: 24,\r
180 icon: 'resources/images/delete.png',\r
181 iconCls: 'x-hidden',\r
182 tooltip: 'Delete',\r
183 menuDisabled: true,\r
184 sortable: false,\r
185 handler: Ext.bind(me.handleDeleteClick, me)\r
186 }\r
187 ]\r
188 };\r
189\r
190 me.callParent(arguments);\r
191\r
192 cellEditingPlugin.on('edit', me.handleCellEdit, this);\r
193\r
194 },\r
195\r
196 /**\r
197 * Handles a click on the edit icon\r
198 * @private\r
199 * @param {Ext.grid.View} gridView\r
200 * @param {Number} rowIndex\r
201 * @param {Number} colIndex\r
202 * @param {Ext.grid.column.Action} column\r
203 * @param {EventObject} e\r
204 */\r
205 handleEditClick: function(gridView, rowIndex, colIndex, column, e) {\r
206 // Fire a "deleteclick" event with all the same args as this handler\r
207 this.fireEvent('editclick', gridView, rowIndex, colIndex, column, e);\r
208 },\r
209\r
210 /**\r
211 * Handles a click on a delete icon\r
212 * @private\r
213 * @param {Ext.grid.View} gridView\r
214 * @param {Number} rowIndex\r
215 * @param {Number} colIndex\r
216 * @param {Ext.grid.column.Action} column\r
217 * @param {EventObject} e\r
218 */\r
219 handleDeleteClick: function(gridView, rowIndex, colIndex, column, e) {\r
220 // Fire a "deleteclick" event with all the same args as this handler\r
221 this.fireEvent('deleteclick', gridView, rowIndex, colIndex, column, e);\r
222 },\r
223\r
224 /**\r
225 * Handles a "checkchange" event on the "done" column\r
226 * @private\r
227 * @param {SimpleTasks.ux.StatusColumn} column\r
228 * @param {Number} rowIndex\r
229 * @param {Boolean} checked\r
230 */\r
231 handleCheckChange: function(column, rowIndex, checked) {\r
232 this.fireEvent('recordedit', this.store.getAt(rowIndex));\r
233 },\r
234\r
235 /**\r
236 * Handles a "select" event on the reminder column\r
237 * @private\r
238 * @param {SimpleTasks.model.Task} task the underlying record of the row that was clicked to show the reminder menu\r
239 * @param {String|Number} value The value that was selected\r
240 */\r
241 handleReminderSelect: function(task, value) {\r
242 this.fireEvent('reminderselect', task, value);\r
243 },\r
244\r
245 /**\r
246 * Handles the CellEditing plugin's "edit" event\r
247 * @private\r
248 * @param {Ext.grid.plugin.CellEditing} editor\r
249 * @param {Object} e an edit event object\r
250 */\r
251 handleCellEdit: function(editor, e) {\r
252 this.fireEvent('recordedit', e.record);\r
253 },\r
254\r
255 /**\r
256 * Renderer for the list column\r
257 * @private\r
258 * @param {Number} value\r
259 * @param {Object} metaData\r
260 * @param {SimpleTasks.model.Task} task\r
261 * @param {Number} rowIndex\r
262 * @param {Number} colIndex\r
263 * @param {SimpleTasks.store.Tasks} store\r
264 * @param {Ext.grid.View} view\r
265 */\r
266 renderList: function(value, metaData, task, rowIndex, colIndex, store, view) {\r
267 var listsStore = Ext.getStore('Lists'),\r
268 node = value ? listsStore.getNodeById(value) : listsStore.getRoot();\r
269\r
270 return node.get('name');\r
271 },\r
272\r
273 /**\r
274 * Renderer for the group headers\r
275 * @private\r
276 * @param {Date} date\r
277 */\r
278 renderDueDate: function(date) {\r
279 var today = Ext.Date.clearTime(new Date()),\r
280 todayTime = today.getTime(),\r
281 dueDateTime;\r
282\r
283 if(!date) {\r
284 return '(No Date)';\r
285 }\r
286 dueDateTime = Ext.Date.clearTime(date).getTime();\r
287 if(dueDateTime === todayTime) {\r
288 return 'Today';\r
289 }\r
290 if(dueDateTime > todayTime) {\r
291 if(dueDateTime === Ext.Date.add(today, Ext.Date.DAY, 1).getTime()) {\r
292 // due date is current date + 1 day\r
293 return 'Tomorrow';\r
294 }\r
295 if(dueDateTime < Ext.Date.add(today, Ext.Date.DAY, 7).getTime()) {\r
296 // if the due date is less than one week in the future, return the day of the week.\r
297 return Ext.Date.format(date, 'l');\r
298 }\r
299 } else {\r
300 if(dueDateTime === Ext.Date.add(today, Ext.Date.DAY, -1).getTime()) {\r
301 // due date is current date - 1 day.\r
302 return 'Yesterday';\r
303 }\r
304 if(dueDateTime > Ext.Date.add(today, Ext.Date.DAY, -7).getTime()) {\r
305 // if the due date is less than one week past, return 'Last' + the day of the week.\r
306 return 'Last '+ Ext.Date.format(date, 'l');\r
307 }\r
308 }\r
309 return date.getFullYear() === today.getFullYear() ? Ext.Date.format(date, 'D m/d') : Ext.Date.format(date, 'D m/d/Y');\r
310 }\r
311\r
312});