2025-01-22 13:25:34 +01:00
|
|
|
|
<template>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<aside
|
|
|
|
|
|
id="dtl-panel"
|
|
|
|
|
|
class="text-sm bg-black rounded-2xl"
|
|
|
|
|
|
aria-labelledby="dtl-label"
|
|
|
|
|
|
@click="preventClose($event)"
|
|
|
|
|
|
>
|
|
|
|
|
|
<header
|
|
|
|
|
|
class="flex items-center | border-b pl-32 pr-16 py-8"
|
|
|
|
|
|
data-icon="leaf"
|
|
|
|
|
|
style="--column-gap: 0.5rem"
|
|
|
|
|
|
>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
<h2 id="dtl-label" class="font-serif text-xl">Design to Light</h2>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<button
|
2025-01-27 11:22:57 +01:00
|
|
|
|
v-if="!isDialogOpen"
|
2025-01-27 11:06:06 +01:00
|
|
|
|
@click="emits('close')"
|
|
|
|
|
|
class="btn btn--icon btn--transparent | ml-auto"
|
|
|
|
|
|
data-icon="close"
|
|
|
|
|
|
>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
<span class="sr-only">Fermer</span>
|
|
|
|
|
|
</button>
|
|
|
|
|
|
</header>
|
|
|
|
|
|
<nav class="tabs" role="tablist" tabindex="-1">
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<button
|
2025-01-23 18:46:38 +01:00
|
|
|
|
v-for="(proposal, index) in proposals"
|
|
|
|
|
|
@click="activeProposal = proposal"
|
|
|
|
|
|
role="tab"
|
|
|
|
|
|
:aria-selected="proposal.isActive"
|
|
|
|
|
|
aria-controls=""
|
|
|
|
|
|
>
|
|
|
|
|
|
{{ index === 0 ? "Proposition initiale" : "Alternative " + index }}
|
|
|
|
|
|
</button>
|
|
|
|
|
|
</nav>
|
|
|
|
|
|
<section class="overflow-y" tabindex="-1">
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<div
|
|
|
|
|
|
id="proposition"
|
|
|
|
|
|
class="flex | bg-white-05 text-grey-200 px-32 py-16"
|
|
|
|
|
|
style="--column-gap: 1rem"
|
|
|
|
|
|
>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
<h3 class="sr-only">Proposition</h3>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<img
|
|
|
|
|
|
v-if="activeProposal.thumb"
|
|
|
|
|
|
:src="activeProposal.thumb"
|
|
|
|
|
|
alt=""
|
|
|
|
|
|
width="72"
|
|
|
|
|
|
height="72"
|
|
|
|
|
|
loading="lazy"
|
|
|
|
|
|
class="bg-white rounded-sm"
|
|
|
|
|
|
/>
|
|
|
|
|
|
<p>
|
|
|
|
|
|
Données basées sur la proposition <br />du {{ activeProposal.date }}
|
|
|
|
|
|
<br />{{ activeProposal.stepLabel }}
|
|
|
|
|
|
</p>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="note-globale" class="px-32 py-16 border-b flow">
|
|
|
|
|
|
<h3>Note globale</h3>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<div class="flex" style="--column-gap: 1rem">
|
|
|
|
|
|
<p :data-grade="activeProposal.grades.global.letter">
|
|
|
|
|
|
<strong class="sr-only">{{
|
|
|
|
|
|
activeProposal.grades.global.letter
|
|
|
|
|
|
}}</strong>
|
|
|
|
|
|
</p>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
<div class="flex-1">
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<p>
|
|
|
|
|
|
<strong class="text-md font-medium">{{
|
|
|
|
|
|
activeProposal.grades.global.mention
|
|
|
|
|
|
}}</strong>
|
|
|
|
|
|
<span class="text-white-50 ml-8"
|
|
|
|
|
|
>{{ activeProposal.grades.global.number }}/10</span
|
|
|
|
|
|
>
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<input
|
|
|
|
|
|
type="range"
|
|
|
|
|
|
min="0"
|
|
|
|
|
|
max="10"
|
|
|
|
|
|
:value="activeProposal.grades.global.number"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
/>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
<p>{{ activeProposal.grades.global.comment }}</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div id="positionnement" class="px-32 py-16 border-b flow">
|
|
|
|
|
|
<h3>Positionnement</h3>
|
|
|
|
|
|
<dl>
|
|
|
|
|
|
<dt id="design">Design</dt>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<dd>
|
|
|
|
|
|
<span class="sr-only">{{
|
|
|
|
|
|
activeProposal.grades.position.complexity
|
|
|
|
|
|
}}</span>
|
|
|
|
|
|
</dd>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
<dt id="poids">Poids</dt>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<dd>
|
|
|
|
|
|
<span class="sr-only">{{
|
|
|
|
|
|
activeProposal.grades.position.weight
|
|
|
|
|
|
}}</span>
|
|
|
|
|
|
</dd>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
</dl>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<button
|
2025-01-23 18:46:38 +01:00
|
|
|
|
class="dot"
|
|
|
|
|
|
v-for="(proposal, index) in proposals"
|
|
|
|
|
|
@click="activeProposal = proposal"
|
|
|
|
|
|
:aria-selected="proposal.isActive"
|
2025-01-27 11:06:06 +01:00
|
|
|
|
:style="
|
|
|
|
|
|
'--x:' +
|
|
|
|
|
|
activeProposal.grades.position.complexity +
|
|
|
|
|
|
';--y:' +
|
|
|
|
|
|
activeProposal.grades.position.weight
|
|
|
|
|
|
"
|
2025-01-23 18:46:38 +01:00
|
|
|
|
:title="index === 0 ? 'Proposition initiale' : 'Alternative ' + index"
|
|
|
|
|
|
>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<span class="sr-only">{{
|
|
|
|
|
|
index === 0 ? "Proposition initiale" : "Alternative " + index
|
|
|
|
|
|
}}</span>
|
2025-01-23 12:23:14 +01:00
|
|
|
|
</button>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
</div>
|
|
|
|
|
|
<div id="indicateur" class="px-32 py-16 border-b flow">
|
|
|
|
|
|
<h3>Indicateur des composants impliqués</h3>
|
|
|
|
|
|
<div class="grid">
|
|
|
|
|
|
<template
|
|
|
|
|
|
v-for="indicator in activeProposal.grades.indicators"
|
|
|
|
|
|
:key="indicator.value"
|
|
|
|
|
|
>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
<div
|
|
|
|
|
|
class="gauge"
|
|
|
|
|
|
:data-value="
|
|
|
|
|
|
indicator.value < 0 ? indicator.value : '+' + indicator.value
|
|
|
|
|
|
"
|
|
|
|
|
|
>
|
|
|
|
|
|
<label
|
|
|
|
|
|
:for="indicator.id"
|
|
|
|
|
|
:style="'--value:' + indicator.value"
|
|
|
|
|
|
>{{ indicator.label }}</label
|
|
|
|
|
|
>
|
|
|
|
|
|
<input
|
|
|
|
|
|
:id="indicator.id"
|
|
|
|
|
|
type="range"
|
|
|
|
|
|
min="-5"
|
|
|
|
|
|
max="5"
|
|
|
|
|
|
orient="vertical"
|
|
|
|
|
|
:value="indicator.value"
|
|
|
|
|
|
disabled
|
|
|
|
|
|
/>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
2025-01-27 14:39:52 +01:00
|
|
|
|
<footer v-if="proposals.length > 1" class="p-16">
|
|
|
|
|
|
<button
|
|
|
|
|
|
class="btn btn--white w-full"
|
|
|
|
|
|
@click="isOptimizationDialogOpen = true"
|
|
|
|
|
|
>
|
2025-01-27 11:06:06 +01:00
|
|
|
|
Demander une expertise d’optimisation
|
|
|
|
|
|
</button>
|
2025-01-23 18:46:38 +01:00
|
|
|
|
</footer>
|
|
|
|
|
|
</section>
|
2025-01-22 13:25:34 +01:00
|
|
|
|
</aside>
|
2025-01-27 14:39:52 +01:00
|
|
|
|
<OptimizationRequestDialog v-if="isOptimizationDialogOpen" />
|
2025-01-22 13:25:34 +01:00
|
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
2025-01-27 14:39:52 +01:00
|
|
|
|
import OptimizationRequestDialog from "./OptimizationRequestDialog.vue";
|
2025-01-22 13:25:34 +01:00
|
|
|
|
import dayjs from "dayjs";
|
|
|
|
|
|
import "dayjs/locale/fr";
|
2025-01-27 11:22:57 +01:00
|
|
|
|
import { storeToRefs } from "pinia";
|
|
|
|
|
|
import { ref, onBeforeUnmount, computed } from "vue";
|
|
|
|
|
|
import { useDialogStore } from "../../stores/dialog";
|
2025-01-22 13:25:34 +01:00
|
|
|
|
|
2025-01-27 11:06:06 +01:00
|
|
|
|
const { proposals } = defineProps({
|
|
|
|
|
|
proposals: Array,
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2025-01-27 11:22:57 +01:00
|
|
|
|
const { openedFile } = storeToRefs(useDialogStore());
|
2025-01-22 13:25:34 +01:00
|
|
|
|
|
2025-01-27 11:22:57 +01:00
|
|
|
|
const isDialogOpen = computed(() => {
|
|
|
|
|
|
return openedFile.value != null;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2025-01-27 14:39:52 +01:00
|
|
|
|
const isOptimizationDialogOpen = ref(false);
|
|
|
|
|
|
|
2025-01-27 11:22:57 +01:00
|
|
|
|
dayjs.locale("fr");
|
2025-01-22 13:25:34 +01:00
|
|
|
|
|
2025-01-23 12:23:14 +01:00
|
|
|
|
const emits = defineEmits(["close"]);
|
|
|
|
|
|
|
|
|
|
|
|
proposals[0].isActive = true;
|
|
|
|
|
|
|
|
|
|
|
|
const activeProposal = ref(proposals[0]);
|
|
|
|
|
|
|
2025-01-27 14:39:52 +01:00
|
|
|
|
// window.addEventListener("keyup", closeOnEscape);
|
|
|
|
|
|
// window.addEventListener("click", close);
|
2025-01-23 12:23:14 +01:00
|
|
|
|
|
2025-01-27 14:39:52 +01:00
|
|
|
|
// onBeforeUnmount(() => {
|
|
|
|
|
|
// window.removeEventListener("keyup", closeOnEscape);
|
|
|
|
|
|
// window.removeEventListener("click", close);
|
|
|
|
|
|
// });
|
2025-01-23 12:23:14 +01:00
|
|
|
|
|
|
|
|
|
|
// Functions
|
|
|
|
|
|
function closeOnEscape(event) {
|
|
|
|
|
|
if (event.key === "Escape") emits("close");
|
|
|
|
|
|
}
|
2025-01-23 13:50:24 +01:00
|
|
|
|
|
|
|
|
|
|
function close() {
|
|
|
|
|
|
emits("close");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function preventClose(event) {
|
|
|
|
|
|
event.stopImmediatePropagation();
|
|
|
|
|
|
}
|
2025-01-22 13:25:34 +01:00
|
|
|
|
</script>
|