From 224556fd1b330f3467c2ca79f5c70056f958edb0 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Tue, 28 Apr 2026 10:35:51 +0530 Subject: [PATCH] feat: onboarding account details with enriched data [UPM-17][UPM-18] (#13979) Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> --- app/builders/account_builder.rb | 6 +- app/controllers/api/v1/accounts_controller.rb | 8 +- app/javascript/dashboard/App.vue | 6 +- .../inline-input/InlineInput.vue | 6 + .../helper/AnalyticsHelper/events.js | 5 + .../dashboard/helper/actionCable.js | 5 + .../dashboard/i18n/locale/en/index.js | 2 + .../dashboard/i18n/locale/en/onboarding.json | 34 ++ .../routes/dashboard/dashboard.routes.js | 9 + .../routes/dashboard/onboarding/Index.vue | 417 ++++++++++++++++++ .../onboarding/OnboardingFormRow.vue | 18 + .../onboarding/OnboardingFormSelect.vue | 37 ++ .../dashboard/onboarding/OnboardingLayout.vue | 120 +++++ .../onboarding/OnboardingSection.vue | 49 ++ .../routes/dashboard/onboarding/constants.js | 68 +++ app/javascript/dashboard/routes/index.js | 30 +- app/javascript/dashboard/routes/index.spec.js | 10 +- .../dashboard/store/modules/accounts.js | 19 +- .../dashboard/store/modules/auth.js | 14 + .../modules/specs/auth/mutations.spec.js | 42 ++ .../dashboard/store/mutation-types.js | 1 + app/models/account.rb | 8 + .../api/v1/models/_account.json.jbuilder | 4 +- app/views/api/v1/models/_user.json.jbuilder | 1 + lib/tasks/onboarding.rake | 14 + spec/builders/account_builder_spec.rb | 5 + .../api/v1/accounts_controller_spec.rb | 10 + theme/icons.js | 5 + 28 files changed, 926 insertions(+), 27 deletions(-) create mode 100644 app/javascript/dashboard/i18n/locale/en/onboarding.json create mode 100644 app/javascript/dashboard/routes/dashboard/onboarding/Index.vue create mode 100644 app/javascript/dashboard/routes/dashboard/onboarding/OnboardingFormRow.vue create mode 100644 app/javascript/dashboard/routes/dashboard/onboarding/OnboardingFormSelect.vue create mode 100644 app/javascript/dashboard/routes/dashboard/onboarding/OnboardingLayout.vue create mode 100644 app/javascript/dashboard/routes/dashboard/onboarding/OnboardingSection.vue create mode 100644 app/javascript/dashboard/routes/dashboard/onboarding/constants.js create mode 100644 lib/tasks/onboarding.rake diff --git a/app/builders/account_builder.rb b/app/builders/account_builder.rb index 532487a1b..5127ea612 100644 --- a/app/builders/account_builder.rb +++ b/app/builders/account_builder.rb @@ -44,7 +44,11 @@ class AccountBuilder end def create_account - @account = Account.create!(name: account_name, locale: I18n.locale) + @account = Account.create!( + name: account_name, + locale: I18n.locale, + custom_attributes: { 'onboarding_step' => 'account_details' } + ) Current.account = @account end diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index 7176d6e1b..dddf3dd09 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -58,6 +58,7 @@ class Api::V1::AccountsController < Api::BaseController @account.assign_attributes(account_params.slice(:name, :locale, :domain, :support_email)) @account.custom_attributes.merge!(custom_attributes_params) @account.settings.merge!(settings_params) + @account.custom_attributes.delete('onboarding_step') if @account.custom_attributes['onboarding_step'] == 'account_details' @account.custom_attributes['onboarding_step'] = 'invite_team' if @account.custom_attributes['onboarding_step'] == 'account_update' @account.save! end @@ -71,9 +72,10 @@ class Api::V1::AccountsController < Api::BaseController private def enqueue_branding_enrichment - return if account_params[:email].blank? + email = account_params[:email].presence || @user&.email + return if email.blank? - Account::BrandingEnrichmentJob.perform_later(@account.id, account_params[:email]) + Account::BrandingEnrichmentJob.perform_later(@account.id, email) Redis::Alfred.set(format(Redis::Alfred::ACCOUNT_ONBOARDING_ENRICHMENT, account_id: @account.id), '1', ex: 30) rescue StandardError => e # Enrichment is optional — never let queue/Redis failures abort signup @@ -109,7 +111,7 @@ class Api::V1::AccountsController < Api::BaseController end def custom_attributes_params - params.permit(:industry, :company_size, :timezone) + params.permit(:industry, :company_size, :timezone, :referral_source, :user_role) end def settings_params diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue index a706e2df5..988829407 100644 --- a/app/javascript/dashboard/App.vue +++ b/app/javascript/dashboard/App.vue @@ -59,7 +59,6 @@ export default { isRTL: 'accounts/isRTL', currentUser: 'getCurrentUser', authUIFlags: 'getAuthUIFlags', - accountUIFlags: 'accounts/getUIFlags', }), hideOnOnboardingView() { return !isOnOnboardingView(this.$route); @@ -107,8 +106,9 @@ export default { this.$store.dispatch('setActiveAccount', { accountId: this.currentAccountId, }); + const account = this.getAccount(this.currentAccountId); const { locale, latest_chatwoot_version: latestChatwootVersion } = - this.getAccount(this.currentAccountId); + account; const { pubsub_token: pubsubToken } = this.currentUser || {}; // If user locale is set, use it; otherwise use account locale this.setLocale(this.uiSettings?.locale || locale); @@ -131,7 +131,7 @@ export default {