FeedGrid.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. Ext.define('FeedViewer.FeedGrid', {
  2. extend: 'Ext.grid.Panel',
  3. alias: 'widget.feedgrid',
  4. initComponent: function(){
  5. this.addEvents(
  6. /**
  7. * @event rowdblclick
  8. * Fires when a row is double clicked
  9. * @param {FeedViewer.FeedGrid} this
  10. * @param {Ext.data.Model} model
  11. */
  12. 'rowdblclick',
  13. /**
  14. * @event select
  15. * Fires when a grid row is selected
  16. * @param {FeedViewer.FeedGrid} this
  17. * @param {Ext.data.Model} model
  18. */
  19. 'select'
  20. );
  21. Ext.apply(this, {
  22. cls: 'feed-grid',
  23. store: Ext.create('Ext.data.Store', {
  24. model: 'FeedItem',
  25. sortInfo: {
  26. property: 'pubDate',
  27. direction: 'DESC'
  28. },
  29. proxy: {
  30. type: 'ajax',
  31. url: 'feed-proxy.php',
  32. reader: {
  33. type: 'xml',
  34. record: 'item'
  35. }
  36. },
  37. listeners: {
  38. load: this.onLoad,
  39. scope: this
  40. }
  41. }),
  42. columns: [{
  43. text: 'Title',
  44. dataIndex: 'title',
  45. flex: 1,
  46. renderer: this.formatTitle
  47. }, {
  48. text: 'Author',
  49. dataIndex: 'author',
  50. hidden: true,
  51. width: 200
  52. }, {
  53. text: 'Date',
  54. dataIndex: 'pubDate',
  55. renderer: this.formatDate,
  56. width: 200
  57. }],
  58. viewConfig: {
  59. itemId: 'view',
  60. plugins: [{
  61. pluginId: 'preview',
  62. ptype: 'preview',
  63. bodyField: 'description',
  64. expanded: true
  65. }],
  66. listeners: {
  67. scope: this,
  68. dblclick: this.onRowDblClick,
  69. afterrender: this.onViewRender
  70. }
  71. }
  72. });
  73. this.callParent(arguments);
  74. this.on('selectionchange', this.onSelect, this);
  75. },
  76. // private
  77. onViewRender: function() {
  78. var me = this;
  79. me.keyNav = Ext.create('Ext.util.KeyNav', me.items.getAt(0).el, {
  80. enter: me.onEnterKey,
  81. scope: me
  82. });
  83. },
  84. onDestroy: function() {
  85. var me = this;
  86. Ext.destroy(me.keyNav);
  87. delete me.keyNav;
  88. me.callParent(arguments);
  89. },
  90. onEnterKey: function(e) {
  91. var me = this,
  92. view = me.view,
  93. idx = view.indexOf(view.getSelectedNodes()[0]);
  94. me.onRowDblClick(view, idx);
  95. },
  96. /**
  97. * Reacts to a double click
  98. * @private
  99. * @param {Object} view The view
  100. * @param {Object} index The row index
  101. */
  102. onRowDblClick: function(view, index){
  103. this.fireEvent('rowdblclick', this, this.store.getAt(index));
  104. },
  105. /**
  106. * React to a grid item being selected
  107. * @private
  108. * @param {Ext.model.Selection} model The selection model
  109. * @param {Array} selections An array of selections
  110. */
  111. onSelect: function(model, selections){
  112. var selected = selections[0];
  113. if (selected) {
  114. this.fireEvent('select', this, selected);
  115. }
  116. },
  117. /**
  118. * Listens for the store loading
  119. * @private
  120. */
  121. onLoad: function(){
  122. if (this.getStore().getCount()) {
  123. this.getSelectionModel().select(0);
  124. }
  125. },
  126. /**
  127. * Instructs the grid to load a new feed
  128. * @param {String} url The url to load
  129. */
  130. loadFeed: function(url){
  131. var store = this.store;
  132. store.getProxy().extraParams.feed = url;
  133. store.load();
  134. },
  135. /**
  136. * Title renderer
  137. * @private
  138. */
  139. formatTitle: function(value, p, record){
  140. return Ext.String.format('<div class="topic"><b>{0}</b><span class="author">{1}</span></div>', value, record.get('author'));
  141. },
  142. /**
  143. * Date renderer
  144. * @private
  145. */
  146. formatDate: function(date){
  147. if (!date) {
  148. return '';
  149. }
  150. var now = new Date(), d = Ext.Date.clearTime(now, true), notime = Ext.Date.clearTime(date, true).getTime();
  151. if (notime === d.getTime()) {
  152. return 'Today ' + Ext.Date.format(date, 'g:i a');
  153. }
  154. d = Ext.Date.add(d, 'd', -6);
  155. if (d.getTime() <= notime) {
  156. return Ext.Date.format(date, 'D g:i a');
  157. }
  158. return Ext.Date.format(date, 'Y/m/d g:i a');
  159. }
  160. });