Ejemplo n.º 1
0
					success: function() {
						if (typeof attachmentId === 'undefined') {
							Radio.ui.trigger('error:show', t('mail', 'Attachments saved to Files.'));
						} else {
							Radio.ui.trigger('error:show', t('mail', 'Attachment saved to Files.'));
						}
					},
Ejemplo n.º 2
0
					error: function() {
						if (typeof attachmentId === 'undefined') {
							Radio.ui.trigger('error:show', t('mail', 'Error while saving attachments to Files.'));
						} else {
							Radio.ui.trigger('error:show', t('mail', 'Error while saving attachment to Files.'));
						}
					},
Ejemplo n.º 3
0
		onShowMessage: function(message) {
			// Temporarily disable new-message composer events
			Radio.ui.trigger('composer:events:undelegate');

			var messageModel = new Backbone.Model(message);
			this.message.show(new MessageView({model: messageModel}));
			this.detailView = DetailView.MESSAGE;

			Radio.ui.trigger('messagesview:messageflag:set', message.id, 'unseen', false);
		},
Ejemplo n.º 4
0
				onSuccess: function(message) {
					if (draft) {
						Radio.ui.trigger('composer:show', message);
					} else {
						require('cache').addMessage(require('state').currentAccount,
							require('state').currentFolder,
							message);
						Radio.ui.trigger('message:show', message);
					}
				},
Ejemplo n.º 5
0
		$.when(fetchingMessage).done(function(message) {
			if (draft) {
				Radio.ui.trigger('composer:show', message);
			} else {
				// TODO: ideally this should be handled in messageservice.js
				require('cache').addMessage(require('state').currentAccount,
					require('state').currentFolder,
					message);
				Radio.ui.trigger('message:show', message);
			}
		});
Ejemplo n.º 6
0
		showAccountSettings: function(accountId) {
			this._navigate('accounts/' + accountId + '/settings');
			var account = this.accounts.get(accountId);
			if (_.isUndefined(account)) {
				// Unknown account id -> redirect
				Radio.ui.trigger('error:show', t('mail', 'Invalid account'));
				this.default();
				return;
			}
			Radio.ui.trigger('navigation:hide');
			Radio.ui.trigger('accountsettings:show', account);
		}
Ejemplo n.º 7
0
		onShowComposer: function(data) {
			$('.tipsy').remove();
			$('#mail_new_message').prop('disabled', true);
			$('#mail-message').removeClass('hidden-mobile');

			// Abort message loads
			if (require('state').messageLoading !== null) {
				require('state').messageLoading.abort();
				$('iframe').parent().removeClass('icon-loading');
				$('#mail-message').removeClass('icon-loading');
				$('#mail_message').removeClass('icon-loading');
			}

			// setup composer view
			this.message.show(new ComposerView({
				onSubmit: require('communication').sendMessage,
				onDraft: require('communication').saveDraft,
				accounts: require('state').accounts
			}));
			this.detailView = DetailView.COMPOSER;
			this.composer = this.message.currentView;

			if (data && data.hasHtmlBody) {
				Radio.ui.trigger('error:show', t('mail', 'Opening HTML drafts is not supported yet.'));
			}

			// TODO: pass data when initializing
			this.composer.render({
				data: data
			});

			// set 'from' dropdown to current account
			// TODO: fix selector conflicts
			if (require('state').currentAccount.get('accountId') !== -1) {
				$('.mail-account').val(require('state').currentAccount.get('accountId'));
			}

			// focus 'to' field automatically on clicking New message button
			this.composer.focusTo();

			if (data && !_.isUndefined(data.currentTarget) && !_.isUndefined($(data.currentTarget).
				data().email)) {
				var to = '"' + $(data.currentTarget).
					data().label + '" <' + $(data.currentTarget).data().email + '>';
				this.composer.setTo(to);
				this.composer.focusSubject();
			}

			Radio.ui.trigger('messagesview:message:setactive', null);
		},
