Skip to content

Commit

Permalink
RI-136: ajoute un composant de filtre au tableau des compagnies
Browse files Browse the repository at this point in the history
* problème de pagination
* problème au niveau des tests
  • Loading branch information
nekorpeche committed Nov 15, 2021
1 parent 155216b commit 2bd11ad
Show file tree
Hide file tree
Showing 12 changed files with 88 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ public ResponseEntity<Page<CompanyDto>> getAllByCriteria(
@RequestParam(value = "rows", defaultValue = "10") int rows,
@RequestParam(value = "sortBy", defaultValue = "id") String sortBy,
@RequestParam(value = "sortOrder", defaultValue = "ASC") String sortOrder,
@RequestParam(value = "name", defaultValue = "") String name
@RequestParam(value = "keyword", defaultValue = "") String keyword
) {
Pageable pageable = PageRequest.of(page, rows, Sort.by(Sort.Direction.valueOf(sortOrder), sortBy));
Page<CompanyDto> companyDtos = companyService.findAllWithCriteria(pageable, name);
Page<CompanyDto> companyDtos = companyService.findAllWithCriteria(pageable, keyword);
return ResponseEntity.ok(companyDtos);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
public interface CompanyRepositoryCustom {
/**
* @param pageable l'objet de pagination
* @param name la chaîne de caractère à rechercher dans les champs name, description
* @param keyword la chaîne de caractère à rechercher dans les champs keyword, description
* @return la liste de résultats paginée des Company correspondant aux critères
*/
Page<Company> findAllWithCriteria(final Pageable pageable, final String name);
Page<Company> findAllWithCriteria(final Pageable pageable, final String keyword);

}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class CompanyRepositoryImpl implements CompanyRepositoryCustom {
private final EntityManager entityManager;

@Override
public Page<Company> findAllWithCriteria(Pageable pageable, String name) {
public Page<Company> findAllWithCriteria(Pageable pageable, String keyword) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Company> query = criteriaBuilder.createQuery(Company.class);
Root<Company> queryRoot = query.from(Company.class);
Expand All @@ -34,10 +34,10 @@ public Page<Company> findAllWithCriteria(Pageable pageable, String name) {
}

// recherche par mot clé dans le nom et description
if (StringUtils.isNotEmpty(name)) {
name = "%" + name + "%";
Predicate namePredicate = criteriaBuilder.like(queryRoot.get("name"), name);
Predicate descriptionPredicate = criteriaBuilder.like(queryRoot.get("description"), name);
if (StringUtils.isNotEmpty(keyword)) {
keyword = "%" + keyword + "%";
Predicate namePredicate = criteriaBuilder.like(queryRoot.get("name"), keyword);
Predicate descriptionPredicate = criteriaBuilder.like(queryRoot.get("description"), keyword);
predicates.add(criteriaBuilder.or(namePredicate, descriptionPredicate));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public Page<CompanyDto> getAll(Pageable pageable) {
.map(companyAdapter::toDto);
}

public Page<CompanyDto> findAllWithCriteria(Pageable pageable, String name) {
return companyRepository.findAllWithCriteria(pageable, name)
public Page<CompanyDto> findAllWithCriteria(Pageable pageable, String keyword) {
return companyRepository.findAllWithCriteria(pageable, keyword)
.map(companyAdapter::toDto);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import java.util.List;

import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.times;
Expand All @@ -38,8 +39,9 @@ class CompanyControllerTest extends ControllerIntegrationTestBase {
@BeforeEach
protected void setUp() {
companyDtos = Arrays.asList(
CompanyDto.builder().id(1L).description("description").name("Idemia").logo("logo").url("url").build(),
CompanyDto.builder().id(2L).description("description2").name("SG").logo("logo2").url("url2").build());
CompanyDto.builder().id(1L).description("Société").name("Idemia").logo("logo").url("url").build(),
CompanyDto.builder().id(2L).description("description2").name("Société générale").logo("logo2").url("url2").build());

}

@WithMockUser
Expand Down Expand Up @@ -68,6 +70,36 @@ void getCompanysListShouldListAllCompanies() throws Exception {
verify(companyService, times(1)).getAll(any());
}

@WithMockUser
@Test
void getCompanysListShouldListAllCompaniesByCriteria() throws Exception {
//given
Page<CompanyDto> companyDtoPage = new PageImpl<>(companyDtos);

//when
// test des données de pagination
given(companyService.findAllWithCriteria(DEFAULT_PAGEABLE, "société")).willReturn(companyDtoPage);
ResultActions actions = mvc.perform(get(BASE_URI).contentType(APPLICATION_JSON));

//then
actions.andDo(print())
.andExpect(status().isOk());

// test des propriétés de chaque éléments de la liste reçue
for (int i = 0; i < companyDtos.size(); i++) {
final String contentPath = String.format("$.content[%d]", i);
actions.andExpect(jsonPath(contentPath + ".id", is(Math.toIntExact(companyDtos.get(i).getId()))))
.andExpect(jsonPath(contentPath + ".description", is(companyDtos.get(i).getDescription())))
.andExpect(jsonPath(contentPath + ".name", is(companyDtos.get(i).getName())))
.andExpect(jsonPath(contentPath + ".logo", is(companyDtos.get(i).getLogo())))
.andExpect(jsonPath(contentPath + ".url", is(companyDtos.get(i).getUrl())));
assertTrue(companyDtos.get(i).getName().contains("Société") || companyDtos.get(i).getDescription().contains("Société"));

}

verify(companyService, times(1)).getAll(any());
}

@Test
void getAllWithoutJwtShouldBeForbidden() throws Exception {
mvc.perform(get(BASE_URI).contentType(APPLICATION_JSON)).andDo(print())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export class CompaniesTableComponent implements OnInit {
this.pageable.totalElements = data.totalElements;
this.pageable.content = data.content;
},
() => this.toastService.error('Oops', 'Une erreur est survenue lors de la récupération de la liste des offres')
() => this.toastService.error('Oops', 'Une erreur est survenue lors de la récupération de la liste des compagnies')
);
}

Expand All @@ -88,9 +88,14 @@ export class CompaniesTableComponent implements OnInit {
this.filterService.setFilter(this.criteria);
}

/**
* méthode qui ajoute les paramètres de l'url dans la variable correspondante
* la variable correspond à un critère de recherche ou à la pagination
* @private
*/
private async getFilterFromQueryParams(): Promise<void> {
// TODO: voir si y'a un moyen plus élégant avec typeof
const filterKeys = ['name'];
const filterKeys = ['keyword'];
const pageableKeys = ['rows', 'page', 'sortOrder', 'sortBy'];
return new Promise(resolve => {
this.route
Expand Down
17 changes: 14 additions & 3 deletions frontend-implicaction/src/app/company/enums/company-sort.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,18 @@ export enum CompanySortEnumCode {
* Représente les différents paramètres de tri des jobs
*/
export class CompanySortEnum extends EnumCodeLabelAbstract<CompanySortEnumCode> {
static readonly NAME_DESC = new CompanySortEnum(CompanySortEnumCode.NAME_DESC, 'Trier par ordre décroissant de l\'alphabet', 'name', SortDirectionEnum.DESC);
static readonly NAME_ASC = new CompanySortEnum(CompanySortEnumCode.NAME_ASC, 'Trier par ordre alphabétique ', 'name', SortDirectionEnum.ASC);
static readonly NAME_DESC = new CompanySortEnum(
CompanySortEnumCode.NAME_DESC,
'Trier par ordre décroissant de l\'alphabet',
'name',
SortDirectionEnum.DESC
);
static readonly NAME_ASC = new CompanySortEnum(
CompanySortEnumCode.NAME_ASC,
'Trier par ordre alphabétique ',
'name',
SortDirectionEnum.ASC
);

/**
* @param code code associé à la constante de tri
Expand All @@ -23,7 +33,8 @@ export class CompanySortEnum extends EnumCodeLabelAbstract<CompanySortEnumCode>
readonly code: CompanySortEnumCode,
readonly label: string,
readonly sortBy: string,
readonly sortDirection: SortDirectionEnum) {
readonly sortDirection: SortDirectionEnum
) {
super(code, label);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,17 @@ export class ApiEndpointsService {
});
}

private concatCriterias(criteria: CompanyCriteriaFilter, pageable: Pageable<any>) {
const objectParam = {
...criteria,
rows: pageable.rows,
page: pageable.page,
sortBy: pageable.sortBy,
sortOrder: pageable.sortOrder
};
return objectParam;
}

/**
* Auth
*/
Expand Down Expand Up @@ -229,18 +240,12 @@ export class ApiEndpointsService {
*/
getAllCompanyByCriteriaEndpoint(pageable: Pageable, criteria: CompanyCriteriaFilter): string {
// on merge les filtres et les attributs de pagination
const objectParam = {
...criteria,
rows: pageable.rows,
page: pageable.page,
sortBy: pageable.sortBy,
sortOrder: pageable.sortOrder
};
const objectParam = this.concatCriterias(criteria, pageable);
return ApiEndpointsService.createUrlWithQueryParameters(
Uris.COMPANIES.BASE_URI,
(qs: QueryStringParameters) => {
this.buildQueryStringFromFilters(objectParam, qs);
});
(qs: QueryStringParameters) =>
this.buildQueryStringFromFilters(objectParam, qs)
);
}

getAllCompanyEndpoint(pageable: Pageable): string {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export interface CompanyCriteriaFilter {
name?: string;
keyword?: string;
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<div class="d-flex flex-column flex-sm-row flex-lg-column me-3">
<div class="col-12 col-sm-6 col-lg-11 me-1">
<div class="mb-3">
<label class="form-label text-dark fw-bold" for="nameInput">Nom de la compagnie</label>
<label class="form-label text-dark fw-bold" for="nameInput">Rechercher</label>
<input
(keyup)="onNameChange(name.value)"
(keyup.enter)="onKeywordChange(keyword.value)"
class="form-control"
id="nameInput"
placeholder="Nom..."
#name>
#keyword>
</div>
<div class="mb-3">
<label class="form-label text-dark fw-bold" for="exampleFormControlInput1">Secteur d'activité</label>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ export class CompanyFilterComponent implements OnInit {
.subscribe(criteria => this.criteria = criteria);
}

onNameChange(name: string): void {
this.criteria.name = name;
onKeywordChange(keyword: string): void {
this.criteria.keyword = keyword;
this.filterContextService.setFilter(this.criteria);
}
}
2 changes: 1 addition & 1 deletion frontend-implicaction/src/app/shared/shared.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ import {BaseWithPaginationComponent} from './components/base-with-pagination-com
ContractTypeComponent,
DateTimelapseComponent,
JobFilterComponent,
CompanyFilterComponent
BaseWithPaginationComponent,
CompanyFilterComponent
],
exports: [
HeaderComponent,
Expand Down

0 comments on commit 2bd11ad

Please sign in to comment.