diff --git a/app/livechat/client/views/app/livechatAppearance.js b/app/livechat/client/views/app/livechatAppearance.js index a102a396a4e..71ae119cef6 100644 --- a/app/livechat/client/views/app/livechatAppearance.js +++ b/app/livechat/client/views/app/livechatAppearance.js @@ -1,6 +1,5 @@ /* eslint new-cap: ["error", { "newIsCapExceptions": ["jscolor"] }]*/ import { Meteor } from 'meteor/meteor'; -import { Mongo } from 'meteor/mongo'; import { ReactiveVar } from 'meteor/reactive-var'; import { Template } from 'meteor/templating'; import s from 'underscore.string'; @@ -8,8 +7,9 @@ import toastr from 'toastr'; import { t, handleError } from '../../../../utils'; import './livechatAppearance.html'; +import { APIClient } from '../../../../utils/client'; -const LivechatAppearance = new Mongo.Collection('livechatAppearance'); +const getSettingFromAppearance = (instance, settingName) => instance.appearance.get() && instance.appearance.get().find((setting) => setting._id === settingName); Template.livechatAppearance.helpers({ color() { @@ -107,9 +107,8 @@ Template.livechatAppearance.helpers({ }, }); -Template.livechatAppearance.onCreated(function() { - this.subscribe('livechat:appearance'); - +Template.livechatAppearance.onCreated(async function() { + this.appearance = new ReactiveVar([]); this.title = new ReactiveVar(null); this.color = new ReactiveVar(null); @@ -129,74 +128,44 @@ Template.livechatAppearance.onCreated(function() { this.registrationFormEmailFieldEnabled = new ReactiveVar(null); this.registrationFormMessage = new ReactiveVar(null); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_title'); - this.title.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_title_color'); - this.color.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_show_agent_info'); - this.showAgentInfo.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_show_agent_email'); - this.showAgentEmail.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_display_offline_form'); - this.displayOfflineForm.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_offline_form_unavailable'); - this.offlineUnavailableMessage.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_offline_message'); - this.offlineMessage.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_offline_success_message'); - this.offlineSuccessMessage.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_offline_title'); - this.titleOffline.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_offline_title_color'); - this.colorOffline.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_offline_email'); - this.offlineEmail.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_conversation_finished_message'); - this.conversationFinishedMessage.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_conversation_finished_text'); - this.conversationFinishedText.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_registration_form_message'); - this.registrationFormMessage.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_registration_form'); - this.registrationFormEnabled.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_name_field_registration_form'); - this.registrationFormNameFieldEnabled.set(setting && setting.value); - }); - this.autorun(() => { - const setting = LivechatAppearance.findOne('Livechat_email_field_registration_form'); - this.registrationFormEmailFieldEnabled.set(setting && setting.value); - }); + const { appearance } = await APIClient.v1.get('livechat/appearance'); + this.appearance.set(appearance); + + const livechatTitle = getSettingFromAppearance(this, 'Livechat_title'); + const livechatTitleColor = getSettingFromAppearance(this, 'Livechat_title_color'); + const livechatShowAgentInfo = getSettingFromAppearance(this, 'Livechat_show_agent_info'); + const livechatShowAgentEmail = getSettingFromAppearance(this, 'Livechat_show_agent_email'); + const livechatDisplayOfflineForm = getSettingFromAppearance(this, 'Livechat_display_offline_form'); + const livechatOfflineFormUnavailable = getSettingFromAppearance(this, 'Livechat_offline_form_unavailable'); + const livechatOfflineMessage = getSettingFromAppearance(this, 'Livechat_offline_message'); + const livechatOfflineSuccessMessage = getSettingFromAppearance(this, 'Livechat_offline_success_message'); + const livechatOfflineTitle = getSettingFromAppearance(this, 'Livechat_offline_title'); + const livechatOfflineTitleColor = getSettingFromAppearance(this, 'Livechat_offline_title_color'); + const livechatOfflineEmail = getSettingFromAppearance(this, 'Livechat_offline_email'); + const livechatConversationFinishedMessage = getSettingFromAppearance(this, 'Livechat_conversation_finished_message'); + const livechatRegistrationFormMessage = getSettingFromAppearance(this, 'Livechat_registration_form_message'); + const livechatRegistrationForm = getSettingFromAppearance(this, 'Livechat_registration_form'); + const livechatNameFieldRegistrationForm = getSettingFromAppearance(this, 'Livechat_name_field_registration_form'); + const livechatEmailFieldRegistrationForm = getSettingFromAppearance(this, 'Livechat_email_field_registration_form'); + const conversationFinishedText = getSettingFromAppearance(this, 'Livechat_conversation_finished_text'); + + this.title.set(livechatTitle && livechatTitle.value); + this.color.set(livechatTitleColor && livechatTitleColor.value); + this.showAgentInfo.set(livechatShowAgentInfo && livechatShowAgentInfo.value); + this.showAgentEmail.set(livechatShowAgentEmail && livechatShowAgentEmail.value); + this.displayOfflineForm.set(livechatDisplayOfflineForm && livechatDisplayOfflineForm.value); + this.offlineUnavailableMessage.set(livechatOfflineFormUnavailable && livechatOfflineFormUnavailable.value); + this.offlineMessage.set(livechatOfflineMessage && livechatOfflineMessage.value); + this.offlineSuccessMessage.set(livechatOfflineSuccessMessage && livechatOfflineSuccessMessage.value); + this.titleOffline.set(livechatOfflineTitle && livechatOfflineTitle.value); + this.colorOffline.set(livechatOfflineTitleColor && livechatOfflineTitleColor.value); + this.offlineEmail.set(livechatOfflineEmail && livechatOfflineEmail.value); + this.conversationFinishedMessage.set(livechatConversationFinishedMessage && livechatConversationFinishedMessage.value); + this.registrationFormMessage.set(livechatRegistrationFormMessage && livechatRegistrationFormMessage.value); + this.registrationFormEnabled.set(livechatRegistrationForm && livechatRegistrationForm.value); + this.registrationFormNameFieldEnabled.set(livechatNameFieldRegistrationForm && livechatNameFieldRegistrationForm.value); + this.registrationFormEmailFieldEnabled.set(livechatEmailFieldRegistrationForm && livechatEmailFieldRegistrationForm.value); + this.conversationFinishedText.set(conversationFinishedText && conversationFinishedText.value); }); Template.livechatAppearance.events({ @@ -213,52 +182,52 @@ Template.livechatAppearance.events({ 'click .reset-settings'(e, instance) { e.preventDefault(); - const settingTitle = LivechatAppearance.findOne('Livechat_title'); + const settingTitle = getSettingFromAppearance(instance, 'Livechat_title'); instance.title.set(settingTitle && settingTitle.value); - const settingTitleColor = LivechatAppearance.findOne('Livechat_title_color'); + const settingTitleColor = getSettingFromAppearance(instance, 'Livechat_title_color'); instance.color.set(settingTitleColor && settingTitleColor.value); - const settingShowAgentInfo = LivechatAppearance.findOne('Livechat_show_agent_info'); + const settingShowAgentInfo = getSettingFromAppearance(instance, 'Livechat_show_agent_info'); instance.showAgentInfo.set(settingShowAgentInfo && settingShowAgentInfo.value); - const settingShowAgentEmail = LivechatAppearance.findOne('Livechat_show_agent_email'); + const settingShowAgentEmail = getSettingFromAppearance(instance, 'Livechat_show_agent_email'); instance.showAgentEmail.set(settingShowAgentEmail && settingShowAgentEmail.value); - const settingDiplayOffline = LivechatAppearance.findOne('Livechat_display_offline_form'); + const settingDiplayOffline = getSettingFromAppearance(instance, 'Livechat_display_offline_form'); instance.displayOfflineForm.set(settingDiplayOffline && settingDiplayOffline.value); - const settingFormUnavailable = LivechatAppearance.findOne('Livechat_offline_form_unavailable'); + const settingFormUnavailable = getSettingFromAppearance(instance, 'Livechat_offline_form_unavailable'); instance.offlineUnavailableMessage.set(settingFormUnavailable && settingFormUnavailable.value); - const settingOfflineMessage = LivechatAppearance.findOne('Livechat_offline_message'); + const settingOfflineMessage = getSettingFromAppearance(instance, 'Livechat_offline_message'); instance.offlineMessage.set(settingOfflineMessage && settingOfflineMessage.value); - const settingOfflineSuccess = LivechatAppearance.findOne('Livechat_offline_success_message'); + const settingOfflineSuccess = getSettingFromAppearance(instance, 'Livechat_offline_success_message'); instance.offlineSuccessMessage.set(settingOfflineSuccess && settingOfflineSuccess.value); - const settingOfflineTitle = LivechatAppearance.findOne('Livechat_offline_title'); + const settingOfflineTitle = getSettingFromAppearance(instance, 'Livechat_offline_title'); instance.titleOffline.set(settingOfflineTitle && settingOfflineTitle.value); - const settingOfflineTitleColor = LivechatAppearance.findOne('Livechat_offline_title_color'); + const settingOfflineTitleColor = getSettingFromAppearance(instance, 'Livechat_offline_title_color'); instance.colorOffline.set(settingOfflineTitleColor && settingOfflineTitleColor.value); - const settingConversationFinishedMessage = LivechatAppearance.findOne('Livechat_conversation_finished_message'); + const settingConversationFinishedMessage = getSettingFromAppearance(instance, 'Livechat_conversation_finished_message'); instance.conversationFinishedMessage.set(settingConversationFinishedMessage && settingConversationFinishedMessage.value); - const settingConversationFinishedText = LivechatAppearance.findOne('Livechat_conversation_finished_text'); + const settingConversationFinishedText = getSettingFromAppearance(instance, 'Livechat_conversation_finished_text'); instance.conversationFinishedText.set(settingConversationFinishedText && settingConversationFinishedText.value); - const settingRegistrationFormEnabled = LivechatAppearance.findOne('Livechat_registration_form'); + const settingRegistrationFormEnabled = getSettingFromAppearance(instance, 'Livechat_registration_form'); instance.registrationFormEnabled.set(settingRegistrationFormEnabled && settingRegistrationFormEnabled.value); - const settingRegistrationFormNameFieldEnabled = LivechatAppearance.findOne('Livechat_name_field_registration_form'); + const settingRegistrationFormNameFieldEnabled = getSettingFromAppearance(instance, 'Livechat_name_field_registration_form'); instance.registrationFormNameFieldEnabled.set(settingRegistrationFormNameFieldEnabled && settingRegistrationFormNameFieldEnabled.value); - const settingRegistrationFormEmailFieldEnabled = LivechatAppearance.findOne('Livechat_email_field_registration_form'); + const settingRegistrationFormEmailFieldEnabled = getSettingFromAppearance(instance, 'Livechat_email_field_registration_form'); instance.registrationFormEmailFieldEnabled.set(settingRegistrationFormEmailFieldEnabled && settingRegistrationFormEmailFieldEnabled.value); - const settingRegistrationFormMessage = LivechatAppearance.findOne('Livechat_registration_form_message'); + const settingRegistrationFormMessage = getSettingFromAppearance(instance, 'Livechat_registration_form_message'); instance.registrationFormMessage.set(settingRegistrationFormMessage && settingRegistrationFormMessage.value); }, 'submit .rocket-form'(e, instance) { @@ -338,6 +307,7 @@ Template.livechatAppearance.events({ if (err) { return handleError(err); } + instance.appearance.set(settings); toastr.success(t('Settings_updated')); }); }, diff --git a/app/livechat/imports/server/rest/appearance.js b/app/livechat/imports/server/rest/appearance.js new file mode 100644 index 00000000000..f8345f7d31d --- /dev/null +++ b/app/livechat/imports/server/rest/appearance.js @@ -0,0 +1,12 @@ +import { API } from '../../../../api'; +import { findAppearance } from '../../../server/api/lib/appearance'; + +API.v1.addRoute('livechat/appearance', { authRequired: true }, { + get() { + const { appearance } = Promise.await(findAppearance({ userId: this.userId })); + + return API.v1.success({ + appearance, + }); + }, +}); diff --git a/app/livechat/server/api.js b/app/livechat/server/api.js index 7d1c4a5a8d2..8c59951412a 100644 --- a/app/livechat/server/api.js +++ b/app/livechat/server/api.js @@ -5,4 +5,5 @@ import '../imports/server/rest/users.js'; import '../imports/server/rest/upload.js'; import '../imports/server/rest/inquiries.js'; import '../imports/server/rest/rooms.js'; +import '../imports/server/rest/appearance.js'; import '../imports/server/rest/triggers.js'; diff --git a/app/livechat/server/api/lib/appearance.js b/app/livechat/server/api/lib/appearance.js new file mode 100644 index 00000000000..8d2f6b79963 --- /dev/null +++ b/app/livechat/server/api/lib/appearance.js @@ -0,0 +1,35 @@ +import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission'; +import { Settings } from '../../../../models/server/raw'; + +export async function findAppearance({ userId }) { + if (!await hasPermissionAsync(userId, 'view-livechat-manager')) { + throw new Error('error-not-authorized'); + } + const query = { + _id: { + $in: [ + 'Livechat_title', + 'Livechat_title_color', + 'Livechat_show_agent_info', + 'Livechat_show_agent_email', + 'Livechat_display_offline_form', + 'Livechat_offline_form_unavailable', + 'Livechat_offline_message', + 'Livechat_offline_success_message', + 'Livechat_offline_title', + 'Livechat_offline_title_color', + 'Livechat_offline_email', + 'Livechat_conversation_finished_message', + 'Livechat_registration_form', + 'Livechat_name_field_registration_form', + 'Livechat_email_field_registration_form', + 'Livechat_registration_form_message', + 'Livechat_conversation_finished_text', + ], + }, + }; + + return { + appearance: await Settings.find(query).toArray(), + }; +} diff --git a/app/livechat/server/publications/livechatAppearance.js b/app/livechat/server/publications/livechatAppearance.js index 518aa94680e..c5dd119ecd4 100644 --- a/app/livechat/server/publications/livechatAppearance.js +++ b/app/livechat/server/publications/livechatAppearance.js @@ -4,6 +4,7 @@ import { hasPermission } from '../../../authorization'; import { Settings } from '../../../models'; Meteor.publish('livechat:appearance', function() { + console.warn('The publication "livechat:appearance" is deprecated and will be removed after version v3.0.0'); if (!this.userId) { return this.error(new Meteor.Error('error-not-authorized', 'Not authorized', { publish: 'livechat:appearance' })); } diff --git a/tests/end-to-end/api/livechat/appearance.js b/tests/end-to-end/api/livechat/appearance.js new file mode 100644 index 00000000000..9a2265bee78 --- /dev/null +++ b/tests/end-to-end/api/livechat/appearance.js @@ -0,0 +1,42 @@ +import { getCredentials, api, request, credentials } from '../../../data/api-data.js'; +import { updatePermission, updateSetting } from '../../../data/permissions.helper'; + +describe('LIVECHAT - appearance', function() { + this.retries(0); + + before((done) => getCredentials(done)); + + before((done) => { + updateSetting('Livechat_enabled', true).then(done); + }); + + describe('livechat/appearance', () => { + it('should return an "unauthorized error" when the user does not have the necessary permission', (done) => { + updatePermission('view-livechat-manager', []).then(() => { + request.get(api('livechat/appearance')) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(400) + .expect((res) => { + expect(res.body).to.have.property('success', false); + expect(res.body.error).to.be.equal('error-not-authorized'); + }) + .end(done); + }); + }); + it('should return an array of settings', (done) => { + updatePermission('view-livechat-manager', ['admin']) + .then(() => { + request.get(api('livechat/appearance')) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body.appearance).to.be.an('array'); + }) + .end(done); + }); + }); + }); +});