FeedGrid = function(viewer, config) {
this.viewer = viewer;
Ext.apply(this, config);
this.store = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({
url: 'feed-proxy.php'
}),
reader: new Ext.data.XmlReader(
{record: 'item'},
['title', 'author', {name:'pubDate', type:'date'}, 'link', 'description', 'content']
)
});
this.store.setDefaultSort('pubDate', "DESC");
this.columns = [{
id: 'title',
header: "Title",
dataIndex: 'title',
sortable:true,
width: 420,
renderer: this.formatTitle
},{
header: "Author",
dataIndex: 'author',
width: 100,
hidden: true,
sortable:true
},{
id: 'last',
header: "Date",
dataIndex: 'pubDate',
width: 150,
renderer: this.formatDate,
sortable:true
}];
FeedGrid.superclass.constructor.call(this, {
region: 'center',
id: 'topic-grid',
loadMask: {msg:'Loading Feed...'},
sm: new Ext.grid.RowSelectionModel({
singleSelect:true
}),
viewConfig: {
forceFit:true,
enableRowBody:true,
showPreview:true,
getRowClass : this.applyRowClass
}
});
this.on('rowcontextmenu', this.onContextClick, this);
};
Ext.extend(FeedGrid, Ext.grid.GridPanel, {
onContextClick : function(grid, index, e){
if(!this.menu){ // create context menu on first right click
this.menu = new Ext.menu.Menu({
id:'grid-ctx',
items: [{
text: 'View in new tab',
iconCls: 'new-tab',
scope:this,
handler: function(){
this.viewer.openTab(this.ctxRecord);
}
},{
iconCls: 'new-win',
text: 'Go to Post',
scope:this,
handler: function(){
window.open(this.ctxRecord.data.link);
}
},'-',{
iconCls: 'refresh-icon',
text:'Refresh',
scope:this,
handler: function(){
this.ctxRow = null;
this.store.reload();
}
}]
});
this.menu.on('hide', this.onContextHide, this);
}
e.stopEvent();
if(this.ctxRow){
Ext.fly(this.ctxRow).removeClass('x-node-ctx');
this.ctxRow = null;
}
this.ctxRow = this.view.getRow(index);
this.ctxRecord = this.store.getAt(index);
Ext.fly(this.ctxRow).addClass('x-node-ctx');
this.menu.showAt(e.getXY());
},
onContextHide : function(){
if(this.ctxRow){
Ext.fly(this.ctxRow).removeClass('x-node-ctx');
this.ctxRow = null;
}
},
loadFeed : function(url) {
this.store.baseParams = {
feed: url
};
this.store.load();
},
togglePreview : function(show){
this.view.showPreview = show;
this.view.refresh();
},
// within this function "this" is actually the GridView
applyRowClass: function(record, rowIndex, p, ds) {
if (this.showPreview) {
var xf = Ext.util.Format;
p.body = '' + xf.ellipsis(xf.stripTags(record.data.description), 200) + '
';
return 'x-grid3-row-expanded';
}
return 'x-grid3-row-collapsed';
},
formatDate : function(date) {
if (!date) {
return '';
}
var now = new Date();
var d = now.clearTime(true);
var notime = date.clearTime(true).getTime();
if (notime == d.getTime()) {
return 'Today ' + date.dateFormat('g:i a');
}
d = d.add('d', -6);
if (d.getTime() <= notime) {
return date.dateFormat('D g:i a');
}
return date.dateFormat('n/j g:i a');
},
formatTitle: function(value, p, record) {
return String.format(
'{0}',
value, record.data.author, record.id, record.data.forumid
);
}
});
Ext.reg('appfeedgrid', FeedGrid);