From 30fbc0e4e8d61a00a583cb7c82817492cdf69ca7 Mon Sep 17 00:00:00 2001 From: isUnknown Date: Thu, 23 Jan 2025 17:39:40 +0100 Subject: [PATCH] kanban > steps : add dtl indicator --- public/site/blueprints/users/0_client.yml | 11 ++ public/site/blueprints/users/1_pochet.yml | 21 ++++ public/site/plugins/helpers/index.php | 147 ++++++++++++++++++++++ public/site/templates/project.json.php | 147 ---------------------- public/site/templates/projects.json.php | 9 +- src/components/project/Project.vue | 15 ++- src/components/project/cards/Document.vue | 4 + src/components/project/cards/Images.vue | 6 +- src/stores/designToLight.js | 18 +++ 9 files changed, 222 insertions(+), 156 deletions(-) create mode 100644 public/site/blueprints/users/0_client.yml create mode 100644 public/site/blueprints/users/1_pochet.yml create mode 100644 src/stores/designToLight.js diff --git a/public/site/blueprints/users/0_client.yml b/public/site/blueprints/users/0_client.yml new file mode 100644 index 0000000..cf2109b --- /dev/null +++ b/public/site/blueprints/users/0_client.yml @@ -0,0 +1,11 @@ +title: Client +description: Ne peut pas accéder au Panel, peut accéder aux Projets auxquels il est assigné côté front. +permissions: + access: + panel: false + +fields: + projects: + label: Projets + type: pages + query: page('projects').children diff --git a/public/site/blueprints/users/1_pochet.yml b/public/site/blueprints/users/1_pochet.yml new file mode 100644 index 0000000..bd66784 --- /dev/null +++ b/public/site/blueprints/users/1_pochet.yml @@ -0,0 +1,21 @@ +title: Interne Pochet +description: Peux accéder au Panel mais pas aux Utilisateurs, peut accéder aux Projets auxquels il est assigné par un Admin. +home: /panel/pages/projects +permissions: + access: + users: false + +fields: + job: + label: Métier + type: select + options: + - Project Manager + - Sales Manager + default: Project Panager + width: 1/4 + projects: + label: Projets + type: pages + query: page('projects').children + width: 3/4 diff --git a/public/site/plugins/helpers/index.php b/public/site/plugins/helpers/index.php index 776224c..565bb15 100644 --- a/public/site/plugins/helpers/index.php +++ b/public/site/plugins/helpers/index.php @@ -36,4 +36,151 @@ function getFileData($file) { } return $data; +} + +function getGlobalEvaluation($numberedGrade) { + $gradeMapping = [ + [0, 3, "D", "Assez lourd", "Allègement du flacon recommandé"], + [3, 6, "C", "Assez lourd", "Allègement du flacon recommandé"], + [6, 8, "B", "Assez lourd", "Allègement du flacon recommandé"], + [8, 10, "A", "Léger", "Conception optimisée"], + ]; + + foreach ($gradeMapping as [$min, $max, $letter, $mention, $comment]) { + if ($numberedGrade >= $min && $numberedGrade < $max) { + return [ + "letter" => $letter, + "number" => $numberedGrade, + "mention" => $mention, + "comment" => $comment, + ]; + } + } + + return [ + "letter" => "", + "number" => $numberedGrade, + "mention" => "Non défini", + "comment" => "Pas d'évaluation disponible", + ]; +} + +function processDTLProposals($page) { + $proposals = []; + + foreach ($page->dtlProposals()->toStructure() as $proposal) { + $location = $proposal->DTLProposalLocation()->value(); + $DTLProposal = null; + + switch ($location) { + case 'proposal': + $proposalPage = $page->find('proposal'); + $proposalFile = $proposal->DTLproposal()->toFile(); + + if ($proposalPage && $proposalFile) { + $index = $proposalPage->pdf()->toFiles()->indexOf($proposalFile); + $DTLProposal = [ + "location" => "proposal", + "path" => "/projects/" . $page->slug() . "?dialog=proposal&fileIndex=" . $index, + "date" => $proposalFile->modified("d/MM/Y"), + "stepLabel" => "Proposition commerciale", + ]; + } + break; + + case 'industrialIdeation': + $proposalPage = $page->find('industrial-ideation'); + $proposalFile = $proposal->DTLindustrialIdeation()->toFile(); + + if ($proposalPage && $proposalFile) { + $DTLProposal = [ + "location" => "industrialIdeation", + "path" => "/projects/" . $page->slug() . "?dialog=industrial-ideation", + "date" => $proposalFile->modified("d/MM/Y"), + "stepLabel" => "Idéation industrielle", + ]; + } + break; + + case 'virtualSampleDynamicTrack': + $proposalPage = $proposal->DTLVirtualSampleDynamicTrack()->toPage(); + if ($proposalPage) { + $DTLProposal = [ + "location" => "virtualSampleDynamicTrack", + "path" => "/projects/" . $page->slug() . "?dialog=virtual-sample", + "date" => $proposalPage->modified("d/MM/Y"), + "stepLabel" => "Échantillon virtuel - piste dynamique", + ]; + } + break; + + case 'virtualSampleStaticTrack': + $proposalPage = $page->find('virtual-sample'); + $proposalFile = $proposal->DTLVirtualSampleStaticTrack()->toFile(); + if ($proposalPage && $proposalFile) { + $DTLProposal = [ + "location" => "virtualSampleStaticTrack", + "path" => "/projects/" . $page->slug() . "?dialog=virtual-sample", + "date" => $proposalFile->modified("d/MM/Y"), + "stepLabel" => "Échantillon virtuel - piste statique", + ]; + } + break; + } + + if ($DTLProposal) { + if (isset($proposalFile) && $proposalFile->cover()->isNotEmpty()) { + $DTLProposal["thumb"] = $proposalFile->cover()->toFile()->thumb([ + "width" => 200, + "format" => "webp" + ])->url(); + } + if ($proposalPage->views()->isNotEmpty()) { + $DTLProposal["thumb"] = $proposalPage->views()->toFile()->thumb([ + "width" => 200, + "format" => "webp" + ])->url(); + } + + $numberedGlobalGrade = (int) $proposal->DTLGrade()->value() ?? 0; + + $DTLProposal["grades"] = [ + "global" => getGlobalEvaluation($numberedGlobalGrade), + "position" => [ + "complexity" => (int) $proposal->DTLComplexityGrade()->value() ?? 0, + "weight" => (int) $proposal->DTLWeightGrade()->value() ?? 0, + ], + "indicators" => [ + [ + "label" => "design", + "value" => (int) $proposal->DTLDesignGrade()->value() ?? 0, + ], + [ + "label" => "ring", + "value" => (int) $proposal->DTLRingGrade()->value() ?? 0, + ], + [ + "label" => "shoulder", + "value" => (int) $proposal->DTLShoulderGrade()->value() ?? 0, + ], + [ + "label" => "skeleton", + "value" => (int) $proposal->DTLSkeletonGrade()->value() ?? 0, + ], + [ + "label" => "foot", + "value" => (int) $proposal->DTLFootGrade()->value() ?? 0, + ], + [ + "label" => "bottom", + "value" => (int) $proposal->DTLBottomGrade()->value() ?? 0, + ], + ], + ]; + + $proposals[] = $DTLProposal; + } + } + + return $proposals; } \ No newline at end of file diff --git a/public/site/templates/project.json.php b/public/site/templates/project.json.php index 4ad5068..6cc1d75 100644 --- a/public/site/templates/project.json.php +++ b/public/site/templates/project.json.php @@ -1,152 +1,5 @@ = $min && $numberedGrade < $max) { - return [ - "letter" => $letter, - "number" => $numberedGrade, - "mention" => $mention, - "comment" => $comment, - ]; - } - } - - return [ - "letter" => "", - "number" => $numberedGrade, - "mention" => "Non défini", - "comment" => "Pas d'évaluation disponible", - ]; -} - -function processDTLProposals($page) { - $proposals = []; - - foreach ($page->dtlProposals()->toStructure() as $proposal) { - $location = $proposal->DTLProposalLocation()->value(); - $DTLProposal = null; - - switch ($location) { - case 'proposal': - $proposalPage = $page->find('proposal'); - $proposalFile = $proposal->DTLproposal()->toFile(); - - if ($proposalPage && $proposalFile) { - $index = $proposalPage->pdf()->toFiles()->indexOf($proposalFile); - $DTLProposal = [ - "location" => "proposal", - "path" => "/projects/" . $page->slug() . "?dialog=proposal&fileIndex=" . $index, - "date" => $proposalFile->modified("d/MM/Y"), - "stepLabel" => "Proposition commerciale", - ]; - } - break; - - case 'industrialIdeation': - $proposalPage = $page->find('industrial-ideation'); - $proposalFile = $proposal->DTLindustrialIdeation()->toFile(); - - if ($proposalPage && $proposalFile) { - $DTLProposal = [ - "location" => "industrialIdeation", - "path" => "/projects/" . $page->slug() . "?dialog=industrial-ideation", - "date" => $proposalFile->modified("d/MM/Y"), - "stepLabel" => "Idéation industrielle", - ]; - } - break; - - case 'virtualSampleDynamicTrack': - $proposalPage = $proposal->DTLVirtualSampleDynamicTrack()->toPage(); - if ($proposalPage) { - $DTLProposal = [ - "location" => "virtualSampleDynamicTrack", - "path" => "/projects/" . $page->slug() . "?dialog=virtual-sample", - "date" => $proposalPage->modified("d/MM/Y"), - "stepLabel" => "Échantillon virtuel - piste dynamique", - ]; - } - break; - - case 'virtualSampleStaticTrack': - $proposalPage = $page->find('virtual-sample'); - $proposalFile = $proposal->DTLVirtualSampleStaticTrack()->toFile(); - if ($proposalPage && $proposalFile) { - $DTLProposal = [ - "location" => "virtualSampleStaticTrack", - "path" => "/projects/" . $page->slug() . "?dialog=virtual-sample", - "date" => $proposalFile->modified("d/MM/Y"), - "stepLabel" => "Échantillon virtuel - piste statique", - ]; - } - break; - } - - if ($DTLProposal) { - if (isset($proposalFile) && $proposalFile->cover()->isNotEmpty()) { - $DTLProposal["thumb"] = $proposalFile->cover()->toFile()->thumb([ - "width" => 200, - "format" => "webp" - ])->url(); - } - if ($proposalPage->views()->isNotEmpty()) { - $DTLProposal["thumb"] = $proposalPage->views()->toFile()->thumb([ - "width" => 200, - "format" => "webp" - ])->url(); - } - - $numberedGlobalGrade = (int) $proposal->DTLGrade()->value() ?? 0; - - $DTLProposal["grades"] = [ - "global" => getGlobalEvaluation($numberedGlobalGrade), - "position" => [ - "complexity" => (int) $proposal->DTLComplexityGrade()->value() ?? 0, - "weight" => (int) $proposal->DTLWeightGrade()->value() ?? 0, - ], - "indicators" => [ - [ - "label" => "design", - "value" => (int) $proposal->DTLDesignGrade()->value() ?? 0, - ], - [ - "label" => "ring", - "value" => (int) $proposal->DTLRingGrade()->value() ?? 0, - ], - [ - "label" => "shoulder", - "value" => (int) $proposal->DTLShoulderGrade()->value() ?? 0, - ], - [ - "label" => "skeleton", - "value" => (int) $proposal->DTLSkeletonGrade()->value() ?? 0, - ], - [ - "label" => "foot", - "value" => (int) $proposal->DTLFootGrade()->value() ?? 0, - ], - [ - "label" => "bottom", - "value" => (int) $proposal->DTLBottomGrade()->value() ?? 0, - ], - ], - ]; - - $proposals[] = $DTLProposal; - } - } - - return $proposals; -} - $project = [ "title" => $page->title()->value(), "url" => $page->url(), diff --git a/public/site/templates/projects.json.php b/public/site/templates/projects.json.php index ca28e48..311547c 100644 --- a/public/site/templates/projects.json.php +++ b/public/site/templates/projects.json.php @@ -1,6 +1,6 @@ $project->title()->value(), "url" => $project->url(), "uri" => "/" . $project->uri(), @@ -12,7 +12,14 @@ function getProjectData($project) { "notifications" => Yaml::decode($project->notifications()->value), "uuid" => (string) $project->uuid(), "slug" => (string) $project->slug(), + "isDTLEnabled" => (bool) $project->isDTLEnabled()->value() == "true" ]; + + if ($project->isDTLEnabled()) { + $data["designToLight"] = processDTLProposals($project); + } + + return $data; } try { diff --git a/src/components/project/Project.vue b/src/components/project/Project.vue index 07c1aca..8808cb0 100644 --- a/src/components/project/Project.vue +++ b/src/components/project/Project.vue @@ -1,19 +1,22 @@ diff --git a/src/stores/designToLight.js b/src/stores/designToLight.js new file mode 100644 index 0000000..76fd972 --- /dev/null +++ b/src/stores/designToLight.js @@ -0,0 +1,18 @@ +import { defineStore, storeToRefs } from "pinia"; +import { usePageStore } from "./page"; + +export const useDesignToLightStore = defineStore("design-to-light", () => { + const { page } = storeToRefs(usePageStore()); + + function isDesignToLightStep(step) { + const isDTLEnabled = page.value.designToLight; + return ( + isDTLEnabled && + page.value.designToLight.some((proposal) => + proposal.path.includes(step.uri) + ) + ); + } + + return { isDesignToLightStep }; +});