From 60ea5258724a2124ef3657e85a60877806f5469e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Maniaci?= Date: Tue, 11 Feb 2025 15:42:33 +0100 Subject: [PATCH 1/4] content: delete the templates Since people don't edit their stuff directly on GitHub anymore we can remove the templates associated with creating them. --- _config.yml | 1 - content/templates/authors.md | 24 ----------------------- content/templates/incubators.md | 10 ---------- content/templates/jobs.md | 13 ------------- content/templates/page.md | 14 -------------- content/templates/startups.md | 34 --------------------------------- trampoline.html | 23 ---------------------- 7 files changed, 119 deletions(-) delete mode 100644 content/templates/authors.md delete mode 100644 content/templates/incubators.md delete mode 100644 content/templates/jobs.md delete mode 100644 content/templates/page.md delete mode 100644 content/templates/startups.md delete mode 100644 trampoline.html diff --git a/_config.yml b/_config.yml index cdaded074079..eff79402024b 100644 --- a/_config.yml +++ b/_config.yml @@ -37,7 +37,6 @@ include: [ ".well-known" ] exclude: [ - "content/templates", "README.md", "CONTRIBUTING.md", "lib", diff --git a/content/templates/authors.md b/content/templates/authors.md deleted file mode 100644 index 71c6ad69c369..000000000000 --- a/content/templates/authors.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -fullname: Camille Dupont # penser à modifier le nom du fichier ci-dessus en prenom.nom.md ! -role: Smartass # Développeuse / Développeur / Intrapreneuse / Intrapreneur / Coach / Chargée de développement / Chargé de développement... -github: pseudo_github # optionnel : nom d'utilisateur GitHub, permet d'être ajouté automatiquement à l'organisation GitHub betagouv -avatar: # optionnel, voir ci-dessous -# En premier, on va regarder si tu as mis une image au format prenom.nom dans /img/authors/ -# Sinon, on utilisera le lien externe du champs avatar -# Si tu laisse ce champs vide, alors on regardera si tu as une image sur GitHub -# Enfin, si aucune image n'est trouvée, alors la fiole beta.gouv.fr sera utilisée sur la page communauté -link: # optionnel : lien vers une page perso externe. -missions: # ton historique de missions avec nous dans l'ordre chronologique. Remplis déjà la première pour commencer ! - - start: 2019-01-01 # date d'arrivée au format ISO (AAAA-MM-JJ) - end: 2019-12-31 # date de fin de contrat au format ISO (AAAA-MM-JJ) - status: - employer: # si applicable, le nom de ton administration, SSII, etc. -startups: # ta ou tes startups actuelles - - super_startup # le nom du fichier de la startup dans le répertoire /content/_startups/ sans l'extension .md -#previously: # enleve le commentaire '#' de la première ligne pour indiquer ta ou tes anciennes startups -# - ancienne_super_startup # le nom du fichier de la startup dans le répertoire /content/_startups/ sans l'extension .md -#badges: # enleve le commentaire '#' pour indiquer que tu as demandé un badge -# - segur # Pour Ségur, si tu penses venir 1 fois par semaine ---- - -Écrit des autobiographies percutantes en moins de 200 caractères depuis 1972. diff --git a/content/templates/incubators.md b/content/templates/incubators.md deleted file mode 100644 index acfbc7daf2fd..000000000000 --- a/content/templates/incubators.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: # nom de l'incubateur -owner: # porteur de l'incubateur -website: # URL du site de l'incubateur -github: # URL de l'organisation GitHub de l'incubateur -contact: # adresse de contact -address: # adresse postale ---- - -Description de l'incubateur. diff --git a/content/templates/jobs.md b/content/templates/jobs.md deleted file mode 100644 index 9d279ca072d8..000000000000 --- a/content/templates/jobs.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -roles: intitulé du/des poste/s # un développeuse ou un développeur, un ou une bizdev, un ou une coach et un développeur ou une développeuse, etc. -startup: identifiant de la startup # identifiant de la startup pour laquelle le recrutement est fait ; créer la startup si elle n'existe pas encore -techno: Choix libre # s'il s'agit d'une offre dev, ajouter la techno ou expliciter que le choix est libre ; enlever s'il s'agit d'un autre type d'offre -junior: true # S'il est possible de candidater avec peu d'expérience -open: true # Basculer à 'false' ou supprimer une fois l'offre pourvue -title: titre # Permet d'avoir un titre spécifique pour la page de cette offre ---- - -Écrire ici le descriptif du poste. Dans la cadre de la double labellisation égalité diversité, pensez à vérifier la féminisation des adjectifs et des intitulés de poste (candidat ou candidate, chef ou cheffe, directeur ou directrice). - -**Pensez à modifier le nom de ce fichier : il doit être au format `AAAA-MM-DD-nom_offre.md` !** -Où `AAAA-MM-DD` est la date à laquelle vous souhaitez que l'offre soit publiée. diff --git a/content/templates/page.md b/content/templates/page.md deleted file mode 100644 index 7f3ac9f5281d..000000000000 --- a/content/templates/page.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: page -permalink: /page/ -title: Titre de page ---- - -## Introduction -Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. - -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. - -Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - -Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. diff --git a/content/templates/startups.md b/content/templates/startups.md deleted file mode 100644 index 62f0d9663083..000000000000 --- a/content/templates/startups.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Mes Aides # une majuscule et pas d'acronymes -mission: Accéder aux conseils de professionnels à proximité pour trouver un logement # infinitif, pas de point ; compléter la phrase « En investissant dans ce produit l'État cherche à… » -sponsors: - - /organisations/dinum # Liste des administrations sponsors, les valeurs possibles sont définies dans /content/_organisations/ -incubator: dinum # le nom du fichier de l'incubateur de la startup -phases: # les différentes étapes de la vie des startups - les phases possibles sont définies dans /content/_phases/ - - name: investigation - start: 2020-03-16 # date au format ISO (AAAA-MM-DD) -events: # les évènements marquants de la startup - les noms possibles sont définies dans /content/_events/ - - name: committee - date: 2020-03-16 # date au format ISO (AAAA-MM-DD) - comment: Premier comité de financement # Informations complémentaires -link: https://mes-aides.gouv.fr -repository: https://github.com/betagouv/mes-aides-ui # ou page de description des dépôts s'il y en a plusieurs -stats: false # mettre à true pour renvoyer vers ta page de stats. Attention, elle doit se trouver sur [url du site]/stats ! -stats_url: # optionnel, si stats est à true, alors tu peux indiquer vers quelle URL pointer vers tes stats. -contact: contact@mes-aides.gouv.fr # sera visible de tous ---- - -## Fiche produit - -Texte libre au format [Markdown](http://ricostacruz.com/cheatsheets/markdown.html). - - -## Rappels - -- [ ] Supprimer les commentaires dans le front-matter : supprimer les croisillons et le texte qui les suit dans la partie entre tirets -- [ ] Modifier le nom du fichier `nom-startup.md` dans le champ ci-dessus (attention à bien inclure l'extension `.md`) -- [ ] Assurez-vous que le fichier est bien dans le dossier `/content/_startups/` -- [ ] Screenshot : ajouter une image en 1280x720px dans /img/startups/$nom-startup.png (ou .jpg) -- [ ] Créer une nouvelle branche pour l'ajout de ce fichier, et la nommer du même nom que le fichier `nom-startup`. -- [ ] Ouvrir une pull request pour valider l'intégration. -- [ ] Effacer ce texte une fois que vous l'avez lu 😉 diff --git a/trampoline.html b/trampoline.html deleted file mode 100644 index a1fd2ff1dae7..000000000000 --- a/trampoline.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -layout: null ---- - - - Trampoline - - - - - From 3539ed53139af3ea3dc30e44d98378b78b9937a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Maniaci?= Date: Wed, 19 Feb 2025 14:56:05 +0100 Subject: [PATCH 2/4] startups: fix the startup's phase inclusion --- _layouts/startups.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/startups.html b/_layouts/startups.html index ce123d7d8570..bdeb64749da3 100644 --- a/_layouts/startups.html +++ b/_layouts/startups.html @@ -14,7 +14,7 @@ {% assign incubator = incubators | where:'id', incubator_id | first %} { "id" : "{{ startup.id | remove: '/startups/' }}" , "type" : "startup" - , "phase": "{{ status }}" + , "phase": "{{ phase.status }}" , "incubator_id" : "{{startup.incubator}}" , "incubator_title": "{{ incubator.title }}" , "sponsors": [{% for sponsorId in startup.sponsors %} From 9fdc5770b0e335a45dced819da0a3a1c41c3bf1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Maniaci?= Date: Wed, 19 Feb 2025 15:12:49 +0100 Subject: [PATCH 3/4] startups: allow filtering out investigations Closes #21046. --- _includes/startups-filters.html | 7 +++ _layouts/startups.html | 5 ++ assets/additional/js/search-startup.js | 73 ++++++++++++++------------ 3 files changed, 51 insertions(+), 34 deletions(-) diff --git a/_includes/startups-filters.html b/_includes/startups-filters.html index fe718d0b039b..ea3da57d96b5 100644 --- a/_includes/startups-filters.html +++ b/_includes/startups-filters.html @@ -37,4 +37,11 @@

