Index: openacs-4/packages/ajax-filestorage-ui/www/resources/ajaxfs.js =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ajax-filestorage-ui/www/resources/ajaxfs.js,v diff -u -r1.4 -r1.5 --- openacs-4/packages/ajax-filestorage-ui/www/resources/ajaxfs.js 22 Sep 2007 03:32:38 -0000 1.4 +++ openacs-4/packages/ajax-filestorage-ui/www/resources/ajaxfs.js 14 Nov 2007 04:19:54 -0000 1.5 @@ -247,7 +247,7 @@ var folderid = ajaxfsobj.currentfolder; var foldername = ajaxfsobj.treepanel.getNodeById(folderid).text; var progress = new FileProgress(fileObj, this.getSetting("progress_target")); - progress.SetStatus( upload_txt + ""+foldername+"
"+ zip_txt); + progress.SetStatus( upload_txt + ""+foldername+"
Title: (optional)
"+ zip_txt); progress.ToggleCancel(true, this); this.addFileParam(fileObj.id, "folder_id", folderid); ajaxfsobj.upldDialog.buttons[0].enable(); @@ -383,6 +383,9 @@ // holds a reference to the tree panel this.treepanel = null; + // hold reference to tagcloud panel + this.tagcloudpanel = null; + // holds a reference to the tree editor this.te = null; @@ -398,6 +401,9 @@ // holds the id of the currently selected node in the tree this.currentfolder = null; + // currently selected tag + this.currenttag = null; + // reusable aync data connection this.asyncCon = new Ext.data.Connection(); @@ -520,14 +526,23 @@ if (response.responseText != 1) { Ext.Msg.alert(acs_lang_text.error || "Error",err_msg_txt + ":

"+response.responseText+"

"+err_msg_txt2); } else { - if(nodetype!="folder"&&nodesubtitle===" ") { nodesubtitle = node.get("title") } + if(nodetype!="folder"&&nodesubtitle===" ") { + nodesubtitle = node.get("title"); + node.set("filename",nodesubtitle); + } if(nodetype=="folder") { this.treepanel.getNodeById(nodeid).setText(text) } + nodetags = node.get("tags"); + if(nodetags != "") { + var taghtml = "
Tags:
"+nodetags+"
"; + } else { + var taghtml = "
";; + } node.set("title",text); - node.set("title_and_name",""+text+"
"+nodesubtitle+"") + node.set("title_and_name",""+text+"
"+nodesubtitle+""+taghtml) node.commit(); } } else { - Ext.Msg.alert(acs_lang_text.error || "Error",err_msg_text+":

"+response.responseText+"

"+err_msg_txt2); + Ext.Msg.alert(acs_lang_text.error || "Error",err_msg_txt+":

"+response.responseText+"

"+err_msg_txt2); } } @@ -574,58 +589,149 @@ newwindow.focus(); } + // redirect to object views for a file + this.viewsRedirect = function() { + var node = this.filegrid.getSelectionModel().getSelected(); + var object_id = node.get("id"); + window.open(window.location.protocol+"//"+window.location.hostname+"/o/"+object_id+"/info"); + window.focus(); + } + + + // prompt to enter a tag for the selected fs element + this.promptTag = function() { + + var ajaxfsobj = this; + var node = ajaxfsobj.filegrid.getSelectionModel().getSelected(); + var object_id = node.get("id"); + + + Ext.Msg.prompt('Tag', 'Enter or edit one or more tags. Seperate tags with commas (,):', function(btn, text) { + if (btn == 'ok') { + // process text value ... + var callback = function(option,success,response) { + if(success) { + node.set('tags',text); + Ext.get("tagscontainer_"+object_id).update("Tag:"+text+""); + this.tagcloudpanel.load("/ajaxfs2/xmlhttp/tagcloud?package_id="+this.config.package_id); + } + } + ajaxfsobj.asyncCon.request({url:ajaxfsobj.xmlhttpurl+"addtag", + params: "object_id="+object_id+"&tags="+text+"&package_id="+ajaxfsobj.config.package_id, + method:"POST", + callback: callback, + scope: ajaxfsobj + }); + } + }); + + if (document.getElementById("tagslist_"+object_id)) { + var prompt_text_el = YAHOO.util.Dom.getElementsByClassName('ext-mb-input', 'input','x-msg-box'); + prompt_text_el[0].value=document.getElementById("tagslist_"+object_id).innerHTML; + prompt_text_el[0].select(); + } + + } + + // download archive function + this.downloadArchive = function() { + var node = this.filegrid.getSelectionModel().getSelected(); + var object_id = node.get("id"); + top.location.href="download-archive/?object_id="+object_id; + } + // generate a context bar this.showContext = function(grid,i,e) { e.stopEvent(); - if(this.contextmenu == null) { - // create the menus - this.contextmenu = new Ext.menu.Menu({ - id: 'rightclickmenu', - items: [ - new Ext.menu.Item({ - text: acs_lang_text.deletefs || 'Delete', - icon: '/resources/ajax-filestorage-ui/icons/delete.png', - handler: this.confirmDel.createDelegate(this) - }), - new Ext.menu.Item({ - text: acs_lang_text.rename || 'Rename', - icon: '/resources/ajax-filestorage-ui/icons/page_edit.png', - handler: this.fileRename.createDelegate(this) - }), - new Ext.menu.Item({ - text: acs_lang_text.linkaddress || 'Copy Link Address', - icon: '/resources/ajax-filestorage-ui/icons/page_copy.png', - handler: this.linkCopy.createDelegate(this) - }), - new Ext.menu.Item({ - text: acs_lang_text.permissions || 'Permissions', - icon: '/resources/ajax-filestorage-ui/icons/group_key.png', - handler: this.permsRedirect.createDelegate(this) - }), - new Ext.menu.Item({ - text: acs_lang_text.properties || 'Properties', - icon: '/resources/ajax-filestorage-ui/icons/page_edit.png', - handler: this.propertiesRedirect.createDelegate(this) - }) ] - }); + var dm = grid.getDataSource(); + var record = dm.getAt(i); + var object_type = record.get("type"); + var recordid = record.get("id"); + + if( object_type == "folder") { + var openitem_txt = "Open"; + } else { + var openitem_txt = "Download"; } - // disable rename, copy link, permissions and revisions if more than one node item from the view is selected + + // create the menus + this.contextmenu = new Ext.menu.Menu({ + id: 'rightclickmenu', + items: [ + new Ext.menu.Item({ + text: openitem_txt, + icon: "/resources/ajax-filestorage-ui/icons/page_white.png", + handler: this.itemDblClick.createDelegate(this,[grid, i, e],false) + }), + new Ext.menu.Item({ + text: 'Tag', + icon: '/resources/ajax-filestorage-ui/icons/tag_blue.png', + handler: this.promptTag.createDelegate(this) + }), + new Ext.menu.Item({ + text: 'Views', + icon: '/resources/ajax-filestorage-ui/icons/camera.png', + handler: this.viewsRedirect.createDelegate(this) + }), + new Ext.menu.Item({ + text: acs_lang_text.deletefs || 'Delete', + icon: '/resources/ajax-filestorage-ui/icons/delete.png', + handler: this.confirmDel.createDelegate(this) + }), + new Ext.menu.Item({ + text: acs_lang_text.rename || 'Rename', + icon: '/resources/ajax-filestorage-ui/icons/page_edit.png', + handler: this.fileRename.createDelegate(this) + }), + new Ext.menu.Item({ + text: acs_lang_text.linkaddress || 'Copy Link Address', + icon: '/resources/ajax-filestorage-ui/icons/page_copy.png', + handler: this.linkCopy.createDelegate(this) + }), + new Ext.menu.Item({ + text: acs_lang_text.permissions || 'Permissions', + icon: '/resources/ajax-filestorage-ui/icons/group_key.png', + handler: this.permsRedirect.createDelegate(this) + }), + new Ext.menu.Item({ + text: acs_lang_text.properties || 'Properties', + icon: '/resources/ajax-filestorage-ui/icons/page_edit.png', + handler: this.propertiesRedirect.createDelegate(this) + }), + new Ext.menu.Item({ + text: acs_lang_text.download_archive || 'Download archive', + icon: '/resources/ajax-filestorage-ui/icons/arrow_down.png', + handler: this.downloadArchive.createDelegate(this) + }) ] + }); + + // disable open/download, rename, copy link, permissions and revisions if more than one node item from the view is selected if (grid.getSelectionModel().getCount() > 1) { - this.contextmenu.items.items[1].disable(); - this.contextmenu.items.items[2].disable(); - this.contextmenu.items.items[3].disable(); - this.contextmenu.items.items[4].disable(); + this.contextmenu.items.items[0].hide(); + this.contextmenu.items.items[1].hide(); + this.contextmenu.items.items[2].hide(); + this.contextmenu.items.items[3].show(); + this.contextmenu.items.items[4].hide(); + this.contextmenu.items.items[5].hide(); + this.contextmenu.items.items[6].hide(); + this.contextmenu.items.items[7].hide(); + this.contextmenu.items.items[8].hide(); } else { - this.contextmenu.items.items[1].enable(); - this.contextmenu.items.items[2].enable(); - this.contextmenu.items.items[3].enable(); - var node = this.filegrid.getSelectionModel().getSelected(); - var object_type = node.get("type"); - if (object_type == "folder" || object_type == "url") { - this.contextmenu.items.items[4].disable(); + this.contextmenu.items.items[0].show(); + this.contextmenu.items.items[2].show(); + this.contextmenu.items.items[3].show(); + this.contextmenu.items.items[4].show(); + this.contextmenu.items.items[5].show(); + this.contextmenu.items.items[6].show(); + if (object_type == "folder") { + this.contextmenu.items.items[1].hide(); + this.contextmenu.items.items[7].hide(); + this.contextmenu.items.items[8].show(); } else { - this.contextmenu.items.items[4].enable(); + this.contextmenu.items.items[1].show(); + this.contextmenu.items.items[7].show(); + this.contextmenu.items.items[8].hide(); } } @@ -953,135 +1059,159 @@ } } - // loads the content of the given folder - this.loadFoldercontents = function(node,e) { - // remove the gray class from last selected tree - if (this.currentfolder != null) { - this.treepanel.getNodeById(this.currentfolder).getUI().removeClass("x-tree-grayselected"); - } + // creates the file grid, if it's not yet created + this.createFileGrid = function() { + var cols = [{header: "", width: 50,sortable: true, dataIndex: 'icon'}, + {header: acs_lang_text.filename || "Filename", id:'filename', width: 200, sortable: true, dataIndex: 'title_and_name'}, + {header: acs_lang_text.size || "Size", sortable: true, dataIndex: 'size'}, + {header: acs_lang_text.lastmodified || "Last Modified", sortable: true, dataIndex: 'lastmodified'}]; - // currently selected folder - this.currentfolder = node.id; + var colModel = new Ext.grid.ColumnModel(cols); + colModel.defaultSortable=true; - // fetch the folder contents - if(this.filegrid == null) { + var reader = new Ext.data.JsonReader({totalProperty: 'total', root: 'foldercontents', id: 'id'}, [ + {name:'id', type: 'int'}, + {name:'icon'}, + {name:'title'}, + {name:'filename'}, + {name:'type'}, + {name:'tags'}, + {name:'url'}, + {name:'write_p'}, + {name:'title_and_name'}, + {name:'size'}, + {name:'lastmodified'}] ); - var cols = [{header: "", width: 50,sortable: true, dataIndex: 'icon'}, - {header: acs_lang_text.filename || "Filename", id:'filename', width: 200, sortable: true, dataIndex: 'title_and_name'}, - {header: acs_lang_text.size || "Size", sortable: true, dataIndex: 'size'}, - {header: acs_lang_text.lastmodified || "Last Modified", sortable: true, dataIndex: 'lastmodified'}]; - var colModel = new Ext.grid.ColumnModel(cols); - colModel.defaultSortable=true; + var proxy = new Ext.data.HttpProxy( { + url : this.xmlhttpurl+ 'foldercontents' + } ); - var reader = new Ext.data.JsonReader({totalProperty: 'total', root: 'foldercontents', id: 'id'}, [ - {name:'id', type: 'int'}, - {name:'icon'}, - {name:'title'}, - {name:'filename'}, - {name:'type'}, - {name:'url'}, - {name:'write_p'}, - {name:'title_and_name'}, - {name:'size'}, - {name:'lastmodified'}] ); + var dataModel = new Ext.data.Store({proxy: proxy, reader: reader, remoteSort: true}); + this.filegrid = new Ext.grid.Grid('files',{ + ds: dataModel, + cm: colModel, + autoHeight: false, + autoWidth: true, + autoSizeColumns: false, + trackMouseOver: true, + autoExpandColumn: 'filename', + enableColumnMove: false, + enableColLock: false, + enableColumnHide: false, + loadMask: true, + monitorWindowResize: true, + enableDragDrop: true, + ddGroup:'fileDD' + }); - var proxy = new Ext.data.HttpProxy( { - url : this.xmlhttpurl+ 'foldercontents' - } ); - - var dataModel = new Ext.data.Store({proxy: proxy, reader: reader, remoteSort: true}); + // grid listeners - this.filegrid = new Ext.grid.Grid('files',{ - ds: dataModel, - cm: colModel, - autoHeight: false, - autoWidth: true, - autoSizeColumns: false, - trackMouseOver: true, - autoExpandColumn: 'filename', - enableColumnMove: false, - enableColLock: false, - enableColumnHide: false, - loadMask: true, - monitorWindowResize: true, - enableDragDrop: true, - ddGroup:'fileDD' - }); + // Row Click + // when a grid row is clicked, change the highlight on the currently selected folder + // this is similar to windows explorer behavior + this.filegrid.on("rowclick",function() { + this.treepanel.getSelectionModel().getSelectedNode().getUI().removeClass("x-tree-selected"); + this.treepanel.getSelectionModel().getSelectedNode().getUI().addClass("x-tree-grayselected"); + }, this,true); - // grid listeners + // Row Double Click + this.filegrid.on("rowdblclick",this.itemDblClick,this,true); - // Row Click - // when a grid row is clicked, change the highlight on the currently selected folder - // this is similar to windows explorer behavior - this.filegrid.on("rowclick",function() { - this.treepanel.getSelectionModel().getSelectedNode().getUI().removeClass("x-tree-selected"); - this.treepanel.getSelectionModel().getSelectedNode().getUI().addClass("x-tree-grayselected"); - }, this,true); + // Row Right Click + this.filegrid.on("rowcontextmenu",this.showContext,this,true); - // Row Double Click - this.filegrid.on("rowdblclick",this.itemDblClick,this,true); - - // Row Right Click - this.filegrid.on("rowcontextmenu",this.showContext,this,true); - - // Sort Rows via Drag & Drop - var thegrid = this.filegrid; - var ajaxfsobj = this; - var ddrow = new Ext.dd.DropTarget(thegrid.container, { - ddGroup : 'fileDD', - copy:false, - notifyDrop : function(dd, e, data){ - var ds=thegrid.getDataSource(); - var sm=thegrid.getSelectionModel(); - var rows=sm.getSelections(); - if(dd.getDragData(e)) { - var cindex=dd.getDragData(e).rowIndex; - if(typeof(cindex) != "undefined") { - if (!this.copy){ - for(i = 0; i < rows.length; i++) { - ds.remove(ds.getById(rows[i].id)); - } + // Sort Rows via Drag & Drop + var thegrid = this.filegrid; + var ajaxfsobj = this; + var ddrow = new Ext.dd.DropTarget(thegrid.container, { + ddGroup : 'fileDD', + copy:false, + notifyDrop : function(dd, e, data){ + var ds=thegrid.getDataSource(); + var sm=thegrid.getSelectionModel(); + var rows=sm.getSelections(); + if(dd.getDragData(e)) { + var cindex=dd.getDragData(e).rowIndex; + if(typeof(cindex) != "undefined") { + if (!this.copy){ + for(i = 0; i < rows.length; i++) { + ds.remove(ds.getById(rows[i].id)); } - ds.insert(cindex,data.selections); - sm.clearSelections(); } - - // ** CSM SPECIFIC ** - // send an xmlhttp request to update the order_n of fs_objects - /* - var params = ""; - var dm = thegrid.getDataSource(); - for(var i = 0;i