Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Amélioration de la recherche par texte sur le tableau de suivi #103

Merged
merged 26 commits into from
Nov 5, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
2e45c5c
Amélioration de la recherche par texte sur le tableau de suivi
Ynote Oct 15, 2024
8216db3
Fix sur lindexation
Ynote Oct 15, 2024
c174f01
Créer une seule fois lindexation des dossiers
Ynote Oct 15, 2024
845f907
Merge branch 'main' of github.com:betagouv/pitchou into amelioration-…
Ynote Oct 15, 2024
857539f
Gère la recherche par numéro de dossier DS
Ynote Oct 15, 2024
56d38e4
Gestion des accents dans les mots à chercher
Ynote Oct 15, 2024
282313e
Merge branch 'main' of github.com:betagouv/pitchou into amelioration-…
Ynote Oct 29, 2024
27c0f92
Retire test sur le type inutile
Ynote Oct 29, 2024
42488a7
Ajoute un type sur le retour de la fonction créerDossierIndexable
Ynote Oct 29, 2024
dd2ed70
Ajoute les communes dans la recherche et gère la recherche par nombres
Ynote Oct 29, 2024
b9dd269
Retire filtre inutile nombresEnTexte
Ynote Oct 31, 2024
4b879af
Filtrer uniquement les communes via le code postal
Ynote Oct 31, 2024
6cc9934
Cherche également dans l'id dans la recherche par nombre
Ynote Oct 31, 2024
49955ee
Retire les boosts
Ynote Oct 31, 2024
1f753c9
Ajoute lactivité principale et le numero onagre dans lindex
Ynote Oct 31, 2024
c3d6165
Rechercher un dossier dans le numero ONAGRE
Ynote Oct 31, 2024
68e8aa1
Mini-cache pour les resultats de recherche
Ynote Oct 31, 2024
3c04c8c
Restreint la recherche pour les ids, numero onagre et numero DS
Ynote Nov 4, 2024
26d3a2e
Meilleure gestion de la recherche par texte
Ynote Nov 4, 2024
5d89a1a
Utiliser une seule barre de recherche toujours visible
Ynote Nov 4, 2024
52fecfa
Mini ajustements css
Ynote Nov 4, 2024
d2aff78
Retire code inutile
Ynote Nov 4, 2024
24f3b3b
Change la regexp pour la recherche par nombre
Ynote Nov 4, 2024
825a1a3
Simplifie la regexp pour matcher les communes
Ynote Nov 5, 2024
4cb708f
Retirer lidentifiant ONAGRE de lindexation des dossiers pour la reche…
Ynote Nov 5, 2024
0d1b46b
Retirer valeur réactive inutile
Ynote Nov 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-terser": "^0.4.4",
"@types/d3-fetch": "^3.0.7",
"@types/lunr": "^2.3.7",
"@types/minimist": "^1.2.5",
"@types/node": "^22.3.0",
"@types/page": "^1.11.9",
Expand Down Expand Up @@ -54,6 +55,8 @@
"fastify": "^4.26.2",
"knex": "^3.1.0",
"ky": "^1.7.2",
"lunr": "^2.3.9",
"lunr-languages": "^1.14.0",
"minimist": "^1.2.8",
"ods-xlsx": "github:DavidBruant/ods-xlsx#v0.8.0",
"page": "^1.11.6",
Expand Down
12 changes: 11 additions & 1 deletion scripts/commun/manipulationStrings.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,14 @@ export function normalizeTexteEspèce(texte){
.replace(/[\u0300-\u036f]/g, '') // remove accents
.replaceAll("’", "'")
.toLowerCase()
}
}

/**
*
* @param {string} texte
* @returns {string}
*/
export function retirerAccents(texte) {
return texte.normalize("NFD").replace(/[\u0300-\u036f]/g, "")
}

48 changes: 34 additions & 14 deletions scripts/front-end/components/screens/SuiviInstruction.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import FiltreParmiOptions from '../FiltreParmiOptions.svelte'
import FiltreTexte from '../FiltreTexte.svelte'
import {formatLocalisation, formatDéposant, phases, prochaineActionAttenduePar} from '../../affichageDossier.js'
import {contientTexteDansDossier, créerIndexDossiers} from '../../rechercherDansDossier.js'
import {retirerAccents} from '../../../commun/manipulationStrings.js'

