From ce0408a80649b1265826220d27670bc9ca7b372e Mon Sep 17 00:00:00 2001 From: Thierry Date: Fri, 20 Sep 2024 11:12:23 +0200 Subject: [PATCH] feat(web-core): new VtsLink component --- .../src/stories/web-core/vts-link.story.vue | 41 ++++++ .../web-core/lib/components/link/VtsLink.vue | 137 ++++++++++++++++++ .../composables/link-component.composable.ts | 53 +++++++ 3 files changed, 231 insertions(+) create mode 100644 @xen-orchestra/lite/src/stories/web-core/vts-link.story.vue create mode 100644 @xen-orchestra/web-core/lib/components/link/VtsLink.vue create mode 100644 @xen-orchestra/web-core/lib/composables/link-component.composable.ts diff --git a/@xen-orchestra/lite/src/stories/web-core/vts-link.story.vue b/@xen-orchestra/lite/src/stories/web-core/vts-link.story.vue new file mode 100644 index 00000000000..cd7c663be06 --- /dev/null +++ b/@xen-orchestra/lite/src/stories/web-core/vts-link.story.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/@xen-orchestra/web-core/lib/components/link/VtsLink.vue b/@xen-orchestra/web-core/lib/components/link/VtsLink.vue new file mode 100644 index 00000000000..58a1dcaf69c --- /dev/null +++ b/@xen-orchestra/web-core/lib/components/link/VtsLink.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/@xen-orchestra/web-core/lib/composables/link-component.composable.ts b/@xen-orchestra/web-core/lib/composables/link-component.composable.ts new file mode 100644 index 00000000000..cb4af11ec9b --- /dev/null +++ b/@xen-orchestra/web-core/lib/composables/link-component.composable.ts @@ -0,0 +1,53 @@ +import type { MaybeRefOrGetter } from 'vue' +import { computed, toValue } from 'vue' +import type { RouteLocationRaw } from 'vue-router' + +type Options = { + to?: RouteLocationRaw + href?: string + target?: '_blank' | '_self' + disabled?: boolean +} + +export function useLinkComponent(defaultComponent: string, options: MaybeRefOrGetter) { + const config = computed(() => toValue(options)) + + const isDisabled = computed(() => config.value.disabled || (!config.value.to && !config.value.href)) + + const component = computed(() => { + if (isDisabled.value) { + return defaultComponent + } + + if (config.value.href) { + return 'a' + } + + return 'RouterLink' + }) + + const attributes = computed(() => { + if (isDisabled.value) { + return {} + } + + if (config.value.href) { + return { + rel: 'noopener noreferrer', + target: config.value.target ?? '_blank', + href: config.value.href, + } + } + + return { + target: config.value.target, + to: config.value.to, + } + }) + + return { + isDisabled, + component, + attributes, + } +}