diff --git a/components/Buttons/EditButton.vue b/components/Buttons/EditButton.vue index 201f9bdd2..45d4ad751 100644 --- a/components/Buttons/EditButton.vue +++ b/components/Buttons/EditButton.vue @@ -14,7 +14,7 @@ import { BrandedButton, throwOnNever } from '@datagouv/components-next' import { RiEdit2Line } from '@remixicon/vue' const props = defineProps<{ - type: 'organizations' | 'users' | 'posts' | 'reuses' | 'dataservices' | 'datasets' + type: 'organizations' | 'users' | 'posts' | 'reuses' | 'dataservices' | 'datasets' | 'topics' id: string }>() @@ -31,6 +31,7 @@ const link = computed(() => { case 'reuses': case 'dataservices': case 'datasets': + case 'topics': return base default: return throwOnNever(props.type as never, t('Aucun autre type défini')) diff --git a/pages/topics/[id].vue b/pages/topics/[id].vue new file mode 100644 index 000000000..8bcaeb654 --- /dev/null +++ b/pages/topics/[id].vue @@ -0,0 +1,142 @@ + + + diff --git a/pages/topics/[id]/discussions.vue b/pages/topics/[id]/discussions.vue new file mode 100644 index 000000000..64ee949e2 --- /dev/null +++ b/pages/topics/[id]/discussions.vue @@ -0,0 +1,16 @@ + + + diff --git a/pages/topics/[id]/index.vue b/pages/topics/[id]/index.vue new file mode 100644 index 000000000..e4c4d47c6 --- /dev/null +++ b/pages/topics/[id]/index.vue @@ -0,0 +1,93 @@ + + + diff --git a/types/discussions.ts b/types/discussions.ts index b3899d4ad..17efcad20 100644 --- a/types/discussions.ts +++ b/types/discussions.ts @@ -1,4 +1,4 @@ -import type { Dataservice, DatasetV2, OrganizationReference, Reuse, UserReference } from '@datagouv/components-next' +import type { Dataservice, DatasetV2, OrganizationReference, Reuse, TopicV2, UserReference } from '@datagouv/components-next' import type { Post } from './posts' export type DiscussionSortedBy = 'title' | 'created' | 'closed' @@ -12,7 +12,7 @@ export type Subject = { class: string } -export type DiscussionSubjectTypes = Dataservice | DatasetV2 | Reuse | Post +export type DiscussionSubjectTypes = Dataservice | DatasetV2 | Reuse | Post | TopicV2 export type DiscussionSubject = { class: 'Dataservice' | 'Dataset' | 'Reuse' | 'Post' | 'Topic' | 'Organization' diff --git a/utils/discussions.ts b/utils/discussions.ts index 2d881c90b..432b0717c 100644 --- a/utils/discussions.ts +++ b/utils/discussions.ts @@ -23,6 +23,9 @@ export function getSubjectTitle(subject: DiscussionSubjectTypes) { if ('title' in subject) { return subject.title } + if ('name' in subject) { + return subject.name + } return throwOnNever(subject as never, `Unknown type ${subject}`) }; @@ -31,6 +34,13 @@ export function getSubjectPage(subject: DiscussionSubjectTypes) { if (subject === null) { return '' } + // TODO: remove once udata#3765 is merged. Until then the topic API doesn't + // return `page`, so the `'page' in subject` check below fails at runtime and + // we'd hit throwOnNever. Matching on `elements` (always present on topics) + // avoids the crash while the field is missing. + if ('elements' in subject) { + return subject.page + } if ('page' in subject) { return subject.page }