]>
Commit | Line | Data |
---|---|---|
6527f429 DM |
1 | /**\r |
2 | * @class FeedViewer.FeedViewer\r | |
3 | * @extends Ext.container.Viewport\r | |
4 | *\r | |
5 | * The main FeedViewer application\r | |
6 | * \r | |
7 | * @constructor\r | |
8 | * Create a new Feed Viewer app\r | |
9 | * @param {Object} config The config object\r | |
10 | */\r | |
11 | \r | |
12 | Ext.define('FeedViewer.App', {\r | |
13 | extend: 'Ext.container.Viewport',\r | |
14 | \r | |
15 | initComponent: function(){\r | |
16 | Ext.define('Feed', {\r | |
17 | extend: 'Ext.data.Model',\r | |
18 | fields: ['title', 'url']\r | |
19 | });\r | |
20 | \r | |
21 | Ext.define('FeedItem', {\r | |
22 | extend: 'Ext.data.Model',\r | |
23 | fields: [{\r | |
24 | name: 'title',\r | |
25 | convert: function(v) {\r | |
26 | return Ext.htmlEncode(v);\r | |
27 | }\r | |
28 | }, 'author', 'link', {\r | |
29 | name: 'pubDate',\r | |
30 | type: 'date'\r | |
31 | }, {\r | |
32 | // Some feeds return the description as the main content\r | |
33 | // Others return description as a summary. Figure this out here\r | |
34 | name: 'description',\r | |
35 | mapping: function(raw) {\r | |
36 | var DQ = Ext.dom.Query,\r | |
37 | content = DQ.selectNode('content', raw),\r | |
38 | key;\r | |
39 | \r | |
40 | if (content && DQ.getNodeValue(content)) {\r | |
41 | key = 'description';\r | |
42 | } else {\r | |
43 | key = 'title';\r | |
44 | }\r | |
45 | return DQ.selectValue(key, raw);\r | |
46 | \r | |
47 | }\r | |
48 | }, {\r | |
49 | name: 'content',\r | |
50 | mapping: function(raw) {\r | |
51 | var DQ = Ext.dom.Query,\r | |
52 | content = DQ.selectNode('content', raw);\r | |
53 | \r | |
54 | if (!content || !DQ.getNodeValue(content)) {\r | |
55 | content = DQ.selectNode('description', raw);\r | |
56 | }\r | |
57 | return DQ.getNodeValue(content, '');\r | |
58 | }\r | |
59 | }]\r | |
60 | });\r | |
61 | \r | |
62 | Ext.apply(this, {\r | |
63 | layout: {\r | |
64 | type: 'border',\r | |
65 | padding: 5\r | |
66 | },\r | |
67 | items: [this.createFeedPanel(), this.createFeedInfo()]\r | |
68 | });\r | |
69 | this.callParent(arguments);\r | |
70 | },\r | |
71 | \r | |
72 | /**\r | |
73 | * Create the list of fields to be shown on the left\r | |
74 | * @private\r | |
75 | * @return {FeedViewer.FeedPanel} feedPanel\r | |
76 | */\r | |
77 | createFeedPanel: function(){\r | |
78 | this.feedPanel = Ext.create('widget.feedpanel', {\r | |
79 | region: 'west',\r | |
80 | collapsible: true,\r | |
81 | width: 225,\r | |
82 | //floatable: false,\r | |
83 | split: true,\r | |
84 | minWidth: 175,\r | |
85 | feeds: [{\r | |
86 | title: 'Sencha Blog',\r | |
87 | url: 'http://feeds.feedburner.com/sencha'\r | |
88 | }, {\r | |
89 | title: 'Sencha Forums',\r | |
90 | url: 'http://sencha.com/forum/external.php?type=RSS2'\r | |
91 | }, {\r | |
92 | title: 'Ajaxian',\r | |
93 | url: 'http://feeds.feedburner.com/ajaxian'\r | |
94 | }],\r | |
95 | listeners: {\r | |
96 | scope: this,\r | |
97 | feedselect: this.onFeedSelect\r | |
98 | }\r | |
99 | });\r | |
100 | return this.feedPanel;\r | |
101 | },\r | |
102 | \r | |
103 | /**\r | |
104 | * Create the feed info container\r | |
105 | * @private\r | |
106 | * @return {FeedViewer.FeedInfo} feedInfo\r | |
107 | */\r | |
108 | createFeedInfo: function(){\r | |
109 | this.feedInfo = Ext.create('widget.feedinfo', {\r | |
110 | region: 'center',\r | |
111 | minWidth: 300\r | |
112 | });\r | |
113 | return this.feedInfo;\r | |
114 | },\r | |
115 | \r | |
116 | /**\r | |
117 | * Reacts to a feed being selected\r | |
118 | * @private\r | |
119 | */\r | |
120 | onFeedSelect: function(feed, title, url){\r | |
121 | this.feedInfo.addFeed(title, url);\r | |
122 | }\r | |
123 | });\r |