summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlos Tadeu Panato Junior <ctadeu@gmail.com>2017-07-31 18:54:34 +0200
committerHarrison Healey <harrisonmhealey@gmail.com>2017-07-31 12:54:34 -0400
commit251f000c68ed384923d3b2bc6b3caea9aef2a089 (patch)
treec8740dcf79f1f837529f2a436f1ed377c771ae43
parent489602efe5e099f57bb2b58b7c67f8fc104ff5db (diff)
downloadchat-251f000c68ed384923d3b2bc6b3caea9aef2a089.tar.gz
chat-251f000c68ed384923d3b2bc6b3caea9aef2a089.tar.bz2
chat-251f000c68ed384923d3b2bc6b3caea9aef2a089.zip
[PLT-6710] /rename [text] slash command: Rename the channel (#6570)
* /rename [text] slash command: Rename the channel * update strings per review
-rw-r--r--app/command_channel_rename.go69
-rw-r--r--i18n/en.json36
-rw-r--r--webapp/actions/global_actions.jsx8
-rw-r--r--webapp/components/create_post.jsx6
-rw-r--r--webapp/components/navbar.jsx6
-rw-r--r--webapp/stores/modal_store.jsx1
-rw-r--r--webapp/utils/constants.jsx1
7 files changed, 124 insertions, 3 deletions
diff --git a/app/command_channel_rename.go b/app/command_channel_rename.go
new file mode 100644
index 000000000..f18b127ad
--- /dev/null
+++ b/app/command_channel_rename.go
@@ -0,0 +1,69 @@
+// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package app
+
+import (
+ "github.com/mattermost/platform/model"
+ goi18n "github.com/nicksnyder/go-i18n/i18n"
+)
+
+type RenameProvider struct {
+}
+
+const (
+ CMD_RENAME = "rename"
+)
+
+func init() {
+ RegisterCommandProvider(&RenameProvider{})
+}
+
+func (me *RenameProvider) GetTrigger() string {
+ return CMD_RENAME
+}
+
+func (me *RenameProvider) GetCommand(T goi18n.TranslateFunc) *model.Command {
+ return &model.Command{
+ Trigger: CMD_RENAME,
+ AutoComplete: true,
+ AutoCompleteDesc: T("api.command_channel_rename.desc"),
+ AutoCompleteHint: T("api.command_channel_rename.hint"),
+ DisplayName: T("api.command_channel_rename.name"),
+ }
+}
+
+func (me *RenameProvider) DoCommand(args *model.CommandArgs, message string) *model.CommandResponse {
+ channel, err := GetChannel(args.ChannelId)
+ if err != nil {
+ return &model.CommandResponse{Text: args.T("api.command_channel_rename.channel.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
+ }
+
+ if channel.Type == model.CHANNEL_OPEN && !SessionHasPermissionToChannel(args.Session, args.ChannelId, model.PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES) {
+ return &model.CommandResponse{Text: args.T("api.command_channel_rename.permission.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
+ }
+
+ if channel.Type == model.CHANNEL_PRIVATE && !SessionHasPermissionToChannel(args.Session, args.ChannelId, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_PROPERTIES) {
+ return &model.CommandResponse{Text: args.T("api.command_channel_rename.permission.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
+ }
+
+ if channel.Type == model.CHANNEL_GROUP || channel.Type == model.CHANNEL_DIRECT {
+ return &model.CommandResponse{Text: args.T("api.command_channel_rename.direct_group.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
+ }
+
+ if len(message) == 0 {
+ return &model.CommandResponse{Text: args.T("api.command_channel_rename.message.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
+ }
+
+ patch := &model.ChannelPatch{
+ DisplayName: new(string),
+ }
+ *patch.DisplayName = message
+
+ _, err = PatchChannel(channel, patch, args.UserId)
+ if err != nil {
+ return &model.CommandResponse{Text: args.T("api.command_channel_rename.update_channel.app_error"), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
+ }
+
+ return &model.CommandResponse{}
+}
diff --git a/i18n/en.json b/i18n/en.json
index f1657efcb..d9ba232ef 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -604,6 +604,42 @@
"translation": "Error to update the current channel."
},
{
+ "id": "api.command_channel_rename.name",
+ "translation": "rename"
+ },
+ {
+ "id": "api.command_channel_rename.hint",
+ "translation": "[text]"
+ },
+ {
+ "id": "api.command_channel_rename.desc",
+ "translation": "Rename the channel"
+ },
+ {
+ "id": "api.command_channel_rename.channel.app_error",
+ "translation": "Error to retrieve the current channel."
+ },
+ {
+ "id": "api.command_channel_rename.permission.app_error",
+ "translation": "You do not have the appropriate permissions to rename the channel."
+ },
+ {
+ "id": "api.command_channel_rename.message.app_error",
+ "translation": "A message must be provided with the /rename command."
+ },
+ {
+ "id": "api.command_channel_rename.update_channel.app_error",
+ "translation": "Error to update the current channel."
+ },
+ {
+ "id": "api.command_channel_rename.update_channel.success",
+ "translation": "Channel name successfully updated."
+ },
+ {
+ "id": "api.command_channel_rename.direct_group.app_error",
+ "translation": "Cannot rename direct message channels."
+ },
+ {
"id": "api.command_expand.desc",
"translation": "Turn off auto-collapsing of image previews"
},
diff --git a/webapp/actions/global_actions.jsx b/webapp/actions/global_actions.jsx
index dc5617dde..ce14661f6 100644
--- a/webapp/actions/global_actions.jsx
+++ b/webapp/actions/global_actions.jsx
@@ -235,6 +235,14 @@ export function showChannelPurposeUpdateModal(channel) {
});
}
+export function showChannelNameUpdateModal(channel) {
+ AppDispatcher.handleViewAction({
+ type: ActionTypes.TOGGLE_CHANNEL_NAME_UPDATE_MODAL,
+ value: true,
+ channel
+ });
+}
+
export function showGetPostLinkModal(post) {
AppDispatcher.handleViewAction({
type: ActionTypes.TOGGLE_GET_POST_LINK_MODAL,
diff --git a/webapp/components/create_post.jsx b/webapp/components/create_post.jsx
index 328f182a3..e5ead4e84 100644
--- a/webapp/components/create_post.jsx
+++ b/webapp/components/create_post.jsx
@@ -243,6 +243,12 @@ export default class CreatePost extends React.Component {
return;
}
+ if (!isDirectOrGroup && this.state.message.trimRight() === '/rename') {
+ GlobalActions.showChannelNameUpdateModal(updateChannel);
+ this.setState({message: ''});
+ return;
+ }
+
this.doSubmit(e);
}
diff --git a/webapp/components/navbar.jsx b/webapp/components/navbar.jsx
index fc2ade7ab..81959f352 100644
--- a/webapp/components/navbar.jsx
+++ b/webapp/components/navbar.jsx
@@ -115,6 +115,7 @@ export default class Navbar extends React.Component {
ModalStore.addModalListener(ActionTypes.TOGGLE_QUICK_SWITCH_MODAL, this.toggleQuickSwitchModal);
ModalStore.addModalListener(ActionTypes.TOGGLE_CHANNEL_HEADER_UPDATE_MODAL, this.showEditChannelHeaderModal);
ModalStore.addModalListener(ActionTypes.TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL, this.showChannelPurposeModal);
+ ModalStore.addModalListener(ActionTypes.TOGGLE_CHANNEL_NAME_UPDATE_MODAL, this.showRenameChannelModal);
$('.inner-wrap').click(this.hideSidebars);
document.addEventListener('keydown', this.handleQuickSwitchKeyPress);
}
@@ -128,6 +129,7 @@ export default class Navbar extends React.Component {
ModalStore.removeModalListener(ActionTypes.TOGGLE_QUICK_SWITCH_MODAL, this.toggleQuickSwitchModal);
ModalStore.addModalListener(ActionTypes.TOGGLE_CHANNEL_HEADER_UPDATE_MODAL, this.hideEditChannelHeaderModal);
ModalStore.addModalListener(ActionTypes.TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL, this.hideChannelPurposeModal);
+ ModalStore.addModalListener(ActionTypes.TOGGLE_CHANNEL_NAME_UPDATE_MODAL, this.hideRenameChannelModal);
document.removeEventListener('keydown', this.handleQuickSwitchKeyPress);
}
@@ -218,9 +220,7 @@ export default class Navbar extends React.Component {
});
}
- showRenameChannelModal(e) {
- e.preventDefault();
-
+ showRenameChannelModal() {
this.setState({
showRenameChannelModal: true
});
diff --git a/webapp/stores/modal_store.jsx b/webapp/stores/modal_store.jsx
index 666219d41..34bab780c 100644
--- a/webapp/stores/modal_store.jsx
+++ b/webapp/stores/modal_store.jsx
@@ -43,6 +43,7 @@ class ModalStoreClass extends EventEmitter {
case ActionTypes.TOGGLE_QUICK_SWITCH_MODAL:
case ActionTypes.TOGGLE_CHANNEL_HEADER_UPDATE_MODAL:
case ActionTypes.TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL:
+ case ActionTypes.TOGGLE_CHANNEL_NAME_UPDATE_MODAL:
this.emit(type, value, args);
break;
}
diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx
index 69492e95c..31211952a 100644
--- a/webapp/utils/constants.jsx
+++ b/webapp/utils/constants.jsx
@@ -176,6 +176,7 @@ export const ActionTypes = keyMirror({
TOGGLE_QUICK_SWITCH_MODAL: null,
TOGGLE_CHANNEL_HEADER_UPDATE_MODAL: null,
TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL: null,
+ TOGGLE_CHANNEL_NAME_UPDATE_MODAL: null,
SUGGESTION_PRETEXT_CHANGED: null,
SUGGESTION_RECEIVED_SUGGESTIONS: null,