From 91a23d4df829e1486e9bdebc6e420002bfa5119c Mon Sep 17 00:00:00 2001 From: Etienne Weil Date: Fri, 24 Jan 2025 10:56:27 +0100 Subject: [PATCH] feat(search): js and backoffice business ok --- .../controllers/search_form_controller.js | 55 +++++------- .../select_weeks_search_controller.js | 80 +++++++++-------- .../context_typable_internship_offer.rb | 2 +- app/models/internship_offer.rb | 4 +- .../internship_offers/search/_form.html.slim | 6 +- .../internship_offers/search/_weeks.html.slim | 38 ++++---- db/seeds/6_populate_offers.rb | 89 ++++++++++--------- test/system/internship_offer_index_test.rb | 13 ++- 8 files changed, 139 insertions(+), 148 deletions(-) diff --git a/app/front_assets/controllers/search_form_controller.js b/app/front_assets/controllers/search_form_controller.js index 899d34988..d38bd31f1 100644 --- a/app/front_assets/controllers/search_form_controller.js +++ b/app/front_assets/controllers/search_form_controller.js @@ -1,40 +1,29 @@ -import { Controller } from 'stimulus'; -import { isVisible, hideElement, showElement } from '../utils/dom'; +import { Controller } from "stimulus"; +import { toggleContainers } from "../utils/dom"; +import { on } from "hammerjs"; export default class extends Controller { + static targets = ["grade"]; - static targets = [ - "tabPane", // multiple targets to navigate weeks selection // months - ]; - - showWeekOrMonthSelection(clickEvent) { - const currentTarget = clickEvent.currentTarget; - const href = new URL(currentTarget.href); - const target = href.hash.replace(/#/, ''); - - this.tabPaneTargets.map(( element) => { - const $el = $(element) - - if (element.id == target) { - showElement($el) - } else if (isVisible($el)) { - hideElement($el) - } else { - // no op, hidden element stays hidden - } - }) - clickEvent.preventDefault(); + onChangeGrade(event) { + if (this.gradeTarget.value == "1") { + this.show3emeOnly(false); + } else if (this.gradeTarget.value == "2" || this.gradeTarget.value == "3") { + this.show3emeOnly(true); + } else { + toggleContainers(this.allElements(), true); + } } - + connect() { - const observer = new MutationObserver(removeStyle); - observer.observe(document.body, { attributes: true, subtree: true, attributeFilter: ['style'] }); - - function removeStyle() { - const tabs = document.querySelector('.fr-tabs'); - if (tabs) { - tabs.style.removeProperty('--tabs-height'); - } - } + this.onChangeGrade(); } + // Private + allElements = () => document.querySelectorAll(".month-score, .month-title"); + juneElements = () => document.querySelectorAll(".month-score.Juin, .month-title.Juin"); + show3emeOnly(value) { + toggleContainers(this.allElements(), value); + toggleContainers(this.juneElements(), !value); + } + } diff --git a/app/front_assets/controllers/select_weeks_search_controller.js b/app/front_assets/controllers/select_weeks_search_controller.js index 06758d3c6..b28ec004e 100644 --- a/app/front_assets/controllers/select_weeks_search_controller.js +++ b/app/front_assets/controllers/select_weeks_search_controller.js @@ -1,7 +1,4 @@ -import $ from "jquery"; import { Controller } from "stimulus"; -// import { toggleContainer } from "../utils/dom"; - export default class extends Controller { static targets = [ @@ -36,28 +33,40 @@ export default class extends Controller { el.addEventListener("change", this.handleCheckboxesChanges.bind(this)); }); this.handleCheckboxesChanges(); - this.setInitialScores(); + } + + connect() { + this.resetScores(); + this.setScoresFromCheckBoxes(); + this.repaintScores(); + } + + handleOneCheckboxChange(event) { + this.handleCheckboxesChanges(event); + this.updateMonthScore(event); + this.repaintScores(); } disconnect() { this.detachEventListeners(); } - setInitialScores() { - this.monthList().forEach((key) => { - const monthContentSelector = document.querySelectorAll(`.${key}`)[0]; - if (monthContentSelector) { - this.scores[key] = parseInt(monthContentSelector.innerHTML.replace(/\D/g, ""), 10); - } - }); + // private + + // on week checked + handleCheckboxesChanges(event) { + this.hasNoCheckboxChecked() + ? this.onNoWeekSelected() + : this.checkboxesContainerTarget.classList.remove("is-invalid"); } + hasNoCheckboxChecked() { const selectedCheckbox = $(this.weekCheckboxesTargets).filter(":checked"); return selectedCheckbox.length === 0; } - // ui helpers + // ui helpers onNoWeekSelected() { const $checkboxesContainer = $(this.checkboxesContainerTarget); $checkboxesContainer.addClass("is-invalid"); @@ -74,31 +83,30 @@ export default class extends Controller { this.repaintScores(); } - // on week checked - handleCheckboxesChanges(event) { - this.hasNoCheckboxChecked() - ? this.onNoWeekSelected() - : this.checkboxesContainerTarget.classList.remove("is-invalid");; - } - - handleOneCheckboxChange(event) { - this.handleCheckboxesChanges(event); - this.setMonthScore(event); - this.repaintScores(); - } - - setMonthScore(event) { + updateMonthScore(event) { if (event == undefined) return; const htmlBox = event.target; const classList = htmlBox.parentNode.classList; this.monthList().forEach((monthName) => { if (classList.contains(monthName)) { - this.scores[monthName] += htmlBox.checked ? 1 : -1; // action is check or uncheck; + this.scores[monthName] += htmlBox.checked ? 1 : -1; // action consists in checking or unchecking; } }); } + setScoresFromCheckBoxes = () => { + console.log(this.monthList()); + this.monthList().forEach((monthName) => { + const rightSideMonthSections = document.querySelectorAll( + `.fr-checkbox-group.${monthName} input[type="checkbox"]` + ); + rightSideMonthSections.forEach((elt) => { + this.scores[monthName] += elt.checked ? 1 : 0; + }); + }); + }; + repaintScores() { this.monthList().forEach((monthName) => { this.monthScoreTargets.forEach((sideElement) => { @@ -111,7 +119,7 @@ export default class extends Controller { }); } - monthList() { return Object.keys(this.scores); } + monthList = () => ( Object.keys(this.scores) ); switchHtmlClasses(element, score) { const classList = element.classList; @@ -135,15 +143,9 @@ export default class extends Controller { // }); // } - // resetScores() { - // this.monthList().forEach((key) => { - // this.scores[key] = 0; - // }); - // } - - // setWeeksMesssage(totalScore) { - // const semaines = this.totalScore(); - // let weeksCount = (semaines > 1) ? totalScore + " semaines proposées" : totalScore + " semaine proposée"; - // return weeksCount; - // } + resetScores() { + this.monthList().forEach((key) => { + this.scores[key] = 0; + }); + } } diff --git a/app/libs/finders/context_typable_internship_offer.rb b/app/libs/finders/context_typable_internship_offer.rb index e93f6bfea..ffe3adf72 100644 --- a/app/libs/finders/context_typable_internship_offer.rb +++ b/app/libs/finders/context_typable_internship_offer.rb @@ -82,7 +82,7 @@ def common_filter def grade_id_query(query) query.merge( InternshipOffer.joins(:grades) - .where(grades: OpenStruct.new(ids: use_params(:grade_id))) + .where(grades: Grade.where(id: use_params(:grade_id))) ) end diff --git a/app/models/internship_offer.rb b/app/models/internship_offer.rb index 47ca847ca..51503f323 100644 --- a/app/models/internship_offer.rb +++ b/app/models/internship_offer.rb @@ -227,9 +227,7 @@ class InternshipOffer < ApplicationRecord } scope :with_grade, lambda { |user| - return all if user.nil? - - user.grade_id == Grade.seconde.id ? seconde : troisieme_or_quatrieme + joins(:grades).where(grades: { id: user.try(:grade_id) || Grade.all.ids }) } scope :by_department, ->(departments) { where(department: departments) } diff --git a/app/views/internship_offers/search/_form.html.slim b/app/views/internship_offers/search/_form.html.slim index 2e0dcac93..e1c32a9fa 100644 --- a/app/views/internship_offers/search/_form.html.slim +++ b/app/views/internship_offers/search/_form.html.slim @@ -28,19 +28,19 @@ div [class="test-search-container #{has_white_bg ? 'search-container fr-pt-2w' : longitude: params[:longitude], radius: params[:radius], whiteBg: has_white_bg } ) - / School_track filter .form-group.mb-md-0.col-12.col-md .fr-select-group - grade_options = Grade.options_for_select(current_user) = form.label :grade_id, "Filière", class: "fr-label" = form.select :grade_id, - options_for_select(grade_options, params[:grade]), + options_for_select(grade_options, params[:grade_id]), grade_options.count > 1 ? { include_blank: "Toutes les filières" } : {}, class: "fr-select almost-fitting", title: "Recherche par filière", :'aria-label' => "Recherche par filière", - data: { action: "change->search-form#submitOnChange" } + data: { action: "change->search-form#onChangeGrade" , + :'search-form-target' => 'grade' } / weeks filter .form-group.mb-md-0.col-12.col-md data-controller='toggle-panel' data-toggle-panel-on-value="false" div data-action='click->toggle-panel#onToggle' diff --git a/app/views/internship_offers/search/_weeks.html.slim b/app/views/internship_offers/search/_weeks.html.slim index 4198b7b07..48422798e 100644 --- a/app/views/internship_offers/search/_weeks.html.slim +++ b/app/views/internship_offers/search/_weeks.html.slim @@ -17,26 +17,28 @@ div data-controller='select-weeks-search' - Presenters::WeekList.new(weeks: current_weeks).month_split.each do |month_num, weeks| - month_name = Presenters::WeekList::MONTH_LIST[month_num - 9][:name] - year = weeks.first.year - .fr-text--xs.fr-mb-1w + div class="fr-text--xs fr-mb-1w #{month_name} month-title" strong = "#{month_name} #{year}" - - weeks.each do |week| - div class="fr-checkbox-group fr-checkbox-group--sm position-relative pr-3 #{month_name}" - - # prevent removing weeks with application by showing a disable checkbox (not submitted to server) - - # keep reference of checkbox id for easier labelling - - checkbox_id = "#{form.object_name}_week_ids_#{week.id}_checkbox" - - # also add an id for hidden field for two reason, avoid conflict, testing - - hidden_id = "#{form.object_name}_week_ids_#{week.id}_hidden" - - options = { multiple: true, - id: checkbox_id, - data: {:"select-weeks-search-target" => 'weekCheckboxes', - action: 'change->select-weeks-search#handleOneCheckboxChange'} } - - options.merge!({checked: week.id.in?(preselected_weeks.map(&:id))}) if preselected_weeks.present? - = form.check_box :week_ids, options, week.id, checked: week.id.in?(school_weeks.map(&:id)) - = form.label :"week_id", for: checkbox_id, class: "fr-label fr-text--sm fr-mb-1v" do - span class="dates-column #{week.in_the_past? ? 'text-grey-disabled' : ''}" - = week.human_shortest - hr.fr-mb-1v.fr-ml-n2w + - weeks.each do |week| + div class="fr-checkbox-group fr-checkbox-group--sm position-relative pr-3 #{month_name}" + - # prevent removing weeks with application by showing a disable checkbox (not submitted to server) + - # keep reference of checkbox id for easier labelling + - checkbox_id = "#{form.object_name}_week_ids_#{week.id}_checkbox" + - # also add an id for hidden field for two reason, avoid conflict, testing + - hidden_id = "#{form.object_name}_week_ids_#{week.id}_hidden" + - checked = week.id.in?(params[:week_ids].to_a.map(&:to_i)) + - options = { multiple: true, + id: checkbox_id, + data: {:"select-weeks-search-target" => 'weekCheckboxes', + action: 'change->select-weeks-search#handleOneCheckboxChange'} } + - options.merge!({checked: checked}) + + = form.check_box :week_ids, options, week.id + = form.label :"week_id", for: checkbox_id, class: "fr-label fr-text--sm fr-mb-1v" do + span class="dates-column #{week.in_the_past? ? 'text-grey-disabled' : ''}" + = week.human_shortest + hr.fr-mb-1v.fr-ml-n2w - if current_user.present? && ( (current_user.student? && current_user.troisieme_or_quatrieme?) || current_user.school_management? ) .col-12 .fr-notice.fr-notice--info diff --git a/db/seeds/6_populate_offers.rb b/db/seeds/6_populate_offers.rb index 4dab6934b..bc2caff0b 100644 --- a/db/seeds/6_populate_offers.rb +++ b/db/seeds/6_populate_offers.rb @@ -1,7 +1,8 @@ def populate_internship_offers current_school_year = SchoolYear::Current.new.beginning_of_period - weeks = SchoolTrack::Seconde.both_weeks - weeks += Week.selectable_from_now_until_end_of_school_year + seconde_weeks = SchoolTrack::Seconde.both_weeks + troisieme_weeks = Week.selectable_from_now_until_end_of_school_year + all_weeks = seconde_weeks + troisieme_weeks # TODO: period is ignored for InternshipOffers::WeeklyFramed # public sector # 1 @@ -14,7 +15,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_paqte.first, is_public: false, - title: 'Stage assistant.e ressources humaines - Service des recrutements', + title: '(all) Stage assistant.e ressources humaines - Service des recrutements', description: 'Vous assistez la responsable de secteur dans la gestion du recrutement des intervenant.e.s à domicile et la gestion des contrats de celles et ceux en contrat avec des particulier-employeurs.', employer_description: "Du Temps pour moi est une agence mandataire de garde d'enfants à domicile. Notre activité consister à aider les familles de la métropole lilloise à trouver leur intervenant(e) à domicile.", employer_website: 'http://www.dtpm.fr/', @@ -24,7 +25,7 @@ def populate_internship_offers coordinates: { latitude: Coordinates.tours[:latitude], longitude: Coordinates.tours[:longitude] }, employer_name: Group.is_paqte.first.name, internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, + weeks: all_weeks, grades: Grade.all, entreprise_full_address: '56 rue d\'Entraigues , Tours', lunch_break: "L'élève doit prévoir son repas de midi" @@ -40,7 +41,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_paqte.first, is_public: false, - title: 'Stage avec deux segments de date, bugfix', + title: '(all) Stage de métrologie - scanner', description: 'Scanner metrology est une entreprise unique en son genre'.truncate(249), employer_description: 'Scanner metrology a été fondée par le laureat Recherche et Company 2016'.truncate(249), employer_website: 'https://www.asml.com/en/careers', @@ -50,7 +51,7 @@ def populate_internship_offers coordinates: { latitude: Coordinates.verneuil[:latitude], longitude: Coordinates.verneuil[:longitude] }, employer_name: Group.is_paqte.first.name, internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, + weeks: all_weeks, grades: Grade.all, entreprise_full_address: '2 Allée de la Garenne, 78480 Verneuil-sur-Seine', lunch_break: "L'élève doit prévoir son repas de midi" @@ -66,7 +67,7 @@ def populate_internship_offers sector: Sector.second, group: Group.is_public.last, is_public: true, - title: 'Observation du métier de chef de service - Ministère', + title: '(all) Observation du métier de chef de service - Ministère', description: 'Découvrez les réunions et comment se prennent les décisions au plus haut niveau mais aussi tous les interlocuteurs de notre société qui intéragissent avec nos services ', employer_description: 'De multiples méthodes de travail et de prises de décisions seront observées', street: '18 rue Damiens', @@ -75,7 +76,7 @@ def populate_internship_offers coordinates: { latitude: Coordinates.paris[:latitude], longitude: Coordinates.paris[:longitude] }, employer_name: Group.is_public.last.name, internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: Week.selectable_from_now_until_end_of_school_year, + weeks: all_weeks.last(10), grades: Grade.all, entreprise_full_address: '18 rue Damiens, 75012 Paris', lunch_break: "L'élève doit prévoir son repas de midi" @@ -91,7 +92,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_private.first, is_public: false, - title: 'Stage assistant.e banque et assurance', + title: '(3e) Stage assistant.e banque et assurance', description: 'Vous assistez la responsable de secteur dans la gestion du recrutement des intervenant.e.s à domicile et la gestion des contrats de celles et ceux en contrat avec des particulier-employeurs.', employer_description: "Du Temps pour moi est une agence mandataire de garde d'enfants à domicile. Notre activité consister à aider les familles de la métropole lilloise à trouver leur intervenant(e) à domicile pour la garde de leurs enfants de 0 à 16 ans.", employer_website: 'http://www.dtpm.fr/', @@ -101,8 +102,8 @@ def populate_internship_offers coordinates: { latitude: 48.866667, longitude: 2.333333 }, employer_name: 'Du temps pour moi', internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: Week.selectable_from_now_until_end_of_school_year, - grades: Grade.all, + weeks:troisieme_weeks, + grades: [Grade.troisieme], entreprise_full_address: '128 rue brancion, 75015 paris', lunch_break: "L'élève doit prévoir son repas de midi" ) @@ -117,7 +118,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_private.first, is_public: false, - title: '(non publiée) Stage assistant.e banque et assurance', + title: '(2de) (non publiée) Stage assistant.e banque et assurance', description: 'Vous assistez la responsable de secteur dans la gestion du recrutement des intervenant.e.s à domicile et la gestion des contrats de celles et ceux en contrat avec des particulier-employeurs.', employer_description: "Du Temps pour moi est une agence mandataire de garde d'enfants à domicile. Notre activité consister à aider les familles de la métropole lilloise à trouver leur intervenant(e) à domicile pour la garde de leurs enfants de 0 à 16 ans.", employer_website: 'http://www.dtpm.fr/', @@ -128,8 +129,8 @@ def populate_internship_offers employer_name: 'Du temps pour moi', max_candidates: 7, internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, - grades: Grade.all, + weeks: seconde_weeks, + grades: [Grade.seconde], entreprise_full_address: '128 rue brancion, 75015 paris', lunch_break: "L'élève doit prévoir son repas de midi" ) @@ -143,7 +144,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_private.first, is_public: false, - title: 'Stage editeur - A la recherche du temps passé par les collaborateurs', + title: '(2de) Stage editeur - A la recherche du temps passé par les collaborateurs', description: 'Vous assistez la responsable de secteur dans la gestion des projets internes touchant à la gestion des contrats.', employer_description: "Du Temps pour moi est une agence mandataire de garde d'enfants à domicile. Notre activité consister à aider les familles de la métropole lilloise à trouver leur intervenant(e) à domicile pour la garde de leurs enfants de 0 à 16 ans.", employer_website: 'http://www.dtpm.fr/', @@ -153,8 +154,8 @@ def populate_internship_offers coordinates: { latitude: Coordinates.paris[:latitude], longitude: Coordinates.paris[:longitude] }, employer_name: 'Editegis', internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, - grades: Grade.all, + weeks: seconde_weeks, + grades: [Grade.seconde], entreprise_full_address: '129 rue brancion, 75015 paris', lunch_break: "L'élève doit prévoir son repas de midi" ) @@ -169,7 +170,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_private.first, is_public: false, - title: 'Observation du métier d\'enseignant de mathématique - Lycée Jean Moulin', + title: '(3e) Observation du métier d\'enseignant de mathématique - Lycée Jean Moulin', description: 'Vous assistez au cours de mathématiques de 2de générale du lycée Jean Moulin', employer_description: 'Le métier de professeur de mathématiques consiste à enseigner les mathématiques aux élèves de lycée. Il peut également enseigner dans le supérieur. Il peut être amené à participer à des projets pédagogiques et à encadrer des élèves.', street: '56 rue d\'Entraigues , Tours', @@ -178,8 +179,8 @@ def populate_internship_offers coordinates: { latitude: Coordinates.tours[:latitude], longitude: Coordinates.tours[:longitude] }, employer_name: 'Education Nationale', internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, - grades: Grade.all, + weeks: troisieme_weeks, + grades: [Grade.troisieme], entreprise_full_address: '56 rue d\'Entraigues , 37000 Tours', lunch_break: "L'élève doit prévoir son repas de midi" ) @@ -194,7 +195,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_private.first, is_public: false, - title: "API - Observation du métier d'Administrateur de systèmes informatiques - IBM SERVICES CENTER", + title: "2de - API - Observation du métier d'Administrateur de systèmes informatiques - IBM SERVICES CENTER", description: "Venez découvrir le métier d'administrateur systèmes ! Vous observerez comment nos administrateurs garantissent aux clients le bon fonctionnement etc.", employer_description: "Le centre de service IBM de Lille délivre des services d'infrastructure informatique.", street: '128 rue brancion', @@ -205,8 +206,8 @@ def populate_internship_offers coordinates: { latitude: Coordinates.paris[:latitude], longitude: Coordinates.paris[:longitude] }, employer_name: 'IBM', internship_offer_area_id: area_id, - weeks: Week.selectable_from_now_until_end_of_school_year, - grades: Grade.all, + weeks: seconde_weeks, + grades: [Grade.seconde], entreprise_full_address: '128 rue brancion, 75015 paris', lunch_break: "L'élève doit prévoir son repas de midi" ) @@ -221,7 +222,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_public.first, is_public: false, - title: "Découverte des métiers administratifs de l'Education nationale", + title: "(all) Découverte des métiers administratifs de l'Education nationale", description: "La Direction des Services de l'Education Nationale de Seine-et-Marne (DSDEN) se compose de plusieurs services répartis sur 11 étages. Ses 240 agents ...", employer_description: "Le centre de service IBM de Lille délivre des services d'infrastructure informatique.", tutor_name: 'Martin Fourcade', @@ -236,7 +237,7 @@ def populate_internship_offers coordinates: { latitude: 48.866667, longitude: 2.333333 }, employer_name: 'Ministère de l\'Education Nationale', internship_offer_area_id: area_id, - weeks: Week.selectable_from_now_until_end_of_school_year, + weeks: all_weeks, grades: Grade.all, entreprise_full_address: '128 rue brancion, 75015 paris', lunch_break: "L'élève doit prévoir son repas de midi" @@ -252,7 +253,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_private.first, is_public: false, - title: 'Découverte des services douaniers de Valenciennes', + title: '(all) Découverte des services douaniers de Valenciennes', description: description, employer_description: 'La douane assure des missions fiscales et de lutte contre les trafics illicites et la criminalité organisée.', employer_website: 'http://www.prefectures-regions.gouv.fr/hauts-de-france/Region-et-institutions/Organisation-administrative-de-la-region/Les-services-de-l-Etat-en-region/Direction-interregionale-des-douanes/Direction-interregionale-des-douanes', @@ -262,7 +263,7 @@ def populate_internship_offers coordinates: { latitude: Coordinates.montmorency[:latitude], longitude: Coordinates.montmorency[:longitude] }, employer_name: 'Douanes Assistance Corp.', internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, + weeks: all_weeks, grades: Grade.all, entreprise_full_address: '2 rue jean moulin, 95160 Montmorency', lunch_break: "L'élève doit prévoir son repas de midi" @@ -278,7 +279,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_private.first, is_public: false, - title: 'Découverte du travail de gestionnaire en ligne', + title: '(3e) Découverte du travail de gestionnaire en ligne', description: description, employer_description: 'Le métier de gestionnaire consiste à optimiser les ressources de la MetaBoutShop en spéculant sur des valeurs mobilières', street: '2 Allée de la Garenne', @@ -287,8 +288,8 @@ def populate_internship_offers coordinates: { latitude: Coordinates.verneuil[:latitude], longitude: Coordinates.verneuil[:longitude] }, employer_name: 'MetaBoutShop', internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, - grades: Grade.all, + weeks: troisieme_weeks, + grades: [Grade.troisieme], entreprise_full_address: '2 Allée de la Garenne, 78480 Verneuil-sur-Seine', lunch_break: "L'élève doit prévoir son repas de midi" ) @@ -318,7 +319,7 @@ def populate_internship_offers group: Group.is_private.first, is_public: false, school_year: 2023, - title: 'Découverte du travail de trader', + title: '(3e) Découverte du travail de trader', description: description, employer_description: 'Le métier de trader consiste à optimiser les ressources de la banque Oyonnax Corp. en spéculant sur des valeurs mobilières', tutor_name: 'Martin Fourcade', @@ -331,8 +332,8 @@ def populate_internship_offers coordinates: { latitude: Coordinates.paris[:latitude], longitude: Coordinates.paris[:longitude] }, employer_name: 'Oyonnax Corp.', internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: weeks, - grades: Grade.all, + weeks: troisieme_weeks, + grades: [Grade.troisieme], entreprise_full_address: '128 rue brancion, 75015 paris', lunch_break: "L'élève doit prévoir son repas de midi" ) @@ -347,7 +348,7 @@ def populate_internship_offers sector: Sector.fourth, group: Group.is_paqte.second, is_public: false, - title: 'Stage concessionnaire automobile', + title: '(2de) Stage concessionnaire automobile', description: "Vous assistez la responsable de la concession automobile, aux ventes de véhicules, et observez les manipulations nécessaires pour la logistique et l'approvisionnement des véhicules.", employer_description: 'Un concessionnaire offre un service de qualité et, pour ses clients, la fierté de posséder un véhicule de qualité.', employer_website: 'http://www.dtpm.fr/', @@ -357,13 +358,14 @@ def populate_internship_offers coordinates: { latitude: Coordinates.bordeaux[:latitude], longitude: Coordinates.bordeaux[:longitude] }, employer_name: Group.is_paqte.second.name, internship_offer_area_id: Users::Employer.first.internship_offer_areas.first.id, - weeks: Week.selectable_from_now_until_end_of_school_year, - grades: Grade.all, + weeks: seconde_weeks, + grades: [Grade.seconde], entreprise_full_address: '30 rue Jean Soula, 33000 Bordeaux', lunch_break: "L'élève doit prévoir son repas de midi" ) # 13 + current_year = SchoolTrack::Seconde.current_year.to_i former_year = current_year - 1 weeks = SchoolTrack::Seconde.both_weeks(year: former_year) InternshipOffers::WeeklyFramed.create!( @@ -375,7 +377,7 @@ def populate_internship_offers sector: Sector.second, group: nil, is_public: false, - title: 'Stage cordonnerie', + title: '(2de) Stage cordonnerie', description: "Vous observez le métier et la gestion de la clientèle d'une cordonnnerie.", employer_description: 'Un artisan fier de son métier.', employer_website: nil, @@ -388,7 +390,7 @@ def populate_internship_offers weeks: weeks, lunch_break: "L'élève doit prévoir son repas de midi", entreprise_full_address: '12, rue de la Serpe, 37000 Tours', - grades: Grade.all + grades: [Grade.seconde] ) # 14 @@ -400,7 +402,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_public.first, is_public: false, - title: "Découverte des métiers administratifs de l'Education nationale", + title: "(3e) Découverte des métiers administratifs de l'Education nationale", description: "La Direction des Services de l'Education Nationale de Seine-et-Marne (DSDEN) se compose de plusieurs services répartis sur 11 étages. Ses 240 agents ...", employer_description: "Le centre de service IBM de Lille délivre des services d'infrastructure informatique.", street: '128 rue brancion', @@ -411,14 +413,13 @@ def populate_internship_offers coordinates: { latitude: 48.866667, longitude: 2.333333 }, employer_name: 'Ministère de l\'Education Nationale', internship_offer_area_id: area_id, - weeks: Week.selectable_from_now_until_end_of_school_year, + weeks: troisieme_weeks, lunch_break: "L'élève doit prévoir son repas de midi", - grades: Grade.all + grades: [Grade.troisieme] ) # 15 older school year - current_year = SchoolTrack::Seconde.current_year - former_year = current_year - 1 + weeks = SchoolTrack::Seconde.both_weeks(year: former_year) weeks += Week.of_previous_school_year InternshipOffers::Api.create!( @@ -428,7 +429,7 @@ def populate_internship_offers sector: Sector.first, group: Group.is_public.first, is_public: false, - title: "2023 : Découverte des métiers administratifs de l'Education nationale", + title: "(all) 2023 : Découverte des métiers administratifs de l'Education nationale ", description: "La Direction des Services de l'Education Nationale de Seine-et-Marne (DSDEN) se compose de plusieurs services répartis sur 11 étages. Ses 240 agents ...", employer_description: "Le centre de service IBM de Lille délivre des services d'infrastructure informatique.", street: '128 rue brancion', diff --git a/test/system/internship_offer_index_test.rb b/test/system/internship_offer_index_test.rb index 4f03904dc..3770aacaf 100644 --- a/test/system/internship_offer_index_test.rb +++ b/test/system/internship_offer_index_test.rb @@ -73,18 +73,17 @@ def assert_absence_of(internship_offer:) test 'search by grade works for visitors' do travel_to Date.new(2024, 9, 1) do - seconde_weeks = SchoolTrack::Seconde.both_weeks - internship_offer = create(:weekly_internship_offer_2nde, weeks: seconde_weeks) - visit internship_offers_path - Grade.all.each do |grade| - select grade.name, from: 'Filière' + 5.times do + create(:weekly_internship_offer_2nde, weeks: SchoolTrack::Seconde.both_weeks, city: 'Paris') end + internship_offer = create(:weekly_internship_offer_2nde, weeks: SchoolTrack::Seconde.both_weeks, city: 'Bordeaux') + visit internship_offers_path select 'troisieme générale', from: 'Filière' click_button 'Rechercher' assert_no_selector('.test-city', text: internship_offer.city) - select 'seconde générale', from: 'Filière' + select 'seconde générale et technologique', from: 'Filière' click_button 'Rechercher' - assert_selector('.test-city', text: internship_offer.city) + find('.test-city', text: 'Bordeaux') end end test 'search by grade works for students' do