Skip to content

Commit 7b7299f

Browse files
ttdmyvalentin
andauthored
feat: adding ademe raw programs (#2438)
close [#2361](#2361) --------- Co-authored-by: Yohann Valentin <pro@yohannvalentin.com> Co-authored-by: Yohann Valentin <yvalentin@users.noreply.github.com>
1 parent aab1d71 commit 7b7299f

File tree

71 files changed

+3596
-897
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+3596
-897
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ dispositifs*.xlsx
7474
# Local cache
7575
**/program_tmp.json
7676
/test-results/
77+
temp*.json
78+
tmp*.json
7779

7880
# Playwright
7981
/playwright-report/

apps/nuxt/src/components/element/TeeCounterResult.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ import Translation from '@/tools/translation'
1212
1313
interface Props {
1414
toCount?: ProjectType[] | ProgramTypeForFront[]
15+
inCount?: number
1516
}
1617
1718
const props = defineProps<Props>()
1819
1920
const count = computed(() => {
20-
return props.toCount?.length || 0
21+
return props.inCount || props.toCount?.length || 0
2122
})
2223
</script>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<template>
2+
<ExternalProgramDetail v-if="isExternalProgram" />
3+
<ProgramDetail v-else />
4+
</template>
5+
6+
<script setup lang="ts">
7+
import ProgramDetail from '@/components/program/detail/ProgramDetail.vue'
8+
import ExternalProgramDetail from '@/components/program/externalProgram/detail/ExternalProgramDetail.vue'
9+
import { useProgramStore } from '@/stores/program'
10+
import { storeToRefs } from 'pinia'
11+
12+
const { currentProgram, currentExtProgram } = storeToRefs(useProgramStore())
13+
14+
const isExternalProgram = computed(() => !currentProgram.value && !!currentExtProgram.value)
15+
</script>

apps/nuxt/src/components/program/detail/ProgramActivation.vue

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<template #content>
1010
<ol class="fr-order-list">
1111
<li
12-
v-if="!isDataFull"
12+
v-if="!isDataFull && showRegistrationStep"
1313
class="fr-mb-4v fr-mb-md-2v"
1414
>
1515
<div class="fr-mb-0 fr-ml-0">{{ Translation.t('program.programActivationRegistration') }}</div>
@@ -22,7 +22,7 @@
2222
</DsfrButton>
2323
</li>
2424
<li
25-
v-for="(content, idx) in program.objectifs"
25+
v-for="(content, idx) in program?.objectifs"
2626
:key="`description-paragraph-${idx}`"
2727
class="fr-mb-4v fr-mb-md-2v"
2828
>
@@ -38,14 +38,14 @@
3838
:key="`link-${idx}-${linkId}`"
3939
>
4040
<TeeButtonExternalLink
41-
v-if="link.lien"
41+
v-if="`lien` in link && link.lien"
4242
:href="link.lien"
4343
class="fr-my-1v fr-mr-md-2v"
4444
>
4545
{{ link.texte }}
4646
</TeeButtonExternalLink>
4747
<DsfrButton
48-
v-if="link.formulaire && isFormVisible"
48+
v-if="`formulaire` in link && link.formulaire && isFormVisible"
4949
secondary
5050
icon="fr-icon-mail-line"
5151
size="md"
@@ -63,20 +63,23 @@
6363
</template>
6464

6565
<script setup lang="ts">
66+
import AbstractProgram from '@/tools/program/abstractProgram'
6667
import Translation from '@/tools/translation'
6768
import { Marked } from '@/tools/marked'
68-
import { type ProgramTypeForFront } from '@/types'
6969
import Navigation from '@/tools/navigation'
7070
7171
interface Props {
72-
program: ProgramTypeForFront
7372
scrollToForm: () => void
7473
isFormVisible: boolean
74+
showRegistrationStep?: boolean
7575
}
7676
77-
defineProps<Props>()
77+
withDefaults(defineProps<Props>(), {
78+
showRegistrationStep: true
79+
})
7880
7981
const { isDataFull } = storeToRefs(useCompanyDataStore())
82+
const program = AbstractProgram.getCurrent()
8083
8184
const openModal = () => {
8285
useNavigationStore().resetFromCtaRegisterModal()

apps/nuxt/src/components/program/detail/ProgramBackLink.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@
1717
</template>
1818
<script setup lang="ts">
1919
import Navigation from '@/tools/navigation'
20-
import Program from '@/tools/program/program'
20+
import AbstractProgram from '@/tools/program/abstractProgram'
2121
import Translation from '@/tools/translation'
2222
23-
const { currentProgram } = storeToRefs(useProgramStore())
2423
const { currentProject } = storeToRefs(useProjectStore())
2524
const navigation = new Navigation()
2625
27-
const backLink = Program.getBackLink(currentProgram.value, currentProject.value)
26+
const backLink = AbstractProgram.getBackLink(AbstractProgram.getCurrent().value, currentProject.value)
2827
2928
const isCatalogDetail = navigation.isCatalogProgramDetail()
3029
</script>

apps/nuxt/src/components/program/detail/ProgramDetail.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
<template>
22
<Layout :links="links">
33
<template
4-
v-if="isDataFull || Program.isTemporaryUnavailable(currentProgram) || !Program.isAvailable(currentProgram)"
4+
v-if="
5+
isDataFull ||
6+
AbstractProgram.isTemporaryUnavailable(currentProgram as AbstractProgramTypeForFront) ||
7+
!Program.isAvailable(currentProgram)
8+
"
59
#beforeBreadcrumb
610
>
711
<ClientOnly>
@@ -25,7 +29,6 @@
2529
<ProgramTitle />
2630
<ProgramResume />
2731
<ProgramMainCta
28-
:program="currentProgram"
2932
:is-activation-visible="isActivationVisible"
3033
:scroll-to-form="scrollToForm"
3134
:scroll-to-activation="scrollToActivation"
@@ -35,15 +38,14 @@
3538
<div ref="activation-ref">
3639
<ProgramActivation
3740
v-if="isActivationVisible"
38-
:program="currentProgram"
3941
:is-form-visible="isFormVisible"
4042
:scroll-to-form="scrollToForm"
4143
/>
4244
</div>
4345
<ProgramTiles />
44-
<ProgramEligibilityConditions :program="currentProgram" />
46+
<ProgramEligibilityConditions />
4547
<ProgramProjects :program="currentProgram" />
46-
<ProgramLongDescription :program="currentProgram" />
48+
<ProgramLongDescription />
4749
<div ref="form-ref">
4850
<ClientOnly>
4951
<ProgramForm
@@ -61,6 +63,7 @@ import { TeeDsfrBreadcrumbProps } from '@/components/element/TeeDsfrBreadcrumb.v
6163
import { useNavigationStore } from '@/stores/navigation'
6264
import { useProgramStore } from '@/stores/program'
6365
import Navigation from '@/tools/navigation'
66+
import AbstractProgram from '@/tools/program/abstractProgram'
6467
import { ProgramManager } from '@/tools/program/programManager'
6568
import { ProjectManager } from '@/tools/project/projectManager'
6669
import { RouteName } from '@/types/routeType'
@@ -72,7 +75,7 @@ import { useExternalLinkTracker } from '@/tools/analytic/useExternalLinkTracker'
7275
import Analytics from '@/tools/analytic/analytics'
7376
import { Scroll } from '@/tools/scroll/scroll'
7477
import { useCompanyDataStore } from '@/stores/companyData'
75-
import { ProgramEligibility } from '@/types'
78+
import { AbstractProgramTypeForFront, ProgramEligibility } from '@/types'
7679
import { defineWebPage, useSchemaOrg } from '@unhead/schema-org/vue'
7780
7881
const { currentProgram } = storeToRefs(useProgramStore())

apps/nuxt/src/components/program/detail/ProgramEligibilityBar.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
/>
99
</template>
1010
<script setup lang="ts">
11+
import AbstractProgram from '@/tools/program/abstractProgram'
1112
import Translation from '@/tools/translation'
12-
import { Color, ProgramEligibilityStatus, RouteName } from '@/types'
13+
import { AbstractProgramTypeForFront, Color, ProgramEligibilityStatus, RouteName } from '@/types'
1314
import { TeeEligibilityBarLink, TeeEligibilityBarMessage } from '@/components/program/eligibility/TeeEligibilityBar.vue'
1415
import { useProgramStore } from '@/stores/program'
1516
import { storeToRefs } from 'pinia'
@@ -43,7 +44,7 @@ const getEligibilityMessage: ComputedRef<TeeEligibilityBarMessage> = computed(()
4344
role: 'alert'
4445
}
4546
}
46-
if (Program.isTemporaryUnavailable(program.value)) {
47+
if (AbstractProgram.isTemporaryUnavailable(program.value as AbstractProgramTypeForFront)) {
4748
return {
4849
default: 'Cette aide est temporairement indisponible.',
4950
mobile: 'Cette aide est temporairement indisponible.',
@@ -82,15 +83,15 @@ const getEligibilityColor: ComputedRef<Color> = computed(() => {
8283
return Color.red
8384
}
8485
85-
return Program.isTemporaryUnavailable(program.value)
86+
return AbstractProgram.isTemporaryUnavailable(program.value as AbstractProgramTypeForFront)
8687
? Color.red
8788
: program.value && [ProgramEligibilityStatus.NotEligible, ProgramEligibilityStatus.Unknown].includes(program.value.eligibility)
8889
? Color.red
8990
: Color.greenLightnessed
9091
})
9192
9293
const getEligibilityLink: ComputedRef<TeeEligibilityBarLink | undefined> = computed(() => {
93-
if (Program.isTemporaryUnavailable(program.value)) {
94+
if (AbstractProgram.isTemporaryUnavailable(program.value as AbstractProgramTypeForFront)) {
9495
return undefined
9596
}
9697
switch (program.value?.eligibility) {

apps/nuxt/src/components/program/detail/ProgramEligibilityConditions.vue

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
</h4>
2626
<ul class="fr-pl-4w fr-mt-1v">
2727
<li
28-
v-for="(value, i) in programEligibility[field]"
28+
v-for="(value, i) in programEligibility?.[field]"
2929
:key="`elegibility-field-${idx}-value-${i}`"
3030
class="fr-mb-0"
3131
v-html="Marked.toHtml(value)"
@@ -39,11 +39,14 @@
3939
</template>
4040

4141
<script setup lang="ts">
42+
import AbstractProgram from '@/tools/program/abstractProgram'
4243
import { computed } from 'vue'
43-
import { ProgramTypeForFront } from '@/types'
44+
import type { ProgramTypeForFront } from '@tee/data'
4445
import { Marked } from '@/tools/marked'
4546
import Translation from '@/tools/translation'
4647
48+
const program = AbstractProgram.getCurrent()
49+
4750
type EligibilityCategory = keyof ProgramTypeForFront["conditions d'éligibilité"]
4851
4952
type Emojis = Record<EligibilityCategory, string>
@@ -70,16 +73,11 @@ const splitInTwo = (fields: EligibilityCategory[]): [EligibilityCategory[], Elig
7073
}
7174
7275
const getFieldsForColumn = (columnNumber: number): EligibilityCategory[] => {
73-
const columns = splitInTwo(order.filter((field) => !!programEligibility.value[field]))
76+
const columns = splitInTwo(order.filter((field) => !!programEligibility.value?.[field as keyof typeof programEligibility.value]))
7477
return columns[columnNumber - 1]
7578
}
7679
77-
interface Props {
78-
program: ProgramTypeForFront
79-
}
80-
const props = defineProps<Props>()
81-
8280
const programEligibility = computed(() => {
83-
return props.program["conditions d'éligibilité"]
81+
return program.value?.["conditions d'éligibilité"]
8482
})
8583
</script>

apps/nuxt/src/components/program/detail/ProgramImage.vue

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,35 @@
33
class="fr-responsive-img"
44
:class="getOperator && getOperator?.color ? `fr-bg--${getOperator?.color}--lightness` : ''"
55
:src="getImage()"
6-
:alt="`image / ${currentProgram?.titre}`"
6+
:alt="`image / ${program?.titre}`"
77
/>
88
</template>
99
<script setup lang="ts">
1010
import { Image } from '@/tools/image'
1111
import { Operator } from '@/tools/operator'
12+
import AbstractProgram from '@/tools/program/abstractProgram'
1213
13-
const { currentProgram } = storeToRefs(useProgramStore())
14+
const program = AbstractProgram.getCurrent()
1415
1516
const img = Image.getUrl
1617
1718
const getOperator = computed(() => {
18-
if (!currentProgram.value) {
19+
const operatorName = program.value?.['opérateur de contact']
20+
if (!operatorName) {
1921
return undefined
2022
}
21-
return new Operator().getOneByName(currentProgram.value['opérateur de contact'])
23+
return new Operator().getOneByName(operatorName)
2224
})
2325
2426
const getImage = () => {
2527
const operator = getOperator.value
28+
2629
return operator?.imagePath
2730
? img(operator?.imagePath, { loading: 'lazy' })
28-
: img(`/${currentProgram.value?.illustration}`, { height: 320, quality: 70, loading: 'lazy' })
31+
: img(`/${program.value?.illustration || 'images/TEE_ampoule.webp'}`, {
32+
height: 320,
33+
quality: 70,
34+
loading: 'lazy'
35+
})
2936
}
3037
</script>

apps/nuxt/src/components/program/detail/ProgramLongDescription.vue

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,9 @@
1313
</template>
1414

1515
<script setup lang="ts">
16-
import type { ProgramTypeForFront } from '@/types'
16+
import AbstractProgram from '@/tools/program/abstractProgram'
1717
import Translation from '@/tools/translation'
1818
import { Marked } from '@/tools/marked'
1919
20-
interface Props {
21-
program: ProgramTypeForFront
22-
}
23-
defineProps<Props>()
20+
const program = AbstractProgram.getCurrent()
2421
</script>

0 commit comments

Comments
 (0)