summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLauri Ojansivu <x@xet7.org>2019-08-11 19:26:05 +0300
committerGitHub <noreply@github.com>2019-08-11 19:26:05 +0300
commit2859457600a29ae783f165d7edd8825f40859f02 (patch)
treea8ca7378d1a9c38db66de26b00fb04de0aa33993
parent30680f13d67e31a551511b9e6e24d807a2c8064d (diff)
parent4857bce5d953ba3299a1de4c1894a96913d4d857 (diff)
downloadwekan-2859457600a29ae783f165d7edd8825f40859f02.tar.gz
wekan-2859457600a29ae783f165d7edd8825f40859f02.tar.bz2
wekan-2859457600a29ae783f165d7edd8825f40859f02.zip
Merge pull request #2608 from whowillcare/master
Make image upload in summernote as attachment to wekan board instead of base64 string and more
-rw-r--r--.meteor-1.6-snap/package.json13
-rw-r--r--client/components/cards/attachments.js27
-rwxr-xr-xclient/components/main/editor.js65
-rw-r--r--client/lib/utils.js25
-rw-r--r--package.json1
-rw-r--r--snapcraft.yaml10
6 files changed, 97 insertions, 44 deletions
diff --git a/.meteor-1.6-snap/package.json b/.meteor-1.6-snap/package.json
index cff817b0..c8ddd53f 100644
--- a/.meteor-1.6-snap/package.json
+++ b/.meteor-1.6-snap/package.json
@@ -53,16 +53,21 @@
"prettier-eslint": "^8.8.2"
},
"dependencies": {
- "@babel/runtime": "^7.1.2",
+ "@babel/runtime": "^7.5.4",
+ "ajv": "^5.0.0",
"babel-runtime": "^6.26.0",
- "bson-ext": "^2.0.0",
+ "bcrypt": "^3.0.2",
+ "bson": "^4.0.0",
+ "bunyan": "^1.8.12",
"es6-promise": "^4.2.4",
- "hoek": "^5.0.4",
+ "gridfs-stream": "^0.5.3",
+ "ldapjs": "^1.0.2",
"meteor-node-stubs": "^0.4.1",
+ "mongodb": "^2.2.19",
"os": "^0.1.1",
"page": "^1.8.6",
"qs": "^6.5.2",
- "source-map-support": "^0.5.9",
+ "source-map-support": "^0.5.12",
"xss": "^1.0.6"
}
}
diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js
index d60169c3..843f1eb7 100644
--- a/client/components/cards/attachments.js
+++ b/client/components/cards/attachments.js
@@ -55,27 +55,12 @@ Template.cardAttachmentsPopup.events({
'change .js-attach-file'(event) {
const card = this;
const processFile = f => {
- const file = new FS.File(f);
- if (card.isLinkedCard()) {
- file.boardId = Cards.findOne(card.linkedId).boardId;
- file.cardId = card.linkedId;
- } else {
- file.boardId = card.boardId;
- file.swimlaneId = card.swimlaneId;
- file.listId = card.listId;
- file.cardId = card._id;
- }
- file.userId = Meteor.userId();
- if (file.original) {
- file.original.name = f.name;
- }
- const attachment = Attachments.insert(file);
-
- if (attachment && attachment._id && attachment.isImage()) {
- card.setCover(attachment._id);
- }
-
- Popup.close();
+ Utils.processUploadedAttachment(card, f, attachment => {
+ if (attachment && attachment._id && attachment.isImage()) {
+ card.setCover(attachment._id);
+ }
+ Popup.close();
+ });
};
FS.Utility.eachFile(event, f => {
diff --git a/client/components/main/editor.js b/client/components/main/editor.js
index e217e113..248f4588 100755
--- a/client/components/main/editor.js
+++ b/client/components/main/editor.js
@@ -176,36 +176,71 @@ Template.editor.onRendered(() => {
const $summernote = getSummernote(this);
if (files && files.length > 0) {
const image = files[0];
- const reader = new FileReader();
+ const currentCard = Cards.findOne(Session.get('currentCard'));
const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL;
const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO;
- const processData = function(dataURL) {
+ const insertImage = src => {
const img = document.createElement('img');
- img.src = dataURL;
+ img.src = src;
img.setAttribute('width', '100%');
$summernote.summernote('insertNode', img);
};
- reader.onload = function(e) {
- const dataurl = e && e.target && e.target.result;
- if (dataurl !== undefined) {
- if (MAX_IMAGE_PIXEL) {
+ const processData = function(fileObj) {
+ Utils.processUploadedAttachment(
+ currentCard,
+ fileObj,
+ attachment => {
+ if (
+ attachment &&
+ attachment._id &&
+ attachment.isImage()
+ ) {
+ attachment.one('uploaded', function() {
+ const maxTry = 3;
+ const checkItvl = 500;
+ let retry = 0;
+ const checkUrl = function() {
+ // even though uploaded event fired, attachment.url() is still null somehow //TODO
+ const url = attachment.url();
+ if (url) {
+ insertImage(url);
+ } else {
+ retry++;
+ if (retry < maxTry) {
+ setTimeout(checkUrl, checkItvl);
+ }
+ }
+ };
+ checkUrl();
+ });
+ }
+ },
+ );
+ };
+ if (MAX_IMAGE_PIXEL) {
+ const reader = new FileReader();
+ reader.onload = function(e) {
+ const dataurl = e && e.target && e.target.result;
+ if (dataurl !== undefined) {
// need to shrink image
Utils.shrinkImage({
dataurl,
maxSize: MAX_IMAGE_PIXEL,
ratio: COMPRESS_RATIO,
- callback(changed) {
- if (changed !== false && !!changed) {
- processData(changed);
+ toBlob: true,
+ callback(blob) {
+ if (blob !== false) {
+ blob.name = image.name;
+ processData(blob);
}
},
});
- } else {
- processData(dataurl);
}
- }
- };
- reader.readAsDataURL(image);
+ };
+ reader.readAsDataURL(image);
+ } else {
+ processData(image);
+ }
}
},
onPaste() {
diff --git a/client/lib/utils.js b/client/lib/utils.js
index f81e691c..81835929 100644
--- a/client/lib/utils.js
+++ b/client/lib/utils.js
@@ -26,6 +26,31 @@ Utils = {
MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL,
COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO,
+ processUploadedAttachment(card, fileObj, callback) {
+ const next = attachment => {
+ if (typeof callback === 'function') {
+ callback(attachment);
+ }
+ };
+ if (!card) {
+ return next();
+ }
+ const file = new FS.File(fileObj);
+ if (card.isLinkedCard()) {
+ file.boardId = Cards.findOne(card.linkedId).boardId;
+ file.cardId = card.linkedId;
+ } else {
+ file.boardId = card.boardId;
+ file.swimlaneId = card.swimlaneId;
+ file.listId = card.listId;
+ file.cardId = card._id;
+ }
+ file.userId = Meteor.userId();
+ if (file.original) {
+ file.original.name = fileObj.name;
+ }
+ return next(Attachments.insert(file));
+ },
shrinkImage(options) {
// shrink image to certain size
const dataurl = options.dataurl,
diff --git a/package.json b/package.json
index 670569fc..c8ddd53f 100644
--- a/package.json
+++ b/package.json
@@ -55,6 +55,7 @@
"dependencies": {
"@babel/runtime": "^7.5.4",
"ajv": "^5.0.0",
+ "babel-runtime": "^6.26.0",
"bcrypt": "^3.0.2",
"bson": "^4.0.0",
"bunyan": "^1.8.12",
diff --git a/snapcraft.yaml b/snapcraft.yaml
index 90feb776..7073aa51 100644
--- a/snapcraft.yaml
+++ b/snapcraft.yaml
@@ -201,6 +201,7 @@ parts:
rm -rf package-lock.json .build
meteor add standard-minifier-js --allow-superuser
meteor npm install --allow-superuser
+ meteor npm install --allow-superuser --save babel-runtime
meteor build .build --directory --allow-superuser
cp -f fix-download-unicode/cfs_access-point.txt .build/bundle/programs/server/packages/cfs_access-point.js
#Removed binary version of bcrypt because of security vulnerability that is not fixed yet.
@@ -214,15 +215,16 @@ parts:
# Change to directory .build/bundle/programs/server
cd .build/bundle/programs/server
npm install
+ npm install --allow-superuser --save babel-runtime
#meteor npm install --save bcrypt
# Change back to Wekan source directory
cd ../../../..
cp -r .build/bundle/* $SNAPCRAFT_PART_INSTALL/
cp .build/bundle/.node_version.txt $SNAPCRAFT_PART_INSTALL/
- rm $SNAPCRAFT_PART_INSTALL/lib/node_modules/wekan
- rm $SNAPCRAFT_PART_INSTALL/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
- rm $SNAPCRAFT_PART_INSTALL/lib/node_modules/node-pre-gyp/node_modules/tar/lib/.mkdir.js.swp
- rm $SNAPCRAFT_PART_INSTALL/lib/node_modules/node-gyp/node_modules/tar/lib/.mkdir.js.swp
+ rm -f $SNAPCRAFT_PART_INSTALL/lib/node_modules/wekan
+ rm -f $SNAPCRAFT_PART_INSTALL/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs
+ rm -f $SNAPCRAFT_PART_INSTALL/lib/node_modules/node-pre-gyp/node_modules/tar/lib/.mkdir.js.swp
+ rm -f $SNAPCRAFT_PART_INSTALL/lib/node_modules/node-gyp/node_modules/tar/lib/.mkdir.js.swp
organize:
README: README.wekan
prime: