diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f7f4523b..78d708dfa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@ Movim Changelog
v0.17.1 (trunk)
---------------------------
+ * Improve Upload widget, add drag & drop feature
v0.17
---------------------------
diff --git a/app/widgets/Upload/Upload.php b/app/widgets/Upload/Upload.php
index 5a3a5a8e0..0384b7082 100644
--- a/app/widgets/Upload/Upload.php
+++ b/app/widgets/Upload/Upload.php
@@ -52,6 +52,7 @@ class Upload extends Base
{
$view = $this->tpl();
Dialog::fill($view->draw('_upload'));
+ $this->rpc('Upload.attachEvents');
}
public function ajaxSend($file)
diff --git a/app/widgets/Upload/_upload.tpl b/app/widgets/Upload/_upload.tpl
index 6c3187acd..f465cffd5 100644
--- a/app/widgets/Upload/_upload.tpl
+++ b/app/widgets/Upload/_upload.tpl
@@ -10,19 +10,30 @@
-
+
diff --git a/app/widgets/Upload/locales.ini b/app/widgets/Upload/locales.ini
index 92c1528f5..dcde064d3 100644
--- a/app/widgets/Upload/locales.ini
+++ b/app/widgets/Upload/locales.ini
@@ -5,4 +5,5 @@ info = Large pictures will be resized and compressed
error_filesize = File too large
error_failed = Upload failed
error_not_allowed = You are not allowed to upload a file
-error_resource_constraint = You exceeded the quota
\ No newline at end of file
+error_resource_constraint = You exceeded the quota
+drag_drop = Drag and drop your file in this area
\ No newline at end of file
diff --git a/app/widgets/Upload/upload.css b/app/widgets/Upload/upload.css
index b805d01ff..2b3e385e8 100644
--- a/app/widgets/Upload/upload.css
+++ b/app/widgets/Upload/upload.css
@@ -1,14 +1,41 @@
#upload img.preview_picture {
max-height: 35rem;
- max-width: calc(100% - 4rem);
+ max-width: calc(100% - 2rem);
margin: 0 auto;
display: block;
}
#upload img.preview_picture[src] {
- padding-bottom: 2rem;
+ margin: 1rem auto;
+ background-color: #eee;
+ background-image: linear-gradient(45deg, #CCC 25%, transparent 25%, transparent 75%, #CCC 75%, #CCC),
+ linear-gradient(45deg, #CCC 25%, transparent 25%, transparent 75%, #CCC 75%, #CCC);
+ background-size: 30px 30px;
+ background-position: 0 0, 15px 15px;
+ margin-top: 0;
}
-#upload img.preview_picture[src] + li {
+#upload img.preview_picture[src] ~ li:not(.file) {
display: none;
+}
+
+#upload div.drop {
+ width: auto;
+ margin: 2rem;
+ display: block;
+ box-sizing: border-box;
+ border-radius: 0.5rem;
+ min-height: 30rem;
+ background-color: rgba(0, 0, 0, 0.3);
+ border: 0.5rem solid transparent;
+ border-style: dashed;
+ padding: 1rem;
+
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+#upload div.drop.dropped {
+ border-color: gray;
}
\ No newline at end of file
diff --git a/app/widgets/Upload/upload.js b/app/widgets/Upload/upload.js
index 1525c4aaa..b36098003 100644
--- a/app/widgets/Upload/upload.js
+++ b/app/widgets/Upload/upload.js
@@ -58,10 +58,10 @@ var Upload = {
}
},
- preview : function() {
- var file = document.getElementById('file').files[0];
- Upload.name = file.name;
- Upload.check(file);
+ preview : function(file) {
+ var resolvedFile = file ?? document.getElementById('file').files[0];
+ Upload.name = resolvedFile.name;
+ Upload.check(resolvedFile);
},
check : function(file) {
@@ -152,6 +152,12 @@ var Upload = {
// If the preview system is there
if (preview) {
+ console.log(file);
+ var fileInfo = document.querySelector('#upload li.file');
+ fileInfo.querySelector('p.name').innerText = Upload.name;
+ var type = file.type ? file.type + ' ยท ' : '';
+ fileInfo.querySelector('p.desc').innerText = type + MovimUtils.humanFileSize(file.size);
+
if (Upload.file.type.match(/image.*/)) {
preview.src = URL.createObjectURL(Upload.file);
} else {
@@ -196,5 +202,40 @@ var Upload = {
abort : function() {
if (Upload.xhr) Upload.xhr.abort();
+ },
+
+ attachEvents : function () {
+ document.querySelector('#upload div.drop').addEventListener('drop', ev => {
+ ev.preventDefault();
+
+ if (ev.dataTransfer.items) {
+ for (var i = 0; i < ev.dataTransfer.items.length; i++) {
+ if (ev.dataTransfer.items[i].kind === 'file') {
+ var file = ev.dataTransfer.items[i].getAsFile();
+ Upload.preview(file);
+ }
+ }
+ }
+ });
+
+ var dropArea = document.querySelector('#upload div.drop');
+
+ dropArea.querySelector('img.preview_picture')
+ .addEventListener('drop', ev => ev.preventDefault());
+
+ dropArea.addEventListener('dragover', ev => {
+ ev.preventDefault();
+ dropArea.classList.add('dropped');
+ }, false);
+
+ dropArea.addEventListener('drop', ev => {
+ ev.preventDefault();
+ dropArea.classList.remove('dropped');
+ }, false);
+
+ dropArea.addEventListener('dragleave', ev => {
+ ev.preventDefault();
+ dropArea.classList.remove('dropped');
+ }, false);
}
}
diff --git a/public/scripts/movim_utils.js b/public/scripts/movim_utils.js
index fe6c6f72a..3c19af54c 100644
--- a/public/scripts/movim_utils.js
+++ b/public/scripts/movim_utils.js
@@ -144,6 +144,21 @@ var MovimUtils = {
return {'page': page, 'params': str, 'hash': window.location.hash.substr(1)};
},
+ humanFileSize : function(bytes, si) {
+ var thresh = si ? 1000 : 1024;
+ if(Math.abs(bytes) < thresh) {
+ return bytes + ' B';
+ }
+ var units = si
+ ? ['kB','MB','GB','TB','PB','EB','ZB','YB']
+ : ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
+ var u = -1;
+ do {
+ bytes /= thresh;
+ ++u;
+ } while(Math.abs(bytes) >= thresh && u < units.length - 1);
+ return bytes.toFixed(1)+' '+units[u];
+ },
getOrientation : function(file, callback) {
var reader = new FileReader();