add img preview + fix navbar

This commit is contained in:
Matthieu
2025-10-16 10:26:36 +02:00
parent 8eada12438
commit 4ccc19505f
10 changed files with 479 additions and 344 deletions

View File

@@ -300,13 +300,21 @@
class="flex items-center justify-between rounded border border-base-200 bg-base-100 px-3 py-2"
>
<div class="flex items-center gap-3 text-sm">
<span class="text-xl" :class="documentIcon(document).colorClass">
<div class="h-14 w-14 flex-shrink-0 overflow-hidden rounded-md border border-base-200 bg-base-200/70 flex items-center justify-center">
<img
v-if="isImageDocument(document) && document.path"
:src="document.path"
class="h-full w-full object-cover"
:alt="`Aperçu de ${document.name}`"
>
<component
v-else
:is="documentIcon(document).component"
class="h-6 w-6"
:class="documentIcon(document).colorClass"
aria-hidden="true"
/>
</span>
</div>
<div>
<div class="font-medium">
{{ document.name }}
@@ -379,7 +387,7 @@ import { formatStructurePreview } from '~/shared/modelUtils'
import type { ComponentModelStructure } from '~/shared/types/inventory'
import type { ModelType } from '~/services/modelTypes'
import { getFileIcon } from '~/utils/fileIcons'
import { canPreviewDocument } from '~/utils/documentPreview'
import { canPreviewDocument, isImageDocument } from '~/utils/documentPreview'
interface ComponentCatalogType extends ModelType {
structure: ComponentModelStructure | null

View File

@@ -265,13 +265,21 @@
class="flex items-center justify-between rounded border border-base-200 bg-base-100 px-3 py-2"
>
<div class="flex items-center gap-3 text-sm">
<span class="text-xl" :class="documentIcon(document).colorClass">
<div class="h-14 w-14 flex-shrink-0 overflow-hidden rounded-md border border-base-200 bg-base-200/70 flex items-center justify-center">
<img
v-if="isImageDocument(document) && document.path"
:src="document.path"
class="h-full w-full object-cover"
:alt="`Aperçu de ${document.name}`"
>
<component
v-else
:is="documentIcon(document).component"
class="h-6 w-6"
:class="documentIcon(document).colorClass"
aria-hidden="true"
/>
</span>
</div>
<div>
<div class="font-medium">{{ document.name }}</div>
<div class="text-xs text-gray-500">
@@ -517,7 +525,7 @@ import { useToast } from '~/composables/useToast'
import { useDocuments } from '~/composables/useDocuments'
import { getFileIcon } from '~/utils/fileIcons'
import { sanitizeDefinitionOverrides } from '~/shared/modelUtils'
import { canPreviewDocument } from '~/utils/documentPreview'
import { canPreviewDocument, isImageDocument } from '~/utils/documentPreview'
import ComponentHierarchy from '~/components/ComponentHierarchy.vue'
import DocumentUpload from '~/components/DocumentUpload.vue'
import ConstructeurSelect from '~/components/ConstructeurSelect.vue'

View File

@@ -840,18 +840,6 @@ const formatAssignmentList = (assignments) => {
.join(', ')
}
const selectedComponentIds = computed(() => {
const ids = []
Object.values(componentRequirementSelections).forEach((entries) => {
;(entries || []).forEach((entry) => {
if (entry?.composantId) {
ids.push(entry.composantId)
}
})
})
return ids
})
const selectedPieceIds = computed(() => {
const ids = []
Object.values(pieceRequirementSelections).forEach((entries) => {
@@ -866,21 +854,15 @@ const selectedPieceIds = computed(() => {
const getComponentOptions = (requirement, currentEntry) => {
const requirementTypeId = requirement?.typeComposantId || requirement?.typeComposant?.id || null
const usedIds = new Set(
selectedComponentIds.value.filter((id) => id && (!currentEntry || id !== currentEntry.composantId)),
)
return componentInventory.value.filter((component) => {
if (!component?.id) {
return false
}
if (requirementTypeId && component.typeComposantId !== requirementTypeId) {
return false
return currentEntry?.composantId === component.id
}
if (!component.id) {
return false
}
if (currentEntry?.composantId === component.id) {
return true
}
return !usedIds.has(component.id)
return true
})
}

View File

@@ -270,13 +270,21 @@
class="flex items-center justify-between rounded border border-base-200 bg-base-100 px-3 py-2"
>
<div class="flex items-center gap-3 text-sm">
<span class="text-xl" :class="documentIcon(document).colorClass">
<div class="h-14 w-14 flex-shrink-0 overflow-hidden rounded-md border border-base-200 bg-base-200/70 flex items-center justify-center">
<img
v-if="isImageDocument(document) && document.path"
:src="document.path"
class="h-full w-full object-cover"
:alt="`Aperçu de ${document.name}`"
>
<component
v-else
:is="documentIcon(document).component"
class="h-6 w-6"
:class="documentIcon(document).colorClass"
aria-hidden="true"
/>
</span>
</div>
<div>
<div class="font-medium">
{{ document.name }}
@@ -346,7 +354,7 @@ import { useApi } from '~/composables/useApi'
import { useToast } from '~/composables/useToast'
import { useDocuments } from '~/composables/useDocuments'
import { getFileIcon } from '~/utils/fileIcons'
import { canPreviewDocument } from '~/utils/documentPreview'
import { canPreviewDocument, isImageDocument } from '~/utils/documentPreview'
import { formatPieceStructurePreview } from '~/shared/modelUtils'
import type { PieceModelStructure } from '~/shared/types/inventory'
import type { ModelType } from '~/services/modelTypes'