diff --git a/app/channel-settings/server/methods/saveRoomSettings.js b/app/channel-settings/server/methods/saveRoomSettings.js index ee21ae0523c7..3223584951e4 100644 --- a/app/channel-settings/server/methods/saveRoomSettings.js +++ b/app/channel-settings/server/methods/saveRoomSettings.js @@ -60,7 +60,7 @@ Meteor.methods({ } if (room.prid) { - throw new Meteor.Error('error-action-not-allowed', 'Editing thread room is not allowed', { + throw new Meteor.Error('error-action-not-allowed', 'Editing discussion room is not allowed', { method: 'saveRoomSettings', action: 'Editing_room', }); diff --git a/app/discussion/client/createDiscussionMessageAction.js b/app/discussion/client/createDiscussionMessageAction.js new file mode 100644 index 000000000000..eebf5853d009 --- /dev/null +++ b/app/discussion/client/createDiscussionMessageAction.js @@ -0,0 +1,53 @@ +import { Meteor } from 'meteor/meteor'; +import { Tracker } from 'meteor/tracker'; + +import { Subscriptions } from '../../models/client'; +import { settings } from '../../settings/client'; +import { hasPermission } from '../../authorization/client'; +import { MessageAction, modal } from '../../ui-utils/client'; +import { t } from '../../utils/client'; + +const condition = (rid, uid) => { + if (!Subscriptions.findOne({ rid })) { + return false; + } + return uid !== Meteor.userId() ? hasPermission('start-discussion-other-user') : hasPermission('start-discussion'); +}; + +Meteor.startup(function() { + Tracker.autorun(() => { + if (!settings.get('Discussion_enabled')) { + return MessageAction.removeButton('start-discussion'); + } + + MessageAction.addButton({ + id: 'start-discussion', + icon: 'discussion', + label: 'Discussion_start', + context: ['message', 'message-mobile'], + async action() { + const [, message] = this._arguments; + + modal.open({ + title: t('Discussion_title'), + modifier: 'modal', + content: 'CreateDiscussion', + data: { rid: message.rid, message, onCreate() { + modal.close(); + } }, + confirmOnEnter: false, + showConfirmButton: false, + showCancelButton: false, + }); + }, + condition({ rid, u: { _id: uid }, drid, dcount }) { + if (drid || !isNaN(dcount)) { + return false; + } + return condition(rid, uid); + }, + order: 0, + group: 'menu', + }); + }); +}); diff --git a/app/discussion/client/discussionFromMessageBox.js b/app/discussion/client/discussionFromMessageBox.js new file mode 100644 index 000000000000..dbade46fc93d --- /dev/null +++ b/app/discussion/client/discussionFromMessageBox.js @@ -0,0 +1,36 @@ +import { Meteor } from 'meteor/meteor'; +import { Tracker } from 'meteor/tracker'; + +import { messageBox, modal } from '../../ui-utils/client'; +import { t } from '../../utils/client'; +import { settings } from '../../settings/client'; + +Meteor.startup(function() { + Tracker.autorun(() => { + if (!settings.get('Discussion_enabled')) { + return messageBox.actions.remove('Create_new', /start-discussion/); + } + messageBox.actions.add('Create_new', 'Discussion', { + id: 'start-discussion', + icon: 'discussion', + condition: () => true, + action(data) { + modal.open({ + title: t('Discussion_title'), + modifier: 'modal', + content: 'CreateDiscussion', + data: { + ...data, + onCreate() { + modal.close(); + }, + }, + showConfirmButton: false, + showCancelButton: false, + confirmOnEnter: false, + }); + }, + }); + + }); +}); diff --git a/app/discussion/client/index.js b/app/discussion/client/index.js new file mode 100644 index 000000000000..9a7bdc13cd5d --- /dev/null +++ b/app/discussion/client/index.js @@ -0,0 +1,16 @@ +// Templates +import './views/creationDialog/CreateDiscussion'; +import './views/DiscussionList'; +import './views/DiscussionTabbar'; + +// Other UI extensions +import './lib/messageTypes/discussionMessage'; +import './lib/discussionsOfRoom'; +import './createDiscussionMessageAction'; +import './discussionFromMessageBox'; +import './tabBar'; + +import '../lib/discussionRoomType'; + +// Style +import './public/stylesheets/discussion.css'; diff --git a/app/discussion/client/lib/discussionsOfRoom.js b/app/discussion/client/lib/discussionsOfRoom.js new file mode 100644 index 000000000000..a620af48a42d --- /dev/null +++ b/app/discussion/client/lib/discussionsOfRoom.js @@ -0,0 +1,3 @@ +import { Mongo } from 'meteor/mongo'; + +export const DiscussionOfRoom = new Mongo.Collection('rocketchat_discussions_of_room'); diff --git a/app/discussion/client/lib/messageTypes/discussionMessage.js b/app/discussion/client/lib/messageTypes/discussionMessage.js new file mode 100644 index 000000000000..5dc928a7f38e --- /dev/null +++ b/app/discussion/client/lib/messageTypes/discussionMessage.js @@ -0,0 +1,17 @@ +import { Meteor } from 'meteor/meteor'; + +import { MessageTypes } from '../../../../ui-utils/client'; + +Meteor.startup(function() { + MessageTypes.registerType({ + id: 'discussion-created', + system: false, + message: 'discussion-created', + data(message) { + return { + // channelLink: `${ TAPi18n.__('discussion') }`, + message: ` ${ message.msg }`, + }; + }, + }); +}); diff --git a/app/discussion/client/public/stylesheets/discussion.css b/app/discussion/client/public/stylesheets/discussion.css new file mode 100644 index 000000000000..93c6d4e8e20f --- /dev/null +++ b/app/discussion/client/public/stylesheets/discussion.css @@ -0,0 +1,22 @@ +.message-discussion { + display: flex; + + padding: 0.5rem 0; + align-items: center; +} + +.discussion-reply-lm { + padding: 4px 8px; + + color: var(--color-gray); + + font-size: 12px; +} + +.discussions-list .load-more { + text-align: center; + text-transform: lowercase; + + font-style: italic; + line-height: 40px; +} diff --git a/app/threading/client/tabBar.js b/app/discussion/client/tabBar.js similarity index 51% rename from app/threading/client/tabBar.js rename to app/discussion/client/tabBar.js index ccff24215665..8ab8d47bda70 100644 --- a/app/threading/client/tabBar.js +++ b/app/discussion/client/tabBar.js @@ -1,13 +1,14 @@ import { Meteor } from 'meteor/meteor'; -import { TabBar } from '../../ui-utils'; + +import { TabBar } from '../../ui-utils/client'; Meteor.startup(function() { return TabBar.addButton({ groups: ['channel', 'group', 'direct'], - id: 'threads', - i18nTitle: 'Threads', - icon: 'thread', - template: 'threadsTabbar', + id: 'discussions', + i18nTitle: 'Discussions', + icon: 'discussion', + template: 'discussionsTabbar', order: 10, }); }); diff --git a/app/threading/client/views/ThreadList.html b/app/discussion/client/views/DiscussionList.html similarity index 76% rename from app/threading/client/views/ThreadList.html rename to app/discussion/client/views/DiscussionList.html index 35df571080ba..4792f63418ce 100644 --- a/app/threading/client/views/ThreadList.html +++ b/app/discussion/client/views/DiscussionList.html @@ -1,7 +1,7 @@ -