diff --git a/CHANGELOG b/CHANGELOG index e4dde0c..0590fcd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +0.6.0 Fix draging selection + Improve keyboard navigation + Add selection by space + Renaming with clicking on name of the file/directory + Fix rectangle selection when icons don't take all space of the container 0.5.2-4 Fix selection class when click on widget 0.5.1 fix rectangle selection when parent of the widget is scrolled down 0.5.0 dragging selection, rectangle selection diff --git a/Makefile b/Makefile index 1895442..da270f1 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=0.5.4 +VERSION=0.6.0 COMPRESS=uglifyjs SED=sed CP=cp diff --git a/Makefile.in b/Makefile.in index 8b16c2d..d59beba 100644 --- a/Makefile.in +++ b/Makefile.in @@ -6,7 +6,6 @@ RM=rm CAT=cat DATE=`date -uR` - ALL: Makefile .$(VERSION) js/jquery.filebrowser-$(VERSION).js js/jquery.filebrowser.js js/jquery.filebrowser-$(VERSION).min.js js/jquery.filebrowser.min.js css/jquery.filebrowser-$(VERSION).css css/jquery.filebrowser-$(VERSION).min.css css/jquery.filebrowser.min.css css/jquery.filebrowser.css README.md bower.json package.json .$(VERSION): Makefile diff --git a/README.md b/README.md index c59fb46..7b4555b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# jQuery File Browser version 0.5.4 +# jQuery File Browser version 0.6.0 jQuery File Browser is a plugin for creating OS like file browsers. diff --git a/bower.json b/bower.json index fe51996..6c95890 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "jquery.filebrowser", - "version": "0.5.4", + "version": "0.6.0", "main": [ "js/jquery.filebrowser.js", "css/jquery.filebrowser.css" diff --git a/css/jquery.filebrowser-0.5.4.min.css b/css/jquery.filebrowser-0.5.4.min.css deleted file mode 100644 index daa0840..0000000 --- a/css/jquery.filebrowser-0.5.4.min.css +++ /dev/null @@ -1 +0,0 @@ -.browser-widget.hidden,.browser-widget .hidden{visibility:hidden}.browser-widget ul{list-style:none;margin:0;padding:0}.browser-widget li[draggable]{-khtml-user-drag:element;-webkit-user-drag:element}.browser-widget li{display:inline-block;position:relative;box-sizing:border-box;padding-top:32px;text-align:center;margin:5px;word-break:break-word;vertical-align:top;width:40px}.browser-widget li,.browser-widget.no-select *{-khtml-user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.browser-widget{font-family:sans-serif;font-size:12px}.browser-widget .toolbar{background:#6b6b6b;background:-moz-linear-gradient(top,#6b6b6b 0,#262626 100%);background:-webkit-linear-gradient(top,#6b6b6b 0,#262626 100%);background:linear-gradient(to bottom,#6b6b6b 0,#262626 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b6b6b',endColorstr='#262626',GradientType=0);color:white}.browser-widget .toolbar:not(.labels) li{text-indent:-99999px}.browser-widget li:before,.browser-widget .adress-bar button{background:transparent url(icons.svg) no-repeat}.browser-widget .adress-bar button{text-indent:-99999px;width:32px;height:32px;border:0;background-position:-64px -128px;cursor:pointer;outline:0}.browser-widget .adress-bar input{width:calc(100% - 32px - 10px);border:0;padding:4px 2px;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.browser-widget .content{overflow:auto;height:calc(100% - 88px);position:relative}.browser-widget .content .selection{border:1px dotted #000;position:absolute}.browser-widget .content li.selected::after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;z-index:-1;background:#0b93d5}.browser-widget li::before{display:inline-block;width:32px;height:32px;text-align:center;background-clip:content-box;content:"";position:absolute;top:0;margin:auto;left:0;right:0}.browser-widget .toolbar li:not(.disabled):hover::before{background-color:#0b93d5;cursor:pointer}.browser-widget .toolbar:not(.labels) li{padding-top:20px}.browser-widget li.back::before{background-position:0 -160px}.browser-widget li.up::before{background-position:-32px -160px}.browser-widget li.refresh::before{background-position:-96px -160px}.browser-widget .drive::before{background-position:0 -128px}.browser-widget .file::before{background-position:0 -96px}.browser-widget .svg::before{background-position:-64px 0}.browser-widget .txt::before{background-position:-32px -64px}.browser-widget .pdf::before{background-position:-96px -64px}.browser-widget .php::before{background-position:-32px -32px}.browser-widget .html::before{background-position:-64px -32px}.browser-widget .js::before{background-position:-96px 0}.browser-widget .json::before{background-position:-96px -32px}.browser-widget .css::before{background-position:0 -32px}.browser-widget .doc::before,.browser-widget .docx::before{background-position:-64px -64px}.browser-widget .xls::before,.browser-widget .xlsx::before{background-position:-32px -96px}.browser-widget .ppt::before,.browser-widget .pptx::before{background-position:-64px -96px}.browser-widget .jpg::before,.browser-widget .jpeg::before,.browser-widget .gif::before,.browser-widget .bmp::before,.browser-widget .png::before{background-position:0 -64px} \ No newline at end of file diff --git a/css/jquery.filebrowser-0.5.4.css b/css/jquery.filebrowser-0.6.0.css similarity index 88% rename from css/jquery.filebrowser-0.5.4.css rename to css/jquery.filebrowser-0.6.0.css index b6a1821..bf4d991 100644 --- a/css/jquery.filebrowser-0.5.4.css +++ b/css/jquery.filebrowser-0.6.0.css @@ -1,11 +1,11 @@ /**@license * - * jQuery File Browser - directory browser jQuery plugin version 0.5.4 + * jQuery File Browser - directory browser jQuery plugin version 0.6.0 * * Copyright (c) 2016 Jakub Jankiewicz * Released under the MIT license * - * Date: Sun, 18 Dec 2016 19:31:34 +0000 + * Date: Tue, 20 Dec 2016 21:25:33 +0000 */ .browser-widget.hidden, .browser-widget .hidden { visibility: hidden; @@ -49,11 +49,12 @@ background: linear-gradient(to bottom, #6b6b6b 0%,#262626 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6b6b6b', endColorstr='#262626',GradientType=0 ); color: white; + } -.browser-widget .toolbar:not(.labels) li{ +.browser-widget .toolbar ul:not(.labels) li { text-indent: -99999px; } -.browser-widget li:before, .browser-widget .adress-bar button { +.browser-widget li::before, .browser-widget .adress-bar button { background: transparent url(icons.svg) no-repeat; } .browser-widget .adress-bar button { @@ -93,6 +94,22 @@ z-index: -1; background: #0b93d5; } +.browser-widget .content li { + border: 1px solid transparent; +} +.browser-widget .content li span { + cursor: text; +} +.browser-widget .content li textarea { + width: 100%; + resize: vertical; +} +.browser-widget .content li.rename span { + display: none; +} +.browser-widget .content li.active { + border: 1px dotted gray; +} .browser-widget li::before { display: inline-block; width: 32px; @@ -110,7 +127,7 @@ background-color: #0b93d5; cursor: pointer; } -.browser-widget .toolbar:not(.labels) li { +.browser-widget .toolbar ul:not(.labels) li { padding-top: 20px; } .browser-widget li.back::before { diff --git a/css/jquery.filebrowser-0.6.0.min.css b/css/jquery.filebrowser-0.6.0.min.css new file mode 100644 index 0000000..d826670 --- /dev/null +++ b/css/jquery.filebrowser-0.6.0.min.css @@ -0,0 +1 @@ +.browser-widget.hidden,.browser-widget .hidden{visibility:hidden}.browser-widget ul{list-style:none;margin:0;padding:0}.browser-widget li[draggable]{-khtml-user-drag:element;-webkit-user-drag:element}.browser-widget li{display:inline-block;position:relative;box-sizing:border-box;padding-top:32px;text-align:center;margin:5px;word-break:break-word;vertical-align:top;width:40px}.browser-widget li,.browser-widget.no-select *{-khtml-user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.browser-widget{font-family:sans-serif;font-size:12px}.browser-widget .toolbar{background:#6b6b6b;background:-moz-linear-gradient(top,#6b6b6b 0,#262626 100%);background:-webkit-linear-gradient(top,#6b6b6b 0,#262626 100%);background:linear-gradient(to bottom,#6b6b6b 0,#262626 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b6b6b',endColorstr='#262626',GradientType=0);color:white}.browser-widget .toolbar ul:not(.labels) li{text-indent:-99999px}.browser-widget li::before,.browser-widget .adress-bar button{background:transparent url(icons.svg) no-repeat}.browser-widget .adress-bar button{text-indent:-99999px;width:32px;height:32px;border:0;background-position:-64px -128px;cursor:pointer;outline:0}.browser-widget .adress-bar input{width:calc(100% - 32px - 10px);border:0;padding:4px 2px;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.browser-widget .content{overflow:auto;height:calc(100% - 88px);position:relative}.browser-widget .content .selection{border:1px dotted #000;position:absolute}.browser-widget .content li.selected::after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;z-index:-1;background:#0b93d5}.browser-widget .content li{border:1px solid transparent}.browser-widget .content li span{cursor:text}.browser-widget .content li textarea{width:100%;resize:vertical}.browser-widget .content li.rename span{display:none}.browser-widget .content li.active{border:1px dotted gray}.browser-widget li::before{display:inline-block;width:32px;height:32px;text-align:center;background-clip:content-box;content:"";position:absolute;top:0;margin:auto;left:0;right:0}.browser-widget .toolbar li:not(.disabled):hover::before{background-color:#0b93d5;cursor:pointer}.browser-widget .toolbar ul:not(.labels) li{padding-top:20px}.browser-widget li.back::before{background-position:0 -160px}.browser-widget li.up::before{background-position:-32px -160px}.browser-widget li.refresh::before{background-position:-96px -160px}.browser-widget .drive::before{background-position:0 -128px}.browser-widget .file::before{background-position:0 -96px}.browser-widget .svg::before{background-position:-64px 0}.browser-widget .txt::before{background-position:-32px -64px}.browser-widget .pdf::before{background-position:-96px -64px}.browser-widget .php::before{background-position:-32px -32px}.browser-widget .html::before{background-position:-64px -32px}.browser-widget .js::before{background-position:-96px 0}.browser-widget .json::before{background-position:-96px -32px}.browser-widget .css::before{background-position:0 -32px}.browser-widget .doc::before,.browser-widget .docx::before{background-position:-64px -64px}.browser-widget .xls::before,.browser-widget .xlsx::before{background-position:-32px -96px}.browser-widget .ppt::before,.browser-widget .pptx::before{background-position:-64px -96px}.browser-widget .jpg::before,.browser-widget .jpeg::before,.browser-widget .gif::before,.browser-widget .bmp::before,.browser-widget .png::before{background-position:0 -64px} \ No newline at end of file diff --git a/css/jquery.filebrowser-src.css b/css/jquery.filebrowser-src.css index 10912b9..f438f0e 100644 --- a/css/jquery.filebrowser-src.css +++ b/css/jquery.filebrowser-src.css @@ -49,11 +49,12 @@ background: linear-gradient(to bottom, #6b6b6b 0%,#262626 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6b6b6b', endColorstr='#262626',GradientType=0 ); color: white; + } -.browser-widget .toolbar:not(.labels) li{ +.browser-widget .toolbar ul:not(.labels) li { text-indent: -99999px; } -.browser-widget li:before, .browser-widget .adress-bar button { +.browser-widget li::before, .browser-widget .adress-bar button { background: transparent url(icons.svg) no-repeat; } .browser-widget .adress-bar button { @@ -93,6 +94,22 @@ z-index: -1; background: #0b93d5; } +.browser-widget .content li { + border: 1px solid transparent; +} +.browser-widget .content li span { + cursor: text; +} +.browser-widget .content li textarea { + width: 100%; + resize: vertical; +} +.browser-widget .content li.rename span { + display: none; +} +.browser-widget .content li.active { + border: 1px dotted gray; +} .browser-widget li::before { display: inline-block; width: 32px; @@ -110,7 +127,7 @@ background-color: #0b93d5; cursor: pointer; } -.browser-widget .toolbar:not(.labels) li { +.browser-widget .toolbar ul:not(.labels) li { padding-top: 20px; } .browser-widget li.back::before { diff --git a/css/jquery.filebrowser.css b/css/jquery.filebrowser.css index b6a1821..bf4d991 100644 --- a/css/jquery.filebrowser.css +++ b/css/jquery.filebrowser.css @@ -1,11 +1,11 @@ /**@license * - * jQuery File Browser - directory browser jQuery plugin version 0.5.4 + * jQuery File Browser - directory browser jQuery plugin version 0.6.0 * * Copyright (c) 2016 Jakub Jankiewicz * Released under the MIT license * - * Date: Sun, 18 Dec 2016 19:31:34 +0000 + * Date: Tue, 20 Dec 2016 21:25:33 +0000 */ .browser-widget.hidden, .browser-widget .hidden { visibility: hidden; @@ -49,11 +49,12 @@ background: linear-gradient(to bottom, #6b6b6b 0%,#262626 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6b6b6b', endColorstr='#262626',GradientType=0 ); color: white; + } -.browser-widget .toolbar:not(.labels) li{ +.browser-widget .toolbar ul:not(.labels) li { text-indent: -99999px; } -.browser-widget li:before, .browser-widget .adress-bar button { +.browser-widget li::before, .browser-widget .adress-bar button { background: transparent url(icons.svg) no-repeat; } .browser-widget .adress-bar button { @@ -93,6 +94,22 @@ z-index: -1; background: #0b93d5; } +.browser-widget .content li { + border: 1px solid transparent; +} +.browser-widget .content li span { + cursor: text; +} +.browser-widget .content li textarea { + width: 100%; + resize: vertical; +} +.browser-widget .content li.rename span { + display: none; +} +.browser-widget .content li.active { + border: 1px dotted gray; +} .browser-widget li::before { display: inline-block; width: 32px; @@ -110,7 +127,7 @@ background-color: #0b93d5; cursor: pointer; } -.browser-widget .toolbar:not(.labels) li { +.browser-widget .toolbar ul:not(.labels) li { padding-top: 20px; } .browser-widget li.back::before { diff --git a/css/jquery.filebrowser.min.css b/css/jquery.filebrowser.min.css index daa0840..d826670 100644 --- a/css/jquery.filebrowser.min.css +++ b/css/jquery.filebrowser.min.css @@ -1 +1 @@ -.browser-widget.hidden,.browser-widget .hidden{visibility:hidden}.browser-widget ul{list-style:none;margin:0;padding:0}.browser-widget li[draggable]{-khtml-user-drag:element;-webkit-user-drag:element}.browser-widget li{display:inline-block;position:relative;box-sizing:border-box;padding-top:32px;text-align:center;margin:5px;word-break:break-word;vertical-align:top;width:40px}.browser-widget li,.browser-widget.no-select *{-khtml-user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.browser-widget{font-family:sans-serif;font-size:12px}.browser-widget .toolbar{background:#6b6b6b;background:-moz-linear-gradient(top,#6b6b6b 0,#262626 100%);background:-webkit-linear-gradient(top,#6b6b6b 0,#262626 100%);background:linear-gradient(to bottom,#6b6b6b 0,#262626 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b6b6b',endColorstr='#262626',GradientType=0);color:white}.browser-widget .toolbar:not(.labels) li{text-indent:-99999px}.browser-widget li:before,.browser-widget .adress-bar button{background:transparent url(icons.svg) no-repeat}.browser-widget .adress-bar button{text-indent:-99999px;width:32px;height:32px;border:0;background-position:-64px -128px;cursor:pointer;outline:0}.browser-widget .adress-bar input{width:calc(100% - 32px - 10px);border:0;padding:4px 2px;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.browser-widget .content{overflow:auto;height:calc(100% - 88px);position:relative}.browser-widget .content .selection{border:1px dotted #000;position:absolute}.browser-widget .content li.selected::after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;z-index:-1;background:#0b93d5}.browser-widget li::before{display:inline-block;width:32px;height:32px;text-align:center;background-clip:content-box;content:"";position:absolute;top:0;margin:auto;left:0;right:0}.browser-widget .toolbar li:not(.disabled):hover::before{background-color:#0b93d5;cursor:pointer}.browser-widget .toolbar:not(.labels) li{padding-top:20px}.browser-widget li.back::before{background-position:0 -160px}.browser-widget li.up::before{background-position:-32px -160px}.browser-widget li.refresh::before{background-position:-96px -160px}.browser-widget .drive::before{background-position:0 -128px}.browser-widget .file::before{background-position:0 -96px}.browser-widget .svg::before{background-position:-64px 0}.browser-widget .txt::before{background-position:-32px -64px}.browser-widget .pdf::before{background-position:-96px -64px}.browser-widget .php::before{background-position:-32px -32px}.browser-widget .html::before{background-position:-64px -32px}.browser-widget .js::before{background-position:-96px 0}.browser-widget .json::before{background-position:-96px -32px}.browser-widget .css::before{background-position:0 -32px}.browser-widget .doc::before,.browser-widget .docx::before{background-position:-64px -64px}.browser-widget .xls::before,.browser-widget .xlsx::before{background-position:-32px -96px}.browser-widget .ppt::before,.browser-widget .pptx::before{background-position:-64px -96px}.browser-widget .jpg::before,.browser-widget .jpeg::before,.browser-widget .gif::before,.browser-widget .bmp::before,.browser-widget .png::before{background-position:0 -64px} \ No newline at end of file +.browser-widget.hidden,.browser-widget .hidden{visibility:hidden}.browser-widget ul{list-style:none;margin:0;padding:0}.browser-widget li[draggable]{-khtml-user-drag:element;-webkit-user-drag:element}.browser-widget li{display:inline-block;position:relative;box-sizing:border-box;padding-top:32px;text-align:center;margin:5px;word-break:break-word;vertical-align:top;width:40px}.browser-widget li,.browser-widget.no-select *{-khtml-user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.browser-widget{font-family:sans-serif;font-size:12px}.browser-widget .toolbar{background:#6b6b6b;background:-moz-linear-gradient(top,#6b6b6b 0,#262626 100%);background:-webkit-linear-gradient(top,#6b6b6b 0,#262626 100%);background:linear-gradient(to bottom,#6b6b6b 0,#262626 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#6b6b6b',endColorstr='#262626',GradientType=0);color:white}.browser-widget .toolbar ul:not(.labels) li{text-indent:-99999px}.browser-widget li::before,.browser-widget .adress-bar button{background:transparent url(icons.svg) no-repeat}.browser-widget .adress-bar button{text-indent:-99999px;width:32px;height:32px;border:0;background-position:-64px -128px;cursor:pointer;outline:0}.browser-widget .adress-bar input{width:calc(100% - 32px - 10px);border:0;padding:4px 2px;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.browser-widget .content{overflow:auto;height:calc(100% - 88px);position:relative}.browser-widget .content .selection{border:1px dotted #000;position:absolute}.browser-widget .content li.selected::after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;z-index:-1;background:#0b93d5}.browser-widget .content li{border:1px solid transparent}.browser-widget .content li span{cursor:text}.browser-widget .content li textarea{width:100%;resize:vertical}.browser-widget .content li.rename span{display:none}.browser-widget .content li.active{border:1px dotted gray}.browser-widget li::before{display:inline-block;width:32px;height:32px;text-align:center;background-clip:content-box;content:"";position:absolute;top:0;margin:auto;left:0;right:0}.browser-widget .toolbar li:not(.disabled):hover::before{background-color:#0b93d5;cursor:pointer}.browser-widget .toolbar ul:not(.labels) li{padding-top:20px}.browser-widget li.back::before{background-position:0 -160px}.browser-widget li.up::before{background-position:-32px -160px}.browser-widget li.refresh::before{background-position:-96px -160px}.browser-widget .drive::before{background-position:0 -128px}.browser-widget .file::before{background-position:0 -96px}.browser-widget .svg::before{background-position:-64px 0}.browser-widget .txt::before{background-position:-32px -64px}.browser-widget .pdf::before{background-position:-96px -64px}.browser-widget .php::before{background-position:-32px -32px}.browser-widget .html::before{background-position:-64px -32px}.browser-widget .js::before{background-position:-96px 0}.browser-widget .json::before{background-position:-96px -32px}.browser-widget .css::before{background-position:0 -32px}.browser-widget .doc::before,.browser-widget .docx::before{background-position:-64px -64px}.browser-widget .xls::before,.browser-widget .xlsx::before{background-position:-32px -96px}.browser-widget .ppt::before,.browser-widget .pptx::before{background-position:-64px -96px}.browser-widget .jpg::before,.browser-widget .jpeg::before,.browser-widget .gif::before,.browser-widget .bmp::before,.browser-widget .png::before{background-position:0 -64px} \ No newline at end of file diff --git a/examples/two_instances.html b/examples/two_instances.html index 1b5ea53..f1a9829 100644 --- a/examples/two_instances.html +++ b/examples/two_instances.html @@ -56,7 +56,6 @@ browser.walk(src, function(part, last) { var src = file[part]; if (last) { - name = part; if (remove) { delete file[part]; } @@ -67,6 +66,8 @@ browser.walk(dest, function(part, last) { if (!last) { current = current[part]; + } else { + name = part; } }); current[name] = file; diff --git a/js/jquery.filebrowser-0.5.4.min.js b/js/jquery.filebrowser-0.5.4.min.js deleted file mode 100644 index 76bc387..0000000 --- a/js/jquery.filebrowser-0.5.4.min.js +++ /dev/null @@ -1,10 +0,0 @@ -/**@license - * - * jQuery File Browser - directory browser jQuery plugin version 0.5.4 - * - * Copyright (c) 2016 Jakub Jankiewicz - * Released under the MIT license - * - * Date: Sun, 18 Dec 2016 19:31:33 +0000 - */ -(function(e,t){"use strict";e.browse={defaults:{dir:function(){return{files:[],dirs:[]}},root:"/",separator:"/",labels:true,change:e.noop,init:e.noop,item_class:e.noop,open:e.noop,rename:e.noop,copy:e.noop,name:"default",error:e.noop,refresh_timer:100},strings:{toolbar:{back:"back",up:"up",refresh:"refresh"}},escape_regex:function(e){if(typeof e=="string"){var t=/([-\\\^$\[\]()+{}?*.|])/g;return e.replace(t,"\\$1")}}};var r;var n;var a={};var s;function o(e){return function(t){return e==t}}function i(t,r){return t===r||r.match(new RegExp("^"+e.browse.escape_regex(t)))}function l(t,r){var n=e(r);return n.parents().add("html,body").map(function(){return e(this)[t]()}).get().reduce(function(e,t){return e+t})}e.fn.browse=function(t){var c=e.extend({},e.browse.defaults,t);function f(t){if(Y){var r=j.offset();M=t.clientX-r.left;R=t.clientY-r.top;K.show();h();$=true;var n=_.find("li");if(!t.ctrlKey){n.removeClass("selected");a[c.name]=[]}var s=K[0].getBoundingClientRect();var o=n.filter(function(){var e=this.getBoundingClientRect();return e.top+e.height>s.top&&e.left+e.width>s.left&&e.bottom-e.heighto){a=o}if(s>i){s=i}K.css({left:r,top:n+t,width:a-r,height:s-n})}function u(e){if(m.hasClass("selected")){if(e.ctrlKey){if(e.which==67){m.copy()}else if(e.which==88){m.cut()}else if(e.which==86){m.paste(n)}}else if(e.which==8){m.back()}else{var t=_.find(".selected");if(e.which==13&&t.length){t.dblclick()}else{if(e.which>=37&&e.which<=40){var r;var s=_.find("li");if(!t.length){t=_.find("li:eq(0)");r=0}else{t.removeClass("selected");var o=_.prop("clientWidth");var i=s.length;var l=_.find("li:eq(0)").outerWidth(true);var f=Math.floor(o/l);r=t.index();if(e.which==37){r--}else if(e.which==38){r=r-f}else if(e.which==39){r++}else if(e.which==40){r=r+f}if(r<0){r=0}else if(r>i-1){r=i-1}}if(e.which>=37&&e.which<=40){var d=s.eq(r).addClass("selected");var h=m.join(w,d.text());if(d.length){a[c.name]=[h]}else{a[c.name]=[]}}}}}}}function p(t){if(!e(t.target).closest("."+v).length){e(".browser-widget").removeClass("selected")}}if(this.data("browse")){return this.data("browse")}else if(this.length>1){return this.each(function(){e.fn.browse.call(e(this),c)})}else{var v="browser-widget";a[c.name]=a[c.name]||[];var m=this;m.addClass(v+" hidden");var w;var g=[];var b;var C=e('
    ').appendTo(m);if(c.labels){C.addClass("labels")}var x=e('
    ').appendTo(C);e("").addClass("home").appendTo(x);var y=e("").appendTo(x);var k=e.browse.strings.toolbar;Object.keys(k).forEach(function(t){e("
  • ").text(k[t]).addClass(t).appendTo(C)});var _=e("
      ").wrap("
      ").parent().addClass("content").appendTo(m);var j=_.find("ul");var T=0,E=0,M=0,R=0;var K=e("
      ").addClass("selection").hide().appendTo(_);var Y=false;var $=false;C.on("click.browse","li",function(){var t=e(this);if(!t.hasClass("disabled")){var r=t.text();m[r]()}}).on("click",".home",function(){if(w!=c.root){m.show(c.root)}}).on("keypress.browse","input",function(t){if(t.which==13){var r=e(this);var n=r.val();m.show(n)}});_.on("dblclick.browse","li",function(){var t=e(this);var r=m.join(w,t.text());if(t.hasClass("directory")){t.removeClass("selected");m.show(r)}else if(t.hasClass("file")){c.open(r)}}).on("click.browse","li",function(t){var r=e(this);if(!t.ctrlKey){r.siblings().removeClass("selected")}r.toggleClass("selected");var n=m.join(w,r.text());if(r.hasClass("selected")){if(!t.ctrlKey){a[c.name]=[]}a[c.name].push(n)}else if(t.ctrlKey){a[c.name]=a[c.name].filter(o(n))}else{a[c.name]=[]}});m.on("click.browse",function(t){e("."+v).removeClass("selected");m.addClass("selected");if(!$){var r=e(t.target);if(!t.ctrlKey&&!r.is(".content li")&&!r.closest(".toolbar").length){_.find("li").removeClass("selected");a[c.name]=[]}}});m.on("dragover.browse",".content",function(){return false}).on("dragstart",".content li",function(){var t=e(this);var r=t.text();s={name:r,path:w,context:m};if(t.hasClass("selected")){s.selection=true}});_.on("drop.browse",function(t){var r=e(t.target);var n;if(r.is(".directory")){n=m.join(w,r.text(),s.name)}else{n=m.join(w,s.name)}if(m.name()!==s.context.name()){throw new Error("You can't drag across different filesystems")}if(s.selection){a[c.name].forEach(function(e){if(!i(e,n)){m._rename(e,n)}});m.refresh();if(m!==s.context){s.context.refresh()}}else{var o=m.join(s.path,s.name);if(!i(o,n)){m._rename(o,n);m.refresh();if(m!==s.context){s.context.refresh()}}}return false});j.on("mousedown.browse",function(t){if(!e(t.target).is("li")){Y=true;$=false;m.addClass("no-select");var r=j.offset();T=t.clientX-r.left;E=t.clientY-r.top}});e(document).on("click",p).on("keydown",u).on("mousemove",f).on("mouseup",d);e.extend(m,{path:function(){return w},name:function(){return c.name},current:function(){return current},back:function(){g.pop();m.show(g[g.length-1],{push:false});return m},destroy:function(){m.off(".browse");e(document).off("click",p).off("keydown",u);x.remove();_.remove()},_rename:function(e,t){if(!i(e,t)){c.rename(e,t)}},_copy:function(e,t){c.copy(e,t)},copy:function(){r={path:w,contents:a[c.name],source:m};n=false},cut:function(){m.copy();n=true},paste:function(e){function t(e,t){r.contents.forEach(function(r){var n=e.split(r).pop();var a=e.join(w,n);if(!i(r,a)){e[t](r,a)}})}if(r&&r.contents&&r.contents.length){if(m.name()!==r.source.name()){throw new Error("You can't paste across different filesystems")}else{if(e){t(m,"_rename")}else{t(m,"_copy")}m.refresh();if(m!==r.source){r.source.refresh()}}}},up:function(){var e=m.split(w);e.pop();m.show(m.join.apply(m,e));return m},refresh:function(){_.addClass("hidden");var t=e.Deferred();var r=e.Deferred();if(c.refresh_timer){setTimeout(t.resolve.bind(t),c.refresh_timer)}else{t.resolve()}m.show(w,{force:true,push:false,callback:function(){r.resolve()}});e.when(t,r).then(function(){_.removeClass("hidden")})},show:function(t,r){var n={callback:e.noop,push:true,force:false};r=e.extend({},n,r);if(w!=t||r.force){m.addClass("hidden");if(r.push){g.push(t)}C.find(".up").toggleClass("disabled",t==c.root);C.find(".back").toggleClass("disabled",g.length==1);w=t;c.dir(w,function(n){if(!n){c.error("Invalid directory");m.removeClass("hidden")}else{b=n;m.addClass("hidden");j.empty();b.dirs.forEach(function(r){var n=c.item_class(t,r);var a=e('
    • '+r+"
    • ").appendTo(j).attr("draggable",true);if(n){a.addClass(n)}});b.files.forEach(function(r){var n=e('
    • '+r+"
    • ").appendTo(j).attr("draggable",true);if(r.match(".")){n.addClass(r.split(".").pop())}var a=c.item_class(t,r);if(a){n.addClass(a)}});m.removeClass("hidden");y.val(t);c.change.call(m);r.callback()}})}return m},join:function(){var t=[].slice.call(arguments);var r=t.map(function(t){var r=new RegExp(e.browse.escape_regex(c.separator)+"$","");return t.replace(r,"")}).filter(Boolean).join(c.separator);var n=new RegExp("^"+e.browse.escape_regex(c.root));return n.test(r)?r:c.root+r},split:function(t){var r=new RegExp("^"+e.browse.escape_regex(c.root));var n=new RegExp(e.browse.escape_regex(c.separator)+"$");t=t.replace(r,"").replace(n,"");if(t){return t.split(c.separator)}else{return[]}},walk:function(e,t){var r=this.split(e);var n;while(r.length){n=t(r.shift(),!r.length)}return n}});setTimeout(function(){var e=c.start_directory||c.root;m.show(e,{callback:c.init.bind(m)})},0);m.data("browse",m);return m}}})(jQuery); \ No newline at end of file diff --git a/js/jquery.filebrowser-0.5.4.js b/js/jquery.filebrowser-0.6.0.js similarity index 76% rename from js/jquery.filebrowser-0.5.4.js rename to js/jquery.filebrowser-0.6.0.js index 92924b7..3e94af8 100644 --- a/js/jquery.filebrowser-0.5.4.js +++ b/js/jquery.filebrowser-0.6.0.js @@ -1,11 +1,11 @@ /**@license * - * jQuery File Browser - directory browser jQuery plugin version 0.5.4 + * jQuery File Browser - directory browser jQuery plugin version 0.6.0 * * Copyright (c) 2016 Jakub Jankiewicz * Released under the MIT license * - * Date: Sun, 18 Dec 2016 19:31:33 +0000 + * Date: Tue, 20 Dec 2016 21:33:09 +0000 */ (function($, undefined) { 'use strict'; @@ -20,6 +20,7 @@ change: $.noop, init: $.noop, item_class: $.noop, + rename_delay: 300, open: $.noop, rename: $.noop, copy: $.noop, @@ -117,7 +118,9 @@ }); } function keydown(e) { - if (self.hasClass('selected')) { + if (self.hasClass('selected') && !rename) { + var current_item; + var $active = $content.find('.active'); if (e.ctrlKey) { if (e.which == 67) { // CTRL+C self.copy(); @@ -126,26 +129,33 @@ } else if (e.which == 86) { // CTRL+V self.paste(cut); } + } + if (e.which == 32) { // SPACE + var e = jQuery.Event("click"); + e.ctrlKey = true; + e.target = $active[0]; + $active.trigger(e); + return false; } else if (e.which == 8) { // BACKSPACE self.back(); } else { - var $selected = $content.find('.selected'); - if (e.which == 13 && $selected.length) { - $selected.dblclick(); + //var $selected = $content.find('.selected'); + if (e.which == 13 && $active.length) { + $active.dblclick(); } else { if (e.which >= 37 && e.which <= 40) { - var current_item; - var $li = $content.find('li'); - if (!$selected.length) { - $selected = $content.find('li:eq(0)'); - current_item = 0; + if (!e.ctrlKey) { + $content.find('li').removeClass('selected'); + } + if (!$active.length) { + $active = $content.find('li:eq(0)').addClass('active'); } else { - $selected.removeClass('selected'); + var $li = $content.find('li'); var browse_width = $content.prop('clientWidth'); var length = $li.length; var width = $content.find('li:eq(0)').outerWidth(true); var each_row = Math.floor(browse_width/width); - current_item = $selected.index(); + current_item = $active.index(); if (e.which == 37) { // LEFT current_item--; } else if (e.which == 38) { // UP @@ -160,15 +170,7 @@ } else if (current_item > length-1) { current_item = length-1; } - } - if (e.which >= 37 && e.which <= 40) { - var $new_selection = $li.eq(current_item).addClass('selected'); - var filename = self.join(path, $new_selection.text()); - if ($new_selection.length) { - selected[settings.name] = [filename]; - } else { - selected[settings.name] = []; - } + $li.eq(current_item).addClass('active').siblings().removeClass('active'); } } } @@ -180,6 +182,17 @@ $('.browser-widget').removeClass('selected'); } } + function rename_textarea() { + var $textarea = $(this); + var old_name = $textarea.parent().find('span').text(); + var new_name = $textarea.val(); + if (new_name != old_name) { + console.log(self.join(path, old_name), self.join(path, new_name)); + self._rename(self.join(path, old_name), + self.join(path, new_name)); + self.refresh(); + } + } if (this.data('browse')) { return this.data('browse'); } else if (this.length > 1) { @@ -194,16 +207,20 @@ var path; var paths = []; var current_content; - var $toolbar = $('
        ').appendTo(self); - if (settings.labels) { - $toolbar.addClass('labels'); - } + var click_time; + var rename = false; + var num_clicks = 0; + var $toolbar = $('
        ').appendTo(self); var $adress_bar = $('
        ').appendTo($toolbar); $('').addClass('home').appendTo($adress_bar); + var $tools = $('
          ').appendTo($toolbar); + if (settings.labels) { + $tools.addClass('labels'); + } var $adress = $('').appendTo($adress_bar); var toolbar = $.browse.strings.toolbar; Object.keys(toolbar).forEach(function(name) { - $('
        • ').text(toolbar[name]).addClass(name).appendTo($toolbar); + $('
        • ').text(toolbar[name]).addClass(name).appendTo($tools); }); var $content = $('
            ').wrap('
            ').parent().addClass('content').appendTo(self); var $ul = $content.find('ul'); @@ -228,9 +245,10 @@ self.show(path); } }); - $content.on('dblclick.browse', 'li', function() { + $content.on('dblclick.browse', 'li', function(e) { var $this = $(this); - var filename = self.join(path, $this.text()); + var name = $this.find('span').text(); + var filename = self.join(path, name); if ($this.hasClass('directory')) { $this.removeClass('selected'); self.show(filename); @@ -238,22 +256,55 @@ settings.open(filename); } }).on('click.browse', 'li', function(e) { - var $this = $(this); - if (!e.ctrlKey) { - $this.siblings().removeClass('selected'); - } - $this.toggleClass('selected'); - var filename = self.join(path, $this.text()); - if ($this.hasClass('selected')) { + console.log('click'); + if (!was_selecting) { + var $target = $(e.target); + var $this = $(this); + var name = $this.find('span').text(); + if (num_clicks++ % 2 === 0) { + click_time = (new Date()).getTime(); + } else { + var time = ((new Date()).getTime() - click_time); + if ($target.is('span') && time > settings.rename_delay) { + console.log($this); + $('').appendTo($this);//.focus().select(); + $this.addClass('rename'); + console.log($this.html()); + rename = true; + return false; + } + } if (!e.ctrlKey) { - selected[settings.name] = []; + $this.siblings().removeClass('selected'); } - selected[settings.name].push(filename); - } else if (e.ctrlKey) { - selected[settings.name] = selected[settings.name] - .filter(is(filename)); - } else { - selected[settings.name] = []; + if (!$target.is('textarea')) { + $content.find('.active').removeClass('active'); + $this.toggleClass('selected').addClass('active'); + var filename = self.join(path, name); + if ($this.hasClass('selected')) { + if (!e.ctrlKey) { + selected[settings.name] = []; + } + selected[settings.name].push(filename); + } else if (e.ctrlKey) { + selected[settings.name] = selected[settings.name] + .filter(is(filename)); + } else { + selected[settings.name] = []; + } + } + } + }).on('keypress', 'textarea', function(e) { + if (e.which == 13) { // ENTER + rename_textarea.call(this); + } else if (e.which == 27) { // ESC + var $this = $(this); + $this.parent().removeClass('rename'); + $this.remove(); + } + if ([13, 27].indexOf(e.which) != -1) { + rename = false; + return false; } }); self.on('click.browse', function(e) { @@ -266,6 +317,11 @@ $content.find('li').removeClass('selected'); selected[settings.name] = []; } + if (!$target.is('textarea')) { + $content.find('li.rename').removeClass('rename') + .find('textarea').each(rename_textarea).remove(); + rename = false; + } } }); self.on('dragover.browse', '.content', function() { @@ -284,17 +340,18 @@ }); $content.on('drop.browse', function(e) { var $target = $(e.target); - var dest; - if ($target.is('.directory')) { - dest = self.join(path, $target.text(), drag.name); - } else { - dest = self.join(path, drag.name); - } if (self.name() !== drag.context.name()) { throw new Error("You can't drag across different filesystems"); } + var new_path; + if ($target.is('.directory')) { + new_path = self.join(path, $target.text()); + } else { + new_path = path; + } if (drag.selection) { selected[settings.name].forEach(function(src) { + var dest = self.join(new_path, self.split(src).pop()); if (!same_root(src, dest)) { self._rename(src, dest); } @@ -304,6 +361,7 @@ drag.context.refresh(); } } else { + var dest = self.join(path, drag.name); var src = self.join(drag.path, drag.name); if (!same_root(src, dest)) { self._rename(src, dest); @@ -315,8 +373,9 @@ } return false; }); - $ul.on('mousedown.browse', function(e) { - if (!$(e.target).is('li')) { + $content.on('mousedown.browse', function(e) { + var $target = $(e.target); + if (!$target.is('li') && !$target.is('span')) { selection = true; was_selecting = false; self.addClass('no-select'); @@ -340,8 +399,10 @@ return current; }, back: function() { - paths.pop(); - self.show(paths[paths.length-1], {push: false}); + if (paths.length > 1) { + paths.pop(); + self.show(paths[paths.length-1], {push: false}); + } return self; }, destroy: function() { @@ -443,15 +504,14 @@ $ul.empty(); current_content.dirs.forEach(function(dir) { var cls = settings.item_class(new_path, dir); - var $li = $('
          • ' + dir + '
          • '). + var $li = $('
          • ' + dir + '
          • '). appendTo($ul).attr('draggable', true); if (cls) { $li.addClass(cls); } - }); current_content.files.forEach(function(file) { - var $li = $('
          • ' + file + '
          • '). + var $li = $('
          • ' + file + '
          • '). appendTo($ul).attr('draggable', true); if (file.match('.')) { $li.addClass(file.split('.').pop()); diff --git a/js/jquery.filebrowser-0.6.0.min.js b/js/jquery.filebrowser-0.6.0.min.js new file mode 100644 index 0000000..baa4536 --- /dev/null +++ b/js/jquery.filebrowser-0.6.0.min.js @@ -0,0 +1,10 @@ +/**@license + * + * jQuery File Browser - directory browser jQuery plugin version 0.6.0 + * + * Copyright (c) 2016 Jakub Jankiewicz + * Released under the MIT license + * + * Date: Tue, 20 Dec 2016 21:33:09 +0000 + */ +(function(e,t){"use strict";e.browse={defaults:{dir:function(){return{files:[],dirs:[]}},root:"/",separator:"/",labels:true,change:e.noop,init:e.noop,item_class:e.noop,rename_delay:300,open:e.noop,rename:e.noop,copy:e.noop,name:"default",error:e.noop,refresh_timer:100},strings:{toolbar:{back:"back",up:"up",refresh:"refresh"}},escape_regex:function(e){if(typeof e=="string"){var t=/([-\\\^$\[\]()+{}?*.|])/g;return e.replace(t,"\\$1")}}};var r;var a;var n={};var s;function i(e){return function(t){return e==t}}function o(t,r){return t===r||r.match(new RegExp("^"+e.browse.escape_regex(t)))}function l(t,r){var a=e(r);return a.parents().add("html,body").map(function(){return e(this)[t]()}).get().reduce(function(e,t){return e+t})}e.fn.browse=function(t){var c=e.extend({},e.browse.defaults,t);function f(t){if(W){var r=R.offset();$=t.clientX-r.left;q=t.clientY-r.top;B.show();h();O=true;var a=M.find("li");if(!t.ctrlKey){a.removeClass("selected");n[c.name]=[]}var s=B[0].getBoundingClientRect();var i=a.filter(function(){var e=this.getBoundingClientRect();return e.top+e.height>s.top&&e.left+e.width>s.left&&e.bottom-e.heighti){n=i}if(s>o){s=o}B.css({left:r,top:a+t,width:n-r,height:s-a})}function u(e){if(g.hasClass("selected")&&!y){var t;var r=M.find(".active");if(e.ctrlKey){if(e.which==67){g.copy()}else if(e.which==88){g.cut()}else if(e.which==86){g.paste(a)}}if(e.which==32){var e=jQuery.Event("click");e.ctrlKey=true;e.target=r[0];r.trigger(e);return false}else if(e.which==8){g.back()}else{if(e.which==13&&r.length){r.dblclick()}else{if(e.which>=37&&e.which<=40){if(!e.ctrlKey){M.find("li").removeClass("selected")}if(!r.length){r=M.find("li:eq(0)").addClass("active")}else{var n=M.find("li");var s=M.prop("clientWidth");var i=n.length;var o=M.find("li:eq(0)").outerWidth(true);var l=Math.floor(s/o);t=r.index();if(e.which==37){t--}else if(e.which==38){t=t-l}else if(e.which==39){t++}else if(e.which==40){t=t+l}if(t<0){t=0}else if(t>i-1){t=i-1}n.eq(t).addClass("active").siblings().removeClass("active")}}}}}}function v(t){if(!e(t.target).closest("."+m).length){e(".browser-widget").removeClass("selected")}}function p(){var t=e(this);var r=t.parent().find("span").text();var a=t.val();if(a!=r){console.log(g.join(w,r),g.join(w,a));g._rename(g.join(w,r),g.join(w,a));g.refresh()}}if(this.data("browse")){return this.data("browse")}else if(this.length>1){return this.each(function(){e.fn.browse.call(e(this),c)})}else{var m="browser-widget";n[c.name]=n[c.name]||[];var g=this;g.addClass(m+" hidden");var w;var b=[];var C;var x;var y=false;var k=0;var _=e('
            ').appendTo(g);var j=e('
            ').appendTo(_);e("").addClass("home").appendTo(j);var T=e("
              ").appendTo(_);if(c.labels){T.addClass("labels")}var E=e("").appendTo(j);var K=e.browse.strings.toolbar;Object.keys(K).forEach(function(t){e("
            • ").text(K[t]).addClass(t).appendTo(T)});var M=e("
                ").wrap("
                ").parent().addClass("content").appendTo(g);var R=M.find("ul");var D=0,Y=0,$=0,q=0;var B=e("
                ").addClass("selection").hide().appendTo(M);var W=false;var O=false;_.on("click.browse","li",function(){var t=e(this);if(!t.hasClass("disabled")){var r=t.text();g[r]()}}).on("click",".home",function(){if(w!=c.root){g.show(c.root)}}).on("keypress.browse","input",function(t){if(t.which==13){var r=e(this);var a=r.val();g.show(a)}});M.on("dblclick.browse","li",function(t){var r=e(this);var a=r.find("span").text();var n=g.join(w,a);if(r.hasClass("directory")){r.removeClass("selected");g.show(n)}else if(r.hasClass("file")){c.open(n)}}).on("click.browse","li",function(t){console.log("click");if(!O){var r=e(t.target);var a=e(this);var s=a.find("span").text();if(k++%2===0){x=(new Date).getTime()}else{var o=(new Date).getTime()-x;if(r.is("span")&&o>c.rename_delay){console.log(a);e("").appendTo(a);a.addClass("rename");console.log(a.html());y=true;return false}}if(!t.ctrlKey){a.siblings().removeClass("selected")}if(!r.is("textarea")){M.find(".active").removeClass("active");a.toggleClass("selected").addClass("active");var l=g.join(w,s);if(a.hasClass("selected")){if(!t.ctrlKey){n[c.name]=[]}n[c.name].push(l)}else if(t.ctrlKey){n[c.name]=n[c.name].filter(i(l))}else{n[c.name]=[]}}}}).on("keypress","textarea",function(t){if(t.which==13){p.call(this)}else if(t.which==27){var r=e(this);r.parent().removeClass("rename");r.remove()}if([13,27].indexOf(t.which)!=-1){y=false;return false}});g.on("click.browse",function(t){e("."+m).removeClass("selected");g.addClass("selected");if(!O){var r=e(t.target);if(!t.ctrlKey&&!r.is(".content li")&&!r.closest(".toolbar").length){M.find("li").removeClass("selected");n[c.name]=[]}if(!r.is("textarea")){M.find("li.rename").removeClass("rename").find("textarea").each(p).remove();y=false}}});g.on("dragover.browse",".content",function(){return false}).on("dragstart",".content li",function(){var t=e(this);var r=t.text();s={name:r,path:w,context:g};if(t.hasClass("selected")){s.selection=true}});M.on("drop.browse",function(t){var r=e(t.target);if(g.name()!==s.context.name()){throw new Error("You can't drag across different filesystems")}var a;if(r.is(".directory")){a=g.join(w,r.text())}else{a=w}if(s.selection){n[c.name].forEach(function(e){var t=g.join(a,g.split(e).pop());if(!o(e,t)){g._rename(e,t)}});g.refresh();if(g!==s.context){s.context.refresh()}}else{var i=g.join(w,s.name);var l=g.join(s.path,s.name);if(!o(l,i)){g._rename(l,i);g.refresh();if(g!==s.context){s.context.refresh()}}}return false});M.on("mousedown.browse",function(t){var r=e(t.target);if(!r.is("li")&&!r.is("span")){W=true;O=false;g.addClass("no-select");var a=R.offset();D=t.clientX-a.left;Y=t.clientY-a.top}});e(document).on("click",v).on("keydown",u).on("mousemove",f).on("mouseup",d);e.extend(g,{path:function(){return w},name:function(){return c.name},current:function(){return current},back:function(){if(b.length>1){b.pop();g.show(b[b.length-1],{push:false})}return g},destroy:function(){g.off(".browse");e(document).off("click",v).off("keydown",u);j.remove();M.remove()},_rename:function(e,t){if(!o(e,t)){c.rename(e,t)}},_copy:function(e,t){c.copy(e,t)},copy:function(){r={path:w,contents:n[c.name],source:g};a=false},cut:function(){g.copy();a=true},paste:function(e){function t(e,t){r.contents.forEach(function(r){var a=e.split(r).pop();var n=e.join(w,a);if(!o(r,n)){e[t](r,n)}})}if(r&&r.contents&&r.contents.length){if(g.name()!==r.source.name()){throw new Error("You can't paste across different filesystems")}else{if(e){t(g,"_rename")}else{t(g,"_copy")}g.refresh();if(g!==r.source){r.source.refresh()}}}},up:function(){var e=g.split(w);e.pop();g.show(g.join.apply(g,e));return g},refresh:function(){M.addClass("hidden");var t=e.Deferred();var r=e.Deferred();if(c.refresh_timer){setTimeout(t.resolve.bind(t),c.refresh_timer)}else{t.resolve()}g.show(w,{force:true,push:false,callback:function(){r.resolve()}});e.when(t,r).then(function(){M.removeClass("hidden")})},show:function(t,r){var a={callback:e.noop,push:true,force:false};r=e.extend({},a,r);if(w!=t||r.force){g.addClass("hidden");if(r.push){b.push(t)}_.find(".up").toggleClass("disabled",t==c.root);_.find(".back").toggleClass("disabled",b.length==1);w=t;c.dir(w,function(a){if(!a){c.error("Invalid directory");g.removeClass("hidden")}else{C=a;g.addClass("hidden");R.empty();C.dirs.forEach(function(r){var a=c.item_class(t,r);var n=e('
              • '+r+"
              • ").appendTo(R).attr("draggable",true);if(a){n.addClass(a)}});C.files.forEach(function(r){var a=e('
              • '+r+"
              • ").appendTo(R).attr("draggable",true);if(r.match(".")){a.addClass(r.split(".").pop())}var n=c.item_class(t,r);if(n){a.addClass(n)}});g.removeClass("hidden");E.val(t);c.change.call(g);r.callback()}})}return g},join:function(){var t=[].slice.call(arguments);var r=t.map(function(t){var r=new RegExp(e.browse.escape_regex(c.separator)+"$","");return t.replace(r,"")}).filter(Boolean).join(c.separator);var a=new RegExp("^"+e.browse.escape_regex(c.root));return a.test(r)?r:c.root+r},split:function(t){var r=new RegExp("^"+e.browse.escape_regex(c.root));var a=new RegExp(e.browse.escape_regex(c.separator)+"$");t=t.replace(r,"").replace(a,"");if(t){return t.split(c.separator)}else{return[]}},walk:function(e,t){var r=this.split(e);var a;while(r.length){a=t(r.shift(),!r.length)}return a}});setTimeout(function(){var e=c.start_directory||c.root;g.show(e,{callback:c.init.bind(g)})},0);g.data("browse",g);return g}}})(jQuery); \ No newline at end of file diff --git a/js/jquery.filebrowser-src.js b/js/jquery.filebrowser-src.js index 4da026f..cfee8f3 100644 --- a/js/jquery.filebrowser-src.js +++ b/js/jquery.filebrowser-src.js @@ -20,6 +20,7 @@ change: $.noop, init: $.noop, item_class: $.noop, + rename_delay: 300, open: $.noop, rename: $.noop, copy: $.noop, @@ -117,7 +118,9 @@ }); } function keydown(e) { - if (self.hasClass('selected')) { + if (self.hasClass('selected') && !rename) { + var current_item; + var $active = $content.find('.active'); if (e.ctrlKey) { if (e.which == 67) { // CTRL+C self.copy(); @@ -126,26 +129,33 @@ } else if (e.which == 86) { // CTRL+V self.paste(cut); } + } + if (e.which == 32) { // SPACE + var e = jQuery.Event("click"); + e.ctrlKey = true; + e.target = $active[0]; + $active.trigger(e); + return false; } else if (e.which == 8) { // BACKSPACE self.back(); } else { - var $selected = $content.find('.selected'); - if (e.which == 13 && $selected.length) { - $selected.dblclick(); + //var $selected = $content.find('.selected'); + if (e.which == 13 && $active.length) { + $active.dblclick(); } else { if (e.which >= 37 && e.which <= 40) { - var current_item; - var $li = $content.find('li'); - if (!$selected.length) { - $selected = $content.find('li:eq(0)'); - current_item = 0; + if (!e.ctrlKey) { + $content.find('li').removeClass('selected'); + } + if (!$active.length) { + $active = $content.find('li:eq(0)').addClass('active'); } else { - $selected.removeClass('selected'); + var $li = $content.find('li'); var browse_width = $content.prop('clientWidth'); var length = $li.length; var width = $content.find('li:eq(0)').outerWidth(true); var each_row = Math.floor(browse_width/width); - current_item = $selected.index(); + current_item = $active.index(); if (e.which == 37) { // LEFT current_item--; } else if (e.which == 38) { // UP @@ -160,15 +170,7 @@ } else if (current_item > length-1) { current_item = length-1; } - } - if (e.which >= 37 && e.which <= 40) { - var $new_selection = $li.eq(current_item).addClass('selected'); - var filename = self.join(path, $new_selection.text()); - if ($new_selection.length) { - selected[settings.name] = [filename]; - } else { - selected[settings.name] = []; - } + $li.eq(current_item).addClass('active').siblings().removeClass('active'); } } } @@ -180,6 +182,17 @@ $('.browser-widget').removeClass('selected'); } } + function rename_textarea() { + var $textarea = $(this); + var old_name = $textarea.parent().find('span').text(); + var new_name = $textarea.val(); + if (new_name != old_name) { + console.log(self.join(path, old_name), self.join(path, new_name)); + self._rename(self.join(path, old_name), + self.join(path, new_name)); + self.refresh(); + } + } if (this.data('browse')) { return this.data('browse'); } else if (this.length > 1) { @@ -194,16 +207,20 @@ var path; var paths = []; var current_content; - var $toolbar = $('
                  ').appendTo(self); - if (settings.labels) { - $toolbar.addClass('labels'); - } + var click_time; + var rename = false; + var num_clicks = 0; + var $toolbar = $('
                  ').appendTo(self); var $adress_bar = $('
                  ').appendTo($toolbar); $('').addClass('home').appendTo($adress_bar); + var $tools = $('
                    ').appendTo($toolbar); + if (settings.labels) { + $tools.addClass('labels'); + } var $adress = $('').appendTo($adress_bar); var toolbar = $.browse.strings.toolbar; Object.keys(toolbar).forEach(function(name) { - $('
                  • ').text(toolbar[name]).addClass(name).appendTo($toolbar); + $('
                  • ').text(toolbar[name]).addClass(name).appendTo($tools); }); var $content = $('
                      ').wrap('
                      ').parent().addClass('content').appendTo(self); var $ul = $content.find('ul'); @@ -228,9 +245,10 @@ self.show(path); } }); - $content.on('dblclick.browse', 'li', function() { + $content.on('dblclick.browse', 'li', function(e) { var $this = $(this); - var filename = self.join(path, $this.text()); + var name = $this.find('span').text(); + var filename = self.join(path, name); if ($this.hasClass('directory')) { $this.removeClass('selected'); self.show(filename); @@ -238,22 +256,55 @@ settings.open(filename); } }).on('click.browse', 'li', function(e) { - var $this = $(this); - if (!e.ctrlKey) { - $this.siblings().removeClass('selected'); - } - $this.toggleClass('selected'); - var filename = self.join(path, $this.text()); - if ($this.hasClass('selected')) { + console.log('click'); + if (!was_selecting) { + var $target = $(e.target); + var $this = $(this); + var name = $this.find('span').text(); + if (num_clicks++ % 2 === 0) { + click_time = (new Date()).getTime(); + } else { + var time = ((new Date()).getTime() - click_time); + if ($target.is('span') && time > settings.rename_delay) { + console.log($this); + $('').appendTo($this);//.focus().select(); + $this.addClass('rename'); + console.log($this.html()); + rename = true; + return false; + } + } if (!e.ctrlKey) { - selected[settings.name] = []; + $this.siblings().removeClass('selected'); } - selected[settings.name].push(filename); - } else if (e.ctrlKey) { - selected[settings.name] = selected[settings.name] - .filter(is(filename)); - } else { - selected[settings.name] = []; + if (!$target.is('textarea')) { + $content.find('.active').removeClass('active'); + $this.toggleClass('selected').addClass('active'); + var filename = self.join(path, name); + if ($this.hasClass('selected')) { + if (!e.ctrlKey) { + selected[settings.name] = []; + } + selected[settings.name].push(filename); + } else if (e.ctrlKey) { + selected[settings.name] = selected[settings.name] + .filter(is(filename)); + } else { + selected[settings.name] = []; + } + } + } + }).on('keypress', 'textarea', function(e) { + if (e.which == 13) { // ENTER + rename_textarea.call(this); + } else if (e.which == 27) { // ESC + var $this = $(this); + $this.parent().removeClass('rename'); + $this.remove(); + } + if ([13, 27].indexOf(e.which) != -1) { + rename = false; + return false; } }); self.on('click.browse', function(e) { @@ -266,6 +317,11 @@ $content.find('li').removeClass('selected'); selected[settings.name] = []; } + if (!$target.is('textarea')) { + $content.find('li.rename').removeClass('rename') + .find('textarea').each(rename_textarea).remove(); + rename = false; + } } }); self.on('dragover.browse', '.content', function() { @@ -284,17 +340,18 @@ }); $content.on('drop.browse', function(e) { var $target = $(e.target); - var dest; - if ($target.is('.directory')) { - dest = self.join(path, $target.text(), drag.name); - } else { - dest = self.join(path, drag.name); - } if (self.name() !== drag.context.name()) { throw new Error("You can't drag across different filesystems"); } + var new_path; + if ($target.is('.directory')) { + new_path = self.join(path, $target.text()); + } else { + new_path = path; + } if (drag.selection) { selected[settings.name].forEach(function(src) { + var dest = self.join(new_path, self.split(src).pop()); if (!same_root(src, dest)) { self._rename(src, dest); } @@ -304,6 +361,7 @@ drag.context.refresh(); } } else { + var dest = self.join(path, drag.name); var src = self.join(drag.path, drag.name); if (!same_root(src, dest)) { self._rename(src, dest); @@ -315,8 +373,9 @@ } return false; }); - $ul.on('mousedown.browse', function(e) { - if (!$(e.target).is('li')) { + $content.on('mousedown.browse', function(e) { + var $target = $(e.target); + if (!$target.is('li') && !$target.is('span')) { selection = true; was_selecting = false; self.addClass('no-select'); @@ -340,8 +399,10 @@ return current; }, back: function() { - paths.pop(); - self.show(paths[paths.length-1], {push: false}); + if (paths.length > 1) { + paths.pop(); + self.show(paths[paths.length-1], {push: false}); + } return self; }, destroy: function() { @@ -443,15 +504,14 @@ $ul.empty(); current_content.dirs.forEach(function(dir) { var cls = settings.item_class(new_path, dir); - var $li = $('
                    • ' + dir + '
                    • '). + var $li = $('
                    • ' + dir + '
                    • '). appendTo($ul).attr('draggable', true); if (cls) { $li.addClass(cls); } - }); current_content.files.forEach(function(file) { - var $li = $('
                    • ' + file + '
                    • '). + var $li = $('
                    • ' + file + '
                    • '). appendTo($ul).attr('draggable', true); if (file.match('.')) { $li.addClass(file.split('.').pop()); diff --git a/js/jquery.filebrowser.js b/js/jquery.filebrowser.js index 92924b7..3e94af8 100644 --- a/js/jquery.filebrowser.js +++ b/js/jquery.filebrowser.js @@ -1,11 +1,11 @@ /**@license * - * jQuery File Browser - directory browser jQuery plugin version 0.5.4 + * jQuery File Browser - directory browser jQuery plugin version 0.6.0 * * Copyright (c) 2016 Jakub Jankiewicz * Released under the MIT license * - * Date: Sun, 18 Dec 2016 19:31:33 +0000 + * Date: Tue, 20 Dec 2016 21:33:09 +0000 */ (function($, undefined) { 'use strict'; @@ -20,6 +20,7 @@ change: $.noop, init: $.noop, item_class: $.noop, + rename_delay: 300, open: $.noop, rename: $.noop, copy: $.noop, @@ -117,7 +118,9 @@ }); } function keydown(e) { - if (self.hasClass('selected')) { + if (self.hasClass('selected') && !rename) { + var current_item; + var $active = $content.find('.active'); if (e.ctrlKey) { if (e.which == 67) { // CTRL+C self.copy(); @@ -126,26 +129,33 @@ } else if (e.which == 86) { // CTRL+V self.paste(cut); } + } + if (e.which == 32) { // SPACE + var e = jQuery.Event("click"); + e.ctrlKey = true; + e.target = $active[0]; + $active.trigger(e); + return false; } else if (e.which == 8) { // BACKSPACE self.back(); } else { - var $selected = $content.find('.selected'); - if (e.which == 13 && $selected.length) { - $selected.dblclick(); + //var $selected = $content.find('.selected'); + if (e.which == 13 && $active.length) { + $active.dblclick(); } else { if (e.which >= 37 && e.which <= 40) { - var current_item; - var $li = $content.find('li'); - if (!$selected.length) { - $selected = $content.find('li:eq(0)'); - current_item = 0; + if (!e.ctrlKey) { + $content.find('li').removeClass('selected'); + } + if (!$active.length) { + $active = $content.find('li:eq(0)').addClass('active'); } else { - $selected.removeClass('selected'); + var $li = $content.find('li'); var browse_width = $content.prop('clientWidth'); var length = $li.length; var width = $content.find('li:eq(0)').outerWidth(true); var each_row = Math.floor(browse_width/width); - current_item = $selected.index(); + current_item = $active.index(); if (e.which == 37) { // LEFT current_item--; } else if (e.which == 38) { // UP @@ -160,15 +170,7 @@ } else if (current_item > length-1) { current_item = length-1; } - } - if (e.which >= 37 && e.which <= 40) { - var $new_selection = $li.eq(current_item).addClass('selected'); - var filename = self.join(path, $new_selection.text()); - if ($new_selection.length) { - selected[settings.name] = [filename]; - } else { - selected[settings.name] = []; - } + $li.eq(current_item).addClass('active').siblings().removeClass('active'); } } } @@ -180,6 +182,17 @@ $('.browser-widget').removeClass('selected'); } } + function rename_textarea() { + var $textarea = $(this); + var old_name = $textarea.parent().find('span').text(); + var new_name = $textarea.val(); + if (new_name != old_name) { + console.log(self.join(path, old_name), self.join(path, new_name)); + self._rename(self.join(path, old_name), + self.join(path, new_name)); + self.refresh(); + } + } if (this.data('browse')) { return this.data('browse'); } else if (this.length > 1) { @@ -194,16 +207,20 @@ var path; var paths = []; var current_content; - var $toolbar = $('
                        ').appendTo(self); - if (settings.labels) { - $toolbar.addClass('labels'); - } + var click_time; + var rename = false; + var num_clicks = 0; + var $toolbar = $('
                        ').appendTo(self); var $adress_bar = $('
                        ').appendTo($toolbar); $('').addClass('home').appendTo($adress_bar); + var $tools = $('
                          ').appendTo($toolbar); + if (settings.labels) { + $tools.addClass('labels'); + } var $adress = $('').appendTo($adress_bar); var toolbar = $.browse.strings.toolbar; Object.keys(toolbar).forEach(function(name) { - $('
                        • ').text(toolbar[name]).addClass(name).appendTo($toolbar); + $('
                        • ').text(toolbar[name]).addClass(name).appendTo($tools); }); var $content = $('
                            ').wrap('
                            ').parent().addClass('content').appendTo(self); var $ul = $content.find('ul'); @@ -228,9 +245,10 @@ self.show(path); } }); - $content.on('dblclick.browse', 'li', function() { + $content.on('dblclick.browse', 'li', function(e) { var $this = $(this); - var filename = self.join(path, $this.text()); + var name = $this.find('span').text(); + var filename = self.join(path, name); if ($this.hasClass('directory')) { $this.removeClass('selected'); self.show(filename); @@ -238,22 +256,55 @@ settings.open(filename); } }).on('click.browse', 'li', function(e) { - var $this = $(this); - if (!e.ctrlKey) { - $this.siblings().removeClass('selected'); - } - $this.toggleClass('selected'); - var filename = self.join(path, $this.text()); - if ($this.hasClass('selected')) { + console.log('click'); + if (!was_selecting) { + var $target = $(e.target); + var $this = $(this); + var name = $this.find('span').text(); + if (num_clicks++ % 2 === 0) { + click_time = (new Date()).getTime(); + } else { + var time = ((new Date()).getTime() - click_time); + if ($target.is('span') && time > settings.rename_delay) { + console.log($this); + $('').appendTo($this);//.focus().select(); + $this.addClass('rename'); + console.log($this.html()); + rename = true; + return false; + } + } if (!e.ctrlKey) { - selected[settings.name] = []; + $this.siblings().removeClass('selected'); } - selected[settings.name].push(filename); - } else if (e.ctrlKey) { - selected[settings.name] = selected[settings.name] - .filter(is(filename)); - } else { - selected[settings.name] = []; + if (!$target.is('textarea')) { + $content.find('.active').removeClass('active'); + $this.toggleClass('selected').addClass('active'); + var filename = self.join(path, name); + if ($this.hasClass('selected')) { + if (!e.ctrlKey) { + selected[settings.name] = []; + } + selected[settings.name].push(filename); + } else if (e.ctrlKey) { + selected[settings.name] = selected[settings.name] + .filter(is(filename)); + } else { + selected[settings.name] = []; + } + } + } + }).on('keypress', 'textarea', function(e) { + if (e.which == 13) { // ENTER + rename_textarea.call(this); + } else if (e.which == 27) { // ESC + var $this = $(this); + $this.parent().removeClass('rename'); + $this.remove(); + } + if ([13, 27].indexOf(e.which) != -1) { + rename = false; + return false; } }); self.on('click.browse', function(e) { @@ -266,6 +317,11 @@ $content.find('li').removeClass('selected'); selected[settings.name] = []; } + if (!$target.is('textarea')) { + $content.find('li.rename').removeClass('rename') + .find('textarea').each(rename_textarea).remove(); + rename = false; + } } }); self.on('dragover.browse', '.content', function() { @@ -284,17 +340,18 @@ }); $content.on('drop.browse', function(e) { var $target = $(e.target); - var dest; - if ($target.is('.directory')) { - dest = self.join(path, $target.text(), drag.name); - } else { - dest = self.join(path, drag.name); - } if (self.name() !== drag.context.name()) { throw new Error("You can't drag across different filesystems"); } + var new_path; + if ($target.is('.directory')) { + new_path = self.join(path, $target.text()); + } else { + new_path = path; + } if (drag.selection) { selected[settings.name].forEach(function(src) { + var dest = self.join(new_path, self.split(src).pop()); if (!same_root(src, dest)) { self._rename(src, dest); } @@ -304,6 +361,7 @@ drag.context.refresh(); } } else { + var dest = self.join(path, drag.name); var src = self.join(drag.path, drag.name); if (!same_root(src, dest)) { self._rename(src, dest); @@ -315,8 +373,9 @@ } return false; }); - $ul.on('mousedown.browse', function(e) { - if (!$(e.target).is('li')) { + $content.on('mousedown.browse', function(e) { + var $target = $(e.target); + if (!$target.is('li') && !$target.is('span')) { selection = true; was_selecting = false; self.addClass('no-select'); @@ -340,8 +399,10 @@ return current; }, back: function() { - paths.pop(); - self.show(paths[paths.length-1], {push: false}); + if (paths.length > 1) { + paths.pop(); + self.show(paths[paths.length-1], {push: false}); + } return self; }, destroy: function() { @@ -443,15 +504,14 @@ $ul.empty(); current_content.dirs.forEach(function(dir) { var cls = settings.item_class(new_path, dir); - var $li = $('
                          • ' + dir + '
                          • '). + var $li = $('
                          • ' + dir + '
                          • '). appendTo($ul).attr('draggable', true); if (cls) { $li.addClass(cls); } - }); current_content.files.forEach(function(file) { - var $li = $('
                          • ' + file + '
                          • '). + var $li = $('
                          • ' + file + '
                          • '). appendTo($ul).attr('draggable', true); if (file.match('.')) { $li.addClass(file.split('.').pop()); diff --git a/js/jquery.filebrowser.min.js b/js/jquery.filebrowser.min.js index 76bc387..baa4536 100644 --- a/js/jquery.filebrowser.min.js +++ b/js/jquery.filebrowser.min.js @@ -1,10 +1,10 @@ /**@license * - * jQuery File Browser - directory browser jQuery plugin version 0.5.4 + * jQuery File Browser - directory browser jQuery plugin version 0.6.0 * * Copyright (c) 2016 Jakub Jankiewicz * Released under the MIT license * - * Date: Sun, 18 Dec 2016 19:31:33 +0000 + * Date: Tue, 20 Dec 2016 21:33:09 +0000 */ -(function(e,t){"use strict";e.browse={defaults:{dir:function(){return{files:[],dirs:[]}},root:"/",separator:"/",labels:true,change:e.noop,init:e.noop,item_class:e.noop,open:e.noop,rename:e.noop,copy:e.noop,name:"default",error:e.noop,refresh_timer:100},strings:{toolbar:{back:"back",up:"up",refresh:"refresh"}},escape_regex:function(e){if(typeof e=="string"){var t=/([-\\\^$\[\]()+{}?*.|])/g;return e.replace(t,"\\$1")}}};var r;var n;var a={};var s;function o(e){return function(t){return e==t}}function i(t,r){return t===r||r.match(new RegExp("^"+e.browse.escape_regex(t)))}function l(t,r){var n=e(r);return n.parents().add("html,body").map(function(){return e(this)[t]()}).get().reduce(function(e,t){return e+t})}e.fn.browse=function(t){var c=e.extend({},e.browse.defaults,t);function f(t){if(Y){var r=j.offset();M=t.clientX-r.left;R=t.clientY-r.top;K.show();h();$=true;var n=_.find("li");if(!t.ctrlKey){n.removeClass("selected");a[c.name]=[]}var s=K[0].getBoundingClientRect();var o=n.filter(function(){var e=this.getBoundingClientRect();return e.top+e.height>s.top&&e.left+e.width>s.left&&e.bottom-e.heighto){a=o}if(s>i){s=i}K.css({left:r,top:n+t,width:a-r,height:s-n})}function u(e){if(m.hasClass("selected")){if(e.ctrlKey){if(e.which==67){m.copy()}else if(e.which==88){m.cut()}else if(e.which==86){m.paste(n)}}else if(e.which==8){m.back()}else{var t=_.find(".selected");if(e.which==13&&t.length){t.dblclick()}else{if(e.which>=37&&e.which<=40){var r;var s=_.find("li");if(!t.length){t=_.find("li:eq(0)");r=0}else{t.removeClass("selected");var o=_.prop("clientWidth");var i=s.length;var l=_.find("li:eq(0)").outerWidth(true);var f=Math.floor(o/l);r=t.index();if(e.which==37){r--}else if(e.which==38){r=r-f}else if(e.which==39){r++}else if(e.which==40){r=r+f}if(r<0){r=0}else if(r>i-1){r=i-1}}if(e.which>=37&&e.which<=40){var d=s.eq(r).addClass("selected");var h=m.join(w,d.text());if(d.length){a[c.name]=[h]}else{a[c.name]=[]}}}}}}}function p(t){if(!e(t.target).closest("."+v).length){e(".browser-widget").removeClass("selected")}}if(this.data("browse")){return this.data("browse")}else if(this.length>1){return this.each(function(){e.fn.browse.call(e(this),c)})}else{var v="browser-widget";a[c.name]=a[c.name]||[];var m=this;m.addClass(v+" hidden");var w;var g=[];var b;var C=e('
                              ').appendTo(m);if(c.labels){C.addClass("labels")}var x=e('
                              ').appendTo(C);e("").addClass("home").appendTo(x);var y=e("").appendTo(x);var k=e.browse.strings.toolbar;Object.keys(k).forEach(function(t){e("
                            • ").text(k[t]).addClass(t).appendTo(C)});var _=e("
                                ").wrap("
                                ").parent().addClass("content").appendTo(m);var j=_.find("ul");var T=0,E=0,M=0,R=0;var K=e("
                                ").addClass("selection").hide().appendTo(_);var Y=false;var $=false;C.on("click.browse","li",function(){var t=e(this);if(!t.hasClass("disabled")){var r=t.text();m[r]()}}).on("click",".home",function(){if(w!=c.root){m.show(c.root)}}).on("keypress.browse","input",function(t){if(t.which==13){var r=e(this);var n=r.val();m.show(n)}});_.on("dblclick.browse","li",function(){var t=e(this);var r=m.join(w,t.text());if(t.hasClass("directory")){t.removeClass("selected");m.show(r)}else if(t.hasClass("file")){c.open(r)}}).on("click.browse","li",function(t){var r=e(this);if(!t.ctrlKey){r.siblings().removeClass("selected")}r.toggleClass("selected");var n=m.join(w,r.text());if(r.hasClass("selected")){if(!t.ctrlKey){a[c.name]=[]}a[c.name].push(n)}else if(t.ctrlKey){a[c.name]=a[c.name].filter(o(n))}else{a[c.name]=[]}});m.on("click.browse",function(t){e("."+v).removeClass("selected");m.addClass("selected");if(!$){var r=e(t.target);if(!t.ctrlKey&&!r.is(".content li")&&!r.closest(".toolbar").length){_.find("li").removeClass("selected");a[c.name]=[]}}});m.on("dragover.browse",".content",function(){return false}).on("dragstart",".content li",function(){var t=e(this);var r=t.text();s={name:r,path:w,context:m};if(t.hasClass("selected")){s.selection=true}});_.on("drop.browse",function(t){var r=e(t.target);var n;if(r.is(".directory")){n=m.join(w,r.text(),s.name)}else{n=m.join(w,s.name)}if(m.name()!==s.context.name()){throw new Error("You can't drag across different filesystems")}if(s.selection){a[c.name].forEach(function(e){if(!i(e,n)){m._rename(e,n)}});m.refresh();if(m!==s.context){s.context.refresh()}}else{var o=m.join(s.path,s.name);if(!i(o,n)){m._rename(o,n);m.refresh();if(m!==s.context){s.context.refresh()}}}return false});j.on("mousedown.browse",function(t){if(!e(t.target).is("li")){Y=true;$=false;m.addClass("no-select");var r=j.offset();T=t.clientX-r.left;E=t.clientY-r.top}});e(document).on("click",p).on("keydown",u).on("mousemove",f).on("mouseup",d);e.extend(m,{path:function(){return w},name:function(){return c.name},current:function(){return current},back:function(){g.pop();m.show(g[g.length-1],{push:false});return m},destroy:function(){m.off(".browse");e(document).off("click",p).off("keydown",u);x.remove();_.remove()},_rename:function(e,t){if(!i(e,t)){c.rename(e,t)}},_copy:function(e,t){c.copy(e,t)},copy:function(){r={path:w,contents:a[c.name],source:m};n=false},cut:function(){m.copy();n=true},paste:function(e){function t(e,t){r.contents.forEach(function(r){var n=e.split(r).pop();var a=e.join(w,n);if(!i(r,a)){e[t](r,a)}})}if(r&&r.contents&&r.contents.length){if(m.name()!==r.source.name()){throw new Error("You can't paste across different filesystems")}else{if(e){t(m,"_rename")}else{t(m,"_copy")}m.refresh();if(m!==r.source){r.source.refresh()}}}},up:function(){var e=m.split(w);e.pop();m.show(m.join.apply(m,e));return m},refresh:function(){_.addClass("hidden");var t=e.Deferred();var r=e.Deferred();if(c.refresh_timer){setTimeout(t.resolve.bind(t),c.refresh_timer)}else{t.resolve()}m.show(w,{force:true,push:false,callback:function(){r.resolve()}});e.when(t,r).then(function(){_.removeClass("hidden")})},show:function(t,r){var n={callback:e.noop,push:true,force:false};r=e.extend({},n,r);if(w!=t||r.force){m.addClass("hidden");if(r.push){g.push(t)}C.find(".up").toggleClass("disabled",t==c.root);C.find(".back").toggleClass("disabled",g.length==1);w=t;c.dir(w,function(n){if(!n){c.error("Invalid directory");m.removeClass("hidden")}else{b=n;m.addClass("hidden");j.empty();b.dirs.forEach(function(r){var n=c.item_class(t,r);var a=e('
                              • '+r+"
                              • ").appendTo(j).attr("draggable",true);if(n){a.addClass(n)}});b.files.forEach(function(r){var n=e('
                              • '+r+"
                              • ").appendTo(j).attr("draggable",true);if(r.match(".")){n.addClass(r.split(".").pop())}var a=c.item_class(t,r);if(a){n.addClass(a)}});m.removeClass("hidden");y.val(t);c.change.call(m);r.callback()}})}return m},join:function(){var t=[].slice.call(arguments);var r=t.map(function(t){var r=new RegExp(e.browse.escape_regex(c.separator)+"$","");return t.replace(r,"")}).filter(Boolean).join(c.separator);var n=new RegExp("^"+e.browse.escape_regex(c.root));return n.test(r)?r:c.root+r},split:function(t){var r=new RegExp("^"+e.browse.escape_regex(c.root));var n=new RegExp(e.browse.escape_regex(c.separator)+"$");t=t.replace(r,"").replace(n,"");if(t){return t.split(c.separator)}else{return[]}},walk:function(e,t){var r=this.split(e);var n;while(r.length){n=t(r.shift(),!r.length)}return n}});setTimeout(function(){var e=c.start_directory||c.root;m.show(e,{callback:c.init.bind(m)})},0);m.data("browse",m);return m}}})(jQuery); \ No newline at end of file +(function(e,t){"use strict";e.browse={defaults:{dir:function(){return{files:[],dirs:[]}},root:"/",separator:"/",labels:true,change:e.noop,init:e.noop,item_class:e.noop,rename_delay:300,open:e.noop,rename:e.noop,copy:e.noop,name:"default",error:e.noop,refresh_timer:100},strings:{toolbar:{back:"back",up:"up",refresh:"refresh"}},escape_regex:function(e){if(typeof e=="string"){var t=/([-\\\^$\[\]()+{}?*.|])/g;return e.replace(t,"\\$1")}}};var r;var a;var n={};var s;function i(e){return function(t){return e==t}}function o(t,r){return t===r||r.match(new RegExp("^"+e.browse.escape_regex(t)))}function l(t,r){var a=e(r);return a.parents().add("html,body").map(function(){return e(this)[t]()}).get().reduce(function(e,t){return e+t})}e.fn.browse=function(t){var c=e.extend({},e.browse.defaults,t);function f(t){if(W){var r=R.offset();$=t.clientX-r.left;q=t.clientY-r.top;B.show();h();O=true;var a=M.find("li");if(!t.ctrlKey){a.removeClass("selected");n[c.name]=[]}var s=B[0].getBoundingClientRect();var i=a.filter(function(){var e=this.getBoundingClientRect();return e.top+e.height>s.top&&e.left+e.width>s.left&&e.bottom-e.heighti){n=i}if(s>o){s=o}B.css({left:r,top:a+t,width:n-r,height:s-a})}function u(e){if(g.hasClass("selected")&&!y){var t;var r=M.find(".active");if(e.ctrlKey){if(e.which==67){g.copy()}else if(e.which==88){g.cut()}else if(e.which==86){g.paste(a)}}if(e.which==32){var e=jQuery.Event("click");e.ctrlKey=true;e.target=r[0];r.trigger(e);return false}else if(e.which==8){g.back()}else{if(e.which==13&&r.length){r.dblclick()}else{if(e.which>=37&&e.which<=40){if(!e.ctrlKey){M.find("li").removeClass("selected")}if(!r.length){r=M.find("li:eq(0)").addClass("active")}else{var n=M.find("li");var s=M.prop("clientWidth");var i=n.length;var o=M.find("li:eq(0)").outerWidth(true);var l=Math.floor(s/o);t=r.index();if(e.which==37){t--}else if(e.which==38){t=t-l}else if(e.which==39){t++}else if(e.which==40){t=t+l}if(t<0){t=0}else if(t>i-1){t=i-1}n.eq(t).addClass("active").siblings().removeClass("active")}}}}}}function v(t){if(!e(t.target).closest("."+m).length){e(".browser-widget").removeClass("selected")}}function p(){var t=e(this);var r=t.parent().find("span").text();var a=t.val();if(a!=r){console.log(g.join(w,r),g.join(w,a));g._rename(g.join(w,r),g.join(w,a));g.refresh()}}if(this.data("browse")){return this.data("browse")}else if(this.length>1){return this.each(function(){e.fn.browse.call(e(this),c)})}else{var m="browser-widget";n[c.name]=n[c.name]||[];var g=this;g.addClass(m+" hidden");var w;var b=[];var C;var x;var y=false;var k=0;var _=e('
                                ').appendTo(g);var j=e('
                                ').appendTo(_);e("").addClass("home").appendTo(j);var T=e("
                                  ").appendTo(_);if(c.labels){T.addClass("labels")}var E=e("").appendTo(j);var K=e.browse.strings.toolbar;Object.keys(K).forEach(function(t){e("
                                • ").text(K[t]).addClass(t).appendTo(T)});var M=e("
                                    ").wrap("
                                    ").parent().addClass("content").appendTo(g);var R=M.find("ul");var D=0,Y=0,$=0,q=0;var B=e("
                                    ").addClass("selection").hide().appendTo(M);var W=false;var O=false;_.on("click.browse","li",function(){var t=e(this);if(!t.hasClass("disabled")){var r=t.text();g[r]()}}).on("click",".home",function(){if(w!=c.root){g.show(c.root)}}).on("keypress.browse","input",function(t){if(t.which==13){var r=e(this);var a=r.val();g.show(a)}});M.on("dblclick.browse","li",function(t){var r=e(this);var a=r.find("span").text();var n=g.join(w,a);if(r.hasClass("directory")){r.removeClass("selected");g.show(n)}else if(r.hasClass("file")){c.open(n)}}).on("click.browse","li",function(t){console.log("click");if(!O){var r=e(t.target);var a=e(this);var s=a.find("span").text();if(k++%2===0){x=(new Date).getTime()}else{var o=(new Date).getTime()-x;if(r.is("span")&&o>c.rename_delay){console.log(a);e("").appendTo(a);a.addClass("rename");console.log(a.html());y=true;return false}}if(!t.ctrlKey){a.siblings().removeClass("selected")}if(!r.is("textarea")){M.find(".active").removeClass("active");a.toggleClass("selected").addClass("active");var l=g.join(w,s);if(a.hasClass("selected")){if(!t.ctrlKey){n[c.name]=[]}n[c.name].push(l)}else if(t.ctrlKey){n[c.name]=n[c.name].filter(i(l))}else{n[c.name]=[]}}}}).on("keypress","textarea",function(t){if(t.which==13){p.call(this)}else if(t.which==27){var r=e(this);r.parent().removeClass("rename");r.remove()}if([13,27].indexOf(t.which)!=-1){y=false;return false}});g.on("click.browse",function(t){e("."+m).removeClass("selected");g.addClass("selected");if(!O){var r=e(t.target);if(!t.ctrlKey&&!r.is(".content li")&&!r.closest(".toolbar").length){M.find("li").removeClass("selected");n[c.name]=[]}if(!r.is("textarea")){M.find("li.rename").removeClass("rename").find("textarea").each(p).remove();y=false}}});g.on("dragover.browse",".content",function(){return false}).on("dragstart",".content li",function(){var t=e(this);var r=t.text();s={name:r,path:w,context:g};if(t.hasClass("selected")){s.selection=true}});M.on("drop.browse",function(t){var r=e(t.target);if(g.name()!==s.context.name()){throw new Error("You can't drag across different filesystems")}var a;if(r.is(".directory")){a=g.join(w,r.text())}else{a=w}if(s.selection){n[c.name].forEach(function(e){var t=g.join(a,g.split(e).pop());if(!o(e,t)){g._rename(e,t)}});g.refresh();if(g!==s.context){s.context.refresh()}}else{var i=g.join(w,s.name);var l=g.join(s.path,s.name);if(!o(l,i)){g._rename(l,i);g.refresh();if(g!==s.context){s.context.refresh()}}}return false});M.on("mousedown.browse",function(t){var r=e(t.target);if(!r.is("li")&&!r.is("span")){W=true;O=false;g.addClass("no-select");var a=R.offset();D=t.clientX-a.left;Y=t.clientY-a.top}});e(document).on("click",v).on("keydown",u).on("mousemove",f).on("mouseup",d);e.extend(g,{path:function(){return w},name:function(){return c.name},current:function(){return current},back:function(){if(b.length>1){b.pop();g.show(b[b.length-1],{push:false})}return g},destroy:function(){g.off(".browse");e(document).off("click",v).off("keydown",u);j.remove();M.remove()},_rename:function(e,t){if(!o(e,t)){c.rename(e,t)}},_copy:function(e,t){c.copy(e,t)},copy:function(){r={path:w,contents:n[c.name],source:g};a=false},cut:function(){g.copy();a=true},paste:function(e){function t(e,t){r.contents.forEach(function(r){var a=e.split(r).pop();var n=e.join(w,a);if(!o(r,n)){e[t](r,n)}})}if(r&&r.contents&&r.contents.length){if(g.name()!==r.source.name()){throw new Error("You can't paste across different filesystems")}else{if(e){t(g,"_rename")}else{t(g,"_copy")}g.refresh();if(g!==r.source){r.source.refresh()}}}},up:function(){var e=g.split(w);e.pop();g.show(g.join.apply(g,e));return g},refresh:function(){M.addClass("hidden");var t=e.Deferred();var r=e.Deferred();if(c.refresh_timer){setTimeout(t.resolve.bind(t),c.refresh_timer)}else{t.resolve()}g.show(w,{force:true,push:false,callback:function(){r.resolve()}});e.when(t,r).then(function(){M.removeClass("hidden")})},show:function(t,r){var a={callback:e.noop,push:true,force:false};r=e.extend({},a,r);if(w!=t||r.force){g.addClass("hidden");if(r.push){b.push(t)}_.find(".up").toggleClass("disabled",t==c.root);_.find(".back").toggleClass("disabled",b.length==1);w=t;c.dir(w,function(a){if(!a){c.error("Invalid directory");g.removeClass("hidden")}else{C=a;g.addClass("hidden");R.empty();C.dirs.forEach(function(r){var a=c.item_class(t,r);var n=e('
                                  • '+r+"
                                  • ").appendTo(R).attr("draggable",true);if(a){n.addClass(a)}});C.files.forEach(function(r){var a=e('
                                  • '+r+"
                                  • ").appendTo(R).attr("draggable",true);if(r.match(".")){a.addClass(r.split(".").pop())}var n=c.item_class(t,r);if(n){a.addClass(n)}});g.removeClass("hidden");E.val(t);c.change.call(g);r.callback()}})}return g},join:function(){var t=[].slice.call(arguments);var r=t.map(function(t){var r=new RegExp(e.browse.escape_regex(c.separator)+"$","");return t.replace(r,"")}).filter(Boolean).join(c.separator);var a=new RegExp("^"+e.browse.escape_regex(c.root));return a.test(r)?r:c.root+r},split:function(t){var r=new RegExp("^"+e.browse.escape_regex(c.root));var a=new RegExp(e.browse.escape_regex(c.separator)+"$");t=t.replace(r,"").replace(a,"");if(t){return t.split(c.separator)}else{return[]}},walk:function(e,t){var r=this.split(e);var a;while(r.length){a=t(r.shift(),!r.length)}return a}});setTimeout(function(){var e=c.start_directory||c.root;g.show(e,{callback:c.init.bind(g)})},0);g.data("browse",g);return g}}})(jQuery); \ No newline at end of file diff --git a/package.json b/package.json index 75df0b8..f6160ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jquery.filebrowser", - "version": "0.5.4", + "version": "0.6.0", "description": "jQuery File Browser is a plugin for creating OS like file browsers.", "main": "js/jquery.filebrowser.min.js", "keywords": [