Skip to content
Snippets Groups Projects
Commit 43ea2878 authored by François Agneray's avatar François Agneray
Browse files

#82 => WIP

parent ec6570b7
No related branches found
No related tags found
2 merge requests!72Develop,!67Resolve "Validation automatique des criteria"
Showing
with 62 additions and 3 deletions
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
[criterion]="getCriterion(attribute.id)" [criterion]="getCriterion(attribute.id)"
[criteriaList]="criteriaList" [criteriaList]="criteriaList"
(addCriterion)="emitAdd($event)" (addCriterion)="emitAdd($event)"
(updateCriterion)="emitUpdate($event)"
(deleteCriterion)="emitDelete($event)"> (deleteCriterion)="emitDelete($event)">
</app-criterion> </app-criterion>
</div> </div>
...@@ -25,6 +25,7 @@ export class CriteriaByFamilyComponent { ...@@ -25,6 +25,7 @@ export class CriteriaByFamilyComponent {
@Input() attributeList: Attribute[]; @Input() attributeList: Attribute[];
@Input() criteriaList: Criterion[]; @Input() criteriaList: Criterion[];
@Output() addCriterion: EventEmitter<Criterion> = new EventEmitter(); @Output() addCriterion: EventEmitter<Criterion> = new EventEmitter();
@Output() updateCriterion: EventEmitter<Criterion> = new EventEmitter();
@Output() deleteCriterion: EventEmitter<number> = new EventEmitter(); @Output() deleteCriterion: EventEmitter<number> = new EventEmitter();
/** /**
...@@ -60,6 +61,17 @@ export class CriteriaByFamilyComponent { ...@@ -60,6 +61,17 @@ export class CriteriaByFamilyComponent {
this.addCriterion.emit(criterion); this.addCriterion.emit(criterion);
} }
/**
* Emits event to update the given criterion to the criteria list.
*
* @param {Criterion} updatedCriterion - The updated criterion.
*
* @fires EventEmitter<Criterion>
*/
emitUpdate(updatedCriterion: Criterion): void {
this.updateCriterion.emit(updatedCriterion);
}
/** /**
* Emits event to remove the given criterion ID from the criteria list. * Emits event to remove the given criterion ID from the criteria list.
* *
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
[attributeList]="attributeList | attributeListByFamily:family.id" [attributeList]="attributeList | attributeListByFamily:family.id"
[criteriaList]="criteriaList" [criteriaList]="criteriaList"
(addCriterion)="emitAdd($event)" (addCriterion)="emitAdd($event)"
(updateCriterion)="emitUpdate($event)"
(deleteCriterion)="emitDelete($event)"> (deleteCriterion)="emitDelete($event)">
</app-criteria-by-family> </app-criteria-by-family>
</accordion-group> </accordion-group>
......
...@@ -26,6 +26,7 @@ export class CriteriaTabsComponent { ...@@ -26,6 +26,7 @@ export class CriteriaTabsComponent {
@Input() criteriaFamilyList: CriteriaFamily[]; @Input() criteriaFamilyList: CriteriaFamily[];
@Input() criteriaList: Criterion[]; @Input() criteriaList: Criterion[];
@Output() addCriterion: EventEmitter<Criterion> = new EventEmitter(); @Output() addCriterion: EventEmitter<Criterion> = new EventEmitter();
@Output() updateCriterion: EventEmitter<Criterion> = new EventEmitter();
@Output() deleteCriterion: EventEmitter<number> = new EventEmitter(); @Output() deleteCriterion: EventEmitter<number> = new EventEmitter();
/** /**
...@@ -39,6 +40,17 @@ export class CriteriaTabsComponent { ...@@ -39,6 +40,17 @@ export class CriteriaTabsComponent {
this.addCriterion.emit(criterion); this.addCriterion.emit(criterion);
} }
/**
* Emits event to update the given criterion to the criteria list.
*
* @param {Criterion} updatedCriterion - The updated criterion.
*
* @fires EventEmitter<Criterion>
*/
emitUpdate(updatedCriterion: Criterion): void {
this.updateCriterion.emit(updatedCriterion);
}
/** /**
* Emits event to remove the given criterion ID to the criteria list. * Emits event to remove the given criterion ID to the criteria list.
* *
......
...@@ -22,6 +22,7 @@ export class CriterionComponent implements OnInit, OnChanges { ...@@ -22,6 +22,7 @@ export class CriterionComponent implements OnInit, OnChanges {
@Input() criterion: Criterion; @Input() criterion: Criterion;
@Input() criteriaList: Criterion[]; @Input() criteriaList: Criterion[];
@Output() addCriterion: EventEmitter<Criterion> = new EventEmitter(); @Output() addCriterion: EventEmitter<Criterion> = new EventEmitter();
@Output() updateCriterion: EventEmitter<Criterion> = new EventEmitter();
@Output() deleteCriterion: EventEmitter<number> = new EventEmitter(); @Output() deleteCriterion: EventEmitter<number> = new EventEmitter();
@ViewChild(SearchTypeLoaderDirective, {static: true}) SearchTypeLoaderDirective!: SearchTypeLoaderDirective; @ViewChild(SearchTypeLoaderDirective, {static: true}) SearchTypeLoaderDirective!: SearchTypeLoaderDirective;
...@@ -30,12 +31,14 @@ export class CriterionComponent implements OnInit, OnChanges { ...@@ -30,12 +31,14 @@ export class CriterionComponent implements OnInit, OnChanges {
ngOnInit() { ngOnInit() {
const viewContainerRef = this.SearchTypeLoaderDirective.viewContainerRef; const viewContainerRef = this.SearchTypeLoaderDirective.viewContainerRef;
viewContainerRef.clear();
const componentRef = viewContainerRef.createComponent<AbstractSearchTypeComponent>( const componentRef = viewContainerRef.createComponent<AbstractSearchTypeComponent>(
getSearchTypeComponent(this.attribute.search_type) getSearchTypeComponent(this.attribute.search_type)
); );
componentRef.instance.setAttribute(this.attribute); componentRef.instance.setAttribute(this.attribute);
componentRef.instance.setCriterion(this.criterion); componentRef.instance.setCriterion(this.criterion);
componentRef.instance.setCriteriaList(this.criteriaList); componentRef.instance.setCriteriaList(this.criteriaList);
componentRef.instance.emitAdd.subscribe(() => this.emitAdd());
this.searchTypeComponent = componentRef.instance; this.searchTypeComponent = componentRef.instance;
} }
...@@ -65,6 +68,10 @@ export class CriterionComponent implements OnInit, OnChanges { ...@@ -65,6 +68,10 @@ export class CriterionComponent implements OnInit, OnChanges {
} else { } else {
criterion = this.searchTypeComponent.getCriterion(); criterion = this.searchTypeComponent.getCriterion();
} }
this.addCriterion.emit(criterion); if (this.criteriaList.find(c => c.id === criterion.id)) {
this.updateCriterion.emit(criterion);
} else {
this.addCriterion.emit(criterion);
}
} }
} }
...@@ -7,17 +7,19 @@ ...@@ -7,17 +7,19 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
import { Directive } from '@angular/core'; import { Directive, Output, EventEmitter, OnInit } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms'; import { UntypedFormGroup } from '@angular/forms';
import { Attribute } from 'src/app/metamodel/models'; import { Attribute } from 'src/app/metamodel/models';
import { Criterion } from 'src/app/instance/store/models'; import { Criterion } from 'src/app/instance/store/models';
import { searchTypeOperators } from 'src/app/shared/utils'; import { searchTypeOperators } from 'src/app/shared/utils';
import { debounceTime, distinctUntilChanged } from 'rxjs';
@Directive() @Directive()
export abstract class AbstractSearchTypeComponent { export abstract class AbstractSearchTypeComponent implements OnInit {
attribute: Attribute; attribute: Attribute;
criteriaList: Criterion[]; criteriaList: Criterion[];
emitAdd: EventEmitter<{}> = new EventEmitter<{}>();
form: UntypedFormGroup; form: UntypedFormGroup;
operators = searchTypeOperators; operators = searchTypeOperators;
...@@ -25,6 +27,13 @@ export abstract class AbstractSearchTypeComponent { ...@@ -25,6 +27,13 @@ export abstract class AbstractSearchTypeComponent {
constructor() { } constructor() { }
ngOnInit() {
this.form.valueChanges.pipe(
debounceTime(1000)
)
.subscribe(() => (this.form.valid) ? this.emitAdd.emit() : null);
}
setAttribute(attribute: Attribute) { setAttribute(attribute: Attribute) {
this.attribute = attribute; this.attribute = attribute;
} }
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
[criteriaFamilyList]="criteriaFamilyList | async" [criteriaFamilyList]="criteriaFamilyList | async"
[criteriaList]="criteriaList | async" [criteriaList]="criteriaList | async"
(addCriterion)="addCriterion($event)" (addCriterion)="addCriterion($event)"
(updateCriterion)="updateCriterion($event)"
(deleteCriterion)="deleteCriterion($event)"> (deleteCriterion)="deleteCriterion($event)">
</app-criteria-tabs> </app-criteria-tabs>
</div> </div>
......
...@@ -71,6 +71,15 @@ export class CriteriaComponent extends AbstractSearchComponent { ...@@ -71,6 +71,15 @@ export class CriteriaComponent extends AbstractSearchComponent {
this.store.dispatch(searchActions.addCriterion({ criterion })); this.store.dispatch(searchActions.addCriterion({ criterion }));
} }
/**
* Dispatches action to update the given criterion to the search.
*
* @param {Criterion} updatedCriterion - The updated criterion.
*/
updateCriterion(updatedCriterion: Criterion): void {
this.store.dispatch(searchActions.updateCriterion({ updatedCriterion }))
}
/** /**
* Dispatches action to remove the given criterion ID to the search. * Dispatches action to remove the given criterion ID to the search.
* *
......
...@@ -24,6 +24,7 @@ export const checkOutput = createAction('[Search] Check Output'); ...@@ -24,6 +24,7 @@ export const checkOutput = createAction('[Search] Check Output');
export const checkResult = createAction('[Search] Check Result'); export const checkResult = createAction('[Search] Check Result');
export const updateCriteriaList = createAction('[Search] Update Criteria List', props<{ criteriaList: Criterion[] }>()); export const updateCriteriaList = createAction('[Search] Update Criteria List', props<{ criteriaList: Criterion[] }>());
export const addCriterion = createAction('[Search] Add Criterion', props<{ criterion: Criterion }>()); export const addCriterion = createAction('[Search] Add Criterion', props<{ criterion: Criterion }>());
export const updateCriterion = createAction('[Search] Update Criterion', props<{ updatedCriterion: Criterion }>());
export const deleteCriterion = createAction('[Search] Delete Criterion', props<{ idCriterion: number }>()); export const deleteCriterion = createAction('[Search] Delete Criterion', props<{ idCriterion: number }>());
export const updateOutputList = createAction('[Search] Update Output List', props<{ outputList: number[] }>()); export const updateOutputList = createAction('[Search] Update Output List', props<{ outputList: number[] }>());
export const retrieveDataLength = createAction('[Search] Retrieve Data Length'); export const retrieveDataLength = createAction('[Search] Retrieve Data Length');
......
...@@ -93,6 +93,12 @@ export const searchReducer = createReducer( ...@@ -93,6 +93,12 @@ export const searchReducer = createReducer(
...state, ...state,
criteriaList: [...state.criteriaList, criterion] criteriaList: [...state.criteriaList, criterion]
})), })),
on(searchActions.updateCriterion, (state, { updatedCriterion }) => ({
...state,
criteriaList: state.criteriaList.map(
criterion => (criterion.id === updatedCriterion.id) ? updatedCriterion : criterion
)
})),
on(searchActions.deleteCriterion, (state, { idCriterion }) => ({ on(searchActions.deleteCriterion, (state, { idCriterion }) => ({
...state, ...state,
criteriaList: [...state.criteriaList.filter(c => c.id !== idCriterion)] criteriaList: [...state.criteriaList.filter(c => c.id !== idCriterion)]
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment