Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

285 lines
8.8 KiB

/**
* This view is created by the "google-rss" `Ext.dashboard.Dashboard` part.
*/
Ext.define('Ext.ux.dashboard.GoogleRssView', {
extend: 'Ext.Component',
requires: [
'Ext.tip.ToolTip',
'Ext.ux.google.Feeds'
],
feedCls: Ext.baseCSSPrefix + 'dashboard-googlerss',
previewCls: Ext.baseCSSPrefix + 'dashboard-googlerss-preview',
closeDetailsCls: Ext.baseCSSPrefix + 'dashboard-googlerss-close',
nextCls: Ext.baseCSSPrefix + 'dashboard-googlerss-next',
prevCls: Ext.baseCSSPrefix + 'dashboard-googlerss-prev',
/**
* The RSS feed URL. Some example RSS Feeds:
*
* * http://rss.slashdot.org/Slashdot/slashdot
* * http://sports.espn.go.com/espn/rss/news (ESPN Top News)
* * http://news.google.com/news?ned=us&topic=t&output=rss (Sci/Tech - Google News)
* * http://rss.news.yahoo.com/rss/software (Yahoo Software News)
* * http://feeds.feedburner.com/extblog (Sencha Blog)
* * http://sencha.com/forum/external.php?type=RSS2 (Sencha Forums)
* * http://feeds.feedburner.com/ajaxian (Ajaxian)
* * http://rss.cnn.com/rss/edition.rss (CNN Top Stories)
*/
feedUrl: null,
scrollable: true,
maxFeedEntries: 10,
previewTips: false,
mode: 'detail',
//closeDetailsGlyph: '10008@',
closeDetailsGlyph: '8657@',
// black triangles
prevGlyph: '9664@', nextGlyph: '9654@',
// hollow triangles
//prevGlyph: '9665@', nextGlyph: '9655@',
// black pointing index
//prevGlyph: '9754@', nextGlyph: '9755@',
// white pointing index
//prevGlyph: '9756@', nextGlyph: '9758@',
// double arrows
//prevGlyph: '8656@', nextGlyph: '8658@',
// closed arrows
//prevGlyph: '8678@', nextGlyph: '8680@',
detailTpl:
'<tpl for="entries[currentEntry]">' +
'<div class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-detail-header">' +
'<div class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-detail-nav">' +
'<tpl if="parent.hasPrev">' +
'<span class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-prev ' +
Ext.baseCSSPrefix + 'dashboard-googlerss-glyph">'+
'{parent.prevGlyph}' +
'</span> '+
'</tpl>' +
' {[parent.currentEntry+1]}/{parent.numEntries} ' +
'<span class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-next ' +
Ext.baseCSSPrefix + 'dashboard-googlerss-glyph"' +
'<tpl if="!parent.hasNext">' +
' style="visibility:hidden"'+
'</tpl>' +
'> {parent.nextGlyph}' +
'</span> '+
'<span class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-close ' +
Ext.baseCSSPrefix + 'dashboard-googlerss-glyph"> ' +
'{parent.closeGlyph}' +
'</span> '+
'</div>' +
'<div class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-title">'+
'<a href="{link}" target=_blank>{title}</a>'+
'</div>'+
'<div class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-author">By {author} - {publishedDate:this.date}</div>' +
'</div>' +
'<div class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-detail">' +
'{content}' +
'</div>' +
'</tpl>',
summaryTpl:
'<tpl for="entries">' +
'<div class="' + Ext.baseCSSPrefix + 'dashboard-googlerss">' +
'<span class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-title">'+
'<a href="{link}" target=_blank>{title}</a>'+
'</span> '+
'<img src="'+Ext.BLANK_IMAGE_URL+'" data-index="{#}" class="'+Ext.baseCSSPrefix+'dashboard-googlerss-preview"><br>' +
'<span class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-author">By {author} - {publishedDate:this.date}</span><br>' +
'<span class="' + Ext.baseCSSPrefix + 'dashboard-googlerss-snippet">{contentSnippet}</span><br>' +
'</div>' +
'</tpl>',
initComponent: function () {
var me = this;
me.feedMgr = new google.feeds.Feed(me.feedUrl);
me.callParent();
},
afterRender: function () {
var me = this;
me.callParent();
if (me.feedMgr) {
me.refresh();
}
me.el.on({
click: me.onClick,
scope: me
});
if (me.previewTips) {
me.tip = new Ext.tip.ToolTip({
target: me.el,
delegate: '.' + me.previewCls,
maxWidth: 800,
showDelay: 750,
autoHide: false,
scrollable: true,
anchor: 'top',
listeners: {
beforeshow: 'onBeforeShowTip',
scope: me
}
});
}
},
formatDate: function (date) {
if (!date) {
return '';
}
date = new Date(date);
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');
}
if (d.getYear() === now.getYear()) {
return Ext.Date.format(date, 'D M d \\a\\t g:i a');
}
return Ext.Date.format(date, 'D M d, Y \\a\\t g:i a');
},
getTitle: function () {
var data = this.data;
return data && data.title;
},
onBeforeShowTip: function (tip) {
if (this.mode !== 'summary') {
return false;
}
var el = tip.triggerElement,
index = parseInt(el.getAttribute('data-index'), 10);
tip.maxHeight = Ext.Element.getViewportHeight() / 2;
tip.update(this.data.entries[index - 1].content);
},
onClick: function (e) {
var me = this,
entry = me.data.currentEntry,
target = Ext.fly(e.getTarget());
if (target.hasCls(me.nextCls)) {
me.setCurrentEntry(entry+1);
} else if (target.hasCls(me.prevCls)) {
me.setCurrentEntry(entry-1);
} else if (target.hasCls(me.closeDetailsCls)) {
me.setMode('summary');
} else if (target.hasCls(me.previewCls)) {
me.setMode('detail', parseInt(target.getAttribute('data-index'), 10));
}
},
refresh: function () {
var me = this;
if (!me.feedMgr) {
return;
}
me.fireEvent('beforeload', me);
//setTimeout(function () {
me.feedMgr.setNumEntries(me.maxFeedEntries);
me.feedMgr.load(function (result) {
me.setFeedData(result.feed);
me.fireEvent('load', me);
});
//}, 2000);
},
setCurrentEntry: function (current) {
this.setMode(this.mode, current);
},
setFeedData: function (feedData) {
var me = this,
entries = feedData.entries,
count = entries && entries.length || 0,
data = Ext.apply({
numEntries: count,
closeGlyph: me.wrapGlyph(me.closeDetailsGlyph),
prevGlyph: me.wrapGlyph(me.prevGlyph),
nextGlyph: me.wrapGlyph(me.nextGlyph),
currentEntry: 0
}, feedData);
me.data = data;
me.setMode(me.mode);
},
setMode: function (mode, currentEntry) {
var me = this,
data = me.data,
current = (currentEntry === undefined) ? data.currentEntry : currentEntry;
me.tpl = me.getTpl(mode + 'Tpl');
me.tpl.date = me.formatDate;
me.mode = mode;
data.currentEntry = current;
data.hasNext = current+1 < data.numEntries;
data.hasPrev = current > 0;
me.update(data);
me.el.dom.scrollTop = 0;
},
wrapGlyph: function (glyph) {
var glyphFontFamily = Ext._glyphFontFamily,
glyphParts,
html;
if (typeof glyph === 'string') {
glyphParts = glyph.split('@');
glyph = glyphParts[0];
glyphFontFamily = glyphParts[1];
}
html = '&#' + glyph + ';';
if (glyphFontFamily) {
html = '<span style="font-family:' + glyphFontFamily + '">' + html + '</span>';
}
return html;
},
// @private
beforeDestroy: function () {
Ext.destroy(this.tip);
this.callParent();
}
});