Skip to content

Commit

Permalink
Merge pull request #2617 from MTES-MCT/feature/2597-feedback-new-list
Browse files Browse the repository at this point in the history
[BO - Filtre signalement] Correction tri
  • Loading branch information
hmeneuvrier committed Jun 7, 2024
2 parents 1b7121d + eaee396 commit c4560c5
Show file tree
Hide file tree
Showing 12 changed files with 77 additions and 77 deletions.
15 changes: 2 additions & 13 deletions assets/vue/components/common/AppSearch.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
:name="id"
:value="modelValue"
@input="onInputEvent"
@search="onSearchEvent"
:placeholder="placeholder"
type="search"
/>
Expand All @@ -21,7 +20,6 @@ export default defineComponent({
props: {
id: { type: String, default: '' },
modelValue: { type: String, default: '' },
onInput: { type: Function },
placeholder: { type: String, default: '' },
minLengthSearch: { type: Number, default: 0 }
},
Expand All @@ -30,17 +28,8 @@ export default defineComponent({
onInputEvent (e: any) {
if (e.target.value.length >= this.minLengthSearch) {
this.$emit('update:modelValue', e.target.value)
if (this.onInput !== undefined) {
this.onInput(e.target.value)
}
}
},
onSearchEvent (e: any) {
if (e.target.value === '') {
this.$emit('update:modelValue', null)
if (this.onInput !== undefined) {
this.onInput(null)
}
} else if (e.target.value.length === 0) {
this.$emit('update:modelValue', '')
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,9 @@ export default defineComponent({
}
},
makeNewSignalement () {
if (formStore.alreadyExists.uuidDraft !== null && (formStore.alreadyExists.type === 'draft' || formStore.alreadyExists.type === 'signalement')){
if (formStore.alreadyExists.uuidDraft !== null && (formStore.alreadyExists.type === 'draft' || formStore.alreadyExists.type === 'signalement')) {
requests.archiveDraft(formStore.alreadyExists.uuidDraft, this.saveAndContinue)
} else if(formStore.alreadyExists.type === 'signalement'){
} else if (formStore.alreadyExists.type === 'signalement') {
this.saveAndContinue()
}
},
Expand Down
4 changes: 2 additions & 2 deletions assets/vue/components/signalement-form/requests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export const requests = {
// TODO : il y a sûrement plus élégant à faire pour construire l'url (cf controlleur et twig)
const url = formStore.props.ajaxurlPutSignalementDraft.replace('uuid', formStore.data.uuidSignalementDraft)
requests.doRequestPut(url, formStore.data, functionReturn)
} else if (formStore.currentScreen && formStore.currentScreen.slug !== 'adresse_logement' && formStore.currentScreen.slug !== 'signalement_concerne') {
} else if ((formStore.currentScreen != null) && formStore.currentScreen.slug !== 'adresse_logement' && formStore.currentScreen.slug !== 'signalement_concerne') {
const url = formStore.props.ajaxurlPostSignalementDraft
requests.doRequestPost(url, formStore.data, functionReturn, undefined)
} else {
Expand All @@ -105,7 +105,7 @@ export const requests = {

checkIfAlreadyExists (functionReturn: Function) {
const url = formStore.props.ajaxurlCheckSignalementOrDraftAlreadyExists
if (formStore.currentScreen && formStore.currentScreen.slug !== 'adresse_logement' && formStore.currentScreen.slug !== 'signalement_concerne') {
if ((formStore.currentScreen != null) && formStore.currentScreen.slug !== 'adresse_logement' && formStore.currentScreen.slug !== 'signalement_concerne') {
requests.doRequestPost(url, formStore.data, functionReturn, undefined)
} else {
functionReturn(undefined)
Expand Down
62 changes: 32 additions & 30 deletions assets/vue/components/signalement-list/TheSignalementAppList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ export default defineComponent({
this.sharedState.user.canSeeScore = isAdminOrAdminTerritoire
this.sharedState.user.partnerId = requestResponse.partnerId
this.sharedState.hasSignalementImported = requestResponse.hasSignalementImported
this.sharedState.input.order = 'reference-DESC'
this.sharedState.territories = []
for (const id in requestResponse.territories) {
Expand Down Expand Up @@ -174,11 +175,16 @@ export default defineComponent({
this.init()
},
handleSignalements (requestResponse: any) {
this.sharedState.signalements.filters = requestResponse.filters
this.sharedState.signalements.list = requestResponse.list
this.sharedState.signalements.pagination = requestResponse.pagination
this.loadingList = false
window.scrollTo(0, 0)
if (typeof requestResponse === 'string' && requestResponse === 'error') {
this.hasErrorLoading = true
} else {
this.hasErrorLoading = false
this.sharedState.signalements.filters = requestResponse.filters
this.sharedState.signalements.list = requestResponse.list
this.sharedState.signalements.pagination = requestResponse.pagination
this.loadingList = false
window.scrollTo(0, 0)
}
},
handlePageChange (pageNumber: number) {
this.clearScreen()
Expand All @@ -193,6 +199,8 @@ export default defineComponent({
this.clearScreen()
const [field, direction] = this.sharedState.input.order.split('-')
this.removeQueryParameter('page')
this.removeQueryParameter('sortBy')
this.removeQueryParameter('orderBy')
const url = new URL(window.location.toString())
url.searchParams.delete('page')
Expand All @@ -219,36 +227,23 @@ export default defineComponent({
this.sharedState.input.queryParameters = []
for (const [key, value] of Object.entries(this.sharedState.input.filters)) {
if (value && value !== null) {
if (value) {
if (key === 'dateDepot' || key === 'dateDernierSuivi') {
const [dateDebut, dateFin] = this.handleDateParameter(key, value)
url.searchParams.set(`${key}Debut`, dateDebut)
url.searchParams.set(`${key}Fin`, dateFin)
url.searchParams.delete(key)
} else if (
key === 'territoires' ||
key === 'partenaires' ||
key === 'communes' ||
key === 'etiquettes' ||
key === 'epcis'
) {
if (typeof value === 'object') {
if (key === 'epcis') {
value.forEach((valueItem: any) => {
const code = valueItem.split('|').shift()
this.addQueryParameter(`${key}[]`, code)
url.searchParams.append(`${key}[]`, code)
})
} else {
value.forEach((valueItem: any) => {
this.addQueryParameter(`${key}[]`, valueItem)
url.searchParams.append(`${key}[]`, valueItem)
})
}
} else {
this.addQueryParameter(`${key}[]`, value)
url.searchParams.set(`${key}[]`, value)
}
} else if (typeof value === 'object' && (key === 'partenaires' || key === 'communes' || key === 'etiquettes')) {
value.forEach((valueItem: any) => {
this.addQueryParameter(`${key}[]`, valueItem)
url.searchParams.append(`${key}[]`, valueItem)
})
} else if (typeof value === 'object' && key === 'epcis') {
value.forEach((valueItem: any) => {
const code = valueItem.split('|').shift()
this.addQueryParameter(`${key}[]`, code)
url.searchParams.append(`${key}[]`, code)
})
} else if (typeof value === 'string') {
this.addQueryParameter(key, value)
url.searchParams.set(key, value)
Expand All @@ -258,6 +253,13 @@ export default defineComponent({
url.searchParams.delete(key)
}
}
const [field, direction] = this.sharedState.input.order.split('-')
url.searchParams.set('sortBy', field)
url.searchParams.set('direction', direction)
this.addQueryParameter('sortBy', field)
this.addQueryParameter('orderBy', direction)
window.history.pushState({}, '', decodeURIComponent(url.toString()))
this.buildUrl()
requests.getSignalements(this.handleSignalements, { signal: this.abortRequest?.signal })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<li v-if="sharedState.user.isResponsableTerritoire">
<button class="fr-tag"
ref="myAffectationButton"
aria-pressed="sharedState.input.filters.showMyAffectationOnly === 'oui'"
:aria-pressed="ariaPressed.showMyAffectationOnly.toString()"
@click="toggleCurrentPartnerAffectation">
Afficher mes affectations uniquement
</button>
Expand All @@ -19,7 +19,7 @@
v-if="sharedState.hasSignalementImported"
ref="isImportedButton"
class="fr-tag"
aria-pressed="sharedState.input.filters.isImported === 'oui'"
:aria-pressed="ariaPressed.isImported.toString()"
@click="toggleIsImported"
>Afficher les signalements importés
</button>
Expand All @@ -30,8 +30,8 @@
<div v-if="sharedState.user.isAdmin" class="fr-col-12 fr-col-lg-6 fr-col-xl-2 grey-background">
<HistoSelect
v-if="sharedState.territories.length > 0"
id="filter-territoires"
v-model="sharedState.input.filters.territoires"
id="filter-territoire"
v-model="sharedState.input.filters.territoire"
@update:modelValue="updateTerritory"
inner-label="Territoire"
title="Rechercher par territoire"
Expand Down Expand Up @@ -93,12 +93,11 @@
</div>
<div class="fr-col-12 fr-col-lg-6 fr-col-xl-7">
<ul class="fr-tags-group">
<li>
<li v-for="(value, key) in filtersSanitized" :key="key">
<button
v-if="value.length > 0"
class="fr-tag fr-tag--sm fr-tag--dismiss"
v-for="(value, key) in filtersSanitized"
:aria-label="`Retirer ${key}`"
:key="key"
@click="removeFilter(key)"
>
{{ getBadgeFilterLabel(key, value) }}
Expand Down Expand Up @@ -382,7 +381,7 @@ export default defineComponent({
},
resetFilters () {
this.sharedState.input.filters = {
territoires: [],
territoire: null,
etiquettes: [],
partenaires: [],
communes: [],
Expand Down Expand Up @@ -432,6 +431,10 @@ export default defineComponent({
showOptions: false,
reset: false,
sharedState: store.state,
ariaPressed: {
isImported: store.state.input.filters.isImported === 'oui',
showMyAffectationOnly: store.state.input.filters.showMyAffectationOnly === 'oui'
},
statusSignalementList: store.state.statusSignalementList,
statusAffectationList: store.state.statusAffectationList,
statusVisiteList: store.state.statusVisiteList,
Expand All @@ -451,9 +454,6 @@ export default defineComponent({
.histo-select select {
background-color: var(--background-contrast-grey);
}
.histo-multi-select .selector {
background-color: var(--background-contrast-grey);
}
.histo-date-picker input {
background-color: var(--background-contrast-grey);
box-shadow: inset 0 -2px 0 0 var(--border-plain-grey);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ export default defineComponent({
{ Id: 'reference-ASC', Text: 'Ordre croissant' },
{ Id: 'nomOccupant-ASC', Text: 'Ordre alphabétique (A -> Z)' },
{ Id: 'nomOccupant-DESC', Text: 'Ordre alphabétique inversé (Z -> A)' },
{ Id: 'createdAt-DESC', Text: 'Le plus récent' },
{ Id: 'createdAt-ASC', Text: 'Le plus ancien' }
{ Id: 'lastSuiviAt-DESC', Text: 'Suivi le plus récent' },
{ Id: 'lastSuiviAt-ASC', Text: 'Suivi le plus ancien' }
]
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export function buildBadge (key: string, value: any): string | undefined {
return undefined
}

if (key === 'territoires') {
if (key === 'territoire') {
return store.state.territories.find(territory => territory.Id.toString() === value)?.Text
}

Expand Down Expand Up @@ -57,7 +57,7 @@ export function buildBadge (key: string, value: any): string | undefined {
return buildRangeDateBadge(key, value)
}

return buildStaticBadge(key, value)
return buildStaticBadge(value)
}

function buildRangeDateBadge (key: string, value: any): string | undefined {
Expand All @@ -79,7 +79,7 @@ function buildRangeDateBadge (key: string, value: any): string | undefined {
return `${label} ${startDate} - ${endDate}`
}

function buildStaticBadge (key: string, value: any): string | undefined {
function buildStaticBadge (value: any): string | undefined {
const staticListsWithNoDuplicateId = [
store.state.statusSignalementList,
store.state.statusAffectationList,
Expand Down
2 changes: 1 addition & 1 deletion assets/vue/components/signalement-list/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const store = {
order: 'reference-DESC',
queryParameters: [] as QueryParameter[],
filters: {
territoires: new Array<string>(),
territoire: null,
etiquettes: new Array<HistoInterfaceSelectOption>(),
partenaires: new Array<HistoInterfaceSelectOption | string>(),
communes: new Array<string>(),
Expand Down
17 changes: 13 additions & 4 deletions src/DataFixtures/Loader/LoadSuiviData.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@
class LoadSuiviData extends Fixture implements OrderedFixtureInterface
{
public function __construct(
private SignalementRepository $signalementRepository,
private UserRepository $userRepository,
private ParameterBagInterface $parameterBag
private readonly SignalementRepository $signalementRepository,
private readonly UserRepository $userRepository,
private readonly ParameterBagInterface $parameterBag
) {
}

/**
* @throws \Exception
*/
public function load(ObjectManager $manager): void
{
$signalements = $this->signalementRepository->findBy(['statut' => [
Expand All @@ -29,7 +32,9 @@ public function load(ObjectManager $manager): void
Signalement::STATUS_CLOSED,
]]);

$second = 1;
foreach ($signalements as $signalement) {
$createdAtUpdated = $signalement->getCreatedAt()->modify('+'.$second.' second');
$suivi = (new Suivi())
->setSignalement($signalement)
->setType(Suivi::TYPE_AUTO)
Expand All @@ -38,9 +43,10 @@ public function load(ObjectManager $manager): void
->setCreatedBy($this->userRepository->findOneBy(
['email' => $this->parameterBag->get('user_system_email')]
))
->setCreatedAt($signalement->getCreatedAt());
->setCreatedAt($createdAtUpdated);

$manager->persist($suivi);
++$second;
}
$manager->flush();

Expand All @@ -51,6 +57,9 @@ public function load(ObjectManager $manager): void
$manager->flush();
}

/**
* @throws \Exception
*/
public function loadSuivi(ObjectManager $manager, array $row): void
{
$suivi = (new Suivi())
Expand Down
13 changes: 7 additions & 6 deletions src/Dto/Request/Signalement/SignalementSearchQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class SignalementSearchQuery
public const MAX_LIST_PAGINATION = 25;

public function __construct(
private readonly ?array $territoires = null,
private readonly ?string $territoire = null,
private readonly ?string $searchTerms = null,
#[Assert\Choice(['nouveau', 'en_cours', 'ferme', 'refuse'])]
private readonly ?string $status = null,
Expand Down Expand Up @@ -65,15 +65,16 @@ public function __construct(
private readonly ?int $page = 1,
#[Assert\Choice(['oui'])]
private readonly ?string $isImported = null,
#[Assert\Choice(['reference', 'nomOccupant', 'createdAt'])]
#[Assert\Choice(['reference', 'nomOccupant', 'lastSuiviAt'])]
private readonly string $sortBy = 'reference',
#[Assert\Choice(['ASC', 'DESC', 'asc', 'desc'])]
private readonly string $orderBy = 'DESC',
) {
}

public function getTerritoires(): ?array
public function getTerritoire(): ?string
{
return $this->territoires;
return $this->territoire;
}

public function getSearchTerms(): ?string
Expand Down Expand Up @@ -210,7 +211,7 @@ public function getFilters(): array
{
$filters = [];
$filters['searchterms'] = $this->getSearchTerms() ?? null;
$filters['territories'] = $this->getTerritoires() ?? null;
$filters['territories'] = null !== $this->getTerritoire() ? [$this->getTerritoire()] : null;
$filters['statuses'] = null !== $this->getStatus()
? [SignalementStatus::mapFilterStatus($this->getStatus())]
: null;
Expand Down Expand Up @@ -275,7 +276,7 @@ public function getFilters(): array

$filters['page'] = $this->getPage() ?? 1;
$filters['maxItemsPerPage'] = self::MAX_LIST_PAGINATION;
$filters['sortBy'] = $this->getSortBy() ?? 'createdAt';
$filters['sortBy'] = $this->getSortBy() ?? 'reference';
$filters['orderBy'] = $this->getOrderBy() ?? 'DESC';

return array_filter($filters);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,7 @@ public function provideNewFilterSearch(): \Generator
yield 'Search Terms with Firstname Occupant' => [['searchTerms' => 'Mapaire'], 1];
yield 'Search Terms with Lastname Occupant' => [['searchTerms' => 'Nawell'], 2];
yield 'Search Terms with Email Occupant' => [['searchTerms' => 'nawell.mapaire@yopmail.com'], 1];
yield 'Search by Territory 13' => [['territoires' => ['13']], 25];
yield 'Search by Territory 01 and 69' => [['territoires' => ['01', '70']], 9];
yield 'Search by Territory 13' => [['territoire' => '13'], 25];
yield 'Search by Commune' => [['communes' => ['gex', 'marseille']], 30];
yield 'Search by Commune code postal' => [['communes' => ['13002']], 1];
yield 'Search by EPCIS' => [['epcis' => ['244400503']], 1];
Expand Down
Loading

0 comments on commit c4560c5

Please sign in to comment.