From b4d3de97fbfb591322d3ba0083878b68d6b36d4b Mon Sep 17 00:00:00 2001 From: "Yassine R." Date: Wed, 27 Nov 2024 01:06:19 +0100 Subject: [PATCH] fix(frontend): fix filter saving --- .../src/usagers/dto/create-note.dto.ts | 3 +- .../src/util/search/normalize-string.spec.ts | 8 +- .../manage-filters.component.ts | 27 +++- .../manage-usagers-page.component.ts | 11 +- .../usager-filter/UsagersFilterCriteria.ts | 8 +- .../checkers/usagerPassageChecker.service.ts | 1 + .../services/usagersSorter.service.ts | 2 + .../sorter/dataObjectCompare.service.spec.ts | 119 ------------------ .../utils/sorter/dataObjectCompare.service.ts | 99 --------------- .../utils/sorter/dataSorter.service.spec.ts | 69 ---------- .../utils/sorter/dataSorter.service.ts | 47 ------- 11 files changed, 40 insertions(+), 354 deletions(-) delete mode 100644 packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.spec.ts diff --git a/packages/backend/src/usagers/dto/create-note.dto.ts b/packages/backend/src/usagers/dto/create-note.dto.ts index 2e1e6f1699..23a483acb1 100644 --- a/packages/backend/src/usagers/dto/create-note.dto.ts +++ b/packages/backend/src/usagers/dto/create-note.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty } from "@nestjs/swagger"; import { IsNotEmpty, IsString, MaxLength, MinLength } from "class-validator"; -import { StripTagsTransform } from "../../_common/decorators"; +import { StripTagsTransform, Trim } from "../../_common/decorators"; export class CreateNoteDto { @ApiProperty({ @@ -13,5 +13,6 @@ export class CreateNoteDto { @MaxLength(1000) @IsString() @StripTagsTransform() + @Trim() public message!: string; } diff --git a/packages/backend/src/util/search/normalize-string.spec.ts b/packages/backend/src/util/search/normalize-string.spec.ts index af6eaced3d..8764c1d54b 100644 --- a/packages/backend/src/util/search/normalize-string.spec.ts +++ b/packages/backend/src/util/search/normalize-string.spec.ts @@ -28,12 +28,12 @@ describe("normalizeString", () => { expect(normalizeString("test test")).toBe("test test"); expect(normalizeString("test\t\ttest")).toBe("test test"); expect(normalizeString("test\n\ntest")).toBe("test test"); - expect(normalizeString(" test ")).toBe("test"); + expect(normalizeString(" test ")).toBe(" test "); }); test("phrases complètes", () => { expect(normalizeString("L'été sera TRÈS chaud!")).toBe( - "l ete sera tres chaud" + "l ete sera tres chaud " ); expect(normalizeString("Une chaîne avec\tdes\ttabulations")).toBe( "une chaine avec des tabulations" @@ -44,12 +44,12 @@ describe("normalizeString", () => { test("caractères spéciaux", () => { expect(normalizeString("100% sûr")).toBe("100 sur"); expect(normalizeString("test&test")).toBe("test test"); - expect(normalizeString("prix: 15€")).toBe("prix 15"); + expect(normalizeString("prix: 15€")).toBe("prix 15 "); }); test("cas limites", () => { expect(normalizeString("")).toBe(""); - expect(normalizeString(" ")).toBe(""); + expect(normalizeString(" ")).toBe(" "); expect(normalizeString(null)).toBe(""); expect(normalizeString(undefined)).toBe(""); }); diff --git a/packages/frontend/src/app/modules/manage-usagers/components/manage-filters/manage-filters.component.ts b/packages/frontend/src/app/modules/manage-usagers/components/manage-filters/manage-filters.component.ts index 69b6c0a370..ab3bc7f3dc 100644 --- a/packages/frontend/src/app/modules/manage-usagers/components/manage-filters/manage-filters.component.ts +++ b/packages/frontend/src/app/modules/manage-usagers/components/manage-filters/manage-filters.component.ts @@ -1,5 +1,8 @@ -import { Component, EventEmitter, Input, Output } from "@angular/core"; -import { UsagersFilterCriteria } from "../usager-filter/UsagersFilterCriteria"; +import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core"; +import { + UsagersFilterCriteria, + UsagersFilterCriteriaSortKey, +} from "../usager-filter/UsagersFilterCriteria"; import { extractDeadlines, UsagersFilterCriteriaDernierPassage, @@ -11,7 +14,7 @@ import { templateUrl: "./manage-filters.component.html", styleUrls: ["../manage-usagers-page/manage-usagers-page.component.scss"], }) -export class ManageFiltersComponent { +export class ManageFiltersComponent implements OnInit { @Input() public filters: UsagersFilterCriteria; @Input() public usagersRadiesLoadedCount: number; @Input() public usagersRadiesTotalCount: number; @@ -46,10 +49,22 @@ export class ManageFiltersComponent { }; public sortLabel = "échéance"; - public sortMenuItems = this.getSortKeys(); + public sortMenuItems: Array<{ + id: UsagersFilterCriteriaSortKey; + label: string; + }> = []; - public getSortKeys() { - const sortElements = [ + ngOnInit(): void { + this.sortMenuItems = this.getSortKeys(); + } + public getSortKeys(): Array<{ + id: UsagersFilterCriteriaSortKey; + label: string; + }> { + const sortElements: Array<{ + id: UsagersFilterCriteriaSortKey; + label: string; + }> = [ { id: "ID", label: "ID" }, { id: "NAME", label: "nom" }, { id: "ECHEANCE", label: this.getEcheanceLabel() }, diff --git a/packages/frontend/src/app/modules/manage-usagers/components/manage-usagers-page/manage-usagers-page.component.ts b/packages/frontend/src/app/modules/manage-usagers/components/manage-usagers-page/manage-usagers-page.component.ts index 42e4e7afa1..5de466fec3 100644 --- a/packages/frontend/src/app/modules/manage-usagers/components/manage-usagers-page/manage-usagers-page.component.ts +++ b/packages/frontend/src/app/modules/manage-usagers/components/manage-usagers-page/manage-usagers-page.component.ts @@ -496,9 +496,9 @@ export class ManageUsagersPageComponent filters: UsagersFilterCriteria; allUsagers: UsagerLight[]; }): void { + console.log("applyFilters"); this.searching = true; this.resetCheckboxes(); - localStorage.setItem("MANAGE_USAGERS", JSON.stringify(filters)); this.filteredUsagers = usagersFilter.filter(allUsagers, { criteria: filters, @@ -542,12 +542,16 @@ export class ManageUsagersPageComponent this.usagers = []; return; } - + console.log({ + sortKey: this.filters.sortKey, + sortValue: this.filters.sortValue, + }); this.filteredUsagers = usagersSorter.sortBy(this.filteredUsagers, { sortKey: this.filters.sortKey, sortValue: this.filters.sortValue, }) as UsagerFormModel[]; + this.setFilters(); this.applyPaginationFromStore(); } @@ -593,6 +597,9 @@ export class ManageUsagersPageComponent this.filters.sortValue = sortValue; } + private setFilters() { + localStorage.setItem("MANAGE_USAGERS", JSON.stringify(this.filters)); + } private getFilters(): null | Partial { const filters = localStorage.getItem("MANAGE_USAGERS"); return filters === null ? {} : JSON.parse(filters); diff --git a/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/UsagersFilterCriteria.ts b/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/UsagersFilterCriteria.ts index e942352866..7569c86937 100644 --- a/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/UsagersFilterCriteria.ts +++ b/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/UsagersFilterCriteria.ts @@ -40,6 +40,7 @@ export class UsagersFilterCriteria { public page: number; constructor(search?: Partial | null) { + console.log({ search }); this.interactionType = search?.interactionType || null; this.lastInteractionDate = search?.lastInteractionDate || null; this.entretien = search?.entretien || null; @@ -51,12 +52,5 @@ export class UsagersFilterCriteria { this.sortKey = search?.sortKey || "NAME"; this.sortValue = search?.sortValue || "asc"; - - // Ne pas trier par autre que les nom & ID si on est sur TOUS - if (this.statut === "TOUS") { - if (this.sortKey !== "ID" && this.sortKey !== "NAME") { - this.sortKey = "NAME"; - } - } } } diff --git a/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/checkers/usagerPassageChecker.service.ts b/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/checkers/usagerPassageChecker.service.ts index 4ac45cc260..c961645685 100644 --- a/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/checkers/usagerPassageChecker.service.ts +++ b/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/checkers/usagerPassageChecker.service.ts @@ -21,6 +21,7 @@ function check({ const interactionTime = new Date( usager.lastInteraction.dateInteraction ).getTime(); + console.log({ deadlineTime, interactionTime }); return deadlineTime > interactionTime; } diff --git a/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/usagersSorter.service.ts b/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/usagersSorter.service.ts index 84168ded7b..3e6e0d1339 100644 --- a/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/usagersSorter.service.ts +++ b/packages/frontend/src/app/modules/manage-usagers/components/usager-filter/services/usagersSorter.service.ts @@ -51,6 +51,8 @@ function sortBy( asc, } ); + + console.log({ sortAttributes }); return sortAttributes; }, }); diff --git a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.spec.ts b/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.spec.ts deleted file mode 100644 index c699cef994..0000000000 --- a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.spec.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { dataObjectCompare } from "./dataObjectCompare.service"; - -it("dataObjectCompare.compareAttributes", () => { - const I1 = { - cat: 1, - score: 3, - other: 5000, - label: "A1", - }; - const I4 = { - cat: 1, - score: 3, - other: 1000, - label: "A4", - }; - const I3 = { - cat: 1, - score: 4, - other: 1000, - label: "A3", - }; - - expect( - dataObjectCompare.compareObjects(I1, I3, { - attributes: (item) => [ - { - value: item.cat, - }, - ], - }) - ).toEqual(0); - - expect( - dataObjectCompare.compareObjects(I1, I4, { - attributes: (item) => [ - { - value: item.cat, - }, - { - value: item.score, - }, - ], - }) - ).toEqual(0); - - expect( - dataObjectCompare.compareObjects(I1, I4, { - attributes: (item) => [ - { - value: item.cat, - }, - { - value: item.score, - }, - { - value: item.label, - }, - ], - }) - ).toEqual(-1); - - expect( - dataObjectCompare.compareObjects(I1, I3, { - attributes: (item) => [ - { - value: item.cat, - }, - { - value: item.score, - }, - ], - }) - ).toEqual(-1); -}); - -it("dataObjectCompare.objectsEquals", () => { - const I1 = { - cat: 1, - score: 3, - other: 5000, - label: "A1", - }; - const I4 = { - cat: 1, - score: 3, - other: 1000, - label: "A4", - }; - const I3 = { - cat: 1, - score: 4, - other: 1000, - label: "A3", - }; - - expect( - dataObjectCompare.objectsEquals(I1, I3, { - attributes: (item) => [item.cat], - }) - ).toEqual(true); - - expect( - dataObjectCompare.objectsEquals(I1, I3, { - attributes: (item) => [item.cat, item.score], - }) - ).toEqual(false); - - expect( - dataObjectCompare.objectsEquals(I1, I4, { - attributes: (item) => [item.cat, item.score], - }) - ).toEqual(true); - - expect( - dataObjectCompare.objectsEquals(I1, I4, { - attributes: (item) => [item.cat, item.score, item.other], - }) - ).toEqual(false); -}); diff --git a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.ts b/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.ts index 16747e1feb..4e05a14d6a 100644 --- a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.ts +++ b/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataObjectCompare.service.ts @@ -6,107 +6,8 @@ import { SortableAttributeType } from "./SortableAttributeType.type"; export const dataObjectCompare = { buildCompareAttributes, compareComparableObjects, - compareObjects, - objectsEquals, }; -function objectsEquals( - a: T, - b: T, - { - attributes, - }: { - attributes: (item: T) => any[]; - } -): boolean { - return compareObjectsEquals(a, b, { - attributes: (item) => { - const values = item ? attributes(item) : undefined; - if (values) { - return values.map((value) => ({ - value, - })); - } - return undefined; - }, - }); -} - -function compareObjectsEquals( - a: T, - b: T, - { - attributes, - }: { - attributes: (item: T) => SortableAttribute[]; - } -): boolean { - return compareComparableObjectsEquals( - { - item: a, - attributes: buildCompareAttributes(a, attributes), - }, - { - item: b, - attributes: buildCompareAttributes(b, attributes), - } - ); -} - -function compareComparableObjectsEquals( - a: DataComparableObject, - b: DataComparableObject -): boolean { - const nullComparison = dataCompare.compareNullValues(a.item, b.item, {}); - if (nullComparison !== undefined) { - return false; - } - const attrs1 = a.attributes; - const attrs2 = b.attributes; - - return attrs1.reduce((comparison, attr1, i) => { - if (comparison) { - return attr1.value === attrs2[i].value; - } - return comparison; - }, true as boolean); -} - -function compareObjects( - a: T, - b: T, - { - asc, - nullFirst, - attributes, - }: { - attributes: (item: T) => SortableAttribute[]; - asc?: boolean; - nullFirst?: boolean; - } -): DataComparisonResult { - const globalAsc = asc !== false; - - if (nullFirst === undefined) { - nullFirst = false; - } - - return compareComparableObjects( - { - item: a, - attributes: buildCompareAttributes(a, attributes), - }, - { - item: b, - attributes: buildCompareAttributes(b, attributes), - }, - { - nullFirst, - globalAsc, - } - ); -} - export type DataComparableObjectAttribute = { value: any; asc: boolean; diff --git a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.spec.ts b/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.spec.ts index 3e86b2b9f8..6a64f10641 100644 --- a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.spec.ts +++ b/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.spec.ts @@ -1,74 +1,5 @@ import { dataSorter } from "./dataSorter.service"; -it("dataSorter.sortSingle", () => { - const I1 = { - id: 1, - name: "item 1", - }; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const I4: any = { - id: null, - name: "Item 4", - }; - const I3 = { - id: 3, - name: "3rd item", - }; - const I2 = { - id: 2, - name: "Item 2", - }; - expect( - dataSorter.sortSingle([I1, I4, I2, I3], { - asc: true, - nullFirst: true, - getSortAttribute: (item) => ({ - value: item.id, - }), - }) - ).toEqual([I4, I1, I2, I3]); - - expect( - dataSorter.sortSingle([I1, I4, I2, I3], { - asc: true, - nullFirst: false, - getSortAttribute: (item) => ({ - value: item.id, - }), - }) - ).toEqual([I1, I2, I3, I4]); - - expect( - dataSorter.sortSingle([I1, I4, I2, I3], { - asc: false, - nullFirst: true, - getSortAttribute: (item) => ({ - value: item.id, - }), - }) - ).toEqual([I4, I3, I2, I1]); - - expect( - dataSorter.sortSingle([I1, I4, I2, I3], { - asc: false, - nullFirst: false, - getSortAttribute: (item) => ({ - value: item.id, - }), - }) - ).toEqual([I3, I2, I1, I4]); - - expect( - dataSorter.sortSingle([I1, I4, I2, I3], { - asc: true, - nullFirst: false, - getSortAttribute: (item) => ({ - value: item.name ? item.name.toUpperCase() : undefined, - }), - }) - ).toEqual([I3, I1, I2, I4]); -}); - it("dataSorter.sortMultiple", () => { const I1 = { cat: 1, diff --git a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.ts b/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.ts index 6431623ddd..6c97c5e142 100644 --- a/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.ts +++ b/packages/frontend/src/app/modules/manage-usagers/utils/sorter/dataSorter.service.ts @@ -3,12 +3,9 @@ import { dataObjectCompare, } from "./dataObjectCompare.service"; import { SortableAttribute } from "./SortableAttribute.type"; -import { SortableAttributeType } from "./SortableAttributeType.type"; export const dataSorter = { - sortSingle, sortMultiple, - sortByAttributes, }; function sortMultiple( @@ -42,47 +39,3 @@ function sortMultiple( ) .map((x) => x.item); } - -function sortSingle( - items: T[], - { - asc, - nullFirst, - getSortAttribute, - }: { - getSortAttribute: (item: T) => SortableAttribute; - asc?: boolean; - nullFirst?: boolean; - } -): T[] { - return sortMultiple(items, { - getSortAttributes: (item: T) => [getSortAttribute(item)], - asc, - nullFirst, - }); -} - -function sortByAttributes( - items: T[], - attributes: { name: string; type?: SortableAttributeType }[], - { - asc, - nullFirst, - }: { - asc?: boolean; - nullFirst?: boolean; - } -): T[] { - return sortMultiple(items, { - getSortAttributes: (item: T) => { - const sortAttributes = attributes.map((attr) => ({ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - value: (item as any)[attr.name], - type: attr.type, - })); - return sortAttributes; - }, - asc, - nullFirst, - }); -}