add backbone radio for advanced event and req/resp handling

This commit is contained in:
Christoph Wurst 2016-02-06 11:35:44 +01:00
Родитель 067695279b
Коммит d9aa138a34
13 изменённых файлов: 79 добавлений и 69 удалений

Просмотреть файл

@ -24,6 +24,7 @@
"jquery-visibility": "~1.0.11",
"requirejs": "~2.1.20",
"text": "requirejs-text#~2.0.14",
"underscore": "~1.8.3"
"underscore": "~1.8.3",
"backbone.radio": "^1.0.2"
}
}

Просмотреть файл

@ -12,10 +12,6 @@ define(function(require) {
'use strict';
var Marionette = require('marionette');
var AccountController = require('controller/accountcontroller');
var FolderController = require('controller/foldercontroller');
var AccountService = require('service/accountservice');
var FolderService = require('service/folderservice');
var AppView = require('views/app');
var SettingsView = require('views/settings');
var NavigationView = require('views/navigation');
@ -26,63 +22,12 @@ define(function(require) {
var Mail = new Marionette.Application();
var State = require('state');
var UI = require('ui');
/**
* Set up view
*/
Mail.view = new AppView();
/*
* Set up event handler
*/
Mail.on('accounts:load', function() {
Mail.Controller.accountController.loadAccounts();
});
Mail.on('folder:init', function(accountId, activeId) {
Mail.Controller.folderController.loadFolder(accountId, activeId);
});
Mail.on('folder:load', function(accountId, folderId, noSelect) {
UI.loadFolder(accountId, folderId, noSelect);
});
Mail.on('message:load', function(accountId, folderId, messageId, options) {
//FIXME: don't rely on global state vars
UI.loadMessage(messageId, options);
});
Mail.on('ui:menu:show', function() {
UI.showMenu();
});
Mail.on('ui:menu:hide', function() {
UI.hideMenu();
});
/**
* Set up controllers
*/
Mail.Controller = {};
Mail.Controller.accountController = AccountController;
Mail.Controller.folderController = FolderController;
/**
* Set up services
*/
Mail.Service = {};
Mail.Service.accountService = AccountService;
Mail.Service.folderService = FolderService;
/*
* Set up request/response handler
*/
Mail.reqres.setHandler('account:create', function(config) {
return Mail.Service.accountService.createAccount(config);
});
Mail.reqres.setHandler('account:entities', function() {
return Mail.Service.accountService.getAccountEntities();
});
Mail.reqres.setHandler('folder:entities', function(accountId) {
return Mail.Service.folderService.getFolderEntities(accountId);
});
Mail.on('before:start', function() {
// Render settings menu
this.view.navigation = new NavigationView();

Просмотреть файл

@ -14,6 +14,7 @@ define(function(require) {
'use strict';
var OC = require('OC');
var Radio = require('radio');
/*jshint maxparams: 6 */
function showNotification(title, body, tag, icon, accountId, folderId) {
@ -35,7 +36,7 @@ define(function(require) {
}
);
notification.onclick = function() {
require('app').trigger('folder:load', accountId, folderId, false);
Radio.ui.trigger('folder:load', accountId, folderId, false);
window.focus();
};
setTimeout(function() {

Просмотреть файл

@ -12,9 +12,12 @@ define(function(require) {
'use strict';
var $ = require('jquery');
var Radio = require('radio');
Radio.account.on('load', loadAccounts);
function loadAccounts() {
var fetchingAccounts = require('app').request('account:entities');
var fetchingAccounts = Radio.account.request('entities');
var UI = require('ui');
$.when(fetchingAccounts).done(function(accounts) {
@ -23,7 +26,7 @@ define(function(require) {
} else {
var firstAccountId = accounts.at(0).get('accountId');
accounts.each(function(a) {
require('app').trigger('folder:init', a.get('accountId'), firstAccountId);
Radio.folder.trigger('init', a.get('accountId'), firstAccountId);
});
}
});

Просмотреть файл

@ -13,6 +13,9 @@ define(function(require) {
var $ = require('jquery');
var _ = require('underscore');
var Radio = require('radio');
Radio.folder.on('init', loadFolder);
function urldecode(str) {
return decodeURIComponent((str + '').replace(/\+/g, '%20'));
@ -66,7 +69,7 @@ define(function(require) {
}
function loadFolder(accountId, activeId) {
var fetchingFolders = require('app').request('folder:entities', accountId);
var fetchingFolders = Radio.folder.request('entities', accountId);
var UI = require('ui');
// TODO: create loading-view
@ -86,7 +89,7 @@ define(function(require) {
if (accountId === activeId) {
var folderId = accountFolders.folders[0].id;
require('app').trigger('folder:load', accountId, folderId, false);
Radio.ui.trigger('folder:load', accountId, folderId, false);
// Open composer if 'mailto' url-param is set
handleMailTo();

37
js/radio.js Normal file
Просмотреть файл

@ -0,0 +1,37 @@
/**
* ownCloud - Mail
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @copyright Christoph Wurst 2016
*/
define(function(require) {
'use strict';
var Radio = require('backbone.radio');
var uiChannel = Radio.channel('ui');
var stateChannel = Radio.channel('state');
var accountChannel = Radio.channel('account');
var folderChannel = Radio.channel('folder');
var messageChannel = Radio.channel('message');
var channels = {
ui: uiChannel,
state: stateChannel,
account: accountChannel,
folder: folderChannel,
message: messageChannel
};
// Log all events to the console
for (var channelName in channels) {
Radio.tuneIn(channelName);
}
return channels;
});

Просмотреть файл

@ -20,6 +20,7 @@
* Libraries
*/
backbone: 'vendor/backbone/backbone',
'backbone.radio': 'vendor/backbone.radio/build/backbone.radio',
domready: 'vendor/domready/ready.min',
handlebars: 'vendor/handlebars/handlebars',
marionette: 'vendor/backbone.marionette/lib/backbone.marionette',

Просмотреть файл

@ -13,6 +13,10 @@ define(function(require) {
var $ = require('jquery');
var OC = require('OC');
var Radio = require('radio');
Radio.account.reply('create', createAccount);
Radio.account.reply('entities', getAccountEntities);
function createAccount(config) {
var defer = $.Deferred();

Просмотреть файл

@ -13,6 +13,9 @@ define(function(require) {
var $ = require('jquery');
var OC = require('OC');
var Radio = require('radio');
Radio.folder.reply('entities', getFolderEntities);
function getFolderEntities(accountId) {
var defer = $.Deferred();

Просмотреть файл

@ -17,6 +17,7 @@ define(function(require) {
var Handlebars = require('handlebars');
var Marionette = require('marionette');
var OC = require('OC');
var Radio = require('radio');
var MessagesView = require('views/messages');
var NavigationAccountsView = require('views/navigation-accounts');
var ComposerView = require('views/composer');
@ -24,6 +25,14 @@ define(function(require) {
require('views/helper');
require('settings');
Radio.ui.on('menu:show', showMenu);
Radio.ui.on('menu:hide', hideMenu);
Radio.ui.on('folder:load', loadFolder);
Radio.ui.on('message:load', function(accountId, folderId, messageId, options) {
//FIXME: don't rely on global state vars
loadMessage(messageId, options);
});
var messageView = null;
var composer = null;
var composerVisible = false;
@ -161,7 +170,7 @@ define(function(require) {
});
setInterval(require('background').checkForNotifications, 5 * 60 * 1000);
require('app').trigger('accounts:load');
Radio.account.trigger('load');
}
function showError(message) {
@ -688,7 +697,7 @@ define(function(require) {
$('#mail_new_message').addClass('hidden');
$('#app-navigation').removeClass('icon-loading');
require('app').trigger('ui:menu:hide');
Radio.ui.trigger('menu:hide');
$('#setup').removeClass('hidden');
// don't show New Message button on Add account screen

Просмотреть файл

@ -13,6 +13,7 @@ define(function(require) {
var Backbone = require('backbone');
var Handlebars = require('handlebars');
var Radio = require('radio');
var FolderTemplate = require('text!templates/folder.html');
return Backbone.Marionette.ItemView.extend({
@ -33,7 +34,7 @@ define(function(require) {
var accountId = this.model.get('accountId');
var folderId = $(e.currentTarget).parent().data('folder_id');
var noSelect = $(e.currentTarget).parent().data('no_select');
require('app').trigger('folder:load', accountId, folderId, noSelect);
Radio.ui.trigger('folder:load', accountId, folderId, noSelect);
},
onRender: function() {
// Get rid of that pesky wrapping-div.

Просмотреть файл

@ -14,6 +14,7 @@ define(function(require) {
var Handlebars = require('handlebars');
var Marionette = require('marionette');
var OC = require('OC');
var Radio = require('radio');
var MessageTemplate = require('text!templates/message-list-item.html');
return Marionette.ItemView.extend({
@ -73,7 +74,7 @@ define(function(require) {
var accountId = require('state').currentAccountId;
var folderId = require('state').currentFolderId;
var messageId = this.model.id; //TODO: backbone property
require('app').trigger('message:load', accountId, folderId, messageId, {
Radio.ui.trigger('message:load', accountId, folderId, messageId, {
force: true
});
},
@ -101,7 +102,7 @@ define(function(require) {
var accountId = require('state').currentAccountId;
var folderId = require('state').currentFolderId;
var messageId = nextMessage.id; //TODO: backbone property
require('app').trigger('message:load', accountId, folderId, messageId);
Radio.ui.trigger('message:load', accountId, folderId, messageId);
}
}
// manually trigger mouseover event for current mouse position

Просмотреть файл

@ -15,6 +15,7 @@ define(function(require) {
var _ = require('underscore');
var Marionette = require('marionette');
var Handlebars = require('handlebars');
var Radio = require('radio');
var SetupTemplate = require('text!templates/setup.html');
return Marionette.ItemView.extend({
@ -126,12 +127,12 @@ define(function(require) {
}
this.loading = true;
var creatingAccount = require('app').request('account:create', config);
var creatingAccount = Radio.account.request('create', config);
$.when(creatingAccount).done(function() {
Mail.trigger('ui:menu:show');
Radio.ui.trigger('menu:show');
// reload accounts
Mail.trigger('accounts:load');
Radio.account.trigger('load');
});
$.when(creatingAccount).fail(function(error) {