diff --git a/client/src/app/instance/search/components/criteria/search-type/between-date.component.ts b/client/src/app/instance/search/components/criteria/search-type/between-date.component.ts index 2706a27eef6f55c9dff0053da83dc3bdaee10f29..0ac5dfb12cb78071057551d4b993910c557ebbff 100644 --- a/client/src/app/instance/search/components/criteria/search-type/between-date.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/between-date.component.ts @@ -11,7 +11,7 @@ import { Component } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; import { AbstractSearchTypeComponent } from './abstract-search-type.component'; -import { Criterion, BetweenCriterion } from 'src/app/instance/store/models'; +import { Criterion, BetweenCriterion, FieldCriterion } from 'src/app/instance/store/models'; @Component({ selector: 'app-between-date', @@ -36,11 +36,17 @@ export class BetweenDateComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion) { super.setCriterion(criterion); if (criterion) { - const betweenCriterion = criterion as BetweenCriterion; - this.form.controls.dateRange.setValue([ - new Date(betweenCriterion.min), - new Date(betweenCriterion.max) - ]); + if (criterion.type === 'between') { + const betweenCriterion = criterion as BetweenCriterion; + this.form.controls.dateRange.setValue([ + new Date(betweenCriterion.min), + new Date(betweenCriterion.max) + ]); + this.form.controls.label.setValue('bw'); + } else { + const fieldCriterion = criterion as FieldCriterion; + this.form.controls.label.setValue(fieldCriterion.operator); + } } else { this.form.controls.label.setValue('bw'); } @@ -81,6 +87,7 @@ export class BetweenDateComponent extends AbstractSearchTypeComponent { this.nullOrNotNull = this.form.controls.label.value; this.form.controls.dateRange.disable(); } else { + this.nullOrNotNull = ''; this.form.controls.dateRange.enable(); } } diff --git a/client/src/app/instance/search/components/criteria/search-type/between.component.ts b/client/src/app/instance/search/components/criteria/search-type/between.component.ts index 0aeeb599b2f5c71978cc70aceb221fe837fccd58..61e5084796b210c648b5f9484c988c633f6f3ae7 100644 --- a/client/src/app/instance/search/components/criteria/search-type/between.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/between.component.ts @@ -11,7 +11,7 @@ import { Component } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; import { AbstractSearchTypeComponent } from './abstract-search-type.component'; -import { Criterion, BetweenCriterion } from 'src/app/instance/store/models'; +import { Criterion, BetweenCriterion, FieldCriterion } from 'src/app/instance/store/models'; @Component({ selector: 'app-between', @@ -35,7 +35,14 @@ export class BetweenComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion): void { super.setCriterion(criterion); - if (!criterion) { + if (criterion) { + if (criterion.type === 'between') { + this.form.controls.label.setValue('bw'); + } else { + const fieldCriterion = criterion as FieldCriterion; + this.form.controls.label.setValue(fieldCriterion.operator); + } + } else { this.form.controls.label.setValue('bw'); } } @@ -89,6 +96,7 @@ export class BetweenComponent extends AbstractSearchTypeComponent { this.form.controls.min.disable(); this.form.controls.max.disable(); } else { + this.nullOrNotNull = ''; this.form.controls.max.enable(); this.form.controls.min.enable(); } diff --git a/client/src/app/instance/search/components/criteria/search-type/checkbox.component.ts b/client/src/app/instance/search/components/criteria/search-type/checkbox.component.ts index 9fe0de55dbb9ff23c08073c4c204cb71b3bda6e7..5d334eb9d2655fb8c21e8a6674b1f71b246574be 100644 --- a/client/src/app/instance/search/components/criteria/search-type/checkbox.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/checkbox.component.ts @@ -11,7 +11,7 @@ import { Component } from '@angular/core'; import { FormGroup, FormControl, FormArray } from '@angular/forms'; import { AbstractSearchTypeComponent } from './abstract-search-type.component'; -import { Criterion, SelectMultipleCriterion } from 'src/app/instance/store/models'; +import { Criterion, SelectMultipleCriterion, FieldCriterion } from 'src/app/instance/store/models'; import { Attribute } from 'src/app/metamodel/models'; @Component({ @@ -47,10 +47,16 @@ export class CheckboxComponent extends AbstractSearchTypeComponent { super.setCriterion(criterion); if (criterion) { - for (let i = 0; i < this.attribute.options.length; i++) { - if ((criterion as SelectMultipleCriterion).options.find(o => o.label === this.attribute.options[i].label)) { - this.getCheckboxes().controls[i].setValue(true); + if (criterion.type === 'multiple') { + for (let i = 0; i < this.attribute.options.length; i++) { + if ((criterion as SelectMultipleCriterion).options.find(o => o.label === this.attribute.options[i].label)) { + this.getCheckboxes().controls[i].setValue(true); + } } + this.form.controls.label.setValue('in'); + } else { + const fieldCriterion = criterion as FieldCriterion; + this.form.controls.label.setValue(fieldCriterion.operator); } } else { this.form.controls.label.setValue('in'); @@ -105,6 +111,7 @@ export class CheckboxComponent extends AbstractSearchTypeComponent { value.disable(); }); } else { + this.nullOrNotNull = ''; this.getCheckboxes().controls.map((value, index) => { value.enable(); }); diff --git a/client/src/app/instance/search/components/criteria/search-type/date.component.ts b/client/src/app/instance/search/components/criteria/search-type/date.component.ts index 9a5ea5681bc81efd3466bfbec95989ada1ad5a1f..11abc84c727adaa93ddd3d916671e5b683353785 100644 --- a/client/src/app/instance/search/components/criteria/search-type/date.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/date.component.ts @@ -30,7 +30,10 @@ export class DateComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion) { super.setCriterion(criterion); if (criterion) { - this.form.controls.date.setValue(new Date((criterion as FieldCriterion).value)); + const fieldCriterion = criterion as FieldCriterion; + if (fieldCriterion.value) { + this.form.controls.date.setValue(new Date(fieldCriterion.value)); + } } else { this.form.controls.operator.setValue(this.attribute.operator); if (!this.attribute.dynamic_operator) { diff --git a/client/src/app/instance/search/components/criteria/search-type/json.component.ts b/client/src/app/instance/search/components/criteria/search-type/json.component.ts index 1399230f55a9e7be55ae4c6646103dd52c04641b..bb4346ee9cbba811f50ec5d0622e82d8fe1b7eaf 100644 --- a/client/src/app/instance/search/components/criteria/search-type/json.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/json.component.ts @@ -11,7 +11,7 @@ import { Component } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; import { AbstractSearchTypeComponent } from './abstract-search-type.component'; -import { Criterion, JsonCriterion } from 'src/app/instance/store/models'; +import { Criterion, JsonCriterion, FieldCriterion } from 'src/app/instance/store/models'; @Component({ selector: 'app-json', @@ -36,7 +36,15 @@ export class JsonComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion) { super.setCriterion(criterion); - if (!criterion) { + if (criterion) { + if (criterion.type === 'json') { + this.form.controls.label.setValue('js'); + } else { + const fieldCriterion = criterion as FieldCriterion; + this.form.controls.label.setValue(fieldCriterion.operator); + this.form.controls.operator.setValue(''); + } + } else { this.form.controls.label.setValue('js'); } } @@ -61,6 +69,7 @@ export class JsonComponent extends AbstractSearchTypeComponent { this.form.controls.path.disable(); this.form.controls.value.disable(); } else { + this.nullOrNotNull = ''; this.form.controls.operator.enable(); this.form.controls.path.enable(); this.form.controls.value.enable(); diff --git a/client/src/app/instance/search/components/criteria/search-type/list.component.ts b/client/src/app/instance/search/components/criteria/search-type/list.component.ts index 4383525e3153cc0f1b8132c701f19ee28d526f82..3970c7a12d841380e2f2d208eb0f5874d2db7809 100644 --- a/client/src/app/instance/search/components/criteria/search-type/list.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/list.component.ts @@ -11,7 +11,7 @@ import { Component } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; import { AbstractSearchTypeComponent } from './abstract-search-type.component'; -import { Criterion, ListCriterion } from 'src/app/instance/store/models'; +import { Criterion, ListCriterion, FieldCriterion } from 'src/app/instance/store/models'; @Component({ selector: 'app-list', @@ -35,8 +35,14 @@ export class ListComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion) { super.setCriterion(criterion); if (criterion) { - this.form.controls.list.setValue((criterion as ListCriterion).values.join('\n')); - this.form.disable(); + if (criterion.type === 'list') { + const listCriterion = criterion as ListCriterion; + this.form.controls.list.setValue(listCriterion.values.join('\n')); + this.form.controls.label.setValue('in'); + } else { + const fieldCriterion = criterion as FieldCriterion; + this.form.controls.label.setValue(fieldCriterion.operator); + } } else { this.form.controls.label.setValue('in'); } @@ -73,6 +79,7 @@ export class ListComponent extends AbstractSearchTypeComponent { this.nullOrNotNull = this.form.controls.label.value; this.form.controls.list.disable(); } else { + this.nullOrNotNull = ''; this.form.controls.list.enable(); } } diff --git a/client/src/app/instance/search/components/criteria/search-type/select-multiple.component.ts b/client/src/app/instance/search/components/criteria/search-type/select-multiple.component.ts index e514d0866d819176ccddf2177b8f31a93dfb2e93..87a4cd579fb0c5e72db804e803a68d9281e281c6 100644 --- a/client/src/app/instance/search/components/criteria/search-type/select-multiple.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/select-multiple.component.ts @@ -11,7 +11,7 @@ import { Component } from '@angular/core'; import { FormGroup, FormControl, Validators } from '@angular/forms'; import { AbstractSearchTypeComponent } from './abstract-search-type.component'; -import { Criterion, SelectMultipleCriterion } from 'src/app/instance/store/models'; +import { Criterion, SelectMultipleCriterion, FieldCriterion } from 'src/app/instance/store/models'; @Component({ selector: 'app-select-multiple', @@ -35,9 +35,15 @@ export class SelectMultipleComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion) { super.setCriterion(criterion); if (criterion) { - const multipleCriterion = criterion as SelectMultipleCriterion; - const values = multipleCriterion.options.map(option => option.value); - this.form.controls.select.setValue(values); + if (criterion.type === 'multiple') { + const multipleCriterion = criterion as SelectMultipleCriterion; + const values = multipleCriterion.options.map(option => option.value); + this.form.controls.select.setValue(values); + this.form.controls.label.setValue('in'); + } else { + const fieldCriterion = criterion as FieldCriterion; + this.form.controls.label.setValue(fieldCriterion.operator); + } } else { this.form.controls.label.setValue('in'); } @@ -64,6 +70,7 @@ export class SelectMultipleComponent extends AbstractSearchTypeComponent { this.nullOrNotNull = this.form.controls.label.value; this.form.controls.select.disable(); } else { + this.nullOrNotNull = ''; this.form.controls.select.enable(); } } diff --git a/client/src/app/instance/search/components/criteria/search-type/select.component.ts b/client/src/app/instance/search/components/criteria/search-type/select.component.ts index 28b826350c29372bab5382873104ce2577c2d380..8f09d00889d7ae594d31b80530ef12cb49da6ff0 100644 --- a/client/src/app/instance/search/components/criteria/search-type/select.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/select.component.ts @@ -29,7 +29,9 @@ export class SelectComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion) { super.setCriterion(criterion); - if (!criterion) { + if (criterion) { + this.form.controls.select.setValue((criterion as FieldCriterion).value); + } else { this.form.controls.operator.setValue(this.attribute.operator); if (!this.attribute.dynamic_operator) { this.operators = searchTypeOperators.filter( diff --git a/client/src/app/instance/search/components/criteria/search-type/svom-json-kw.component.ts b/client/src/app/instance/search/components/criteria/search-type/svom-json-kw.component.ts index 399e1ef28792dee37467b247f434c18b51b12fef..dfc22ca583c4edeabb77563ca35e4b04ec6bf035 100644 --- a/client/src/app/instance/search/components/criteria/search-type/svom-json-kw.component.ts +++ b/client/src/app/instance/search/components/criteria/search-type/svom-json-kw.component.ts @@ -41,7 +41,15 @@ export class SvomJsonKwComponent extends AbstractSearchTypeComponent { setCriterion(criterion: Criterion) { super.setCriterion(criterion); - if (!criterion) { + if (criterion) { + if (criterion.type === 'json') { + this.form.controls.label.setValue('js'); + } else { + const fieldCriterion = criterion as FieldCriterion; + this.form.controls.label.setValue(fieldCriterion.operator); + this.form.controls.operator.setValue(''); + } + } else { this.form.controls.label.setValue('js'); } } @@ -93,6 +101,7 @@ export class SvomJsonKwComponent extends AbstractSearchTypeComponent { this.form.controls.path.disable(); this.form.controls.value.disable(); } else { + this.nullOrNotNull = ''; this.form.controls.operator.enable(); this.form.controls.path.enable(); this.form.controls.value.enable(); diff --git a/client/src/app/instance/store/models/criterion.model.ts b/client/src/app/instance/store/models/criterion.model.ts index cade405ab86c99718903a11603f1f0ce6f4eb50e..3abcabaf8d12c3619f2259b63d65b700ddd687f1 100644 --- a/client/src/app/instance/store/models/criterion.model.ts +++ b/client/src/app/instance/store/models/criterion.model.ts @@ -105,14 +105,20 @@ export const stringToCriterion = (attribute: Attribute, params: string[] = null) } case 'list': if (params) { - return { id: attribute.id, type: 'list', values: params[2].split('|') } as ListCriterion; + if (params[1] === 'nl' || params[1] === 'nnl') { + return { id: attribute.id, type: 'field', operator: params[1], value: null } as FieldCriterion; + } else { + return { id: attribute.id, type: 'list', values: params[2].split('|') } as ListCriterion; + } } else { return { id: attribute.id, type: 'list', values: attribute.min.toString().split('|') } as ListCriterion; } case 'between': case 'between-date': if (params) { - if (params[1] === 'bw') { + if (params[1] === 'nl' || params[1] === 'nnl') { + return { id: attribute.id, type: 'field', operator: params[1], value: null } as FieldCriterion; + } else if (params[1] === 'bw') { const bwValues = params[2].split('|'); return { id: attribute.id, type: 'between', min: bwValues[0], max: bwValues[1] } as BetweenCriterion; } else if (params[1] === 'gte') { @@ -126,9 +132,13 @@ export const stringToCriterion = (attribute: Attribute, params: string[] = null) case 'select-multiple': case 'checkbox': if (params) { - const msValues = params[2].split('|'); - const options = attribute.options.filter(option => msValues.includes(option.value)); - return { id: attribute.id, type: 'multiple', options } as SelectMultipleCriterion; + if (params[1] === 'nl' || params[1] === 'nnl') { + return { id: attribute.id, type: 'field', operator: params[1], value: null } as FieldCriterion; + } else { + const msValues = params[2].split('|'); + const options = attribute.options.filter(option => msValues.includes(option.value)); + return { id: attribute.id, type: 'multiple', options } as SelectMultipleCriterion; + } } else { const msValues = attribute.min.toString().split('|'); const options = attribute.options.filter(option => msValues.includes(option.value)); @@ -137,8 +147,12 @@ export const stringToCriterion = (attribute: Attribute, params: string[] = null) case 'json': case 'svom_json_kw': if (params) { - const [path, operator, value] = params[2].split('|'); - return { id: attribute.id, type: 'json', path, operator, value } as JsonCriterion; + if (params[1] === 'nl' || params[1] === 'nnl') { + return { id: attribute.id, type: 'field', operator: params[1], value: null } as FieldCriterion; + } else { + const [path, operator, value] = params[2].split('|'); + return { id: attribute.id, type: 'json', path, operator, value } as JsonCriterion; + } } else { const [path, operator, value] = attribute.min.toString().split('|'); return { id: attribute.id, type: 'json', path, operator, value } as JsonCriterion;