feat(catalog): implement step-by-step navigation for offers and suppliers
All checks were successful
Build Docker Image / build (push) Successful in 4m49s

- Transform offers/index.vue to show products list with sparkline charts
- Create nested routes for offers: /offers → /offers/[productId] → /offers/[productId]/[hubId]
- Create nested routes for suppliers: /suppliers → /suppliers/[supplierId] → /suppliers/[supplierId]/[productId] → /suppliers/[supplierId]/[productId]/[hubId]
- Add OffersBreadcrumbs and SuppliersBreadcrumbs components for navigation
- Update HubCard to accept custom linkTo prop
- Key difference: Suppliers calculation uses FindRoutes (single source), Offers uses FindProductRoutes (all sources)
This commit is contained in:
Ruslan Bakiev
2026-01-16 00:52:47 +07:00
parent 210d3e935c
commit 1e87a14065
10 changed files with 1451 additions and 413 deletions

View File

@@ -1,7 +1,7 @@
<template>
<component
:is="linkable ? NuxtLink : 'div'"
:to="linkable ? localePath(`/catalog/hubs/${hub.uuid}`) : undefined"
:to="linkable ? resolvedLink : undefined"
class="block"
:class="{ 'cursor-pointer': selectable }"
@click="selectable && $emit('select')"
@@ -47,6 +47,7 @@ const props = defineProps<{
hub: Hub
selectable?: boolean
isSelected?: boolean
linkTo?: string
}>()
defineEmits<{
@@ -57,7 +58,8 @@ defineEmits<{
const localePath = useLocalePath()
const { t } = useI18n()
const linkable = computed(() => !props.selectable && props.hub.uuid)
const linkable = computed(() => !props.selectable && (props.linkTo || props.hub.uuid))
const resolvedLink = computed(() => props.linkTo || localePath(`/catalog/hubs/${props.hub.uuid}`))
// ISO code to emoji flag
const isoToEmoji = (code: string): string => {