/** @import {DossierComplet, DossierPhase, DossierProchaineActionAttenduePar} from '../../../types.js' */
/** @import {PitchouState} from '../../store.js' */
Expand Down Expand Up @@ -38,7 +40,7 @@
$: dossiersSelectionnés = dossiers
//$: console.log('dossiersSelectionnés', dossiersSelectionnés)

/** @type {Map<'département' | 'commune' | 'phase' | 'prochaine action attendue de' | 'texte' | 'suivis' | 'instructeurs', (d: DossierComplet) => boolean>}*/
/** @type {Map<'département' | 'commune' | 'phase' | 'prochaine action attendue de' | 'texte' | 'nombresEnTexte' | 'suivis' | 'instructeurs', (d: DossierComplet) => boolean>}*/
Ynote marked this conversation as resolved.
Show resolved Hide resolved
const tousLesFiltres = new Map()

function filtrerDossiers(){
Expand Down Expand Up @@ -168,24 +170,41 @@
}

$: texteÀChercher = ''
const dossiersIndex = créerIndexDossiers(dossiers)
Ynote marked this conversation as resolved.
Show resolved Hide resolved

/**
* @param {{detail: string}} _
*/
function filtrerParTexte({detail: _texteÀChercher}){
tousLesFiltres.set('texte', dossier => {
return Boolean(
dossier.commentaire_enjeu && dossier.commentaire_enjeu.includes(_texteÀChercher) ||
dossier.commentaire_libre && dossier.commentaire_libre.includes(_texteÀChercher) ||
dossier.demandeur_personne_morale_raison_sociale && dossier.demandeur_personne_morale_raison_sociale.includes(_texteÀChercher) ||
dossier.demandeur_personne_physique_nom && dossier.demandeur_personne_physique_nom.includes(_texteÀChercher) ||
dossier.demandeur_personne_physique_prénoms && dossier.demandeur_personne_physique_prénoms.includes(_texteÀChercher) ||
dossier.number_demarches_simplifiées && dossier.number_demarches_simplifiées.includes(_texteÀChercher) ||
String(dossier.id || '').includes(_texteÀChercher) ||
dossier.nom && dossier.nom.includes(_texteÀChercher) ||
dossier.nom_dossier && dossier.nom_dossier.includes(_texteÀChercher)
)
})
// cf. https://github.com/MihaiValentin/lunr-languages/issues/66
// lunr.fr n'indexe pas les chiffres. On gère donc la recherche sur
// les nombres avec une fonction séparée.
if (_texteÀChercher.match(/\d+/)) {
Ynote marked this conversation as resolved.
Show resolved Hide resolved
tousLesFiltres.set('nombresEnTexte', dossier => {
const {départements, communes, number_demarches_simplifiées} = dossier
const communesCodes = communes?.map(({code, postalCode}) =>
[code, postalCode]
Ynote marked this conversation as resolved.
Show resolved Hide resolved
).flat().filter(c => c) || []

return départements?.includes(_texteÀChercher) ||
DavidBruant marked this conversation as resolved.
Show resolved Hide resolved
communesCodes?.includes(_texteÀChercher) ||
number_demarches_simplifiées?.includes(_texteÀChercher)
Ynote marked this conversation as resolved.
Show resolved Hide resolved
})
} else {
tousLesFiltres.set('texte', dossier => {
const texteSansAccents = retirerAccents(_texteÀChercher)
// Pour chercher les communes qui contiennent des tirets avec lunr,
// on a besoin de passer la chaîne de caractères entre "".
const aRechercher = texteSansAccents.match(/(\w+-)+/) ?
`"${texteSansAccents}"` :
texteSansAccents
return contientTexteDansDossier(
aRechercher,
dossier,
dossiersIndex,
)
Ynote marked this conversation as resolved.
Show resolved Hide resolved
})
Ynote marked this conversation as resolved.
Show resolved Hide resolved
}

texteÀChercher = _texteÀChercher;

Expand All @@ -200,6 +219,7 @@
e.preventDefault()

tousLesFiltres.delete('texte')
tousLesFiltres.delete('nombresEnTexte')

texteÀChercher = ''
filtrerDossiers()
Expand Down
107 changes: 107 additions & 0 deletions scripts/front-end/rechercherDansDossier.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import lunr from "lunr"
import stemmerSupport from "lunr-languages/lunr.stemmer.support"
import lunrfr from "lunr-languages/lunr.fr"

import { retirerAccents } from "../commun/manipulationStrings.js"

/** @import {DossierComplet, StringValues} from "../types.js" */

stemmerSupport(lunr)
lunrfr(lunr)

/**
* @param {DossierComplet} dossier
DavidBruant marked this conversation as resolved.
Show resolved Hide resolved
* @returns {StringValues<Partial<DossierComplet>>}
*/
const créerDossierIndexable = dossier => {
const {
id,
nom_dossier,
number_demarches_simplifiées,
communes,
nom,
déposant_nom,
déposant_prénoms,
demandeur_personne_physique_prénoms,
demandeur_personne_physique_nom,
demandeur_personne_morale_raison_sociale,
commentaire_libre,
commentaire_enjeu,
} = dossier

return {
id: id.toString(),
number_demarches_simplifiées: number_demarches_simplifiées?.toString(),
nom_dossier: retirerAccents(nom_dossier),
communes: communes?.map(({name}) => retirerAccents(name || "")).join(" ") || "",
nom: retirerAccents(nom || ""),
déposant_nom: retirerAccents(déposant_nom || ""),
déposant_prénoms: retirerAccents(déposant_prénoms || ""),
demandeur_personne_physique_prénoms:
retirerAccents(demandeur_personne_physique_prénoms || ""),
demandeur_personne_physique_nom:
retirerAccents(demandeur_personne_physique_nom || ""),
demandeur_personne_morale_raison_sociale:
retirerAccents(demandeur_personne_morale_raison_sociale || ""),
commentaire_libre:
retirerAccents(commentaire_libre || ""),
commentaire_enjeu:
retirerAccents(commentaire_enjeu || ""),
}
}

/**
*
* @param {DossierComplet[]} dossiers
* @returns {lunr.Index}
*/
export const créerIndexDossiers = dossiers => {
return lunr(function() {
// @ts-expect-error TS ne comprends pas qu'on a ajouté lunrfr
this.use(lunr.fr)

this.ref("id")
this.field("nom_dossier", { boost: 10 })
this.field("number_demarches_simplifiées", { boost: 5})
Ynote marked this conversation as resolved.
Show resolved Hide resolved
this.field("communes")
this.field("nom")
this.field("déposant_nom")
this.field("déposant_prénoms")
this.field("demandeur_personne_physique_prénoms")
this.field("demandeur_personne_physique_nom")
this.field("demandeur_personne_morale_raison_sociale")
this.field("commentaire_libre")
this.field("commentaire_enjeu")
Ynote marked this conversation as resolved.
Show resolved Hide resolved

for (const dossier of dossiers) {
this.add(créerDossierIndexable(dossier))
}
})
}


/**
* @param {string} texteÀChercher
* @param {lunr.Index} index
* @return {lunr.Index.Result[]}
*/
const rechercherDossiersAvecTexte = (texteÀChercher, index) => {
if (texteÀChercher === "") { return [] }

return index.search(texteÀChercher)
}


/**
* @param {string} texteÀChercher
* @param {DossierComplet} dossier
* @param {lunr.Index} index
* @return {Boolean}
*/
export const contientTexteDansDossier = (texteÀChercher, dossier, index) => {
const lunrRésultats = rechercherDossiersAvecTexte(texteÀChercher, index)

if (lunrRésultats.length === 0) return false

return lunrRésultats.filter(({ref}) => String(dossier.id) === ref).length > 0
Ynote marked this conversation as resolved.
Show resolved Hide resolved
}
6 changes: 3 additions & 3 deletions scripts/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@
*
* @typedef {Object} DossierDémarcheSimplifiée88444Communes
* @property {string} name
* @property {string} code
* @property {string} postalCode
* @property {string} code // Code INSEE (identifiant de commune pour l'administration publique)
* @property {string} postalCode // Code postal (zone de desserte postale)
Ynote marked this conversation as resolved.
Show resolved Hide resolved
*
* @typedef {Object} DossierLocalisation
* @property {DossierDémarcheSimplifiée88444Communes[]} communes
Expand All @@ -74,4 +74,4 @@
/** @typedef {Dossier & DossierComplémentPersonnesImpliquées & DossierPhaseEtProchaineAction & DossierLocalisation} DossierComplet */


export default 'TS needs a module'
export default 'TS needs a module'
2 changes: 2 additions & 0 deletions scripts/types/customTypes.d.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
declare module 'simple-svelte-autocomplete'
declare module 'ods-xlsx'
declare module 'minimist'
declare module 'lunr-languages/lunr.stemmer.support'
declare module 'lunr-languages/lunr.fr'