From c09f1b9e4e5638080622ff9aa70735db382a16df Mon Sep 17 00:00:00 2001 From: hmhealey Date: Thu, 9 Jul 2015 13:59:19 -0400 Subject: Renamed FullName column in database to Nickname. Renamed all serverside references from FullName to Nickname. --- web/web.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'web') diff --git a/web/web.go b/web/web.go index e771157d8..caa779ec9 100644 --- a/web/web.go +++ b/web/web.go @@ -303,8 +303,8 @@ func getChannel(c *api.Context, w http.ResponseWriter, r *http.Request) { //api.Handle404(w, r) //Bad channel urls just redirect to the town-square for now - - http.Redirect(w,r,"/channels/town-square", http.StatusFound) + + http.Redirect(w, r, "/channels/town-square", http.StatusFound) return } } @@ -351,7 +351,7 @@ func verifyEmail(c *api.Context, w http.ResponseWriter, r *http.Request) { return } else { user := result.Data.(*model.User) - api.FireAndForgetVerifyEmail(user.Id, strings.Split(user.FullName, " ")[0], user.Email, domain, c.TeamUrl) + api.FireAndForgetVerifyEmail(user.Id, strings.Split(user.Nickname, " ")[0], user.Email, domain, c.TeamUrl) http.Redirect(w, r, "/", http.StatusFound) return } -- cgit v1.2.3-1-g7c22 From 1c7f0be268046d2b509e23268eebcbbef78c5a24 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Thu, 9 Jul 2015 15:49:23 -0400 Subject: Renamed all clientside references from full_name to nickname --- web/react/components/channel_header.jsx | 2 +- web/react/components/member_list_team.jsx | 4 ++-- web/react/components/mention_list.jsx | 10 +++++----- web/react/components/post_list.jsx | 2 +- web/react/components/sidebar.jsx | 4 ++-- web/react/components/user_settings.jsx | 14 +++++++------- web/react/stores/user_store.jsx | 4 ++-- web/templates/head.html | 2 +- 8 files changed, 21 insertions(+), 21 deletions(-) (limited to 'web') diff --git a/web/react/components/channel_header.jsx b/web/react/components/channel_header.jsx index 2e430489f..30435dc08 100644 --- a/web/react/components/channel_header.jsx +++ b/web/react/components/channel_header.jsx @@ -153,7 +153,7 @@ module.exports = React.createClass({ if (isDirect) { if (this.state.users.length > 1) { var contact = this.state.users[((this.state.users[0].id === currentId) ? 1 : 0)]; - channelTitle = ; + channelTitle = ; } } diff --git a/web/react/components/member_list_team.jsx b/web/react/components/member_list_team.jsx index 89b5e49d5..8d69a36d3 100644 --- a/web/react/components/member_list_team.jsx +++ b/web/react/components/member_list_team.jsx @@ -85,8 +85,8 @@ var MemberListTeamItem = React.createClass({ return (
- {user.full_name.trim() ? user.full_name : user.username} - {user.full_name.trim() ? user.username : email} + {user.nickname.trim() ? user.nickname : user.username} + {user.nickname.trim() ? user.username : email}
{currentRoles} diff --git a/web/react/components/mention_list.jsx b/web/react/components/mention_list.jsx index c5ff82346..c04e28849 100644 --- a/web/react/components/mention_list.jsx +++ b/web/react/components/mention_list.jsx @@ -165,14 +165,14 @@ module.exports = React.createClass({ var all = {}; all.username = "all"; - all.full_name = ""; + all.nickname = ""; all.secondary_text = "Notifies everyone in the team"; all.id = "allmention"; users.push(all); var channel = {}; channel.username = "channel"; - channel.full_name = ""; + channel.nickname = ""; channel.secondary_text = "Notifies everyone in the channel"; channel.id = "channelmention"; users.push(channel); @@ -189,11 +189,11 @@ module.exports = React.createClass({ if (this.alreadyMentioned(users[i].username)) continue; var firstName = "", lastName = ""; - if (users[i].full_name.length > 0) { - var splitName = users[i].full_name.split(' '); + if (users[i].nickname.length > 0) { + var splitName = users[i].nickname.split(' '); firstName = splitName[0].toLowerCase(); lastName = splitName.length > 1 ? splitName[splitName.length-1].toLowerCase() : ""; - users[i].secondary_text = users[i].full_name; + users[i].secondary_text = users[i].nickname; } if (firstName.lastIndexOf(mentionText,0) === 0 diff --git a/web/react/components/post_list.jsx b/web/react/components/post_list.jsx index 573799a19..5439ca43d 100644 --- a/web/react/components/post_list.jsx +++ b/web/react/components/post_list.jsx @@ -305,7 +305,7 @@ module.exports = React.createClass({ var teammate = utils.getDirectTeammate(channel.id) if (teammate) { - var teammate_name = teammate.full_name.length > 0 ? teammate.full_name : teammate.username; + var teammate_name = teammate.nickname.length > 0 ? teammate.nickname : teammate.username; more_messages = (
diff --git a/web/react/components/sidebar.jsx b/web/react/components/sidebar.jsx index cae9425d3..742720048 100644 --- a/web/react/components/sidebar.jsx +++ b/web/react/components/sidebar.jsx @@ -131,7 +131,7 @@ function getStateFromStores() { var channel = ChannelStore.getByName(channelName); if (channel != null) { - channel.display_name = teammate.full_name.trim() != "" ? teammate.full_name : teammate.username; + channel.display_name = teammate.nickname.trim() != "" ? teammate.nickname : teammate.username; channel.teammate_username = teammate.username; channel.status = UserStore.getStatus(teammate.id); @@ -150,7 +150,7 @@ function getStateFromStores() { var tempChannel = {}; tempChannel.fake = true; tempChannel.name = channelName; - tempChannel.display_name = teammate.full_name.trim() != "" ? teammate.full_name : teammate.username; + tempChannel.display_name = teammate.nickname.trim() != "" ? teammate.nickname : teammate.username; tempChannel.status = UserStore.getStatus(teammate.id); tempChannel.last_post_at = 0; readDirectChannels.push(tempChannel); diff --git a/web/react/components/user_settings.jsx b/web/react/components/user_settings.jsx index 38e4b1aea..9ec7f64c9 100644 --- a/web/react/components/user_settings.jsx +++ b/web/react/components/user_settings.jsx @@ -316,8 +316,8 @@ var NotificationsTab = React.createClass({ if (this.props.activeSection === 'keys') { var user = this.props.user; var first_name = ""; - if (user.full_name.length > 0) { - first_name = user.full_name.split(' ')[0]; + if (user.nickname.length > 0) { + first_name = user.nickname.split(' ')[0]; } var inputs = []; @@ -399,7 +399,7 @@ var NotificationsTab = React.createClass({ if (this.state.first_name_key) { var first_name = ""; var user = this.props.user; - if (user.full_name.length > 0) first_name = user.full_name.split(' ')[0]; + if (user.nickname.length > 0) first_name = user.nickname.split(' ')[0]; if (first_name != "") keys.push(first_name); } if (this.state.username_key) keys.push(this.props.user.username); @@ -761,12 +761,12 @@ var GeneralTab = React.createClass({ var fullName = firstName + ' ' + lastName; - if (user.full_name === fullName) { + if (user.nickname === fullName) { this.setState({client_error: "You must submit a new name"}) return; } - user.full_name = fullName; + user.nickname = fullName; this.submitUser(user); }, @@ -861,7 +861,7 @@ var GeneralTab = React.createClass({ getInitialState: function() { var user = this.props.user; - var splitStr = user.full_name.split(' '); + var splitStr = user.nickname.split(' '); var firstName = splitStr.shift(); var lastName = splitStr.join(' '); @@ -913,7 +913,7 @@ var GeneralTab = React.createClass({ nameSection = ( ); diff --git a/web/react/stores/user_store.jsx b/web/react/stores/user_store.jsx index dd207ca80..c293469e5 100644 --- a/web/react/stores/user_store.jsx +++ b/web/react/stores/user_store.jsx @@ -180,8 +180,8 @@ var UserStore = assign({}, EventEmitter.prototype, { if (user && user.notify_props && user.notify_props.mention_keys) { var keys = user.notify_props.mention_keys.split(','); - if (user.full_name.length > 0 && user.notify_props.first_name === "true") { - var first = user.full_name.split(' ')[0]; + if (user.nickname.length > 0 && user.notify_props.first_name === "true") { + var first = user.nickname.split(' ')[0]; if (first.length > 0) keys.push(first); } diff --git a/web/templates/head.html b/web/templates/head.html index 5b423d487..0cbda28c5 100644 --- a/web/templates/head.html +++ b/web/templates/head.html @@ -59,7 +59,7 @@ var user = window.UserStore.getCurrentUser(true); if (user) { analytics.identify(user.id, { - name: user.full_name, + name: user.nickname, email: user.email, createdAt: user.create_at, username: user.username, -- cgit v1.2.3-1-g7c22 From 8dbf03bd10a440db3896c046de7332806f96e889 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Thu, 9 Jul 2015 17:20:18 -0400 Subject: Add interface to edit a user's nickname directly --- web/react/components/user_settings.jsx | 55 +++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'web') diff --git a/web/react/components/user_settings.jsx b/web/react/components/user_settings.jsx index 9ec7f64c9..c1ea367f2 100644 --- a/web/react/components/user_settings.jsx +++ b/web/react/components/user_settings.jsx @@ -752,6 +752,21 @@ var GeneralTab = React.createClass({ this.submitUser(user); }, + submitNickname: function(e) { + e.preventDefault(); + + var user = UserStore.getCurrentUser(); + var nickname = this.state.nickname.trim(); + + if (user.nickname === nickname) { + this.setState({client_error: "You must submit a new nickname"}) + return; + } + + user.nickname = nickname; + + this.submitUser(user); + }, submitName: function(e) { e.preventDefault(); @@ -839,6 +854,9 @@ var GeneralTab = React.createClass({ updateLastName: function(e) { this.setState({ last_name: e.target.value}); }, + updateNickname: function(e) { + this.setState({nickname: e.target.value}); + }, updateEmail: function(e) { this.setState({ email: e.target.value}); }, @@ -865,7 +883,7 @@ var GeneralTab = React.createClass({ var firstName = splitStr.shift(); var lastName = splitStr.join(' '); - return { username: user.username, first_name: firstName, last_name: lastName, + return { username: user.username, first_name: firstName, last_name: lastName, nickname: user.nickname, email: user.email, picture: null }; }, render: function() { @@ -919,6 +937,39 @@ var GeneralTab = React.createClass({ ); } + var nicknameSection; + if (this.props.activeSection === 'nickname') { + var inputs = []; + + inputs.push( +
+ +
+ +
+
+ ); + + nicknameSection = ( + + ); + } else { + nicknameSection = ( + + ); + } + var usernameSection; if (this.props.activeSection === 'username') { var inputs = []; @@ -1026,6 +1077,8 @@ var GeneralTab = React.createClass({
{usernameSection}
+ {nicknameSection} +
{emailSection}
{pictureSection} -- cgit v1.2.3-1-g7c22 From b620960cdefe87d9e96958ab526c294ee6502a90 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Fri, 10 Jul 2015 15:51:45 -0400 Subject: Fix migration code so that LastName is populated correctly for users who only have one word in their FullName --- web/react/components/user_settings.jsx | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'web') diff --git a/web/react/components/user_settings.jsx b/web/react/components/user_settings.jsx index c1ea367f2..e6eb2b451 100644 --- a/web/react/components/user_settings.jsx +++ b/web/react/components/user_settings.jsx @@ -774,14 +774,13 @@ var GeneralTab = React.createClass({ var firstName = this.state.first_name.trim(); var lastName = this.state.last_name.trim(); - var fullName = firstName + ' ' + lastName; - - if (user.nickname === fullName) { - this.setState({client_error: "You must submit a new name"}) + if (user.first_name === firstName && user.last_name === lastName) { + this.setState({client_error: "You must submit a new first or last name"}) return; } - user.nickname = fullName; + user.first_name = firstName; + user.last_name = lastName; this.submitUser(user); }, @@ -879,11 +878,7 @@ var GeneralTab = React.createClass({ getInitialState: function() { var user = this.props.user; - var splitStr = user.nickname.split(' '); - var firstName = splitStr.shift(); - var lastName = splitStr.join(' '); - - return { username: user.username, first_name: firstName, last_name: lastName, nickname: user.nickname, + return { username: user.username, first_name: user.first_name, last_name: user.last_name, nickname: user.nickname, email: user.email, picture: null }; }, render: function() { @@ -919,7 +914,7 @@ var GeneralTab = React.createClass({ nameSection = ( ); } else { + var full_name = ""; + + if (user.first_name && user.last_name) { + full_name = user.first_name + " " + user.last_name; + } else if (user.first_name) { + full_name = user.first_name; + } else if (user.last_name) { + full_name = user.last_name; + } + nameSection = ( ); -- cgit v1.2.3-1-g7c22 From fb42a74613a6a5c4ebe316cf6e528d74aa74bb78 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Mon, 13 Jul 2015 10:22:10 -0400 Subject: Use User.FirstName instead of trying to infer a user's first name from their nickname in multiple places. --- web/web.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'web') diff --git a/web/web.go b/web/web.go index caa779ec9..b11e6e6b1 100644 --- a/web/web.go +++ b/web/web.go @@ -351,7 +351,7 @@ func verifyEmail(c *api.Context, w http.ResponseWriter, r *http.Request) { return } else { user := result.Data.(*model.User) - api.FireAndForgetVerifyEmail(user.Id, strings.Split(user.Nickname, " ")[0], user.Email, domain, c.TeamUrl) + api.FireAndForgetVerifyEmail(user.Id, user.FirstName, user.Email, domain, c.TeamUrl) http.Redirect(w, r, "/", http.StatusFound) return } -- cgit v1.2.3-1-g7c22 From 079538d9e7d22cd8d5f782f4f7434858bd80d914 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Mon, 13 Jul 2015 15:39:53 -0400 Subject: Use User.FirstName for notifications instead of trying to determine it from User.Nickname --- web/react/components/mention_list.jsx | 14 +++----------- web/react/components/user_settings.jsx | 23 +++++++---------------- web/react/stores/user_store.jsx | 6 +----- 3 files changed, 11 insertions(+), 32 deletions(-) (limited to 'web') diff --git a/web/react/components/mention_list.jsx b/web/react/components/mention_list.jsx index c04e28849..524f1b337 100644 --- a/web/react/components/mention_list.jsx +++ b/web/react/components/mention_list.jsx @@ -188,21 +188,13 @@ module.exports = React.createClass({ for (var i = 0; i < users.length && index < MAX_ITEMS_IN_LIST; i++) { if (this.alreadyMentioned(users[i].username)) continue; - var firstName = "", lastName = ""; - if (users[i].nickname.length > 0) { - var splitName = users[i].nickname.split(' '); - firstName = splitName[0].toLowerCase(); - lastName = splitName.length > 1 ? splitName[splitName.length-1].toLowerCase() : ""; - users[i].secondary_text = users[i].nickname; - } - - if (firstName.lastIndexOf(mentionText,0) === 0 - || lastName.lastIndexOf(mentionText,0) === 0 || users[i].username.lastIndexOf(mentionText,0) === 0) { + if (users[i].first_name.lastIndexOf(mentionText,0) === 0 + || users[i].last_name.lastIndexOf(mentionText,0) === 0 || users[i].username.lastIndexOf(mentionText,0) === 0) { mentions[index] = ( 0) { - first_name = user.nickname.split(' ')[0]; - } - var inputs = []; - if (first_name != "") { + if (user.first_name) { inputs.push(
@@ -396,14 +392,9 @@ var NotificationsTab = React.createClass({ ); } else { var keys = []; - if (this.state.first_name_key) { - var first_name = ""; - var user = this.props.user; - if (user.nickname.length > 0) first_name = user.nickname.split(' ')[0]; - if (first_name != "") keys.push(first_name); - } - if (this.state.username_key) keys.push(this.props.user.username); - if (this.state.mention_key) keys.push('@'+this.props.user.username); + if (this.state.first_name_key) keys.push(user.first_name); + if (this.state.username_key) keys.push(user.username); + if (this.state.mention_key) keys.push('@'+user.username); if (this.state.all_key) keys.push('@all'); if (this.state.channel_key) keys.push('@channel'); if (this.state.custom_keys.length > 0) keys = keys.concat(this.state.custom_keys.split(',')); diff --git a/web/react/stores/user_store.jsx b/web/react/stores/user_store.jsx index c293469e5..e417e72ff 100644 --- a/web/react/stores/user_store.jsx +++ b/web/react/stores/user_store.jsx @@ -180,11 +180,7 @@ var UserStore = assign({}, EventEmitter.prototype, { if (user && user.notify_props && user.notify_props.mention_keys) { var keys = user.notify_props.mention_keys.split(','); - if (user.nickname.length > 0 && user.notify_props.first_name === "true") { - var first = user.nickname.split(' ')[0]; - if (first.length > 0) keys.push(first); - } - + if (user.first_name && user.notify_props.first_name === "true") keys.push(user.first_name); if (user.notify_props.all === "true") keys.push('@all'); if (user.notify_props.channel === "true") keys.push('@channel'); -- cgit v1.2.3-1-g7c22 From e737ec3eb5d16a8ea371c0bd9379d8d0a937764c Mon Sep 17 00:00:00 2001 From: hmhealey Date: Mon, 13 Jul 2015 15:43:05 -0400 Subject: Allow Users to be notified using @all, @channel, and their first name when other notifications are disabled --- web/react/stores/user_store.jsx | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'web') diff --git a/web/react/stores/user_store.jsx b/web/react/stores/user_store.jsx index e417e72ff..b0ea719d4 100644 --- a/web/react/stores/user_store.jsx +++ b/web/react/stores/user_store.jsx @@ -177,17 +177,15 @@ var UserStore = assign({}, EventEmitter.prototype, { }, getCurrentMentionKeys: function() { var user = this.getCurrentUser(); - if (user && user.notify_props && user.notify_props.mention_keys) { - var keys = user.notify_props.mention_keys.split(','); - if (user.first_name && user.notify_props.first_name === "true") keys.push(user.first_name); - if (user.notify_props.all === "true") keys.push('@all'); - if (user.notify_props.channel === "true") keys.push('@channel'); + var keys = []; - return keys; - } else { - return []; - } + if (user.notify_props && user.notify_props.mention_keys) keys = keys.concat(user.notify_props.mention_keys.split(',')); + if (user.first_name && user.notify_props.first_name === "true") keys.push(user.first_name); + if (user.notify_props.all === "true") keys.push('@all'); + if (user.notify_props.channel === "true") keys.push('@channel'); + + return keys; }, getLastVersion: function() { return BrowserStore.getItem("last_version", ''); -- cgit v1.2.3-1-g7c22 From 098cbcdc21effeebe7e57fbd912a785e85cbfc5d Mon Sep 17 00:00:00 2001 From: hmhealey Date: Mon, 13 Jul 2015 17:47:57 -0400 Subject: Unify all locations where we determine a user's display named based off of their nickname/username into a helper function --- web/react/components/member_list_team.jsx | 4 ++-- web/react/components/sidebar.jsx | 4 ++-- web/react/utils/utils.jsx | 8 +++++++- 3 files changed, 11 insertions(+), 5 deletions(-) (limited to 'web') diff --git a/web/react/components/member_list_team.jsx b/web/react/components/member_list_team.jsx index 8d69a36d3..6f1d83193 100644 --- a/web/react/components/member_list_team.jsx +++ b/web/react/components/member_list_team.jsx @@ -85,8 +85,8 @@ var MemberListTeamItem = React.createClass({ return (
- {user.nickname.trim() ? user.nickname : user.username} - {user.nickname.trim() ? user.username : email} + {utils.getDisplayName(user)} + {email}
{currentRoles} diff --git a/web/react/components/sidebar.jsx b/web/react/components/sidebar.jsx index 742720048..65727c597 100644 --- a/web/react/components/sidebar.jsx +++ b/web/react/components/sidebar.jsx @@ -131,7 +131,7 @@ function getStateFromStores() { var channel = ChannelStore.getByName(channelName); if (channel != null) { - channel.display_name = teammate.nickname.trim() != "" ? teammate.nickname : teammate.username; + channel.display_name = utils.getDisplayName(teammate); channel.teammate_username = teammate.username; channel.status = UserStore.getStatus(teammate.id); @@ -150,7 +150,7 @@ function getStateFromStores() { var tempChannel = {}; tempChannel.fake = true; tempChannel.name = channelName; - tempChannel.display_name = teammate.nickname.trim() != "" ? teammate.nickname : teammate.username; + tempChannel.display_name = utils.getDisplayName(teammate); tempChannel.status = UserStore.getStatus(teammate.id); tempChannel.last_post_at = 0; readDirectChannels.push(tempChannel); diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx index 7186251e7..5a1a7ee73 100644 --- a/web/react/utils/utils.jsx +++ b/web/react/utils/utils.jsx @@ -796,7 +796,6 @@ module.exports.getHomeLink = function() { return window.location.protocol + "//" + parts.join("."); } - module.exports.changeColor =function(col, amt) { var usePound = false; @@ -824,5 +823,12 @@ module.exports.changeColor =function(col, amt) { else if (g < 0) g = 0; return (usePound?"#":"") + String("000000" + (g | (b << 8) | (r << 16)).toString(16)).slice(-6); +}; +module.exports.getDisplayName = function(user) { + if (user.nickname && user.nickname.trim().length > 0) { + return user.nickname; + } else { + return user.username; + } }; -- cgit v1.2.3-1-g7c22 From 1dba330146a10718a2fc9eac0ae7d6e1d6bc0d79 Mon Sep 17 00:00:00 2001 From: hmhealey Date: Tue, 14 Jul 2015 17:07:19 -0400 Subject: Use a user's full name as their display name if a nickname hasn't been specified --- web/react/utils/utils.jsx | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'web') diff --git a/web/react/utils/utils.jsx b/web/react/utils/utils.jsx index 5a1a7ee73..416ea5ae4 100644 --- a/web/react/utils/utils.jsx +++ b/web/react/utils/utils.jsx @@ -825,10 +825,28 @@ module.exports.changeColor =function(col, amt) { return (usePound?"#":"") + String("000000" + (g | (b << 8) | (r << 16)).toString(16)).slice(-6); }; +module.exports.getFullName = function(user) { + if (user.first_name && user.last_name) { + return user.first_name + " " + user.last_name; + } else if (user.first_name) { + return user.first_name; + } else if (user.last_name) { + return user.last_name; + } else { + return ""; + } +}; + module.exports.getDisplayName = function(user) { if (user.nickname && user.nickname.trim().length > 0) { return user.nickname; } else { - return user.username; + var fullName = module.exports.getFullName(user); + + if (fullName) { + return fullName; + } else { + return user.username; + } } }; -- cgit v1.2.3-1-g7c22