123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589 |
- /** This file is part of KCFinder project
- *
- * @desc Context menus
- * @package KCFinder
- * @version 3.12
- * @author Pavel Tzonkov <sunhater@sunhater.com>
- * @copyright 2010-2014 KCFinder Project
- * @license http://opensource.org/licenses/GPL-3.0 GPLv3
- * @license http://opensource.org/licenses/LGPL-3.0 LGPLv3
- * @link http://kcfinder.sunhater.com
- */
- _.menu = {
- init: function() {
- $('#menu').html("<ul></ul>").css('display', 'none');
- },
- addItem: function(href, label, callback, denied) {
- if (typeof denied == "undefined")
- denied = false;
- $('#menu ul').append('<li><a href="' + href + '"' + (denied ? ' class="denied"' : "") + '><span>' + label + '</span></a></li>');
- if (!denied && $.isFunction(callback))
- $('#menu a[href="' + href + '"]').click(function() {
- _.menu.hide();
- return callback();
- });
- },
- addDivider: function() {
- if ($('#menu ul').html().length)
- $('#menu ul').append("<li>-</li>");
- },
- show: function(e) {
- var dlg = $('#menu'),
- ul = $('#menu ul');
- if (ul.html().length) {
- dlg.find('ul').first().menu();
- if (typeof e != "undefined") {
- var left = e.pageX,
- top = e.pageY,
- win = $(window);
- if ((dlg.outerWidth() + left) > win.width())
- left = win.width() - dlg.outerWidth();
- if ((dlg.outerHeight() + top) > win.height())
- top = win.height() - dlg.outerHeight();
- dlg.hide().css({
- left: left,
- top: top,
- width: ""
- }).fadeIn('fast');
- } else
- dlg.fadeIn('fast');
- } else
- ul.detach();
- },
- hide: function() {
- $('#clipboard').removeClass('selected');
- $('div.folder > a > span.folder').removeClass('context');
- $('#menu').hide().css('width', "").html("").data('title', null).unbind().click(function() {
- return false;
- });
- $(document).unbind('keydown').keydown(function(e) {
- return !_.selectAll(e);
- });
- }
- };
- // FILE CONTEXT MENU
- _.menuFile = function(file, e) {
- _.menu.init();
- var data = file.data(),
- files = $('.file.selected').get();
- // MULTIPLE FILES MENU
- if (file.hasClass('selected') && files.length && (files.length > 1)) {
- var thumb = false,
- notWritable = 0,
- cdata;
- $.each(files, function(i, cfile) {
- cdata = $(cfile).data();
- if (cdata.thumb) thumb = true;
- if (!data.writable) notWritable++;
- });
- if (_.opener.callBackMultiple) {
- // SELECT FILES
- _.menu.addItem("kcact:pick", _.label("Select"), function() {
- _.returnFiles(files);
- return false;
- });
- // SELECT THUMBNAILS
- if (thumb)
- _.menu.addItem("kcact:pick_thumb", _.label("Select Thumbnails"), function() {
- _.returnThumbnails(files);
- return false;
- });
- }
- if (data.thumb || data.smallThumb || _.support.zip) {
- _.menu.addDivider();
- // VIEW IMAGE
- if (data.thumb || data.smallThumb)
- _.menu.addItem("kcact:view", _.label("View"), function() {
- _.viewImage(data);
- });
- // DOWNLOAD
- if (_.support.zip)
- _.menu.addItem("kcact:download", _.label("Download"), function() {
- var pfiles = [];
- $.each(files, function(i, cfile) {
- pfiles[i] = $(cfile).data('name');
- });
- _.post(_.getURL('downloadSelected'), {dir:_.dir, files:pfiles});
- return false;
- });
- }
- // ADD TO CLIPBOARD
- if (_.access.files.copy || _.access.files.move) {
- _.menu.addDivider();
- _.menu.addItem("kcact:clpbrdadd", _.label("Add to Clipboard"), function() {
- var msg = '';
- $.each(files, function(i, cfile) {
- var cdata = $(cfile).data(),
- failed = false;
- for (i = 0; i < _.clipboard.length; i++)
- if ((_.clipboard[i].name == cdata.name) &&
- (_.clipboard[i].dir == _.dir)
- ) {
- failed = true;
- msg += cdata.name + ": " + _.label("This file is already added to the Clipboard.") + "\n";
- break;
- }
- if (!failed) {
- cdata.dir = _.dir;
- _.clipboard[_.clipboard.length] = cdata;
- }
- });
- _.initClipboard();
- if (msg.length) _.alert(msg.substr(0, msg.length - 1));
- return false;
- });
- }
- // DELETE
- if (_.access.files['delete']) {
- _.menu.addDivider();
- _.menu.addItem("kcact:rm", _.label("Delete"), function() {
- if ($(this).hasClass('denied')) return false;
- var failed = 0,
- dfiles = [];
- $.each(files, function(i, cfile) {
- var cdata = $(cfile).data();
- if (!cdata.writable)
- failed++;
- else
- dfiles[dfiles.length] = _.dir + "/" + cdata.name;
- });
- if (failed == files.length) {
- _.alert(_.label("The selected files are not removable."));
- return false;
- }
- var go = function(callBack) {
- _.fadeFiles();
- $.ajax({
- type: "post",
- dataType: "json",
- url: _.getURL("rm_cbd"),
- data: {files:dfiles},
- async: false,
- success: function(data) {
- if (callBack) callBack();
- _.check4errors(data);
- _.refresh();
- },
- error: function() {
- if (callBack) callBack();
- $('#files > div').css({
- opacity: "",
- filter: ""
- });
- _.alert(_.label("Unknown error."));
- }
- });
- };
- if (failed)
- _.confirm(
- _.label("{count} selected files are not removable. Do you want to delete the rest?", {count:failed}),
- go
- );
- else
- _.confirm(
- _.label("Are you sure you want to delete all selected files?"),
- go
- );
- return false;
- }, (notWritable == files.length));
- }
- _.menu.show(e);
- // SINGLE FILE MENU
- } else {
- $('.file').removeClass('selected');
- file.addClass('selected');
- $('#fileinfo').html($.$.htmlData(data.name) + " (" + _.humanSize(data.size) + ", " + data.date + ")");
- if (_.opener.callBack || _.opener.callBackMultiple) {
- // SELECT FILE
- _.menu.addItem("kcact:pick", _.label("Select"), function() {
- _.returnFile(file);
- return false;
- });
- // SELECT THUMBNAIL
- if (data.thumb)
- _.menu.addItem("kcact:pick_thumb", _.label("Select Thumbnail"), function() {
- _.returnFile(_.thumbsURL + "/" + _.dir + "/" + data.name);
- return false;
- });
- _.menu.addDivider();
- }
- // VIEW IMAGE
- if (data.thumb || data.smallThumb)
- _.menu.addItem("kcact:view", _.label("View"), function() {
- _.viewImage(data);
- });
- // DOWNLOAD
- _.menu.addItem("kcact:download", _.label("Download"), function() {
- $('#menu').html('<form id="downloadForm" method="post" action="' + _.getURL('download') + '"><input type="hidden" name="dir" /><input type="hidden" name="file" /></form>');
- $('#downloadForm input').get(0).value = _.dir;
- $('#downloadForm input').get(1).value = data.name;
- $('#downloadForm').submit();
- return false;
- });
- // ADD TO CLIPBOARD
- if (_.access.files.copy || _.access.files.move) {
- _.menu.addDivider();
- _.menu.addItem("kcact:clpbrdadd", _.label("Add to Clipboard"), function() {
- for (i = 0; i < _.clipboard.length; i++)
- if ((_.clipboard[i].name == data.name) &&
- (_.clipboard[i].dir == _.dir)
- ) {
- _.alert(_.label("This file is already added to the Clipboard."));
- return false;
- }
- var cdata = data;
- cdata.dir = _.dir;
- _.clipboard[_.clipboard.length] = cdata;
- _.initClipboard();
- return false;
- });
- }
- if (_.access.files.rename || _.access.files['delete'])
- _.menu.addDivider();
- // RENAME
- if (_.access.files.rename)
- _.menu.addItem("kcact:mv", _.label("Rename..."), function() {
- if (!data.writable) return false;
- _.fileNameDialog(
- {dir: _.dir, file: data.name},
- 'newName', data.name, _.getURL("rename"), {
- title: "New file name:",
- errEmpty: "Please enter new file name.",
- errSlash: "Unallowable characters in file name.",
- errDot: "File name shouldn't begins with '.'"
- },
- _.refresh
- );
- return false;
- }, !data.writable);
- // DELETE
- if (_.access.files['delete'])
- _.menu.addItem("kcact:rm", _.label("Delete"), function() {
- if (!data.writable) return false;
- _.confirm(_.label("Are you sure you want to delete this file?"),
- function(callBack) {
- $.ajax({
- type: "post",
- dataType: "json",
- url: _.getURL("delete"),
- data: {dir: _.dir, file: data.name},
- async: false,
- success: function(data) {
- if (callBack) callBack();
- _.clearClipboard();
- if (_.check4errors(data))
- return;
- _.refresh();
- },
- error: function() {
- if (callBack) callBack();
- _.alert(_.label("Unknown error."));
- }
- });
- }
- );
- return false;
- }, !data.writable);
- _.menu.show(e);
- }
- };
- // FOLDER CONTEXT MENU
- _.menuDir = function(dir, e) {
- _.menu.init();
- var data = dir.data(),
- html = '<ul>';
- if (_.clipboard && _.clipboard.length) {
- // COPY CLIPBOARD
- if (_.access.files.copy)
- _.menu.addItem("kcact:cpcbd", _.label("Copy {count} files", {count: _.clipboard.length}), function() {
- _.copyClipboard(data.path);
- return false;
- }, !data.writable);
- // MOVE CLIPBOARD
- if (_.access.files.move)
- _.menu.addItem("kcact:mvcbd", _.label("Move {count} files", {count: _.clipboard.length}), function() {
- _.moveClipboard(data.path);
- return false;
- }, !data.writable);
- if (_.access.files.copy || _.access.files.move)
- _.menu.addDivider();
- }
- // REFRESH
- _.menu.addItem("kcact:refresh", _.label("Refresh"), function() {
- _.refreshDir(dir);
- return false;
- });
- // DOWNLOAD
- if (_.support.zip) {
- _.menu.addDivider();
- _.menu.addItem("kcact:download", _.label("Download"), function() {
- _.post(_.getURL("downloadDir"), {dir:data.path});
- return false;
- });
- }
- if (_.access.dirs.create || _.access.dirs.rename || _.access.dirs['delete'])
- _.menu.addDivider();
- // NEW SUBFOLDER
- if (_.access.dirs.create)
- _.menu.addItem("kcact:mkdir", _.label("New Subfolder..."), function(e) {
- if (!data.writable) return false;
- _.fileNameDialog(
- {dir: data.path},
- "newDir", "", _.getURL("newDir"), {
- title: "New folder name:",
- errEmpty: "Please enter new folder name.",
- errSlash: "Unallowable characters in folder name.",
- errDot: "Folder name shouldn't begins with '.'"
- }, function() {
- _.refreshDir(dir);
- _.initDropUpload();
- if (!data.hasDirs) {
- dir.data('hasDirs', true);
- dir.children('span.brace').addClass('closed');
- }
- }
- );
- return false;
- }, !data.writable);
- // RENAME
- if (_.access.dirs.rename)
- _.menu.addItem("kcact:mvdir", _.label("Rename..."), function(e) {
- if (!data.removable) return false;
- _.fileNameDialog(
- {dir: data.path},
- "newName", data.name, _.getURL("renameDir"), {
- title: "New folder name:",
- errEmpty: "Please enter new folder name.",
- errSlash: "Unallowable characters in folder name.",
- errDot: "Folder name shouldn't begins with '.'"
- }, function(dt) {
- if (!dt.name) {
- _.alert(_.label("Unknown error."));
- return;
- }
- var currentDir = (data.path == _.dir);
- dir.children('span.folder').html($.$.htmlData(dt.name));
- dir.data('name', dt.name);
- dir.data('path', $.$.dirname(data.path) + '/' + dt.name);
- if (currentDir)
- _.dir = dir.data('path');
- _.initDropUpload();
- },
- true
- );
- return false;
- }, !data.removable);
- // DELETE
- if (_.access.dirs['delete'])
- _.menu.addItem("kcact:rmdir", _.label("Delete"), function() {
- if (!data.removable) return false;
- _.confirm(
- _.label("Are you sure you want to delete this folder and all its content?"),
- function(callBack) {
- $.ajax({
- type: "post",
- dataType: "json",
- url: _.getURL("deleteDir"),
- data: {dir: data.path},
- async: false,
- success: function(data) {
- if (callBack) callBack();
- if (_.check4errors(data))
- return;
- dir.parent().hide(500, function() {
- var folders = dir.parent().parent();
- var pDir = folders.parent().children('a').first();
- dir.parent().detach();
- if (!folders.children('div.folder').get(0)) {
- pDir.children('span.brace').first().removeClass('opened closed');
- pDir.parent().children('.folders').detach();
- pDir.data('hasDirs', false);
- }
- if (pDir.data('path') == _.dir.substr(0, pDir.data('path').length))
- _.changeDir(pDir);
- _.initDropUpload();
- });
- },
- error: function() {
- if (callBack) callBack();
- _.alert(_.label("Unknown error."));
- }
- });
- }
- );
- return false;
- }, !data.removable);
- _.menu.show(e);
- $('div.folder > a > span.folder').removeClass('context');
- if (dir.children('span.folder').hasClass('regular'))
- dir.children('span.folder').addClass('context');
- };
- // CLIPBOARD MENU
- _.openClipboard = function() {
- if (!_.clipboard || !_.clipboard.length) return;
- // CLOSE MENU
- if ($('#menu a[href="kcact:clrcbd"]').html()) {
- $('#clipboard').removeClass('selected');
- _.menu.hide();
- return;
- }
- setTimeout(function() {
- _.menu.init();
- var dlg = $('#menu'),
- jStatus = $('#status'),
- html = '<li class="list"><div>';
- // CLIPBOARD FILES
- $.each(_.clipboard, function(i, val) {
- var icon = $.$.getFileExtension(val.name);
- if (val.thumb)
- icon = ".image";
- else if (!val.smallIcon || !icon.length)
- icon = ".";
- icon = "themes/" + _.theme + "/img/files/small/" + icon + ".png";
- html += '<a title="' + _.label("Click to remove from the Clipboard") + '" onclick="_.removeFromClipboard(' + i + ')"' + ((i == 0) ? ' class="first"' : "") + '><span style="background-image:url(' + $.$.escapeDirs(icon) + ')">' + $.$.htmlData($.$.basename(val.name)) + '</span></a>';
- });
- html += '</div></li><li class="div-files">-</li>';
- $('#menu ul').append(html);
- // DOWNLOAD
- if (_.support.zip)
- _.menu.addItem("kcact:download", _.label("Download files"), function() {
- _.downloadClipboard();
- return false;
- });
- if (_.access.files.copy || _.access.files.move || _.access.files['delete'])
- _.menu.addDivider();
- // COPY
- if (_.access.files.copy)
- _.menu.addItem("kcact:cpcbd", _.label("Copy files here"), function() {
- if (!_.dirWritable) return false;
- _.copyClipboard(_.dir);
- return false;
- }, !_.dirWritable);
- // MOVE
- if (_.access.files.move)
- _.menu.addItem("kcact:mvcbd", _.label("Move files here"), function() {
- if (!_.dirWritable) return false;
- _.moveClipboard(_.dir);
- return false;
- }, !_.dirWritable);
- // DELETE
- if (_.access.files['delete'])
- _.menu.addItem("kcact:rmcbd", _.label("Delete files"), function() {
- _.confirm(
- _.label("Are you sure you want to delete all files in the Clipboard?"),
- function(callBack) {
- if (callBack) callBack();
- _.deleteClipboard();
- }
- );
- return false;
- });
- _.menu.addDivider();
- // CLEAR CLIPBOARD
- _.menu.addItem("kcact:clrcbd", _.label("Clear the Clipboard"), function() {
- _.clearClipboard();
- return false;
- });
- $('#clipboard').addClass('selected');
- _.menu.show();
- var left = $(window).width() - dlg.css({width: ""}).outerWidth(),
- top = $(window).height() - dlg.outerHeight() - jStatus.outerHeight(),
- lheight = top + dlg.outerTopSpace();
- dlg.find('.list').css({
- 'max-height': lheight,
- 'overflow-y': "auto",
- 'overflow-x': "hidden",
- width: ""
- });
- top = $(window).height() - dlg.outerHeight(true) - jStatus.outerHeight(true);
- dlg.css({
- left: left - 5,
- top: top
- }).fadeIn("fast");
- var a = dlg.find('.list').outerHeight(),
- b = dlg.find('.list div').outerHeight();
- if (b - a > 10) {
- dlg.css({
- left: parseInt(dlg.css('left')) - _.scrollbarWidth,
- }).width(dlg.width() + _.scrollbarWidth);
- }
- }, 1);
- };
|