From a3855a8d1d1973de9746a09f59b486f2f14593e5 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Thu, 24 Oct 2024 10:39:36 +0530 Subject: [PATCH] feat(v4): Update the help center portal design (#10296) Co-authored-by: Pranav --- .../api/v1/accounts/articles_controller.rb | 30 +- .../api/v1/accounts/portals_controller.rb | 18 +- .../api/v1/portals/articles_controller.rb | 2 +- .../dashboard/api/helpCenter/articles.js | 7 +- .../dashboard/components-next/CardLayout.vue | 2 +- .../components-next/EmptyStateLayout.vue | 10 +- .../ArticleCard/ArticleCard.story.vue | 51 ++- .../HelpCenter/ArticleCard/ArticleCard.vue | 157 +++++--- .../CategoryCard/CategoryCard.story.vue | 19 +- .../HelpCenter/CategoryCard/CategoryCard.vue | 72 ++-- .../EmptyState/Article/ArticleEmptyState.vue | 90 ++--- .../Category/CategoryEmptyState.vue | 49 +++ .../Category/categoryEmptyStateContent.js | 142 +++++++ .../EmptyState/Portal/PortalEmptyState.vue | 118 ++---- .../Portal/portalEmptyStateContent.js | 172 ++++++++ .../HelpCenter/HelpCenterLayout.vue | 66 +-- .../HelpCenter/LocaleCard/LocaleCard.vue | 86 ++-- .../ArticleEditor.vue} | 126 +++--- .../ArticleEditorControls.vue | 206 ++++++++++ .../ArticleEditorPage/ArticleEditorHeader.vue | 178 ++++++++ .../ArticleEditorProperties.vue | 134 +++++++ .../ArticlePage/ArticleHeaderControls.vue | 197 +++++++++ .../Pages/ArticlePage/ArticleList.vue | 191 ++++++++- .../Pages/ArticlePage/ArticlesPage.vue | 208 +++++++--- .../Pages/CategoryPage/CategoriesPage.vue | 176 ++++---- .../Pages/CategoryPage/CategoryDialog.vue | 112 ++++++ .../Pages/CategoryPage/CategoryForm.vue | 272 +++++++++++++ .../CategoryPage/CategoryHeaderControls.vue | 201 ++++++++++ .../Pages/CategoryPage/CategoryList.vue | 21 +- .../Pages/CategoryPage/EditCategoryDialog.vue | 112 ++++++ .../Pages/LocalePage/AddLocaleDialog.vue | 101 +++++ .../Pages/LocalePage/LocaleList.vue | 92 ++++- .../Pages/LocalePage/LocalesPage.vue | 25 +- .../AddCustomDomainDialog.vue | 74 ++++ .../ConfirmDeletePortalDialog.vue | 51 +++ .../DNSConfigurationDialog.vue | 79 ++++ .../PortalSettingsPage/PortalBaseSettings.vue | 320 +++++++++++++++ .../PortalConfigurationSettings.vue | 118 ++++++ .../PortalSettingsPage/PortalSettings.vue | 215 +++++----- .../PortalSwitcher/CreatePortalDialog.vue | 148 +++++++ .../PortalSwitcher/PortalSwitcher.vue | 214 +++++----- .../components-next/avatar/Avatar.story.vue | 4 +- .../avatar/EditableAvatar.story.vue | 36 ++ .../components-next/avatar/EditableAvatar.vue | 107 +++++ .../breadcrumb/Breadcrumb.story.vue | 8 +- .../components-next/breadcrumb/Breadcrumb.vue | 57 +-- .../components-next/button/Button.story.vue | 4 +- .../components-next/button/Button.vue | 70 ++-- .../colorpicker/ColorPicker.vue | 102 +++++ .../components-next/combobox/ComboBox.vue | 138 ++++--- .../components-next/dialog/Dialog.vue | 122 +++--- .../dropdown-menu/DropdownMenu.vue | 34 +- .../inline-input/InlineInput.vue | 9 +- .../dashboard/components-next/input/Input.vue | 25 +- .../pagination/PaginationFooter.vue | 14 +- .../components-next/sidebar/Sidebar.vue | 103 +++-- .../components-next/tabbar/TabBar.vue | 21 +- .../components-next/taginput/TagInput.vue | 90 +++++ .../components-next/textarea/TextArea.vue | 135 ++++++- .../components-next/thumbnail/Thumbnail.vue | 121 ++++++ .../layout/config/sidebarItems/primaryMenu.js | 4 +- .../layout/sidebarComponents/Primary.vue | 3 +- .../sidebarComponents/PrimaryNavItem.vue | 93 ++++- .../widgets/WootWriter/FullEditor.vue | 8 +- app/javascript/dashboard/helper/URLHelper.js | 8 + .../dashboard/helper/portalHelper.js | 137 +++++++ .../dashboard/helper/specs/URLHelper.spec.js | 25 ++ .../dashboard/i18n/locale/en/helpCenter.json | 308 +++++++++++++- .../dashboard/i18n/locale/en/settings.json | 11 +- .../routes/dashboard/dashboard.routes.js | 2 +- .../helpcenter/components/AddLocale.vue | 159 -------- .../helpcenter/components/ArticleEditor.vue | 71 ---- .../helpcenter/components/ArticleItem.vue | 167 -------- .../ArticleSearch/SearchPopover.vue | 6 +- .../helpcenter/components/ArticleTable.vue | 168 -------- .../components/Header/ArticleHeader.vue | 237 ----------- .../components/Header/EditArticleHeader.vue | 252 ------------ .../components/HelpCenterLayout.vue | 364 ----------------- .../components/Layout/SettingsLayout.vue | 34 -- .../helpcenter/components/PortalListItem.vue | 379 ------------------ .../components/PortalListItemTable.vue | 147 ------- .../helpcenter/components/PortalPopover.vue | 86 ---- .../components/PortalSettingsBasicForm.vue | 240 ----------- .../PortalSettingsCustomizationForm.vue | 155 ------- .../helpcenter/components/PortalSwitch.vue | 175 -------- .../helpcenter/components/Sidebar/Sidebar.vue | 96 ----- .../components/Sidebar/SidebarHeader.vue | 76 ---- .../dashboard/helpcenter/helpcenter.routes.js | 255 ++++-------- .../helpcenter/helpers/routeHelper.js | 2 +- .../helpcenter/mixins/portalMixin.js | 24 -- .../mixins/specs/portalMixin.spec.js | 78 ---- .../pages/HelpCenterPageRouteView.vue | 76 ++++ .../pages/PortalsArticlesEditPage.vue | 109 +++++ .../pages/PortalsArticlesIndexPage.vue | 116 ++++++ .../pages/PortalsArticlesNewPage.vue | 94 +++++ .../pages/PortalsCategoriesIndexPage.vue | 66 +++ .../helpcenter/pages/PortalsIndexPage.vue | 76 ++++ .../pages/PortalsLocalesIndexPage.vue | 34 ++ .../helpcenter/pages/PortalsNewPage.vue | 9 + .../pages/PortalsSettingsIndexPage.vue | 122 ++++++ .../pages/articles/ArticleSettings.vue | 277 ------------- .../pages/articles/DefaultPortalArticles.vue | 68 ---- .../helpcenter/pages/articles/EditArticle.vue | 216 ---------- .../pages/articles/ListAllArticles.vue | 195 --------- .../pages/articles/ListCategoryArticles.vue | 4 - .../helpcenter/pages/articles/NewArticle.vue | 118 ------ .../pages/categories/AddCategory.vue | 199 --------- .../pages/categories/CategoryListItem.vue | 113 ------ .../pages/categories/EditCategory.vue | 219 ---------- .../pages/categories/ListAllCategories.vue | 159 -------- .../pages/categories/NameEmojiInput.vue | 125 ------ .../pages/categories/NewCategory.vue | 4 - .../pages/categories/ShowCategory.vue | 4 - .../helpcenter/pages/portals/EditPortal.vue | 107 ----- .../pages/portals/EditPortalBasic.vue | 85 ---- .../pages/portals/EditPortalCustomization.vue | 57 --- .../pages/portals/EditPortalLocales.vue | 142 ------- .../pages/portals/ListAllPortals.vue | 105 ----- .../helpcenter/pages/portals/NewPortal.vue | 75 ---- .../pages/portals/PortalCustomization.vue | 71 ---- .../pages/portals/PortalDetails.vue | 70 ---- .../pages/portals/PortalSettingsFinish.vue | 31 -- .../helpcenter/pages/portals/ShowPortal.vue | 4 - .../modules/helpCenterArticles/actions.js | 24 +- .../modules/helpCenterArticles/mutations.js | 25 +- .../helpCenterArticles/specs/action.spec.js | 21 +- .../helpCenterArticles/specs/mutation.spec.js | 36 +- .../modules/helpCenterCategories/getters.js | 1 + .../modules/helpCenterCategories/index.js | 1 + .../specs/getters.spec.js | 1 - .../modules/helpCenterPortals/actions.js | 6 + .../modules/helpCenterPortals/getters.js | 3 + .../store/modules/helpCenterPortals/index.js | 1 + .../modules/helpCenterPortals/mutations.js | 5 + app/javascript/histoire.setup.ts | 2 + .../FluentIcon/dashboard-icons.json | 8 +- app/models/article.rb | 6 +- .../v1/accounts/articles/index.json.jbuilder | 8 +- .../v1/accounts/portals/_portal.json.jbuilder | 6 + package.json | 3 +- pnpm-lock.yaml | 26 ++ .../v1/portals/articles_controller_spec.rb | 7 + spec/models/article_spec.rb | 2 +- theme/colors.js | 6 +- 144 files changed, 6376 insertions(+), 6604 deletions(-) create mode 100644 app/javascript/dashboard/components-next/HelpCenter/EmptyState/Category/CategoryEmptyState.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/EmptyState/Category/categoryEmptyStateContent.js create mode 100644 app/javascript/dashboard/components-next/HelpCenter/EmptyState/Portal/portalEmptyStateContent.js rename app/javascript/dashboard/components-next/HelpCenter/Pages/{EditArticlePage/EditArticlePage.vue => ArticleEditorPage/ArticleEditor.vue} (52%) create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditorControls.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditorHeader.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditorProperties.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/ArticlePage/ArticleHeaderControls.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/CategoryDialog.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/CategoryForm.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/CategoryHeaderControls.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/EditCategoryDialog.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/LocalePage/AddLocaleDialog.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/PortalSettingsPage/AddCustomDomainDialog.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/PortalSettingsPage/ConfirmDeletePortalDialog.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/PortalSettingsPage/DNSConfigurationDialog.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/PortalSettingsPage/PortalBaseSettings.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/Pages/PortalSettingsPage/PortalConfigurationSettings.vue create mode 100644 app/javascript/dashboard/components-next/HelpCenter/PortalSwitcher/CreatePortalDialog.vue create mode 100644 app/javascript/dashboard/components-next/avatar/EditableAvatar.story.vue create mode 100644 app/javascript/dashboard/components-next/avatar/EditableAvatar.vue create mode 100644 app/javascript/dashboard/components-next/colorpicker/ColorPicker.vue create mode 100644 app/javascript/dashboard/components-next/taginput/TagInput.vue create mode 100644 app/javascript/dashboard/components-next/thumbnail/Thumbnail.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/AddLocale.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/ArticleEditor.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/ArticleItem.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/ArticleTable.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/Header/ArticleHeader.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/Header/EditArticleHeader.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/HelpCenterLayout.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/Layout/SettingsLayout.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/PortalListItem.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/PortalListItemTable.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/PortalPopover.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/PortalSettingsBasicForm.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/PortalSettingsCustomizationForm.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/PortalSwitch.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/Sidebar/Sidebar.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/components/Sidebar/SidebarHeader.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/mixins/portalMixin.js delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/mixins/specs/portalMixin.spec.js create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/HelpCenterPageRouteView.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesEditPage.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesIndexPage.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsCategoriesIndexPage.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsIndexPage.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsLocalesIndexPage.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsNewPage.vue create mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsSettingsIndexPage.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/articles/ArticleSettings.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/articles/DefaultPortalArticles.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/articles/EditArticle.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/articles/ListAllArticles.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/articles/ListCategoryArticles.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/articles/NewArticle.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/categories/AddCategory.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/categories/CategoryListItem.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/categories/EditCategory.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/categories/ListAllCategories.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/categories/NameEmojiInput.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/categories/NewCategory.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/categories/ShowCategory.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/EditPortal.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/EditPortalBasic.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/EditPortalCustomization.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/EditPortalLocales.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/ListAllPortals.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/NewPortal.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/PortalCustomization.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/PortalDetails.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/PortalSettingsFinish.vue delete mode 100644 app/javascript/dashboard/routes/dashboard/helpcenter/pages/portals/ShowPortal.vue diff --git a/app/controllers/api/v1/accounts/articles_controller.rb b/app/controllers/api/v1/accounts/articles_controller.rb index d164778ac..9148e4386 100644 --- a/app/controllers/api/v1/accounts/articles_controller.rb +++ b/app/controllers/api/v1/accounts/articles_controller.rb @@ -6,13 +6,15 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController def index @portal_articles = @portal.articles - @all_articles = @portal_articles.search(list_params) - @articles_count = @all_articles.count + + set_article_count + + @articles = @articles.search(list_params) @articles = if list_params[:category_slug].present? - @all_articles.order_by_position.page(@current_page) + @articles.order_by_position.page(@current_page) else - @all_articles.order_by_updated_at.page(@current_page) + @articles.order_by_updated_at.page(@current_page) end end @@ -43,6 +45,19 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController private + def set_article_count + # Search the params without status and author_id, use this to + # compute mine count published draft etc + base_search_params = list_params.except(:status, :author_id) + @articles = @portal_articles.search(base_search_params) + + @articles_count = @articles.count + @mine_articles_count = @articles.search_by_author(Current.user.id).count + @published_articles_count = @articles.published.count + @draft_articles_count = @articles.draft.count + @archived_articles_count = @articles.archived.count + end + def fetch_article @article = @portal.articles.find(params[:id]) end @@ -53,9 +68,10 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController def article_params params.require(:article).permit( - :title, :slug, :position, :content, :description, :position, :category_id, :author_id, :associated_article_id, :status, meta: [:title, - :description, - { tags: [] }] + :title, :slug, :position, :content, :description, :position, :category_id, :author_id, :associated_article_id, :status, + :locale, meta: [:title, + :description, + { tags: [] }] ) end diff --git a/app/controllers/api/v1/accounts/portals_controller.rb b/app/controllers/api/v1/accounts/portals_controller.rb index bd8da5549..fe9a03ef5 100644 --- a/app/controllers/api/v1/accounts/portals_controller.rb +++ b/app/controllers/api/v1/accounts/portals_controller.rb @@ -20,7 +20,7 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController end def create - @portal = Current.account.portals.build(portal_params) + @portal = Current.account.portals.build(portal_params.merge(live_chat_widget_params)) @portal.custom_domain = parsed_custom_domain @portal.save! process_attached_logo @@ -28,7 +28,7 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController def update ActiveRecord::Base.transaction do - @portal.update!(portal_params) if params[:portal].present? + @portal.update!(portal_params.merge(live_chat_widget_params)) if params[:portal].present? # @portal.custom_domain = parsed_custom_domain process_attached_logo if params[:blob_id].present? rescue StandardError => e @@ -70,11 +70,21 @@ class Api::V1::Accounts::PortalsController < Api::V1::Accounts::BaseController def portal_params params.require(:portal).permit( - :account_id, :color, :custom_domain, :header_text, :homepage_link, :name, :page_title, :slug, :archived, { config: [:default_locale, - { allowed_locales: [] }] } + :account_id, :color, :custom_domain, :header_text, :homepage_link, + :name, :page_title, :slug, :archived, { config: [:default_locale, { allowed_locales: [] }] } ) end + def live_chat_widget_params + permitted_params = params.permit(:inbox_id) + return {} if permitted_params[:inbox_id].blank? + + inbox = Inbox.find(permitted_params[:inbox_id]) + return {} unless inbox.web_widget? + + { channel_web_widget_id: inbox.channel.id } + end + def portal_member_params params.require(:portal).permit(:account_id, member_ids: []) end diff --git a/app/controllers/public/api/v1/portals/articles_controller.rb b/app/controllers/public/api/v1/portals/articles_controller.rb index 2807ae41a..08c62bada 100644 --- a/app/controllers/public/api/v1/portals/articles_controller.rb +++ b/app/controllers/public/api/v1/portals/articles_controller.rb @@ -30,7 +30,7 @@ class Public::Api::V1::Portals::ArticlesController < Public::Api::V1::Portals::B def set_article @article = @portal.articles.find_by(slug: permitted_params[:article_slug]) - @article.increment_view_count + @article.increment_view_count if @article.published? @parsed_content = render_article_content(@article.content) end diff --git a/app/javascript/dashboard/api/helpCenter/articles.js b/app/javascript/dashboard/api/helpCenter/articles.js index e5847dc1b..727340ed5 100644 --- a/app/javascript/dashboard/api/helpCenter/articles.js +++ b/app/javascript/dashboard/api/helpCenter/articles.js @@ -52,12 +52,13 @@ class ArticlesAPI extends PortalsAPI { } createArticle({ portalSlug, articleObj }) { - const { content, title, author_id, category_id } = articleObj; + const { content, title, authorId, categoryId, locale } = articleObj; return axios.post(`${this.url}/${portalSlug}/articles`, { content, title, - author_id, - category_id, + author_id: authorId, + category_id: categoryId, + locale, }); } diff --git a/app/javascript/dashboard/components-next/CardLayout.vue b/app/javascript/dashboard/components-next/CardLayout.vue index 6012512a7..9949ec86b 100644 --- a/app/javascript/dashboard/components-next/CardLayout.vue +++ b/app/javascript/dashboard/components-next/CardLayout.vue @@ -7,7 +7,7 @@ const handleClick = () => {