diff --git a/lib/form/filemanager.js b/lib/form/filemanager.js index 2b176f63a7f..87b3599e304 100644 --- a/lib/form/filemanager.js +++ b/lib/form/filemanager.js @@ -468,6 +468,13 @@ M.form_filemanager.init = function(Y, options) { rightclickcallback : function(e, node) { if (e.preventDefault) { e.preventDefault(); } this.select_file(node); + }, + classnamecallback : function(node) { + var classname = ''; + if (node.type == 'folder') { classname = classname + ' fp-folder';} + if (node.filepath) { classname = classname + ' fp-hascontextmenu';} + if (node.sortorder == 1) { classname = classname + ' fp-mainfile';} + return Y.Lang.trim(classname); } }; if (this.viewmode == 2) { @@ -606,7 +613,9 @@ M.form_filemanager.init = function(Y, options) { }, this); selectnode.one('.fp-file-download').on('click', function(e) { e.preventDefault(); - window.open(this.selectui.fileinfo.url, 'fm-download-file'); + if (this.selectui.fileinfo.type != 'folder') { + window.open(this.selectui.fileinfo.url, 'fm-download-file'); + } }, this); selectnode.one('.fp-file-delete').on('click', function(e) { e.preventDefault(); @@ -644,6 +653,10 @@ M.form_filemanager.init = function(Y, options) { e.preventDefault(); var params = {}; var fileinfo = this.selectui.fileinfo; + if (fileinfo.type != 'folder') { + // this button should not even be shown + return; + } params['filepath'] = fileinfo.filepath; params['filename'] = '.'; selectnode.addClass('loading'); @@ -661,6 +674,10 @@ M.form_filemanager.init = function(Y, options) { e.preventDefault(); var params = {}; var fileinfo = this.selectui.fileinfo; + if (fileinfo.type != 'zip') { + // this button should not even be shown + return; + } params['filepath'] = fileinfo.filepath; params['filename'] = fileinfo.fullname; selectnode.addClass('loading'); @@ -678,6 +695,10 @@ M.form_filemanager.init = function(Y, options) { e.preventDefault(); var params = {}; var fileinfo = this.selectui.fileinfo; + if (fileinfo.type == 'folder') { + // this button should not even be shown for folders + return; + } params['filepath'] = fileinfo.filepath; params['filename'] = fileinfo.fullname; selectnode.addClass('loading'); @@ -687,7 +708,7 @@ M.form_filemanager.init = function(Y, options) { params: params, callback: function(id, obj, args) { args.scope.selectui.hide(); - args.scope.refresh(obj.filepath); + args.scope.refresh(fileinfo.filepath); } }); }, this); @@ -710,7 +731,7 @@ M.form_filemanager.init = function(Y, options) { removeClass('fp-file').removeClass('fp-zip').removeClass('fp-cansetmain'); if (node.type == 'folder' || node.type == 'zip') {selectnode.addClass('fp-'+node.type);} else {selectnode.addClass('fp-file');} - if (this.enablemainfile && (node.sortorder != 1)) { + if (this.enablemainfile && (node.sortorder != 1) && node.type == 'file') { selectnode.addClass('fp-cansetmain'); } this.selectui.fileinfo = node; diff --git a/repository/filepicker.js b/repository/filepicker.js index b1b0c3c4a44..9f9dc604f59 100644 --- a/repository/filepicker.js +++ b/repository/filepicker.js @@ -82,12 +82,12 @@ YUI.add('moodle-core_filepicker', function(Y) { * filenode : Node element that contains template for displaying one file * callback : On click callback. The element of the fileslist array will be passed as argument * rightclickcallback : On right click callback (optional). - * norootrightclick : No right click for top element in the tree * callbackcontext : context where callbacks are executed * sortable : whether content may be sortable (in table mode) * dynload : allow dynamic load for tree view * filepath : for pre-building of tree view - the path to the current directory in filepicker format - * treeview_dynload : callback to ... + * treeview_dynload : callback to function to dynamically load the folder in tree view + * classnamecallback : callback to function that returns the class name for an element * @param array fileslist array of files to show, each array element may have attributes: * title or fullname : file name * shorttitle (optional) : display file name @@ -129,14 +129,8 @@ YUI.add('moodle-core_filepicker', function(Y) { el.one('.fp-filename').setContent(file_get_displayname(node)); // TODO add tooltip with node.title or node.thumbnail_title - var tmpnodedata = {className:''}; - if (file_is_folder(node)) { - el.get('children').addClass('fp-folder'); - tmpnodedata.className = tmpnodedata.className + ' fp-folder'; - } - if (options.rightclickcallback && !node.nocontextmenu) { - tmpnodedata.className = tmpnodedata.className + ' fp-hascontextmenu'; - } + var tmpnodedata = {className:options.classnamecallback(node)}; + el.get('children').addClass(tmpnodedata.className); if (node.icon) { el.one('.fp-icon').appendChild(Y.Node.create('').set('src', node.icon)); if (node.realicon) { @@ -179,9 +173,6 @@ YUI.add('moodle-core_filepicker', function(Y) { for (var i in options.filepath) { if (mytreeel == null) { mytreeel = mytree; - if (options.norootrightclick) { - mytreeel.nocontextmenu = true; - } } else { mytreeel.children = [{}]; mytreeel = mytreeel.children[0]; @@ -243,9 +234,7 @@ YUI.add('moodle-core_filepicker', function(Y) { var formatTitle = function(o) { var el = Y.Node.create('
'); el.appendChild(options.filenode.cloneNode(true)); // TODO not node but string! - if (o.data['isfolder']) { - el.get('children').addClass('fp-folder'); - } + el.get('children').addClass(o.data['classname']); el.one('.fp-filename').setContent(o.value); if (o.data['icon']) { el.one('.fp-icon').appendChild(Y.Node.create('').set('src', o.data['icon'])); @@ -304,6 +293,7 @@ YUI.add('moodle-core_filepicker', function(Y) { // to speed up sorting and formatting fileslist[k].displayname = file_get_displayname(fileslist[k]); fileslist[k].isfolder = file_is_folder(fileslist[k]); + fileslist[k].classname = options.classnamecallback(fileslist[k]); } scope.tableview.addRows(fileslist); scope.tableview.sortable = options.sortable ? true : false; @@ -331,12 +321,7 @@ YUI.add('moodle-core_filepicker', function(Y) { var node = fileslist[k]; var element = options.filenode.cloneNode(true); parent.appendChild(element); - if (file_is_folder(node)) { - element.addClass('fp-folder'); - } - if (options.rightclickcallback) { - element.addClass('fp-hascontextmenu'); - } + element.addClass(options.classnamecallback(node)); var filenamediv = element.one('.fp-filename'); filenamediv.setContent(file_get_displayname(node)); var imgdiv = element.one('.fp-thumbnail'), width, height, src; @@ -858,6 +843,9 @@ M.core_filepicker.init = function(Y, options) { this.content_scrolled(); } }, + classnamecallback : function(node) { + return node.children ? 'fp-folder' : ''; + }, dynload : this.active_repo.dynload, filepath : this.filepath, treeview_dynload : this.treeview_dynload @@ -893,6 +881,9 @@ M.core_filepicker.init = function(Y, options) { } else { this.select_file(node); } + }, + classnamecallback : function(node) { + return node.children ? 'fp-folder' : ''; } }; this.fpnode.one('.fp-content').fp_display_filelist(options, list, this.lazyloading); @@ -927,6 +918,9 @@ M.core_filepicker.init = function(Y, options) { } else { this.select_file(node); } + }, + classnamecallback : function(node) { + return node.children ? 'fp-folder' : ''; } }; this.fpnode.one('.fp-content').fp_display_filelist(options, list, this.lazyloading); @@ -1144,7 +1138,6 @@ M.core_filepicker.init = function(Y, options) { set('id', 'filepicker-'+client_id); var fpselectnode = Y.Node.create(M.core_filepicker.templates.selectlayout); Y.one(document.body).appendChild(this.fpnode); - this.fpnode.appendChild(fpselectnode); this.mainui = new Y.Panel({ srcNode : this.fpnode, headerContent: M.str.repository.filepicker, @@ -1161,7 +1154,9 @@ M.core_filepicker.init = function(Y, options) { // allow to move the panel dragging it by it's header: this.mainui.plug(Y.Plugin.Drag,{handles:['.yui3-widget-hd']}); this.mainui.show(); + if (this.mainui.get('y')<0) {this.mainui.set('y', 0);} // create panel for selecting a file (initially hidden) + this.fpnode.appendChild(fpselectnode); this.selectui = new Y.Panel({ srcNode : fpselectnode, zIndex : 600000, diff --git a/theme/base/style/filemanager.css b/theme/base/style/filemanager.css index d85963e5020..2f1d7bcfd6c 100644 --- a/theme/base/style/filemanager.css +++ b/theme/base/style/filemanager.css @@ -237,6 +237,7 @@ background: #CCC!important;filter: progid:DXImageTransform.Microsoft.gradient(st .filemanager .fp-iconview .fp-file {float:left;text-align:center;} .filemanager .fp-iconview .fp-file div {overflow: hidden;} .filemanager .fp-iconview .fp-file .fp-filename {height:48px;text-align:center;min-width:50px;} +.filemanager .fp-mainfile .fp-filename {font-weight:bold;} .filemanager .fp-contextmenu {display:none;} .filemanager .fp-iconview .fp-folder.fp-hascontextmenu .fp-contextmenu {display:block;position:absolute;right:0px;top:0px;}