Skip to content

Commit

Permalink
Premier jets des filtres sur le tableau suivi (#85)
Browse files Browse the repository at this point in the history
* Ajout de filtres (commune, département, phase, prochaine action attendue) sur le tableau de suivi

* Binder la fermeture du filtre par recherche

* Ajouter une croix pour supprimer un filtre

* Correction de couleurs pour qu'elles fonctionnent en mode dark

* Travail sur les phases et le filtre des phases

* Affichage vide lorsque la phase n'a pas été renseignée

* Ajustement des prochaines actions attendues par

* renommage FlitreTexte et correction affichage badge prochaine action attendue par

* Ajout d'un filtre texte libre

* Le filtre texte focus automatiquement l'input à l'ouverture

---------

Co-authored-by: David Bruant <[email protected]>
  • Loading branch information
Ynote and DavidBruant committed Sep 18, 2024
1 parent 6762bc1 commit 7dba47b
Show file tree
Hide file tree
Showing 7 changed files with 390 additions and 41 deletions.
34 changes: 32 additions & 2 deletions scripts/front-end/affichageDossier.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { differenceInDays, format, formatRelative } from 'date-fns'
import { fr } from 'date-fns/locale'

/** @import {DossierComplet} from '../types.js'*/
/** @import {DossierComplet, DossierPhase, DossierProchaineActionAttenduePar} from '../types.js'*/

/**
* @param {Partial<DossierComplet>} localisation
Expand Down Expand Up @@ -98,4 +98,34 @@ export function formatDateRelative(date) {
}

return formatDateAbsolue(date)
}
}

/** @type {Set<DossierPhase>} */
export const phases = new Set([
"Accompagnement amont",
"Accompagnement amont terminé",
"Instruction",
"Décision",
"Refus tacite",
])

/** @type {Set<DossierProchaineActionAttenduePar>} */
export const prochaineActionAttenduePar = new Set([
"Instructeur",
"CNPN/CSRPN",
"Pétitionnaire",
"Consultation du public",
"Autre administration",
"Autre",
"Personne"
])

export const prochaineActionAttendue = [
"traitement",
"lancement consultation",
"rédaction AP",
"Avis",
"DDEP",
"complément dossier",
"mémoire en réponse avis CNPN",
]
96 changes: 96 additions & 0 deletions scripts/front-end/components/FiltreParmiOptions.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<script>
//@ts-check
import { createEventDispatcher } from "svelte";
/** @type {Set<string>}*/
export let options
/** @type {string} */
export let titre
let optionsSélectionnées = new Set(options)
const dispatch = createEventDispatcher()
$: optionsAffichées = [...options].map(option => ({option, checked: optionsSélectionnées.has(option)}))
function rerender() {
optionsSélectionnées = optionsSélectionnées
}
/**
*
* @param {string} option
* @returns
*/
function mettreÀJourOption(option) {
if (optionsSélectionnées.has(option)) {
optionsSélectionnées.delete(option)
} else {
optionsSélectionnées.add(option)
}
rerender()
dispatch("selected-changed", optionsSélectionnées)
}
function selectionnerTout(){
optionsSélectionnées = new Set(options)
dispatch("selected-changed", optionsSélectionnées)
}
function selectionnerRien(){
optionsSélectionnées = new Set()
dispatch("selected-changed", optionsSélectionnées)
}
</script>

<details>
<summary class="fr-btn fr-btn--secondary fr-btn--sm">
{titre}
</summary>

<section class="filtre-options">
<button class="fr-btn fr-btn--secondary fr-btn--sm" on:click={selectionnerTout}>Sélectionner tout</button>
<button class="fr-btn fr-btn--secondary fr-btn--sm" on:click={selectionnerRien}>Sélectionner rien</button>

<ul>

{#each optionsAffichées as optionAffichée}
<li>
<label>
<input
type="checkbox"
bind:checked={optionAffichée.checked}
on:input={() => mettreÀJourOption(optionAffichée.option)}
/>
{optionAffichée.option}
</label>
</li>
{/each}
</ul>
</section>
</details>

<style lang="scss">
details {
display: inline;
}
.filtre-options {
margin-top: 0.5rem;
padding: 1rem;
background-color: var(--background-contrast-grey);
border: 1px solid var(--border-default-grey);
position: absolute;
z-index: 2;
ul{
list-style: none;
}
}
</style>
57 changes: 57 additions & 0 deletions scripts/front-end/components/FiltreTexte.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<script>
//@ts-check
import { createEventDispatcher } from "svelte";
/** @type {string} */
export let titre
$: valeur = ""
$: isOpen = false
let inputElement
$: if(isOpen) inputElement.focus()
const dispatch = createEventDispatcher()
function onMettreÀJourValeurSélectionnée(e) {
e.preventDefault()
isOpen = false
dispatch("selected-changed", valeur)
valeur = ""
}
</script>

<details bind:open={isOpen}>
<summary class="fr-btn fr-btn--secondary fr-btn--sm">
{titre}
</summary>

<form on:submit={onMettreÀJourValeurSélectionnée} class="filtre-form">
<label class="fr-label" for="text-input-text">{titre}</label>
<input class="fr-input fr-mb-2v" type="text" bind:value={valeur} bind:this={inputElement}/>
<button class="fr-btn fr-btn fr-btn--sm" type="submit">Chercher</button>
</form>
</details>

<style lang="scss">
details {
display: inline;
}
.filtre-form {
margin-top: 0.5rem;
padding: 1rem;
background-color: var(--background-contrast-grey);
border: 1px solid var(--border-default-grey);
position: absolute;
z-index: 2;
list-style: none;
width: 20rem;
input {
width: 90%;
}
}
</style>
33 changes: 3 additions & 30 deletions scripts/front-end/components/screens/Dossier.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import Squelette from '../Squelette.svelte'
import {formatLocalisation, formatDéposant} from '../../affichageDossier.js'
import {formatLocalisation, formatDéposant, phases, prochaineActionAttendue, prochaineActionAttenduePar} from '../../affichageDossier.js'
import { modifierDossier } from '../../actions/dossier.js';
/** @import {DossierComplet, DossierPhaseEtProchaineAction} from '../../../types.js' */
Expand Down Expand Up @@ -44,33 +44,6 @@
messageErreur = ""
afficherMessageSucces = false
}
const phases = [
"accompagnement amont",
"accompagnement amont terminé",
"instruction",
"décision",
"refus tacite",
]
const prochaineActionAttenduePar = [
"instructeur",
"CNPN/CSRPN",
"pétitionnaire",
"consultation du public",
"autre administration",
"sans objet",
]
const prochaineActionAttendue = [
"traitement",
"lancement consultation",
"rédaction AP",
"Avis",
"DDEP",
"complément dossier",
"mémoire en réponse avis CNPN",
]
</script>

<Squelette {email}>
Expand Down Expand Up @@ -114,7 +87,7 @@
</label>

<select bind:value={dossierParams["phase"]} class="fr-select" id="phase">
{#each phases as phase}
{#each [...phases] as phase}
<option value={phase}>{phase}</option>
{/each}
</select>
Expand All @@ -125,7 +98,7 @@
</label>

<select bind:value={dossierParams["prochaine_action_attendue_par"]} class="fr-select" id="prochaine_action_attendue_par">
{#each prochaineActionAttenduePar as acteur}
{#each [...prochaineActionAttenduePar] as acteur}
<option value={acteur}>{acteur}</option>
{/each}
</select>
Expand Down
Loading

0 comments on commit 7dba47b

Please sign in to comment.