From 12e89e23e6989a074be19f5a59cc89d541612a43 Mon Sep 17 00:00:00 2001 From: Ben Langfeld Date: Sat, 29 Aug 2015 19:31:21 -0300 Subject: Use Webpack for packaging With Babel for ES6 imports/exports --- .jshintrc | 3 +- Gruntfile.js | 47 +++++------ package.json | 7 +- src/candy.js | 16 +++- src/core.js | 26 +++++- src/core/action.js | 11 ++- src/core/chatRoom.js | 24 +++--- src/core/chatRoster.js | 20 ++--- src/core/chatUser.js | 73 +++++++++-------- src/core/contact.js | 35 ++++---- src/core/event.js | 184 ++++++++++++++++++++++--------------------- src/util.js | 6 +- src/view.js | 29 ++++++- src/view/observer.js | 4 +- src/view/pane/chat.js | 45 ++++++----- src/view/pane/message.js | 30 ++++--- src/view/pane/privateRoom.js | 44 ++++++----- src/view/pane/room.js | 105 ++++++++++++------------ src/view/pane/roster.js | 48 ++++++----- src/view/pane/window.js | 13 ++- src/view/template.js | 6 +- src/view/translation.js | 4 +- tests/candy/unit/candy.js | 2 +- tests/candy/unit/util.js | 4 +- 24 files changed, 452 insertions(+), 334 deletions(-) diff --git a/.jshintrc b/.jshintrc index 6a2ea00..45b36fd 100644 --- a/.jshintrc +++ b/.jshintrc @@ -10,5 +10,6 @@ "trailing": true, "maxdepth": 5, "laxcomma": true, - "browser": true + "browser": true, + "esnext": true } diff --git a/Gruntfile.js b/Gruntfile.js index d8a253e..072bfc4 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -24,29 +24,31 @@ module.exports = function(grunt) { ] } }, - uglify: { - bundle: { - files: { - 'candy.bundle.js': [ - 'src/candy.js', 'src/core.js', 'src/view.js', - 'src/util.js', 'src/core/action.js', - 'src/core/chatRoom.js', 'src/core/chatRoster.js', - 'src/core/chatUser.js', 'src/core/contact.js', - 'src/core/event.js', 'src/view/observer.js', - 'src/view/pane/chat.js', 'src/view/pane/message.js', - 'src/view/pane/privateRoom.js', 'src/view/pane/room.js', - 'src/view/pane/roster.js', 'src/view/pane/window.js', - 'src/view/template.js', 'src/view/translation.js' - ] + webpack: { + all: { + entry: './src/candy.js', + output: { + path: ".", + filename: "candy.bundle.js", + libraryTarget: "var", + library: "Candy" }, - options: { - sourceMap: true, - mangle: false, - compress: false, - beautify: true, - preserveComments: 'all' + externals: { + "jquery": "jQuery", + "strophe": "Strophe", + "mustache": "Mustache" + }, + module: { + loaders: [ + { + test: /.*/, + loader: 'babel-loader' + } + ] } }, + }, + uglify: { min: { files: { 'candy.min.js': ['candy.bundle.js'] @@ -92,7 +94,7 @@ module.exports = function(grunt) { }, bundle: { files: ['src/**/*.js'], - tasks: ['todo:src', 'jshint', 'uglify:bundle', 'uglify:min', 'notify:bundle', 'intern:unit'] + tasks: ['todo:src', 'jshint', 'webpack:all', 'uglify:min', 'notify:bundle', 'intern:unit'] }, libs: { files: ['bower_components/*/**/*.js', 'vendor_libs/*/**/*.js'], @@ -258,10 +260,11 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-clear'); grunt.loadNpmTasks('grunt-coveralls'); grunt.loadNpmTasks('grunt-todo'); + grunt.loadNpmTasks('grunt-webpack'); grunt.registerTask('test', ['intern:all']); grunt.registerTask('ci', ['todo', 'jshint', 'build', 'intern:all', 'coveralls:all', 'docs']); - grunt.registerTask('build', ['uglify:libs', 'uglify:libs-min', 'uglify:bundle', 'uglify:min']); + grunt.registerTask('build', ['uglify:libs', 'uglify:libs-min', 'webpack:all', 'uglify:min']); grunt.registerTask('default', [ 'jshint', 'build', 'notify:default', 'intern:unit' ]); diff --git a/package.json b/package.json index f769158..f2d1fee 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,8 @@ }, "homepage": "http://candy-chat.github.io/candy/", "devDependencies": { + "babel-core": "^5.8.23", + "babel-loader": "^5.3.2", "grunt": "^0.4.5", "grunt-clear": "^0.2.1", "grunt-contrib-clean": "^0.5.0", @@ -54,10 +56,13 @@ "grunt-prompt": "^1.3.0", "grunt-sync-pkg": "^0.1.2", "grunt-todo": "~0.4.0", + "grunt-webpack": "^1.0.11", "intern": "^3.0.0", "jshint-stylish": "^0.2.0", "lolex": "^1.2.0", "sinon": "^1.10.3", - "sinon-chai": "^2.5.0" + "sinon-chai": "^2.5.0", + "webpack": "^1.12.0", + "webpack-dev-server": "^1.10.1" } } diff --git a/src/candy.js b/src/candy.js index c7b2bc0..e4a338e 100644 --- a/src/candy.js +++ b/src/candy.js @@ -7,6 +7,10 @@ /* global jQuery */ +import Core from './core.js'; +import Util from './util.js'; +import View from './view.js'; + /** Class: Candy * Candy base class for initalizing the view and the core * @@ -40,11 +44,17 @@ var Candy = (function(self, $) { */ self.init = function(service, options) { if (!options.viewClass) { - options.viewClass = self.View; + options.viewClass = View; } options.viewClass.init($('#candy'), options.view); - self.Core.init(service, options.core); + Core.init(service, options.core); }; return self; -}(Candy || {}, jQuery)); +}({}, jQuery)); + +Candy.Core = Core; +Candy.Util = Util; +Candy.View = View; + +export default Candy; diff --git a/src/core.js b/src/core.js index c40d29b..40a2f3b 100644 --- a/src/core.js +++ b/src/core.js @@ -7,6 +7,13 @@ /* global Candy, window, Strophe, jQuery */ +import Action from './core/action.js'; +import ChatRoom from './core/chatRoom.js'; +import ChatRoster from './core/chatRoster.js'; +import ChatUser from './core/chatUser.js'; +import Contact from './core/contact.js'; +import Event from './core/event.js'; + /** Class: Candy.Core * Candy Chat Core * @@ -15,7 +22,7 @@ * (Strophe) Strophe - Strophe JS * (jQuery) $ - jQuery */ -Candy.Core = (function(self, Strophe, $) { +var Core = (function(self, Strophe, $) { /** PrivateVariable: _connection * Strophe connection */ @@ -102,7 +109,7 @@ Candy.Core = (function(self, Strophe, $) { * JID resource to use when connecting to the server. * Specify `''` (an empty string) to request a random resource. */ - resource: Candy.about.name, + resource: undefined, /** Boolean: useParticipantRealJid * If set true, will direct one-on-one chats to participant's real JID rather than their MUC jid */ @@ -277,6 +284,10 @@ Candy.Core = (function(self, Strophe, $) { _anonymousConnection = !_anonymousConnection ? jidOrHost && jidOrHost.indexOf("@") < 0 : true; + if(_options.resource === undefined) { + _options.resource = Candy.about.name; + } + if(jidOrHost && password) { // Respect the resource, if provided var resource = Strophe.getResourceFromJid(jidOrHost); @@ -525,4 +536,13 @@ Candy.Core = (function(self, Strophe, $) { }; return self; -}(Candy.Core || {}, Strophe, jQuery)); +}({}, Strophe, jQuery)); + +Core.Action = Action; +Core.ChatRoom = ChatRoom; +Core.ChatRoster = ChatRoster; +Core.ChatUser = ChatUser; +Core.Contact = Contact; +Core.Event = Event; + +export default Core; diff --git a/src/core/action.js b/src/core/action.js index 966107b..1b4b467 100644 --- a/src/core/action.js +++ b/src/core/action.js @@ -5,7 +5,10 @@ */ 'use strict'; -/* global Candy, $iq, navigator, Candy, $pres, Strophe, jQuery, $msg */ +/* global Candy, $iq, navigator, $pres, $msg */ + +import $ from 'jquery'; +import Strophe from 'strophe'; /** Class: Candy.Core.Action * Chat Actions (basicly a abstraction of Jabber commands) @@ -15,7 +18,7 @@ * (Strophe) Strophe - Strophe * (jQuery) $ - jQuery */ -Candy.Core.Action = (function(self, Strophe, $) { +var Action = (function(self) { /** Class: Candy.Core.Action.Jabber * Jabber actions */ @@ -431,4 +434,6 @@ Candy.Core.Action = (function(self, Strophe, $) { }; return self; -}(Candy.Core.Action || {}, Strophe, jQuery)); +}({})); + +export default Action; diff --git a/src/core/chatRoom.js b/src/core/chatRoom.js index fe4cb41..d555b38 100644 --- a/src/core/chatRoom.js +++ b/src/core/chatRoom.js @@ -5,7 +5,9 @@ */ 'use strict'; -/* global Candy, Strophe */ +import Strophe from 'strophe'; + +import Core from '../core.js'; /** Class: Candy.Core.ChatRoom * Candy Chat Room @@ -13,7 +15,7 @@ * Parameters: * (String) roomJid - Room jid */ -Candy.Core.ChatRoom = function(roomJid) { +var ChatRoom = function(roomJid) { /** Object: room * Object containing roomJid and name. */ @@ -30,7 +32,7 @@ Candy.Core.ChatRoom = function(roomJid) { /** Variable: Roster * Candy.Core.ChatRoster instance */ - this.roster = new Candy.Core.ChatRoster(); + this.roster = new Core.ChatRoster(); }; /** Function: setUser @@ -39,7 +41,7 @@ Candy.Core.ChatRoom = function(roomJid) { * Parameters: * (Candy.Core.ChatUser) user - Chat user */ -Candy.Core.ChatRoom.prototype.setUser = function(user) { +ChatRoom.prototype.setUser = function(user) { this.user = user; }; @@ -49,7 +51,7 @@ Candy.Core.ChatRoom.prototype.setUser = function(user) { * Returns: * (Object) - Candy.Core.ChatUser instance or null */ -Candy.Core.ChatRoom.prototype.getUser = function() { +ChatRoom.prototype.getUser = function() { return this.user; }; @@ -59,7 +61,7 @@ Candy.Core.ChatRoom.prototype.getUser = function() { * Returns: * (String) - Room jid */ -Candy.Core.ChatRoom.prototype.getJid = function() { +ChatRoom.prototype.getJid = function() { return this.room.jid; }; @@ -69,7 +71,7 @@ Candy.Core.ChatRoom.prototype.getJid = function() { * Parameters: * (String) name - Room name */ -Candy.Core.ChatRoom.prototype.setName = function(name) { +ChatRoom.prototype.setName = function(name) { this.room.name = name; }; @@ -79,7 +81,7 @@ Candy.Core.ChatRoom.prototype.setName = function(name) { * Returns: * (String) - Room name */ -Candy.Core.ChatRoom.prototype.getName = function() { +ChatRoom.prototype.getName = function() { return this.room.name; }; @@ -89,7 +91,7 @@ Candy.Core.ChatRoom.prototype.getName = function() { * Parameters: * (Candy.Core.ChatRoster) roster - Chat roster */ -Candy.Core.ChatRoom.prototype.setRoster = function(roster) { +ChatRoom.prototype.setRoster = function(roster) { this.roster = roster; }; @@ -99,6 +101,8 @@ Candy.Core.ChatRoom.prototype.setRoster = function(roster) { * Returns * (Candy.Core.ChatRoster) - instance */ -Candy.Core.ChatRoom.prototype.getRoster = function() { +ChatRoom.prototype.getRoster = function() { return this.roster; }; + +export default ChatRoom; diff --git a/src/core/chatRoster.js b/src/core/chatRoster.js index d90a17f..a0e0ab8 100644 --- a/src/core/chatRoster.js +++ b/src/core/chatRoster.js @@ -5,12 +5,10 @@ */ 'use strict'; -/* global Candy */ - -/** Class: Candy.Core.ChatRoster +/** Class: ChatRoster * Chat Roster */ -Candy.Core.ChatRoster = function () { +var ChatRoster = function () { /** Object: items * Roster items */ @@ -21,9 +19,9 @@ Candy.Core.ChatRoster = function () { * Add user to roster * * Parameters: - * (Candy.Core.ChatUser) user - User to add + * (ChatUser) user - User to add */ -Candy.Core.ChatRoster.prototype.add = function(user) { +ChatRoster.prototype.add = function(user) { this.items[user.getJid()] = user; }; @@ -33,7 +31,7 @@ Candy.Core.ChatRoster.prototype.add = function(user) { * Parameters: * (String) jid - User jid */ -Candy.Core.ChatRoster.prototype.remove = function(jid) { +ChatRoster.prototype.remove = function(jid) { delete this.items[jid]; }; @@ -44,9 +42,9 @@ Candy.Core.ChatRoster.prototype.remove = function(jid) { * (String) jid - User jid * * Returns: - * (Candy.Core.ChatUser) - User + * (ChatUser) - User */ -Candy.Core.ChatRoster.prototype.get = function(jid) { +ChatRoster.prototype.get = function(jid) { return this.items[jid]; }; @@ -56,6 +54,8 @@ Candy.Core.ChatRoster.prototype.get = function(jid) { * Returns: * (Object) - all roster items */ -Candy.Core.ChatRoster.prototype.getAll = function() { +ChatRoster.prototype.getAll = function() { return this.items; }; + +export default ChatRoster; diff --git a/src/core/chatUser.js b/src/core/chatUser.js index 2014762..55bb8c8 100644 --- a/src/core/chatUser.js +++ b/src/core/chatUser.js @@ -5,12 +5,15 @@ */ 'use strict'; -/* global Candy, Strophe */ +import Strophe from 'strophe'; -/** Class: Candy.Core.ChatUser +import Core from '../core.js'; +import Util from '../util.js'; + +/** Class: ChatUser * Chat User */ -Candy.Core.ChatUser = function(jid, nick, affiliation, role, realJid) { +var ChatUser = function(jid, nick, affiliation, role, realJid) { /** Constant: ROLE_MODERATOR * Moderator role */ @@ -48,14 +51,14 @@ Candy.Core.ChatUser = function(jid, nick, affiliation, role, realJid) { * Gets an unescaped user jid * * See: - * + * * * Returns: * (String) - jid */ -Candy.Core.ChatUser.prototype.getJid = function() { +ChatUser.prototype.getJid = function() { if(this.data.jid) { - return Candy.Util.unescapeJid(this.data.jid); + return Util.unescapeJid(this.data.jid); } return; }; @@ -64,13 +67,13 @@ Candy.Core.ChatUser.prototype.getJid = function() { * Escapes the user's jid (node & resource get escaped) * * See: - * + * * * Returns: * (String) - escaped jid */ -Candy.Core.ChatUser.prototype.getEscapedJid = function() { - return Candy.Util.escapeJid(this.data.jid); +ChatUser.prototype.getEscapedJid = function() { + return Util.escapeJid(this.data.jid); }; /** Function: setJid @@ -79,7 +82,7 @@ Candy.Core.ChatUser.prototype.getEscapedJid = function() { * Parameters: * (String) jid - New Jid */ -Candy.Core.ChatUser.prototype.setJid = function(jid) { +ChatUser.prototype.setJid = function(jid) { this.data.jid = jid; }; @@ -87,14 +90,14 @@ Candy.Core.ChatUser.prototype.setJid = function(jid) { * Gets an unescaped real jid if known * * See: - * + * * * Returns: * (String) - realJid */ -Candy.Core.ChatUser.prototype.getRealJid = function() { +ChatUser.prototype.getRealJid = function() { if(this.data.realJid) { - return Candy.Util.unescapeJid(this.data.realJid); + return Util.unescapeJid(this.data.realJid); } return; }; @@ -105,7 +108,7 @@ Candy.Core.ChatUser.prototype.getRealJid = function() { * Returns: * (String) - nick */ -Candy.Core.ChatUser.prototype.getNick = function() { +ChatUser.prototype.getNick = function() { return Strophe.unescapeNode(this.data.nick); }; @@ -115,7 +118,7 @@ Candy.Core.ChatUser.prototype.getNick = function() { * Parameters: * (String) nick - New nick */ -Candy.Core.ChatUser.prototype.setNick = function(nick) { +ChatUser.prototype.setNick = function(nick) { this.data.nick = nick; }; @@ -125,7 +128,7 @@ Candy.Core.ChatUser.prototype.setNick = function(nick) { * Returns: * (String) - name */ -Candy.Core.ChatUser.prototype.getName = function() { +ChatUser.prototype.getName = function() { var contact = this.getContact(); if (contact) { return contact.getName(); @@ -140,7 +143,7 @@ Candy.Core.ChatUser.prototype.getName = function() { * Returns: * (String) - role */ -Candy.Core.ChatUser.prototype.getRole = function() { +ChatUser.prototype.getRole = function() { return this.data.role; }; @@ -150,7 +153,7 @@ Candy.Core.ChatUser.prototype.getRole = function() { * Parameters: * (String) role - Role */ -Candy.Core.ChatUser.prototype.setRole = function(role) { +ChatUser.prototype.setRole = function(role) { this.data.role = role; }; @@ -160,7 +163,7 @@ Candy.Core.ChatUser.prototype.setRole = function(role) { * Parameters: * (String) affiliation - new affiliation */ -Candy.Core.ChatUser.prototype.setAffiliation = function(affiliation) { +ChatUser.prototype.setAffiliation = function(affiliation) { this.data.affiliation = affiliation; }; @@ -170,7 +173,7 @@ Candy.Core.ChatUser.prototype.setAffiliation = function(affiliation) { * Returns: * (String) - affiliation */ -Candy.Core.ChatUser.prototype.getAffiliation = function() { +ChatUser.prototype.getAffiliation = function() { return this.data.affiliation; }; @@ -180,7 +183,7 @@ Candy.Core.ChatUser.prototype.getAffiliation = function() { * Returns: * (Boolean) - true if user has role moderator or affiliation owner */ -Candy.Core.ChatUser.prototype.isModerator = function() { +ChatUser.prototype.isModerator = function() { return this.getRole() === this.ROLE_MODERATOR || this.getAffiliation() === this.AFFILIATION_OWNER; }; @@ -196,7 +199,7 @@ Candy.Core.ChatUser.prototype.isModerator = function() { * Returns: * (Array) - Current privacy list. */ -Candy.Core.ChatUser.prototype.addToOrRemoveFromPrivacyList = function(list, jid) { +ChatUser.prototype.addToOrRemoveFromPrivacyList = function(list, jid) { if (!this.data.privacyLists[list]) { this.data.privacyLists[list] = []; } @@ -218,7 +221,7 @@ Candy.Core.ChatUser.prototype.addToOrRemoveFromPrivacyList = function(list, jid) * Returns: * (Array) - Privacy List */ -Candy.Core.ChatUser.prototype.getPrivacyList = function(list) { +ChatUser.prototype.getPrivacyList = function(list) { if (!this.data.privacyLists[list]) { this.data.privacyLists[list] = []; } @@ -231,7 +234,7 @@ Candy.Core.ChatUser.prototype.getPrivacyList = function(list) { * Parameters: * (Object) lists - List object */ -Candy.Core.ChatUser.prototype.setPrivacyLists = function(lists) { +ChatUser.prototype.setPrivacyLists = function(lists) { this.data.privacyLists = lists; }; @@ -245,7 +248,7 @@ Candy.Core.ChatUser.prototype.setPrivacyLists = function(lists) { * Returns: * (Boolean) */ -Candy.Core.ChatUser.prototype.isInPrivacyList = function(list, jid) { +ChatUser.prototype.isInPrivacyList = function(list, jid) { if (!this.data.privacyLists[list]) { return false; } @@ -258,7 +261,7 @@ Candy.Core.ChatUser.prototype.isInPrivacyList = function(list, jid) { * Parameter: * (Object) data - Object containing custom data */ -Candy.Core.ChatUser.prototype.setCustomData = function(data) { +ChatUser.prototype.setCustomData = function(data) { this.data.customData = data; }; @@ -268,7 +271,7 @@ Candy.Core.ChatUser.prototype.setCustomData = function(data) { * Returns: * (Object) - Object containing custom data */ -Candy.Core.ChatUser.prototype.getCustomData = function() { +ChatUser.prototype.getCustomData = function() { return this.data.customData; }; @@ -278,7 +281,7 @@ Candy.Core.ChatUser.prototype.getCustomData = function() { * Parameters: * (String) previousNick - the previous nickname */ -Candy.Core.ChatUser.prototype.setPreviousNick = function(previousNick) { +ChatUser.prototype.setPreviousNick = function(previousNick) { this.data.previousNick = previousNick; }; @@ -288,7 +291,7 @@ Candy.Core.ChatUser.prototype.setPreviousNick = function(previousNick) { * Returns: * (String) - previous nickname */ -Candy.Core.ChatUser.prototype.getPreviousNick = function() { +ChatUser.prototype.getPreviousNick = function() { return this.data.previousNick; }; @@ -296,10 +299,10 @@ Candy.Core.ChatUser.prototype.getPreviousNick = function() { * Gets the contact matching this user from our roster * * Returns: - * (Candy.Core.Contact) - contact from roster + * (.Contact) - contact from roster */ -Candy.Core.ChatUser.prototype.getContact = function() { - return Candy.Core.getRoster().get(Strophe.getBareJidFromJid(this.data.realJid)); +ChatUser.prototype.getContact = function() { + return Core.getRoster().get(Strophe.getBareJidFromJid(this.data.realJid)); }; /** Function: setStatus @@ -308,7 +311,7 @@ Candy.Core.ChatUser.prototype.getContact = function() { * Parameters: * (String) status - the new status */ -Candy.Core.ChatUser.prototype.setStatus = function(status) { +ChatUser.prototype.setStatus = function(status) { this.data.status = status; }; @@ -318,6 +321,8 @@ Candy.Core.ChatUser.prototype.setStatus = function(status) { * Returns: * (String) - status */ -Candy.Core.ChatUser.prototype.getStatus = function() { +ChatUser.prototype.getStatus = function() { return this.data.status; }; + +export default ChatUser; diff --git a/src/core/contact.js b/src/core/contact.js index 2d8a4d8..16d225e 100644 --- a/src/core/contact.js +++ b/src/core/contact.js @@ -5,12 +5,15 @@ */ 'use strict'; -/* global Candy, Strophe, $ */ +import $ from 'jquery'; +import Strophe from 'strophe'; -/** Class: Candy.Core.Contact +import Util from '../util.js'; + +/** Class: Contact * Roster contact */ -Candy.Core.Contact = function(stropheRosterItem) { +var Contact = function(stropheRosterItem) { /** Object: data * Strophe Roster plugin item model containing: * - jid @@ -25,14 +28,14 @@ Candy.Core.Contact = function(stropheRosterItem) { * Gets an unescaped user jid * * See: - * + * * * Returns: * (String) - jid */ -Candy.Core.Contact.prototype.getJid = function() { +Contact.prototype.getJid = function() { if(this.data.jid) { - return Candy.Util.unescapeJid(this.data.jid); + return Util.unescapeJid(this.data.jid); } return; }; @@ -41,13 +44,13 @@ Candy.Core.Contact.prototype.getJid = function() { * Escapes the user's jid (node & resource get escaped) * * See: - * + * * * Returns: * (String) - escaped jid */ -Candy.Core.Contact.prototype.getEscapedJid = function() { - return Candy.Util.escapeJid(this.data.jid); +Contact.prototype.getEscapedJid = function() { + return Util.escapeJid(this.data.jid); }; /** Function: getName @@ -56,7 +59,7 @@ Candy.Core.Contact.prototype.getEscapedJid = function() { * Returns: * (String) - name */ -Candy.Core.Contact.prototype.getName = function() { +Contact.prototype.getName = function() { if (!this.data.name) { return this.getJid(); } @@ -69,7 +72,7 @@ Candy.Core.Contact.prototype.getName = function() { * Returns: * (String) - name */ -Candy.Core.Contact.prototype.getNick = Candy.Core.Contact.prototype.getName; +Contact.prototype.getNick = Contact.prototype.getName; /** Function: getSubscription * Gets user subscription @@ -77,7 +80,7 @@ Candy.Core.Contact.prototype.getNick = Candy.Core.Contact.prototype.getName; * Returns: * (String) - subscription */ -Candy.Core.Contact.prototype.getSubscription = function() { +Contact.prototype.getSubscription = function() { if (!this.data.subscription) { return 'none'; } @@ -90,7 +93,7 @@ Candy.Core.Contact.prototype.getSubscription = function() { * Returns: * (Array) - groups */ -Candy.Core.Contact.prototype.getGroups = function() { +Contact.prototype.getGroups = function() { return this.data.groups; }; @@ -100,7 +103,7 @@ Candy.Core.Contact.prototype.getGroups = function() { * Returns: * (String) - aggregate status, one of chat|dnd|available|away|xa|unavailable */ -Candy.Core.Contact.prototype.getStatus = function() { +Contact.prototype.getStatus = function() { var status = 'unavailable', self = this, highestResourcePriority; @@ -133,7 +136,7 @@ Candy.Core.Contact.prototype.getStatus = function() { return status; }; -Candy.Core.Contact.prototype._weightForStatus = function(status) { +Contact.prototype._weightForStatus = function(status) { switch (status) { case 'chat': case 'dnd': @@ -149,3 +152,5 @@ Candy.Core.Contact.prototype._weightForStatus = function(status) { return 5; } }; + +export default Contact; diff --git a/src/core/event.js b/src/core/event.js index 9486ede..b2081e8 100644 --- a/src/core/event.js +++ b/src/core/event.js @@ -5,17 +5,21 @@ */ 'use strict'; -/* global Candy, Strophe, jQuery */ +/* global Candy */ -/** Class: Candy.Core.Event +import $ from 'jquery'; +import Strophe from 'strophe'; + +import Core from '../core.js'; +import Util from '../util.js'; + +/** Class: Core.Event * Chat Events * * Parameters: - * (Candy.Core.Event) self - itself - * (Strophe) Strophe - Strophe - * (jQuery) $ - jQuery + * (Core.Event) self - itself */ -Candy.Core.Event = (function(self, Strophe, $) { +export default (function(self) { /** Function: Login * Notify view that the login window should be displayed * @@ -35,7 +39,7 @@ Candy.Core.Event = (function(self, Strophe, $) { $(Candy).triggerHandler('candy:core.login', { presetJid: presetJid } ); }; - /** Class: Candy.Core.Event.Strophe + /** Class: Core.Event.Strophe * Strophe-related events */ self.Strophe = { @@ -49,50 +53,50 @@ Candy.Core.Event = (function(self, Strophe, $) { * candy:core.chat.connection using {status} */ Connect: function(status) { - Candy.Core.setStropheStatus(status); + Core.setStropheStatus(status); switch(status) { case Strophe.Status.CONNECTED: - Candy.Core.log('[Connection] Connected'); - Candy.Core.Action.Jabber.GetJidIfAnonymous(); + Core.log('[Connection] Connected'); + Core.Action.Jabber.GetJidIfAnonymous(); /* falls through */ case Strophe.Status.ATTACHED: - Candy.Core.log('[Connection] Attached'); + Core.log('[Connection] Attached'); $(Candy).on('candy:core:roster:fetched', function () { - Candy.Core.Action.Jabber.Presence(); + Core.Action.Jabber.Presence(); }); - Candy.Core.Action.Jabber.Roster(); - Candy.Core.Action.Jabber.EnableCarbons(); - Candy.Core.Action.Jabber.Autojoin(); - Candy.Core.Action.Jabber.GetIgnoreList(); + Core.Action.Jabber.Roster(); + Core.Action.Jabber.EnableCarbons(); + Core.Action.Jabber.Autojoin(); + Core.Action.Jabber.GetIgnoreList(); break; case Strophe.Status.DISCONNECTED: - Candy.Core.log('[Connection] Disconnected'); + Core.log('[Connection] Disconnected'); break; case Strophe.Status.AUTHFAIL: - Candy.Core.log('[Connection] Authentication failed'); + Core.log('[Connection] Authentication failed'); break; case Strophe.Status.CONNECTING: - Candy.Core.log('[Connection] Connecting'); + Core.log('[Connection] Connecting'); break; case Strophe.Status.DISCONNECTING: - Candy.Core.log('[Connection] Disconnecting'); + Core.log('[Connection] Disconnecting'); break; case Strophe.Status.AUTHENTICATING: - Candy.Core.log('[Connection] Authenticating'); + Core.log('[Connection] Authenticating'); break; case Strophe.Status.ERROR: case Strophe.Status.CONNFAIL: - Candy.Core.log('[Connection] Failed (' + status + ')'); + Core.log('[Connection] Failed (' + status + ')'); break; default: - Candy.Core.warn('[Connection] Unknown status received:', status); + Core.warn('[Connection] Unknown status received:', status); break; } /** Event: candy:core.chat.connection @@ -105,7 +109,7 @@ Candy.Core.Event = (function(self, Strophe, $) { } }; - /** Class: Candy.Core.Event.Jabber + /** Class: Core.Event.Jabber * Jabber related events */ self.Jabber = { @@ -119,8 +123,8 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ Version: function(msg) { - Candy.Core.log('[Jabber] Version'); - Candy.Core.Action.Jabber.Version($(msg)); + Core.log('[Jabber] Version'); + Core.Action.Jabber.Version($(msg)); return true; }, @@ -137,7 +141,7 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ Presence: function(msg) { - Candy.Core.log('[Jabber] Presence'); + Core.log('[Jabber] Presence'); msg = $(msg); if(msg.children('x[xmlns^="' + Strophe.NS.MUC + '"]').length > 0) { if (msg.attr('type') === 'error') { @@ -176,7 +180,7 @@ Candy.Core.Event = (function(self, Strophe, $) { /** Event: candy:core.roster.loaded * Notification of the roster having been loaded from cache */ - $(Candy).triggerHandler('candy:core:roster:loaded', {roster: Candy.Core.getRoster()}); + $(Candy).triggerHandler('candy:core:roster:loaded', {roster: Core.getRoster()}); return true; }, @@ -199,7 +203,7 @@ Candy.Core.Event = (function(self, Strophe, $) { /** Event: candy:core.roster.fetched * Notification of the roster having been fetched */ - $(Candy).triggerHandler('candy:core:roster:fetched', {roster: Candy.Core.getRoster()}); + $(Candy).triggerHandler('candy:core:roster:fetched', {roster: Core.getRoster()}); return true; }, @@ -224,24 +228,24 @@ Candy.Core.Event = (function(self, Strophe, $) { } if (updatedItem.subscription === "remove") { - var contact = Candy.Core.getRoster().get(updatedItem.jid); - Candy.Core.getRoster().remove(updatedItem.jid); + var contact = Core.getRoster().get(updatedItem.jid); + Core.getRoster().remove(updatedItem.jid); /** Event: candy:core.roster.removed * Notification of a roster entry having been removed * * Parameters: - * (Candy.Core.Contact) contact - The contact that was removed from the roster + * (Core.Contact) contact - The contact that was removed from the roster */ $(Candy).triggerHandler('candy:core:roster:removed', {contact: contact}); } else { - var user = Candy.Core.getRoster().get(updatedItem.jid); + var user = Core.getRoster().get(updatedItem.jid); if (!user) { user = self.Jabber._addRosterItem(updatedItem); /** Event: candy:core.roster.added * Notification of a roster entry having been added * * Parameters: - * (Candy.Core.Contact) contact - The contact that was added + * (Core.Contact) contact - The contact that was added */ $(Candy).triggerHandler('candy:core:roster:added', {contact: user}); } else { @@ -249,7 +253,7 @@ Candy.Core.Event = (function(self, Strophe, $) { * Notification of a roster entry having been updated * * Parameters: - * (Candy.Core.Contact) contact - The contact that was updated + * (Core.Contact) contact - The contact that was updated */ $(Candy).triggerHandler('candy:core:roster:updated', {contact: user}); } @@ -259,8 +263,8 @@ Candy.Core.Event = (function(self, Strophe, $) { }, _addRosterItem: function(item) { - var user = new Candy.Core.Contact(item); - Candy.Core.getRoster().add(user); + var user = new Core.Contact(item); + Core.getRoster().add(user); return user; }, @@ -280,12 +284,12 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ Bookmarks: function(msg) { - Candy.Core.log('[Jabber] Bookmarks'); + Core.log('[Jabber] Bookmarks'); // Autojoin bookmarks $('conference', msg).each(function() { var item = $(this); if(item.attr('autojoin')) { - Candy.Core.Action.Jabber.Room.Join(item.attr('jid')); + Core.Action.Jabber.Room.Join(item.attr('jid')); } }); return true; @@ -303,8 +307,8 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - false to disable the handler after first call. */ PrivacyList: function(msg) { - Candy.Core.log('[Jabber] PrivacyList'); - var currentUser = Candy.Core.getUser(); + Core.log('[Jabber] PrivacyList'); + var currentUser = Core.getUser(); msg = $(msg); if(msg.attr('type') === 'result') { $('list[name="ignore"] item', msg).each(function() { @@ -313,7 +317,7 @@ Candy.Core.Event = (function(self, Strophe, $) { currentUser.addToOrRemoveFromPrivacyList('ignore', item.attr('value')); } }); - Candy.Core.Action.Jabber.SetIgnoreListActive(); + Core.Action.Jabber.SetIgnoreListActive(); return false; } return self.Jabber.PrivacyListError(msg); @@ -331,11 +335,11 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - false to disable the handler after first call. */ PrivacyListError: function(msg) { - Candy.Core.log('[Jabber] PrivacyListError'); + Core.log('[Jabber] PrivacyListError'); // check if msg says that privacyList doesn't exist if ($('error[code="404"][type="cancel"] item-not-found', msg)) { - Candy.Core.Action.Jabber.ResetIgnoreList(); - Candy.Core.Action.Jabber.SetIgnoreListActive(); + Core.Action.Jabber.ResetIgnoreList(); + Core.Action.Jabber.SetIgnoreListActive(); } return false; }, @@ -354,7 +358,7 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ Message: function(msg) { - Candy.Core.log('[Jabber] Message'); + Core.log('[Jabber] Message'); msg = $(msg); var type = msg.attr('type') || 'normal'; @@ -489,7 +493,7 @@ Candy.Core.Event = (function(self, Strophe, $) { return invite; }, - /** Class: Candy.Core.Event.Jabber.Room + /** Class: Core.Event.Jabber.Room * Room specific events */ Room: { @@ -503,7 +507,7 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ Disco: function(msg) { - Candy.Core.log('[Jabber:Room] Disco'); + Core.log('[Jabber:Room] Disco'); msg = $(msg); // Temp fix for #219 // Don't go further if it's no conference disco reply @@ -511,17 +515,17 @@ Candy.Core.Event = (function(self, Strophe, $) { if(!msg.find('identity[category="conference"]').length) { return true; } - var roomJid = Strophe.getBareJidFromJid(Candy.Util.unescapeJid(msg.attr('from'))); + var roomJid = Strophe.getBareJidFromJid(Util.unescapeJid(msg.attr('from'))); // Client joined a room - if(!Candy.Core.getRooms()[roomJid]) { - Candy.Core.getRooms()[roomJid] = new Candy.Core.ChatRoom(roomJid); + if(!Core.getRooms()[roomJid]) { + Core.getRooms()[roomJid] = new Core.ChatRoom(roomJid); } // Room existed but room name was unknown var identity = msg.find('identity'); if(identity.length) { var roomName = identity.attr('name'), - room = Candy.Core.getRoom(roomJid); + room = Core.getRoom(roomJid); if(room.getName() === null) { room.setName(Strophe.unescapeNode(roomName)); // Room name changed @@ -545,8 +549,8 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ Presence: function(msg) { - Candy.Core.log('[Jabber:Room] Presence'); - var from = Candy.Util.unescapeJid(msg.attr('from')), + Core.log('[Jabber:Room] Presence'); + var from = Util.unescapeJid(msg.attr('from')), roomJid = Strophe.getBareJidFromJid(from), presenceType = msg.attr('type'), isNewRoom = self.Jabber.Room._msgHasStatusCode(msg, 201), @@ -554,14 +558,14 @@ Candy.Core.Event = (function(self, Strophe, $) { nickChange = self.Jabber.Room._msgHasStatusCode(msg, 303); // Current User joined a room - var room = Candy.Core.getRoom(roomJid); + var room = Core.getRoom(roomJid); if(!room) { - Candy.Core.getRooms()[roomJid] = new Candy.Core.ChatRoom(roomJid); - room = Candy.Core.getRoom(roomJid); + Core.getRooms()[roomJid] = new Core.ChatRoom(roomJid); + room = Core.getRoom(roomJid); } var roster = room.getRoster(), - currentUser = room.getUser() ? room.getUser() : Candy.Core.getUser(), + currentUser = room.getUser() ? room.getUser() : Core.getUser(), action, user, nick, show = msg.find('show'), @@ -584,9 +588,9 @@ Candy.Core.Event = (function(self, Strophe, $) { action = 'join'; } else { nick = Strophe.getResourceFromJid(from); - user = new Candy.Core.ChatUser(from, nick, item.attr('affiliation'), item.attr('role'), item.attr('jid')); + user = new Core.ChatUser(from, nick, item.attr('affiliation'), item.attr('role'), item.attr('jid')); // Room existed but client (myself) is not yet registered - if(room.getUser() === null && (Candy.Core.getUser().getNick() === nick || nickAssign)) { + if(room.getUser() === null && (Core.getUser().getNick() === nick || nickAssign)) { room.setUser(user); currentUser = user; } @@ -634,9 +638,9 @@ Candy.Core.Event = (function(self, Strophe, $) { * Parameters: * (String) roomJid - Room JID * (String) roomName - Room name - * (Candy.Core.ChatUser) user - User which does the presence update + * (Core.ChatUser) user - User which does the presence update * (String) action - Action [kick, ban, leave, join] - * (Candy.Core.ChatUser) currentUser - Current local user + * (Core.ChatUser) currentUser - Current local user * (Boolean) isNewRoom - Whether the room is new (has just been created) */ $(Candy).triggerHandler('candy:core.presence.room', { @@ -655,9 +659,9 @@ Candy.Core.Event = (function(self, Strophe, $) { }, _selfLeave: function(msg, from, roomJid, roomName, action) { - Candy.Core.log('[Jabber:Room] Leave'); + Core.log('[Jabber:Room] Leave'); - Candy.Core.removeRoom(roomJid); + Core.removeRoom(roomJid); var item = msg.find('item'), reason, @@ -668,7 +672,7 @@ Candy.Core.Event = (function(self, Strophe, $) { actor = item.find('actor').attr('jid'); } - var user = new Candy.Core.ChatUser(from, Strophe.getResourceFromJid(from), item.attr('affiliation'), item.attr('role')); + var user = new Core.ChatUser(from, Strophe.getResourceFromJid(from), item.attr('affiliation'), item.attr('role')); /** Event: candy:core.presence.leave * When the local client leaves a room @@ -681,7 +685,7 @@ Candy.Core.Event = (function(self, Strophe, $) { * (String) type - Presence type [kick, ban, leave] * (String) reason - When type equals kick|ban, this is the reason the moderator has supplied. * (String) actor - When type equals kick|ban, this is the moderator which did the kick - * (Candy.Core.ChatUser) user - user which leaves the room + * (Core.ChatUser) user - user which leaves the room */ $(Candy).triggerHandler('candy:core.presence.leave', { 'roomJid': roomJid, @@ -706,14 +710,14 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ PresenceError: function(msg) { - Candy.Core.log('[Jabber:Room] Presence Error'); - var from = Candy.Util.unescapeJid(msg.attr('from')), + Core.log('[Jabber:Room] Presence Error'); + var from = Util.unescapeJid(msg.attr('from')), roomJid = Strophe.getBareJidFromJid(from), - room = Candy.Core.getRooms()[roomJid], + room = Core.getRooms()[roomJid], roomName = room.getName(); // Presence error: Remove room from array to prevent error when disconnecting - Candy.Core.removeRoom(roomJid); + Core.removeRoom(roomJid); room = undefined; /** Event: candy:core.presence.error @@ -748,28 +752,28 @@ Candy.Core.Event = (function(self, Strophe, $) { * (Boolean) - true */ Message: function(msg) { - Candy.Core.log('[Jabber:Room] Message'); + Core.log('[Jabber:Room] Message'); var carbon = false, - partnerJid = Candy.Util.unescapeJid(msg.attr('from')); + partnerJid = Util.unescapeJid(msg.attr('from')); if (msg.children('sent[xmlns="' + Strophe.NS.CARBONS + '"]').length > 0) { carbon = true; msg = $(msg.children('sent').children('forwarded').children('message')); - partnerJid = Candy.Util.unescapeJid(msg.attr('to')); + partnerJid = Util.unescapeJid(msg.attr('to')); } if (msg.children('received[xmlns="' + Strophe.NS.CARBONS + '"]').length > 0) { carbon = true; msg = $(msg.children('received').children('forwarded').children('message')); - partnerJid = Candy.Util.unescapeJid(msg.attr('from')); + partnerJid = Util.unescapeJid(msg.attr('from')); } // Room subject var roomJid, roomName, from, message, name, room, sender; if(msg.children('subject').length > 0 && msg.children('subject').text().length > 0 && msg.attr('type') === 'groupchat') { - roomJid = Candy.Util.unescapeJid(Strophe.getBareJidFromJid(partnerJid)); - from = Candy.Util.unescapeJid(Strophe.getBareJidFromJid(msg.attr('from'))); + roomJid = Util.unescapeJid(Strophe.getBareJidFromJid(partnerJid)); + from = Util.unescapeJid(Strophe.getBareJidFromJid(msg.attr('from'))); roomName = Strophe.getNodeFromJid(roomJid); message = { from: from, name: Strophe.getNodeFromJid(from), body: msg.children('subject').text(), type: 'subject' }; // Error messsage @@ -784,25 +788,25 @@ Candy.Core.Event = (function(self, Strophe, $) { } else if(msg.children('body').length > 0) { // Private chat message if(msg.attr('type') === 'chat' || msg.attr('type') === 'normal') { - from = Candy.Util.unescapeJid(msg.attr('from')); + from = Util.unescapeJid(msg.attr('from')); var barePartner = Strophe.getBareJidFromJid(partnerJid), bareFrom = Strophe.getBareJidFromJid(from), - isNoConferenceRoomJid = !Candy.Core.getRoom(barePartner); + isNoConferenceRoomJid = !Core.getRoom(barePartner); if (isNoConferenceRoomJid) { roomJid = barePartner; - var partner = Candy.Core.getRoster().get(barePartner); + var partner = Core.getRoster().get(barePartner); if (partner) { roomName = partner.getName(); } else { roomName = Strophe.getNodeFromJid(barePartner); } - if (bareFrom === Candy.Core.getUser().getJid()) { - sender = Candy.Core.getUser(); + if (bareFrom === Core.getUser().getJid()) { + sender = Core.getUser(); } else { - sender = Candy.Core.getRoster().get(bareFrom); + sender = Core.getRoster().get(bareFrom); } if (sender) { name = sender.getName(); @@ -811,7 +815,7 @@ Candy.Core.Event = (function(self, Strophe, $) { } } else { roomJid = partnerJid; - room = Candy.Core.getRoom(Candy.Util.unescapeJid(Strophe.getBareJidFromJid(from))); + room = Core.getRoom(Util.unescapeJid(Strophe.getBareJidFromJid(from))); sender = room.getRoster().get(from); if (sender) { name = sender.getName(); @@ -823,15 +827,15 @@ Candy.Core.Event = (function(self, Strophe, $) { message = { from: from, name: name, body: msg.children('body').text(), type: msg.attr('type'), isNoConferenceRoomJid: isNoConferenceRoomJid }; // Multi-user chat message } else { - from = Candy.Util.unescapeJid(msg.attr('from')); - roomJid = Candy.Util.unescapeJid(Strophe.getBareJidFromJid(partnerJid)); + from = Util.unescapeJid(msg.attr('from')); + roomJid = Util.unescapeJid(Strophe.getBareJidFromJid(partnerJid)); var resource = Strophe.getResourceFromJid(partnerJid); // Message from a user if(resource) { - room = Candy.Core.getRoom(roomJid); + room = Core.getRoom(roomJid); roomName = room.getName(); - if (resource === Candy.Core.getUser().getNick()) { - sender = Candy.Core.getUser(); + if (resource === Core.getUser().getNick()) { + sender = Core.getUser(); } else { sender = room.getRoster().get(from); } @@ -844,7 +848,7 @@ Candy.Core.Event = (function(self, Strophe, $) { // Message from server (XEP-0045#registrar-statuscodes) } else { // we are not yet present in the room, let's just drop this message (issue #105) - if(!Candy.Core.getRooms()[partnerJid]) { + if(!Core.getRooms()[partnerJid]) { return true; } roomName = ''; @@ -955,4 +959,4 @@ Candy.Core.Event = (function(self, Strophe, $) { }; return self; -}(Candy.Core.Event || {}, Strophe, jQuery)); +}({})); diff --git a/src/util.js b/src/util.js index ed4d1c4..2ffc3e6 100644 --- a/src/util.js +++ b/src/util.js @@ -14,7 +14,7 @@ * (Candy.Util) self - itself * (jQuery) $ - jQuery */ -Candy.Util = (function(self, $){ +var Util = (function(self, $){ /** Function: jidToId * Translates a jid to a MD5-Id * @@ -655,4 +655,6 @@ Candy.Util = (function(self, $){ }; return self; -}(Candy.Util || {}, jQuery)); +}({}, jQuery)); + +export default Util; diff --git a/src/view.js b/src/view.js index 66c21fe..d577f5f 100644 --- a/src/view.js +++ b/src/view.js @@ -7,6 +7,17 @@ /* global jQuery, Candy, window, Mustache, document */ +import Observer from './view/observer.js'; +import Template from './view/template.js'; +import Translation from './view/translation.js'; + +import Chat from './view/pane/chat.js'; +import Message from './view/pane/message.js'; +import PrivateRoom from './view/pane/privateRoom.js'; +import Room from './view/pane/room.js'; +import Roster from './view/pane/roster.js'; +import Window from './view/pane/window.js'; + /** Class: Candy.View * The Candy View Class * @@ -14,7 +25,7 @@ * (Candy.View) self - itself * (jQuery) $ - jQuery */ -Candy.View = (function(self, $) { +var View = (function(self, $) { /** PrivateObject: _current * Object containing current container & roomJid which the client sees. */ @@ -162,4 +173,18 @@ Candy.View = (function(self, $) { }; return self; -}(Candy.View || {}, jQuery)); +}({}, jQuery)); + +View.Observer = Observer; +View.Template = Template; +View.Translation = Translation; + +View.Pane = {}; +View.Pane.Chat = Chat; +View.Pane.Message = Message; +View.Pane.PrivateRoom = PrivateRoom; +View.Pane.Room = Room; +View.Pane.Roster = Roster; +View.Pane.Window = Window; + +export default View; diff --git a/src/view/observer.js b/src/view/observer.js index 283568c..63e4f91 100644 --- a/src/view/observer.js +++ b/src/view/observer.js @@ -14,7 +14,7 @@ * (Candy.View.Observer) self - itself * (jQuery) $ - jQuery */ -Candy.View.Observer = (function(self, $) { +export default (function(self, $) { /** PrivateVariable: _showConnectedMessageModal * Ugly way to determine if the 'connected' modal should be shown. * Is set to false in case no autojoin param is set. @@ -322,4 +322,4 @@ Candy.View.Observer = (function(self, $) { }; return self; -}(Candy.View.Observer || {}, jQuery)); +}({}, jQuery)); diff --git a/src/view/pane/chat.js b/src/view/pane/chat.js index bfabaf7..92111ce 100644 --- a/src/view/pane/chat.js +++ b/src/view/pane/chat.js @@ -7,6 +7,9 @@ /* global Candy, document, Mustache, Strophe, Audio, jQuery */ +import Room from './room.js'; +import Window from './window.js'; + /** Class: Candy.View.Pane * Candy view pane handles everything regarding DOM updates etc. * @@ -14,7 +17,7 @@ * (Candy.View.Pane) self - itself * (jQuery) $ - jQuery */ -Candy.View.Pane = (function(self, $) { +var Pane = (function(self, $) { /** Class: Candy.View.Pane.Chat * Chat-View related view updates @@ -132,7 +135,7 @@ Candy.View.Pane = (function(self, $) { unreadElem.show().text(unreadElem.text() !== '' ? parseInt(unreadElem.text(), 10) + 1 : 1); // only increase window unread messages in private chats if (self.Chat.rooms[roomJid].type === 'chat' || Candy.View.getOptions().updateWindowOnAllMessages === true) { - self.Window.increaseUnreadMessages(); + Window.increaseUnreadMessages(); } }, @@ -147,7 +150,7 @@ Candy.View.Pane = (function(self, $) { */ clearUnreadMessages: function(roomJid) { var unreadElem = self.Chat.getTab(roomJid).find('.unread'); - self.Window.reduceUnreadMessages(unreadElem.text()); + Window.reduceUnreadMessages(unreadElem.text()); unreadElem.hide().text(''); }, @@ -157,12 +160,12 @@ Candy.View.Pane = (function(self, $) { tabClick: function(e) { // remember scroll position of current room var currentRoomJid = Candy.View.getCurrent().roomJid; - var roomPane = self.Room.getPane(currentRoomJid, '.message-pane'); + var roomPane = Room.getPane(currentRoomJid, '.message-pane'); if (roomPane) { self.Chat.rooms[currentRoomJid].scrollPosition = roomPane.scrollTop(); } - self.Room.show($(this).attr('data-roomjid')); + Room.show($(this).attr('data-roomjid')); e.preventDefault(); }, @@ -179,7 +182,7 @@ Candy.View.Pane = (function(self, $) { var roomJid = $(this).parent().attr('data-roomjid'); // close private user tab if(self.Chat.rooms[roomJid].type === 'chat') { - self.Room.close(roomJid); + Room.close(roomJid); // close multi-user room tab } else { Candy.Core.Action.Jabber.Room.Leave(roomJid); @@ -246,9 +249,9 @@ Candy.View.Pane = (function(self, $) { timestamp: timestamp.toISOString() }); $('#chat-rooms').children().each(function() { - self.Room.appendToMessagePane($(this).attr('data-roomjid'), html); + Room.appendToMessagePane($(this).attr('data-roomjid'), html); }); - self.Room.scrollToBottom(Candy.View.getCurrent().roomJid); + Room.scrollToBottom(Candy.View.getCurrent().roomJid); /** Event: candy:view.chat.admin-message * After admin message display @@ -299,9 +302,9 @@ Candy.View.Pane = (function(self, $) { time: Candy.Util.localizedTime(timestamp), timestamp: timestamp.toISOString() }); - self.Room.appendToMessagePane(roomJid, html); + Room.appendToMessagePane(roomJid, html); if (Candy.View.getCurrent().roomJid === roomJid) { - self.Room.scrollToBottom(Candy.View.getCurrent().roomJid); + Room.scrollToBottom(Candy.View.getCurrent().roomJid); } } }, @@ -364,7 +367,7 @@ Candy.View.Pane = (function(self, $) { */ update: function(roomJid) { var context = $('#chat-toolbar').find('.context'), - me = self.Room.getUser(roomJid); + me = Room.getUser(roomJid); if(!me || !me.isModerator()) { context.hide(); } else { @@ -428,16 +431,16 @@ Candy.View.Pane = (function(self, $) { onAutoscrollControlClick: function() { var control = $('#chat-autoscroll-control'); if(control.hasClass('checked')) { - self.Room.scrollToBottom = function(roomJid) { - self.Room.onScrollToStoredPosition(roomJid); + Room.scrollToBottom = function(roomJid) { + Room.onScrollToStoredPosition(roomJid); }; - self.Window.autoscroll = false; + Window.autoscroll = false; } else { - self.Room.scrollToBottom = function(roomJid) { - self.Room.onScrollToBottom(roomJid); + Room.scrollToBottom = function(roomJid) { + Room.onScrollToBottom(roomJid); }; - self.Room.scrollToBottom(Candy.View.getCurrent().roomJid); - self.Window.autoscroll = true; + Room.scrollToBottom(Candy.View.getCurrent().roomJid); + Window.autoscroll = true; } control.toggleClass('checked'); }, @@ -896,7 +899,7 @@ Candy.View.Pane = (function(self, $) { menulinks = evtData.menulinks; for(id in menulinks) { - if(menulinks.hasOwnProperty(id) && menulinks[id].requiredPermission !== undefined && !menulinks[id].requiredPermission(user, self.Room.getUser(roomJid), elem)) { + if(menulinks.hasOwnProperty(id) && menulinks[id].requiredPermission !== undefined && !menulinks[id].requiredPermission(user, Room.getUser(roomJid), elem)) { delete menulinks[id]; } } @@ -1056,4 +1059,6 @@ Candy.View.Pane = (function(self, $) { }; return self; -}(Candy.View.Pane || {}, jQuery)); +}({}, jQuery)); + +export default Pane.Chat; diff --git a/src/view/pane/message.js b/src/view/pane/message.js index e65b8d2..2a547a9 100644 --- a/src/view/pane/message.js +++ b/src/view/pane/message.js @@ -7,6 +7,10 @@ /* global Candy, Mustache, jQuery */ +import Chat from './chat.js'; +import Room from './room.js'; +import Window from './window.js'; + /** Class: Candy.View.Pane * Candy view pane handles everything regarding DOM updates etc. * @@ -14,7 +18,7 @@ * (Candy.View.Pane) self - itself * (jQuery) $ - jQuery */ -Candy.View.Pane = (function(self, $) { +var Pane = (function(self, $) { /** Class: Candy.View.Pane.Message * Message submit/show handling @@ -68,7 +72,7 @@ Candy.View.Pane = (function(self, $) { Candy.Core.Action.Jabber.Room.Message(targetJid, message, roomType, xhtmlMessage); // Private user chat. Jabber won't notify the user who has sent the message. Just show it as the user hits the button... if(roomType === 'chat' && message) { - self.Message.show(roomJid, self.Room.getUser(roomJid).getNick(), message, xhtmlMessage, undefined, Candy.Core.getUser().getJid()); + self.Message.show(roomJid, Room.getUser(roomJid).getNick(), message, xhtmlMessage, undefined, Candy.Core.getUser().getJid()); } // Clear input and set focus to it $(this).children('.field').val('').focus(); @@ -105,7 +109,7 @@ Candy.View.Pane = (function(self, $) { } // Before we add the new message, check to see if we should be automatically scrolling or not. - var messagePane = self.Room.getPane(roomJid, '.message-pane'); + var messagePane = Room.getPane(roomJid, '.message-pane'); var enableScroll = ((messagePane.scrollTop() + messagePane.outerHeight()) === messagePane.prop('scrollHeight')) || !$(messagePane).is(':visible'); Candy.View.Pane.Chat.rooms[roomJid].enableScroll = enableScroll; @@ -172,14 +176,14 @@ Candy.View.Pane = (function(self, $) { $(Candy).triggerHandler('candy:view.message.before-render', renderEvtData); var html = Mustache.to_html(renderEvtData.template, renderEvtData.templateData); - self.Room.appendToMessagePane(roomJid, html); - var elem = self.Room.getPane(roomJid, '.message-pane').children().last(); + Room.appendToMessagePane(roomJid, html); + var elem = Room.getPane(roomJid, '.message-pane').children().last(); // click on username opens private chat elem.find('a.label').click(function(event) { event.preventDefault(); // Check if user is online and not myself var room = Candy.Core.getRoom(roomJid); - if(room && name !== self.Room.getUser(Candy.View.getCurrent().roomJid).getNick() && room.getRoster().get(roomJid + '/' + name)) { + if(room && name !== Room.getUser(Candy.View.getCurrent().roomJid).getNick() && room.getRoster().get(roomJid + '/' + name)) { if(Candy.View.Pane.PrivateRoom.open(roomJid + '/' + name, name, true) === false) { return false; } @@ -212,19 +216,19 @@ Candy.View.Pane = (function(self, $) { // Check to see if in-core notifications are disabled if(!Candy.Core.getOptions().disableCoreNotifications) { - if(Candy.View.getCurrent().roomJid !== roomJid || !self.Window.hasFocus()) { - self.Chat.increaseUnreadMessages(roomJid); - if(!self.Window.hasFocus()) { + if(Candy.View.getCurrent().roomJid !== roomJid || !Window.hasFocus()) { + Chat.increaseUnreadMessages(roomJid); + if(!Window.hasFocus()) { // Notify the user about a new private message OR on all messages if configured if(Candy.View.Pane.Chat.rooms[roomJid].type === 'chat' || Candy.View.getOptions().updateWindowOnAllMessages === true) { - self.Chat.Toolbar.playSound(); + Chat.Toolbar.playSound(); } } } } if(Candy.View.getCurrent().roomJid === roomJid) { - self.Room.scrollToBottom(roomJid); + Room.scrollToBottom(roomJid); } } @@ -244,4 +248,6 @@ Candy.View.Pane = (function(self, $) { }; return self; -}(Candy.View.Pane || {}, jQuery)); +}({}, jQuery)); + +export default Pane.Message; diff --git a/src/view/pane/privateRoom.js b/src/view/pane/privateRoom.js index 6afda69..a94df9e 100644 --- a/src/view/pane/privateRoom.js +++ b/src/view/pane/privateRoom.js @@ -7,6 +7,10 @@ /* global Candy, Strophe, jQuery */ +import Chat from './chat.js'; +import Room from './room.js'; +import Roster from './roster.js'; + /** Class: Candy.View.Pane * Candy view pane handles everything regarding DOM updates etc. * @@ -14,7 +18,7 @@ * (Candy.View.Pane) self - itself * (jQuery) $ - jQuery */ -Candy.View.Pane = (function(self, $) { +var Pane = (function(self, $) { /** Class: Candy.View.Pane.PrivateRoom * Private room handling @@ -35,7 +39,7 @@ Candy.View.Pane = (function(self, $) { * candy:view.private-room.after-open using {roomJid, type, element} */ open: function(roomJid, roomName, switchToRoom, isNoConferenceRoomJid) { - var user = isNoConferenceRoomJid ? Candy.Core.getUser() : self.Room.getUser(Strophe.getBareJidFromJid(roomJid)), + var user = isNoConferenceRoomJid ? Candy.Core.getUser() : Room.getUser(Strophe.getBareJidFromJid(roomJid)), evtData = { 'roomJid': roomJid, 'roomName': roomName, @@ -61,20 +65,20 @@ Candy.View.Pane = (function(self, $) { if (Candy.Core.getUser().isInPrivacyList('ignore', roomJid)) { return false; } - if(!self.Chat.rooms[roomJid]) { - if(self.Room.init(roomJid, roomName, 'chat') === false) { + if(!Chat.rooms[roomJid]) { + if(Room.init(roomJid, roomName, 'chat') === false) { return false; } } if(switchToRoom) { - self.Room.show(roomJid); + Room.show(roomJid); } - self.Roster.update(roomJid, new Candy.Core.ChatUser(roomJid, roomName), 'join', user); - self.Roster.update(roomJid, user, 'join', user); + Roster.update(roomJid, new Candy.Core.ChatUser(roomJid, roomName), 'join', user); + Roster.update(roomJid, user, 'join', user); self.PrivateRoom.setStatus(roomJid, 'join'); - evtData.element = self.Room.getPane(roomJid); + evtData.element = Room.getPane(roomJid); /** Event: candy:view.private-room.after-open * After opening a new private room * @@ -94,16 +98,16 @@ Candy.View.Pane = (function(self, $) { * (String) status - "leave"/"join" */ setStatus: function(roomJid, status) { - var messageForm = self.Room.getPane(roomJid, '.message-form'); + var messageForm = Room.getPane(roomJid, '.message-form'); if(status === 'join') { - self.Chat.getTab(roomJid).addClass('online').removeClass('offline'); + Chat.getTab(roomJid).addClass('online').removeClass('offline'); messageForm.children('.field').removeAttr('disabled'); messageForm.children('.submit').removeAttr('disabled'); - self.Chat.getTab(roomJid); + Chat.getTab(roomJid); } else if(status === 'leave') { - self.Chat.getTab(roomJid).addClass('offline').removeClass('online'); + Chat.getTab(roomJid).addClass('offline').removeClass('online'); messageForm.children('.field').attr('disabled', true); messageForm.children('.submit').attr('disabled', true); @@ -124,22 +128,22 @@ Candy.View.Pane = (function(self, $) { newPrivateRoomJid = roomJid + '/' + user.getNick(), previousPrivateRoomId = Candy.Util.jidToId(previousPrivateRoomJid), newPrivateRoomId = Candy.Util.jidToId(newPrivateRoomJid), - room = self.Chat.rooms[previousPrivateRoomJid], + room = Chat.rooms[previousPrivateRoomJid], roomElement, roomTabElement; // it could happen that the new private room is already existing -> close it first. // if this is not done, errors appear as two rooms would have the same id - if (self.Chat.rooms[newPrivateRoomJid]) { - self.Room.close(newPrivateRoomJid); + if (Chat.rooms[newPrivateRoomJid]) { + Room.close(newPrivateRoomJid); } if (room) { /* someone I talk with, changed nick */ room.name = user.getNick(); room.id = newPrivateRoomId; - self.Chat.rooms[newPrivateRoomJid] = room; - delete self.Chat.rooms[previousPrivateRoomJid]; + Chat.rooms[newPrivateRoomJid] = room; + delete Chat.rooms[previousPrivateRoomJid]; roomElement = $('#chat-room-' + previousPrivateRoomId); if (roomElement) { @@ -166,10 +170,12 @@ Candy.View.Pane = (function(self, $) { } } if (roomElement && roomElement.length) { - self.Roster.changeNick(previousPrivateRoomId, user); + Roster.changeNick(previousPrivateRoomId, user); } } }; return self; -}(Candy.View.Pane || {}, jQuery)); +}({}, jQuery)); + +export default Pane.PrivateRoom; diff --git a/src/view/pane/room.js b/src/view/pane/room.js index 2b42cd6..1b4234f 100644 --- a/src/view/pane/room.js +++ b/src/view/pane/room.js @@ -7,6 +7,11 @@ /* global Candy, Mustache, Strophe, jQuery */ +import Chat from './chat.js'; +import Message from './message.js'; +import Room from './room.js'; +import Window from './window.js'; + /** Class: Candy.View.Pane * Candy view pane handles everything regarding DOM updates etc. * @@ -14,7 +19,7 @@ * (Candy.View.Pane) self - itself * (jQuery) $ - jQuery */ -Candy.View.Pane = (function(self, $) { +var Pane = (function(self, $) { /** Class: Candy.View.Pane.Room * Everything which belongs to room view things belongs here. @@ -62,12 +67,12 @@ Candy.View.Pane = (function(self, $) { } // First room, show sound control - if(Candy.Util.isEmptyObject(self.Chat.rooms)) { - self.Chat.Toolbar.show(); + if(Candy.Util.isEmptyObject(Chat.rooms)) { + Chat.Toolbar.show(); } var roomId = Candy.Util.jidToId(roomJid); - self.Chat.rooms[roomJid] = {id: roomId, usercount: 0, name: roomName, type: roomType, messageCount: 0, scrollPosition: -1, targetJid: roomJid}; + Chat.rooms[roomJid] = {id: roomId, usercount: 0, name: roomName, type: roomType, messageCount: 0, scrollPosition: -1, targetJid: roomJid}; $('#chat-rooms').append(Mustache.to_html(Candy.View.Template.Room.pane, { roomId: roomId, @@ -84,11 +89,11 @@ Candy.View.Pane = (function(self, $) { messages: Candy.View.Template.Message.pane, form: Candy.View.Template.Room.form })); - self.Chat.addTab(roomJid, roomName, roomType); - self.Room.getPane(roomJid, '.message-form').submit(self.Message.submit); - self.Room.scrollToBottom(roomJid); + Chat.addTab(roomJid, roomName, roomType); + Room.getPane(roomJid, '.message-form').submit(Message.submit); + Room.scrollToBottom(roomJid); - evtData.element = self.Room.getPane(roomJid); + evtData.element = Room.getPane(roomJid); /** Event: candy:view.room.after-add * After initialising a room @@ -114,7 +119,7 @@ Candy.View.Pane = (function(self, $) { * candy:view.room.after-hide using {roomJid, element} */ show: function(roomJid) { - var roomId = self.Chat.rooms[roomJid].id, + var roomId = Chat.rooms[roomJid].id, evtData; $('.room-pane').each(function() { @@ -128,11 +133,11 @@ Candy.View.Pane = (function(self, $) { if(elem.attr('id') === ('chat-room-' + roomId)) { elem.show(); Candy.View.getCurrent().roomJid = roomJid; - self.Chat.setActiveTab(roomJid); - self.Chat.Toolbar.update(roomJid); - self.Chat.clearUnreadMessages(roomJid); - self.Room.setFocusToForm(roomJid); - self.Room.scrollToBottom(roomJid); + Chat.setActiveTab(roomJid); + Chat.Toolbar.update(roomJid); + Chat.clearUnreadMessages(roomJid); + Room.setFocusToForm(roomJid); + Room.scrollToBottom(roomJid); /** Event: candy:view.room.after-show * After showing a room @@ -175,13 +180,13 @@ Candy.View.Pane = (function(self, $) { var timestamp = new Date(); var html = Mustache.to_html(Candy.View.Template.Room.subject, { subject: subject, - roomName: self.Chat.rooms[roomJid].name, + roomName: Chat.rooms[roomJid].name, _roomSubject: $.i18n._('roomSubject'), time: Candy.Util.localizedTime(timestamp), timestamp: timestamp.toISOString() }); - self.Room.appendToMessagePane(roomJid, html); - self.Room.scrollToBottom(roomJid); + Room.appendToMessagePane(roomJid, html); + Room.scrollToBottom(roomJid); /** Event: candy:view.room.after-subject-change * After changing the subject of a room @@ -193,7 +198,7 @@ Candy.View.Pane = (function(self, $) { */ $(Candy).triggerHandler('candy:view.room.after-subject-change', { 'roomJid': roomJid, - 'element' : self.Room.getPane(roomJid), + 'element' : Room.getPane(roomJid), 'subject' : subject }); }, @@ -211,25 +216,25 @@ Candy.View.Pane = (function(self, $) { * (String) roomJid - Room to close */ close: function(roomJid) { - self.Chat.removeTab(roomJid); - self.Window.clearUnreadMessages(); + Chat.removeTab(roomJid); + Window.clearUnreadMessages(); /* TODO: There's a rendering bug in Opera which doesn't redraw (remove) the message form. Only a cosmetical issue (when all tabs are closed) but it's annoying... This happens when form has no focus too. Maybe it's because of CSS positioning. */ - self.Room.getPane(roomJid).remove(); + Room.getPane(roomJid).remove(); var openRooms = $('#chat-rooms').children(); if(Candy.View.getCurrent().roomJid === roomJid) { Candy.View.getCurrent().roomJid = null; if(openRooms.length === 0) { - self.Chat.allTabsClosed(); + Chat.allTabsClosed(); } else { - self.Room.show(openRooms.last().attr('data-roomjid')); + Room.show(openRooms.last().attr('data-roomjid')); } } - delete self.Chat.rooms[roomJid]; + delete Chat.rooms[roomJid]; /** Event: candy:view.room.after-close * After closing a room @@ -250,9 +255,9 @@ Candy.View.Pane = (function(self, $) { * (String) html - rendered message html */ appendToMessagePane: function(roomJid, html) { - self.Room.getPane(roomJid, '.message-pane').append(html); - self.Chat.rooms[roomJid].messageCount++; - self.Room.sliceMessagePane(roomJid); + Room.getPane(roomJid, '.message-pane').append(html); + Chat.rooms[roomJid].messageCount++; + Room.sliceMessagePane(roomJid); }, /** Function: sliceMessagePane @@ -267,11 +272,11 @@ Candy.View.Pane = (function(self, $) { */ sliceMessagePane: function(roomJid) { // Only clean if autoscroll is enabled - if(self.Window.autoscroll) { + if(Window.autoscroll) { var options = Candy.View.getOptions().messages; - if(self.Chat.rooms[roomJid].messageCount > options.limit) { - self.Room.getPane(roomJid, '.message-pane').children().slice(0, options.remove).remove(); - self.Chat.rooms[roomJid].messageCount -= options.remove; + if(Chat.rooms[roomJid].messageCount > options.limit) { + Room.getPane(roomJid, '.message-pane').children().slice(0, options.remove).remove(); + Chat.rooms[roomJid].messageCount -= options.remove; } } }, @@ -286,7 +291,7 @@ Candy.View.Pane = (function(self, $) { * - */ scrollToBottom: function(roomJid) { - self.Room.onScrollToBottom(roomJid); + Room.onScrollToBottom(roomJid); }, /** Function: onScrollToBottom @@ -296,7 +301,7 @@ Candy.View.Pane = (function(self, $) { * (String) roomJid - Room JID */ onScrollToBottom: function(roomJid) { - var messagePane = self.Room.getPane(roomJid, '.message-pane-wrapper'); + var messagePane = Room.getPane(roomJid, '.message-pane-wrapper'); if (Candy.View.Pane.Chat.rooms[roomJid].enableScroll === true) { messagePane.scrollTop(messagePane.prop('scrollHeight')); @@ -315,10 +320,10 @@ Candy.View.Pane = (function(self, $) { onScrollToStoredPosition: function(roomJid) { // This should only apply when entering a room... // ... therefore we set scrollPosition to -1 after execution. - if(self.Chat.rooms[roomJid].scrollPosition > -1) { - var messagePane = self.Room.getPane(roomJid, '.message-pane-wrapper'); - messagePane.scrollTop(self.Chat.rooms[roomJid].scrollPosition); - self.Chat.rooms[roomJid].scrollPosition = -1; + if(Chat.rooms[roomJid].scrollPosition > -1) { + var messagePane = Room.getPane(roomJid, '.message-pane-wrapper'); + messagePane.scrollTop(Chat.rooms[roomJid].scrollPosition); + Chat.rooms[roomJid].scrollPosition = -1; } }, @@ -332,7 +337,7 @@ Candy.View.Pane = (function(self, $) { // If we're on mobile, don't focus the input field. if (Candy.Util.isMobile()) { return true; } - var pane = self.Room.getPane(roomJid, '.message-form'); + var pane = Room.getPane(roomJid, '.message-form'); if (pane) { // IE8 will fail maybe, because the field isn't there yet. try { @@ -352,8 +357,8 @@ Candy.View.Pane = (function(self, $) { * (Candy.Core.ChatUser) user - The user */ setUser: function(roomJid, user) { - self.Chat.rooms[roomJid].user = user; - var roomPane = self.Room.getPane(roomJid), + Chat.rooms[roomJid].user = user; + var roomPane = Room.getPane(roomJid), chatPane = $('#chat-pane'); roomPane.attr('data-userjid', user.getJid()); @@ -368,7 +373,7 @@ Candy.View.Pane = (function(self, $) { } else { chatPane.removeClass('role-moderator affiliation-owner'); } - self.Chat.Context.init(); + Chat.Context.init(); }, /** Function: getUser @@ -381,7 +386,7 @@ Candy.View.Pane = (function(self, $) { * (Candy.Core.ChatUser) - user */ getUser: function(roomJid) { - return self.Chat.rooms[roomJid].user; + return Chat.rooms[roomJid].user; }, /** Function: ignoreUser @@ -448,16 +453,16 @@ Candy.View.Pane = (function(self, $) { * (String) subPane - Sub pane of the chat room pane if needed [optional] */ getPane: function(roomJid, subPane) { - if (self.Chat.rooms[roomJid]) { + if (Chat.rooms[roomJid]) { if(subPane) { - if(self.Chat.rooms[roomJid]['pane-' + subPane]) { - return self.Chat.rooms[roomJid]['pane-' + subPane]; + if(Chat.rooms[roomJid]['pane-' + subPane]) { + return Chat.rooms[roomJid]['pane-' + subPane]; } else { - self.Chat.rooms[roomJid]['pane-' + subPane] = $('#chat-room-' + self.Chat.rooms[roomJid].id).find(subPane); - return self.Chat.rooms[roomJid]['pane-' + subPane]; + Chat.rooms[roomJid]['pane-' + subPane] = $('#chat-room-' + Chat.rooms[roomJid].id).find(subPane); + return Chat.rooms[roomJid]['pane-' + subPane]; } } else { - return $('#chat-room-' + self.Chat.rooms[roomJid].id); + return $('#chat-room-' + Chat.rooms[roomJid].id); } } }, @@ -478,4 +483,6 @@ Candy.View.Pane = (function(self, $) { }; return self; -}(Candy.View.Pane || {}, jQuery)); +}({}, jQuery)); + +export default Pane.Room; diff --git a/src/view/pane/roster.js b/src/view/pane/roster.js index a902639..063d6d5 100644 --- a/src/view/pane/roster.js +++ b/src/view/pane/roster.js @@ -7,6 +7,10 @@ /* global Candy, Mustache, Strophe, jQuery */ +import Chat from './chat.js'; +import PrivateRoom from './privateRoom.js'; +import Room from './room.js'; + /** Class: Candy.View.Pane * Candy view pane handles everything regarding DOM updates etc. * @@ -14,7 +18,7 @@ * (Candy.View.Pane) self - itself * (jQuery) $ - jQuery */ -Candy.View.Pane = (function(self, $) { +var Pane = (function(self, $) { /** Class Candy.View.Pane.Roster * Handles everyhing regarding roster updates. @@ -38,7 +42,7 @@ Candy.View.Pane = (function(self, $) { */ update: function(roomJid, user, action, currentUser) { Candy.Core.log('[View:Pane:Roster] ' + action); - var roomId = self.Chat.rooms[roomJid].id, + var roomId = Chat.rooms[roomJid].id, userId = Candy.Util.jidToId(user.getJid()), usercountDiff = -1, userElem = $('#user-' + roomId + '-' + userId), @@ -73,21 +77,21 @@ Candy.View.Pane = (function(self, $) { userElem.remove(); self.Roster._insertUser(roomJid, roomId, user, userId, currentUser); // it's me, update the toolbar - if(currentUser !== undefined && user.getNick() === currentUser.getNick() && self.Room.getUser(roomJid)) { - self.Chat.Toolbar.update(roomJid); + if(currentUser !== undefined && user.getNick() === currentUser.getNick() && Room.getUser(roomJid)) { + Chat.Toolbar.update(roomJid); } } // Presence of client if (currentUser !== undefined && currentUser.getNick() === user.getNick()) { - self.Room.setUser(roomJid, user); + Room.setUser(roomJid, user); // add click handler for private chat } else { $('#user-' + roomId + '-' + userId).click(self.Roster.userClick); } $('#user-' + roomId + '-' + userId + ' .context').click(function(e) { - self.Chat.Context.show(e.currentTarget, roomJid, user); + Chat.Context.show(e.currentTarget, roomJid, user); e.stopPropagation(); }); @@ -99,27 +103,27 @@ Candy.View.Pane = (function(self, $) { } else if(action === 'leave') { self.Roster.leaveAnimation('user-' + roomId + '-' + userId); // always show leave message in private room, even if status messages have been disabled - if (self.Chat.rooms[roomJid].type === 'chat') { - self.Chat.onInfoMessage(roomJid, null, $.i18n._('userLeftRoom', [user.getNick()])); + if (Chat.rooms[roomJid].type === 'chat') { + Chat.onInfoMessage(roomJid, null, $.i18n._('userLeftRoom', [user.getNick()])); } else { - self.Chat.infoMessage(roomJid, null, $.i18n._('userLeftRoom', [user.getNick()]), ''); + Chat.infoMessage(roomJid, null, $.i18n._('userLeftRoom', [user.getNick()]), ''); } } else if(action === 'nickchange') { usercountDiff = 0; self.Roster.changeNick(roomId, user); - self.Room.changeDataUserJidIfUserIsMe(roomId, user); - self.PrivateRoom.changeNick(roomJid, user); + Room.changeDataUserJidIfUserIsMe(roomId, user); + PrivateRoom.changeNick(roomJid, user); var infoMessage = $.i18n._('userChangedNick', [user.getPreviousNick(), user.getNick()]); - self.Chat.infoMessage(roomJid, null, infoMessage); + Chat.infoMessage(roomJid, null, infoMessage); // user has been kicked } else if(action === 'kick') { self.Roster.leaveAnimation('user-' + roomId + '-' + userId); - self.Chat.onInfoMessage(roomJid, null, $.i18n._('userHasBeenKickedFromRoom', [user.getNick()])); + Chat.onInfoMessage(roomJid, null, $.i18n._('userHasBeenKickedFromRoom', [user.getNick()])); // user has been banned } else if(action === 'ban') { self.Roster.leaveAnimation('user-' + roomId + '-' + userId); - self.Chat.onInfoMessage(roomJid, null, $.i18n._('userHasBeenBannedFromRoom', [user.getNick()])); + Chat.onInfoMessage(roomJid, null, $.i18n._('userHasBeenBannedFromRoom', [user.getNick()])); } // Update user count @@ -163,7 +167,7 @@ Candy.View.Pane = (function(self, $) { }); var userInserted = false, - rosterPane = self.Room.getPane(roomJid, '.roster-pane'); + rosterPane = Room.getPane(roomJid, '.roster-pane'); // there are already users in the roster if(rosterPane.children().length > 0) { @@ -208,7 +212,7 @@ Candy.View.Pane = (function(self, $) { realJid = elem.attr('data-real-jid'), useRealJid = Candy.Core.getOptions().useParticipantRealJid && (realJid !== undefined && realJid !== null && realJid !== ''), targetJid = useRealJid && realJid ? Strophe.getBareJidFromJid(realJid) : elem.attr('data-jid'); - self.PrivateRoom.open(targetJid, elem.attr('data-nick'), true, useRealJid); + PrivateRoom.open(targetJid, elem.attr('data-nick'), true, useRealJid); }, /** Function: showJoinAnimation @@ -223,12 +227,12 @@ Candy.View.Pane = (function(self, $) { if (!user.getPreviousNick() || !$rosterUserElem || $rosterUserElem.is(':visible') === false) { self.Roster.joinAnimation(rosterUserId); // only show other users joining & don't show if there's no message in the room. - if(currentUser !== undefined && user.getNick() !== currentUser.getNick() && self.Room.getUser(roomJid)) { + if(currentUser !== undefined && user.getNick() !== currentUser.getNick() && Room.getUser(roomJid)) { // always show join message in private room, even if status messages have been disabled - if (self.Chat.rooms[roomJid].type === 'chat') { - self.Chat.onInfoMessage(roomJid, null, $.i18n._('userJoinedRoom', [user.getNick()])); + if (Chat.rooms[roomJid].type === 'chat') { + Chat.onInfoMessage(roomJid, null, $.i18n._('userJoinedRoom', [user.getNick()])); } else { - self.Chat.infoMessage(roomJid, null, $.i18n._('userJoinedRoom', [user.getNick()])); + Chat.infoMessage(roomJid, null, $.i18n._('userJoinedRoom', [user.getNick()])); } } } @@ -286,4 +290,6 @@ Candy.View.Pane = (function(self, $) { }; return self; -}(Candy.View.Pane || {}, jQuery)); +}({}, jQuery)); + +export default Pane.Roster; diff --git a/src/view/pane/window.js b/src/view/pane/window.js index 00e2e69..0eb91a5 100644 --- a/src/view/pane/window.js +++ b/src/view/pane/window.js @@ -7,6 +7,9 @@ /* global Candy, jQuery, window */ +import Chat from './chat.js'; +import Room from './room.js'; + /** Class: Candy.View.Pane * Candy view pane handles everything regarding DOM updates etc. * @@ -14,7 +17,7 @@ * (Candy.View.Pane) self - itself * (jQuery) $ - jQuery */ -Candy.View.Pane = (function(self) { +var Pane = (function(self) { /** Class: Candy.View.Pane.Window * Window related view updates @@ -94,8 +97,8 @@ Candy.View.Pane = (function(self) { onFocus: function() { self.Window._hasFocus = true; if (Candy.View.getCurrent().roomJid) { - self.Room.setFocusToForm(Candy.View.getCurrent().roomJid); - self.Chat.clearUnreadMessages(Candy.View.getCurrent().roomJid); + Room.setFocusToForm(Candy.View.getCurrent().roomJid); + Chat.clearUnreadMessages(Candy.View.getCurrent().roomJid); } }, @@ -108,4 +111,6 @@ Candy.View.Pane = (function(self) { }; return self; -}(Candy.View.Pane || {}, jQuery)); +}({}, jQuery)); + +export default Pane.Window; diff --git a/src/view/template.js b/src/view/template.js index 1e74011..089e519 100644 --- a/src/view/template.js +++ b/src/view/template.js @@ -5,12 +5,10 @@ */ 'use strict'; -/* global Candy */ - /** Class: Candy.View.Template * Contains mustache.js templates */ -Candy.View.Template = (function(self){ +export default (function(self){ self.Window = { /** * Unread messages - used to extend the window title @@ -116,4 +114,4 @@ Candy.View.Template = (function(self){ }; return self; -}(Candy.View.Template || {})); +}({})); diff --git a/src/view/translation.js b/src/view/translation.js index 4222117..90cd5d4 100644 --- a/src/view/translation.js +++ b/src/view/translation.js @@ -5,12 +5,10 @@ */ 'use strict'; -/* global Candy */ - /** Class: Candy.View.Translation * Contains translations */ -Candy.View.Translation = { +export default { 'en' : { 'status': 'Status: %s', 'statusConnecting': 'Connecting...', diff --git a/tests/candy/unit/candy.js b/tests/candy/unit/candy.js index bd3ea46..4d954f3 100644 --- a/tests/candy/unit/candy.js +++ b/tests/candy/unit/candy.js @@ -5,7 +5,7 @@ define([ , 'intern/chai!expect' , 'intern/order!jquery' , 'intern/order!candy/libs.bundle.js' - , 'intern/order!candy/src/candy.js' + , 'intern/order!candy/candy.bundle.js' ], function (bdd, expect, $) { bdd.describe('Candy', function () { bdd.describe('event triggering', function () { diff --git a/tests/candy/unit/util.js b/tests/candy/unit/util.js index 227d7b1..1e06c3c 100644 --- a/tests/candy/unit/util.js +++ b/tests/candy/unit/util.js @@ -6,9 +6,7 @@ define([ , 'intern/chai!expect' , 'intern/order!jquery' , 'intern/order!candy/libs.bundle.js' - , 'intern/order!candy/src/candy.js' - , 'intern/order!candy/src/core.js' - , 'intern/order!candy/src/util.js' + , 'intern/order!candy/candy.bundle.js' ], function (bdd, expect) { bdd.describe('Candy.Util', function () { bdd.describe('jidToId', function () { -- cgit v1.2.3