Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / examples / view / chooser.js
1 /*!
2  * Ext JS Library 3.0.0
3  * Copyright(c) 2006-2009 Ext JS, LLC
4  * licensing@extjs.com
5  * http://www.extjs.com/license
6  */
7 var ImageChooser = function(config){\r
8         this.config = config;\r
9 }\r
10 \r
11 ImageChooser.prototype = {\r
12     // cache data by image name for easy lookup\r
13     lookup : {},\r
14 \r
15         show : function(el, callback){\r
16                 if(!this.win){\r
17                         this.initTemplates();\r
18 \r
19                         this.store = new Ext.data.JsonStore({\r
20                             url: this.config.url,\r
21                             root: 'images',\r
22                             fields: [\r
23                                 'name', 'url',\r
24                                 {name:'size', type: 'float'},\r
25                                 {name:'lastmod', type:'date', dateFormat:'timestamp'}\r
26                             ],\r
27                             listeners: {\r
28                                 'load': {fn:function(){ this.view.select(0); }, scope:this, single:true}\r
29                             }\r
30                         });\r
31                         this.store.load();\r
32 \r
33                         var formatSize = function(data){\r
34                         if(data.size < 1024) {\r
35                             return data.size + " bytes";\r
36                         } else {\r
37                             return (Math.round(((data.size*10) / 1024))/10) + " KB";\r
38                         }\r
39                     };\r
40 \r
41                         var formatData = function(data){\r
42                         data.shortName = data.name.ellipse(15);\r
43                         data.sizeString = formatSize(data);\r
44                         data.dateString = new Date(data.lastmod).format("m/d/Y g:i a");\r
45                         this.lookup[data.name] = data;\r
46                         return data;\r
47                     };\r
48 \r
49                     this.view = new Ext.DataView({\r
50                                 tpl: this.thumbTemplate,\r
51                                 singleSelect: true,\r
52                                 overClass:'x-view-over',\r
53                                 itemSelector: 'div.thumb-wrap',\r
54                                 emptyText : '<div style="padding:10px;">No images match the specified filter</div>',\r
55                                 store: this.store,\r
56                                 listeners: {\r
57                                         'selectionchange': {fn:this.showDetails, scope:this, buffer:100},\r
58                                         'dblclick'       : {fn:this.doCallback, scope:this},\r
59                                         'loadexception'  : {fn:this.onLoadException, scope:this},\r
60                                         'beforeselect'   : {fn:function(view){\r
61                                         return view.store.getRange().length > 0;\r
62                                     }}\r
63                                 },\r
64                                 prepareData: formatData.createDelegate(this)\r
65                         });\r
66 \r
67                         var cfg = {\r
68                         title: 'Choose an Image',\r
69                         id: 'img-chooser-dlg',\r
70                         layout: 'border',\r
71                                 minWidth: 500,\r
72                                 minHeight: 300,\r
73                                 modal: true,\r
74                                 closeAction: 'hide',\r
75                                 border: false,\r
76                                 items:[{\r
77                                         id: 'img-chooser-view',\r
78                                         region: 'center',\r
79                                         autoScroll: true,\r
80                                         items: this.view,\r
81                     tbar:[{\r
82                         text: 'Filter:'\r
83                     },{\r
84                         xtype: 'textfield',\r
85                         id: 'filter',\r
86                         selectOnFocus: true,\r
87                         width: 100,\r
88                         listeners: {\r
89                                 'render': {fn:function(){\r
90                                                         Ext.getCmp('filter').getEl().on('keyup', function(){\r
91                                                                 this.filter();\r
92                                                         }, this, {buffer:500});\r
93                                 }, scope:this}\r
94                         }\r
95                     }, ' ', '-', {\r
96                         text: 'Sort By:'\r
97                     }, {\r
98                         id: 'sortSelect',\r
99                         xtype: 'combo',\r
100                                         typeAhead: true,\r
101                                         triggerAction: 'all',\r
102                                         width: 100,\r
103                                         editable: false,\r
104                                         mode: 'local',\r
105                                         displayField: 'desc',\r
106                                         valueField: 'name',\r
107                                         lazyInit: false,\r
108                                         value: 'name',\r
109                                         store: new Ext.data.ArrayStore({\r
110                                                 fields: ['name', 'desc'],\r
111                                                 data : [['name', 'Name'],['size', 'File Size'],['lastmod', 'Last Modified']]\r
112                                             }),\r
113                                             listeners: {\r
114                                                         'select': {fn:this.sortImages, scope:this}\r
115                                             }\r
116                                     }]\r
117                                 },{\r
118                                         id: 'img-detail-panel',\r
119                                         region: 'east',\r
120                                         split: true,\r
121                                         width: 150,\r
122                                         minWidth: 150,\r
123                                         maxWidth: 250\r
124                                 }],\r
125                                 buttons: [{\r
126                                         id: 'ok-btn',\r
127                                         text: 'OK',\r
128                                         handler: this.doCallback,\r
129                                         scope: this\r
130                                 },{\r
131                                         text: 'Cancel',\r
132                                         handler: function(){ this.win.hide(); },\r
133                                         scope: this\r
134                                 }],\r
135                                 keys: {\r
136                                         key: 27, // Esc key\r
137                                         handler: function(){ this.win.hide(); },\r
138                                         scope: this\r
139                                 }\r
140                         };\r
141                         Ext.apply(cfg, this.config);\r
142                     this.win = new Ext.Window(cfg);\r
143                 }\r
144 \r
145                 this.reset();\r
146             this.win.show(el);\r
147                 this.callback = callback;\r
148                 this.animateTarget = el;\r
149         },\r
150 \r
151         initTemplates : function(){\r
152                 this.thumbTemplate = new Ext.XTemplate(\r
153                         '<tpl for=".">',\r
154                                 '<div class="thumb-wrap" id="{name}">',\r
155                                 '<div class="thumb"><img src="{url}" title="{name}"></div>',\r
156                                 '<span>{shortName}</span></div>',\r
157                         '</tpl>'\r
158                 );\r
159                 this.thumbTemplate.compile();\r
160 \r
161                 this.detailsTemplate = new Ext.XTemplate(\r
162                         '<div class="details">',\r
163                                 '<tpl for=".">',\r
164                                         '<img src="{url}"><div class="details-info">',\r
165                                         '<b>Image Name:</b>',\r
166                                         '<span>{name}</span>',\r
167                                         '<b>Size:</b>',\r
168                                         '<span>{sizeString}</span>',\r
169                                         '<b>Last Modified:</b>',\r
170                                         '<span>{dateString}</span></div>',\r
171                                 '</tpl>',\r
172                         '</div>'\r
173                 );\r
174                 this.detailsTemplate.compile();\r
175         },\r
176 \r
177         showDetails : function(){\r
178             var selNode = this.view.getSelectedNodes();\r
179             var detailEl = Ext.getCmp('img-detail-panel').body;\r
180                 if(selNode && selNode.length > 0){\r
181                         selNode = selNode[0];\r
182                         Ext.getCmp('ok-btn').enable();\r
183                     var data = this.lookup[selNode.id];\r
184             detailEl.hide();\r
185             this.detailsTemplate.overwrite(detailEl, data);\r
186             detailEl.slideIn('l', {stopFx:true,duration:.2});\r
187                 }else{\r
188                     Ext.getCmp('ok-btn').disable();\r
189                     detailEl.update('');\r
190                 }\r
191         },\r
192 \r
193         filter : function(){\r
194                 var filter = Ext.getCmp('filter');\r
195                 this.view.store.filter('name', filter.getValue());\r
196                 this.view.select(0);\r
197         },\r
198 \r
199         sortImages : function(){\r
200                 var v = Ext.getCmp('sortSelect').getValue();\r
201         this.view.store.sort(v, v == 'name' ? 'asc' : 'desc');\r
202         this.view.select(0);\r
203     },\r
204 \r
205         reset : function(){\r
206                 if(this.win.rendered){\r
207                         Ext.getCmp('filter').reset();\r
208                         this.view.getEl().dom.scrollTop = 0;\r
209                 }\r
210             this.view.store.clearFilter();\r
211                 this.view.select(0);\r
212         },\r
213 \r
214         doCallback : function(){\r
215         var selNode = this.view.getSelectedNodes()[0];\r
216                 var callback = this.callback;\r
217                 var lookup = this.lookup;\r
218                 this.win.hide(this.animateTarget, function(){\r
219             if(selNode && callback){\r
220                                 var data = lookup[selNode.id];\r
221                                 callback(data);\r
222                         }\r
223                 });\r
224     },\r
225 \r
226         onLoadException : function(v,o){\r
227             this.view.getEl().update('<div style="padding:10px;">Error loading images.</div>');\r
228         }\r
229 };\r
230 \r
231 String.prototype.ellipse = function(maxLength){\r
232     if(this.length > maxLength){\r
233         return this.substr(0, maxLength-3) + '...';\r
234     }\r
235     return this;\r
236 };\r