@slickgrid-universal/graphql 5.10.2 → 5.12.0
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/cjs/services/graphql.service.js +67 -39
- package/dist/cjs/services/graphql.service.js.map +1 -1
- package/dist/cjs/services/graphqlQueryBuilder.js +7 -4
- package/dist/cjs/services/graphqlQueryBuilder.js.map +1 -1
- package/dist/esm/services/graphql.service.js +68 -40
- package/dist/esm/services/graphql.service.js.map +1 -1
- package/dist/esm/services/graphqlQueryBuilder.js +7 -4
- package/dist/esm/services/graphqlQueryBuilder.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/services/graphql.service.d.ts +1 -1
- package/dist/types/services/graphql.service.d.ts.map +1 -1
- package/dist/types/services/graphqlQueryBuilder.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/services/graphql.service.ts +102 -62
- package/src/services/graphqlQueryBuilder.ts +16 -8
|
@@ -98,6 +98,6 @@ export declare class GraphqlService implements BackendService {
|
|
|
98
98
|
*/
|
|
99
99
|
protected castFilterToColumnFilters(columnFilters: ColumnFilters | CurrentFilter[]): CurrentFilter[];
|
|
100
100
|
/** Normalizes the search value according to field type. */
|
|
101
|
-
protected normalizeSearchValue(fieldType: typeof FieldType[keyof typeof FieldType], searchValue: any): any;
|
|
101
|
+
protected normalizeSearchValue(fieldType: (typeof FieldType)[keyof typeof FieldType], searchValue: any): any;
|
|
102
102
|
}
|
|
103
103
|
//# sourceMappingURL=graphql.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql.service.d.ts","sourceRoot":"","sources":["../../../src/services/graphql.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,MAAM,EAEN,aAAa,EACb,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,UAAU,EAEV,eAAe,EAEf,UAAU,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,aAAa,EACb,gBAAgB,EAChB,SAAS,EAEV,MAAM,6BAA6B,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"graphql.service.d.ts","sourceRoot":"","sources":["../../../src/services/graphql.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphqlQueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/graphqlQueryBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"graphqlQueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/services/graphqlQueryBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAOpC,SAAS,CAAC,WAAW,EAAE,MAAM;IAN/B,KAAK,EAAG,MAAM,GAAG,QAAQ,CAAC;IAC1B,IAAI,EAAE,GAAG,EAAE,CAAM;IACjB,IAAI,EAAE,GAAG,CAAC;gBAIE,WAAW,EAAE,MAAM,EAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe7C;;;OAGG;IACH,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAc1B;;;OAGG;IACH,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI;IAY9B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAYlB,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM;IA4B3C,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;IAkB1C,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG;CAWlC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slickgrid-universal/graphql",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.12.0",
|
|
4
4
|
"description": "GraphQL Service to sync a grid with a GraphQL backend server",
|
|
5
5
|
"main": "./dist/cjs/index.js",
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -38,12 +38,12 @@
|
|
|
38
38
|
"not dead"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@slickgrid-universal/common": "~5.
|
|
42
|
-
"@slickgrid-universal/utils": "~5.
|
|
41
|
+
"@slickgrid-universal/common": "~5.12.0",
|
|
42
|
+
"@slickgrid-universal/utils": "~5.12.0"
|
|
43
43
|
},
|
|
44
44
|
"funding": {
|
|
45
45
|
"type": "ko_fi",
|
|
46
46
|
"url": "https://ko-fi.com/ghiscoding"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "d7e892ebc1727d7c83cc1e5cc80db8302eef4f63"
|
|
49
49
|
}
|
|
@@ -20,13 +20,7 @@ import type {
|
|
|
20
20
|
SlickGrid,
|
|
21
21
|
SortDirectionString,
|
|
22
22
|
} from '@slickgrid-universal/common';
|
|
23
|
-
import {
|
|
24
|
-
FieldType,
|
|
25
|
-
mapOperatorType,
|
|
26
|
-
mapOperatorByFieldType,
|
|
27
|
-
OperatorType,
|
|
28
|
-
SortDirection,
|
|
29
|
-
} from '@slickgrid-universal/common';
|
|
23
|
+
import { FieldType, mapOperatorType, mapOperatorByFieldType, OperatorType, SortDirection } from '@slickgrid-universal/common';
|
|
30
24
|
import { getHtmlStringOutput, stripTags } from '@slickgrid-universal/utils';
|
|
31
25
|
|
|
32
26
|
import type {
|
|
@@ -56,7 +50,7 @@ export class GraphqlService implements BackendService {
|
|
|
56
50
|
pagination: Pagination | undefined;
|
|
57
51
|
defaultPaginationOptions: GraphqlPaginationOption = {
|
|
58
52
|
first: DEFAULT_ITEMS_PER_PAGE,
|
|
59
|
-
offset: 0
|
|
53
|
+
offset: 0,
|
|
60
54
|
};
|
|
61
55
|
|
|
62
56
|
/** Getter for the Column Definitions */
|
|
@@ -66,7 +60,7 @@ export class GraphqlService implements BackendService {
|
|
|
66
60
|
|
|
67
61
|
/** Getter for the Grid Options pulled through the Grid Object */
|
|
68
62
|
protected get _gridOptions(): GridOption {
|
|
69
|
-
return this._grid?.getOptions() ?? {} as GridOption;
|
|
63
|
+
return this._grid?.getOptions() ?? ({} as GridOption);
|
|
70
64
|
}
|
|
71
65
|
|
|
72
66
|
/** Initialization of the service, which acts as a constructor */
|
|
@@ -151,14 +145,14 @@ export class GraphqlService implements BackendService {
|
|
|
151
145
|
|
|
152
146
|
if (this.options.useCursor && this.options.paginationOptions) {
|
|
153
147
|
datasetFilters = { ...this.options.paginationOptions };
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
148
|
+
} else {
|
|
156
149
|
const paginationOptions = this.options?.paginationOptions;
|
|
157
|
-
datasetFilters.first =
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
150
|
+
datasetFilters.first =
|
|
151
|
+
(this.options?.infiniteScroll as InfiniteScrollOption)?.fetchSize ??
|
|
152
|
+
this.options?.paginationOptions?.first ??
|
|
153
|
+
this.pagination?.pageSize ??
|
|
154
|
+
this.defaultPaginationOptions.first;
|
|
155
|
+
datasetFilters.offset = paginationOptions && 'offset' in paginationOptions ? +paginationOptions.offset! : 0;
|
|
162
156
|
}
|
|
163
157
|
}
|
|
164
158
|
|
|
@@ -208,7 +202,6 @@ export class GraphqlService implements BackendService {
|
|
|
208
202
|
* @param inputArray
|
|
209
203
|
*/
|
|
210
204
|
buildFilterQuery(inputArray: string[]): string {
|
|
211
|
-
|
|
212
205
|
const set = (o: any = {}, a: any) => {
|
|
213
206
|
const k = a.shift();
|
|
214
207
|
o[k] = a.length ? set(o[k] ?? {}, a) : null;
|
|
@@ -238,10 +231,9 @@ export class GraphqlService implements BackendService {
|
|
|
238
231
|
* @return Pagination Options
|
|
239
232
|
*/
|
|
240
233
|
getInitPaginationOptions(): GraphqlDatasetFilter {
|
|
241
|
-
const paginationFirst =
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
: { first: paginationFirst, offset: 0 };
|
|
234
|
+
const paginationFirst =
|
|
235
|
+
(this.options?.infiniteScroll as InfiniteScrollOption)?.fetchSize ?? this.pagination?.pageSize ?? DEFAULT_ITEMS_PER_PAGE;
|
|
236
|
+
return this.options?.useCursor ? { first: paginationFirst } : { first: paginationFirst, offset: 0 };
|
|
245
237
|
}
|
|
246
238
|
|
|
247
239
|
/** Get the GraphQL dataset name */
|
|
@@ -281,11 +273,14 @@ export class GraphqlService implements BackendService {
|
|
|
281
273
|
// save current pagination as Page 1 and page size as "first" set size
|
|
282
274
|
this._currentPagination = {
|
|
283
275
|
pageNumber: 1,
|
|
284
|
-
pageSize: paginationOptions.first || DEFAULT_PAGE_SIZE
|
|
276
|
+
pageSize: paginationOptions.first || DEFAULT_PAGE_SIZE,
|
|
285
277
|
};
|
|
286
278
|
|
|
287
279
|
// unless user specifically set "enablePagination" to False, we'll update pagination options in every other cases
|
|
288
|
-
if (
|
|
280
|
+
if (
|
|
281
|
+
this._gridOptions &&
|
|
282
|
+
(this._gridOptions.enablePagination || !('enablePagination' in this._gridOptions) || this.options?.infiniteScroll)
|
|
283
|
+
) {
|
|
289
284
|
this.updateOptions({ paginationOptions });
|
|
290
285
|
}
|
|
291
286
|
}
|
|
@@ -309,7 +304,9 @@ export class GraphqlService implements BackendService {
|
|
|
309
304
|
this._currentFilters = this.castFilterToColumnFilters(args.columnFilters);
|
|
310
305
|
|
|
311
306
|
if (!args || !args.grid) {
|
|
312
|
-
throw new Error(
|
|
307
|
+
throw new Error(
|
|
308
|
+
'Something went wrong when trying create the GraphQL Backend Service, it seems that "args" is not populated correctly'
|
|
309
|
+
);
|
|
313
310
|
}
|
|
314
311
|
|
|
315
312
|
// loop through all columns to inspect filters & set the query
|
|
@@ -347,14 +344,18 @@ export class GraphqlService implements BackendService {
|
|
|
347
344
|
* }
|
|
348
345
|
* }
|
|
349
346
|
*/
|
|
350
|
-
processOnPaginationChanged(
|
|
351
|
-
|
|
347
|
+
processOnPaginationChanged(
|
|
348
|
+
_event: Event | undefined,
|
|
349
|
+
args: PaginationChangedArgs | (PaginationCursorChangedArgs & PaginationChangedArgs)
|
|
350
|
+
): string {
|
|
351
|
+
const pageSize = +(
|
|
352
|
+
(this.options?.infiniteScroll as InfiniteScrollOption)?.fetchSize ||
|
|
353
|
+
args.pageSize ||
|
|
354
|
+
(this.pagination ? this.pagination.pageSize : DEFAULT_PAGE_SIZE)
|
|
355
|
+
);
|
|
352
356
|
|
|
353
357
|
// if first/last defined on args, then it is a cursor based pagination change
|
|
354
|
-
'first' in args || 'last' in args
|
|
355
|
-
? this.updatePagination(args.newPage, pageSize, args)
|
|
356
|
-
: this.updatePagination(args.newPage, pageSize);
|
|
357
|
-
|
|
358
|
+
'first' in args || 'last' in args ? this.updatePagination(args.newPage, pageSize, args) : this.updatePagination(args.newPage, pageSize);
|
|
358
359
|
|
|
359
360
|
// build the GraphQL query which we will use in the WebAPI callback
|
|
360
361
|
return this.buildQuery();
|
|
@@ -374,7 +375,13 @@ export class GraphqlService implements BackendService {
|
|
|
374
375
|
* }
|
|
375
376
|
*/
|
|
376
377
|
processOnSortChanged(_event: Event | undefined, args: SingleColumnSort | MultiColumnSort): string {
|
|
377
|
-
const sortColumns =
|
|
378
|
+
const sortColumns = args.multiColumnSort
|
|
379
|
+
? (args as MultiColumnSort).sortCols
|
|
380
|
+
: new Array({
|
|
381
|
+
columnId: (args as ColumnSort).sortCol?.id ?? '',
|
|
382
|
+
sortCol: (args as ColumnSort).sortCol,
|
|
383
|
+
sortAsc: (args as ColumnSort).sortAsc,
|
|
384
|
+
});
|
|
378
385
|
|
|
379
386
|
// loop through all columns to inspect sorters & set the query
|
|
380
387
|
this.updateSorters(sortColumns);
|
|
@@ -402,7 +409,7 @@ export class GraphqlService implements BackendService {
|
|
|
402
409
|
}
|
|
403
410
|
|
|
404
411
|
for (const columnId in columnFilters) {
|
|
405
|
-
if (columnFilters
|
|
412
|
+
if (columnId in columnFilters) {
|
|
406
413
|
const columnFilter = (columnFilters as any)[columnId];
|
|
407
414
|
|
|
408
415
|
// if user defined some "presets", then we need to find the filters from the column definitions instead
|
|
@@ -413,44 +420,54 @@ export class GraphqlService implements BackendService {
|
|
|
413
420
|
columnDef = columnFilter.columnDef;
|
|
414
421
|
}
|
|
415
422
|
if (!columnDef) {
|
|
416
|
-
throw new Error(
|
|
423
|
+
throw new Error(
|
|
424
|
+
'[GraphQL Service]: Something went wrong in trying to get the column definition of the specified filter (or preset filters). Did you make a typo on the filter columnId?'
|
|
425
|
+
);
|
|
417
426
|
}
|
|
418
427
|
|
|
419
|
-
let fieldName =
|
|
428
|
+
let fieldName =
|
|
429
|
+
columnDef.filter?.queryField || columnDef.queryFieldFilter || columnDef.queryField || columnDef.field || columnDef.name || '';
|
|
420
430
|
if (fieldName instanceof HTMLElement) {
|
|
421
431
|
fieldName = stripTags(fieldName.innerHTML);
|
|
422
432
|
}
|
|
423
433
|
const fieldType = columnDef.type || FieldType.string;
|
|
424
434
|
let searchTerms = columnFilter?.searchTerms ?? [];
|
|
425
|
-
let fieldSearchValue =
|
|
435
|
+
let fieldSearchValue = Array.isArray(searchTerms) && searchTerms.length === 1 ? searchTerms[0] : '';
|
|
426
436
|
if (typeof fieldSearchValue === 'undefined') {
|
|
427
437
|
fieldSearchValue = '';
|
|
428
438
|
}
|
|
429
439
|
|
|
430
440
|
if (!fieldName) {
|
|
431
|
-
throw new Error(
|
|
441
|
+
throw new Error(
|
|
442
|
+
`GraphQL filter could not find the field name to query the search, your column definition must include a valid "field" or "name" (optionally you can also use the "queryfield").`
|
|
443
|
+
);
|
|
432
444
|
}
|
|
433
445
|
|
|
434
446
|
if (this.options?.useVerbatimSearchTerms || columnFilter.verbatimSearchTerms) {
|
|
435
|
-
searchByArray.push({
|
|
447
|
+
searchByArray.push({
|
|
448
|
+
field: getHtmlStringOutput(fieldName),
|
|
449
|
+
operator: columnFilter.operator,
|
|
450
|
+
value: JSON.stringify(columnFilter.searchTerms),
|
|
451
|
+
});
|
|
436
452
|
continue;
|
|
437
453
|
}
|
|
438
454
|
|
|
439
|
-
fieldSearchValue =
|
|
455
|
+
fieldSearchValue = fieldSearchValue === undefined || fieldSearchValue === null ? '' : `${fieldSearchValue}`; // make sure it's a string
|
|
440
456
|
|
|
441
457
|
// run regex to find possible filter operators unless the user disabled the feature
|
|
442
458
|
const autoParseInputFilterOperator = columnDef.autoParseInputFilterOperator ?? this._gridOptions.autoParseInputFilterOperator;
|
|
443
459
|
|
|
444
460
|
// group (2): comboStartsWith, (3): comboEndsWith, (4): Operator, (1 or 5): searchValue, (6): last char is '*' (meaning starts with, ex.: abc*)
|
|
445
|
-
const matches =
|
|
446
|
-
|
|
447
|
-
|
|
461
|
+
const matches =
|
|
462
|
+
autoParseInputFilterOperator !== false
|
|
463
|
+
? fieldSearchValue.match(/^((.*[^\\*\r\n])[*]{1}(.*[^*\r\n]))|^([<>!=*]{0,2})(.*[^<>!=*])([*]?)$/) || []
|
|
464
|
+
: [fieldSearchValue, '', '', '', '', fieldSearchValue, ''];
|
|
448
465
|
|
|
449
466
|
const comboStartsWith = matches?.[2] || '';
|
|
450
467
|
const comboEndsWith = matches?.[3] || '';
|
|
451
468
|
let operator = columnFilter.operator || matches?.[4];
|
|
452
469
|
searchValue = matches?.[1] || matches?.[5] || '';
|
|
453
|
-
const lastValueChar = matches?.[6] ||
|
|
470
|
+
const lastValueChar = matches?.[6] || operator === '*z' || operator === OperatorType.endsWith ? '*' : '';
|
|
454
471
|
|
|
455
472
|
// no need to query if search value is empty
|
|
456
473
|
if (fieldName && searchValue === '' && searchTerms.length === 0) {
|
|
@@ -465,7 +482,7 @@ export class GraphqlService implements BackendService {
|
|
|
465
482
|
operator,
|
|
466
483
|
columnFilterOperator: columnFilter.operator,
|
|
467
484
|
searchValues: searchTerms,
|
|
468
|
-
grid: this._grid
|
|
485
|
+
grid: this._grid,
|
|
469
486
|
});
|
|
470
487
|
}
|
|
471
488
|
|
|
@@ -478,7 +495,12 @@ export class GraphqlService implements BackendService {
|
|
|
478
495
|
if (comboStartsWith && comboEndsWith) {
|
|
479
496
|
searchTerms = [comboStartsWith, comboEndsWith];
|
|
480
497
|
operator = OperatorType.startsWithEndsWith;
|
|
481
|
-
} else if (
|
|
498
|
+
} else if (
|
|
499
|
+
Array.isArray(searchTerms) &&
|
|
500
|
+
searchTerms.length === 1 &&
|
|
501
|
+
typeof searchTerms[0] === 'string' &&
|
|
502
|
+
searchTerms[0].indexOf('..') >= 0
|
|
503
|
+
) {
|
|
482
504
|
if (operator !== OperatorType.rangeInclusive && operator !== OperatorType.rangeExclusive) {
|
|
483
505
|
operator = this._gridOptions.defaultFilterRangeOperator ?? OperatorType.rangeInclusive;
|
|
484
506
|
}
|
|
@@ -496,7 +518,7 @@ export class GraphqlService implements BackendService {
|
|
|
496
518
|
|
|
497
519
|
if (typeof searchValue === 'string') {
|
|
498
520
|
if (operator === '*' || operator === 'a*' || operator === '*z' || lastValueChar === '*') {
|
|
499
|
-
operator = (
|
|
521
|
+
operator = (operator === '*' || operator === '*z' ? 'EndsWith' : 'StartsWith') as OperatorString;
|
|
500
522
|
}
|
|
501
523
|
}
|
|
502
524
|
|
|
@@ -512,7 +534,12 @@ export class GraphqlService implements BackendService {
|
|
|
512
534
|
}
|
|
513
535
|
|
|
514
536
|
// Range with 1 searchterm should lead to equals for a date field.
|
|
515
|
-
if (
|
|
537
|
+
if (
|
|
538
|
+
(operator === OperatorType.rangeInclusive || operator === OperatorType.rangeExclusive) &&
|
|
539
|
+
Array.isArray(searchTerms) &&
|
|
540
|
+
searchTerms.length === 1 &&
|
|
541
|
+
fieldType === FieldType.date
|
|
542
|
+
) {
|
|
516
543
|
operator = OperatorType.equal;
|
|
517
544
|
}
|
|
518
545
|
|
|
@@ -527,7 +554,11 @@ export class GraphqlService implements BackendService {
|
|
|
527
554
|
// StartsWith + EndsWith combo
|
|
528
555
|
if (operator === OperatorType.startsWithEndsWith && Array.isArray(searchTerms) && searchTerms.length === 2) {
|
|
529
556
|
// add 2 conditions (StartsWith A + EndsWith B) to the search array
|
|
530
|
-
searchByArray.push({
|
|
557
|
+
searchByArray.push({
|
|
558
|
+
field: getHtmlStringOutput(fieldName),
|
|
559
|
+
operator: OperatorType.startsWith,
|
|
560
|
+
value: comboStartsWith,
|
|
561
|
+
});
|
|
531
562
|
searchByArray.push({ field: getHtmlStringOutput(fieldName), operator: OperatorType.endsWith, value: comboEndsWith });
|
|
532
563
|
continue;
|
|
533
564
|
}
|
|
@@ -536,8 +567,16 @@ export class GraphqlService implements BackendService {
|
|
|
536
567
|
if (searchTerms?.length > 1 && (operator === 'IN' || operator === 'NIN' || operator === 'NOT_IN')) {
|
|
537
568
|
searchValue = searchTerms.join(',');
|
|
538
569
|
} else if (searchTerms?.length === 2 && (operator === OperatorType.rangeExclusive || operator === OperatorType.rangeInclusive)) {
|
|
539
|
-
searchByArray.push({
|
|
540
|
-
|
|
570
|
+
searchByArray.push({
|
|
571
|
+
field: getHtmlStringOutput(fieldName),
|
|
572
|
+
operator: operator === OperatorType.rangeInclusive ? 'GE' : 'GT',
|
|
573
|
+
value: searchTerms[0],
|
|
574
|
+
});
|
|
575
|
+
searchByArray.push({
|
|
576
|
+
field: getHtmlStringOutput(fieldName),
|
|
577
|
+
operator: operator === OperatorType.rangeInclusive ? 'LE' : 'LT',
|
|
578
|
+
value: searchTerms[1],
|
|
579
|
+
});
|
|
541
580
|
continue;
|
|
542
581
|
}
|
|
543
582
|
|
|
@@ -565,7 +604,7 @@ export class GraphqlService implements BackendService {
|
|
|
565
604
|
updatePagination(newPage: number, pageSize: number, cursorArgs?: PaginationCursorChangedArgs): void {
|
|
566
605
|
this._currentPagination = {
|
|
567
606
|
pageNumber: newPage,
|
|
568
|
-
pageSize
|
|
607
|
+
pageSize,
|
|
569
608
|
};
|
|
570
609
|
|
|
571
610
|
let paginationOptions: GraphqlPaginationOption | GraphqlCursorPaginationOption = {};
|
|
@@ -585,7 +624,7 @@ export class GraphqlService implements BackendService {
|
|
|
585
624
|
// use offset based pagination
|
|
586
625
|
paginationOptions = {
|
|
587
626
|
first: pageSize,
|
|
588
|
-
offset:
|
|
627
|
+
offset: newPage > 1 ? (newPage - 1) * pageSize : 0, // recalculate offset but make sure the result is always over 0
|
|
589
628
|
};
|
|
590
629
|
}
|
|
591
630
|
|
|
@@ -602,30 +641,30 @@ export class GraphqlService implements BackendService {
|
|
|
602
641
|
if (!sortColumns && presetSorters) {
|
|
603
642
|
// make the presets the current sorters, also make sure that all direction are in uppercase for GraphQL
|
|
604
643
|
currentSorters = presetSorters;
|
|
605
|
-
currentSorters.forEach((sorter) => sorter.direction = sorter.direction.toUpperCase() as SortDirectionString);
|
|
644
|
+
currentSorters.forEach((sorter) => (sorter.direction = sorter.direction.toUpperCase() as SortDirectionString));
|
|
606
645
|
|
|
607
646
|
// display the correct sorting icons on the UI, for that it requires (columnId, sortAsc) properties
|
|
608
647
|
const tmpSorterArray = currentSorters.map((sorter) => {
|
|
609
648
|
const columnDef = this._columnDefinitions?.find((column: Column) => column.id === sorter.columnId);
|
|
610
649
|
|
|
611
650
|
graphqlSorters.push({
|
|
612
|
-
field: columnDef ? (
|
|
613
|
-
direction: sorter.direction
|
|
651
|
+
field: columnDef ? (columnDef.queryFieldSorter || columnDef.queryField || columnDef.field) + '' : sorter.columnId + '',
|
|
652
|
+
direction: sorter.direction,
|
|
614
653
|
});
|
|
615
654
|
|
|
616
655
|
// return only the column(s) found in the Column Definitions ELSE null
|
|
617
656
|
if (columnDef) {
|
|
618
657
|
return {
|
|
619
658
|
columnId: sorter.columnId,
|
|
620
|
-
sortAsc: sorter.direction.toUpperCase() === SortDirection.ASC
|
|
659
|
+
sortAsc: sorter.direction.toUpperCase() === SortDirection.ASC,
|
|
621
660
|
};
|
|
622
661
|
}
|
|
623
662
|
return null;
|
|
624
|
-
}) as { columnId: string | number; sortAsc: boolean
|
|
663
|
+
}) as { columnId: string | number; sortAsc: boolean }[] | null;
|
|
625
664
|
|
|
626
665
|
// set the sort icons, but also make sure to filter out null values (that happens when columnDef is not found)
|
|
627
666
|
if (Array.isArray(tmpSorterArray) && this._grid) {
|
|
628
|
-
this._grid.setSortColumns(tmpSorterArray.filter(sorter => sorter) || []);
|
|
667
|
+
this._grid.setSortColumns(tmpSorterArray.filter((sorter) => sorter) || []);
|
|
629
668
|
}
|
|
630
669
|
} else if (sortColumns && !presetSorters) {
|
|
631
670
|
// build the orderBy array, it could be multisort, example
|
|
@@ -635,14 +674,14 @@ export class GraphqlService implements BackendService {
|
|
|
635
674
|
if (column && column.sortCol) {
|
|
636
675
|
currentSorters.push({
|
|
637
676
|
columnId: column.sortCol.id + '',
|
|
638
|
-
direction: column.sortAsc ? SortDirection.ASC : SortDirection.DESC
|
|
677
|
+
direction: column.sortAsc ? SortDirection.ASC : SortDirection.DESC,
|
|
639
678
|
});
|
|
640
679
|
|
|
641
680
|
const fieldName = (column.sortCol.queryFieldSorter || column.sortCol.queryField || column.sortCol.field || '') + '';
|
|
642
681
|
if (fieldName) {
|
|
643
682
|
graphqlSorters.push({
|
|
644
683
|
field: fieldName,
|
|
645
|
-
direction: column.sortAsc ? SortDirection.ASC : SortDirection.DESC
|
|
684
|
+
direction: column.sortAsc ? SortDirection.ASC : SortDirection.DESC,
|
|
646
685
|
});
|
|
647
686
|
}
|
|
648
687
|
}
|
|
@@ -683,7 +722,7 @@ export class GraphqlService implements BackendService {
|
|
|
683
722
|
// example with (field: & direction:): /field:s?(".*?")|direction:s?(".*?")/
|
|
684
723
|
const reg = new RegExp(patternRegex, 'g');
|
|
685
724
|
|
|
686
|
-
return inputStr.replace(reg, group1 => {
|
|
725
|
+
return inputStr.replace(reg, (group1) => {
|
|
687
726
|
// remove double quotes except when the string starts with a "field:"
|
|
688
727
|
let removeDoubleQuotes = true;
|
|
689
728
|
if (group1.startsWith('field:') && keepArgumentFieldDoubleQuotes) {
|
|
@@ -703,7 +742,8 @@ export class GraphqlService implements BackendService {
|
|
|
703
742
|
*/
|
|
704
743
|
protected castFilterToColumnFilters(columnFilters: ColumnFilters | CurrentFilter[]): CurrentFilter[] {
|
|
705
744
|
// keep current filters & always save it as an array (columnFilters can be an object when it is dealt by SlickGrid Filter)
|
|
706
|
-
const filtersArray: ColumnFilter[] =
|
|
745
|
+
const filtersArray: ColumnFilter[] =
|
|
746
|
+
typeof columnFilters === 'object' ? Object.keys(columnFilters).map((key) => (columnFilters as any)[key]) : columnFilters;
|
|
707
747
|
|
|
708
748
|
if (!Array.isArray(filtersArray)) {
|
|
709
749
|
return [];
|
|
@@ -725,7 +765,7 @@ export class GraphqlService implements BackendService {
|
|
|
725
765
|
}
|
|
726
766
|
|
|
727
767
|
/** Normalizes the search value according to field type. */
|
|
728
|
-
protected normalizeSearchValue(fieldType: typeof FieldType[keyof typeof FieldType], searchValue: any): any {
|
|
768
|
+
protected normalizeSearchValue(fieldType: (typeof FieldType)[keyof typeof FieldType], searchValue: any): any {
|
|
729
769
|
switch (fieldType) {
|
|
730
770
|
case FieldType.date:
|
|
731
771
|
case FieldType.string:
|
|
@@ -14,7 +14,10 @@ export default class GraphqlQueryBuilder {
|
|
|
14
14
|
body: any;
|
|
15
15
|
|
|
16
16
|
/* Constructor, query/mutator you wish to use, and an alias or filter arguments. */
|
|
17
|
-
constructor(
|
|
17
|
+
constructor(
|
|
18
|
+
protected queryFnName: string,
|
|
19
|
+
aliasOrFilter?: string | object | undefined
|
|
20
|
+
) {
|
|
18
21
|
if (typeof aliasOrFilter === 'string') {
|
|
19
22
|
this.alias = aliasOrFilter;
|
|
20
23
|
} else if (typeof aliasOrFilter === 'object') {
|
|
@@ -22,7 +25,9 @@ export default class GraphqlQueryBuilder {
|
|
|
22
25
|
} else if (aliasOrFilter === undefined && arguments.length === 2) {
|
|
23
26
|
throw new TypeError(`You have passed undefined as Second argument to "Query"`);
|
|
24
27
|
} else if (aliasOrFilter !== undefined) {
|
|
25
|
-
throw new TypeError(
|
|
28
|
+
throw new TypeError(
|
|
29
|
+
`Second argument to "Query" should be an alias name(String) or filter arguments(Object). What was passed is: ${aliasOrFilter}`
|
|
30
|
+
);
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
33
|
|
|
@@ -48,13 +53,14 @@ export default class GraphqlQueryBuilder {
|
|
|
48
53
|
* Outlines the properties you wish to be returned from the query.
|
|
49
54
|
* @param properties representing each attribute you want Returned
|
|
50
55
|
*/
|
|
51
|
-
find(...searches: any[]): this {
|
|
56
|
+
find(...searches: any[]): this {
|
|
57
|
+
// THIS NEED TO BE A "FUNCTION" to scope 'arguments'
|
|
52
58
|
if (!searches || !Array.isArray(searches) || searches.length === 0) {
|
|
53
59
|
throw new TypeError(`find value can not be >>falsy<<`);
|
|
54
60
|
}
|
|
55
61
|
// if its a string.. it may have other values
|
|
56
62
|
// else it sould be an Object or Array of maped values
|
|
57
|
-
const searchKeys =
|
|
63
|
+
const searchKeys = searches.length === 1 && Array.isArray(searches[0]) ? searches[0] : searches;
|
|
58
64
|
this.body = this.parceFind(searchKeys);
|
|
59
65
|
return this;
|
|
60
66
|
}
|
|
@@ -76,7 +82,7 @@ export default class GraphqlQueryBuilder {
|
|
|
76
82
|
throw new ReferenceError(`return properties are not defined. use the 'find' function to defined them`);
|
|
77
83
|
}
|
|
78
84
|
|
|
79
|
-
return `${
|
|
85
|
+
return `${this.alias ? this.alias + ':' : ''} ${this.queryFnName} ${this.head.length > 0 ? '(' + this.head.join(',') + ')' : ''} { ${this.body} }`;
|
|
80
86
|
}
|
|
81
87
|
|
|
82
88
|
// --
|
|
@@ -115,9 +121,11 @@ export default class GraphqlQueryBuilder {
|
|
|
115
121
|
if (typeof value === 'string') {
|
|
116
122
|
value = JSON.stringify(value);
|
|
117
123
|
} else if (Array.isArray(value)) {
|
|
118
|
-
value = value
|
|
119
|
-
|
|
120
|
-
|
|
124
|
+
value = value
|
|
125
|
+
.map((item) => {
|
|
126
|
+
return this.getGraphQLValue(item);
|
|
127
|
+
})
|
|
128
|
+
.join();
|
|
121
129
|
value = `[${value}]`;
|
|
122
130
|
} else if (value instanceof Date) {
|
|
123
131
|
value = JSON.stringify(value);
|