Commit | Line | Data |
---|---|---|
494bf5c8 DC |
1 | // This file is part of Moodle - http://moodle.org/ |
2 | // | |
3 | // Moodle is free software: you can redistribute it and/or modify | |
4 | // it under the terms of the GNU General Public License as published by | |
5 | // the Free Software Foundation, either version 3 of the License, or | |
6 | // (at your option) any later version. | |
7 | // | |
8 | // Moodle is distributed in the hope that it will be useful, | |
9 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | // GNU General Public License for more details. | |
12 | // | |
13 | // You should have received a copy of the GNU General Public License | |
14 | // along with Moodle. If not, see <http://www.gnu.org/licenses/>. | |
494bf5c8 | 15 | /** |
494bf5c8 | 16 | * |
840912d5 DC |
17 | * File Manager UI |
18 | * ===== | |
19 | * this.api, stores the URL to make ajax request | |
20 | * this.currentpath | |
21 | * this.filepicker_options | |
22 | * this.movefile_dialog | |
23 | * this.mkdir_dialog | |
24 | * this.rename_dialog | |
25 | * this.client_id | |
554cd8fc DC |
26 | * this.filecount, how many files in this filemanager |
27 | * this.maxfiles | |
28 | * this.maxbytes | |
840912d5 DC |
29 | * |
30 | * FileManager options: | |
31 | * ===== | |
32 | * this.options.currentpath | |
33 | * this.options.itemid | |
494bf5c8 | 34 | */ |
56a7bf68 | 35 | |
4c508047 | 36 | |
906e7d89 MG |
37 | M.form_filemanager = {templates:{}}; |
38 | ||
39 | M.form_filemanager.set_templates = function(Y, templates) { | |
40 | M.form_filemanager.templates = templates; | |
41 | } | |
4c508047 PS |
42 | |
43 | /** | |
44 | * This fucntion is called for each file picker on page. | |
45 | */ | |
46 | M.form_filemanager.init = function(Y, options) { | |
47 | var FileManagerHelper = function(options) { | |
48 | FileManagerHelper.superclass.constructor.apply(this, arguments); | |
d3067516 | 49 | }; |
4c508047 PS |
50 | FileManagerHelper.NAME = "FileManager"; |
51 | FileManagerHelper.ATTRS = { | |
840912d5 DC |
52 | options: {}, |
53 | lang: {} | |
54 | }; | |
4c508047 PS |
55 | |
56 | Y.extend(FileManagerHelper, Y.Base, { | |
64f93798 | 57 | api: M.cfg.wwwroot+'/repository/draftfiles_ajax.php', |
840912d5 | 58 | menus: {}, |
4c508047 PS |
59 | initializer: function(options) { |
60 | this.options = options; | |
f45dfeeb | 61 | if (options.mainfile) { |
ac9c14dd | 62 | this.enablemainfile = options.mainfile; |
f45dfeeb | 63 | } |
4c508047 | 64 | this.client_id = options.client_id; |
840912d5 | 65 | this.currentpath = '/'; |
4c508047 PS |
66 | this.maxfiles = options.maxfiles; |
67 | this.maxbytes = options.maxbytes; | |
adce0230 | 68 | this.emptycallback = null; // Used by drag and drop upload |
133fd70b DC |
69 | |
70 | this.filepicker_options = options.filepicker?options.filepicker:{}; | |
71 | this.filepicker_options.client_id = this.client_id; | |
be85f7ab | 72 | this.filepicker_options.context = options.context; |
133fd70b DC |
73 | this.filepicker_options.maxfiles = this.maxfiles; |
74 | this.filepicker_options.maxbytes = this.maxbytes; | |
75 | this.filepicker_options.env = 'filemanager'; | |
133fd70b DC |
76 | this.filepicker_options.itemid = options.itemid; |
77 | ||
4c508047 PS |
78 | if (options.filecount) { |
79 | this.filecount = options.filecount; | |
554cd8fc DC |
80 | } else { |
81 | this.filecount = 0; | |
82 | } | |
906e7d89 MG |
83 | this.filemanager = Y.one('#filemanager-'+options.client_id); |
84 | if (this.filemanager.hasClass('filemanager-container') || !this.filemanager.one('.filemanager-container')) { | |
85 | this.dndcontainer = this.filemanager; | |
86 | } else { | |
87 | this.dndcontainer = this.filemanager.one('.filemanager-container'); | |
88 | if (!this.dndcontainer.get('id')) { | |
89 | this.dndcontainer.generateID(); | |
90 | } | |
91 | } | |
840912d5 | 92 | this.setup_buttons(); |
910e1ecd | 93 | this.refresh(this.currentpath); // MDL-31113 get latest list from server |
840912d5 | 94 | }, |
4c508047 | 95 | |
403eabd4 | 96 | wait: function(client_id) { |
906e7d89 | 97 | this.filemanager.addClass('fm-updating'); |
403eabd4 DC |
98 | }, |
99 | request: function(args, redraw) { | |
840912d5 DC |
100 | var api = this.api + '?action='+args.action; |
101 | var params = {}; | |
102 | var scope = this; | |
103 | if (args['scope']) { | |
104 | scope = args['scope']; | |
105 | } | |
4c508047 | 106 | params['sesskey'] = M.cfg.sesskey; |
840912d5 DC |
107 | params['client_id'] = this.client_id; |
108 | params['filepath'] = this.currentpath; | |
109 | params['itemid'] = this.options.itemid?this.options.itemid:0; | |
110 | if (args['params']) { | |
111 | for (i in args['params']) { | |
112 | params[i] = args['params'][i]; | |
56a7bf68 | 113 | } |
56a7bf68 | 114 | } |
840912d5 DC |
115 | var cfg = { |
116 | method: 'POST', | |
117 | on: { | |
118 | complete: function(id,o,p) { | |
119 | if (!o) { | |
120 | alert('IO FATAL'); | |
121 | return; | |
122 | } | |
384ab39a | 123 | var data = Y.JSON.parse(o.responseText); |
840912d5 DC |
124 | args.callback(id,data,p); |
125 | } | |
126 | }, | |
127 | arguments: { | |
128 | scope: scope | |
129 | }, | |
130 | headers: { | |
131 | 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', | |
132 | 'User-Agent': 'MoodleFileManager/3.0' | |
133 | }, | |
134 | data: build_querystring(params) | |
135 | }; | |
136 | if (args.form) { | |
137 | cfg.form = args.form; | |
56a7bf68 | 138 | } |
840912d5 | 139 | Y.io(api, cfg); |
403eabd4 DC |
140 | if (redraw) { |
141 | this.wait(this.client_id); | |
142 | } | |
840912d5 DC |
143 | }, |
144 | filepicker_callback: function(obj) { | |
554cd8fc | 145 | this.filecount++; |
910e1ecd DS |
146 | this.check_buttons(); |
147 | this.refresh(this.currentpath); | |
a5dd1f4f SH |
148 | if (typeof M.core_formchangechecker != 'undefined') { |
149 | M.core_formchangechecker.set_form_changed(); | |
150 | } | |
910e1ecd DS |
151 | }, |
152 | check_buttons: function() { | |
906e7d89 MG |
153 | if (this.filecount>0) {this.filemanager.removeClass('fm-nofiles');} |
154 | else {this.filemanager.addClass('fm-nofiles');} | |
155 | if (this.filecount >= this.maxfiles && this.maxfiles!=-1) | |
156 | {this.filemanager.addClass('fm-maxfiles');} | |
157 | else {this.filemanager.removeClass('fm-maxfiles');} | |
840912d5 DC |
158 | }, |
159 | refresh: function(filepath) { | |
160 | var scope = this; | |
59eeb81b | 161 | this.currentpath = filepath; |
840912d5 DC |
162 | if (!filepath) { |
163 | filepath = this.currentpath; | |
164 | } else { | |
165 | this.currentpath = filepath; | |
56a7bf68 | 166 | } |
840912d5 DC |
167 | this.request({ |
168 | action: 'list', | |
169 | scope: scope, | |
170 | params: {'filepath':filepath}, | |
171 | callback: function(id, obj, args) { | |
910e1ecd DS |
172 | scope.filecount = obj.filecount; |
173 | scope.check_buttons(); | |
840912d5 DC |
174 | scope.options = obj; |
175 | scope.render(obj); | |
56a7bf68 | 176 | } |
403eabd4 | 177 | }, true); |
840912d5 DC |
178 | }, |
179 | setup_buttons: function() { | |
906e7d89 MG |
180 | var button_download = this.filemanager.one('.fm-btn-download'); |
181 | var button_create = this.filemanager.one('.fm-btn-mkdir'); | |
182 | var button_addfile = this.filemanager.one('.fm-btn-add'); | |
840912d5 DC |
183 | |
184 | // setup 'add file' button | |
185 | // if maxfiles == -1, the no limit | |
906e7d89 MG |
186 | button_addfile.on('click', function(e) { |
187 | e.preventDefault(); | |
188 | var options = this.filepicker_options; | |
189 | options.formcallback = this.filepicker_callback; | |
190 | // XXX: magic here, to let filepicker use filemanager scope | |
191 | options.magicscope = this; | |
192 | options.savepath = this.currentpath; | |
193 | M.core_filepicker.show(Y, options); | |
194 | }, this); | |
840912d5 DC |
195 | |
196 | // setup 'make a folder' button | |
197 | if (this.options.subdirs) { | |
198 | button_create.on('click',function(e) { | |
906e7d89 | 199 | e.preventDefault(); |
840912d5 DC |
200 | var scope = this; |
201 | // a function used to perform an ajax request | |
202 | function perform_action(e) { | |
203 | var foldername = Y.one('#fm-newname').get('value'); | |
204 | if (!foldername) { | |
205 | return; | |
206 | } | |
207 | scope.request({ | |
208 | action:'mkdir', | |
209 | params: {filepath:scope.currentpath, newdirname:foldername}, | |
210 | callback: function(id, obj, args) { | |
211 | var filepath = obj.filepath; | |
212 | scope.mkdir_dialog.hide(); | |
213 | scope.refresh(filepath); | |
214 | Y.one('#fm-newname').set('value', ''); | |
a5dd1f4f SH |
215 | if (typeof M.core_formchangechecker != 'undefined') { |
216 | M.core_formchangechecker.set_form_changed(); | |
217 | } | |
840912d5 DC |
218 | } |
219 | }); | |
220 | } | |
221 | if (!Y.one('#fm-mkdir-dlg')) { | |
2b728cb5 | 222 | var dialog = Y.Node.create('<div id="fm-mkdir-dlg"><div class="hd">'+M.str.repository.entername+'</div><div class="bd"><input type="text" id="fm-newname" /></div></div>'); |
840912d5 DC |
223 | Y.one(document.body).appendChild(dialog); |
224 | this.mkdir_dialog = new YAHOO.widget.Dialog("fm-mkdir-dlg", { | |
225 | width: "300px", | |
226 | visible: true, | |
227 | x:e.pageX, | |
228 | y:e.pageY, | |
229 | constraintoviewport : true | |
230 | }); | |
56a7bf68 | 231 | |
840912d5 | 232 | } |
2b728cb5 PS |
233 | var buttons = [ { text:M.str.moodle.ok, handler:perform_action, isDefault:true }, |
234 | { text:M.str.moodle.cancel, handler:function(){this.cancel();}}]; | |
56a7bf68 | 235 | |
840912d5 DC |
236 | this.mkdir_dialog.cfg.queueProperty("buttons", buttons); |
237 | this.mkdir_dialog.render(); | |
238 | this.mkdir_dialog.show(); | |
239 | }, this); | |
56a7bf68 | 240 | } else { |
906e7d89 | 241 | this.filemanager.addClass('fm-nomkdir'); |
56a7bf68 | 242 | } |
840912d5 DC |
243 | |
244 | // setup 'download this folder' button | |
245 | // NOTE: popup window must be enabled to perform download process | |
906e7d89 MG |
246 | button_download.on('click',function(e) { |
247 | e.preventDefault(); | |
840912d5 DC |
248 | var scope = this; |
249 | // perform downloaddir ajax request | |
250 | this.request({ | |
251 | action: 'downloaddir', | |
252 | scope: scope, | |
253 | callback: function(id, obj, args) { | |
7210e887 DC |
254 | if (obj) { |
255 | scope.refresh(obj.filepath); | |
256 | var win = window.open(obj.fileurl, 'fm-download-folder'); | |
257 | if (!win) { | |
258 | alert(M.str.repository.popupblockeddownload); | |
259 | } | |
260 | } else { | |
261 | alert(M.str.repository.draftareanofiles); | |
840912d5 DC |
262 | } |
263 | } | |
264 | }); | |
265 | }, this); | |
266 | }, | |
267 | render: function() { | |
840912d5 DC |
268 | var options = this.options; |
269 | var path = this.options.path; | |
270 | var list = this.options.list; | |
906e7d89 MG |
271 | var breadcrumb = this.filemanager.one('.fm-breadcrumb'); |
272 | // empty breadcrumb | |
273 | breadcrumb.set('innerHTML', '').addClass('fm-empty'); | |
840912d5 | 274 | // build breadcrumb |
906e7d89 MG |
275 | if (path && path.length) { |
276 | breadcrumb.removeClass('fm-empty'); | |
840912d5 DC |
277 | var count = 0; |
278 | for(var p in path) { | |
279 | var arrow = ''; | |
280 | if (count==0) { | |
2b728cb5 | 281 | arrow = Y.Node.create('<span>'+M.str.moodle.path + ': </span>'); |
840912d5 DC |
282 | } else { |
283 | arrow = Y.Node.create('<span> â–¶ </span>'); | |
494bf5c8 | 284 | } |
840912d5 DC |
285 | count++; |
286 | ||
4c508047 | 287 | var pathid = 'fm-path-node-'+this.client_id; |
840912d5 DC |
288 | pathid += ('-'+count); |
289 | ||
290 | var crumb = Y.Node.create('<a href="###" id="'+pathid+'">'+path[p].name+'</a>'); | |
291 | breadcrumb.appendChild(arrow); | |
292 | breadcrumb.appendChild(crumb); | |
293 | ||
294 | var args = {}; | |
295 | args.requestpath = path[p].path; | |
4c508047 | 296 | args.client_id = this.client_id; |
840912d5 DC |
297 | Y.one('#'+pathid).on('click', function(e, args) { |
298 | var scope = this; | |
299 | var params = {}; | |
300 | params['filepath'] = args.requestpath; | |
59eeb81b | 301 | this.currentpath = args.requestpath; |
840912d5 DC |
302 | this.request({ |
303 | action: 'list', | |
304 | scope: scope, | |
305 | params: params, | |
306 | callback: function(id, obj, args) { | |
910e1ecd DS |
307 | scope.filecount = obj.filecount; |
308 | scope.check_buttons(); | |
840912d5 DC |
309 | scope.options = obj; |
310 | scope.render(obj); | |
311 | } | |
403eabd4 | 312 | }, true); |
840912d5 | 313 | }, this, args); |
56a7bf68 | 314 | } |
56a7bf68 | 315 | } |
840912d5 DC |
316 | var listhtml = ''; |
317 | ||
318 | // folder list items | |
319 | var folder_ids = []; | |
320 | var folder_data = {}; | |
321 | ||
322 | // normal file list items | |
323 | var file_ids = []; | |
324 | var file_data = {}; | |
325 | ||
326 | // archives list items | |
327 | var zip_ids = []; | |
328 | var zip_data = {}; | |
329 | ||
330 | var html_ids = []; | |
331 | var html_data = {}; | |
332 | ||
333 | file_data.itemid = folder_data.itemid = zip_data.itemid = options.itemid; | |
334 | file_data.client_id = folder_data.client_id = zip_data.client_id = this.client_id; | |
335 | ||
336 | var foldername_ids = []; | |
906e7d89 | 337 | this.filemanager.removeClass('fm-updating').removeClass('fm-noitems'); |
840912d5 | 338 | if (!list || list.length == 0) { |
906e7d89 | 339 | this.filemanager.addClass('fm-noitems'); |
56a7bf68 | 340 | return; |
56a7bf68 | 341 | } |
56a7bf68 | 342 | |
840912d5 DC |
343 | var count = 0; |
344 | for(var i in list) { | |
345 | count++; | |
346 | // the li html element | |
4c508047 | 347 | var htmlid = 'fileitem-'+this.client_id+'-'+count; |
840912d5 | 348 | // link to file |
4c508047 | 349 | var fileid = 'filename-'+this.client_id+'-'+count; |
840912d5 | 350 | // file menu |
4c508047 | 351 | var action = 'action-' +this.client_id+'-'+count; |
840912d5 | 352 | |
906e7d89 | 353 | var html = M.form_filemanager.templates.onefile; |
840912d5 DC |
354 | |
355 | html_ids.push('#'+htmlid); | |
356 | html_data[htmlid] = action; | |
357 | ||
358 | list[i].htmlid = htmlid; | |
359 | list[i].fileid = fileid; | |
360 | list[i].action = action; | |
361 | ||
362 | var url = "###"; | |
840912d5 DC |
363 | |
364 | switch (list[i].type) { | |
365 | case 'folder': | |
366 | // click folder name | |
367 | foldername_ids.push('#'+fileid); | |
368 | // click folder menu | |
369 | folder_ids.push('#'+action); | |
370 | folder_data[action] = list[i]; | |
371 | folder_data[fileid] = list[i]; | |
372 | break; | |
373 | case 'file': | |
374 | file_ids.push('#'+action); | |
1249f770 DC |
375 | // click file name |
376 | file_ids.push('#'+fileid); | |
840912d5 | 377 | file_data[action] = list[i]; |
1249f770 | 378 | file_data[fileid] = list[i]; |
840912d5 DC |
379 | if (list[i].url) { |
380 | url = list[i].url; | |
381 | } | |
382 | break; | |
383 | case 'zip': | |
384 | zip_ids.push('#'+action); | |
1249f770 | 385 | zip_ids.push('#'+fileid); |
840912d5 | 386 | zip_data[action] = list[i]; |
1249f770 | 387 | zip_data[fileid] = list[i]; |
840912d5 DC |
388 | if (list[i].url) { |
389 | url = list[i].url; | |
390 | } | |
391 | break; | |
392 | } | |
393 | var fullname = list[i].fullname; | |
56a7bf68 | 394 | |
f79321f1 | 395 | if (list[i].sortorder == 1) { |
1230b9c9 | 396 | html = html.replace('___fullname___', '<strong><a title="'+fullname+'" href="'+url+'" id="'+fileid+'"><img src="'+list[i].icon+'" /> ' + fullname + '</a></strong>'); |
ac9c14dd | 397 | } else { |
1230b9c9 | 398 | html = html.replace('___fullname___', '<a title="'+fullname+'" href="'+url+'" id="'+fileid+'"><img src="'+list[i].icon+'" /> ' + fullname + '</a>'); |
ac9c14dd | 399 | } |
713e08cf | 400 | html = html.replace('___action___', '<span class="fm-menuicon" id="'+action+'"><img alt="â–¶" src="'+M.util.image_url('i/menu')+'" /></span>'); |
840912d5 DC |
401 | html = '<li id="'+htmlid+'">'+html+'</li>'; |
402 | listhtml += html; | |
403 | } | |
906e7d89 | 404 | this.filemanager.one('.fm-filelist').set('innerHTML', listhtml); |
840912d5 DC |
405 | |
406 | // click normal file menu | |
1249f770 DC |
407 | Y.on('click', this.create_filemenu, file_ids, this, file_data); |
408 | Y.on('contextmenu', this.create_filemenu, file_ids, this, file_data); | |
840912d5 DC |
409 | // click folder menu |
410 | Y.on('click', this.create_foldermenu, folder_ids, this, folder_data); | |
1249f770 DC |
411 | Y.on('contextmenu', this.create_foldermenu, folder_ids, this, folder_data); |
412 | Y.on('contextmenu', this.create_foldermenu, foldername_ids, this, folder_data); | |
840912d5 | 413 | // click archievs menu |
1249f770 DC |
414 | Y.on('click', this.create_zipmenu, zip_ids, this, zip_data); |
415 | Y.on('contextmenu', this.create_zipmenu, zip_ids, this, zip_data); | |
840912d5 DC |
416 | // click folder name |
417 | Y.on('click', this.enter_folder, foldername_ids, this, folder_data); | |
418 | }, | |
419 | enter_folder: function(e, data) { | |
420 | var node = e.currentTarget; | |
421 | var file = data[node.get('id')]; | |
906e7d89 | 422 | e.preventDefault(); |
840912d5 DC |
423 | this.refresh(file.filepath); |
424 | }, | |
425 | create_filemenu: function(e, data) { | |
d3067516 | 426 | e.preventDefault(); |
f45dfeeb | 427 | var options = this.options; |
840912d5 DC |
428 | var node = e.currentTarget; |
429 | var file = data[node.get('id')]; | |
ac9c14dd | 430 | var scope = this; |
840912d5 DC |
431 | |
432 | var menuitems = [ | |
f0a163ed | 433 | {text: M.str.moodle.download, onclick:{fn:open_file_in_new_window, obj:file, scope:this}} |
840912d5 | 434 | ]; |
f45dfeeb DC |
435 | function setmainfile(type, ev, obj) { |
436 | var file = obj[node.get('id')]; | |
f79321f1 DC |
437 | //Y.one(mainid).set('value', file.filepath+file.filename); |
438 | var params = {}; | |
439 | params['filepath'] = file.filepath; | |
440 | params['filename'] = file.filename; | |
441 | this.request({ | |
442 | action: 'setmainfile', | |
443 | scope: scope, | |
444 | params: params, | |
445 | callback: function(id, obj, args) { | |
446 | scope.refresh(scope.currentpath); | |
447 | } | |
448 | }); | |
f45dfeeb | 449 | } |
f0a163ed ARN |
450 | function open_file_in_new_window(type, ev, obj) { |
451 | // We open in a new window rather than changing the current windows URL as we don't | |
452 | // want to navigate away from the page | |
453 | window.open(obj.url, 'fm-download-file'); | |
454 | } | |
f79321f1 | 455 | if (this.enablemainfile && (file.sortorder != 1)) { |
ac9c14dd | 456 | var mainid = '#id_'+this.enablemainfile; |
f45dfeeb DC |
457 | var menu = {text: M.str.repository.setmainfile, onclick:{fn: setmainfile, obj:data, scope:this}}; |
458 | menuitems.push(menu); | |
459 | } | |
840912d5 DC |
460 | this.create_menu(e, 'filemenu', menuitems, file, data); |
461 | }, | |
462 | create_foldermenu: function(e, data) { | |
d3067516 | 463 | e.preventDefault(); |
840912d5 DC |
464 | var scope = this; |
465 | var node = e.currentTarget; | |
466 | var fileinfo = data[node.get('id')]; | |
467 | // an extra menu item for folder to zip it | |
468 | function archive_folder(type,ev,obj) { | |
469 | var params = {}; | |
470 | params['filepath'] = fileinfo.filepath; | |
471 | params['filename'] = '.'; | |
472 | this.request({ | |
473 | action: 'zip', | |
474 | scope: scope, | |
475 | params: params, | |
476 | callback: function(id, obj, args) { | |
477 | scope.refresh(obj.filepath); | |
56a7bf68 | 478 | } |
840912d5 | 479 | }); |
56a7bf68 | 480 | } |
840912d5 | 481 | var menuitems = [ |
2b728cb5 | 482 | {text: M.str.editor.zip, onclick: {fn: archive_folder, obj: data, scope: this}}, |
840912d5 DC |
483 | ]; |
484 | this.create_menu(e, 'foldermenu', menuitems, fileinfo, data); | |
485 | }, | |
486 | create_zipmenu: function(e, data) { | |
d3067516 | 487 | e.preventDefault(); |
840912d5 DC |
488 | var scope = this; |
489 | var node = e.currentTarget; | |
490 | var fileinfo = data[node.get('id')]; | |
491 | ||
492 | function unzip(type, ev, obj) { | |
493 | var params = {}; | |
494 | params['filepath'] = fileinfo.filepath; | |
495 | params['filename'] = fileinfo.fullname; | |
496 | this.request({ | |
497 | action: 'unzip', | |
498 | scope: scope, | |
499 | params: params, | |
500 | callback: function(id, obj, args) { | |
501 | scope.refresh(obj.filepath); | |
502 | } | |
503 | }); | |
56a7bf68 | 504 | } |
840912d5 | 505 | var menuitems = [ |
2b728cb5 PS |
506 | {text: M.str.moodle.download, url:fileinfo.url}, |
507 | {text: M.str.moodle.unzip, onclick: {fn: unzip, obj: data, scope: this}} | |
840912d5 | 508 | ]; |
1a79133b DC |
509 | function setmainfile(type, ev, obj) { |
510 | var file = obj[node.get('id')]; | |
511 | //Y.one(mainid).set('value', file.filepath+file.filename); | |
512 | var params = {}; | |
513 | params['filepath'] = file.filepath; | |
514 | params['filename'] = file.filename; | |
515 | this.request({ | |
516 | action: 'setmainfile', | |
517 | scope: scope, | |
518 | params: params, | |
519 | callback: function(id, obj, args) { | |
520 | scope.refresh(scope.currentpath); | |
521 | } | |
522 | }); | |
523 | } | |
524 | if (this.enablemainfile && (fileinfo.sortorder != 1)) { | |
525 | var mainid = '#id_'+this.enablemainfile; | |
526 | var menu = {text: M.str.repository.setmainfile, onclick:{fn: setmainfile, obj:data, scope:this}}; | |
527 | menuitems.push(menu); | |
528 | } | |
840912d5 DC |
529 | this.create_menu(e, 'zipmenu', menuitems, fileinfo, data); |
530 | }, | |
531 | create_menu: function(ev, menuid, menuitems, fileinfo, options) { | |
532 | var position = [ev.pageX, ev.pageY]; | |
533 | var scope = this; | |
534 | function remove(type, ev, obj) { | |
535 | var dialog_options = {}; | |
536 | var params = {}; | |
2b728cb5 | 537 | dialog_options.message = M.str.repository.confirmdeletefile; |
840912d5 DC |
538 | dialog_options.scope = this; |
539 | var filename = ''; | |
540 | var filepath = ''; | |
541 | if (fileinfo.type == 'folder') { | |
542 | params.filename = '.'; | |
9a6606b8 | 543 | params.filepath = fileinfo.filepath; |
840912d5 DC |
544 | } else { |
545 | params.filename = fileinfo.fullname; | |
546 | } | |
20fb563e PS |
547 | dialog_options.callbackargs = [params]; |
548 | dialog_options.callback = function(params) { | |
840912d5 DC |
549 | this.request({ |
550 | action: 'delete', | |
20fb563e | 551 | scope: this, |
840912d5 DC |
552 | params: params, |
553 | callback: function(id, obj, args) { | |
554cd8fc | 554 | scope.filecount--; |
840912d5 | 555 | scope.refresh(obj.filepath); |
a5dd1f4f SH |
556 | if (typeof M.core_formchangechecker != 'undefined') { |
557 | M.core_formchangechecker.set_form_changed(); | |
558 | } | |
56a7bf68 | 559 | } |
840912d5 | 560 | }); |
d3067516 | 561 | }; |
20fb563e | 562 | M.util.show_confirm_dialog(ev, dialog_options); |
56a7bf68 | 563 | } |
840912d5 DC |
564 | function rename (type, ev, obj) { |
565 | var scope = this; | |
566 | var perform = function(e) { | |
567 | var newfilename = Y.one('#fm-rename-input').get('value'); | |
568 | if (!newfilename) { | |
569 | return; | |
570 | } | |
56a7bf68 | 571 | |
840912d5 DC |
572 | var action = ''; |
573 | var params = {}; | |
574 | if (fileinfo.type == 'folder') { | |
575 | params['filepath'] = fileinfo.filepath; | |
576 | params['filename'] = '.'; | |
54da2ec7 | 577 | params['newdirname'] = newfilename; |
840912d5 DC |
578 | action = 'renamedir'; |
579 | } else { | |
580 | params['filepath'] = fileinfo.filepath; | |
581 | params['filename'] = fileinfo.fullname; | |
54da2ec7 | 582 | params['newfilename'] = newfilename; |
840912d5 DC |
583 | action = 'rename'; |
584 | } | |
840912d5 DC |
585 | scope.request({ |
586 | action: action, | |
587 | scope: scope, | |
588 | params: params, | |
589 | callback: function(id, obj, args) { | |
f392caba DC |
590 | if (obj == false) { |
591 | alert(M.str.repository.fileexists); | |
592 | } else { | |
593 | scope.refresh(obj.filepath); | |
a5dd1f4f SH |
594 | if (typeof M.core_formchangechecker != 'undefined') { |
595 | M.core_formchangechecker.set_form_changed(); | |
596 | } | |
f392caba | 597 | } |
840912d5 DC |
598 | Y.one('#fm-rename-input').set('value', ''); |
599 | scope.rename_dialog.hide(); | |
600 | } | |
601 | }); | |
d3067516 | 602 | }; |
56a7bf68 | 603 | |
840912d5 DC |
604 | var dialog = Y.one('#fm-rename-dlg'); |
605 | if (!dialog) { | |
2b728cb5 | 606 | dialog = Y.Node.create('<div id="fm-rename-dlg"><div class="hd">'+M.str.repository.enternewname+'</div><div class="bd"><input type="text" id="fm-rename-input" /></div></div>'); |
840912d5 DC |
607 | Y.one(document.body).appendChild(dialog); |
608 | this.rename_dialog = new YAHOO.widget.Dialog("fm-rename-dlg", { | |
609 | width: "300px", | |
610 | fixedcenter: true, | |
611 | visible: true, | |
612 | constraintoviewport : true | |
613 | }); | |
56a7bf68 | 614 | |
840912d5 | 615 | } |
2b728cb5 PS |
616 | var buttons = [ { text:M.str.moodle.rename, handler:perform, isDefault:true}, |
617 | { text:M.str.moodle.cancel, handler:function(){this.cancel();}}]; | |
840912d5 DC |
618 | |
619 | this.rename_dialog.cfg.queueProperty('buttons', buttons); | |
620 | this.rename_dialog.render(); | |
621 | this.rename_dialog.show(); | |
622 | //var k1 = new YAHOO.util.KeyListener(scope, {keys:13}, {fn:function(){perform();}, correctScope: true}); | |
623 | //k1.enable(); | |
624 | Y.one('#fm-rename-input').set('value', fileinfo.fullname); | |
56a7bf68 | 625 | } |
840912d5 DC |
626 | function move(type, ev, obj) { |
627 | var scope = this; | |
628 | var itemid = this.options.itemid; | |
629 | // setup move file dialog | |
630 | var dialog = null; | |
631 | if (!Y.one('#fm-move-dlg')) { | |
632 | dialog = Y.Node.create('<div id="fm-move-dlg"></div>'); | |
633 | Y.one(document.body).appendChild(dialog); | |
634 | } else { | |
635 | dialog = Y.one('#fm-move-dlg'); | |
636 | } | |
56a7bf68 | 637 | |
6d30723e | 638 | dialog.set('innerHTML', '<div class="hd">'+M.str.repository.moving+'</div><div class="bd"><div id="fm-move-div">'+M.str.repository.nopathselected+'</div><div id="fm-tree"></div></div>'); |
56a7bf68 | 639 | |
840912d5 DC |
640 | this.movefile_dialog = new YAHOO.widget.Dialog("fm-move-dlg", { |
641 | width : "600px", | |
642 | fixedcenter : true, | |
643 | visible : false, | |
644 | constraintoviewport : true | |
645 | }); | |
494bf5c8 | 646 | |
840912d5 | 647 | var treeview = new YAHOO.widget.TreeView("fm-tree"); |
494bf5c8 | 648 | |
59eeb81b | 649 | var dialog = this.movefile_dialog; |
840912d5 DC |
650 | function _move(e) { |
651 | if (!treeview.targetpath) { | |
652 | return; | |
653 | } | |
654 | var params = {}; | |
655 | if (fileinfo.type == 'folder') { | |
840912d5 | 656 | action = 'movedir'; |
840912d5 DC |
657 | } else { |
658 | action = 'movefile'; | |
659 | } | |
660 | params['filepath'] = fileinfo.filepath; | |
661 | params['filename'] = fileinfo.fullname; | |
662 | params['newfilepath'] = treeview.targetpath; | |
663 | scope.request({ | |
664 | action: action, | |
665 | scope: scope, | |
666 | params: params, | |
667 | callback: function(id, obj, args) { | |
668 | var p = '/'; | |
669 | if (obj) { | |
59eeb81b | 670 | p = obj.filepath; |
840912d5 | 671 | } |
59eeb81b DC |
672 | dialog.cancel(); |
673 | scope.refresh(p); | |
a5dd1f4f SH |
674 | if (typeof M.core_formchangechecker != 'undefined') { |
675 | M.core_formchangechecker.set_form_changed(); | |
676 | } | |
840912d5 DC |
677 | } |
678 | }); | |
56a7bf68 | 679 | } |
56a7bf68 | 680 | |
2b728cb5 PS |
681 | var buttons = [ { text:M.str.moodle.move, handler:_move, isDefault:true }, |
682 | { text:M.str.moodle.cancel, handler:function(){this.cancel();}}]; | |
840912d5 DC |
683 | |
684 | this.movefile_dialog.cfg.queueProperty("buttons", buttons); | |
685 | this.movefile_dialog.render(); | |
686 | ||
687 | treeview.subscribe("dblClickEvent", function(e) { | |
688 | // update destidatoin folder | |
689 | this.targetpath = e.node.data.path; | |
690 | var title = Y.one('#fm-move-div'); | |
691 | title.set('innerHTML', '<strong>"' + this.targetpath + '"</strong> has been selected.'); | |
692 | }); | |
693 | ||
694 | function loadDataForNode(node, onCompleteCallback) { | |
695 | var params = {}; | |
696 | params['filepath'] = node.data.path; | |
697 | var obj = { | |
698 | action: 'dir', | |
699 | scope: scope, | |
700 | params: params, | |
701 | callback: function(id, obj, args) { | |
702 | data = obj.children; | |
703 | if (data.length == 0) { | |
704 | // so it is empty | |
705 | } else { | |
706 | for (var i in data) { | |
707 | var textnode = {label: data[i].fullname, path: data[i].filepath, itemid: this.itemid}; | |
708 | var tmpNode = new YAHOO.widget.TextNode(textnode, node, false); | |
709 | } | |
710 | } | |
711 | this.oncomplete(); | |
712 | } | |
713 | }; | |
714 | obj.oncomplete = onCompleteCallback; | |
715 | scope.request(obj); | |
716 | } | |
56a7bf68 | 717 | |
840912d5 DC |
718 | this.movefile_dialog.subscribe('show', function(){ |
719 | var rootNode = treeview.getRoot(); | |
720 | treeview.setDynamicLoad(loadDataForNode); | |
721 | treeview.removeChildren(rootNode); | |
6d30723e | 722 | var textnode = {label: M.str.moodle.files, path: '/'}; |
840912d5 DC |
723 | var tmpNode = new YAHOO.widget.TextNode(textnode, rootNode, true); |
724 | treeview.draw(); | |
725 | }, this, true); | |
56a7bf68 | 726 | |
840912d5 DC |
727 | this.movefile_dialog.show(); |
728 | } | |
54da2ec7 PS |
729 | var shared_items = [ |
730 | {text: M.str.moodle.rename+'...', onclick: {fn: rename, obj: options, scope: this}}, | |
731 | {text: M.str.moodle.move+'...', onclick: {fn: move, obj: options, scope: this}} | |
732 | ]; | |
59eeb81b DC |
733 | // delete is reserve word in Javascript |
734 | shared_items.push({text: M.str.moodle['delete']+'...', onclick: {fn: remove, obj: options, scope: this}}); | |
840912d5 DC |
735 | var menu = new YAHOO.widget.Menu(menuid, {xy:position, clicktohide:true}); |
736 | menu.clearContent(); | |
737 | menu.addItems(menuitems); | |
738 | menu.addItems(shared_items); | |
739 | menu.render(document.body); | |
740 | menu.subscribe('hide', function(){ | |
741 | this.fireEvent('destroy'); | |
742 | }); | |
743 | menu.show(); | |
744 | } | |
745 | }); | |
4c508047 PS |
746 | |
747 | // finally init everything needed | |
906e7d89 MG |
748 | // hide loading picture, display filemanager interface |
749 | var filemanager = Y.one('#filemanager-'+options.client_id); | |
750 | filemanager.removeClass('fm-loading').addClass('fm-loaded'); | |
4c508047 | 751 | |
f08fac7c DS |
752 | var manager = new FileManagerHelper(options); |
753 | var dndoptions = { | |
754 | filemanager: manager, | |
755 | acceptedtypes: options.accepted_types, | |
756 | clientid: options.client_id, | |
757 | maxfiles: options.maxfiles, | |
758 | maxbytes: options.maxbytes, | |
759 | itemid: options.itemid, | |
760 | repositories: manager.filepicker_options.repositories, | |
906e7d89 | 761 | containerid: manager.dndcontainer.get('id') |
f08fac7c DS |
762 | }; |
763 | M.form_dndupload.init(Y, dndoptions); | |
4c508047 | 764 | }; |