From 7b2b3ac37d5e6bae7c37c0c7c8cf94cd8ef4d3b0 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Thu, 19 Feb 2026 15:04:40 +0530 Subject: [PATCH] feat(V5): Update settings pages UI (#13396) # Pull Request Template ## Description This PR updates settings page UI ## Type of change - [x] New feature (non-breaking change which adds functionality) ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --- .../dashboard/assets/scss/_base.scss | 2 +- .../dashboard/assets/scss/_woot.scss | 80 ++ .../AgentCapacityPolicyCard.vue | 4 +- .../AssignmentCard/AssignmentCard.vue | 6 +- .../AssignmentPolicyCard.vue | 32 +- .../components/ExclusionRules.vue | 2 +- .../AssignmentPolicy/components/RadioCard.vue | 60 +- .../Campaigns/CampaignLayout.vue | 10 +- .../dashboard/components-next/CardLayout.vue | 2 +- .../CompaniesHeader/CompanyHeader.vue | 6 +- .../Companies/CompaniesListLayout.vue | 7 +- .../Contacts/ContactLabels/ContactLabels.vue | 4 +- .../Contacts/ContactsHeader/ContactHeader.vue | 4 +- .../ContactsActiveFiltersPreview.vue | 2 +- .../Contacts/ContactsListLayout.vue | 7 +- .../AttributeListItem.vue | 91 +- .../ConversationRequiredAttributeItem.vue | 8 +- .../ConversationRequiredAttributes.vue | 4 +- .../CustomAttributes/AttributeBadge.vue | 16 +- .../components-next/EmptyStateLayout.vue | 2 +- .../HelpCenter/HelpCenterLayout.vue | 11 +- .../Pages/LocalePage/AddLocaleDialog.vue | 1 + .../specs/composeConversationHelper.spec.js | 2 +- .../Settings/SettingsAccordion.vue | 31 + .../Settings/SettingsFieldSection.vue | 37 + .../Settings/SettingsToggleSection.vue | 45 + .../components-next/avatar/Avatar.vue | 22 +- .../components-next/captain/PageLayout.vue | 11 +- .../captain/pageComponents/Paywall.vue | 2 +- .../combobox/ComboBoxDropdown.vue | 4 +- .../FeatureSpotlightPopover.vue | 2 +- .../components-next/icon/provider.js | 4 +- .../icon/specs/provider.spec.js | 4 +- .../dashboard/components-next/input/Input.vue | 4 +- .../{Label => label}/AddLabel.vue | 0 .../dashboard/components-next/label/Label.vue | 71 ++ .../{Label => label}/LabelItem.vue | 0 .../{Label => label}/story/AddLabel.story.vue | 0 .../{Label => label}/story/Label.story.vue | 0 .../{Label => label}/story/fixtures.js | 0 .../pagination/PaginationFooter.vue | 12 +- .../components-next/select/Select.vue | 97 ++ .../components-next/sidebar/ChannelLeaf.vue | 4 +- .../components-next/sidebar/Sidebar.vue | 33 +- .../sidebar/SidebarGroupLeaf.vue | 6 +- .../components-next/switch/Switch.vue | 16 +- .../components-next/table/BaseTable.story.vue | 175 +++ .../components-next/table/BaseTable.vue | 60 + .../components-next/table/BaseTableCell.vue | 22 + .../components-next/table/BaseTableRow.vue | 14 + .../dashboard/components-next/table/index.js | 3 + .../year-in-review/ShareModal.vue | 2 +- .../dashboard/components/FormSection.vue | 31 - .../components/widgets/InboxName.vue | 9 +- .../components/widgets/LoadingState.vue | 2 +- .../components/widgets/SettingIntroBanner.vue | 2 +- .../components/widgets/forms/Input.vue | 6 +- app/javascript/dashboard/helper/inbox.js | 22 +- .../dashboard/helper/specs/inbox.spec.js | 8 +- .../dashboard/i18n/locale/en/agentBots.json | 6 +- .../dashboard/i18n/locale/en/agentMgmt.json | 3 + .../i18n/locale/en/attributesMgmt.json | 3 + .../dashboard/i18n/locale/en/automation.json | 9 +- .../dashboard/i18n/locale/en/cannedMgmt.json | 3 + .../dashboard/i18n/locale/en/customRole.json | 3 + .../dashboard/i18n/locale/en/inboxMgmt.json | 21 +- .../i18n/locale/en/integrationApps.json | 4 + .../i18n/locale/en/integrations.json | 18 +- .../dashboard/i18n/locale/en/labelsMgmt.json | 6 +- .../dashboard/i18n/locale/en/macros.json | 6 +- .../dashboard/i18n/locale/en/mfa.json | 2 +- .../dashboard/i18n/locale/en/sla.json | 13 +- .../i18n/locale/en/teamsSettings.json | 7 +- .../widget-preview/components/Widget.vue | 489 +++++--- .../pages/CampaignsPageRouteView.vue | 2 +- .../companies/pages/CompaniesIndex.vue | 2 +- .../contacts/pages/ContactsIndex.vue | 2 +- .../inbox/components/InboxListHeader.vue | 12 +- .../routes/dashboard/notifications/routes.js | 7 +- .../dashboard/settings/SettingsHeader.vue | 4 +- .../dashboard/settings/SettingsLayout.vue | 2 +- .../settings/SettingsSubPageHeader.vue | 6 +- .../dashboard/settings/SettingsWrapper.vue | 12 +- .../routes/dashboard/settings/Wrapper.vue | 37 +- .../dashboard/settings/account/Index.vue | 3 +- .../account/components/AutoResolve.vue | 4 +- .../account/components/SectionLayout.vue | 17 +- .../dashboard/settings/agentBots/Index.vue | 154 ++- .../dashboard/settings/agents/Index.vue | 202 +-- .../settings/assignmentPolicy/Index.vue | 2 +- .../pages/AgentAssignmentCreatePage.vue | 4 +- .../pages/AgentAssignmentEditPage.vue | 7 +- .../pages/AgentAssignmentIndexPage.vue | 4 +- .../pages/AgentCapacityCreatePage.vue | 4 +- .../pages/AgentCapacityEditPage.vue | 7 +- .../pages/AgentCapacityIndexPage.vue | 4 +- .../components/AgentAssignmentPolicyForm.vue | 11 +- .../dashboard/settings/attributes/Index.vue | 50 +- .../dashboard/settings/auditlogs/Index.vue | 121 +- .../settings/automation/AutomationRuleRow.vue | 98 +- .../dashboard/settings/automation/Index.vue | 45 +- .../dashboard/settings/canned/Index.vue | 211 ++-- .../components/BaseSettingsHeader.vue | 113 +- .../settings/conversationWorkflow/index.vue | 2 +- .../dashboard/settings/customRoles/Index.vue | 57 +- .../component/CustomRolePaywall.vue | 2 +- .../component/CustomRoleTableBody.vue | 85 +- .../dashboard/settings/inbox/ChannelList.vue | 2 +- .../dashboard/settings/inbox/ImapSettings.vue | 134 +- .../settings/inbox/InboxChannels.vue | 2 +- .../routes/dashboard/settings/inbox/Index.vue | 152 +-- .../inbox/PreChatForm/PreChatFields.vue | 117 +- .../settings/inbox/PreChatForm/Settings.vue | 264 ++-- .../dashboard/settings/inbox/Settings.vue | 1078 ++++++++++------- .../dashboard/settings/inbox/SmtpSettings.vue | 176 +-- .../settings/inbox/WidgetBuilder.vue | 443 ------- .../inbox/channels/google/Reauthorize.vue | 5 +- .../inbox/channels/instagram/Reauthorize.vue | 5 +- .../inbox/channels/microsoft/Reauthorize.vue | 5 +- .../inbox/channels/tiktok/Reauthorize.vue | 5 +- .../inbox/channels/whatsapp/Reauthorize.vue | 2 +- .../inbox/components/AccountHealth.vue | 24 +- .../inbox/components/BotConfiguration.vue | 93 +- .../settings/inbox/components/BusinessDay.vue | 161 ++- .../components/SenderNameExamplePreview.vue | 176 ++- .../inbox/components/WeeklyAvailability.vue | 173 +-- .../settings/inbox/facebook/Reauthorize.vue | 2 +- .../dashboard/settings/inbox/inbox.routes.js | 4 +- .../inbox/settingsPage/CollaboratorsPage.vue | 309 ++--- .../inbox/settingsPage/ConfigurationPage.vue | 265 ++-- .../settingsPage/CustomerSatisfactionPage.vue | 329 +++-- .../DashboardApps/DashboardAppsRow.vue | 81 +- .../integrations/DashboardApps/Index.vue | 107 +- .../dashboard/settings/integrations/Index.vue | 25 +- .../settings/integrations/Integration.vue | 6 +- .../integrations/IntegrationHooks.vue | 55 +- .../settings/integrations/IntegrationItem.vue | 30 +- .../settings/integrations/Linear.vue | 22 +- .../integrations/MultipleIntegrationHooks.vue | 211 ++-- .../settings/integrations/Notion.vue | 22 +- .../settings/integrations/Shopify.vue | 124 +- .../integrations/SingleIntegrationHooks.vue | 6 +- .../dashboard/settings/integrations/Slack.vue | 67 +- .../Slack/SelectChannelWarning.vue | 6 +- .../Slack/SlackIntegrationHelpText.vue | 9 +- .../settings/integrations/Webhooks/Index.vue | 47 +- .../integrations/Webhooks/WebhookRow.vue | 83 +- .../integrations/integrations.routes.js | 24 +- .../dashboard/settings/labels/Index.vue | 133 +- .../dashboard/settings/macros/Index.vue | 49 +- .../dashboard/settings/macros/MacroEditor.vue | 2 +- .../dashboard/settings/macros/MacroForm.vue | 6 +- .../settings/macros/MacroProperties.vue | 63 +- .../settings/macros/MacrosTableRow.vue | 105 +- .../settings/profile/AudioAlertCondition.vue | 6 +- .../dashboard/settings/profile/HotKeyCard.vue | 8 +- .../dashboard/settings/profile/Index.vue | 118 +- .../settings/profile/MfaSettings.vue | 21 +- .../settings/profile/MfaSettingsCard.vue | 4 +- .../profile/NotificationPreferences.vue | 18 +- .../settings/profile/profile.routes.js | 4 +- .../reports/components/ReportHeader.vue | 13 +- .../reports/components/ReportsWrapper.vue | 2 +- .../dashboard/settings/security/Index.vue | 5 +- .../security/components/SamlPaywall.vue | 2 +- .../security/components/SamlSettings.vue | 1 + .../routes/dashboard/settings/sla/Index.vue | 212 +++- .../{components => }/SLAPaywallEnterprise.vue | 5 +- .../sla/components/BaseEmptyState.vue | 33 - .../sla/components/SLABusinessHoursLabel.vue | 32 - .../settings/sla/components/SLAEmptyState.vue | 21 - .../settings/sla/components/SLAHeader.vue | 30 - .../settings/sla/components/SLAListItem.vue | 71 -- .../sla/components/SLAListItemLoading.vue | 41 - .../sla/components/SLAResponseTime.vue | 37 - .../settings/teams/AgentSelector.vue | 253 ++-- .../dashboard/settings/teams/Create/Index.vue | 4 +- .../settings/teams/Edit/EditAgents.vue | 6 +- .../dashboard/settings/teams/Edit/Index.vue | 4 +- .../routes/dashboard/settings/teams/Index.vue | 166 ++- .../shared/components/GreetingsEditor.vue | 8 +- theme/icons.js | 140 ++- 182 files changed, 5187 insertions(+), 4297 deletions(-) create mode 100644 app/javascript/dashboard/components-next/Settings/SettingsAccordion.vue create mode 100644 app/javascript/dashboard/components-next/Settings/SettingsFieldSection.vue create mode 100644 app/javascript/dashboard/components-next/Settings/SettingsToggleSection.vue rename app/javascript/dashboard/components-next/{Label => label}/AddLabel.vue (100%) create mode 100644 app/javascript/dashboard/components-next/label/Label.vue rename app/javascript/dashboard/components-next/{Label => label}/LabelItem.vue (100%) rename app/javascript/dashboard/components-next/{Label => label}/story/AddLabel.story.vue (100%) rename app/javascript/dashboard/components-next/{Label => label}/story/Label.story.vue (100%) rename app/javascript/dashboard/components-next/{Label => label}/story/fixtures.js (100%) create mode 100644 app/javascript/dashboard/components-next/select/Select.vue create mode 100644 app/javascript/dashboard/components-next/table/BaseTable.story.vue create mode 100644 app/javascript/dashboard/components-next/table/BaseTable.vue create mode 100644 app/javascript/dashboard/components-next/table/BaseTableCell.vue create mode 100644 app/javascript/dashboard/components-next/table/BaseTableRow.vue create mode 100644 app/javascript/dashboard/components-next/table/index.js delete mode 100644 app/javascript/dashboard/components/FormSection.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/inbox/WidgetBuilder.vue rename app/javascript/dashboard/routes/dashboard/settings/sla/{components => }/SLAPaywallEnterprise.vue (87%) delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/BaseEmptyState.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLABusinessHoursLabel.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAEmptyState.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAHeader.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAListItem.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAListItemLoading.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/settings/sla/components/SLAResponseTime.vue diff --git a/app/javascript/dashboard/assets/scss/_base.scss b/app/javascript/dashboard/assets/scss/_base.scss index 14ae2a9d4..d3d3f6726 100644 --- a/app/javascript/dashboard/assets/scss/_base.scss +++ b/app/javascript/dashboard/assets/scss/_base.scss @@ -66,7 +66,7 @@ textarea { // Field base styles (Input, TextArea, Select) @layer components { .field-base { - @apply block box-border w-full transition-colors duration-[0.25s] ease-[ease-in-out] focus:outline-n-brand dark:focus:outline-n-brand appearance-none mx-0 mt-0 mb-4 py-2 px-3 rounded-lg text-base font-normal bg-n-alpha-black2 placeholder:text-n-slate-10 dark:placeholder:text-n-slate-10 text-n-slate-12 border-none outline outline-1 outline-n-weak dark:outline-n-weak hover:outline-n-slate-6 dark:hover:outline-n-slate-6; + @apply block box-border w-full transition-colors duration-[0.25s] ease-[ease-in-out] focus:outline-n-brand dark:focus:outline-n-brand appearance-none mx-0 mt-0 mb-4 py-2 px-3 rounded-lg text-sm font-normal bg-n-alpha-black2 placeholder:text-n-slate-10 dark:placeholder:text-n-slate-10 text-n-slate-12 border-none outline outline-1 outline-n-weak dark:outline-n-weak hover:outline-n-slate-6 dark:hover:outline-n-slate-6; } .field-disabled { diff --git a/app/javascript/dashboard/assets/scss/_woot.scss b/app/javascript/dashboard/assets/scss/_woot.scss index 40ca7b436..81a4569b5 100644 --- a/app/javascript/dashboard/assets/scss/_woot.scss +++ b/app/javascript/dashboard/assets/scss/_woot.scss @@ -66,4 +66,84 @@ body { -ms-overflow-style: none; /* IE and Edge */ scrollbar-width: none; /* Firefox */ } + + /** + * ============================================================================ + * TYPOGRAPHY UTILITIES + * ============================================================================ + * + * | Class | Use Case | + * |--------------------|----------------------------------------------------| + * | .text-body-main |

, , general body text | + * | .text-body-para |

for paragraphs, larger text blocks | + * | .text-heading-1 |

, page titles, panel headers | + * | .text-heading-2 |

, section headings, card titles | + * | .text-heading-3 |

, card headings, breadcrumbs, subsections | + * | .text-label |