From 48c22da847cf845d07dd4efd95d03389e56340e6 Mon Sep 17 00:00:00 2001 From: Fabian Frei Date: Thu, 9 Jul 2015 11:24:21 +0200 Subject: added manifest.json --- web/static/config/manifest.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 web/static/config/manifest.json diff --git a/web/static/config/manifest.json b/web/static/config/manifest.json new file mode 100644 index 000000000..6110122c2 --- /dev/null +++ b/web/static/config/manifest.json @@ -0,0 +1,13 @@ +{ + "name": "Mattermost", + "icons": [ + { + "src": "../static/iamges/icon50x50.gif", + "sizes": "50x50", + "type": "image/png" + } + ], + "start_url": "/", + "display": "standalone", + "orientation": "portrait" +} \ No newline at end of file -- cgit v1.2.3-1-g7c22 From cb2cb1ee42bcfd2ba0a73c7de748127cd0c9d4a3 Mon Sep 17 00:00:00 2001 From: Fabian Frei Date: Thu, 9 Jul 2015 11:24:46 +0200 Subject: added link to manifest.json and ios metatags --- web/templates/head.html | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/web/templates/head.html b/web/templates/head.html index abcb30700..7c9bb8b6a 100644 --- a/web/templates/head.html +++ b/web/templates/head.html @@ -4,6 +4,19 @@ {{ .Title }} + + + + + + + + + + + + + -- cgit v1.2.3-1-g7c22 From 5df0a55a5ae7a9dae906c0e1bbbe33fe2cbb3a67 Mon Sep 17 00:00:00 2001 From: Fabian Frei Date: Thu, 9 Jul 2015 11:42:41 +0200 Subject: remove newline --- web/templates/head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/templates/head.html b/web/templates/head.html index 7c9bb8b6a..ead648571 100644 --- a/web/templates/head.html +++ b/web/templates/head.html @@ -4,7 +4,7 @@ {{ .Title }} - + -- cgit v1.2.3-1-g7c22 From 38532013fa7e9b152d3750d73c149ff727881342 Mon Sep 17 00:00:00 2001 From: nickago Date: Thu, 9 Jul 2015 10:44:23 -0700 Subject: Time change ping riding on the status interupt for timestamp update --- web/react/components/post_info.jsx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/web/react/components/post_info.jsx b/web/react/components/post_info.jsx index cf01747f0..e06baee87 100644 --- a/web/react/components/post_info.jsx +++ b/web/react/components/post_info.jsx @@ -5,6 +5,15 @@ var UserStore = require('../stores/user_store.jsx'); var utils = require('../utils/utils.jsx'); module.exports = React.createClass({ + componentDidMount: function() { + UserStore.addStatusesChangeListener(this._onChange); + }, + componentWillUnmount: function() { + UserStore.removeStatusesChangeListener(this._onChange); + }, + _onChange: function() { + this.forceUpdate(); + }, getInitialState: function() { return { }; }, -- cgit v1.2.3-1-g7c22 From 44000b58d911af980a604ca977898760b4a35861 Mon Sep 17 00:00:00 2001 From: nickago Date: Thu, 9 Jul 2015 12:05:04 -0700 Subject: Server now notifies users they have been added to a new channel --- api/channel.go | 4 ++++ model/message.go | 1 + web/react/components/sidebar.jsx | 3 +++ 3 files changed, 8 insertions(+) diff --git a/api/channel.go b/api/channel.go index 8264b3e74..88db27def 100644 --- a/api/channel.go +++ b/api/channel.go @@ -655,6 +655,10 @@ func addChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { c.LogAudit("name=" + channel.Name + " user_id=" + userId) + message := model.NewMessage(c.Session.TeamId, "", userId, model.ACTION_USER_ADDED) + + store.PublishAndForget(message) + <-Srv.Store.Channel().UpdateLastViewedAt(id, oUser.Id) w.Write([]byte(cm.ToJson())) } diff --git a/model/message.go b/model/message.go index 47f598af8..b22f470d7 100644 --- a/model/message.go +++ b/model/message.go @@ -15,6 +15,7 @@ const ( ACTION_POST_DELETED = "post_deleted" ACTION_VIEWED = "viewed" ACTION_NEW_USER = "new_user" + ACTION_USER_ADDED = "user_added" ) type Message struct { diff --git a/web/react/components/sidebar.jsx b/web/react/components/sidebar.jsx index 0e4d38fe0..8b1a25dc9 100644 --- a/web/react/components/sidebar.jsx +++ b/web/react/components/sidebar.jsx @@ -263,6 +263,9 @@ var SidebarLoggedIn = React.createClass({ if (ChannelStore.getCurrentId() != msg.channel_id) { AsyncClient.getChannels(true); } + } else if (msg.action == "user_added") { + if (UserStore.getCurrentId() === msg.user_id) + AsyncClient.getChannels(true); } }, updateTitle: function() { -- cgit v1.2.3-1-g7c22 From b1e2eccaf2b73194776c4c74a33e24022e6dd1e8 Mon Sep 17 00:00:00 2001 From: nickago Date: Thu, 9 Jul 2015 12:17:16 -0700 Subject: Added curly brace --- web/react/components/sidebar.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/react/components/sidebar.jsx b/web/react/components/sidebar.jsx index 8b1a25dc9..2095978e8 100644 --- a/web/react/components/sidebar.jsx +++ b/web/react/components/sidebar.jsx @@ -264,8 +264,9 @@ var SidebarLoggedIn = React.createClass({ AsyncClient.getChannels(true); } } else if (msg.action == "user_added") { - if (UserStore.getCurrentId() === msg.user_id) + if (UserStore.getCurrentId() === msg.user_id) { AsyncClient.getChannels(true); + } } }, updateTitle: function() { -- cgit v1.2.3-1-g7c22 From 3371f146f89ef13fcb083b484dd30e9a12f361f9 Mon Sep 17 00:00:00 2001 From: nickago Date: Thu, 9 Jul 2015 12:18:43 -0700 Subject: Minor formatting change --- model/message.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/message.go b/model/message.go index b22f470d7..52ee69e8f 100644 --- a/model/message.go +++ b/model/message.go @@ -15,7 +15,7 @@ const ( ACTION_POST_DELETED = "post_deleted" ACTION_VIEWED = "viewed" ACTION_NEW_USER = "new_user" - ACTION_USER_ADDED = "user_added" + ACTION_USER_ADDED = "user_added" ) type Message struct { -- cgit v1.2.3-1-g7c22 From 702112dfb315462919d276a72be2936ad45d7ceb Mon Sep 17 00:00:00 2001 From: nickago Date: Thu, 9 Jul 2015 14:11:38 -0700 Subject: Placed event listeners on higher level components to avoid app dispatcher vomit --- web/react/components/post_info.jsx | 9 --------- web/react/components/post_list.jsx | 4 ++++ web/react/components/sidebar_right.jsx | 5 +++++ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/web/react/components/post_info.jsx b/web/react/components/post_info.jsx index e06baee87..cf01747f0 100644 --- a/web/react/components/post_info.jsx +++ b/web/react/components/post_info.jsx @@ -5,15 +5,6 @@ var UserStore = require('../stores/user_store.jsx'); var utils = require('../utils/utils.jsx'); module.exports = React.createClass({ - componentDidMount: function() { - UserStore.addStatusesChangeListener(this._onChange); - }, - componentWillUnmount: function() { - UserStore.removeStatusesChangeListener(this._onChange); - }, - _onChange: function() { - this.forceUpdate(); - }, getInitialState: function() { return { }; }, diff --git a/web/react/components/post_list.jsx b/web/react/components/post_list.jsx index d6dc9ce30..2cccdff22 100644 --- a/web/react/components/post_list.jsx +++ b/web/react/components/post_list.jsx @@ -78,6 +78,7 @@ module.exports = React.createClass({ PostStore.addChangeListener(this._onChange); ChannelStore.addChangeListener(this._onChange); + UserStore.addStatusesChangeListener(this._onChange); SocketStore.addChangeListener(this._onSocketChange); $(".post-list-holder-by-time").perfectScrollbar(); @@ -157,6 +158,7 @@ module.exports = React.createClass({ componentWillUnmount: function() { PostStore.removeChangeListener(this._onChange); ChannelStore.removeChangeListener(this._onChange); + UserStore.removeStatusesChangeListener(this._onChange); SocketStore.removeChangeListener(this._onSocketChange); $('body').off('click.userpopover'); }, @@ -193,6 +195,8 @@ module.exports = React.createClass({ this.scrolledToNew = false; } this.setState(newState); + } else { + this.forceUpdate() } }, _onSocketChange: function(msg) { diff --git a/web/react/components/sidebar_right.jsx b/web/react/components/sidebar_right.jsx index 8334b345b..baffa0ab7 100644 --- a/web/react/components/sidebar_right.jsx +++ b/web/react/components/sidebar_right.jsx @@ -16,10 +16,15 @@ module.exports = React.createClass({ componentDidMount: function() { PostStore.addSearchChangeListener(this._onSearchChange); PostStore.addSelectedPostChangeListener(this._onSelectedChange); + UserStore.addStatusesChangeListener(this._onChange); }, componentWillUnmount: function() { PostStore.removeSearchChangeListener(this._onSearchChange); PostStore.removeSelectedPostChangeListener(this._onSelectedChange); + UserStore.removeStatusesChangeListener(this._onChange); + }, + _onChange: function() { + this.forceUpdate(); }, _onSelectedChange: function(from_search) { if (this.isMounted()) { -- cgit v1.2.3-1-g7c22 From fe6f9437ab141b3a433eed66faee60c1d8924a0d Mon Sep 17 00:00:00 2001 From: nickago Date: Thu, 9 Jul 2015 14:55:29 -0700 Subject: Added comments for the force update functions --- web/react/components/post_list.jsx | 1 + web/react/components/sidebar_right.jsx | 1 + 2 files changed, 2 insertions(+) diff --git a/web/react/components/post_list.jsx b/web/react/components/post_list.jsx index 2cccdff22..177e4a1db 100644 --- a/web/react/components/post_list.jsx +++ b/web/react/components/post_list.jsx @@ -196,6 +196,7 @@ module.exports = React.createClass({ } this.setState(newState); } else { + // Updates the timestamp on each post this.forceUpdate() } }, diff --git a/web/react/components/sidebar_right.jsx b/web/react/components/sidebar_right.jsx index baffa0ab7..60c8ffae6 100644 --- a/web/react/components/sidebar_right.jsx +++ b/web/react/components/sidebar_right.jsx @@ -24,6 +24,7 @@ module.exports = React.createClass({ UserStore.removeStatusesChangeListener(this._onChange); }, _onChange: function() { + // Updates the timestamp on each post this.forceUpdate(); }, _onSelectedChange: function(from_search) { -- cgit v1.2.3-1-g7c22 From 34cc2fcd5345a66e35c65567dd7e7b28fa93ea3d Mon Sep 17 00:00:00 2001 From: ralder Date: Fri, 10 Jul 2015 04:36:16 -0700 Subject: fix bugs for pr #150 MM-895 --- web/react/components/channel_loader.jsx | 2 -- web/react/stores/browser_store.jsx | 18 +++++++++++++----- web/react/utils/async_client.jsx | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/web/react/components/channel_loader.jsx b/web/react/components/channel_loader.jsx index 1b389aa1d..b7cb248db 100644 --- a/web/react/components/channel_loader.jsx +++ b/web/react/components/channel_loader.jsx @@ -12,8 +12,6 @@ var Constants = require('../utils/constants.jsx'); module.exports = React.createClass({ componentDidMount: function() { - // Initalize stores - BrowserStore.initalize(); /* Start initial aysnc loads */ AsyncClient.getMe(); diff --git a/web/react/stores/browser_store.jsx b/web/react/stores/browser_store.jsx index b3e54cad5..82cf9a942 100644 --- a/web/react/stores/browser_store.jsx +++ b/web/react/stores/browser_store.jsx @@ -1,44 +1,52 @@ // Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // See License.txt for license information. - var UserStore = require('../stores/user_store.jsx'); // Also change model/utils.go ETAG_ROOT_VERSION var BROWSER_STORE_VERSION = '.1'; -module.exports.initalize = function() { +var _initialized = false; + +function _initialize() { var currentVersion = localStorage.getItem("local_storage_version"); if (currentVersion !== BROWSER_STORE_VERSION) { localStorage.clear(); sessionStorage.clear(); localStorage.setItem("local_storage_version", BROWSER_STORE_VERSION); } + _initialized = true; } module.exports.setItem = function(name, value) { + if (!_initialized) _initialize(); var user_id = UserStore.getCurrentId(); localStorage.setItem(user_id + "_" + name, value); }; module.exports.getItem = function(name) { + if (!_initialized) _initialize(); var user_id = UserStore.getCurrentId(); return localStorage.getItem(user_id + "_" + name); }; module.exports.removeItem = function(name) { + if (!_initialized) _initialize(); var user_id = UserStore.getCurrentId(); localStorage.removeItem(user_id + "_" + name); }; module.exports.setGlobalItem = function(name, value) { + if (!_initialized) _initialize(); localStorage.setItem(name, value); }; module.exports.getGlobalItem = function(name) { + if (!_initialized) _initialize(); return localStorage.getItem(name); }; module.exports.removeGlobalItem = function(name) { + if (!_initialized) _initialize(); localStorage.removeItem(name); }; @@ -53,7 +61,7 @@ module.exports.actionOnItemsWithPrefix = function (prefix, action) { var user_id = UserStore.getCurrentId(); var id_len = user_id.length; var prefix_len = prefix.length; - for (key in localStorage) { + for (var key in localStorage) { if (key.substring(id_len, id_len + prefix_len) === prefix) { var userkey = key.substring(id_len); action(userkey, BrowserStore.getItem(key)); @@ -70,8 +78,8 @@ module.exports.isLocalStorageSupported = function() { localStorage.removeItem("testLocal", '1'); return true; - } + } catch (e) { return false; } -} +}; diff --git a/web/react/utils/async_client.jsx b/web/react/utils/async_client.jsx index a2a6f8db7..87dc91200 100644 --- a/web/react/utils/async_client.jsx +++ b/web/react/utils/async_client.jsx @@ -55,7 +55,7 @@ module.exports.getChannels = function(force, updateLastViewed, checkVersion) { if (checkVersion) { var serverVersion = xhr.getResponseHeader("X-Version-ID"); - if (UserStore.getLastVersion() == undefined) { + if (!UserStore.getLastVersion()) { UserStore.setLastVersion(serverVersion); } -- cgit v1.2.3-1-g7c22