diff options
| -rw-r--r-- | web-ui/app/js/mail_view/data/attachment_list.js | 52 | ||||
| -rw-r--r-- | web-ui/app/js/mail_view/ui/attachment.js | 74 | ||||
| -rw-r--r-- | web-ui/app/js/mail_view/ui/attachment_icon.js | 46 | ||||
| -rw-r--r-- | web-ui/app/js/mail_view/ui/compose_box.js | 7 | ||||
| -rw-r--r-- | web-ui/app/js/mixins/with_mail_edit_base.js | 9 | ||||
| -rw-r--r-- | web-ui/app/js/page/events.js | 3 | ||||
| -rw-r--r-- | web-ui/app/templates/compose/compose_box.hbs | 2 | ||||
| -rw-r--r-- | web-ui/test/spec/mail_view/data/attachment_list.spec.js | 34 | ||||
| -rw-r--r-- | web-ui/test/spec/mail_view/ui/attachment.spec.js | 10 | 
9 files changed, 142 insertions, 95 deletions
| diff --git a/web-ui/app/js/mail_view/data/attachment_list.js b/web-ui/app/js/mail_view/data/attachment_list.js index af48b059..7ea2f9d9 100644 --- a/web-ui/app/js/mail_view/data/attachment_list.js +++ b/web-ui/app/js/mail_view/data/attachment_list.js @@ -17,24 +17,72 @@  define(      [ +        'flight/lib/component',          'page/events'      ], -    function (events) { +    function (defineComponent, events) {          'use strict';          function attachmentList() {              this.defaultAttrs({ +                inputFileUpload: '#fileupload', +                attachmentListItem: '#attachment-list-item', +                progressBar: '#progress .progress-bar', +                attachmentBaseUrl: '/attachment',                  attachments: []              });              this.addAttachment = function (event, data) {                  this.attr.attachments.push(data); +                this.renderAttachmentListView(data); +            }; + +            this.renderAttachmentListView = function (data) { +                var item = this.buildAttachmentListItem(data); +                this.select('attachmentListItem').html(item); +            }; + +            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'; +            } + +            this.buildAttachmentListItem = function (data) { +                return '<a href="' + this.attr.attachmentBaseUrl + '/' + data.attachment_id + '?filename=' + +                    data.filename + '&encoding=base64">' + data.filename + ' (' + humanReadable(data.filesize) + ')' + +                    '</a>'; +            }; + +            function addJqueryFileUploadConfig(self) { +                self.select('inputFileUpload').fileupload({ +                    url: self.attr.attachmentBaseUrl, +                    dataType: 'json', +                    done: function (e, response) { +                        var data = response.result; +                        self.trigger(document, events.mail.uploadedAttachment, data); +                    }, +                    progressall: function (e, data) { +                        var progressRate = parseInt(data.loaded / data.total * 100, 10); +                        self.select('progressBar').css('width', progressRate + '%'); +                    } +                }).bind('fileuploadstart', function (e) { +                    self.trigger(document, events.mail.uploadingAttachment); +                }).bind('fileuploadadd', function (e) { +                    $('.attachmentsAreaWrap').show(); +                }); +            } + +            this.startUpload = function () { +                addJqueryFileUploadConfig(this); +                this.select('inputFileUpload').click();              };              this.after('initialize', function () {                  this.on(document, events.mail.uploadedAttachment, this.addAttachment); +                this.on(document, events.mail.startUploadAttachment, this.startUpload);              });          } -        return attachmentList; + +        return defineComponent(attachmentList);      });
\ No newline at end of file diff --git a/web-ui/app/js/mail_view/ui/attachment.js b/web-ui/app/js/mail_view/ui/attachment.js deleted file mode 100644 index fcb0fe68..00000000 --- a/web-ui/app/js/mail_view/ui/attachment.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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; -                        var link = '<a href="/attachment/'+ data.attachment_id + '?filename='+ data.filename +'&encoding=base64">' + data.filename + ' (' + humanReadable(data.filesize) + ')' + '</a>'; -                        $('#attachment-list-item').html(link); -                        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 + '%'); -                    } -                }).bind('fileuploadstart', function(e) { -                    on.trigger(document, events.mail.uploadingAttachment); -                }).bind('fileuploadadd', function(e) { -                    $('.attachmentsAreaWrap').show(); -                }); -            } - -            this.upload = function () { -                addJqueryFileUploadConfig(this); -                $('#fileupload').click(); -            }; - -            this.after('initialize', function () { -                if (features.isEnabled('attachment')) { -                    this.render(); -                    $('.attachmentsAreaWrap').hide(); -                } -                this.on(this.$node, 'click', this.upload); -            }); - -        }); -    }); diff --git a/web-ui/app/js/mail_view/ui/attachment_icon.js b/web-ui/app/js/mail_view/ui/attachment_icon.js new file mode 100644 index 00000000..802087f8 --- /dev/null +++ b/web-ui/app/js/mail_view/ui/attachment_icon.js @@ -0,0 +1,46 @@ +/* + * 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>'); +            }; + +            this.triggerUploadAttachment = function () { +                this.trigger(document, events.mail.startUploadAttachment); +            }; + +            this.after('initialize', function () { +                if (features.isEnabled('attachment')) { +                    this.render(); +                    $('.attachmentsAreaWrap').hide(); +                } +                this.on(this.$node, 'click', this.triggerUploadAttachment); +            }); + +        }); +    }); 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 993cf880..8e03c081 100644 --- a/web-ui/app/js/mail_view/ui/compose_box.js +++ b/web-ui/app/js/mail_view/ui/compose_box.js @@ -20,14 +20,13 @@ define(      'views/templates',      'mixins/with_mail_edit_base',      'page/events', -    'mail_view/data/mail_builder', -    'mail_view/data/attachment_list' +    'mail_view/data/mail_builder'    ], -  function (defineComponent, templates, withMailEditBase, events, mailBuilder, attachmentList) { +  function (defineComponent, templates, withMailEditBase, events, mailBuilder) {      'use strict'; -    return defineComponent(composeBox, withMailEditBase, attachmentList); +    return defineComponent(composeBox, withMailEditBase);      function composeBox() { 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 1b5e8c52..f00ad5a3 100644 --- a/web-ui/app/js/mixins/with_mail_edit_base.js +++ b/web-ui/app/js/mixins/with_mail_edit_base.js @@ -23,10 +23,11 @@ define(      'page/events',      'views/i18n',      'mail_view/ui/send_button', -    'mail_view/ui/attachment', +    'mail_view/ui/attachment_icon', +    'mail_view/data/attachment_list',      'flight/lib/utils'    ], -  function(viewHelper, Recipients, DraftSaveStatus, events, i18n, SendButton, Attachment, utils) { +  function(viewHelper, Recipients, DraftSaveStatus, events, i18n, SendButton, AttachmentIcon, AttachmentList, utils) {      'use strict';      function withMailEditBase() { @@ -35,6 +36,7 @@ define(          bodyBox: '#text-box',          sendButton: '#send-button',          attachmentButton: '#attachment-button', +        attachmentList: '#attachment-list',          cancelButton: '#cancel-button',          trashButton: '#trash-button',          toArea: '#recipients-to-area', @@ -95,7 +97,8 @@ define(          this.on(this.select('trashButton'), 'click', this.discardMail);          SendButton.attachTo(this.select('sendButton')); -        Attachment.attachTo(this.select('attachmentButton')); +        AttachmentIcon.attachTo(this.select('attachmentButton')); +        AttachmentList.attachTo(this.select('attachmentList'));          this.warnSendButtonOfRecipients();        }; diff --git a/web-ui/app/js/page/events.js b/web-ui/app/js/page/events.js index 85c190bb..406c3b23 100644 --- a/web-ui/app/js/page/events.js +++ b/web-ui/app/js/page/events.js @@ -144,7 +144,8 @@ define(function () {          updated: 'mail:tags:updated'        },        uploadedAttachment: 'mail:uploaded:attachment', -      uploadingAttachment: 'mail:uploading:attachment' +      uploadingAttachment: 'mail:uploading:attachment', +      startUploadAttachment: 'mail:start:upload:attachment'      },      mails: {        available: 'mails:available', diff --git a/web-ui/app/templates/compose/compose_box.hbs b/web-ui/app/templates/compose/compose_box.hbs index d985ed52..c9695c6f 100644 --- a/web-ui/app/templates/compose/compose_box.hbs +++ b/web-ui/app/templates/compose/compose_box.hbs @@ -19,7 +19,7 @@      <textarea class="floatlabel" name="body" id="text-box" placeholder="{{t 'Body'}}" tabindex="5">{{body}}</textarea>  </div> -<div class="buttons-group columns"> +<div id="attachment-list" class="buttons-group columns">      <span class="btn btn-success fileinput-button">          <!-- The file input field used as target for the file upload widget -->          <input id="fileupload" type="file" name="attachment"> diff --git a/web-ui/test/spec/mail_view/data/attachment_list.spec.js b/web-ui/test/spec/mail_view/data/attachment_list.spec.js index 74c1dea7..f1fa0e76 100644 --- a/web-ui/test/spec/mail_view/data/attachment_list.spec.js +++ b/web-ui/test/spec/mail_view/data/attachment_list.spec.js @@ -1,9 +1,11 @@ -describeMixin('mail_view/data/attachment_list', function () { -  'use strict'; +describeComponent('mail_view/data/attachment_list', function () { +    'use strict'; -    describe('initialization', function() { -        beforeEach(function(){ -            this.setupComponent(); +    describe('initialization', function () { +        beforeEach(function () { +            this.setupComponent('<div id="attachment-list">' + +                '<ul><li id="attachment-list-item"> </li></ul>' + +                '</div>');          });          it('should add attachment to the list based on uploadedAttachment event', function () { @@ -16,6 +18,28 @@ describeMixin('mail_view/data/attachment_list', function () {              expect(this.component.attr.attachments).toEqual([stubAttachment, anotherStubAttachment]);          }); +        it('should render attachment list view based on uploadedAttachment event', function () { +            var stubAttachment = {attachment_id: 'faked', filename: 'haha.txt', filesize: 4500}; + +            $(document).trigger(Pixelated.events.mail.uploadedAttachment, stubAttachment); + +            var expected_li = '<a href="/attachment/faked?filename=haha.txt&encoding=base64">haha.txt (4.39 Kb)</a>'; +            expect(this.component.select('attachmentListItem').html()).toEqual(expected_li); +        }); + +        xit('should start uploading attachments', function () { +            var stubAttachment = {attachment_id: 'faked', filename: 'haha.txt', filesize: 4500}; +            var mockAjax = spyOn($, 'ajax').and.callFake(function (params) {params.success(stubAttachment);}); +            var uploadedAttachment = spyOnEvent(document, Pixelated.events.mail.uploadedAttachment); +            var uploading = spyOnEvent(document, Pixelated.events.mail.uploadingAttachment); + +            $(document).trigger(Pixelated.events.mail.startUploadAttachment); + +            expect(mockAjax).toHaveBeenCalled(); +            expect(uploadedAttachment).toHaveBeenTriggeredOnAndWith(document, stubAttachment); +            expect(uploading).toHaveBeenTriggeredOn(document); +        }); +      });  }); diff --git a/web-ui/test/spec/mail_view/ui/attachment.spec.js b/web-ui/test/spec/mail_view/ui/attachment.spec.js index bbea2f55..d29660b9 100644 --- a/web-ui/test/spec/mail_view/ui/attachment.spec.js +++ b/web-ui/test/spec/mail_view/ui/attachment.spec.js @@ -1,4 +1,4 @@ -describeComponent('mail_view/ui/attachment', function () { +describeComponent('mail_view/ui/attachment_icon', function () {    'use strict';    describe('attachment', function () { @@ -7,14 +7,14 @@ describeComponent('mail_view/ui/attachment', function () {          this.setupComponent();      }); -    it('render attachment button if feature enabled', function () { +    it('should render attachment button if feature enabled', function () {          expect(this.$node.html()).toMatch('<i class="fa fa-paperclip fa-2x"></i>');      }); -    xit('uploads attachment on click', function () { -        var fileUploads = spyOn($, 'fileupload'); +    it('should trigger starts of attachment upload process', function () { +        var triggerUploadAttachment = spyOnEvent(document, Pixelated.events.mail.startUploadAttachment);          this.$node.click(); -        expect(fileUploads).toHaveBeenCalled(); +        expect(triggerUploadAttachment).toHaveBeenTriggeredOn(document);      });    }); | 
