ReminderColumn.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /**
  2. * @class SimpleTasks.ux.ReminderColumn
  3. * @extends Ext.grid.column.Column
  4. * A grid column for selecting reminder times
  5. */
  6. Ext.define('SimpleTasks.ux.ReminderColumn', {
  7. extend: 'Ext.grid.column.Column',
  8. xtype: 'remindercolumn',
  9. config: {
  10. /**
  11. * @cfg {String} menuPosition
  12. * Positing to show the menu relative to the reminder icon.
  13. * Alignment position as used by Ext.Element.getAlignToXY
  14. * Defaults to 'tl-bl'
  15. */
  16. menuPosition: 'tl-bl'
  17. },
  18. tdCls: Ext.baseCSSPrefix + 'grid-cell-remindercolumn',
  19. constructor: function() {
  20. this.addEvents(
  21. /**
  22. * @event select
  23. * Fires when a reminder time is selected from the dropdown menu
  24. * @param {Ext.data.Model} record The underlying record of the row that was clicked to show the reminder menu
  25. * @param {String|Number} value The value that was selected
  26. */
  27. 'select'
  28. );
  29. this.callParent(arguments);
  30. },
  31. /**
  32. * initializes the dropdown menu
  33. * @private
  34. */
  35. initMenu: function() {
  36. var me = this,
  37. items = [];
  38. function createItem(text, value) {
  39. return {
  40. text: text,
  41. listeners: {
  42. click: Ext.bind(me.handleMenuItemClick, me, [value], true)
  43. }
  44. }
  45. }
  46. items.push(createItem('No Reminder'));
  47. items.push({xtype: 'menuseparator'});
  48. items.push(createItem('1 day before', 1));
  49. items.push(createItem('2 days before', 2));
  50. items.push(createItem('3 days before', 3));
  51. items.push(createItem('1 week before', 7));
  52. items.push(createItem('2 weeks before', 14));
  53. items.push(createItem('Set Default Time...', 'set'));
  54. me.menu = Ext.create('Ext.menu.Menu', {
  55. plain: true,
  56. items: items
  57. });
  58. },
  59. /**
  60. * Handles a click on a menu item
  61. * @private
  62. * @param {Ext.menu.Item} menuItem
  63. * @param {Ext.EventObject} e
  64. * @param {Object} options
  65. * @param {String|Number} value
  66. */
  67. handleMenuItemClick: function(menuItem, options, e, value) {
  68. this.fireEvent('select', this.record, value);
  69. },
  70. /**
  71. * Process and refire events routed from the GridView's processEvent method.
  72. * @private
  73. */
  74. processEvent: function(type, view, cell, rowIndex, colIndex, e) {
  75. var me = this,
  76. cssPrefix = Ext.baseCSSPrefix,
  77. target = Ext.get(e.getTarget());
  78. if (target.hasCls(cssPrefix + 'grid-reminder')) {
  79. if(type === 'click') {
  80. if(!me.menu) {
  81. me.initMenu();
  82. }
  83. me.record = view.store.getAt(rowIndex);
  84. me.menu.showBy(target, me.menuPosition);
  85. }
  86. } else {
  87. return me.callParent(arguments);
  88. }
  89. },
  90. /**
  91. * Renderer for the reminder column
  92. * @private
  93. * @param {Number} value
  94. * @param {Object} metaData
  95. * @param {SimpleTasks.model.Task} task
  96. * @param {Number} rowIndex
  97. * @param {Number} colIndex
  98. * @param {SimpleTasks.store.Tasks} store
  99. * @param {Ext.grid.View} view
  100. */
  101. renderer : function(value, metaData, task, rowIndex, colIndex, store, view){
  102. var cssPrefix = Ext.baseCSSPrefix,
  103. cls = [cssPrefix + 'grid-reminder'];
  104. if(task.get('done') || !task.get('due')) {
  105. // if the task is done or has no due date, a reminder cannot be set
  106. return '';
  107. }
  108. if (!value) {
  109. cls.push(cssPrefix + 'grid-reminder-empty');
  110. }
  111. return '<div class="' + cls.join(' ') + '"></div>';
  112. }
  113. });