Skip to content

Commit

Permalink
Wip: Ajoute la nouvelle page Toutes les actions sans filtre dans l'URL
Browse files Browse the repository at this point in the history
  • Loading branch information
cparthur committed Jul 10, 2024
1 parent 1f036c5 commit 71f8ecf
Show file tree
Hide file tree
Showing 8 changed files with 292 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
makeCollectiviteReferentielUrl,
makeCollectiviteUsersUrl,
makeTableauBordLandingUrl,
makeCollectiviteToutesLesFichesUrl,
} from 'app/paths';
import {UserData} from 'core-logic/api/auth/AuthProvider';
import {CurrentCollectivite} from 'core-logic/hooks/useCurrentCollectivite';
Expand Down Expand Up @@ -167,6 +168,12 @@ const makeNavItemsBase = (
collectiviteId,
}),
},
{
label: 'Toutes les fiches action',
to: makeCollectiviteToutesLesFichesUrl({
collectiviteId,
}),
},
{
label: 'Répartition des fiches action',
to: makeCollectivitePlansActionsSyntheseUrl({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
collectivitePlansActionsSynthesePath,
collectivitePlansActionsSyntheseVuePath,
collectiviteTDBBasePath,
collectiviteToutesLesFichesPath,
} from 'app/paths';
import {useCurrentCollectivite} from 'core-logic/hooks/useCurrentCollectivite';
import CollectivitePageLayout from '../CollectivitePageLayout/CollectivitePageLayout';
Expand All @@ -12,6 +13,7 @@ import {TableauDeBordPage} from '../TableauDeBord/TableauDeBordPage';
import {PlansActionsRoutes} from './PlansActionsRoutes';
import {SynthesePage} from './Synthese/SynthesePage';
import {SyntheseVuePage} from './Synthese/SyntheseVue/SyntheseVuePage';
import {ToutesLesFichesActionPage} from 'app/pages/collectivite/PlansActions/ToutesLesFichesAction/ToutesLesFichesActionPage';

const PlansActions = () => {
const collectivite = useCurrentCollectivite();
Expand All @@ -36,6 +38,14 @@ const PlansActions = () => {
</CollectivitePageLayout>
</Route>

<Route exact path={collectiviteToutesLesFichesPath}>
<div className="grow bg-grey-2 -mb-8 py-12 px-4 lg:px-6 2xl:px-0">
<CollectivitePageLayout dataTest="ToutesLesFichesAction">
<ToutesLesFichesActionPage />
</CollectivitePageLayout>
</div>
</Route>

<PlansActionsRoutes
collectivite_id={collectivite.collectivite_id}
readonly={collectivite.readonly}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
import {useState} from 'react';

import {
Checkbox,
Field,
FormSection,
FormSectionGrid,
Modal,
ModalFooterOKCancel,
ModalProps,
SelectFilter,
} from '@tet/ui';
import {QueryKey} from 'react-query';
import PersonnesDropdown from 'ui/dropdownLists/PersonnesDropdown/PersonnesDropdown';
import {Filtre} from '@tet/api/dist/src/fiche_actions/fiche_resumes.list/domain/fetch_options.schema';
import {
ficheActionNiveauPrioriteOptions,
ficheActionStatutOptions,
} from 'app/pages/collectivite/PlansActions/FicheAction/data/options/listesStatiques';
import {TFicheActionNiveauxPriorite, TFicheActionStatuts} from 'types/alias';
import BadgeStatut from 'app/pages/collectivite/PlansActions/components/BadgeStatut';
import BadgePriorite from 'app/pages/collectivite/PlansActions/components/BadgePriorite';
import {
getPilotesValues,
getReferentsValues,
splitPilotePersonnesAndUsers,
splitReferentPersonnesAndUsers,
} from 'ui/dropdownLists/PersonnesDropdown/utils';
import ServicesPilotesDropdown from 'ui/dropdownLists/ServicesPilotesDropdown/ServicesPilotesDropdown';
import ThematiquesDropdown from 'ui/dropdownLists/ThematiquesDropdown/ThematiquesDropdown';
import FinanceursDropdown from 'ui/dropdownLists/FinanceursDropdown/FinanceursDropdown';

type Props = ModalProps & {
filters: Filtre;
setFilters: (filters: Filtre) => void;
keysToInvalidate?: QueryKey[];
};

const ModalFiltresToutesLesFichesAction = ({
openState,
filters,
setFilters,
keysToInvalidate,
}: Props) => {
const [filtreState, setFiltreState] = useState<Filtre>(filters);

const pilotes = getPilotesValues(filtreState);
const referents = getReferentsValues(filtreState);

return (
<Modal
openState={openState}
render={() => (
<>
<FormSection title="Nouveau filtre :" className="!grid-cols-1">
<Field title="Pilote">
<PersonnesDropdown
values={pilotes}
onChange={({personnes}) => {
setFiltreState({
...filtreState,
...splitPilotePersonnesAndUsers(personnes),
});
}}
/>
</Field>
<Field title="Direction ou service pilote">
<ServicesPilotesDropdown
values={
filtreState.servicePiloteIds?.length
? filtreState.servicePiloteIds
: undefined
}
onChange={({services}) => {
setFiltreState({...filtreState, servicePiloteIds: services});
}}
/>
</Field>
<FormSectionGrid>
<Field title="Statut de l'action">
<SelectFilter
values={filtreState.statuts ?? undefined}
options={ficheActionStatutOptions}
onChange={({values}) => {
const {statuts, ...rest} = filtreState;
if (values) {
setFiltreState({
...filtreState,
statuts: values as TFicheActionStatuts[],
});
} else {
setFiltreState(rest);
}
}}
customItem={item => (
<BadgeStatut statut={item.value as TFicheActionStatuts} />
)}
/>
</Field>
<Field title="Niveau de priorité">
<SelectFilter
values={filtreState.priorites ?? undefined}
options={ficheActionNiveauPrioriteOptions}
onChange={({values}) => {
const {priorites, ...rest} = filtreState;
if (values) {
setFiltreState({
...filtreState,
priorites: values as TFicheActionNiveauxPriorite[],
});
} else {
setFiltreState(rest);
}
}}
customItem={item => (
<BadgePriorite
priorite={item.value as TFicheActionNiveauxPriorite}
/>
)}
/>
</Field>
</FormSectionGrid>
<Field title="Thématique">
<ThematiquesDropdown
values={
filtreState.thematiqueIds &&
filtreState.thematiqueIds.length > 0
? filtreState.thematiqueIds
: undefined
}
onChange={({thematiques}) =>
setFiltreState({
...filtreState,
thematiqueIds: thematiques.map(t => t.id),
})
}
/>
</Field>
<Field title="Financeur">
<FinanceursDropdown
values={
filtreState.financeurIds &&
filtreState.financeurIds.length > 0
? filtreState.financeurIds
: undefined
}
onChange={({financeurs}) => {
setFiltreState({...filtreState, financeurIds: financeurs});
}}
/>
</Field>
</FormSection>
<Field title="Élu·e référent·e">
<PersonnesDropdown
values={referents}
onChange={({personnes}) => {
setFiltreState({
...filtreState,
...splitReferentPersonnesAndUsers(personnes),
});
}}
/>
</Field>
<Checkbox
label="Budget renseigné"
checked={filtreState.budgetPrevisionnel}
onChange={() =>
setFiltreState({
...filtreState,
budgetPrevisionnel: !filtreState.budgetPrevisionnel,
})
}
/>
<Checkbox
label="Confidentialité"
checked={filtreState.restreint}
onChange={() =>
setFiltreState({
...filtreState,
restreint: !filtreState.restreint,
})
}
/>
<Checkbox
label="Indicateur(s) lié"
checked={filtreState.hasIndicateurLies}
onChange={() =>
setFiltreState({
...filtreState,
hasIndicateurLies: !filtreState.hasIndicateurLies,
})
}
/>
</>
)}
renderFooter={({close}) => (
<ModalFooterOKCancel
btnCancelProps={{
onClick: () => close(),
}}
btnOKProps={{
onClick: () => {
setFilters(filtreState);
close();
},
}}
/>
)}
/>
);
};

export default ModalFiltresToutesLesFichesAction;
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import {Filtre} from '@tet/api/dist/src/fiche_actions/fiche_resumes.list/domain/fetch_options.schema';
import ModalFiltresToutesLesFichesAction from 'app/pages/collectivite/PlansActions/ToutesLesFichesAction/ModalFiltresToutesLesFichesAction';
import FichesActionListe from 'app/pages/collectivite/TableauDeBord/Module/ModuleFichesActions/FichesActionListe';
import {useState} from 'react';

const ToutesLesFichesAction = () => {
const [filters, setFilters] = useState<Filtre>({});

return (
<div className="min-h-[44rem] flex flex-col gap-8">
<div>
<h2 className="mb-0">Toutes les actions</h2>
</div>
<FichesActionListe
filtres={filters}
settingsModal={openState => (
<ModalFiltresToutesLesFichesAction
openState={openState}
filters={filters}
setFilters={filters => setFilters(filters)}
/>
)}
/>
</div>
);
};

export default ToutesLesFichesAction;
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import {Suspense} from 'react';
import {lazy} from 'utils/lazy';
import {renderLoader} from 'utils/renderLoader';

const ToutesLesFichesAction = lazy(
() =>
import(
'app/pages/collectivite/PlansActions/ToutesLesFichesAction/ToutesLesFichesAction'
)
);

export const ToutesLesFichesActionPage = () => {
return (
<Suspense fallback={renderLoader()}>
<ToutesLesFichesAction />
</Suspense>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ const ModuleFiltreBadges = ({filtre, className}: Props) => {

const selectedFilters = filtersToBadges({...filtreValues, ...filtre});

if (selectedFilters.length === 0) {
return null;
}

return (
<div className={classNames('flex flex-wrap gap-4', className)}>
{selectedFilters.map(filter => (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const View = ({view, title, description, children}: Props) => {
properties={{collectivite_id}}
/>
{/** Header */}
<div className="flex items-start gap-20 border-b pb-6 mb-12">
<div className="flex items-start gap-20 mb-12">
<div className="flex-grow">
<h2 className="mb-4">{title}</h2>
<div className="text-lg text-grey-8">{description}</div>
Expand Down
11 changes: 11 additions & 0 deletions app.territoiresentransitions.react/src/app/paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ export const collectivitePlanActionPath = `${collectivitePlanActionLandingPath}/
export const collectivitePlanActionFichePath = `${collectivitePlanActionPath}/fiche/:${ficheParam}`;
export const collectivitePlanActionAxePath = `${collectivitePlanActionPath}/:${axeParam}`;
export const collectivitePlanActionAxeFichePath = `${collectivitePlanActionAxePath}/fiche/:${ficheParam}`;
export const collectiviteToutesLesFichesPath = `${collectivitePlansActionsBasePath}/toutes-les-fiches-action`;
export const collectiviteFichesNonClasseesPath = `${collectivitePlansActionsBasePath}/fiches`;
export const collectiviteFicheNonClasseePath = `${collectiviteFichesNonClasseesPath}/:${ficheParam}`;

Expand Down Expand Up @@ -305,6 +306,16 @@ export const makeCollectivitePlansActionsSyntheseVueUrl = ({
.replace(`:${collectiviteParam}`, collectiviteId.toString())
.replace(`:${syntheseParam}`, vue);

export const makeCollectiviteToutesLesFichesUrl = ({
collectiviteId,
}: {
collectiviteId: number;
}) =>
collectiviteToutesLesFichesPath.replace(
`:${collectiviteParam}`,
collectiviteId.toString()
);

export const makeCollectiviteFichesNonClasseesUrl = ({
collectiviteId,
}: {
Expand Down

0 comments on commit 71f8ecf

Please sign in to comment.