Skip to content

Commit 029f1e0

Browse files
authored
Merge pull request #140 from netgrif/NAE-1751
[NAE-1751] Autocomplete new filter "include"
2 parents 4e7e772 + b05bf65 commit 029f1e0

File tree

5 files changed

+87
-13
lines changed

5 files changed

+87
-13
lines changed

projects/netgrif-components-core/src/lib/data-fields/enumeration-field/enumeration-autocomplete-select-field/abstract-enumeration-autocomplete-select-field.component.ts

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {EnumerationField, EnumerationFieldValidation, EnumerationFieldValue} fro
66
import {WrappedBoolean} from '../../data-field-template/models/wrapped-boolean';
77
import {TranslateService} from '@ngx-translate/core';
88
import {MatAutocompleteSelectedEvent} from '@angular/material/autocomplete';
9+
import {EnumerationAutocompleteFilterProperty} from './enumeration-autocomplete-filter-property';
910

1011
@Component({
1112
selector: 'ncc-abstract-enumeration-autocomplete-field',
@@ -44,18 +45,6 @@ export abstract class AbstractEnumerationAutocompleteSelectFieldComponent implem
4445
this.filteredOptions = undefined;
4546
}
4647

47-
/**
48-
* Function to filter out matchless options without accent and case-sensitive differences
49-
* @param value to compare matching options
50-
* @return return matched options
51-
*/
52-
private _filter(value: string): Array<EnumerationFieldValue> {
53-
const filterValue = value?.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
54-
55-
return this.enumerationField.choices.filter(option => option.value.toLowerCase().normalize('NFD')
56-
.replace(/[\u0300-\u036f]/g, '').indexOf(filterValue) === 0);
57-
}
58-
5948
change() {
6049
if (this.text.value !== undefined) {
6150
this.filteredOptions = of(this._filter(this.text.value));
@@ -71,6 +60,50 @@ export abstract class AbstractEnumerationAutocompleteSelectFieldComponent implem
7160
return !this.formControlRef.disabled && !this.formControlRef.valid && this.text.control.touched;
7261
}
7362

63+
protected checkPropertyInComponent(property: string): boolean {
64+
return !!this.enumerationField.component && !!this.enumerationField.component.properties && property in this.enumerationField.component.properties;
65+
}
66+
67+
protected filterType(): string | undefined {
68+
if (this.checkPropertyInComponent('filter')) {
69+
return this.enumerationField.component.properties.filter;
70+
}
71+
}
72+
73+
protected _filter(value: string): Array<EnumerationFieldValue> {
74+
let filterType = this.filterType()?.toLowerCase()
75+
switch (filterType) {
76+
case EnumerationAutocompleteFilterProperty.SUBSTRING:
77+
return this._filterInclude(value);
78+
case EnumerationAutocompleteFilterProperty.PREFIX:
79+
return this._filterIndexOf(value);
80+
default:
81+
return this._filterIndexOf(value);
82+
}
83+
}
84+
85+
protected _filterInclude(value: string): Array<EnumerationFieldValue> {
86+
const filterValue = value?.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
87+
return this.enumerationField.choices.filter(option =>
88+
option.value.toLowerCase()
89+
.normalize('NFD')
90+
.replace(/[\u0300-\u036f]/g, '')
91+
.includes(filterValue));
92+
}
93+
94+
95+
/**
96+
* Function to filter out matchless options without accent and case-sensitive differences
97+
* @param value to compare matching options
98+
* @return return matched options
99+
*/
100+
protected _filterIndexOf(value: string): Array<EnumerationFieldValue> {
101+
const filterValue = value?.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
102+
103+
return this.enumerationField.choices.filter(option => option.value.toLowerCase().normalize('NFD')
104+
.replace(/[\u0300-\u036f]/g, '').indexOf(filterValue) === 0);
105+
}
106+
74107
public renderSelection = (key) => {
75108
if (key !== undefined && key !== '' && key !== null) {
76109
if (this.enumerationField.choices.find(choice => choice.key === key)) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum EnumerationAutocompleteFilterProperty {
2+
PREFIX='prefix',
3+
SUBSTRING='substring'
4+
}

projects/netgrif-components-core/src/lib/data-fields/multichoice-field/multichoice-autocomplete-field/abstract-multichoice-autocomplete-field-component.component.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {COMMA, ENTER} from '@angular/cdk/keycodes';
66
import {MatChipInputEvent} from '@angular/material/chips';
77
import {Observable, of} from 'rxjs';
88
import {map, startWith} from 'rxjs/operators';
9+
import {MultichoiceAutocompleteFilterProperty} from './multichoice-autocomplete-filter-property';
910

1011
@Component({
1112
selector: 'ncc-abstract-multichoice-autocomplete-field',
@@ -65,7 +66,37 @@ export abstract class AbstractMultichoiceAutocompleteFieldComponentComponent imp
6566
}
6667
}
6768

68-
private _filter(value: string): Array<MultichoiceFieldValue> {
69+
protected checkPropertyInComponent(property: string): boolean {
70+
return !!this.multichoiceField.component && !!this.multichoiceField.component.properties && property in this.multichoiceField.component.properties;
71+
}
72+
73+
protected filterType(): string | undefined {
74+
if (this.checkPropertyInComponent('filter')) {
75+
return this.multichoiceField.component.properties.filter;
76+
}
77+
}
78+
79+
protected _filter(value: string): Array<MultichoiceFieldValue> {
80+
let filterType = this.filterType()?.toLowerCase()
81+
switch (filterType) {
82+
case MultichoiceAutocompleteFilterProperty.SUBSTRING:
83+
return this._filterInclude(value);
84+
case MultichoiceAutocompleteFilterProperty.PREFIX:
85+
return this._filterIndexOf(value);
86+
default:
87+
return this._filterIndexOf(value);
88+
}
89+
}
90+
91+
protected _filterInclude(value: string): Array<MultichoiceFieldValue> {
92+
if (Array.isArray(value)) {
93+
value = '';
94+
}
95+
const filterValue = value?.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
96+
return this.multichoiceField.choices.filter(option => option.value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '').includes(filterValue));
97+
}
98+
99+
protected _filterIndexOf(value: string): Array<MultichoiceFieldValue> {
69100
if (Array.isArray(value)) {
70101
value = '';
71102
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum MultichoiceAutocompleteFilterProperty {
2+
PREFIX='prefix',
3+
SUBSTRING='substring'
4+
}

projects/netgrif-components-core/src/lib/data-fields/public-api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ export * from './filter-field/models/filter-field-injection-token';
8080
/* Enums */
8181
export * from './models/template-appearance';
8282
export * from './models/material-appearance';
83+
export * from './enumeration-field/enumeration-autocomplete-select-field/enumeration-autocomplete-filter-property'
84+
export * from './multichoice-field/multichoice-autocomplete-field/multichoice-autocomplete-filter-property'
8385

8486
/* Services */
8587
export * from './i18n-field/language-icons.service';

0 commit comments

Comments
 (0)