mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-30 18:47:51 +00:00 
			
		
		
		
	feat: Add an option to enable/disable email collect box (#2399)
* add email collect enabled migration * migrations * expose enable_email_collect field * add select for email collect * add enable_email condition on new conversation * add default value true for enable_email_collect * add specs for email collect enabled * rereun migration * code cleanup * update token life span to 2 months * revert uuid column
This commit is contained in:
		| @@ -87,12 +87,12 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController | |||||||
|   end |   end | ||||||
|  |  | ||||||
|   def permitted_params |   def permitted_params | ||||||
|     params.permit(:id, :avatar, :name, :greeting_message, :greeting_enabled, channel: |     params.permit(:id, :avatar, :name, :greeting_message, :greeting_enabled, :enable_email_collect, channel: | ||||||
|       [:type, :website_url, :widget_color, :welcome_title, :welcome_tagline, :webhook_url, :email, :reply_time]) |       [:type, :website_url, :widget_color, :welcome_title, :welcome_tagline, :webhook_url, :email, :reply_time]) | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   def inbox_update_params |   def inbox_update_params | ||||||
|     params.permit(:enable_auto_assignment, :name, :avatar, :greeting_message, :greeting_enabled, |     params.permit(:enable_auto_assignment, :enable_email_collect, :name, :avatar, :greeting_message, :greeting_enabled, | ||||||
|                   :working_hours_enabled, :out_of_office_message, :timezone, |                   :working_hours_enabled, :out_of_office_message, :timezone, | ||||||
|                   channel: [ |                   channel: [ | ||||||
|                     :website_url, |                     :website_url, | ||||||
|   | |||||||
| @@ -212,6 +212,10 @@ | |||||||
|       "AUTO_ASSIGNMENT": { |       "AUTO_ASSIGNMENT": { | ||||||
|         "ENABLED": "Enabled", |         "ENABLED": "Enabled", | ||||||
|         "DISABLED": "Disabled" |         "DISABLED": "Disabled" | ||||||
|  |       }, | ||||||
|  |       "EMAIL_COLLECT_BOX": { | ||||||
|  |         "ENABLED": "Enabled", | ||||||
|  |         "DISABLED": "Disabled" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "DELETE": { |     "DELETE": { | ||||||
| @@ -248,6 +252,8 @@ | |||||||
|       "INBOX_AGENTS": "Agents", |       "INBOX_AGENTS": "Agents", | ||||||
|       "INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox", |       "INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox", | ||||||
|       "UPDATE": "Update", |       "UPDATE": "Update", | ||||||
|  |       "ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box", | ||||||
|  |       "ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation", | ||||||
|       "AUTO_ASSIGNMENT": "Enable auto assignment", |       "AUTO_ASSIGNMENT": "Enable auto assignment", | ||||||
|       "INBOX_UPDATE_TITLE": "Inbox Settings", |       "INBOX_UPDATE_TITLE": "Inbox Settings", | ||||||
|       "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", |       "INBOX_UPDATE_SUB_TEXT": "Update your inbox settings", | ||||||
|   | |||||||
| @@ -138,6 +138,23 @@ | |||||||
|           </p> |           </p> | ||||||
|         </label> |         </label> | ||||||
|  |  | ||||||
|  |         <label v-if="isAWebWidgetInbox" class="medium-9 columns"> | ||||||
|  |           {{ $t('INBOX_MGMT.SETTINGS_POPUP.ENABLE_EMAIL_COLLECT_BOX') }} | ||||||
|  |           <select v-model="emailCollectEnabled"> | ||||||
|  |             <option :value="true"> | ||||||
|  |               {{ $t('INBOX_MGMT.EDIT.EMAIL_COLLECT_BOX.ENABLED') }} | ||||||
|  |             </option> | ||||||
|  |             <option :value="false"> | ||||||
|  |               {{ $t('INBOX_MGMT.EDIT.EMAIL_COLLECT_BOX.DISABLED') }} | ||||||
|  |             </option> | ||||||
|  |           </select> | ||||||
|  |           <p class="help-text"> | ||||||
|  |             {{ | ||||||
|  |               $t('INBOX_MGMT.SETTINGS_POPUP.ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT') | ||||||
|  |             }} | ||||||
|  |           </p> | ||||||
|  |         </label> | ||||||
|  |  | ||||||
|         <label class="medium-9 columns"> |         <label class="medium-9 columns"> | ||||||
|           {{ $t('INBOX_MGMT.SETTINGS_POPUP.AUTO_ASSIGNMENT') }} |           {{ $t('INBOX_MGMT.SETTINGS_POPUP.AUTO_ASSIGNMENT') }} | ||||||
|           <select v-model="autoAssignment"> |           <select v-model="autoAssignment"> | ||||||
| @@ -291,6 +308,7 @@ export default { | |||||||
|       greetingEnabled: true, |       greetingEnabled: true, | ||||||
|       greetingMessage: '', |       greetingMessage: '', | ||||||
|       autoAssignment: false, |       autoAssignment: false, | ||||||
|  |       emailCollectEnabled: false, | ||||||
|       isAgentListUpdating: false, |       isAgentListUpdating: false, | ||||||
|       selectedInboxName: '', |       selectedInboxName: '', | ||||||
|       channelWebsiteUrl: '', |       channelWebsiteUrl: '', | ||||||
| @@ -432,6 +450,7 @@ export default { | |||||||
|         this.greetingEnabled = this.inbox.greeting_enabled; |         this.greetingEnabled = this.inbox.greeting_enabled; | ||||||
|         this.greetingMessage = this.inbox.greeting_message; |         this.greetingMessage = this.inbox.greeting_message; | ||||||
|         this.autoAssignment = this.inbox.enable_auto_assignment; |         this.autoAssignment = this.inbox.enable_auto_assignment; | ||||||
|  |         this.emailCollectEnabled = this.inbox.enable_email_collect; | ||||||
|         this.channelWebsiteUrl = this.inbox.website_url; |         this.channelWebsiteUrl = this.inbox.website_url; | ||||||
|         this.channelWelcomeTitle = this.inbox.welcome_title; |         this.channelWelcomeTitle = this.inbox.welcome_title; | ||||||
|         this.channelWelcomeTagline = this.inbox.welcome_tagline; |         this.channelWelcomeTagline = this.inbox.welcome_tagline; | ||||||
| @@ -472,6 +491,7 @@ export default { | |||||||
|           id: this.currentInboxId, |           id: this.currentInboxId, | ||||||
|           name: this.selectedInboxName, |           name: this.selectedInboxName, | ||||||
|           enable_auto_assignment: this.autoAssignment, |           enable_auto_assignment: this.autoAssignment, | ||||||
|  |           enable_email_collect: this.emailCollectEnabled, | ||||||
|           greeting_enabled: this.greetingEnabled, |           greeting_enabled: this.greetingEnabled, | ||||||
|           greeting_message: this.greetingMessage || '', |           greeting_message: this.greetingMessage || '', | ||||||
|           channel: { |           channel: { | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ | |||||||
| #  channel_type           :string | #  channel_type           :string | ||||||
| #  email_address          :string | #  email_address          :string | ||||||
| #  enable_auto_assignment :boolean          default(TRUE) | #  enable_auto_assignment :boolean          default(TRUE) | ||||||
|  | #  enable_email_collect   :boolean          default(TRUE) | ||||||
| #  greeting_enabled       :boolean          default(FALSE) | #  greeting_enabled       :boolean          default(FALSE) | ||||||
| #  greeting_message       :string | #  greeting_message       :string | ||||||
| #  name                   :string           not null | #  name                   :string           not null | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ class MessageTemplates::HookExecutionService | |||||||
|     # ::MessageTemplates::Template::OutOfOffice.new(conversation: conversation).perform if should_send_out_of_office_message? |     # ::MessageTemplates::Template::OutOfOffice.new(conversation: conversation).perform if should_send_out_of_office_message? | ||||||
|  |  | ||||||
|     ::MessageTemplates::Template::Greeting.new(conversation: conversation).perform if should_send_greeting? |     ::MessageTemplates::Template::Greeting.new(conversation: conversation).perform if should_send_greeting? | ||||||
|     ::MessageTemplates::Template::EmailCollect.new(conversation: conversation).perform if should_send_email_collect? |     ::MessageTemplates::Template::EmailCollect.new(conversation: conversation).perform if inbox.enable_email_collect && should_send_email_collect? | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   private |   private | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ json.channel_type resource.channel_type | |||||||
| json.greeting_enabled resource.greeting_enabled | json.greeting_enabled resource.greeting_enabled | ||||||
| json.greeting_message resource.greeting_message | json.greeting_message resource.greeting_message | ||||||
| json.working_hours_enabled resource.working_hours_enabled | json.working_hours_enabled resource.working_hours_enabled | ||||||
|  | json.enable_email_collect resource.enable_email_collect | ||||||
| json.out_of_office_message resource.out_of_office_message | json.out_of_office_message resource.out_of_office_message | ||||||
| json.working_hours resource.weekly_schedule | json.working_hours resource.weekly_schedule | ||||||
| json.timezone resource.timezone | json.timezone resource.timezone | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ DeviseTokenAuth.setup do |config| | |||||||
|  |  | ||||||
|   # By default, users will need to re-authenticate after 2 weeks. This setting |   # By default, users will need to re-authenticate after 2 weeks. This setting | ||||||
|   # determines how long tokens will remain valid after they are issued. |   # determines how long tokens will remain valid after they are issued. | ||||||
|   # config.token_lifespan = 2.weeks |   config.token_lifespan = 2.months | ||||||
|  |  | ||||||
|   # Sets the max number of concurrent devices per user, which is 10 by default. |   # Sets the max number of concurrent devices per user, which is 10 by default. | ||||||
|   # After this limit is reached, the oldest tokens will be removed. |   # After this limit is reached, the oldest tokens will be removed. | ||||||
|   | |||||||
| @@ -0,0 +1,5 @@ | |||||||
|  | class AddEmailCollectToInboxes < ActiveRecord::Migration[6.0] | ||||||
|  |   def change | ||||||
|  |     add_column :inboxes, :enable_email_collect, :boolean, default: true | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -10,7 +10,7 @@ | |||||||
| # | # | ||||||
| # It's strongly recommended that you check this file into your version control system. | # It's strongly recommended that you check this file into your version control system. | ||||||
|  |  | ||||||
| ActiveRecord::Schema.define(version: 2021_05_27_173755) do | ActiveRecord::Schema.define(version: 2021_06_09_133433) do | ||||||
|  |  | ||||||
|   # These are extensions that must be enabled in order to support this database |   # These are extensions that must be enabled in order to support this database | ||||||
|   enable_extension "pg_stat_statements" |   enable_extension "pg_stat_statements" | ||||||
| @@ -322,6 +322,7 @@ ActiveRecord::Schema.define(version: 2021_05_27_173755) do | |||||||
|     t.boolean "working_hours_enabled", default: false |     t.boolean "working_hours_enabled", default: false | ||||||
|     t.string "out_of_office_message" |     t.string "out_of_office_message" | ||||||
|     t.string "timezone", default: "UTC" |     t.string "timezone", default: "UTC" | ||||||
|  |     t.boolean "enable_email_collect", default: true | ||||||
|     t.index ["account_id"], name: "index_inboxes_on_account_id" |     t.index ["account_id"], name: "index_inboxes_on_account_id" | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ describe ::MessageTemplates::HookExecutionService do | |||||||
|       conversation = create(:conversation, contact: contact) |       conversation = create(:conversation, contact: contact) | ||||||
|  |  | ||||||
|       # ensure greeting hook is enabled and greeting_message is present |       # ensure greeting hook is enabled and greeting_message is present | ||||||
|       conversation.inbox.update(greeting_enabled: true, greeting_message: 'Hi, this is a greeting message') |       conversation.inbox.update(greeting_enabled: true, enable_email_collect: true, greeting_message: 'Hi, this is a greeting message') | ||||||
|  |  | ||||||
|       email_collect_service = double |       email_collect_service = double | ||||||
|       greeting_service = double |       greeting_service = double | ||||||
| @@ -55,7 +55,7 @@ describe ::MessageTemplates::HookExecutionService do | |||||||
|       contact = create(:contact, email: nil) |       contact = create(:contact, email: nil) | ||||||
|       conversation = create(:conversation, contact: contact) |       conversation = create(:conversation, contact: contact) | ||||||
|       # ensure greeting hook is enabled |       # ensure greeting hook is enabled | ||||||
|       conversation.inbox.update(greeting_enabled: true) |       conversation.inbox.update(greeting_enabled: true, enable_email_collect: true) | ||||||
|  |  | ||||||
|       email_collect_service = double |       email_collect_service = double | ||||||
|  |  | ||||||
| @@ -70,6 +70,21 @@ describe ::MessageTemplates::HookExecutionService do | |||||||
|       expect(::MessageTemplates::Template::EmailCollect).to have_received(:new).with(conversation: message.conversation) |       expect(::MessageTemplates::Template::EmailCollect).to have_received(:new).with(conversation: message.conversation) | ||||||
|       expect(email_collect_service).to have_received(:perform) |       expect(email_collect_service).to have_received(:perform) | ||||||
|     end |     end | ||||||
|  |  | ||||||
|  |     it 'doesnot calls ::MessageTemplates::Template::EmailCollect when enable_email_collect form is disabled' do | ||||||
|  |       contact = create(:contact, email: nil) | ||||||
|  |       conversation = create(:conversation, contact: contact) | ||||||
|  |  | ||||||
|  |       conversation.inbox.update(enable_email_collect: false) | ||||||
|  |       # ensure prechat form is enabled | ||||||
|  |       conversation.inbox.channel.update(pre_chat_form_enabled: true) | ||||||
|  |       allow(::MessageTemplates::Template::EmailCollect).to receive(:new).and_return(true) | ||||||
|  |  | ||||||
|  |       # described class gets called in message after commit | ||||||
|  |       message = create(:message, conversation: conversation) | ||||||
|  |  | ||||||
|  |       expect(::MessageTemplates::Template::EmailCollect).not_to have_received(:new).with(conversation: message.conversation) | ||||||
|  |     end | ||||||
|   end |   end | ||||||
|  |  | ||||||
|   # TODO: remove this if this hook is removed |   # TODO: remove this if this hook is removed | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Muhsin Keloth
					Muhsin Keloth