Consolidate create and edit pages into single create pages with edit mode support. Remove obsolete catalog pages, history composables, and fix remaining code review issues. Include migration to relink orphaned custom fields. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
138 lines
5.3 KiB
Vue
138 lines
5.3 KiB
Vue
<template>
|
|
<nav v-if="crumbs.length > 1" class="container mx-auto px-6 pt-4" aria-label="Fil d'Ariane">
|
|
<div class="text-sm breadcrumbs py-0">
|
|
<ul>
|
|
<!-- First crumb (always visible) -->
|
|
<li>
|
|
<NuxtLink :to="crumbs[0].path" class="text-base-content/60 hover:text-primary transition-colors">
|
|
{{ crumbs[0].label }}
|
|
</NuxtLink>
|
|
</li>
|
|
<!-- Ellipsis on mobile when there are middle crumbs -->
|
|
<li v-if="crumbs.length > 2" class="sm:hidden">
|
|
<span class="text-base-content/40">…</span>
|
|
</li>
|
|
<!-- Middle crumbs: hidden on mobile, visible sm+ -->
|
|
<li
|
|
v-for="(crumb, i) in crumbs.slice(1, crumbs.length - 1)"
|
|
:key="i"
|
|
class="hidden sm:list-item"
|
|
>
|
|
<NuxtLink :to="crumb.path" class="text-base-content/60 hover:text-primary transition-colors">
|
|
{{ crumb.label }}
|
|
</NuxtLink>
|
|
</li>
|
|
<!-- Last crumb (always visible, current page) -->
|
|
<li v-if="crumbs.length > 1">
|
|
<span class="text-base-content font-medium">{{ crumbs[crumbs.length - 1].label }}</span>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</nav>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
interface Crumb {
|
|
label: string
|
|
path: string
|
|
}
|
|
|
|
const route = useRoute()
|
|
|
|
const crumbs = computed<Crumb[]>(() => {
|
|
const result: Crumb[] = [{ label: 'Accueil', path: '/' }]
|
|
const path = route.path
|
|
|
|
// Home page — no breadcrumb
|
|
if (path === '/') return []
|
|
|
|
// Machine context from query param (when navigating from a machine detail page)
|
|
if (route.query.from === 'machine' && route.query.machineId) {
|
|
result.push({ label: 'Parc machines', path: '/machines' })
|
|
result.push({ label: 'Machine', path: `/machine/${route.query.machineId}` })
|
|
}
|
|
|
|
// Machines
|
|
if (path === '/machines') {
|
|
result.push({ label: 'Parc machines', path: '/machines' })
|
|
} else if (path.startsWith('/machine/') && !route.query.from) {
|
|
result.push({ label: 'Parc machines', path: '/machines' })
|
|
result.push({ label: 'Machine', path })
|
|
}
|
|
|
|
// Catalogs
|
|
else if (path.startsWith('/catalogues/composants')) {
|
|
result.push({ label: 'Composants', path: '/catalogues/composants' })
|
|
} else if (path.startsWith('/catalogues/pieces')) {
|
|
result.push({ label: 'Pièces', path: '/catalogues/pieces' })
|
|
} else if (path.startsWith('/catalogues/produits')) {
|
|
result.push({ label: 'Produits', path: '/catalogues/produits' })
|
|
}
|
|
|
|
// Entity detail pages (when NOT from machine context)
|
|
else if (path.startsWith('/component/') && !route.query.from) {
|
|
result.push({ label: 'Composants', path: '/catalogues/composants' })
|
|
result.push({ label: 'Composant', path })
|
|
} else if (path.startsWith('/piece/') && !route.query.from) {
|
|
result.push({ label: 'Pièces', path: '/catalogues/pieces' })
|
|
result.push({ label: 'Pièce', path })
|
|
} else if (path.startsWith('/product/') && !route.query.from) {
|
|
result.push({ label: 'Produits', path: '/catalogues/produits' })
|
|
result.push({ label: 'Produit', path })
|
|
}
|
|
|
|
// Entity detail pages WITH machine context — add entity as last crumb
|
|
else if (path.startsWith('/component/') && route.query.from === 'machine') {
|
|
result.push({ label: 'Composant', path })
|
|
} else if (path.startsWith('/piece/') && route.query.from === 'machine') {
|
|
result.push({ label: 'Pièce', path })
|
|
} else if (path.startsWith('/product/') && route.query.from === 'machine') {
|
|
result.push({ label: 'Produit', path })
|
|
}
|
|
|
|
// Admin pages
|
|
else if (path.startsWith('/sites')) {
|
|
result.push({ label: 'Sites', path: '/sites' })
|
|
} else if (path.startsWith('/constructeurs')) {
|
|
result.push({ label: 'Fournisseurs', path: '/constructeurs' })
|
|
} else if (path.startsWith('/activity-log')) {
|
|
result.push({ label: 'Journal d\'activité', path: '/activity-log' })
|
|
} else if (path.startsWith('/admin')) {
|
|
result.push({ label: 'Administration', path: '/admin' })
|
|
} else if (path.startsWith('/documents')) {
|
|
result.push({ label: 'Documents', path: '/documents' })
|
|
} else if (path.startsWith('/comments')) {
|
|
result.push({ label: 'Commentaires', path: '/comments' })
|
|
}
|
|
|
|
// Category pages
|
|
else if (path.startsWith('/component-category')) {
|
|
result.push({ label: 'Composants', path: '/catalogues/composants' })
|
|
result.push({ label: 'Catégorie', path })
|
|
} else if (path.startsWith('/piece-category')) {
|
|
result.push({ label: 'Pièces', path: '/catalogues/pieces' })
|
|
result.push({ label: 'Catégorie', path })
|
|
} else if (path.startsWith('/product-category')) {
|
|
result.push({ label: 'Produits', path: '/catalogues/produits' })
|
|
result.push({ label: 'Catégorie', path })
|
|
}
|
|
|
|
// Create pages
|
|
else if (path.startsWith('/pieces/create')) {
|
|
result.push({ label: 'Pièces', path: '/catalogues/pieces' })
|
|
result.push({ label: 'Nouvelle pièce', path })
|
|
} else if (path.startsWith('/component/create')) {
|
|
result.push({ label: 'Composants', path: '/catalogues/composants' })
|
|
result.push({ label: 'Nouveau composant', path })
|
|
} else if (path.startsWith('/product/create')) {
|
|
result.push({ label: 'Produits', path: '/catalogues/produits' })
|
|
result.push({ label: 'Nouveau produit', path })
|
|
} else if (path === '/machines/new') {
|
|
result.push({ label: 'Parc machines', path: '/machines' })
|
|
result.push({ label: 'Nouvelle machine', path })
|
|
}
|
|
|
|
return result
|
|
})
|
|
</script>
|