| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- <template>
- <LayoutContainer>
- <div v-if="pending">
- <v-row class="justify-center progress">
- <v-progress-circular indeterminate color="grey" />
- </v-row>
- </div>
- <div
- v-for="(job, index) in jobs"
- v-else
- :key="index"
- class="mission-container"
- >
- <div class="title-container">
- <NuxtLink :to="`/nous-rejoindre/${job.id}`" class="title">
- {{ job.title }} - {{ $t(job.contractType) }}
- <v-icon v-if="job.featured" class="star fas fa-star" />
- </NuxtLink>
- <v-btn :to="`/nous-rejoindre/${job.id}`" class="btn-more">
- En savoir plus
- </v-btn>
- </div>
- <div class="location-container">
- <v-icon icon="fas fa-map-marker" />
- <div class="location">
- {{ job.city }}
- </div>
- </div>
- </div>
- <v-row>
- <v-col cols="12">
- <LayoutPagination
- v-if="
- jobCollection &&
- jobCollection.pagination &&
- jobCollection.pagination.last! > 1
- "
- :model-value="page"
- :pagination="jobCollection.pagination"
- class="mt-4"
- @update:model-value="onPageUpdated"
- />
- </v-col>
- </v-row>
- <v-row class="mb-6">
- <v-col cols="12">
- <p class="apply-now">
- Nous sommes toujours à la recherche de nouveaux talents.<br />
- N'hésitez pas à déposer votre candidature ci-dessous :
- </p>
- </v-col>
- </v-row>
- <v-row>
- <v-col cols="12">
- <v-btn class="btn-send" @click="dialog = true">
- Envoyer ma candidature
- </v-btn>
- </v-col>
- </v-row>
- <!-- Boite de dialogue "soumettre une candidature" -->
- <JoinUsDialog v-model="dialog" />
- </LayoutContainer>
- </template>
- <script setup lang="ts">
- import type { ComputedRef, Ref } from 'vue'
- import { useEntityFetch } from '~/composables/data/useEntityFetch'
- import JobPosting from '~/models/Maestro/JobPosting'
- import type { AnyJson } from '~/types/data'
- const { fetchCollection } = useEntityFetch()
- const page: Ref<number> = ref(1)
- const query: ComputedRef<AnyJson> = computed(() => {
- return { type: 'BUSINESS', page: page.value }
- })
- const {
- data: jobCollection,
- pending,
- refresh,
- } = fetchCollection(JobPosting, null, query)
- // TODO: voir pourquoi on se retrouve obligé de passer par ce computed pour avoir le type TS correct?
- const jobs: ComputedRef<JobPosting[]> = computed(() => {
- return jobCollection.value !== null
- ? (jobCollection.value.items as JobPosting[])
- : []
- })
- const onPageUpdated = async (newVal: number): Promise<void> => {
- page.value = newVal
- pending.value = true
- await refresh()
- // TODO: remplacer par un watcher sur pending?
- setTimeout(
- async () => await navigateTo({ path: '', hash: '#join-us-anchor' }),
- 200
- )
- }
- /**
- * Faut-il afficher la boite de dialogue de candidature
- */
- const dialog = ref(false)
- </script>
- <style scoped lang="scss">
- .progress {
- margin: 32px auto 128px auto;
- }
- .v-btn {
- font-weight: 600;
- height: 50px;
- border-radius: 6px;
- color: var(--on-neutral-color);
- gap: 9px;
- }
- .v-btn:hover {
- background-color: var(--on-neutral-color-extra-light);
- }
- .mission-container {
- margin: 64px 12%;
- .title-container {
- display: flex;
- justify-content: space-between;
- align-items: center;
- background: var(--primary-color);
- color: var(--on-primary-color);
- height: 80px;
- padding: 10px 10px 10px 1px;
- @media (max-width: 600px) {
- flex-direction: column;
- height: auto;
- }
- .title {
- font-weight: 600;
- font-size: 1.5rem;
- line-height: 39px;
- color: var(--on-primary-color);
- text-decoration: none;
- margin-left: 36px;
- @media (max-width: 600px) {
- font-size: 1.2rem;
- margin-left: auto;
- margin-right: auto;
- width: 90%;
- }
- }
- .star {
- margin-left: 12px;
- font-size: 24px;
- color: yellow;
- vertical-align: baseline;
- }
- .btn-more {
- margin-right: 8px;
- display: flex;
- align-items: center;
- @media (max-width: 600px) {
- margin: 12px auto;
- }
- }
- }
- .location-container {
- background: var(--secondary-color);
- display: flex;
- align-items: center;
- padding: 10px;
- .v-icon {
- font-size: 1rem !important;
- color: var(--primary-color);
- }
- .location {
- color: var(--primary-color);
- margin-left: 10px;
- font-size: 1.3rem;
- }
- @media (max-width: 600px) {
- margin: 0 auto 12px auto;
- }
- }
- }
- @media (max-width: 600px) {
- .mission-container {
- margin: 64px 6%;
- }
- }
- .btn-send {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 30%;
- margin-left: auto;
- margin-right: auto;
- font-weight: 700;
- background-color: var(--secondary-color);
- @media (max-width: 600px) {
- width: 80%;
- margin: 12px auto;
- }
- }
- .apply-now {
- text-align: center;
- font-style: italic;
- font-weight: 300;
- font-size: 1.5rem;
- line-height: 40px;
- color: var(--primary-color);
- margin-bottom: 2rem;
- margin-left: 24px;
- @media (max-width: 600px) {
- max-width: 90%;
- margin: 12px auto;
- }
- }
- </style>
|