summaryrefslogtreecommitdiff
path: root/web-ui/app/js
diff options
context:
space:
mode:
authorNavaL <mnandri@thoughtworks.com>2015-12-22 18:58:57 +0100
committerNavaL <mnandri@thoughtworks.com>2015-12-22 19:05:10 +0100
commitec3a7f46f16c32bbaf22a14a92a890e1ab900e94 (patch)
tree4e900828ccbc1d7be63b73d5e6253acc40e901aa /web-ui/app/js
parent4cb47c1848bb5d20b5ae167a7ab2879d00825f84 (diff)
front-end for sending attachments
Issue #548
Diffstat (limited to 'web-ui/app/js')
-rw-r--r--web-ui/app/js/features/features.js4
-rw-r--r--web-ui/app/js/mail_view/data/attachment_list.js40
-rw-r--r--web-ui/app/js/mail_view/data/mail_builder.js130
-rw-r--r--web-ui/app/js/mail_view/ui/attachment.js68
-rw-r--r--web-ui/app/js/mail_view/ui/compose_box.js8
-rw-r--r--web-ui/app/js/mixins/with_mail_edit_base.js5
-rw-r--r--web-ui/app/js/page/events.js3
7 files changed, 190 insertions, 68 deletions
diff --git a/web-ui/app/js/features/features.js b/web-ui/app/js/features/features.js
index 9c791ccd..4d04df64 100644
--- a/web-ui/app/js/features/features.js
+++ b/web-ui/app/js/features/features.js
@@ -34,8 +34,8 @@ define(['helpers/monitored_ajax'], function(monitoredAjax) {
var features;
monitoredAjax(this, '/features', {
async: false,
- success: function (results){
- features = results;
+ success: function (results) {
+ features = results;
},
error: function () {
console.error('Could not load feature toggles');
diff --git a/web-ui/app/js/mail_view/data/attachment_list.js b/web-ui/app/js/mail_view/data/attachment_list.js
new file mode 100644
index 00000000..af48b059
--- /dev/null
+++ b/web-ui/app/js/mail_view/data/attachment_list.js
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015 ThoughtWorks, Inc.
+ *
+ * Pixelated is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Pixelated is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define(
+ [
+ 'page/events'
+ ],
+
+ function (events) {
+ 'use strict';
+
+ function attachmentList() {
+ this.defaultAttrs({
+ attachments: []
+ });
+
+ this.addAttachment = function (event, data) {
+ this.attr.attachments.push(data);
+ };
+
+ this.after('initialize', function () {
+ this.on(document, events.mail.uploadedAttachment, this.addAttachment);
+ });
+ }
+ return attachmentList;
+ }); \ No newline at end of file
diff --git a/web-ui/app/js/mail_view/data/mail_builder.js b/web-ui/app/js/mail_view/data/mail_builder.js
index 74e38057..7a478dd8 100644
--- a/web-ui/app/js/mail_view/data/mail_builder.js
+++ b/web-ui/app/js/mail_view/data/mail_builder.js
@@ -16,79 +16,87 @@
*/
define(['services/model/mail'], function (mailModel) {
- 'use strict';
+ 'use strict';
- var mail;
+ var mail;
- function recipients(mail, place, v) {
- if (v !== '' && !_.isUndefined(v)) {
- if(_.isArray(v)) {
- mail[place] = v;
- } else {
- mail[place] = v.split(' ');
- }
- } else {
- mail[place] = [];
+ function recipients(mail, place, v) {
+ if (v !== '' && !_.isUndefined(v)) {
+ if (_.isArray(v)) {
+ mail[place] = v;
+ } else {
+ mail[place] = v.split(' ');
+ }
+ } else {
+ mail[place] = [];
+ }
}
- }
- return {
- newMail: function(ident) {
- ident = _.isUndefined(ident) ? '' : ident;
+ return {
+ newMail: function (ident) {
+ ident = _.isUndefined(ident) ? '' : ident;
- mail = {
- header: {
- to: [],
- cc: [],
- bcc: [],
- from: undefined,
- subject: ''
+ mail = {
+ header: {
+ to: [],
+ cc: [],
+ bcc: [],
+ from: undefined,
+ subject: ''
+ },
+ tags: [],
+ body: '',
+ attachments: [],
+ ident: ident
+ };
+ return this;
},
- tags: [],
- body: '',
- ident: ident
- };
- return this;
- },
- subject: function (subject) {
- mail.header.subject = subject;
- return this;
- },
+ subject: function (subject) {
+ mail.header.subject = subject;
+ return this;
+ },
- body: function(body) {
- mail.body = body;
- return this;
- },
+ body: function (body) {
+ mail.body = body;
+ return this;
+ },
- to: function (to) {
- recipients(mail.header, 'to', to);
- return this;
- },
+ to: function (to) {
+ recipients(mail.header, 'to', to);
+ return this;
+ },
+
+ cc: function (cc) {
+ recipients(mail.header, 'cc', cc);
+ return this;
+ },
- cc: function (cc) {
- recipients(mail.header, 'cc', cc);
- return this;
- },
+ bcc: function (bcc) {
+ recipients(mail.header, 'bcc', bcc);
+ return this;
+ },
- bcc: function (bcc) {
- recipients(mail.header, 'bcc', bcc);
- return this;
- },
+ header: function (name, value) {
+ mail.header[name] = value;
+ return this;
+ },
- header: function(name, value) {
- mail.header[name] = value;
- return this;
- },
+ tag: function (tag) {
+ if (_.isUndefined(tag)) {
+ tag = 'drafts';
+ }
+ mail.tags.push(tag);
+ return this;
+ },
- tag: function(tag) {
- if(_.isUndefined(tag)) { tag = 'drafts'; }
- mail.tags.push(tag);
- return this;
- },
+ attachment: function (attachmentList) {
+ mail.attachments = attachmentList;
+ return this;
+ },
- build: function() {
- return mailModel.create(mail);
- }
- };
+ build: function () {
+ return mailModel.create(mail);
+ }
+ };
});
diff --git a/web-ui/app/js/mail_view/ui/attachment.js b/web-ui/app/js/mail_view/ui/attachment.js
new file mode 100644
index 00000000..f57fea5b
--- /dev/null
+++ b/web-ui/app/js/mail_view/ui/attachment.js
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2015 ThoughtWorks, Inc.
+ *
+ * Pixelated is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Pixelated is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define(
+ [
+ 'flight/lib/component',
+ 'page/events',
+ 'features'
+ ],
+
+ function (defineComponent, events, features) {
+ 'use strict';
+
+ return defineComponent(function () {
+ this.render = function () {
+ this.$node.html('<i class="fa fa-paperclip fa-2x"></i>');
+ };
+
+ function humanReadable(bytes) {
+ var e = Math.floor(Math.log(bytes) / Math.log(1024));
+ return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'b';
+ }
+
+ function addJqueryFileUploadConfig(on) {
+ var url = '/attachment';
+ $('#fileupload').fileupload({
+ url: url,
+ dataType: 'json',
+ done: function (e, response) {
+ var data = response.result;
+ $('#files').html('<span>' + data.filename + ' (' + humanReadable(data.filesize) + ')' + '</span>');
+ on.trigger(document, events.mail.uploadedAttachment, data);
+ },
+ progressall: function (e, data) {
+ var progress = parseInt(data.loaded / data.total * 100, 10);
+ $('#progress .progress-bar').css('width', progress + '%');
+ }
+ });
+ }
+
+ this.upload = function () {
+ addJqueryFileUploadConfig(this);
+ $('#fileupload').click();
+ };
+
+ this.after('initialize', function () {
+ if (features.isEnabled('attachment')) {
+ this.render();
+ }
+ this.on(this.$node, 'click', this.upload);
+ });
+
+ });
+ });
diff --git a/web-ui/app/js/mail_view/ui/compose_box.js b/web-ui/app/js/mail_view/ui/compose_box.js
index dcc8fd76..48a7c23f 100644
--- a/web-ui/app/js/mail_view/ui/compose_box.js
+++ b/web-ui/app/js/mail_view/ui/compose_box.js
@@ -20,13 +20,14 @@ define(
'views/templates',
'mixins/with_mail_edit_base',
'page/events',
- 'mail_view/data/mail_builder'
+ 'mail_view/data/mail_builder',
+ 'mail_view/data/attachment_list'
],
- function (defineComponent, templates, withMailEditBase, events, mailBuilder) {
+ function (defineComponent, templates, withMailEditBase, events, mailBuilder, attachmentList) {
'use strict';
- return defineComponent(composeBox, withMailEditBase);
+ return defineComponent(composeBox, withMailEditBase, attachmentList);
function composeBox() {
@@ -49,6 +50,7 @@ define(
.cc(this.attr.recipientValues.cc)
.bcc(this.attr.recipientValues.bcc)
.body(this.select('bodyBox').val())
+ .attachment(this.attr.attachments)
.tag(tag);
};
diff --git a/web-ui/app/js/mixins/with_mail_edit_base.js b/web-ui/app/js/mixins/with_mail_edit_base.js
index a1fa6b09..1b5e8c52 100644
--- a/web-ui/app/js/mixins/with_mail_edit_base.js
+++ b/web-ui/app/js/mixins/with_mail_edit_base.js
@@ -23,9 +23,10 @@ define(
'page/events',
'views/i18n',
'mail_view/ui/send_button',
+ 'mail_view/ui/attachment',
'flight/lib/utils'
],
- function(viewHelper, Recipients, DraftSaveStatus, events, i18n, SendButton, utils) {
+ function(viewHelper, Recipients, DraftSaveStatus, events, i18n, SendButton, Attachment, utils) {
'use strict';
function withMailEditBase() {
@@ -33,6 +34,7 @@ define(
this.defaultAttrs({
bodyBox: '#text-box',
sendButton: '#send-button',
+ attachmentButton: '#attachment-button',
cancelButton: '#cancel-button',
trashButton: '#trash-button',
toArea: '#recipients-to-area',
@@ -93,6 +95,7 @@ define(
this.on(this.select('trashButton'), 'click', this.discardMail);
SendButton.attachTo(this.select('sendButton'));
+ Attachment.attachTo(this.select('attachmentButton'));
this.warnSendButtonOfRecipients();
};
diff --git a/web-ui/app/js/page/events.js b/web-ui/app/js/page/events.js
index 4ed25185..4d817b91 100644
--- a/web-ui/app/js/page/events.js
+++ b/web-ui/app/js/page/events.js
@@ -142,7 +142,8 @@ define(function () {
tags: {
update: 'mail:tags:update',
updated: 'mail:tags:updated'
- }
+ },
+ uploadedAttachment: 'mail:uploaded:attachment'
},
mails: {
available: 'mails:available',