123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- Ext.define('FeedViewer.FeedGrid', {
- extend: 'Ext.grid.Panel',
- alias: 'widget.feedgrid',
- initComponent: function(){
- this.addEvents(
- /**
- * @event rowdblclick
- * Fires when a row is double clicked
- * @param {FeedViewer.FeedGrid} this
- * @param {Ext.data.Model} model
- */
- 'rowdblclick',
- /**
- * @event select
- * Fires when a grid row is selected
- * @param {FeedViewer.FeedGrid} this
- * @param {Ext.data.Model} model
- */
- 'select'
- );
- Ext.apply(this, {
- cls: 'feed-grid',
- store: Ext.create('Ext.data.Store', {
- model: 'FeedItem',
- sortInfo: {
- property: 'pubDate',
- direction: 'DESC'
- },
- proxy: {
- type: 'ajax',
- url: 'feed-proxy.php',
- reader: {
- type: 'xml',
- record: 'item'
- }
- },
- listeners: {
- load: this.onLoad,
- scope: this
- }
- }),
- columns: [{
- text: 'Title',
- dataIndex: 'title',
- flex: 1,
- renderer: this.formatTitle
- }, {
- text: 'Author',
- dataIndex: 'author',
- hidden: true,
- width: 200
- }, {
- text: 'Date',
- dataIndex: 'pubDate',
- renderer: this.formatDate,
- width: 200
- }],
- viewConfig: {
- itemId: 'view',
- plugins: [{
- pluginId: 'preview',
- ptype: 'preview',
- bodyField: 'description',
- expanded: true
- }],
- listeners: {
- scope: this,
- dblclick: this.onRowDblClick,
- afterrender: this.onViewRender
- }
- }
- });
- this.callParent(arguments);
- this.on('selectionchange', this.onSelect, this);
- },
- // private
- onViewRender: function() {
- var me = this;
- me.keyNav = Ext.create('Ext.util.KeyNav', me.items.getAt(0).el, {
- enter: me.onEnterKey,
- scope: me
- });
- },
- onDestroy: function() {
- var me = this;
- Ext.destroy(me.keyNav);
- delete me.keyNav;
- me.callParent(arguments);
- },
- onEnterKey: function(e) {
- var me = this,
- view = me.view,
- idx = view.indexOf(view.getSelectedNodes()[0]);
- me.onRowDblClick(view, idx);
- },
- /**
- * Reacts to a double click
- * @private
- * @param {Object} view The view
- * @param {Object} index The row index
- */
- onRowDblClick: function(view, index){
- this.fireEvent('rowdblclick', this, this.store.getAt(index));
- },
- /**
- * React to a grid item being selected
- * @private
- * @param {Ext.model.Selection} model The selection model
- * @param {Array} selections An array of selections
- */
- onSelect: function(model, selections){
- var selected = selections[0];
- if (selected) {
- this.fireEvent('select', this, selected);
- }
- },
- /**
- * Listens for the store loading
- * @private
- */
- onLoad: function(){
- if (this.getStore().getCount()) {
- this.getSelectionModel().select(0);
- }
- },
- /**
- * Instructs the grid to load a new feed
- * @param {String} url The url to load
- */
- loadFeed: function(url){
- var store = this.store;
- store.getProxy().extraParams.feed = url;
- store.load();
- },
- /**
- * Title renderer
- * @private
- */
- formatTitle: function(value, p, record){
- return Ext.String.format('<div class="topic"><b>{0}</b><span class="author">{1}</span></div>', value, record.get('author'));
- },
- /**
- * Date renderer
- * @private
- */
- formatDate: function(date){
- if (!date) {
- return '';
- }
- var now = new Date(), d = Ext.Date.clearTime(now, true), notime = Ext.Date.clearTime(date, true).getTime();
- if (notime === d.getTime()) {
- return 'Today ' + Ext.Date.format(date, 'g:i a');
- }
- d = Ext.Date.add(d, 'd', -6);
- if (d.getTime() <= notime) {
- return Ext.Date.format(date, 'D g:i a');
- }
- return Ext.Date.format(date, 'Y/m/d g:i a');
- }
- });
|