2 var ImageChooser = function(config){
3 // create the dialog from scratch
4 var dlg = new Roo.LayoutDialog(config.id || Roo.id(), {
8 syncHeightBeforeShow: true,
11 center:{autoScroll:false},
12 east:{split:true,initialSize:150,minSize:150,maxSize:250}
14 dlg.setTitle('Choose an Image');
15 dlg.getEl().addClass('ychooser-dlg');
16 dlg.addKeyListener(27, dlg.hide, dlg);
19 this.ok = dlg.addButton('OK', this.doCallback, this);
21 dlg.setDefaultButton(dlg.addButton('Cancel', dlg.hide, dlg));
22 dlg.on('show', this.load, this);
24 var layout = dlg.getLayout();
26 // filter/sorting toolbar
27 this.tb = new Roo.Toolbar(this.dlg.body.createChild({tag:'div'}));
28 this.sortSelect = Roo.DomHelper.append(this.dlg.body.dom, {
29 tag:'select', children: [
30 {tag: 'option', value:'name', selected: 'true', html:'Name'},
31 {tag: 'option', value:'size', html:'File Size'},
32 {tag: 'option', value:'lastmod', html:'Last Modified'}
35 this.sortSelect.on('change', this.sortImages, this, true);
37 this.txtFilter = Roo.DomHelper.append(this.dlg.body.dom, {
38 tag:'input', type:'text', size:'12'}, true);
40 this.txtFilter.on('focus', function(){this.dom.select();});
41 this.txtFilter.on('keyup', this.filter, this, {buffer:500});
43 this.tb.add('Filter:', this.txtFilter.dom, 'separator', 'Sort By:', this.sortSelect.dom);
45 // add the panels to the layout
47 var vp = layout.add('center', new Roo.ContentPanel(Roo.id(), {
52 var dp = layout.add('east', new Roo.ContentPanel(Roo.id(), {
58 var bodyEl = vp.getEl();
59 bodyEl.appendChild(this.tb.getEl());
60 var viewBody = bodyEl.createChild({tag:'div', cls:'ychooser-view'});
61 vp.resizeEl = viewBody;
63 this.detailEl = dp.getEl();
65 // create the required templates
66 this.thumbTemplate = new Roo.Template(
67 '<div class="thumb-wrap" id="{name}">' +
68 '<div class="thumb"><img src="{url}" title="{name}"></div>' +
69 '<span>{shortName}</span></div>'
71 this.thumbTemplate.compile();
73 this.detailsTemplate = new Roo.Template(
74 '<div class="details"><img src="{url}"><div class="details-info">' +
75 '<b>Image Name:</b>' +
76 '<span>{name}</span>' +
78 '<span>{sizeString}</span>' +
79 '<b>Last Modified:</b>' +
80 '<span>{dateString}</span></div></div>'
82 this.detailsTemplate.compile();
84 // initialize the View
85 this.view = new Roo.JsonView(viewBody, this.thumbTemplate, {
88 emptyText : '<div style="padding:10px;">No images match the specified filter</div>'
90 this.view.on('selectionchange', this.showDetails, this, {buffer:100});
91 this.view.on('dblclick', this.doCallback, this);
92 this.view.on('loadexception', this.onLoadException, this);
93 this.view.on('beforeselect', function(view){
94 return view.getCount() > 0;
96 Roo.apply(this, config, {
97 width: 540, height: 400
100 var formatSize = function(size){
102 return size + " bytes";
104 return (Math.round(((size*10) / 1024))/10) + " KB";
108 // cache data by image name for easy lookup
110 // make some values pretty for display
111 this.view.prepareData = function(data){
112 data.shortName = data.name.ellipse(15);
113 data.sizeString = formatSize(data.size);
114 data.dateString = new Date(data.lastmod).format("m/d/Y g:i a");
115 lookup[data.name] = data;
118 this.lookup = lookup;
120 dlg.resizeTo(this.width, this.height);
123 ImageChooser.prototype = {
124 show : function(el, callback){
127 this.callback = callback;
131 this.view.getEl().dom.scrollTop = 0;
132 this.view.clearFilter();
133 this.txtFilter.dom.value = '';
139 this.view.load({url: this.url, params:this.params, callback:this.onLoad.createDelegate(this)});
143 onLoadException : function(v,o){
144 this.view.getEl().update('<div style="padding:10px;">Error loading images.</div>');
148 var filter = this.txtFilter.dom.value;
149 this.view.filter('name', filter);
158 sortImages : function(){
159 var p = this.sortSelect.dom.value;
160 this.view.sort(p, p != 'name' ? 'desc' : 'asc');
164 showDetails : function(view, nodes){
165 var selNode = nodes[0];
166 if(selNode && this.view.getCount() > 0){
168 var data = this.lookup[selNode.id];
169 this.detailEl.hide();
170 this.detailsTemplate.overwrite(this.detailEl, data);
171 this.detailEl.slideIn('l', {stopFx:true,duration:.2});
175 this.detailEl.update('');
179 doCallback : function(){
180 var selNode = this.view.getSelectedNodes()[0];
181 var callback = this.callback;
182 var lookup = this.lookup;
183 this.dlg.hide(function(){
184 if(selNode && callback){
185 var data = lookup[selNode.id];
192 String.prototype.ellipse = function(maxLength){
193 if(this.length > maxLength){
194 return this.substr(0, maxLength-3) + '...';