Ejemplo n.º 8
0
		}).then(function(accounts) {
			// Show accounts regardless of the result of
			// loading the folders
			Radio.ui.trigger('sidebar:accounts');

			return accounts;
		}, function(e) {
Ejemplo n.º 9
0
	/**
	 * Load all accounts
	 *
	 * @returns {Promise}
	 */
	function loadAccounts() {
		// Do not show sidebar content until everything has been loaded
		Radio.ui.trigger('sidebar:loading');

		return Radio.account.request('entities').then(function(accounts) {
			if (accounts.length === 0) {
				Radio.navigation.trigger('setup');
				Radio.ui.trigger('sidebar:accounts');
				return Promise.resolve(accounts);
			}

			return Promise.all(accounts.map(function(account) {
				return FolderController.loadAccountFolders(account);
			})).then(function() {
				return accounts;
			});
		}).then(function(accounts) {
			// Show accounts regardless of the result of
			// loading the folders
			Radio.ui.trigger('sidebar:accounts');

			return accounts;
		}, function(e) {
			console.error(e);
			Radio.ui.trigger('error:show', t('mail', 'Error while loading the accounts.'));
		});
	}
Ejemplo n.º 10
0
Archivo: state.js Proyecto: Aejoh/mail
			set: function(newFolder) {
				var oldFolder = currentFolder;
				currentFolder = newFolder;
				if (newFolder !== oldFolder) {
					Radio.ui.trigger('folder:changed');
				}
			}
Ejemplo n.º 11
0
			this.$el.addClass('transparency').slideUp(function() {
				$('.tipsy').remove();
				$('.tooltip').remove();

				var thisModelCollection = thisModel.collection;
				var index = thisModelCollection.indexOf(thisModel);
				var nextMessage = thisModelCollection.at(index - 1);
				if (!nextMessage) {
					nextMessage = thisModelCollection.at(index + 1);
				}
				thisModelCollection.remove(thisModel);
				if (require('state').currentMessageId === thisModel.id) {
					if (nextMessage) {
						var account = require('state').currentAccount;
						var folder = require('state').currentFolder;
						var messageId = nextMessage.id; //TODO: backbone property
						Radio.ui.trigger('message:load', account, folder, messageId);
					}
				}
				// manually trigger mouseover event for current mouse position
				// in order to create a tipsy for the next message if needed
				if (event.clientX) {
					$(document.elementFromPoint(event.clientX, event.clientY)).trigger('mouseover');
				}
			});
Ejemplo n.º 12
0
		_handleMailto: function(params) {
			var composerOptions = {};
			params = params.split('&');

			_.each(params, function(param) {
				param = param.split('=');
				var key = param[0];
				var value = param[1];
				value = decodeURIComponent((value).replace(/\+/g, '%20'));

				switch (key) {
					case 'mailto':
					case 'to':
						composerOptions.to = value;
						break;
					case 'cc':
						composerOptions.cc = value;
						break;
					case 'bcc':
						composerOptions.bcc = value;
						break;
					case 'subject':
						composerOptions.subject = value;
						break;
					case 'body':
						composerOptions.body = value;
						break;
				}
			});

			this.default();
			Radio.ui.trigger('composer:show', composerOptions);
		},
Ejemplo n.º 13
0
			$.when(loadingMessages).fail(function() {
				Radio.ui.trigger('error:show', t('mail', 'Error while loading messages.'));
				// Set the old folder as being active
				var account = require('state').currentAccount;
				var folder = require('state').currentFolder;
				Radio.folder.trigger('setactive', account, folder);
			});
Ejemplo n.º 14
0
			$.when(loadingMessages).done(function(jsondata) {
				if (reload) {
					_this.collection.reset();
				}
				// Add messages
				_this.collection.add(jsondata);
				Radio.ui.trigger('messagesview:message:setactive', require('state').currentMessageId);
			});
Ejemplo n.º 15
0
				onError: function(error, textStatus) {
					if (textStatus !== 'abort') {
						// Set the old folder as being active
						var folder = require('state').currentFolder;
						Radio.folder.trigger('setactive', account, folder);
						Radio.ui.trigger('error:show', t('mail', 'Error while loading messages.'));
					}
				},
Ejemplo n.º 16
0
			success: function(data) {
				if (!_.isNull(options.messageId)) {
					// Reply -> flag message as replied
					Radio.ui.trigger('messagesview:messageflag:set', options.messageId, 'answered', true);
				}

				defer.resolve(data);
			},
Ejemplo n.º 17
0
		openMessage: function(event) {
			event.stopPropagation();
			$('#mail-message').removeClass('hidden-mobile');
			var account = require('state').currentAccount;
			var folder = require('state').currentFolder;
			var messageId = this.model.id; //TODO: backbone property
			Radio.ui.trigger('message:load', account, folder, messageId, {
				force: true
			});
		},
Ejemplo n.º 18
0
				onSuccess: function(messages, cached) {
					require('state').currentlyLoading = null;
					require('state').currentAccount = account;
					require('state').currentFolder = folder;
					Radio.ui.trigger('messagesview:message:setactive', null);
					$('#mail-messages').removeClass('icon-loading');

					// Fade out the message composer
					$('#mail_new_message').prop('disabled', false);

					if (messages.length > 0) {
						Radio.ui.trigger('messagesview:messages:add', messages);

						// Fetch first 10 messages in background
						_.each(messages.slice(0, 10), function(
							message) {
							require('background').messageFetcher.push(message.id);
						});

						var messageId = messages[0].id;
						loadMessage(account, messageId);
						// Show 'Load More' button if there are
						// more messages than the pagination limit
						if (messages.length > 20) {
							$('#load-more-mail-messages')
								.fadeIn()
								.css('display', 'block');
						}
					} else {
						$('#emptycontent').show();
						$('#mail-message').removeClass('icon-loading');
					}
					$('#load-new-mail-messages')
						.fadeIn()
						.css('display', 'block')
						.prop('disabled', false);

					if (cached) {
						// Trigger folder update
						// TODO: replace with horde sync once it's implemented
						Radio.ui.trigger('messagesview:messages:update');
					}
				},
Ejemplo n.º 19
0
		showFolder: function(accountId, folderId, showComposer) {
			this._navigate('accounts/' + accountId + '/folders/' + folderId);
			var _this = this;
			var account = this.accounts.get(accountId);
			if (_.isUndefined(account)) {
				// Unknown account id -> redirect
				Radio.ui.trigger('error:show', t('mail', 'Invalid account'));
				return _this.default();
			}

			var folder = account.getFolderById(folderId);
			if (_.isUndefined(folder)) {
				folder = account.folders.at(0);
				Radio.ui.trigger('error:show', t('mail', 'Invalid folder'));
				this._navigate('accounts/' + accountId + '/folders/' + folder.get('id'));
				return Promise.resolve();
			}
			return FolderController.showFolder(account, folder, !showComposer);
		},
Ejemplo n.º 20
0
			Radio.message.request('delete', account, folder, this.model).catch(function() {
				// TODO: move to controller
				Radio.ui.trigger('error:show', t('mail', 'Error while deleting message.'));

				// Restore counter
				count = folder.get('total');
				folder.set('total', count + 1);

				// Add the message to the collection again
				folder.addMessage(this.model);
			});
Ejemplo n.º 21
0
			Radio.dav.request('calendars').then(function(calendars) {
				if (calendars.length > 0) {
					_this.getUI('attachmentImportPopover').addClass('open');
					var calendarsView = new CalendarsPopoverView({
						collection: calendars
					});
					calendarsView.render();
					_this.getUI('attachmentImportPopover').html(calendarsView.$el);
				} else {
					Radio.ui.trigger('error:show', t('mail', 'No writable calendars found'));
				}
			}).catch(console.error.bind(this)).then(function() {
Ejemplo n.º 22
0
				success: function(data) {
					if (options.draftUID !== null) {
						// update UID in message list
						var collection = Radio.ui.request('messagesview:collection');
						var message = collection.findWhere({id: options.draftUID});
						if (message) {
							message.set({id: data.uid});
							collection.set([message], {remove: false});
						}
					}
					defer.resolve(data);
				},
Ejemplo n.º 23
0
	Mail.on('start', function() {
		this.view = new AppView();
		Cache.init();

		Radio.ui.trigger('content:loading');

		this.registerProtocolHandler();
		this.requestNotificationPermissions();
		this.setUpSearch();

		$.when(AccountController.loadAccounts()).done(function(accounts) {
			$('#app-navigation').removeClass('icon-loading');

			// Start fetching messages in background
			require('background').messageFetcher.start();

			this.router = new Router({
				controller: new RouteController(accounts)
			});
			Backbone.history.start();
		});

		/**
		 * Detects pasted text by browser plugins, and other software.
		 * Check for changes in message bodies every second.
		 */
		setInterval((function() {
			// Begin the loop.
			return function() {

				// Define which elements hold the message body.
				var MessageBody = $('.message-body');

				/**
				 * If the message body is displayed and has content:
				 * Prepare the message body content for processing.
				 * If there is new message body content to process:
				 * Resize the text area.
				 * Toggle the send button, based on whether the message is ready or not.
				 * Prepare the new message body content for future processing.
				 */
				if (MessageBody.val()) {
					var OldMessageBody = MessageBody.val();
					var NewMessageBody = MessageBody.val();
					if (NewMessageBody !== OldMessageBody) {
						MessageBody.trigger('autosize.resize');
						OldMessageBody = NewMessageBody;
					}
				}
			};
		})(), 1000);
	});
Ejemplo n.º 24
0
		return Radio.account.request('entities').then(function(accounts) {
			if (accounts.length === 0) {
				Radio.navigation.trigger('setup');
				Radio.ui.trigger('sidebar:accounts');
				return Promise.resolve(accounts);
			}

			return Promise.all(accounts.map(function(account) {
				return FolderController.loadAccountFolders(account);
			})).then(function() {
				return accounts;
			});
		}).then(function(accounts) {
Ejemplo n.º 25
0
		searchFolder: function(accountId, folderId, query) {
			if (!query || query === '') {
				this.showFolder(accountId, folderId);
				return;
			}

			this._navigate('accounts/' + accountId + '/folders/' + folderId + '/search/' + query);
			var account = this.accounts.get(accountId);
			if (_.isUndefined(account)) {
				// Unknown account id -> redirect
				Radio.ui.trigger('error:show', t('mail', 'Invalid account'));
				this.default();
				return;
			}

			var folder = account.getFolderById(folderId);
			if (_.isUndefined(folder)) {
				folder = account.folders.at(0);
				Radio.ui.trigger('error:show', t('mail', 'Invalid folder'));
				this._navigate('accounts/' + accountId + '/folders/' + folder.get('id'));
			}
			FolderController.searchFolder(account, folder, query);
		},
Ejemplo n.º 26
0
		initialize: function(options) {
			this.searchQuery = options.searchQuery;

			var _this = this;
			this.on('dom:refresh', this._bindScrollEvents);
			Radio.ui.reply('messagesview:collection', function() {
				return _this.collection;
			});
			this.listenTo(Radio.ui, 'messagesview:messages:update', this.refresh);
			this.listenTo(Radio.ui, 'messagesview:messageflag:set', this.setMessageFlag);
			this.listenTo(Radio.ui, 'messagesview:filter', this.filterCurrentMailbox);
			this.listenTo(Radio.ui, 'messagesview:message:setactive', this.setActiveMessage);
			this.listenTo(Radio.message, 'messagesview:message:next', this.selectNextMessage);
			this.listenTo(Radio.message, 'messagesview:message:prev', this.selectPreviousMessage);
		},
Ejemplo n.º 27
0
		initialize: function() {
			this.collection = new MessageCollection();
			this.collection.on('change:flags', this.changeFlags, this);

			var _this = this;
			Radio.ui.reply('messagesview:collection', function() {
				return _this.collection;
			});
			this.listenTo(Radio.ui, 'messagesview:messages:update', this.loadNew);
			this.listenTo(Radio.ui, 'messagesview:messages:reset', this.reset);
			this.listenTo(Radio.ui, 'messagesview:messages:add', this.addMessages);
			this.listenTo(Radio.ui, 'messagesview:messageflag:set', this.setMessageFlag);
			this.listenTo(Radio.ui, 'messagesview:filter', this.filterCurrentMailbox);
			this.listenTo(Radio.ui, 'messagesview:filter:clear', this.clearFilter);
			this.listenTo(Radio.ui, 'messagesview:message:setactive', this.setActiveMessage);
		},
Ejemplo n.º 28
0
	/**
	 * @returns {undefined}
	 */
	function openForwardComposer() {
		var header = '\n\n\n\n-------- ' +
			t('mail', 'Forwarded message') +
			' --------\n';

		// TODO: find a better way to get the current message body
		var data = {
			subject: 'Fwd: ' + require('state').currentMessageSubject,
			body: header + require('state').currentMessageBody.replace(/<br \/>/g, '\n')
		};

		if (require('state').currentAccount.get('accountId') !== -1) {
			data.accountId = require('state').currentAccount.get('accountId');
		}

		Radio.ui.trigger('composer:show', data);
	}
Ejemplo n.º 29
0
		onComposerLeave: function() {
			// TODO: refactor 'composer:leave' as it's buggy

			// Trigger only once
			if (this.detailView === DetailView.COMPOSER) {
				this.detailView = null;

				if (this.composer && this.composer.hasData === true) {
					if (this.composer.hasUnsavedChanges === true) {
						this.composer.saveDraft(function() {
							Radio.ui.trigger('notification:show', t('mail', 'Draft saved!'));
						});
					} else {
						Radio.ui.trigger('notification:show', t('mail', 'Draft saved!'));
					}
				}
			}
		}
Ejemplo n.º 30
0
		setFolderActive: function(accountId, folderId) {
			Radio.ui.trigger('messagesview:filter:clear');

			// disable all other folders for all accounts
			require('state').accounts.each(function(account) {
				var localAccount = require('state').folderView.collection.get(account.get('accountId'));
				if (_.isUndefined(localAccount)) {
					return;
				}
				var folders = localAccount.get('folders');
				_.each(folders.models, function(folder) {
					folders.get(folder).set('active', false);
				});
			});

			require('state').folderView.getFolderById(accountId, folderId)
				.set('active', true);
		},