summaryrefslogtreecommitdiff
path: root/web-ui/app/js/mail_view/ui/recipients/recipients.js
blob: 86f9b9d35b5caa8d1e1ab0356c0be281eac3fc4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*global _ */

define(
  [
    'flight/lib/component',
    'views/templates',
    'page/events',
    'mail_view/ui/recipients/recipients_input',
    'mail_view/ui/recipients/recipient',
    'mail_view/ui/recipients/recipients_iterator'
  ],
  function (defineComponent, templates, events, RecipientsInput, Recipient, RecipientsIterator) {
    'use strict';

    return defineComponent(recipients);

    function recipients() {
      this.defaultAttrs({
        navigationHandler: '.recipients-navigation-handler'
      });

      function getAddresses(recipients) {
        return _.flatten(_.map(recipients, function (e) { return e.attr.address;}));
      }

      function moveLeft() { this.attr.iterator.moveLeft(); }
      function moveRight() { this.attr.iterator.moveRight(); }
      function deleteCurrentRecipient() {
        this.attr.iterator.deleteCurrent();
        this.addressesUpdated();
      }

      var SPECIAL_KEYS_ACTIONS = {
        8: deleteCurrentRecipient,
        46: deleteCurrentRecipient,
        37: moveLeft,
        39: moveRight
      };

      this.addRecipient = function(recipient) {
        var newRecipient = Recipient.prototype.renderAndPrepend(this.$node, recipient);
        this.attr.recipients.push(newRecipient);
      };

      this.recipientEntered = function (event, recipient) {
        this.addRecipient(recipient);
        this.addressesUpdated();
      };

      this.deleteLastRecipient = function () {
        this.attr.recipients.pop().destroy();
        this.addressesUpdated();
      };

      this.enterNavigationMode = function () {
        this.attr.iterator = new RecipientsIterator({
          elements: this.attr.recipients,
          exitInput: this.attr.input.$node
        });

        this.attr.iterator.current().select();
        this.attr.input.$node.blur();
        this.select('navigationHandler').focus();
      };

      this.leaveNavigationMode = function () {
        if(this.attr.iterator) { this.attr.iterator.current().unselect(); }
        this.attr.iterator = null;
      };

      this.selectLastRecipient = function () {
        if (this.attr.recipients.length === 0) { return; }
        this.enterNavigationMode();
      };

      this.attachInput = function () {
        this.attr.input = RecipientsInput.prototype.attachAndReturn(this.$node.find('input[type=text]'), this.attr.name);
      };

      this.processSpecialKey = function (event) {
        if(SPECIAL_KEYS_ACTIONS.hasOwnProperty(event.which)) { SPECIAL_KEYS_ACTIONS[event.which].apply(this); }
      };

      this.initializeAddresses = function () {
        _.each(_.flatten(this.attr.addresses), function (address) {
          this.addRecipient({ address: address, name: this.attr.name });
        }.bind(this));
      };

      this.addressesUpdated = function() {
        this.trigger(document, events.ui.recipients.updated, {recipientsName: this.attr.name, newRecipients: getAddresses(this.attr.recipients)});
      };

      this.doCompleteRecipients = function () {
        var address = this.attr.input.$node.val();
        if (!_.isEmpty(address)) {
          var recipient = Recipient.prototype.renderAndPrepend(this.$node, { name: this.attr.name, address: address });
          this.attr.recipients.push(recipient);
          this.attr.input.$node.val('');
        }

        this.trigger(document, events.ui.recipients.updated, {
          recipientsName: this.attr.name,
          newRecipients: getAddresses(this.attr.recipients),
          skipSaveDraft: true
        });

      };

      this.after('initialize', function () {
        this.attr.recipients = [];
        this.attachInput();
        this.initializeAddresses();

        this.on(events.ui.recipients.deleteLast, this.deleteLastRecipient);
        this.on(events.ui.recipients.selectLast, this.selectLastRecipient);
        this.on(events.ui.recipients.entered, this.recipientEntered);

        this.on(document, events.ui.recipients.doCompleteInput, this.doCompleteRecipients);

        this.on(this.attr.input.$node, 'focus', this.leaveNavigationMode);
        this.on(this.select('navigationHandler'), 'keydown', this.processSpecialKey);

        this.on(document, events.dispatchers.rightPane.clear, this.teardown);
      });
    }
  });