diff --git a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditorControls.vue b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditorControls.vue index 84ac1ce3846..26c02874d87 100644 --- a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditorControls.vue +++ b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticleEditorPage/ArticleEditorControls.vue @@ -84,28 +84,20 @@ const findCategoryFromSlug = slug => { return categories.value?.find(category => category.slug === slug); }; -const assignCategoryFromSlug = slug => { - const categoryFromSlug = findCategoryFromSlug(slug); - if (categoryFromSlug) { - selectedCategoryId.value = categoryFromSlug.id; - return categoryFromSlug; - } - return null; -}; - const selectedCategory = computed(() => { if (isNewArticle.value) { + if (selectedCategoryId.value) { + return ( + categories.value?.find(c => c.id === selectedCategoryId.value) || null + ); + } if (categorySlugFromRoute.value) { - const categoryFromSlug = assignCategoryFromSlug( + const categoryFromSlug = findCategoryFromSlug( categorySlugFromRoute.value ); if (categoryFromSlug) return categoryFromSlug; } - return selectedCategoryId.value - ? categories.value.find( - category => category.id === selectedCategoryId.value - ) - : categories.value[0] || null; + return categories.value?.[0] || null; } return categories.value.find( category => category.id === props.article?.category?.id diff --git a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticlePage/ArticlesPage.vue b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticlePage/ArticlesPage.vue index 0b7d86219bc..fde2158246f 100644 --- a/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticlePage/ArticlesPage.vue +++ b/app/javascript/dashboard/components-next/HelpCenter/Pages/ArticlePage/ArticlesPage.vue @@ -168,7 +168,9 @@ const handlePageChange = page => emit('pageChange', page); const navigateToNewArticlePage = () => { const { categorySlug, locale } = route.params; router.push({ - name: 'portals_articles_new', + name: props.isCategoryArticles + ? 'portals_categories_articles_new' + : 'portals_articles_new', params: { categorySlug, locale }, }); }; @@ -274,6 +276,7 @@ watch( :categories="categories" :allowed-locales="allowedLocales" :has-selected-category="isCategoryArticles" + @new-article="navigateToNewArticlePage" /> diff --git a/app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/CategoryHeaderControls.vue b/app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/CategoryHeaderControls.vue index 3424e08bcb1..f25ac802732 100644 --- a/app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/CategoryHeaderControls.vue +++ b/app/javascript/dashboard/components-next/HelpCenter/Pages/CategoryPage/CategoryHeaderControls.vue @@ -25,7 +25,7 @@ const props = defineProps({ }, }); -const emit = defineEmits(['localeChange']); +const emit = defineEmits(['localeChange', 'newArticle']); const route = useRoute(); const router = useRouter(); @@ -179,7 +179,7 @@ const handleBreadcrumbClick = () => { /> -
+
diff --git a/app/javascript/dashboard/components-next/HelpCenter/PortalSwitcher/PortalSwitcher.vue b/app/javascript/dashboard/components-next/HelpCenter/PortalSwitcher/PortalSwitcher.vue index bfc173d1633..b4d1fe26387 100644 --- a/app/javascript/dashboard/components-next/HelpCenter/PortalSwitcher/PortalSwitcher.vue +++ b/app/javascript/dashboard/components-next/HelpCenter/PortalSwitcher/PortalSwitcher.vue @@ -19,6 +19,7 @@ const DEFAULT_ROUTE = 'portals_articles_index'; const CATEGORY_ROUTE = 'portals_categories_index'; const CATEGORY_SUB_ROUTES = [ 'portals_categories_articles_index', + 'portals_categories_articles_new', 'portals_categories_articles_edit', ]; diff --git a/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js b/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js index fba4ba666e6..8face00d000 100644 --- a/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js +++ b/app/javascript/dashboard/routes/dashboard/helpcenter/helpcenter.routes.js @@ -62,6 +62,14 @@ const portalRoutes = [ meta, component: PortalsArticlesIndexPage, }, + { + path: getPortalRoute( + ':portalSlug/:locale/categories/:categorySlug/articles/new' + ), + name: 'portals_categories_articles_new', + meta, + component: PortalsArticlesNewPage, + }, { path: getPortalRoute( ':portalSlug/:locale/categories/:categorySlug/articles/:articleSlug' diff --git a/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue b/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue index baee8a2bb1b..f63f16fde0f 100644 --- a/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue +++ b/app/javascript/dashboard/routes/dashboard/helpcenter/pages/PortalsArticlesNewPage.vue @@ -21,7 +21,18 @@ const selectedCategoryId = ref(null); const currentUserId = useMapGetter('getCurrentUserID'); const categories = useMapGetter('categories/allCategories'); -const categoryId = computed(() => categories.value[0]?.id || null); +const categoryId = computed(() => { + const { categorySlug } = route.params; + if (categorySlug) { + const matched = categories.value?.find(c => c.slug === categorySlug); + if (matched) return matched.id; + } + return categories.value[0]?.id || null; +}); + +const isCategoryArticles = computed( + () => route.name === 'portals_categories_articles_new' +); const article = ref({}); const isUpdating = ref(false); @@ -44,23 +55,34 @@ const createNewArticle = async ({ title, content }) => { isUpdating.value = true; try { const { locale } = route.params; + const resolvedCategoryId = selectedCategoryId.value || categoryId.value; const articleId = await store.dispatch('articles/create', { portalSlug, content: article.value.content, title: article.value.title, locale: locale, authorId: selectedAuthorId.value || currentUserId.value, - categoryId: selectedCategoryId.value || categoryId.value, + categoryId: resolvedCategoryId, }); useTrack(PORTALS_EVENTS.CREATE_ARTICLE, { locale }); + const resolvedSlug = categories.value?.find( + c => c.id === resolvedCategoryId + )?.slug; + const startedFromCategorySlug = route.params.categorySlug; + router.replace({ - name: 'portals_articles_edit', + name: isCategoryArticles.value + ? 'portals_categories_articles_edit' + : 'portals_articles_edit', params: { articleSlug: articleId, portalSlug, locale, + ...(startedFromCategorySlug + ? { categorySlug: resolvedSlug || startedFromCategorySlug } + : {}), }, }); } catch (error) { @@ -74,10 +96,17 @@ const createNewArticle = async ({ title, content }) => { const goBackToArticles = () => { const { tab, categorySlug, locale } = route.params; - router.push({ - name: 'portals_articles_index', - params: { tab, categorySlug, locale }, - }); + if (isCategoryArticles.value) { + router.push({ + name: 'portals_categories_articles_index', + params: { categorySlug, locale }, + }); + } else { + router.push({ + name: 'portals_articles_index', + params: { tab, categorySlug, locale }, + }); + } };