2 * @class SimpleTasks.controller.Tasks
3 * @extends Ext.app.Controller
5 Ext
.define('SimpleTasks.controller.Tasks', {
6 extend
: 'Ext.app.Controller',
15 'tasks.DefaultTimeWindow',
16 'tasks.ReminderWindow',
35 selector
: 'tasksToolbar'
38 ref
: 'taskEditWindow',
39 selector
: 'taskEditWindow',
40 xtype
: 'taskEditWindow',
44 ref
: 'defaultTimeWindow',
45 selector
: 'defaultTimeWindow',
46 xtype
: 'defaultTimeWindow',
50 ref
: 'reminderWindow',
51 selector
: 'reminderWindow',
52 xtype
: 'reminderWindow',
57 selector
: 'tasksContextMenu',
58 xtype
: 'tasksContextMenu',
67 'taskForm textfield': {
68 specialkey
: me
.handleSpecialKey
70 '[iconCls=tasks-new]': {
71 click
: me
.focusTaskForm
74 click
: me
.handleDeleteClick
76 '#delete-task-item': {
77 click
: me
.handleDeleteClick
79 '#mark-complete-item': {
80 click
: me
.markComplete
82 '#mark-complete-btn': {
83 click
: me
.markComplete
85 '#mark-active-item': {
95 click
: me
.filterActive
97 '#show-complete-btn': {
98 click
: me
.filterComplete
101 click
: me
.handleEditItemClick
104 recordedit
: me
.updateTask
,
105 deleteclick
: me
.handleDeleteIconClick
,
106 editclick
: me
.handleEditIconClick
,
107 reminderselect
: me
.setReminder
,
108 itemmouseenter
: me
.showActions
,
109 itemmouseleave
: me
.hideActions
,
110 selectionchange
: me
.toggleButtons
,
111 columnresize
: me
.syncTaskFormFieldWidth
,
112 itemcontextmenu
: me
.showContextMenu
115 afterrender
: me
.initShowAll
117 'taskEditWindow [name=has_reminder]': {
118 change
: me
.toggleReminderFields
120 '#cancel-task-edit-btn': {
121 click
: me
.hideEditWindow
123 '#save-task-edit-btn': {
124 click
: me
.handleSaveTaskClick
126 'taskEditWindow [name=reminder_date]': {
127 change
: me
.syncReminderField
129 'taskEditWindow [name=reminder_time]': {
130 change
: me
.syncReminderField
132 '#toggle-complete-btn': {
133 click
: me
.toggleCompleteField
135 '#delete-task-window-btn': {
136 click
: me
.deleteTaskAndCloseEditWindow
138 'defaultTimeWindow [name=default_time]': {
141 '#cancel-default-time-edit-btn': {
142 click
: me
.hideDefaultTimeWindow
144 '#save-default-time-btn': {
145 click
: me
.saveDefaultTime
147 '[cls=snooze-btn]': {
150 '[cls=dismiss-reminder-btn]': {
151 click
: me
.dismissReminder
156 me
.initReminderInterval();
160 * Handles a "specialkey" event on an field on the task form.
161 * Creates a new task if the enter key is pressed.
162 * @param {Ext.form.field.Text} field
163 * @param {Ext.EventObject} e
165 handleSpecialKey: function(field
, e
) {
166 if(e
.getKey() === e
.ENTER
) {
172 * Creates a new task based on the data currently contained in the task form.
173 * Saves the new task to the server and adds it to the task list view.
175 newTask: function() {
177 form
= me
.getTaskForm(),
178 basicForm
= form
.getForm(),
179 formEl
= form
.getEl(),
180 titleField
= form
.getForm().findField('title'),
181 task
= Ext
.create('SimpleTasks.model.Task');
183 // require title field to have a value
184 if(!titleField
.getValue()) {
188 // update the new task record with the data from the form.
189 basicForm
.updateRecord(task
);
191 // try to blur all of this form's items to make sure that the user can't type into a field while saving
192 form
.items
.each(function(item
) {
193 var inputEl
= item
.getEl().down('input');
199 // mask the form element while saving
200 formEl
.mask('saving . . .');
201 // save the task to the server
203 success: function(task
, operation
) {
204 me
.getTasksStore().add(task
);
205 me
.refreshListTree();
206 me
.getTasksStore().sort();
211 failure: function(task
, operation
) {
212 var error
= operation
.getError(),
213 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
215 Ext
.MessageBox
.show({
216 title
: 'Add Task Failed',
227 * Handles the task list's "recordedit" event.
228 * Updates the task on the server whenever a task is updated using the task grid's cell editor
229 * @param {SimpleTasks.model.Task} task The task record that was edited
231 updateTask: function(task
) {
234 if (task
.modified
&& task
.modified
.done
=== false) {
235 task
.set('reminder', null);
238 success: function(task
, operation
) {
239 me
.refreshListTree();
240 me
.getTasksStore().sort();
242 failure: function(task
, operation
) {
243 var error
= operation
.getError(),
244 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
246 Ext
.MessageBox
.show({
247 title
: 'Update Task Failed',
257 * Handles a click on a delete icon in the task grid.
258 * @param {Ext.grid.View} view
259 * @param {Number} rowIndex
260 * @param {Number} colIndex
261 * @param {Ext.grid.column.Action} column
262 * @param {EventObject} e
264 handleDeleteIconClick: function(view
, rowIndex
, colIndex
, column
, e
) {
265 this.deleteTask(this.getTasksStore().getAt(rowIndex
));
269 * Handles a click on the "delete task" button or context menu item
270 * @param {Ext.button.Button} button
271 * @param {Ext.EventObject} e
273 handleDeleteClick: function(button
, e
) {
274 this.deleteTask(this.getTaskGrid().getSelectionModel().getSelection()[0]);
278 * Deletes the task from the server and updates the view.
279 * @param {SimpleTasks.model.Task} task
280 * @param {Function} successCallback A function to call after the task has been deleted successfully
282 deleteTask: function(task
, successCallback
) {
286 title
: 'Delete Task?',
287 msg
: 'Are you sure you want to delete this task?',
288 buttons
: Ext
.Msg
.YESNO
,
289 fn: function(response
) {
290 if(response
=== 'yes') {
292 success: function(task
, operation
) {
293 me
.getTasksStore().remove(task
);
294 me
.refreshListTree();
295 if(successCallback
) {
299 failure: function(task
, operation
) {
300 var error
= operation
.getError(),
301 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
303 Ext
.MessageBox
.show({
304 title
: 'Delete Task Failed',
317 * Refreshes the task grid's list filter, and the task counts in the list tree
319 refreshListTree: function() {
320 // refresh the lists list view so that the task counts will be correct
321 this.getListTree().refreshView();
325 * Handles a click on the "Edit" context menu item
326 * @param {Ext.menu.Item} item
327 * @param {EventObject} e
329 handleEditItemClick: function(item
, e
) {
330 this.showEditWindow(this.getContextMenu().getTask());
334 * Handles a click on the "Edit Task" action column
335 * @param {Ext.grid.View} view
336 * @param {Number} rowIndex
337 * @param {Number} colIndex
338 * @param {Ext.grid.column.Action} column
339 * @param {EventObject} e
341 handleEditIconClick: function(view
, rowIndex
, colIndex
, column
, e
) {
342 this.showEditWindow(view
.getRecord(view
.findTargetByEvent(e
)));
346 * Handles the task grid's "selectionchange" event.
347 * Disables or enables the task-related toolbar buttons depending on whether or not there is a selection.
348 * @param {Ext.selection.RowModel} selModel
349 * @param {SimpleTasks.model.Task[]} tasks
351 toggleButtons: function(selModel
, tasks
) {
352 var deleteTaskBtn
= Ext
.getCmp('delete-task-btn'),
353 markCompleteBtn
= Ext
.getCmp('mark-complete-btn'),
354 markActiveBtn
= Ext
.getCmp('mark-active-btn');
356 if(tasks
.length
=== 0) {
357 deleteTaskBtn
.disable();
358 markCompleteBtn
.disable();
359 markActiveBtn
.disable();
361 deleteTaskBtn
.enable();
362 markCompleteBtn
.enable();
363 markActiveBtn
.enable();
368 * Handles a click on the "New Task" button or context menu item
369 * focuses the title field on the new task form
370 * @param {Ext.Component} component
371 * @param {Ext.EventObject} e
373 focusTaskForm: function(component
, e
) {
374 this.getTaskForm().query('[name=title]')[0].focus();
378 * Handles a click on the "Mark Complete" button or menu item
379 * Sets the selected task's "done" field to true
380 * @param {Ext.Component} component
381 * @param {Ext.EventObject} e
383 markComplete: function(component
, e
) {
384 var contextMenu
= this.getContextMenu(),
385 task
= contextMenu
.isVisible() ? contextMenu
.getTask() : this.getTaskGrid().getSelectionModel().getSelection()[0];
387 task
.set('done', true);
388 task
.set('reminder', null);
390 failure: function(task
, operation
) {
391 var error
= operation
.getError(),
392 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
394 Ext
.MessageBox
.show({
395 title
: 'Mark Complete Failed',
402 this.refreshListTree();
406 * Handles a click on the "Mark Active" button
407 * Sets the selected task's "done" field to false
408 * @param {Ext.button.Button} button
409 * @param {Ext.EventObject} e
411 markActive: function(button
, e
) {
412 var contextMenu
= this.getContextMenu(),
413 task
= contextMenu
.isVisible() ? contextMenu
.getTask() : this.getTaskGrid().getSelectionModel().getSelection()[0];
415 task
.set('done', false);
417 failure: function(task
, operation
) {
418 var error
= operation
.getError(),
419 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
421 Ext
.MessageBox
.show({
422 title
: 'Mark Active Failed',
429 this.refreshListTree();
433 * Handles the task grid columnresize event.
434 * Synchronizes the width the column's associated form field with the width of the column
435 * @param {Ext.grid.header.Container} headerContainer
436 * @param {Ext.column.Column} column
437 * @param {Number} width The new column width
439 syncTaskFormFieldWidth: function(headerContainer
, column
, width
) {
440 var field
= this.getTaskForm().query('[name=' + column
.dataIndex
+ ']')[0];
442 field
.setWidth(width
- 5);
447 * Handles a click on the "Show All" button. Removes any filter on the done field so that all tasks will be displayed
448 * @param {Ext.button.Button} button
449 * @param {Ext.EventObject} e
451 filterAll: function(button
, e
) {
452 this.getTasksStore().clearFilter();
453 this.refreshListTree();
457 * Handles a click on the "Show Active" button. Filters tasks by done = false
458 * @param {Ext.button.Button} button
459 * @param {Ext.EventObject} e
461 filterActive: function(button
, e
) {
462 this.getTasksStore().addFilter({
466 this.refreshListTree();
470 * Handles a click on the "Show Complete" button. Filters tasks by done = true.
471 * @param {Ext.button.Button} button
472 * @param {Ext.EventObject} e
474 filterComplete: function(button
, e
) {
475 this.getTasksStore().addFilter({
479 this.refreshListTree();
483 * Handles the tasks toolbar's render event
484 * Initializes the "Show All" Button to the pressed state
485 * @param {SimpleTasks.view.Toolbar} toolbar
487 initShowAll: function(toolbar
) {
488 toolbar
.getComponent('show-all-btn').toggle();
492 * Handles a mouseenter event on a task grid item.
493 * Shows the item's action icons.
494 * @param {Ext.grid.View} view
495 * @param {SimpleTasks.model.Task} task
496 * @param {HTMLElement} node
497 * @param {Number} rowIndex
498 * @param {Ext.EventObject} e
500 showActions: function(view
, task
, node
, rowIndex
, e
) {
501 var icons
= Ext
.fly(node
).query('.x-action-col-icon');
502 Ext
.each(icons
, function(icon
){
503 Ext
.get(icon
).removeCls('x-hidden');
508 * Handles a mouseleave event on a task grid item.
509 * Hides the item's action icons.
510 * @param {Ext.grid.View} view
511 * @param {SimpleTasks.model.Task} task
512 * @param {HTMLElement} node
513 * @param {Number} rowIndex
514 * @param {Ext.EventObject} e
516 hideActions: function(view
, task
, node
, rowIndex
, e
) {
517 var icons
= Ext
.fly(node
).query('.x-action-col-icon');
518 Ext
.each(icons
, function(icon
){
519 Ext
.get(icon
).addCls('x-hidden');
524 * Handles the task grid's itemcontextmenu event
525 * Shows the task context menu.
526 * @param {Ext.grid.View} view
527 * @param {SimpleTasks.model.Task} task
528 * @param {HTMLElement} node
529 * @param {Number} rowIndex
530 * @param {Ext.EventObject} e
532 showContextMenu: function(view
, task
, node
, rowIndex
, e
) {
533 var contextMenu
= this.getContextMenu(),
534 markCompleteItem
= Ext
.getCmp('mark-complete-item'),
535 markActiveItem
= Ext
.getCmp('mark-active-item');
537 if(task
.get('done')) {
538 markCompleteItem
.hide();
539 markActiveItem
.show();
541 markCompleteItem
.show();
542 markActiveItem
.hide();
544 contextMenu
.setTask(task
);
545 contextMenu
.showAt(e
.getX(), e
.getY());
550 * Shows the "Edit Task" window
551 * @param {SimpleTasks.model.Task} task the task to edit
553 showEditWindow: function(task
) {
555 taskEditWindow
= me
.getTaskEditWindow(),
556 form
= taskEditWindow
.down('form').getForm(),
557 reminderCheckbox
= form
.findField('has_reminder'),
558 dateField
= form
.findField('reminder_date'),
559 timeField
= form
.findField('reminder_time'),
560 reminder
= task
.get('reminder');
562 // Set the tasks title as the title of the edit window
563 taskEditWindow
.setTitle('Edit Task - ' + task
.get('title'));
564 // load the task data into the form
565 taskEditWindow
.down('form').loadRecord(task
);
566 // set the text of the toggle-complete button depending on the tasks "done" value
567 Ext
.getCmp('toggle-complete-btn').setText(task
.get('done') ? 'Mark Active' : 'Mark Complete');
568 taskEditWindow
.show();
570 if(task
.get('reminder')) {
571 // if the task already has a reminder set check the reminder checkbox and populate the reminder date and reminder time fields
572 reminderCheckbox
.setValue(true);
573 dateField
.setValue(Ext
.Date
.clearTime(reminder
, true));
574 timeField
.setValue(Ext
.Date
.format(reminder
, timeField
.format
));
576 // if the task does not have a reminder set uncheck the reminder checkbox and set the reminder date and time fields to null
577 reminderCheckbox
.setValue(false);
578 dateField
.setValue(null);
579 timeField
.setValue(null);
582 if(task
.get('done')) {
583 // if the task is done disable the reminder checkbox (reminders cannot be set on completed tasks)
584 reminderCheckbox
.disable();
586 reminderCheckbox
.enable();
592 * Handles a click on the "Edit Task" window's cancel button
593 * Hides the "Edit Task" window
594 * @param {Ext.Button} button
595 * @param {Ext.EventObject} e
597 hideEditWindow: function(button
, e
) {
598 this.getTaskEditWindow().close();
602 * Handles the change event on the task edit window's "has_reminder" checkbox
603 * Toggles the visibility of the reminder date and time fields
604 * @param {Ext.form.field.Checkbox} checkbox
605 * @param {Boolean} newValue
606 * @param {Boolean} oldValue
608 toggleReminderFields: function(checkbox
, newValue
, oldValue
) {
609 var taskEditWindow
= this.getTaskEditWindow(),
610 windowEl
= taskEditWindow
.getEl(),
611 form
= taskEditWindow
.down('form').getForm(),
612 task
= form
.getRecord(),
613 dateField
= form
.findField('reminder_date'),
614 timeField
= form
.findField('reminder_time'),
615 defaultTimeDate
, defaultTimeMilliseconds
;
617 if(newValue
) { // if the "has reminder" checkbox was checked
618 windowEl
.mask('loading');
619 // get the default reminder time from the server or cache
620 this.getDefaultReminderTime(function(defaultTime
) {
621 // enable the date and time fields
624 if(!dateField
.getValue()) {
625 // if the reminder date has not already been set, default the reminder date to the task's due date
626 // or the current date if the task does not have a due date
627 dateField
.setValue(task
.get('due') || Ext
.Date
.clearTime(new Date()));
628 timeField
.setValue(defaultTime
);
630 // set the form's hidden reminder field by combining the reminder date and time fields
631 defaultTimeDate
= timeField
.getValue();
632 defaultTimeMilliseconds
= defaultTimeDate
- Ext
.Date
.clearTime(defaultTimeDate
, true);
633 form
.findField('reminder').setValue(new Date(dateField
.getValue().getTime() + defaultTimeMilliseconds
));
635 }, timeField
.format
);
636 } else { // if the "has reminder" checkbox was unchecked
637 // nullify the form's hidden reminder field and disable the reminder date and time fields
638 form
.findField('reminder').setValue(null);
645 * Handles a click on the "Task Edit" window's save button.
646 * @param {Ext.button.Button} button
647 * @param {Ext.EventObject} e
649 handleSaveTaskClick: function(button
, e
) {
650 this.saveEditWindow();
654 * Updates the task record with the form data from the edit window and saves the task to the server.
656 saveEditWindow: function() {
657 var taskEditWindow
= this.getTaskEditWindow(),
658 listTree
= this.getListTree(),
659 windowEl
= taskEditWindow
.getEl(),
660 form
= taskEditWindow
.down('form').getForm(),
661 task
= form
.getRecord();
663 if (form
.isValid()) {
664 windowEl
.mask('saving');
665 form
.updateRecord(task
);
666 if (task
.modified
&& task
.modified
.done
=== false) {
667 task
.set('reminder', null);
670 success: function(task
, operation
) {
672 taskEditWindow
.close();
673 listTree
.view
.refresh();
675 failure: function(task
, operation
) {
676 var error
= operation
.getError(),
677 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
679 Ext
.MessageBox
.show({
680 title
: 'Edit Task Failed',
689 Ext
.Msg
.alert('Invalid Data', 'Please correct form errors');
694 * Syncronizes the value of the edit window's hidden reminder field whenever "reminder_date", or "reminder_time" is changed
695 * @param {Ext.form.field.Picker} field the date or time picker
696 * @param {Date} oldValue
697 * @param {Date} newValue
699 syncReminderField: function(field
, oldValue
, newValue
) {
700 var form
= this.getTaskEditWindow().down('form').getForm(),
701 reminderField
= form
.findField('reminder'),
702 date
= form
.findField('reminder_date').getValue(),
703 timeDate
= form
.findField('reminder_time').getValue(),
706 if(date
&& timeDate
) {
707 time
= timeDate
- Ext
.Date
.clearTime(timeDate
, true);
708 reminderDate
= new Date(date
.getTime() + time
);
709 reminderField
.setValue(reminderDate
);
714 * Toggles the edit window's "done" field to true when the "Mark Complete" or "Mark Active" button on the edit window is clicked
715 * @param {Ext.button.Button} button
716 * @param {Ext.EventObject} e
718 toggleCompleteField: function(button
, e
) {
719 var taskEditWindow
= this.getTaskEditWindow(),
720 doneField
= taskEditWindow
.down('form').getForm().findField('done');
722 if(doneField
.getValue() === 'true') {
723 doneField
.setValue(false);
725 doneField
.setValue(true);
727 this.saveEditWindow();
731 * Handles a click on the "Delete" button on the edit window.
732 * Deletes the task and closes the edit window
733 * @param {Ext.button.Button} button
734 * @param {Ext.EventObject} e
736 deleteTaskAndCloseEditWindow: function(button
, e
) {
738 taskEditWindow
= me
.getTaskEditWindow(),
739 task
= taskEditWindow
.down('form').getRecord();
741 me
.deleteTask(task
, function() {
742 me
.getTaskEditWindow().close();
747 * Handles the Task Grid's `reminderselect` event
748 * Sets a task's reminder
749 * @param {SimpleTasks.model.Task} task the underlying record of the row that was clicked to show the reminder menu
750 * @param {String|Number} value The value that was selected
752 setReminder: function(task
, value
) {
754 defaultTimeWindow
= me
.getDefaultTimeWindow(),
755 defaultTimeField
= defaultTimeWindow
.down('form').getForm().findField('default_time'),
756 defaultTimeDate
, defaultTimeMilliseconds
;
758 me
.getDefaultReminderTime(function(defaultTime
) {
759 if(value
=== 'set') {
760 // if the user selected "Set Default Time", show the default time window.
761 defaultTimeField
.setValue(defaultTime
);
762 defaultTimeWindow
.show();
764 if(Ext
.isNumber(value
)) {
765 // if the user selected a reminder time, set the reminder by adding the user selected value to the due date
766 defaultTimeDate
= Ext
.Date
.parse(defaultTime
, defaultTimeField
.format
);
767 defaultTimeMilliseconds
= defaultTimeDate
- Ext
.Date
.clearTime(defaultTimeDate
, true);
768 task
.set('reminder', new Date(task
.get('due').getTime() - (value
* 86400000) + defaultTimeMilliseconds
));
770 // if the user selected "No Reminder" set the reminder field to null
771 task
.set('reminder', null);
774 failure: function(task
, operation
) {
775 var error
= operation
.getError(),
776 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
778 Ext
.MessageBox
.show({
779 title
: 'Set Reminder Failed',
787 }, defaultTimeField
.format
);
791 * Gets the default reminder time and passes it to the callback function.
792 * Retrieves default reminder time from the server on the first call, then caches it for future calls.
793 * @param {Function} callback
794 * @param {String} timeFormat, the time format used to encode the time: the time format of the destination TimeField
796 getDefaultReminderTime: function(callback
, timeFormat
) {
800 if(me
.defaultReminderTime
) {
801 callback(me
.defaultReminderTime
);
803 me
.defaultReminderTime
= Ext
.Date
.format(Ext
.Date
.parse('8', 'g'), timeFormat
|| "g:i A"); // the default time if no value can be retrieved from storage
804 if (SimpleTasks
.Settings
.useLocalStorage
) {
805 defaultReminderTime
= localStorage
.getItem('SimpleTasks-defaultReminderTime');
806 if (defaultReminderTime
&& Ext
.Date
.parse(defaultReminderTime
, timeFormat
)) {
807 me
.defaultReminderTime
= defaultReminderTime
;
809 callback(me
.defaultReminderTime
);
812 url
: 'php/config/read.php',
814 key
: 'default.reminder.time'
816 success: function(response
, options
) {
817 var responseData
= Ext
.decode(response
.responseText
);
818 if(responseData
.success
&& responseData
.value
&& Ext
.Date
.parse(responseData
.value
, timeFormat
)) {
819 me
.defaultReminderTime
= responseData
.value
;
821 callback(me
.defaultReminderTime
);
823 failure: function(response
, options
) {
824 callback(me
.defaultReminderTime
);
832 * Hides the default reminder time window when the cancel button is clicked
833 * @param {Ext.button.Button} button
834 * @param {Ext.EventObject} e
836 hideDefaultTimeWindow: function(button
, e
) {
837 this.getDefaultTimeWindow().close();
841 * Saves the default reminder time to the server when the OK button is clicked
842 * @param {Ext.button.Button} button
843 * @param {Ext.EventObject} e
845 saveDefaultTime: function(button
, e
) {
847 defaultTimeWindow
= me
.getDefaultTimeWindow(),
848 windowEl
= defaultTimeWindow
.getEl(),
849 field
= defaultTimeWindow
.down('form').getForm().findField('default_time'),
850 time
= field
.getRawValue();
852 if (!field
.isValid()) {
856 if (SimpleTasks
.Settings
.useLocalStorage
) {
857 localStorage
.setItem('SimpleTasks-defaultReminderTime', time
);
858 me
.defaultReminderTime
= time
;
859 defaultTimeWindow
.close();
861 windowEl
.mask('saving');
863 url
: 'php/config/update.php',
865 key
: 'default.reminder.time',
868 success: function(response
, options
) {
869 var responseData
= Ext
.decode(response
.responseText
);
871 if(responseData
.success
) {
872 me
.defaultReminderTime
= time
;
873 defaultTimeWindow
.close();
875 Ext
.MessageBox
.show({
876 title
: 'Set Default Time Failed',
877 msg
: responseData
.message
,
884 failure: function(response
, options
) {
885 Ext
.MessageBox
.show({
886 title
: 'Set Default Time Failed',
887 msg
: response
.status
+ ' ' + response
.statusText
,
898 * Initializes checking for tasks that have passed their reminder date at 10 second intervals.
900 initReminderInterval: function() {
904 setInterval(function() {
906 me
.getTasksStore().each(function(task
) {
907 reminderDate
= task
.get('reminder');
908 if(reminderDate
&& reminderDate
< now
&& !task
.get('done')) {
909 me
.showReminderWindow(task
);
916 * Shows the reminder window for a given task
917 * @param {SimpleTasks.model.Task} task
919 showReminderWindow: function(task
) {
920 var reminderWindow
= this.getReminderWindow(),
921 reminderDetailsBox
= reminderWindow
.down('[cls=tasks-reminder-details]'),
922 title
= task
.get('title');
924 task
.set('reminder', null);
926 failure: function(task
, operation
) {
927 var error
= operation
.getError(),
928 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
930 Ext
.MessageBox
.show({
931 title
: 'Clear Reminder Failed',
938 reminderWindow
.setTask(task
);
939 reminderWindow
.setTitle('Reminder - ' + title
);
940 reminderDetailsBox
.update({
944 reminderWindow
.show();
949 * Handles a click on the snooze button on the reminder window.
950 * Sets the task's reminder date to the current date plus snooze time selected
951 * @param {Ext.button.Button} button
952 * @param {Ext.EventObject} e
954 snooze: function(button
, e
) {
955 var reminderWindow
= button
.findParentByType('window'),
956 task
= reminderWindow
.getTask(),
957 snoozeMilliseconds
= reminderWindow
.down('[name=snooze_time]').getValue() * 60000,
958 reminderDate
= new Date(new Date().getTime() + snoozeMilliseconds
);
960 task
.set('reminder', reminderDate
);
962 failure: function(task
, operation
) {
963 var error
= operation
.getError(),
964 msg
= Ext
.isObject(error
) ? error
.status
+ ' ' + error
.statusText
: error
;
966 Ext
.MessageBox
.show({
967 title
: 'Set Reminder Failed',
974 reminderWindow
.close();
978 * Handle's a click on the reminder window's dismiss button.
979 * Hides the reminder window.
980 * @param {Ext.button.Button} button
981 * @param {Ext.EventObject} e
983 dismissReminder: function(button
, e
) {
984 button
.findParentByType('window').close();