Ces services sont déployés à l'ensemble du territoire national et ont atteint un seuil d'impact significatif.

+
+
+ + +

Les investigations sont des services numériques en devenir. À ce stade, l'équipe est souvent réduite.

+
+
diff --git a/_layouts/startups.html b/_layouts/startups.html index bdeb64749da3..da4dc5f9339d 100644 --- a/_layouts/startups.html +++ b/_layouts/startups.html @@ -192,4 +192,9 @@

{{ counter }} { document.querySelectorAll(".select-impact").forEach((selectElement) => { createNationalImpactSelect(selectElement, data, nationalImpactValue); }); + + filters.excludeInvestigations = urlParams.get("exclude-investigations") == "true"; + + setupExcludeInvestigations(); + diff --git a/assets/additional/js/search-startup.js b/assets/additional/js/search-startup.js index 1a972e4e8968..acdf6ca89d6e 100644 --- a/assets/additional/js/search-startup.js +++ b/assets/additional/js/search-startup.js @@ -116,9 +116,15 @@ const filterCards = (startups) => { ) .filter((startup) => filters.is_national_impact ? startupHasNationalImpact(startup) : true, + ) + .filter((startup) => + filters.excludeInvestigations ? startupIsNotInvestigation(startup) : true, ); }; +const startupIsNotInvestigation = (startup) => + startup.phase !== "investigation"; + const startupHasNationalImpact = (startup) => startup.events.find((event) => event.name === "national_impact"); @@ -238,16 +244,10 @@ const createIncubatorSelect = (selectElement, data, incubators, initValue) => { selectElement.value = initValue; onIncubatorChange(initValue); } - selectElement.addEventListener("change", (e) => { - const value = e.target.value; + selectElement.addEventListener("change", ({ target: { value } }) => { onIncubatorChange(value); - const urlParams = new URLSearchParams(window.location.search); - urlParams.set("incubateur", value); - history.replaceState( - null, - null, - `${window.location.origin + window.location.pathname}?${urlParams}`, - ); + + setLocationParam("incubateur", value); }); }; @@ -274,13 +274,8 @@ const createUsertypesSelect = (selectElement, data, initValue) => { selectElement.addEventListener("change", (e) => { const value = e.target.value; onUsertypesChange(value); - const urlParams = new URLSearchParams(window.location.search); - urlParams.set("usertypes", value); - history.replaceState( - null, - null, - `${window.location.origin + window.location.pathname}?${urlParams}`, - ); + + setLocationParam("usertypes", value); }); }; @@ -303,16 +298,10 @@ const createThematiquesSelect = (selectElement, data, initValue) => { selectElement.value = initValue; onThematiquesChange(initValue); } - selectElement.addEventListener("change", (e) => { - const value = e.target.value; + selectElement.addEventListener("change", ({ target: { value } }) => { onThematiquesChange(value); - const urlParams = new URLSearchParams(window.location.search); - urlParams.set("thematiques", value); - history.replaceState( - null, - null, - `${window.location.origin + window.location.pathname}?${urlParams}`, - ); + + setLocationParam("thematiques", value); }); }; @@ -327,15 +316,31 @@ const createNationalImpactSelect = (selectElement, data, initValue) => { }, 1000); onNationalImpactChange(true); } - selectElement.addEventListener("change", (e) => { - const value = selectElement.checked; + selectElement.addEventListener("change", ({ target: { value } }) => { onNationalImpactChange(value); - const urlParams = new URLSearchParams(window.location.search); - urlParams.set("national_impact", value); - history.replaceState( - null, - null, - `${window.location.origin + window.location.pathname}?${urlParams}`, - ); + + setLocationParam("national_impact", value); }); }; + +function setLocationParam(param, value) { + const url = new URL(window.location); + + url.searchParams.set(param, value); + + history.replaceState(null, null, url); +} + +function setupExcludeInvestigations() { + const toggle = document.getElementById("exclude-investigations-toggle"); + + toggle.checked = filters.excludeInvestigations; + + toggle.addEventListener("change", ({ target: { checked: value } }) => { + filters.excludeInvestigations = value; + + setLocationParam("exclude-investigations", value); + + updateCards(data); + }); +} From d826cf2b2fb44484a4069d3b1c275ef66d1f8202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Maniaci?= Date: Thu, 20 Feb 2025 12:23:49 +0100 Subject: [PATCH 4/4] startups: refactor the serious noodling going on with filters factor out the common things: changing the URL params, setting the filters (which we now set direclty instead of throwing some `initValue`s around), showing the right select value and updating the cards. --- _layouts/startups.html | 32 ++++--- assets/additional/js/search-startup.js | 128 ++++++++++--------------- 2 files changed, 70 insertions(+), 90 deletions(-) diff --git a/_layouts/startups.html b/_layouts/startups.html index da4dc5f9339d..14c744c28ce1 100644 --- a/_layouts/startups.html +++ b/_layouts/startups.html @@ -171,30 +171,34 @@

{{ counter }} { diff --git a/assets/additional/js/search-startup.js b/assets/additional/js/search-startup.js index acdf6ca89d6e..24409971f3c8 100644 --- a/assets/additional/js/search-startup.js +++ b/assets/additional/js/search-startup.js @@ -36,7 +36,13 @@ const THEMATIQUES = [ "Travail / Emploi", ]; -const filters = []; +function setLocationParam(param, value) { + const url = new URL(window.location); + + url.searchParams.set(param, value); + + history.replaceState(null, null, url); +} const createStartupCard = (startup) => { const card = document.createElement("div"); @@ -216,70 +222,62 @@ const updateCards = (data) => { } }; -const createIncubatorSelect = (selectElement, data, incubators, initValue) => { +const createIncubatorSelect = (selectElement, data, incubators) => { const optionFragment = document.createDocumentFragment(); - for (let i = 0; i < incubators.length; i++) { - const incubator = incubators[i]; + + for (const incubator of incubators) { const option = document.createElement("option"); option.innerText = incubator.title; option.value = incubator.id; optionFragment.appendChild(option); } + selectElement.appendChild(optionFragment); + const onIncubatorChange = (value) => { filters.incubator = value; - const incubatorElements = - document.getElementsByClassName("incubator-header"); - for (let i = 0; i < incubatorElements.length; i++) { - const incubatorElement = incubatorElements[i]; + + for (const incubatorElement of document.getElementsByClassName( + "incubator-header", + )) { if (incubatorElement.id !== value) { incubatorElement.style.display = "none"; } else { incubatorElement.style.display = "block"; } } + updateCards(data); }; - if (initValue) { - selectElement.value = initValue; - onIncubatorChange(initValue); - } - selectElement.addEventListener("change", ({ target: { value } }) => { - onIncubatorChange(value); - setLocationParam("incubateur", value); - }); + if (filters.incubator) selectElement.value = filters.incubator; + + selectElement.addEventListener("change", ({ target: { value } }) => + updateFilters("incubator", "incubateur", value), + ); }; -const createUsertypesSelect = (selectElement, data, initValue) => { +const createUsertypesSelect = (selectElement, data) => { const optionFragment = document.createDocumentFragment(); const usertypes = Object.keys(USERTYPES); - for (let i = 0; i < usertypes.length; i++) { - const usertypeKey = usertypes[i]; - const usertypeLabel = USERTYPES[usertypeKey]; + + for (const [value, label] of Object.entries(USERTYPES)) { const option = document.createElement("option"); - option.innerText = usertypeLabel; - option.value = usertypeKey; + option.innerText = label; + option.value = value; optionFragment.appendChild(option); } + selectElement.appendChild(optionFragment); - const onUsertypesChange = (value) => { - filters.usertypes = value; - updateCards(data); - }; - if (initValue) { - selectElement.value = initValue; - onUsertypesChange(initValue); - } - selectElement.addEventListener("change", (e) => { - const value = e.target.value; - onUsertypesChange(value); - setLocationParam("usertypes", value); - }); + if (filters.usertypes) selectElement.value = filters.usertypes; + + selectElement.addEventListener("change", ({ target: { value } }) => + updateFilters("usertypes", "usertypes", value), + ); }; -const createThematiquesSelect = (selectElement, data, initValue) => { +const createThematiquesSelect = (selectElement, data) => { const optionFragment = document.createDocumentFragment(); for (const thematique of THEMATIQUES) { const option = document.createElement("option"); @@ -290,57 +288,35 @@ const createThematiquesSelect = (selectElement, data, initValue) => { selectElement.appendChild(optionFragment); - const onThematiquesChange = (value) => { - filters.thematiques = value; - updateCards(data); - }; - if (initValue) { - selectElement.value = initValue; - onThematiquesChange(initValue); - } - selectElement.addEventListener("change", ({ target: { value } }) => { - onThematiquesChange(value); + if (filters.thematiques) selectElement.value = filters.thematiques; - setLocationParam("thematiques", value); - }); + selectElement.addEventListener("change", ({ target: { value } }) => + updateFilters("thematiques", "thematiques", value), + ); }; -const createNationalImpactSelect = (selectElement, data, initValue) => { - const onNationalImpactChange = (value) => { - filters.is_national_impact = value; - updateCards(data); - }; - if (initValue === "true") { - setTimeout(() => { - selectElement.checked = true; - }, 1000); - onNationalImpactChange(true); - } - selectElement.addEventListener("change", ({ target: { value } }) => { - onNationalImpactChange(value); +const createNationalImpactSelect = (selectElement, data) => { + selectElement.checked = filters.is_national_impact; - setLocationParam("national_impact", value); - }); + selectElement.addEventListener("change", ({ target: { checked: value } }) => + updateFilters("is_national_impact", "national_impact", value), + ); }; -function setLocationParam(param, value) { - const url = new URL(window.location); - - url.searchParams.set(param, value); - - history.replaceState(null, null, url); -} - function setupExcludeInvestigations() { const toggle = document.getElementById("exclude-investigations-toggle"); toggle.checked = filters.excludeInvestigations; - toggle.addEventListener("change", ({ target: { checked: value } }) => { - filters.excludeInvestigations = value; + toggle.addEventListener("change", ({ target: { checked: value } }) => + updateFilters("excludeInvestigations", "exclude-investigations", value), + ); +} + +function updateFilters(filterName, paramName, value) { + filters[filterName] = value; - setLocationParam("exclude-investigations", value); + setLocationParam(paramName, value); - updateCards(data); - }); + updateCards(data); }