@forestadmin/datasource-customizer 1.40.4 → 1.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decorators/search/collection-search-context.d.ts +26 -0
- package/dist/decorators/search/collection-search-context.js +14 -0
- package/dist/decorators/search/collection.d.ts +5 -5
- package/dist/decorators/search/collection.js +50 -47
- package/dist/decorators/search/custom-parser/condition-tree-query-walker.d.ts +27 -0
- package/dist/decorators/search/custom-parser/condition-tree-query-walker.js +125 -0
- package/dist/decorators/search/custom-parser/custom-error-strategy.d.ts +5 -0
- package/dist/decorators/search/custom-parser/custom-error-strategy.js +11 -0
- package/dist/decorators/search/custom-parser/custom-query-parser.d.ts +6 -0
- package/dist/decorators/search/custom-parser/custom-query-parser.js +15 -0
- package/dist/decorators/search/custom-parser/fields-query-walker.d.ts +7 -0
- package/dist/decorators/search/custom-parser/fields-query-walker.js +17 -0
- package/dist/decorators/search/filter-builder/build-basic-array-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-basic-array-field-filter.js +25 -0
- package/dist/decorators/search/filter-builder/build-boolean-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-boolean-field-filter.js +27 -0
- package/dist/decorators/search/filter-builder/build-date-field-filter.d.ts +10 -0
- package/dist/decorators/search/filter-builder/build-date-field-filter.js +164 -0
- package/dist/decorators/search/filter-builder/build-enum-array-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-enum-array-field-filter.js +16 -0
- package/dist/decorators/search/filter-builder/build-enum-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-enum-field-filter.js +27 -0
- package/dist/decorators/search/filter-builder/build-number-array-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-number-array-field-filter.js +14 -0
- package/dist/decorators/search/filter-builder/build-number-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-number-field-filter.js +39 -0
- package/dist/decorators/search/filter-builder/build-string-array-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-string-array-field-filter.js +11 -0
- package/dist/decorators/search/filter-builder/build-string-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-string-field-filter.js +37 -0
- package/dist/decorators/search/filter-builder/build-uuid-field-filter.d.ts +3 -0
- package/dist/decorators/search/filter-builder/build-uuid-field-filter.js +24 -0
- package/dist/decorators/search/filter-builder/index.d.ts +3 -0
- package/dist/decorators/search/filter-builder/index.js +65 -0
- package/dist/decorators/search/filter-builder/utils/build-default-condition.d.ts +3 -0
- package/dist/decorators/search/filter-builder/utils/build-default-condition.js +8 -0
- package/dist/decorators/search/filter-builder/utils/find-enum-value.d.ts +3 -0
- package/dist/decorators/search/filter-builder/utils/find-enum-value.js +12 -0
- package/dist/decorators/search/generated-parser/QueryLexer.d.ts +33 -0
- package/dist/decorators/search/generated-parser/QueryLexer.js +98 -0
- package/dist/decorators/search/generated-parser/QueryListener.d.ts +129 -0
- package/dist/decorators/search/generated-parser/QueryListener.js +12 -0
- package/dist/decorators/search/generated-parser/QueryParser.d.ts +162 -0
- package/dist/decorators/search/generated-parser/QueryParser.js +1025 -0
- package/dist/decorators/search/normalize-name.d.ts +2 -0
- package/dist/decorators/search/normalize-name.js +7 -0
- package/dist/decorators/search/parse-query.d.ts +6 -0
- package/dist/decorators/search/parse-query.js +47 -0
- package/dist/typing-generator.d.ts +1 -0
- package/dist/typing-generator.js +10 -3
- package/package.json +4 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Caller, Collection, ConditionTree } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import CollectionCustomizationContext from '../../context/collection-context';
|
|
3
|
+
import { TCollectionName, TColumnName, TSchema } from '../../templates';
|
|
4
|
+
export type SearchOptions<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> = {
|
|
5
|
+
/**
|
|
6
|
+
* Include fields from the first level of relations
|
|
7
|
+
*/
|
|
8
|
+
extended?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Remove these fields from the default search fields
|
|
11
|
+
*/
|
|
12
|
+
excludeFields?: Array<TColumnName<S, N>>;
|
|
13
|
+
/**
|
|
14
|
+
* Add these fields to the default search fields
|
|
15
|
+
*/
|
|
16
|
+
includeFields?: Array<TColumnName<S, N>>;
|
|
17
|
+
/**
|
|
18
|
+
* Replace the list of default searched field by these fields
|
|
19
|
+
*/
|
|
20
|
+
onlyFields?: Array<TColumnName<S, N>>;
|
|
21
|
+
};
|
|
22
|
+
export default class CollectionSearchContext<S extends TSchema = TSchema, N extends TCollectionName<S> = TCollectionName<S>> extends CollectionCustomizationContext<S, N> {
|
|
23
|
+
readonly generateSearchFilter: (searchText: string, options?: SearchOptions<S, N>) => ConditionTree;
|
|
24
|
+
constructor(collection: Collection, caller: Caller, generateSearchFilter: (searchText: string, options?: SearchOptions<S, N>) => ConditionTree);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=collection-search-context.d.ts.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const collection_context_1 = __importDefault(require("../../context/collection-context"));
|
|
7
|
+
class CollectionSearchContext extends collection_context_1.default {
|
|
8
|
+
constructor(collection, caller, generateSearchFilter) {
|
|
9
|
+
super(collection, caller);
|
|
10
|
+
this.generateSearchFilter = generateSearchFilter;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.default = CollectionSearchContext;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1zZWFyY2gtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3NlYXJjaC9jb2xsZWN0aW9uLXNlYXJjaC1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsMEZBQThFO0FBeUI5RSxNQUFxQix1QkFHbkIsU0FBUSw0QkFBb0M7SUFDNUMsWUFDRSxVQUFzQixFQUN0QixNQUFjLEVBQ0Usb0JBR0U7UUFFbEIsS0FBSyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUxWLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FHbEI7SUFHcEIsQ0FBQztDQUNGO0FBZEQsMENBY0MifQ==
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { Caller, CollectionDecorator, CollectionSchema, PaginatedFilter } from '@forestadmin/datasource-toolkit';
|
|
1
|
+
import { Caller, CollectionDecorator, CollectionSchema, DataSourceDecorator, PaginatedFilter } from '@forestadmin/datasource-toolkit';
|
|
2
2
|
import { SearchDefinition } from './types';
|
|
3
3
|
export default class SearchCollectionDecorator extends CollectionDecorator {
|
|
4
|
+
dataSource: DataSourceDecorator<SearchCollectionDecorator>;
|
|
4
5
|
replacer: SearchDefinition;
|
|
5
6
|
replaceSearch(replacer: SearchDefinition): void;
|
|
6
7
|
refineSchema(subSchema: CollectionSchema): CollectionSchema;
|
|
7
8
|
refineFilter(caller: Caller, filter?: PaginatedFilter): Promise<PaginatedFilter>;
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
-
private
|
|
11
|
-
private static lenientFind;
|
|
9
|
+
private generateSearchFilter;
|
|
10
|
+
private getFields;
|
|
11
|
+
private lenientGetSchema;
|
|
12
12
|
}
|
|
13
13
|
//# sourceMappingURL=collection.d.ts.map
|
|
@@ -4,8 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const collection_search_context_1 = __importDefault(require("./collection-search-context"));
|
|
8
|
+
const normalize_name_1 = __importDefault(require("./normalize-name"));
|
|
9
|
+
const parse_query_1 = require("./parse-query");
|
|
9
10
|
class SearchCollectionDecorator extends datasource_toolkit_1.CollectionDecorator {
|
|
10
11
|
constructor() {
|
|
11
12
|
super(...arguments);
|
|
@@ -24,12 +25,17 @@ class SearchCollectionDecorator extends datasource_toolkit_1.CollectionDecorator
|
|
|
24
25
|
}
|
|
25
26
|
// Implement search ourselves
|
|
26
27
|
if (this.replacer || !this.childCollection.schema.searchable) {
|
|
27
|
-
const ctx = new
|
|
28
|
-
let tree
|
|
28
|
+
const ctx = new collection_search_context_1.default(this, caller, this.generateSearchFilter.bind(this));
|
|
29
|
+
let tree;
|
|
29
30
|
if (this.replacer) {
|
|
30
31
|
const plainTree = await this.replacer(filter.search, filter.searchExtended, ctx);
|
|
31
32
|
tree = datasource_toolkit_1.ConditionTreeFactory.fromPlainObject(plainTree);
|
|
32
33
|
}
|
|
34
|
+
else {
|
|
35
|
+
tree = this.generateSearchFilter(caller, filter.search, {
|
|
36
|
+
extended: filter.searchExtended,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
33
39
|
// Note that if no fields are searchable with the provided searchString, the conditions
|
|
34
40
|
// array might be empty, which will create a condition returning zero records
|
|
35
41
|
// (this is the desired behavior).
|
|
@@ -41,47 +47,28 @@ class SearchCollectionDecorator extends datasource_toolkit_1.CollectionDecorator
|
|
|
41
47
|
// Let subcollection deal with the search
|
|
42
48
|
return filter;
|
|
43
49
|
}
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
63
|
-
if (columnType === 'String') {
|
|
64
|
-
const isCaseSensitive = searchString.toLocaleLowerCase() !== searchString.toLocaleUpperCase();
|
|
65
|
-
const supportsIContains = filterOperators?.has('IContains');
|
|
66
|
-
const supportsContains = filterOperators?.has('Contains');
|
|
67
|
-
const supportsEqual = filterOperators?.has('Equal');
|
|
68
|
-
// Perf: don't use case-insensitive operator when the search string is indifferent to case
|
|
69
|
-
let operator;
|
|
70
|
-
if (supportsIContains && (isCaseSensitive || !supportsContains))
|
|
71
|
-
operator = 'IContains';
|
|
72
|
-
else if (supportsContains)
|
|
73
|
-
operator = 'Contains';
|
|
74
|
-
else if (supportsEqual)
|
|
75
|
-
operator = 'Equal';
|
|
76
|
-
if (operator)
|
|
77
|
-
return new datasource_toolkit_1.ConditionTreeLeaf(field, operator, searchString);
|
|
78
|
-
}
|
|
79
|
-
if (columnType === 'Uuid' && isUuid && filterOperators?.has('Equal')) {
|
|
80
|
-
return new datasource_toolkit_1.ConditionTreeLeaf(field, 'Equal', searchString);
|
|
50
|
+
generateSearchFilter(caller, searchText, options) {
|
|
51
|
+
const parsedQuery = (0, parse_query_1.parseQuery)(searchText);
|
|
52
|
+
const specifiedFields = options?.onlyFields ? [] : (0, parse_query_1.extractSpecifiedFields)(parsedQuery);
|
|
53
|
+
const defaultFields = options?.onlyFields
|
|
54
|
+
? []
|
|
55
|
+
: this.getFields(this.childCollection, Boolean(options?.extended));
|
|
56
|
+
const searchableFields = new Map([
|
|
57
|
+
...defaultFields,
|
|
58
|
+
...[...specifiedFields, ...(options?.onlyFields ?? []), ...(options?.includeFields ?? [])]
|
|
59
|
+
.map(name => this.lenientGetSchema(name))
|
|
60
|
+
.filter(Boolean)
|
|
61
|
+
.map(schema => [schema.field, schema.schema]),
|
|
62
|
+
]
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
.filter(([field]) => !options?.excludeFields?.includes(field)));
|
|
65
|
+
const conditionTree = (0, parse_query_1.generateConditionTree)(caller, parsedQuery, [...searchableFields]);
|
|
66
|
+
if (!conditionTree && searchText.trim().length) {
|
|
67
|
+
return datasource_toolkit_1.ConditionTreeFactory.MatchNone;
|
|
81
68
|
}
|
|
82
|
-
return
|
|
69
|
+
return conditionTree;
|
|
83
70
|
}
|
|
84
|
-
|
|
71
|
+
getFields(collection, extended) {
|
|
85
72
|
const fields = [];
|
|
86
73
|
for (const [name, field] of Object.entries(collection.schema.fields)) {
|
|
87
74
|
if (field.type === 'Column')
|
|
@@ -95,10 +82,26 @@ class SearchCollectionDecorator extends datasource_toolkit_1.CollectionDecorator
|
|
|
95
82
|
}
|
|
96
83
|
return fields;
|
|
97
84
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
85
|
+
lenientGetSchema(path) {
|
|
86
|
+
const [prefix, suffix] = path.split(/:(.*)/);
|
|
87
|
+
const fuzzyPrefix = (0, normalize_name_1.default)(prefix);
|
|
88
|
+
for (const [field, schema] of Object.entries(this.schema.fields)) {
|
|
89
|
+
const fuzzyFieldName = (0, normalize_name_1.default)(field);
|
|
90
|
+
if (fuzzyPrefix === fuzzyFieldName) {
|
|
91
|
+
if (!suffix && schema.type === 'Column') {
|
|
92
|
+
return { field, schema };
|
|
93
|
+
}
|
|
94
|
+
if (suffix &&
|
|
95
|
+
(schema.type === 'OneToMany' || schema.type === 'ManyToOne' || schema.type === 'OneToOne')) {
|
|
96
|
+
const related = this.dataSource.getCollection(schema.foreignCollection);
|
|
97
|
+
const fuzzy = related.lenientGetSchema(suffix);
|
|
98
|
+
if (fuzzy)
|
|
99
|
+
return { field: `${field}:${fuzzy.field}`, schema: fuzzy.schema };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
101
104
|
}
|
|
102
105
|
}
|
|
103
106
|
exports.default = SearchCollectionDecorator;
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3NlYXJjaC9jb2xsZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBVXlDO0FBRXpDLDRGQUFxRjtBQUNyRixzRUFBNkM7QUFDN0MsK0NBQTBGO0FBRzFGLE1BQXFCLHlCQUEwQixTQUFRLHdDQUFtQjtJQUExRTs7UUFFRSxhQUFRLEdBQXFCLElBQUksQ0FBQztJQXdIcEMsQ0FBQztJQXRIQyxhQUFhLENBQUMsUUFBMEI7UUFDdEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVRLFlBQVksQ0FBQyxTQUEyQjtRQUMvQyxPQUFPLEVBQUUsR0FBRyxTQUFTLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFUSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQWMsRUFBRSxNQUF3QjtRQUNsRSxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ2xDLE9BQU8sTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQzNDO1FBRUQsNkJBQTZCO1FBQzdCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtZQUM1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLG1DQUF1QixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzVGLElBQUksSUFBbUIsQ0FBQztZQUV4QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFB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
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Caller, ColumnSchema, ConditionTree } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import QueryListener from '../generated-parser/QueryListener';
|
|
3
|
+
import { NegatedContext, PropertyMatchingContext, QuotedContext, WordContext } from '../generated-parser/QueryParser';
|
|
4
|
+
export default class ConditionTreeQueryWalker extends QueryListener {
|
|
5
|
+
private readonly caller;
|
|
6
|
+
private readonly fields;
|
|
7
|
+
private parentStack;
|
|
8
|
+
private currentField;
|
|
9
|
+
private isNegated;
|
|
10
|
+
get conditionTree(): ConditionTree;
|
|
11
|
+
constructor(caller: Caller, fields: [string, ColumnSchema][]);
|
|
12
|
+
generateDefaultFilter(searchQuery: string): ConditionTree;
|
|
13
|
+
enterQuery: () => void;
|
|
14
|
+
exitQuery: () => void;
|
|
15
|
+
exitQuoted: (ctx: QuotedContext) => void;
|
|
16
|
+
enterNegated: () => void;
|
|
17
|
+
exitNegated: (ctx: NegatedContext) => void;
|
|
18
|
+
exitWord: (ctx: WordContext) => void;
|
|
19
|
+
enterPropertyMatching: (ctx: PropertyMatchingContext) => void;
|
|
20
|
+
exitPropertyMatching: () => void;
|
|
21
|
+
enterOr: () => void;
|
|
22
|
+
exitOr: () => void;
|
|
23
|
+
enterAnd: () => void;
|
|
24
|
+
exitAnd: () => void;
|
|
25
|
+
private buildDefaultCondition;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=condition-tree-query-walker.d.ts.map
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const index_1 = __importDefault(require("../filter-builder/index"));
|
|
8
|
+
const QueryListener_1 = __importDefault(require("../generated-parser/QueryListener"));
|
|
9
|
+
const normalize_name_1 = __importDefault(require("../normalize-name"));
|
|
10
|
+
class ConditionTreeQueryWalker extends QueryListener_1.default {
|
|
11
|
+
get conditionTree() {
|
|
12
|
+
if (this.parentStack.length !== 1 && this.parentStack[0].length !== 1) {
|
|
13
|
+
throw new Error('Invalid condition tree');
|
|
14
|
+
}
|
|
15
|
+
return this.parentStack[0][0];
|
|
16
|
+
}
|
|
17
|
+
constructor(caller, fields) {
|
|
18
|
+
super();
|
|
19
|
+
this.caller = caller;
|
|
20
|
+
this.fields = fields;
|
|
21
|
+
this.parentStack = [];
|
|
22
|
+
this.currentField = null;
|
|
23
|
+
this.isNegated = false;
|
|
24
|
+
this.enterQuery = () => {
|
|
25
|
+
this.parentStack.push([]);
|
|
26
|
+
};
|
|
27
|
+
this.exitQuery = () => {
|
|
28
|
+
const rules = this.parentStack.pop();
|
|
29
|
+
if (!rules) {
|
|
30
|
+
throw new Error('Empty query');
|
|
31
|
+
}
|
|
32
|
+
if (rules.length === 1) {
|
|
33
|
+
this.parentStack.push(rules);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.parentStack.push([datasource_toolkit_1.ConditionTreeFactory.intersect(...rules)]);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
this.exitQuoted = (ctx) => {
|
|
40
|
+
const current = this.parentStack[this.parentStack.length - 1];
|
|
41
|
+
current.push(this.buildDefaultCondition(ctx.getText().slice(1, -1), this.isNegated));
|
|
42
|
+
};
|
|
43
|
+
this.enterNegated = () => {
|
|
44
|
+
this.parentStack.push([]);
|
|
45
|
+
this.isNegated = true;
|
|
46
|
+
};
|
|
47
|
+
this.exitNegated = (ctx) => {
|
|
48
|
+
const text = ctx.getText();
|
|
49
|
+
const rules = this.parentStack.pop();
|
|
50
|
+
if (!rules)
|
|
51
|
+
return;
|
|
52
|
+
let result;
|
|
53
|
+
if (!Number.isNaN(Number(text)) && rules.length === 1) {
|
|
54
|
+
result = this.buildDefaultCondition(text, false);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
result = datasource_toolkit_1.ConditionTreeFactory.intersect(...rules.filter(Boolean));
|
|
58
|
+
}
|
|
59
|
+
const parentRules = this.parentStack[this.parentStack.length - 1];
|
|
60
|
+
if (parentRules) {
|
|
61
|
+
parentRules.push(result);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// We should at least have an array for the root query
|
|
65
|
+
throw new Error('Empty stack');
|
|
66
|
+
}
|
|
67
|
+
this.isNegated = false;
|
|
68
|
+
};
|
|
69
|
+
this.exitWord = (ctx) => {
|
|
70
|
+
const current = this.parentStack[this.parentStack.length - 1];
|
|
71
|
+
current.push(this.buildDefaultCondition(ctx.getText(), this.isNegated));
|
|
72
|
+
};
|
|
73
|
+
this.enterPropertyMatching = (ctx) => {
|
|
74
|
+
this.currentField = ctx.getChild(0).getText().replace(/\./g, ':');
|
|
75
|
+
};
|
|
76
|
+
this.exitPropertyMatching = () => {
|
|
77
|
+
this.currentField = null;
|
|
78
|
+
};
|
|
79
|
+
this.enterOr = () => {
|
|
80
|
+
this.parentStack.push([]);
|
|
81
|
+
};
|
|
82
|
+
this.exitOr = () => {
|
|
83
|
+
const rules = this.parentStack.pop();
|
|
84
|
+
if (!rules.length)
|
|
85
|
+
return;
|
|
86
|
+
const parentRules = this.parentStack[this.parentStack.length - 1];
|
|
87
|
+
parentRules.push(datasource_toolkit_1.ConditionTreeFactory.union(...rules));
|
|
88
|
+
};
|
|
89
|
+
this.enterAnd = () => {
|
|
90
|
+
this.parentStack.push([]);
|
|
91
|
+
};
|
|
92
|
+
this.exitAnd = () => {
|
|
93
|
+
const rules = this.parentStack.pop();
|
|
94
|
+
if (!rules.length)
|
|
95
|
+
return;
|
|
96
|
+
const parentRules = this.parentStack[this.parentStack.length - 1];
|
|
97
|
+
parentRules.push(datasource_toolkit_1.ConditionTreeFactory.intersect(...rules));
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
generateDefaultFilter(searchQuery) {
|
|
101
|
+
return this.buildDefaultCondition(searchQuery, this.isNegated);
|
|
102
|
+
}
|
|
103
|
+
buildDefaultCondition(searchString, isNegated) {
|
|
104
|
+
const targetedFields = this.currentField &&
|
|
105
|
+
this.fields.filter(([field]) => (0, normalize_name_1.default)(field) === (0, normalize_name_1.default)(this.currentField));
|
|
106
|
+
let rules = [];
|
|
107
|
+
if (!targetedFields?.length) {
|
|
108
|
+
rules = this.fields.map(([field, schema]) => (0, index_1.default)(this.caller, field, schema,
|
|
109
|
+
// If targetFields is empty, it means that the query is not targeting a specific field
|
|
110
|
+
// OR that the field is not found in the schema. If it's the case, we are re-constructing
|
|
111
|
+
// the original query by adding the field name in front of the search string.
|
|
112
|
+
this.currentField ? `${this.currentField}:${searchString}` : searchString, isNegated));
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
rules = targetedFields.map(([field, schema]) => (0, index_1.default)(this.caller, field, schema, searchString, isNegated));
|
|
116
|
+
}
|
|
117
|
+
if (!rules.some(Boolean))
|
|
118
|
+
return null;
|
|
119
|
+
return isNegated
|
|
120
|
+
? datasource_toolkit_1.ConditionTreeFactory.intersect(...rules)
|
|
121
|
+
: datasource_toolkit_1.ConditionTreeFactory.union(...rules);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.default = ConditionTreeQueryWalker;
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZGl0aW9uLXRyZWUtcXVlcnktd2Fsa2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvcnMvc2VhcmNoL2N1c3RvbS1wYXJzZXIvY29uZGl0aW9uLXRyZWUtcXVlcnktd2Fsa2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBS3lDO0FBRXpDLG9FQUF1RDtBQUN2RCxzRkFBOEQ7QUFPOUQsdUVBQThDO0FBRTlDLE1BQXFCLHdCQUF5QixTQUFRLHVCQUFhO0lBS2pFLElBQUksYUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDM0M7UUFFRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQTZCLE1BQWMsRUFBbUIsTUFBZ0M7UUFDNUYsS0FBSyxFQUFFLENBQUM7UUFEbUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFtQixXQUFNLEdBQU4sTUFBTSxDQUEwQjtRQVp0RixnQkFBVyxHQUFzQixFQUFFLENBQUM7UUFDcEMsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFDNUIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQWtCakIsZUFBVSxHQUFHLEdBQUcsRUFBRTtZQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUM7UUFFTyxjQUFTLEdBQUcsR0FBRyxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFckMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFD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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const antlr4_1 = require("antlr4");
|
|
4
|
+
class CustomErrorStrategy extends antlr4_1.DefaultErrorStrategy {
|
|
5
|
+
reportError() {
|
|
6
|
+
// We don't want console logs when parsing fails
|
|
7
|
+
// Do nothing
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.default = CustomErrorStrategy;
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWVycm9yLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvcnMvc2VhcmNoL2N1c3RvbS1wYXJzZXIvY3VzdG9tLWVycm9yLXN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbUNBQThDO0FBRTlDLE1BQXFCLG1CQUFvQixTQUFRLDZCQUFvQjtJQUMxRCxXQUFXO1FBQ2xCLGdEQUFnRDtRQUNoRCxhQUFhO0lBQ2YsQ0FBQztDQUNGO0FBTEQsc0NBS0MifQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import CustomErrorStrategy from './custom-error-strategy';
|
|
2
|
+
import QueryParser from '../generated-parser/QueryParser';
|
|
3
|
+
export default class CustomQueryParser extends QueryParser {
|
|
4
|
+
_errHandler: CustomErrorStrategy;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=custom-query-parser.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const custom_error_strategy_1 = __importDefault(require("./custom-error-strategy"));
|
|
7
|
+
const QueryParser_1 = __importDefault(require("../generated-parser/QueryParser"));
|
|
8
|
+
class CustomQueryParser extends QueryParser_1.default {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this._errHandler = new custom_error_strategy_1.default();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.default = CustomQueryParser;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLXF1ZXJ5LXBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3NlYXJjaC9jdXN0b20tcGFyc2VyL2N1c3RvbS1xdWVyeS1wYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvRkFBMEQ7QUFDMUQsa0ZBQTBEO0FBRTFELE1BQXFCLGlCQUFrQixTQUFRLHFCQUFXO0lBQTFEOztRQUNXLGdCQUFXLEdBQUcsSUFBSSwrQkFBbUIsRUFBRSxDQUFDO0lBQ25ELENBQUM7Q0FBQTtBQUZELG9DQUVDIn0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import QueryListener from '../generated-parser/QueryListener';
|
|
2
|
+
import { PropertyMatchingContext } from '../generated-parser/QueryParser';
|
|
3
|
+
export default class FieldsQueryWalker extends QueryListener {
|
|
4
|
+
fields: string[];
|
|
5
|
+
enterPropertyMatching: (ctx: PropertyMatchingContext) => void;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=fields-query-walker.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const QueryListener_1 = __importDefault(require("../generated-parser/QueryListener"));
|
|
7
|
+
class FieldsQueryWalker extends QueryListener_1.default {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this.fields = [];
|
|
11
|
+
this.enterPropertyMatching = (ctx) => {
|
|
12
|
+
this.fields.push(ctx.getChild(0).getText().replace(/\./g, ':'));
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.default = FieldsQueryWalker;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLXF1ZXJ5LXdhbGtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kZWNvcmF0b3JzL3NlYXJjaC9jdXN0b20tcGFyc2VyL2ZpZWxkcy1xdWVyeS13YWxrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxzRkFBOEQ7QUFHOUQsTUFBcUIsaUJBQWtCLFNBQVEsdUJBQWE7SUFBNUQ7O1FBQ1MsV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUVwQiwwQkFBcUIsR0FBRyxDQUFDLEdBQTRCLEVBQUUsRUFBRTtZQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUM7SUFDSixDQUFDO0NBQUE7QUFORCxvQ0FNQyJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ConditionTree, Operator } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export default function buildBasicArrayFieldFilter(field: string, filterOperators: Set<Operator> | undefined, searchString: unknown, isNegated: boolean): ConditionTree;
|
|
3
|
+
//# sourceMappingURL=build-basic-array-field-filter.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const build_default_condition_1 = __importDefault(require("./utils/build-default-condition"));
|
|
8
|
+
function buildBasicArrayFieldFilter(field, filterOperators, searchString, isNegated) {
|
|
9
|
+
if (!isNegated) {
|
|
10
|
+
if (filterOperators?.has('IncludesAll')) {
|
|
11
|
+
return new datasource_toolkit_1.ConditionTreeLeaf(field, 'IncludesAll', searchString);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
else if (filterOperators?.has('IncludesNone')) {
|
|
15
|
+
if (filterOperators.has('IncludesNone') && filterOperators.has('Missing')) {
|
|
16
|
+
return datasource_toolkit_1.ConditionTreeFactory.union(new datasource_toolkit_1.ConditionTreeLeaf(field, 'IncludesNone', searchString), new datasource_toolkit_1.ConditionTreeLeaf(field, 'Missing'));
|
|
17
|
+
}
|
|
18
|
+
if (filterOperators.has('IncludesNone')) {
|
|
19
|
+
return new datasource_toolkit_1.ConditionTreeLeaf(field, 'IncludesNone', searchString);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return (0, build_default_condition_1.default)(isNegated);
|
|
23
|
+
}
|
|
24
|
+
exports.default = buildBasicArrayFieldFilter;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYmFzaWMtYXJyYXktZmllbGQtZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RlY29yYXRvcnMvc2VhcmNoL2ZpbHRlci1idWlsZGVyL2J1aWxkLWJhc2ljLWFycmF5LWZpZWxkLWZpbHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHdFQUt5QztBQUV6Qyw4RkFBb0U7QUFFcEUsU0FBd0IsMEJBQTBCLENBQ2hELEtBQWEsRUFDYixlQUEwQyxFQUMxQyxZQUFxQixFQUNyQixTQUFrQjtJQUVsQixJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ2QsSUFBSSxlQUFlLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ2xFO0tBQ0Y7U0FBTSxJQUFJLGVBQWUsRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUU7UUFDL0MsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDekUsT0FBTyx5Q0FBb0IsQ0FBQyxLQUFLLENBQy9CLElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsRUFDMUQsSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQ3hDLENBQUM7U0FDSDtRQUVELElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUN2QyxPQUFPLElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztTQUNuRTtLQUNGO0lBRUQsT0FBTyxJQUFBLGlDQUFxQixFQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUF4QkQsNkNBd0JDIn0=
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ConditionTree, Operator } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export default function buildBooleanFieldFilter(field: string, filterOperators: Set<Operator>, searchString: string, isNegated: boolean): ConditionTree;
|
|
3
|
+
//# sourceMappingURL=build-boolean-field-filter.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
+
const build_default_condition_1 = __importDefault(require("./utils/build-default-condition"));
|
|
8
|
+
function buildBooleanFieldFilter(field, filterOperators, searchString, isNegated) {
|
|
9
|
+
const operator = isNegated ? 'NotEqual' : 'Equal';
|
|
10
|
+
if (filterOperators?.has(operator)) {
|
|
11
|
+
if (['true', '1'].includes(searchString?.toLowerCase())) {
|
|
12
|
+
if (isNegated && filterOperators.has('Missing')) {
|
|
13
|
+
return datasource_toolkit_1.ConditionTreeFactory.union(new datasource_toolkit_1.ConditionTreeLeaf(field, operator, true), new datasource_toolkit_1.ConditionTreeLeaf(field, 'Missing', null));
|
|
14
|
+
}
|
|
15
|
+
return new datasource_toolkit_1.ConditionTreeLeaf(field, operator, true);
|
|
16
|
+
}
|
|
17
|
+
if (['false', '0'].includes(searchString?.toLowerCase())) {
|
|
18
|
+
if (isNegated && filterOperators.has('Missing')) {
|
|
19
|
+
return datasource_toolkit_1.ConditionTreeFactory.union(new datasource_toolkit_1.ConditionTreeLeaf(field, operator, false), new datasource_toolkit_1.ConditionTreeLeaf(field, 'Missing', null));
|
|
20
|
+
}
|
|
21
|
+
return new datasource_toolkit_1.ConditionTreeLeaf(field, operator, false);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return (0, build_default_condition_1.default)(isNegated);
|
|
25
|
+
}
|
|
26
|
+
exports.default = buildBooleanFieldFilter;
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYm9vbGVhbi1maWVsZC1maWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGVjb3JhdG9ycy9zZWFyY2gvZmlsdGVyLWJ1aWxkZXIvYnVpbGQtYm9vbGVhbi1maWVsZC1maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFLeUM7QUFFekMsOEZBQW9FO0FBRXBFLFNBQXdCLHVCQUF1QixDQUM3QyxLQUFhLEVBQ2IsZUFBOEIsRUFDOUIsWUFBb0IsRUFDcEIsU0FBa0I7SUFFbEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUVsRCxJQUFJLGVBQWUsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7WUFDdkQsSUFBSSxTQUFTLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDL0MsT0FBTyx5Q0FBb0IsQ0FBQyxLQUFLLENBQy9CLElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFDNUMsSUFBSSxzQ0FBaUIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUM5QyxDQUFDO2FBQ0g7WUFFRCxPQUFPLElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQ3hELElBQUksU0FBUyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQy9DLE9BQU8seUNBQW9CLENBQUMsS0FBSyxDQUMvQixJQUFJLHNDQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQzdDLElBQUksc0NBQWlCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FDOUMsQ0FBQzthQUNIO1lBRUQsT0FBTyxJQUFJLHNDQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDdEQ7S0FDRjtJQUVELE9BQU8sSUFBQSxpQ0FBcUIsRUFBQyxTQUFTLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBakNELDBDQWlDQyJ9
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ColumnType, ConditionTree, Operator } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
export default function buildDateFieldFilter({ field, filterOperators, searchString, isNegated, columnType, timezone, }: {
|
|
3
|
+
field: string;
|
|
4
|
+
filterOperators: Set<Operator>;
|
|
5
|
+
searchString: string;
|
|
6
|
+
isNegated: boolean;
|
|
7
|
+
columnType: ColumnType;
|
|
8
|
+
timezone: string;
|
|
9
|
+
}): ConditionTree;
|
|
10
|
+
//# sourceMappingURL=build-date-field-filter.d.ts.map
|