From b4b308336f85ffae65689015ced8256b5a1e21df Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Mon, 5 Aug 2024 14:02:16 +0530 Subject: [PATCH] feat: Eslint rules (#9839) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Pull Request Template ## Description This PR adds new eslint rules to the code base. **Error rules** | Rule name | Type | Files updated | | ----------------- | --- | - | | `vue/block-order` | error | ✅ | | `vue/component-name-in-template-casing` | error | ✅ | | `vue/component-options-name-casing` | error | ✅ | | `vue/custom-event-name-casing` | error | ✅ | | `vue/define-emits-declaration` | error | ✅ | | `vue/no-unused-properties` | error | ✅ | | `vue/define-macros-order` | error | ✅ | | `vue/define-props-declaration` | error | ✅ | | `vue/match-component-import-name` | error | ✅ | | `vue/next-tick-style` | error | ✅ | | `vue/no-bare-strings-in-template` | error | ✅ | | `vue/no-empty-component-block` | error | ✅ | | `vue/no-multiple-objects-in-class` | error | ✅ | | `vue/no-required-prop-with-default` | error | ✅ | | `vue/no-static-inline-styles` | error | ✅ | | `vue/no-template-target-blank` | error | ✅ | | `vue/no-this-in-before-route-enter` | error | ✅ | | `vue/no-undef-components` | error | ✅ | | `vue/no-unused-emit-declarations` | error | ✅ | | `vue/no-unused-refs` | error | ✅ | | `vue/no-use-v-else-with-v-for` | error | ✅ | | `vue/no-useless-v-bind` | error | ✅ | | `vue/no-v-text` | error | ✅ | | `vue/padding-line-between-blocks` | error | ✅ | | ~`vue/prefer-prop-type-boolean-first`~ | ~error~ | ❌ (removed this rule, cause a bug in displaying custom attributes) | | `vue/prefer-separate-static-class` | error | ✅ | | `vue/prefer-true-attribute-shorthand` | error | ✅ | | `vue/require-explicit-slots` | error | ✅ | | `vue/require-macro-variable-name` | error | ✅ | **Warn rules** | Rule name | Type | Files updated | | ---- | ------------- | ------------- | | `vue/no-root-v-if` | warn | ❎ | Fixes https://linear.app/chatwoot/issue/CW-3492/vue-eslint-rules ## 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 - [x] 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 --------- Co-authored-by: Fayaz Ahmed Co-authored-by: Muhsin Keloth Co-authored-by: Shivam Mishra Co-authored-by: Pranav --- .eslintrc.js | 154 ++++ app/javascript/dashboard/App.vue | 52 +- .../components/Accordion/AccordionItem.vue | 64 +- .../dashboard/components/ChannelSelector.vue | 28 +- .../dashboard/components/ChatList.vue | 239 +++-- .../dashboard/components/ChatListHeader.vue | 26 +- app/javascript/dashboard/components/Code.vue | 48 +- .../dashboard/components/ConversationItem.vue | 46 +- .../dashboard/components/CustomAttribute.vue | 273 +++--- .../components/CustomSnoozeModal.vue | 53 +- .../dashboard/components/FormSection.vue | 26 +- .../components/IntersectionObserver.vue | 8 +- .../dashboard/components/MaskedText.vue | 34 +- app/javascript/dashboard/components/Modal.vue | 66 +- .../dashboard/components/ModalHeader.vue | 48 +- .../dashboard/components/SettingsSection.vue | 46 +- .../dashboard/components/SidemenuIcon.vue | 22 +- .../dashboard/components/Snackbar.vue | 47 +- .../components/SnackbarContainer.vue | 30 +- .../components/app/PaymentPendingBanner.vue | 22 +- .../app/PendingEmailVerificationBanner.vue | 24 +- .../dashboard/components/app/UpdateBanner.vue | 23 +- .../components/app/UpgradeBanner.vue | 22 +- .../dashboard/components/base/Hotkey.vue | 11 +- .../dashboard/components/buttons/Button.vue | 31 +- .../components/buttons/FormSubmitButton.vue | 29 +- .../components/buttons/ResolveAction.vue | 158 ++-- .../components/layout/AvailabilityStatus.vue | 94 +- .../dashboard/components/layout/Sidebar.vue | 71 +- .../sidebarComponents/AccountContext.vue | 66 +- .../sidebarComponents/AccountSelector.vue | 118 +-- .../sidebarComponents/AddAccountModal.vue | 99 +- .../layout/sidebarComponents/AgentDetails.vue | 35 +- .../layout/sidebarComponents/Logo.vue | 15 +- .../sidebarComponents/NotificationBell.vue | 64 +- .../layout/sidebarComponents/OptionsMenu.vue | 216 ++--- .../layout/sidebarComponents/Primary.vue | 85 +- .../sidebarComponents/PrimaryNavItem.vue | 61 +- .../layout/sidebarComponents/Secondary.vue | 55 +- .../SecondaryChildNavItem.vue | 103 +-- .../sidebarComponents/SecondaryNavItem.vue | 190 ++-- .../components/ui/AnnouncementPopup.vue | 43 +- .../dashboard/components/ui/Banner.vue | 84 +- .../dashboard/components/ui/ContextMenu.vue | 21 +- .../components/ui/DatePicker/DatePicker.vue | 17 +- .../DatePicker/components/CalendarAction.vue | 4 +- .../components/CalendarDateRange.vue | 4 +- .../DatePicker/components/CalendarFooter.vue | 2 +- .../DatePicker/components/CalendarMonth.vue | 9 +- .../ui/DatePicker/components/CalendarWeek.vue | 14 +- .../ui/DatePicker/components/CalendarYear.vue | 6 +- .../components/DatePickerButton.vue | 4 +- .../components/ui/DateRangePicker.vue | 30 +- .../components/ui/DateTimePicker.vue | 32 +- .../components/ui/Dropdown/DropdownButton.vue | 1 + .../ui/Dropdown/DropdownEmptyState.vue | 1 + .../components/ui/Dropdown/DropdownList.vue | 13 +- .../ui/Dropdown/DropdownListItemButton.vue | 1 + .../ui/Dropdown/DropdownLoadingState.vue | 1 + .../components/ui/Dropdown/DropdownSearch.vue | 1 + .../components/ui/HelperTextPopup.vue | 1 + .../dashboard/components/ui/Label.vue | 59 +- .../dashboard/components/ui/PreviewCard.vue | 52 +- .../dashboard/components/ui/Switch.vue | 27 +- .../dashboard/components/ui/Tabs/TabsItem.vue | 35 +- .../dashboard/components/ui/TimeAgo.vue | 26 +- .../dashboard/components/ui/Wizard.vue | 74 +- .../dashboard/components/ui/WootButton.vue | 59 +- .../components/widgets/AIAssistanceButton.vue | 76 +- .../widgets/AIAssistanceCTAButton.vue | 20 +- .../components/widgets/AIAssistanceModal.vue | 84 +- .../components/widgets/AICTAModal.vue | 82 +- .../dashboard/components/widgets/AILoader.vue | 2 - .../components/widgets/AttachmentsPreview.vue | 90 +- .../widgets/AutomationActionInput.vue | 208 ++--- .../AutomationActionTeamMessageInput.vue | 54 +- .../widgets/AutomationFileInput.vue | 58 +- .../dashboard/components/widgets/Avatar.vue | 12 +- .../components/widgets/BackButton.vue | 2 +- .../components/widgets/ChannelItem.vue | 19 +- .../components/widgets/ChatTypeTabs.vue | 21 +- .../components/widgets/ColorPicker.vue | 36 +- .../components/widgets/DashboardApp/Frame.vue | 44 +- .../components/widgets/EmptyState.vue | 18 +- .../components/widgets/FeatureToggle.vue | 11 +- .../components/widgets/FilterInput/Index.vue | 293 +++--- .../components/widgets/InboxDropdownItem.vue | 50 +- .../components/widgets/InboxName.vue | 25 +- .../components/widgets/LabelSelector.vue | 62 +- .../components/widgets/LoadingState.vue | 15 +- .../components/widgets/SettingIntroBanner.vue | 30 +- .../dashboard/components/widgets/ShowMore.vue | 26 +- .../components/widgets/TableFooter.vue | 42 +- .../widgets/TableFooterPagination.vue | 125 ++- .../components/widgets/TableFooterResults.vue | 24 +- .../components/widgets/TableHeaderCell.vue | 2 +- .../components/widgets/Thumbnail.vue | 75 +- .../components/widgets/ThumbnailGroup.vue | 37 +- .../components/widgets/UserAvatarWithName.vue | 33 +- .../components/widgets/VideoCallButton.vue | 29 +- .../widgets/WootWriter/AudioRecorder.vue | 22 +- .../components/widgets/WootWriter/Editor.vue | 104 +-- .../widgets/WootWriter/FullEditor.vue | 30 +- .../widgets/WootWriter/ReplyBottomPanel.vue | 281 +++--- .../widgets/WootWriter/ReplyTopPanel.vue | 96 +- .../conversation/AvailabilityStatusBadge.vue | 12 +- .../widgets/conversation/CannedResponse.vue | 24 +- .../ConversationAdvancedFilter.vue | 161 ++-- .../conversation/ConversationBasicFilter.vue | 89 +- .../widgets/conversation/ConversationBox.vue | 132 +-- .../widgets/conversation/ConversationCard.vue | 254 +++--- .../conversation/ConversationHeader.vue | 168 ++-- .../conversation/EmailTranscriptModal.vue | 154 ++-- .../conversation/EmptyState/EmptyState.vue | 68 +- .../EmptyState/EmptyStateMessage.vue | 28 +- .../EmptyState/FeaturePlaceholder.vue | 56 +- .../widgets/conversation/FilterItem.vue | 23 +- .../widgets/conversation/Message.vue | 295 +++--- .../widgets/conversation/MessagePreview.vue | 96 +- .../MessageSignatureMissingAlert.vue | 22 +- .../widgets/conversation/MessagesView.vue | 212 +++-- .../widgets/conversation/MoreActions.vue | 76 +- .../widgets/conversation/OnboardingView.vue | 40 +- .../widgets/conversation/PriorityMark.vue | 48 +- .../widgets/conversation/ReplyBox.vue | 308 ++++--- .../widgets/conversation/ReplyEmailHead.vue | 145 +-- .../widgets/conversation/ReplyToMessage.vue | 30 +- .../widgets/conversation/TagAgents.vue | 80 +- .../widgets/conversation/VariableList.vue | 33 +- .../conversation/WhatsappTemplates/Modal.vue | 48 +- .../WhatsappTemplates/TemplateParser.vue | 84 +- .../WhatsappTemplates/TemplatesPicker.vue | 111 ++- .../widgets/conversation/bubble/Actions.vue | 156 ++-- .../widgets/conversation/bubble/Contact.vue | 36 +- .../widgets/conversation/bubble/File.vue | 42 +- .../widgets/conversation/bubble/Image.vue | 18 +- .../conversation/bubble/ImageAudioVideo.vue | 66 +- .../conversation/bubble/InstagramStory.vue | 27 +- .../bubble/InstagramStoryErrorPlaceHolder.vue | 8 +- .../bubble/InstagramStoryReply.vue | 17 +- .../conversation/bubble/Integration.vue | 15 +- .../widgets/conversation/bubble/MailHead.vue | 63 +- .../widgets/conversation/bubble/ReplyTo.vue | 40 +- .../widgets/conversation/bubble/Text.vue | 81 +- .../conversation/bubble/TranslateModal.vue | 55 +- .../widgets/conversation/bubble/Video.vue | 28 +- .../conversation/bubble/integrations/Dyte.vue | 62 +- .../conversation/components/GalleryView.vue | 363 ++++---- .../conversation/components/SLACardLabel.vue | 100 +-- .../conversation/components/SLAEventItem.vue | 1 + .../components/SLAPopoverCard.vue | 13 +- .../conversation/contextMenu/Index.vue | 150 ++-- .../contextMenu/agentLoadingPlaceholder.vue | 14 +- .../conversation/contextMenu/menuItem.vue | 62 +- .../contextMenu/menuItemWithSubmenu.vue | 30 +- .../conversation/LabelSuggestion.vue | 182 ++-- .../conversationBulkActions/AgentSelector.vue | 198 ++-- .../conversationBulkActions/Index.vue | 229 +++-- .../conversationBulkActions/LabelActions.vue | 149 ++- .../conversationBulkActions/TeamActions.vue | 69 +- .../conversationBulkActions/UpdateActions.vue | 30 +- .../conversationCardComponents/CardLabels.vue | 85 +- .../conversation/linear/CreateIssue.vue | 124 ++- .../conversation/linear/CreateOrLinkIssue.vue | 103 +-- .../widgets/conversation/linear/Issue.vue | 24 +- .../conversation/linear/IssueHeader.vue | 52 +- .../widgets/conversation/linear/LinkIssue.vue | 98 +- .../linear/SearchableDropdown.vue | 71 +- .../widgets/conversation/linear/index.vue | 90 +- .../widgets/forms/AvatarUploader.vue | 70 +- .../components/widgets/forms/Input.vue | 43 +- .../components/widgets/forms/PhoneInput.vue | 186 ++-- .../widgets/mentions/MentionBox.vue | 86 +- .../widgets/modal/ConfirmDeleteModal.vue | 52 +- .../widgets/modal/ConfirmationModal.vue | 31 +- .../components/widgets/modal/DeleteModal.vue | 49 +- .../widgets/modal/WootKeyShortcutModal.vue | 177 ++-- .../i18n/locale/en/advancedFilters.json | 1 + .../dashboard/i18n/locale/en/automation.json | 4 +- .../dashboard/i18n/locale/en/bulkActions.json | 1 + .../dashboard/i18n/locale/en/contact.json | 3 + .../i18n/locale/en/conversation.json | 3 +- .../dashboard/i18n/locale/en/general.json | 6 +- .../dashboard/i18n/locale/en/helpCenter.json | 3 +- .../dashboard/i18n/locale/en/labelsMgmt.json | 3 +- .../dashboard/i18n/locale/en/report.json | 4 +- .../dashboard/i18n/locale/en/search.json | 1 + .../dashboard/mixins/fileUploadMixin.js | 6 + .../dashboard/mixins/macrosMixin.js | 8 + .../modules/contact/ContactMergeModal.vue | 41 +- .../contact/components/AddCustomAttribute.vue | 76 +- .../contact/components/ContactAttribute.vue | 78 +- .../components/ContactDropdownItem.vue | 50 +- .../contact/components/ContactFields.vue | 109 +-- .../contact/components/ContactIntro.vue | 87 +- .../contact/components/ContactPanel.vue | 63 +- .../contact/components/MergeContact.vue | 230 ++--- .../components/MergeContactSummary.vue | 30 +- .../components/MessageContextMenu.vue | 212 ++--- .../modules/notes/NotesOnContactPage.vue | 18 +- .../modules/notes/components/AddNote.vue | 46 +- .../modules/notes/components/ContactNote.vue | 104 +-- .../modules/notes/components/NoteList.vue | 48 +- .../search/components/MessageContent.vue | 34 +- .../modules/search/components/ReadMore.vue | 24 +- .../search/components/SearchHeader.vue | 48 +- .../modules/search/components/SearchInput.vue | 16 +- .../components/SearchResultContactItem.vue | 48 +- .../components/SearchResultContactsList.vue | 46 +- .../SearchResultConversationItem.vue | 80 +- .../SearchResultConversationsList.vue | 46 +- .../components/SearchResultMessagesList.vue | 56 +- .../search/components/SearchResultSection.vue | 35 +- .../modules/search/components/SearchTabs.vue | 29 +- .../modules/search/components/SearchView.vue | 136 +-- .../widget-preview/components/Widget.vue | 99 +- .../widget-preview/components/WidgetBody.vue | 96 +- .../components/WidgetFooter.vue | 56 +- .../widget-preview/components/WidgetHead.vue | 44 +- .../dashboard/routes/dashboard/Dashboard.vue | 82 +- .../routes/dashboard/commands/commandbar.vue | 22 +- .../contacts/components/AddReminder.vue | 86 +- .../contacts/components/ContactInfoPanel.vue | 164 ++-- .../contacts/components/ContactLabels.vue | 19 +- .../components/ContactsAdvancedFilters.vue | 181 ++-- .../contacts/components/ContactsTable.vue | 64 +- .../contacts/components/ContactsView.vue | 162 ++-- .../dashboard/contacts/components/Header.vue | 178 ++-- .../contacts/components/ImportContacts.vue | 86 +- .../contacts/components/ReminderItem.vue | 78 +- .../contacts/components/SectionHeader.vue | 36 +- .../contacts/components/TimelineCard.vue | 59 +- .../contacts/pages/ContactManageView.vue | 110 +-- .../conversation/ContactConversations.vue | 46 +- .../conversation/ContactCustomAttributes.vue | 40 +- .../conversation/ContactDetailsItem.vue | 24 +- .../dashboard/conversation/ContactPanel.vue | 270 +++--- .../conversation/ConversationAction.vue | 162 ++-- .../conversation/ConversationInfo.vue | 1 + .../conversation/ConversationParticipant.vue | 162 ++-- .../conversation/ConversationView.vue | 73 +- .../dashboard/conversation/Macros/List.vue | 70 +- .../conversation/Macros/MacroItem.vue | 68 +- .../conversation/Macros/MacroPreview.vue | 54 +- .../conversation/contact/ContactForm.vue | 302 +++---- .../conversation/contact/ContactInfo.vue | 343 ++++--- .../conversation/contact/ContactInfoRow.vue | 117 +-- .../conversation/contact/ConversationForm.vue | 485 +++++----- .../conversation/contact/CreateContact.vue | 40 +- .../conversation/contact/EditContact.vue | 42 +- .../conversation/contact/NewConversation.vue | 36 +- .../conversation/contact/SocialIcons.vue | 36 +- .../contact/WhatsappTemplates.vue | 38 +- .../customAttributes/CustomAttributes.vue | 84 +- .../conversation/labels/LabelBox.vue | 94 +- .../conversation/search/PopOverSearch.vue | 69 +- .../conversation/search/SwitchLayout.vue | 26 +- .../dashboard/customviews/AddCustomViews.vue | 60 +- .../customviews/DeleteCustomViews.vue | 34 +- .../helpcenter/components/AddLocale.vue | 81 +- .../helpcenter/components/ArticleEditor.vue | 54 +- .../helpcenter/components/ArticleItem.vue | 171 ++-- .../ArticleSearch/ArticleSearchResultItem.vue | 96 +- .../components/ArticleSearch/ArticleView.vue | 82 +- .../components/ArticleSearch/Header.vue | 70 +- .../ArticleSearch/SearchPopover.vue | 68 +- .../ArticleSearch/SearchResults.vue | 62 +- .../helpcenter/components/ArticleTable.vue | 139 +-- .../components/Header/ArticleHeader.vue | 282 +++--- .../components/Header/EditArticleHeader.vue | 223 +++-- .../components/HelpCenterLayout.vue | 120 +-- .../helpcenter/components/PortalListItem.vue | 380 ++++---- .../components/PortalListItemTable.vue | 54 +- .../helpcenter/components/PortalPopover.vue | 84 +- .../components/PortalSettingsBasicForm.vue | 23 +- .../PortalSettingsCustomizationForm.vue | 17 +- .../helpcenter/components/PortalSwitch.vue | 152 ++-- .../helpcenter/components/Sidebar/Sidebar.vue | 82 +- .../components/Sidebar/SidebarHeader.vue | 84 +- .../components/Sidebar/SidebarSearch.vue | 28 +- .../helpcenter/components/UpgradePage.vue | 126 +-- .../pages/articles/ArticleSettings.vue | 259 +++--- .../pages/articles/DefaultPortalArticles.vue | 16 +- .../helpcenter/pages/articles/EditArticle.vue | 97 +- .../pages/articles/ListAllArticles.vue | 81 +- .../pages/articles/ListCategoryArticles.vue | 3 +- .../helpcenter/pages/articles/NewArticle.vue | 51 +- .../pages/categories/AddCategory.vue | 137 +-- .../pages/categories/CategoryListItem.vue | 40 +- .../pages/categories/EditCategory.vue | 141 +-- .../pages/categories/ListAllCategories.vue | 6 +- .../pages/categories/NameEmojiInput.vue | 78 +- .../pages/categories/NewCategory.vue | 3 +- .../pages/categories/ShowCategory.vue | 3 +- .../helpcenter/pages/portals/EditPortal.vue | 71 +- .../pages/portals/EditPortalBasic.vue | 4 +- .../pages/portals/EditPortalCustomization.vue | 2 +- .../pages/portals/EditPortalLocales.vue | 2 +- .../pages/portals/ListAllPortals.vue | 109 ++- .../helpcenter/pages/portals/NewPortal.vue | 56 +- .../pages/portals/PortalCustomization.vue | 2 +- .../pages/portals/PortalDetails.vue | 24 +- .../pages/portals/PortalSettingsFinish.vue | 20 +- .../helpcenter/pages/portals/ShowPortal.vue | 3 +- .../dashboard/inbox/InboxEmptyState.vue | 36 +- .../routes/dashboard/inbox/InboxList.vue | 93 +- .../routes/dashboard/inbox/InboxView.vue | 71 +- .../dashboard/inbox/components/InboxCard.vue | 128 +-- .../inbox/components/InboxContextMenu.vue | 38 +- .../inbox/components/InboxDisplayMenu.vue | 196 ++-- .../inbox/components/InboxItemHeader.vue | 112 +-- .../inbox/components/InboxListHeader.vue | 116 ++- .../inbox/components/InboxNameAndId.vue | 1 + .../inbox/components/InboxOptionMenu.vue | 32 +- .../dashboard/inbox/components/MenuItem.vue | 7 +- .../inbox/components/PaginationButton.vue | 69 +- .../dashboard/inbox/components/StatusIcon.vue | 36 +- .../components/NotificationPanel.vue | 231 +++-- .../components/NotificationPanelItem.vue | 78 +- .../components/NotificationPanelList.vue | 75 +- .../components/NotificationTable.vue | 104 +-- .../components/NotificationsView.vue | 42 +- .../dashboard/settings/SettingsHeader.vue | 79 +- .../dashboard/settings/SettingsLayout.vue | 1 + .../settings/SettingsSubPageHeader.vue | 18 +- .../routes/dashboard/settings/Wrapper.vue | 42 +- .../dashboard/settings/account/Index.vue | 260 +++--- .../dashboard/settings/agentBots/Index.vue | 93 +- .../agentBots/components/AgentBotRow.vue | 66 +- .../agentBots/components/AgentBotType.vue | 24 +- .../agentBots/components/CSMLBotEditor.vue | 102 +-- .../agentBots/components/CSMLMonacoEditor.vue | 29 +- .../settings/agentBots/csml/Edit.vue | 19 +- .../dashboard/settings/agentBots/csml/New.vue | 8 +- .../dashboard/settings/agents/AddAgent.vue | 136 +-- .../dashboard/settings/agents/EditAgent.vue | 156 ++-- .../dashboard/settings/agents/Index.vue | 253 +++--- .../settings/attributes/AddAttribute.vue | 255 +++--- .../settings/attributes/CustomAttribute.vue | 216 ++--- .../settings/attributes/EditAttribute.vue | 339 ++++--- .../dashboard/settings/attributes/Index.vue | 34 +- .../dashboard/settings/auditlogs/Index.vue | 129 +-- .../settings/automation/AddAutomationRule.vue | 313 ++++--- .../automation/EditAutomationRule.vue | 295 +++--- .../dashboard/settings/automation/Index.vue | 251 +++--- .../dashboard/settings/billing/Index.vue | 74 +- .../billing/components/BillingItem.vue | 31 +- .../settings/campaigns/AddCampaign.vue | 355 ++++---- .../dashboard/settings/campaigns/Campaign.vue | 56 +- .../settings/campaigns/CampaignCard.vue | 136 +-- .../settings/campaigns/CampaignsTable.vue | 44 +- .../settings/campaigns/EditCampaign.vue | 229 ++--- .../dashboard/settings/campaigns/Index.vue | 34 +- .../dashboard/settings/canned/AddCanned.vue | 110 +-- .../dashboard/settings/canned/EditCanned.vue | 105 +-- .../dashboard/settings/canned/Index.vue | 261 +++--- .../components/BaseSettingsListItem.vue | 1 + .../dashboard/settings/inbox/AddAgents.vue | 92 +- .../dashboard/settings/inbox/ChannelList.vue | 56 +- .../dashboard/settings/inbox/FinishSetup.vue | 148 +-- .../dashboard/settings/inbox/ImapSettings.vue | 146 +-- .../settings/inbox/InboxChannels.vue | 26 +- .../routes/dashboard/settings/inbox/Index.vue | 269 +++--- .../inbox/PreChatForm/PreChatFields.vue | 71 +- .../settings/inbox/PreChatForm/Settings.vue | 160 ++-- .../dashboard/settings/inbox/Settings.vue | 850 +++++++++--------- .../dashboard/settings/inbox/SmtpSettings.vue | 178 ++-- .../settings/inbox/WidgetBuilder.vue | 308 +++---- .../inbox/channels/360DialogWhatsapp.vue | 116 +-- .../dashboard/settings/inbox/channels/Api.vue | 106 +-- .../settings/inbox/channels/BandwidthSms.vue | 147 ++- .../settings/inbox/channels/CloudWhatsapp.vue | 146 +-- .../settings/inbox/channels/Email.vue | 51 +- .../settings/inbox/channels/Facebook.vue | 188 ++-- .../settings/inbox/channels/Line.vue | 142 +-- .../dashboard/settings/inbox/channels/Sms.vue | 52 +- .../settings/inbox/channels/Telegram.vue | 72 +- .../settings/inbox/channels/Twilio.vue | 217 ++--- .../settings/inbox/channels/Twitter.vue | 36 +- .../settings/inbox/channels/Website.vue | 150 ++-- .../settings/inbox/channels/Whatsapp.vue | 56 +- .../emailChannels/ForwardToOption.vue | 102 +-- .../inbox/channels/emailChannels/Google.vue | 1 + .../channels/emailChannels/OAuthChannel.vue | 3 +- .../inbox/channels/microsoft/Reauthorize.vue | 6 +- .../inbox/components/BotConfiguration.vue | 100 +-- .../settings/inbox/components/BusinessDay.vue | 140 +-- .../components/InboxReconnectionRequired.vue | 2 +- .../inbox/components/InputRadioGroup.vue | 40 +- .../components/SenderNameExamplePreview.vue | 90 +- .../inbox/components/SingleSelectDropdown.vue | 35 +- .../inbox/components/WeeklyAvailability.vue | 155 ++-- .../settings/inbox/facebook/Reauthorize.vue | 8 +- .../inbox/settingsPage/CollaboratorsPage.vue | 156 ++-- .../inbox/settingsPage/ConfigurationPage.vue | 305 +++---- .../DashboardApps/DashboardAppModal.vue | 108 +-- .../DashboardApps/DashboardAppsRow.vue | 6 +- .../integrations/DashboardApps/Index.vue | 13 +- .../dashboard/settings/integrations/Index.vue | 2 +- .../settings/integrations/Integration.vue | 133 ++- .../integrations/IntegrationHooks.vue | 87 +- .../settings/integrations/IntegrationItem.vue | 1 + .../integrations/MultipleIntegrationHooks.vue | 81 +- .../settings/integrations/NewHook.vue | 78 +- .../settings/integrations/ShowIntegration.vue | 66 +- .../integrations/SingleIntegrationHooks.vue | 25 +- .../dashboard/settings/integrations/Slack.vue | 74 +- .../Slack/SelectChannelWarning.vue | 107 +-- .../Slack/SlackIntegrationHelpText.vue | 25 +- .../integrations/Webhooks/EditWebHook.vue | 30 +- .../settings/integrations/Webhooks/Index.vue | 183 ++-- .../integrations/Webhooks/NewWebHook.vue | 40 +- .../integrations/Webhooks/WebhookForm.vue | 113 +-- .../integrations/Webhooks/WebhookRow.vue | 67 +- .../dashboard/settings/labels/AddLabel.vue | 113 +-- .../dashboard/settings/labels/EditLabel.vue | 99 +- .../dashboard/settings/labels/Index.vue | 202 +++-- .../dashboard/settings/macros/Index.vue | 116 +-- .../dashboard/settings/macros/MacroEditor.vue | 31 +- .../dashboard/settings/macros/MacroForm.vue | 52 +- .../dashboard/settings/macros/MacroNode.vue | 90 +- .../dashboard/settings/macros/MacroNodes.vue | 126 +-- .../settings/macros/MacroProperties.vue | 58 +- .../settings/macros/MacrosTableRow.vue | 80 +- .../settings/profile/AccessToken.vue | 51 +- .../settings/profile/AudioAlertCondition.vue | 35 +- .../settings/profile/AudioAlertEvent.vue | 54 +- .../settings/profile/AudioAlertTone.vue | 45 +- .../settings/profile/AudioNotifications.vue | 66 +- .../settings/profile/ChangePassword.vue | 122 +-- .../dashboard/settings/profile/HotKeyCard.vue | 50 +- .../dashboard/settings/profile/Index.vue | 165 ++-- .../settings/profile/MessageSignature.vue | 50 +- .../settings/profile/NotificationCheckBox.vue | 30 +- .../profile/NotificationPreferences.vue | 264 +++--- .../settings/profile/UserBasicDetails.vue | 99 +- .../settings/profile/UserProfilePicture.vue | 33 +- .../dashboard/settings/profile/Wrapper.vue | 18 +- .../settings/reports/AgentReports.vue | 20 +- .../dashboard/settings/reports/BotReports.vue | 39 +- .../settings/reports/CsatResponses.vue | 45 +- .../settings/reports/InboxReports.vue | 20 +- .../dashboard/settings/reports/Index.vue | 45 +- .../settings/reports/LabelReports.vue | 20 +- .../settings/reports/LiveReports.vue | 145 +-- .../settings/reports/ReportContainer.vue | 64 +- .../dashboard/settings/reports/SLAReports.vue | 57 +- .../settings/reports/TeamReports.vue | 20 +- .../reports/components/BotMetrics.vue | 8 +- .../components/ChartElements/ChartStats.vue | 49 +- .../reports/components/CsatMetrics.vue | 101 ++- .../settings/reports/components/CsatTable.vue | 51 +- .../reports/components/FilterSelector.vue | 111 ++- .../reports/components/Filters/Agents.vue | 43 +- .../components/Filters/DateGroupBy.vue | 42 +- .../reports/components/Filters/DateRange.vue | 38 +- .../reports/components/Filters/Inboxes.vue | 33 +- .../reports/components/Filters/Labels.vue | 87 +- .../reports/components/Filters/Ratings.vue | 34 +- .../reports/components/Filters/Teams.vue | 33 +- .../Filters/v3/ActiveFilterChip.vue | 6 +- .../components/Filters/v3/AddFilterChip.vue | 19 +- .../settings/reports/components/Heatmap.vue | 3 +- .../reports/components/ReportFilters.vue | 371 ++++---- .../reports/components/ReportMetricCard.vue | 9 +- .../reports/components/SLA/SLAFilter.vue | 122 +-- .../reports/components/SLA/SLAMetricCard.vue | 45 +- .../reports/components/SLA/SLAMetrics.vue | 44 +- .../components/SLA/SLAReportFilters.vue | 17 +- .../reports/components/SLA/SLAReportItem.vue | 14 +- .../reports/components/SLA/SLATable.vue | 116 +-- .../reports/components/SLA/SLAViewDetails.vue | 46 +- .../reports/components/WootReports.vue | 50 +- .../components/overview/AgentTable.vue | 64 +- .../components/overview/MetricCard.vue | 50 +- .../specs/Filters/FiltersAgents.spec.js | 4 +- .../specs/Filters/FiltersDateGroupBy.spec.js | 4 +- .../specs/Filters/FiltersInboxes.spec.js | 6 +- .../specs/Filters/FiltersLabels.spec.js | 4 +- .../specs/Filters/FiltersRatings.spec.js | 4 +- .../specs/Filters/FiltersTeams.spec.js | 4 +- .../__snapshots__/CSATMetrics.spec.js.snap | 6 +- .../routes/dashboard/settings/sla/AddSLA.vue | 34 +- .../routes/dashboard/settings/sla/Index.vue | 110 +-- .../routes/dashboard/settings/sla/SlaForm.vue | 138 +-- .../dashboard/settings/sla/SlaTimeInput.vue | 70 +- .../sla/components/BaseEmptyState.vue | 4 +- .../sla/components/SLABusinessHoursLabel.vue | 1 + .../settings/sla/components/SLAEmptyState.vue | 8 +- .../settings/sla/components/SLAHeader.vue | 1 + .../settings/sla/components/SLAListItem.vue | 13 +- .../sla/components/SLAListItemLoading.vue | 5 +- .../sla/components/SLAPaywallEnterprise.vue | 4 +- .../sla/components/SLAResponseTime.vue | 1 + .../settings/teams/AgentSelector.vue | 154 ++-- .../settings/teams/Create/AddAgents.vue | 72 +- .../settings/teams/Create/CreateTeam.vue | 36 +- .../dashboard/settings/teams/Create/Index.vue | 18 +- .../settings/teams/Edit/EditAgents.vue | 81 +- .../settings/teams/Edit/EditTeam.vue | 42 +- .../dashboard/settings/teams/Edit/Index.vue | 18 +- .../dashboard/settings/teams/FinishSetup.vue | 24 +- .../routes/dashboard/settings/teams/Index.vue | 148 +-- .../dashboard/settings/teams/TeamForm.vue | 84 +- .../routes/dashboard/suspended/Index.vue | 2 +- .../portal/components/PublicArticleSearch.vue | 54 +- .../portal/components/PublicSearchInput.vue | 44 +- .../portal/components/SearchSuggestions.vue | 110 ++- .../portal/components/TableOfContents.vue | 61 +- app/javascript/portal/portalHelpers.js | 2 +- app/javascript/shared/components/Branding.vue | 48 +- app/javascript/shared/components/Button.vue | 21 +- .../shared/components/CardButton.vue | 53 +- app/javascript/shared/components/ChatCard.vue | 41 +- app/javascript/shared/components/ChatForm.vue | 158 ++-- .../shared/components/ChatOption.vue | 24 +- .../shared/components/ChatOptions.vue | 53 +- .../components/CustomerSatisfaction.vue | 94 +- .../shared/components/DateSeparator.vue | 18 +- .../shared/components/EmojiOrIcon.vue | 22 +- .../components/FluentIcon/DashboardIcon.vue | 21 +- .../shared/components/FluentIcon/Icon.vue | 69 +- .../shared/components/FluentIcon/Index.vue | 21 +- .../shared/components/GreetingsEditor.vue | 58 +- .../shared/components/IframeLoader.vue | 44 +- .../shared/components/ResizableTextArea.vue | 30 +- app/javascript/shared/components/Spinner.vue | 8 +- app/javascript/shared/components/TextArea.vue | 62 +- .../shared/components/emoji/EmojiInput.vue | 200 +++-- .../components/ui/MultiselectDropdown.vue | 146 +-- .../ui/MultiselectDropdownItems.vue | 123 ++- .../components/ui/dropdown/AddLabel.vue | 20 +- .../ui/dropdown/DropdownDivider.vue | 7 +- .../components/ui/dropdown/DropdownHeader.vue | 21 +- .../components/ui/dropdown/DropdownItem.vue | 30 +- .../components/ui/dropdown/DropdownMenu.vue | 19 +- .../ui/dropdown/DropdownSubMenu.vue | 18 +- .../components/ui/label/LabelDropdown.vue | 154 ++-- .../components/ui/label/LabelDropdownItem.vue | 44 +- .../shared/mixins/specs/MockComponent.vue | 8 +- .../components/playground/Header.vue | 8 +- .../views/playground/Index.vue | 72 +- app/javascript/survey/App.vue | 12 +- app/javascript/survey/components/Banner.vue | 26 +- app/javascript/survey/components/Feedback.vue | 48 +- app/javascript/survey/components/Rating.vue | 30 +- app/javascript/survey/views/Response.vue | 112 ++- app/javascript/v3/App.vue | 14 +- .../v3/components/Button/SubmitButton.vue | 30 +- .../v3/components/Divider/SimpleDivider.vue | 21 +- app/javascript/v3/components/Form/Button.vue | 59 +- .../v3/components/Form/CheckBox.vue | 22 +- .../v3/components/Form/InitialsAvatar.vue | 42 +- app/javascript/v3/components/Form/Input.vue | 73 +- .../v3/components/Form/ProfileAvatar.vue | 97 +- .../v3/components/Form/RadioTags.vue | 48 +- app/javascript/v3/components/Form/Select.vue | 65 +- app/javascript/v3/components/Form/Switch.vue | 26 +- .../v3/components/Form/Textarea.vue | 57 +- .../v3/components/Form/WithLabel.vue | 53 +- .../v3/components/GoogleOauth/Button.vue | 42 +- .../v3/components/SnackBar/Container.vue | 30 +- .../v3/components/SnackBar/Item.vue | 39 +- .../v3/views/auth/confirmation/Index.vue | 13 +- .../v3/views/auth/password/Edit.vue | 100 +-- .../v3/views/auth/reset/password/Index.vue | 96 +- app/javascript/v3/views/auth/signup/Index.vue | 108 +-- .../auth/signup/components/Signup/Form.vue | 161 ++-- .../signup/components/Testimonials/Index.vue | 68 +- .../Testimonials/TestimonialCard.vue | 37 +- app/javascript/v3/views/login/Index.vue | 185 ++-- .../v3/views/onboarding/OnboardingStep.vue | 47 +- app/javascript/widget/App.vue | 51 +- .../widget/components/AgentMessage.vue | 176 ++-- .../widget/components/AgentMessageBubble.vue | 122 +-- .../widget/components/AgentTypingBubble.vue | 16 +- .../widget/components/ArticleCategoryCard.vue | 35 +- .../widget/components/ArticleHero.vue | 22 +- .../widget/components/ArticleList.vue | 24 +- .../widget/components/ArticleListItem.vue | 30 +- .../widget/components/ArticleSearch.vue | 52 +- .../widget/components/AvailableAgents.vue | 8 +- app/javascript/widget/components/Banner.vue | 16 +- .../widget/components/ChatAttachment.vue | 36 +- .../widget/components/ChatFooter.vue | 91 +- .../widget/components/ChatHeader.vue | 97 +- .../widget/components/ChatHeaderExpanded.vue | 64 +- .../widget/components/ChatInputWrap.vue | 98 +- .../widget/components/ChatMessage.vue | 30 +- .../widget/components/ChatSendButton.vue | 24 +- .../widget/components/ContinueChatButton.vue | 48 +- .../widget/components/ConversationWrap.vue | 46 +- .../widget/components/DragWrapper.vue | 24 +- .../widget/components/FileBubble.vue | 48 +- .../widget/components/FooterReplyTo.vue | 34 +- .../widget/components/Form/Input.vue | 57 +- .../widget/components/Form/PhoneInput.vue | 174 ++-- .../widget/components/Form/TextArea.vue | 48 +- .../widget/components/GroupedAvatars.vue | 38 +- .../widget/components/HeaderActions.vue | 90 +- .../widget/components/ImageBubble.vue | 35 +- .../widget/components/MessageReplyButton.vue | 18 +- .../widget/components/PreChat/Form.vue | 127 +-- .../widget/components/ReplyToChip.vue | 24 +- .../widget/components/SearchArticle.vue | 52 +- .../widget/components/TeamAvailability.vue | 74 +- .../widget/components/UnreadMessage.vue | 51 +- .../widget/components/UnreadMessageList.vue | 93 +- .../widget/components/UserAvatar.vue | 7 +- .../widget/components/UserMessage.vue | 156 ++-- .../widget/components/UserMessageBubble.vue | 20 +- .../widget/components/VideoBubble.vue | 9 +- .../components/dropdown/DropdownMenu.vue | 69 +- .../components/dropdown/DropdownMenuItem.vue | 24 +- .../components/layouts/ViewWithHeader.vue | 80 +- .../widget/components/template/Article.vue | 58 +- .../widget/components/template/EmailInput.vue | 62 +- .../components/template/IntegrationCard.vue | 62 +- app/javascript/widget/i18n/locale/en.json | 9 +- app/javascript/widget/views/ArticleViewer.vue | 12 +- app/javascript/widget/views/Campaigns.vue | 8 +- app/javascript/widget/views/Home.vue | 81 +- app/javascript/widget/views/Messages.vue | 21 +- app/javascript/widget/views/PreChatForm.vue | 11 +- .../widget/views/UnreadMessages.vue | 8 +- 625 files changed, 23071 insertions(+), 22980 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 18162ee76..f3d050ab3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -27,6 +27,160 @@ module.exports = { 'import/no-unresolved': 'off', 'vue/html-indent': 'off', 'vue/multi-word-component-names': 'off', + 'vue/next-tick-style': ['error', 'callback'], + 'vue/block-order': [ + 'error', + { + order: ['script', 'template', 'style'], + }, + ], + 'vue/component-name-in-template-casing': [ + 'error', + 'PascalCase', + { + registeredComponentsOnly: true, + }, + ], + 'vue/component-options-name-casing': ['error', 'PascalCase'], + 'vue/custom-event-name-casing': ['error', 'camelCase'], + 'vue/define-emits-declaration': ['error'], + 'vue/define-macros-order': [ + 'error', + { + order: ['defineProps', 'defineEmits'], + defineExposeLast: false, + }, + ], + 'vue/define-props-declaration': ['error', 'runtime'], + 'vue/match-component-import-name': ['error'], + 'vue/no-bare-strings-in-template': [ + 'error', + { + allowlist: [ + '(', + ')', + ',', + '.', + '&', + '+', + '-', + '=', + '*', + '/', + '#', + '%', + '!', + '?', + ':', + '[', + ']', + '{', + '}', + '<', + '>', + '⌘', + '📄', + '🎉', + '💬', + '👥', + '📥', + '🔖', + '❌', + '✅', + '\u00b7', + '\u2022', + '\u2010', + '\u2013', + '\u2014', + '\u2212', + '|', + ], + attributes: { + '/.+/': [ + 'title', + 'aria-label', + 'aria-placeholder', + 'aria-roledescription', + 'aria-valuetext', + ], + input: ['placeholder'], + }, + directives: ['v-text'], + }, + ], + 'vue/no-empty-component-block': 'error', + 'vue/no-multiple-objects-in-class': 'error', + 'vue/no-root-v-if': 'warn', + 'vue/no-static-inline-styles': [ + 'error', + { + allowBinding: false, + }, + ], + 'vue/no-template-target-blank': [ + 'error', + { + allowReferrer: false, + enforceDynamicLinks: 'always', + }, + ], + 'vue/no-required-prop-with-default': [ + 'error', + { + autofix: false, + }, + ], + 'vue/no-this-in-before-route-enter': 'error', + 'vue/no-undef-components': [ + 'error', + { + ignorePatterns: [ + '^woot-', + '^fluent-', + '^multiselect', + '^router-link', + '^router-view', + '^ninja-keys', + '^FormulateForm', + '^FormulateInput', + '^highlightjs', + ], + }, + ], + 'vue/no-unused-emit-declarations': 'error', + 'vue/no-unused-refs': 'error', + 'vue/no-use-v-else-with-v-for': 'error', + 'vue/prefer-true-attribute-shorthand': 'error', + 'vue/no-useless-v-bind': [ + 'error', + { + ignoreIncludesComment: false, + ignoreStringEscape: false, + }, + ], + 'vue/no-v-text': 'error', + 'vue/padding-line-between-blocks': ['error', 'always'], + 'vue/prefer-separate-static-class': 'error', + 'vue/require-explicit-slots': 'error', + 'vue/require-macro-variable-name': [ + 'error', + { + defineProps: 'props', + defineEmits: 'emit', + defineSlots: 'slots', + useSlots: 'slots', + useAttrs: 'attrs', + }, + ], + 'vue/no-unused-properties': [ + 'error', + { + groups: ['props'], + deepData: false, + ignorePublicMembers: false, + unreferencedOptions: [], + }, + ], 'vue/max-attributes-per-line': [ 'error', { diff --git a/app/javascript/dashboard/App.vue b/app/javascript/dashboard/App.vue index c343fbe4f..efb89f489 100644 --- a/app/javascript/dashboard/App.vue +++ b/app/javascript/dashboard/App.vue @@ -1,30 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/components/Accordion/AccordionItem.vue b/app/javascript/dashboard/components/Accordion/AccordionItem.vue index 87370185d..6fc0ee0d9 100644 --- a/app/javascript/dashboard/components/Accordion/AccordionItem.vue +++ b/app/javascript/dashboard/components/Accordion/AccordionItem.vue @@ -1,35 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/components/ChannelSelector.vue b/app/javascript/dashboard/components/ChannelSelector.vue index 6cff70bd3..2322edbfb 100644 --- a/app/javascript/dashboard/components/ChannelSelector.vue +++ b/app/javascript/dashboard/components/ChannelSelector.vue @@ -1,17 +1,3 @@ - - + + diff --git a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue index df61e9de1..b157bbd3a 100644 --- a/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue +++ b/app/javascript/dashboard/components/widgets/conversation/MessagesView.vue @@ -1,105 +1,3 @@ - - + + + + + diff --git a/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue b/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue index 190e04fe3..21ed33b3d 100644 --- a/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue +++ b/app/javascript/dashboard/modules/contact/components/AddCustomAttribute.vue @@ -1,41 +1,3 @@ - - - + + + diff --git a/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue b/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue index 5dcfd568a..52eb6eaa5 100644 --- a/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue +++ b/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue @@ -1,9 +1,47 @@ + + - - + diff --git a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue index f6e00b70b..41c986d03 100644 --- a/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue +++ b/app/javascript/dashboard/routes/dashboard/contacts/components/ContactsAdvancedFilters.vue @@ -1,93 +1,3 @@ - - + + + + diff --git a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue index ae2e6c424..86ef0f91e 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/customAttributes/CustomAttributes.vue @@ -1,45 +1,3 @@ - - + + + diff --git a/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue b/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue index 0b0ef03ff..3e4a9d8a9 100644 --- a/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue +++ b/app/javascript/dashboard/routes/dashboard/inbox/components/InboxNameAndId.vue @@ -21,6 +21,7 @@ export default { }, }; + - + + diff --git a/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue b/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue index cddad0d58..5019d451d 100644 --- a/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue +++ b/app/javascript/dashboard/routes/dashboard/inbox/components/MenuItem.vue @@ -6,16 +6,17 @@ defineProps({ }, }); -const emits = defineEmits(['click']); +const emit = defineEmits(['click']); const onMenuItemClick = () => { - emits('click'); + emit('click'); }; +