ag-grid-url-sync 0.2.4 → 0.4.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/README.md +395 -23
- package/dist/core/ag-grid-url-sync.d.ts +16 -1
- package/dist/core/ag-grid-url-sync.js +19 -41
- package/dist/core/ag-grid-url-sync.js.map +1 -1
- package/dist/core/grid-integration.js +5 -67
- package/dist/core/grid-integration.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +1 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/serialization/formats.d.ts +29 -0
- package/dist/core/serialization/formats.js +68 -0
- package/dist/core/serialization/formats.js.map +1 -0
- package/dist/core/serialization/grouped.d.ts +36 -0
- package/dist/core/serialization/grouped.js +105 -0
- package/dist/core/serialization/grouped.js.map +1 -0
- package/dist/core/serialization/index.d.ts +7 -0
- package/dist/core/serialization/index.js +3 -0
- package/dist/core/serialization/index.js.map +1 -0
- package/dist/core/types.d.ts +75 -5
- package/dist/core/types.js +7 -115
- package/dist/core/types.js.map +1 -1
- package/dist/core/url-generator.js +44 -38
- package/dist/core/url-generator.js.map +1 -1
- package/dist/core/url-parser.js +8 -52
- package/dist/core/url-parser.js.map +1 -1
- package/dist/core/validation.d.ts +13 -2
- package/dist/core/validation.js +34 -72
- package/dist/core/validation.js.map +1 -1
- package/dist/core/view-storage.d.ts +63 -0
- package/dist/core/view-storage.js +112 -0
- package/dist/core/view-storage.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -5
- package/dist/index.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/types.d.ts +108 -1
- package/dist/react/use-ag-grid-url-sync.js +440 -42
- package/dist/react/use-ag-grid-url-sync.js.map +1 -1
- package/package.json +101 -30
package/dist/core/types.d.ts
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
import type { GridApi as AGGridApi, TextFilterModel, NumberFilterModel, DateFilterModel } from 'ag-grid-community';
|
|
2
|
+
/**
|
|
3
|
+
* Serialization modes for URL parameters
|
|
4
|
+
*/
|
|
5
|
+
export type SerializationMode = 'individual' | 'grouped';
|
|
6
|
+
/**
|
|
7
|
+
* Serialization formats for grouped mode
|
|
8
|
+
*/
|
|
9
|
+
export type SerializationFormat = 'querystring' | 'json' | 'base64';
|
|
2
10
|
/**
|
|
3
11
|
* Configuration options for AG Grid URL Sync
|
|
4
12
|
*
|
|
5
13
|
* @example
|
|
6
14
|
* ```typescript
|
|
15
|
+
* // Individual mode (default - backward compatible)
|
|
7
16
|
* const config: AGGridUrlSyncConfig = {
|
|
8
17
|
* paramPrefix: 'filter_',
|
|
9
18
|
* maxValueLength: 500,
|
|
10
19
|
* onParseError: (error) => console.warn('Filter parse error:', error)
|
|
11
20
|
* }
|
|
21
|
+
*
|
|
22
|
+
* // Grouped mode with base64 format
|
|
23
|
+
* const groupedConfig: AGGridUrlSyncConfig = {
|
|
24
|
+
* serialization: 'grouped',
|
|
25
|
+
* format: 'base64',
|
|
26
|
+
* groupedParam: 'filters'
|
|
27
|
+
* }
|
|
12
28
|
* ```
|
|
13
29
|
*/
|
|
14
30
|
export interface AGGridUrlSyncConfig {
|
|
15
31
|
/**
|
|
16
|
-
* Prefix for URL parameters
|
|
32
|
+
* Prefix for URL parameters (only used in individual mode)
|
|
17
33
|
* @default 'f_'
|
|
18
34
|
* @example 'filter_' results in URLs like '?filter_name_contains=john'
|
|
19
35
|
*/
|
|
@@ -28,6 +44,21 @@ export interface AGGridUrlSyncConfig {
|
|
|
28
44
|
* Allows graceful error handling without breaking the application.
|
|
29
45
|
*/
|
|
30
46
|
onParseError?: (error: Error) => void;
|
|
47
|
+
/**
|
|
48
|
+
* Serialization mode for URL parameters
|
|
49
|
+
* @default 'individual'
|
|
50
|
+
*/
|
|
51
|
+
serialization?: SerializationMode;
|
|
52
|
+
/**
|
|
53
|
+
* Parameter name for grouped serialization
|
|
54
|
+
* @default 'grid_filters'
|
|
55
|
+
*/
|
|
56
|
+
groupedParam?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Serialization format for grouped mode
|
|
59
|
+
* @default 'querystring'
|
|
60
|
+
*/
|
|
61
|
+
format?: SerializationFormat;
|
|
31
62
|
}
|
|
32
63
|
/**
|
|
33
64
|
* Internal configuration with all required fields and runtime dependencies
|
|
@@ -39,19 +70,19 @@ export interface InternalConfig extends Required<AGGridUrlSyncConfig> {
|
|
|
39
70
|
/**
|
|
40
71
|
* Text-only filter operations for string-based filtering
|
|
41
72
|
*/
|
|
42
|
-
export declare const TEXT_ONLY_OPERATIONS: readonly [
|
|
73
|
+
export declare const TEXT_ONLY_OPERATIONS: readonly ['contains', 'notContains', 'startsWith', 'endsWith'];
|
|
43
74
|
/**
|
|
44
75
|
* Number-only filter operations for numeric comparisons
|
|
45
76
|
*/
|
|
46
|
-
export declare const NUMBER_ONLY_OPERATIONS: readonly [
|
|
77
|
+
export declare const NUMBER_ONLY_OPERATIONS: readonly ['lessThan', 'lessThanOrEqual', 'greaterThan', 'greaterThanOrEqual', 'inRange'];
|
|
47
78
|
/**
|
|
48
79
|
* Date-specific filter operations for temporal comparisons
|
|
49
80
|
*/
|
|
50
|
-
export declare const DATE_ONLY_OPERATIONS: readonly [
|
|
81
|
+
export declare const DATE_ONLY_OPERATIONS: readonly ['dateBefore', 'dateBeforeOrEqual', 'dateAfter', 'dateAfterOrEqual', 'dateRange'];
|
|
51
82
|
/**
|
|
52
83
|
* Operations shared across multiple filter types
|
|
53
84
|
*/
|
|
54
|
-
export declare const SHARED_OPERATIONS: readonly [
|
|
85
|
+
export declare const SHARED_OPERATIONS: readonly ['eq', 'notEqual', 'blank', 'notBlank'];
|
|
55
86
|
/**
|
|
56
87
|
* All supported filter operations across text, number, and date filters
|
|
57
88
|
*/
|
|
@@ -195,6 +226,12 @@ export declare class InvalidURLError extends URLSyncError {
|
|
|
195
226
|
export declare class InvalidDateError extends InvalidFilterError {
|
|
196
227
|
constructor(message: string, cause?: Error);
|
|
197
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Error thrown when serialization/deserialization fails
|
|
231
|
+
*/
|
|
232
|
+
export declare class InvalidSerializationError extends Error {
|
|
233
|
+
constructor(format: string, cause: Error);
|
|
234
|
+
}
|
|
198
235
|
/**
|
|
199
236
|
* Parsed filter parameter information for internal processing
|
|
200
237
|
*/
|
|
@@ -226,6 +263,39 @@ export interface RawAGGridFilter {
|
|
|
226
263
|
dateFrom?: string;
|
|
227
264
|
dateTo?: string;
|
|
228
265
|
}
|
|
266
|
+
/**
|
|
267
|
+
* Grouped serialization result
|
|
268
|
+
*/
|
|
269
|
+
export interface GroupedSerializationResult {
|
|
270
|
+
/** The parameter name for the grouped filters */
|
|
271
|
+
paramName: string;
|
|
272
|
+
/** The serialized filter value */
|
|
273
|
+
value: string;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Format-specific serializer interface
|
|
277
|
+
*/
|
|
278
|
+
export interface FormatSerializer {
|
|
279
|
+
/** Serialize filter state to string */
|
|
280
|
+
serialize(filterState: FilterState): string;
|
|
281
|
+
/** Deserialize string to filter state */
|
|
282
|
+
deserialize(value: string): FilterState;
|
|
283
|
+
/** Format identifier */
|
|
284
|
+
format: SerializationFormat;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Detection result for grouped parameters
|
|
288
|
+
*/
|
|
289
|
+
export interface GroupedDetectionResult {
|
|
290
|
+
/** Whether grouped serialization was detected */
|
|
291
|
+
isGrouped: boolean;
|
|
292
|
+
/** The parameter name if grouped */
|
|
293
|
+
paramName?: string;
|
|
294
|
+
/** The detected format if grouped */
|
|
295
|
+
format?: SerializationFormat;
|
|
296
|
+
/** The raw value if grouped */
|
|
297
|
+
value?: string;
|
|
298
|
+
}
|
|
229
299
|
/**
|
|
230
300
|
* Maps URL operation names to internal operation types
|
|
231
301
|
*/
|
package/dist/core/types.js
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// FILTER OPERATION DEFINITIONS
|
|
3
|
-
// ============================================================================
|
|
4
|
-
/**
|
|
5
|
-
* Text-only filter operations for string-based filtering
|
|
6
|
-
*/
|
|
7
1
|
export const TEXT_ONLY_OPERATIONS = [
|
|
8
2
|
'contains',
|
|
9
3
|
'notContains',
|
|
10
4
|
'startsWith',
|
|
11
5
|
'endsWith'
|
|
12
6
|
];
|
|
13
|
-
/**
|
|
14
|
-
* Number-only filter operations for numeric comparisons
|
|
15
|
-
*/
|
|
16
7
|
export const NUMBER_ONLY_OPERATIONS = [
|
|
17
8
|
'lessThan',
|
|
18
9
|
'lessThanOrEqual',
|
|
@@ -20,9 +11,6 @@ export const NUMBER_ONLY_OPERATIONS = [
|
|
|
20
11
|
'greaterThanOrEqual',
|
|
21
12
|
'inRange'
|
|
22
13
|
];
|
|
23
|
-
/**
|
|
24
|
-
* Date-specific filter operations for temporal comparisons
|
|
25
|
-
*/
|
|
26
14
|
export const DATE_ONLY_OPERATIONS = [
|
|
27
15
|
'dateBefore',
|
|
28
16
|
'dateBeforeOrEqual',
|
|
@@ -30,93 +18,48 @@ export const DATE_ONLY_OPERATIONS = [
|
|
|
30
18
|
'dateAfterOrEqual',
|
|
31
19
|
'dateRange'
|
|
32
20
|
];
|
|
33
|
-
/**
|
|
34
|
-
* Operations shared across multiple filter types
|
|
35
|
-
*/
|
|
36
21
|
export const SHARED_OPERATIONS = [
|
|
37
22
|
'eq',
|
|
38
23
|
'notEqual',
|
|
39
24
|
'blank',
|
|
40
25
|
'notBlank'
|
|
41
26
|
];
|
|
42
|
-
/**
|
|
43
|
-
* Complete list of valid text filter operations
|
|
44
|
-
*/
|
|
45
27
|
export const TEXT_FILTER_OPERATIONS = [
|
|
46
28
|
...TEXT_ONLY_OPERATIONS,
|
|
47
29
|
...SHARED_OPERATIONS
|
|
48
30
|
];
|
|
49
|
-
/**
|
|
50
|
-
* Complete list of valid number filter operations
|
|
51
|
-
*/
|
|
52
31
|
export const NUMBER_FILTER_OPERATIONS = [
|
|
53
32
|
...NUMBER_ONLY_OPERATIONS,
|
|
54
33
|
...SHARED_OPERATIONS
|
|
55
34
|
];
|
|
56
|
-
/**
|
|
57
|
-
* Valid date filter operations as const array
|
|
58
|
-
*/
|
|
59
35
|
export const DATE_FILTER_OPERATIONS = [
|
|
60
36
|
...DATE_ONLY_OPERATIONS,
|
|
61
37
|
...SHARED_OPERATIONS
|
|
62
38
|
];
|
|
63
|
-
// ============================================================================
|
|
64
|
-
// TYPE GUARDS
|
|
65
|
-
// ============================================================================
|
|
66
|
-
/**
|
|
67
|
-
* Type guard to check if an operation is text-specific
|
|
68
|
-
*/
|
|
69
39
|
export function isTextFilterOperation(op) {
|
|
70
40
|
return TEXT_FILTER_OPERATIONS.includes(op);
|
|
71
41
|
}
|
|
72
|
-
/**
|
|
73
|
-
* Type guard to check if an operation is number-specific
|
|
74
|
-
*/
|
|
75
42
|
export function isNumberFilterOperation(op) {
|
|
76
43
|
return NUMBER_FILTER_OPERATIONS.includes(op);
|
|
77
44
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Type guard to check if an operation is date-specific
|
|
80
|
-
*/
|
|
81
45
|
export function isDateFilterOperation(op) {
|
|
82
46
|
return DATE_FILTER_OPERATIONS.includes(op);
|
|
83
47
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Type guard to check if an operation requires a range (two values)
|
|
86
|
-
*/
|
|
87
48
|
export function isRangeOperation(op) {
|
|
88
49
|
return op === 'inRange' || op === 'dateRange';
|
|
89
50
|
}
|
|
90
|
-
/**
|
|
91
|
-
* Type guard to check if an operation is a blank operation
|
|
92
|
-
*/
|
|
93
51
|
export function isBlankOperation(op) {
|
|
94
52
|
return op === 'blank' || op === 'notBlank';
|
|
95
53
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Type guard to check if a filter is a text filter
|
|
98
|
-
*/
|
|
99
54
|
export function isTextFilter(filter) {
|
|
100
55
|
return filter.filterType === 'text';
|
|
101
56
|
}
|
|
102
|
-
/**
|
|
103
|
-
* Type guard to check if a filter is a number filter
|
|
104
|
-
*/
|
|
105
57
|
export function isNumberFilter(filter) {
|
|
106
58
|
return filter.filterType === 'number';
|
|
107
59
|
}
|
|
108
|
-
/**
|
|
109
|
-
* Type guard to check if a filter is a date filter
|
|
110
|
-
*/
|
|
111
60
|
export function isDateFilter(filter) {
|
|
112
61
|
return filter.filterType === 'date';
|
|
113
62
|
}
|
|
114
|
-
// ============================================================================
|
|
115
|
-
// ERROR TYPES
|
|
116
|
-
// ============================================================================
|
|
117
|
-
/**
|
|
118
|
-
* Base error class for all URL sync operations
|
|
119
|
-
*/
|
|
120
63
|
export class URLSyncError extends Error {
|
|
121
64
|
cause;
|
|
122
65
|
constructor(message, cause) {
|
|
@@ -125,96 +68,59 @@ export class URLSyncError extends Error {
|
|
|
125
68
|
this.name = 'URLSyncError';
|
|
126
69
|
}
|
|
127
70
|
}
|
|
128
|
-
/**
|
|
129
|
-
* Error thrown when filter validation fails
|
|
130
|
-
*/
|
|
131
71
|
export class InvalidFilterError extends URLSyncError {
|
|
132
72
|
constructor(message, cause) {
|
|
133
73
|
super(message, cause);
|
|
134
74
|
this.name = 'InvalidFilterError';
|
|
135
75
|
}
|
|
136
76
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Error thrown when URL parsing fails
|
|
139
|
-
*/
|
|
140
77
|
export class InvalidURLError extends URLSyncError {
|
|
141
78
|
constructor(message, cause) {
|
|
142
79
|
super(message, cause);
|
|
143
80
|
this.name = 'InvalidURLError';
|
|
144
81
|
}
|
|
145
82
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Error thrown when date validation fails
|
|
148
|
-
*/
|
|
149
83
|
export class InvalidDateError extends InvalidFilterError {
|
|
150
84
|
constructor(message, cause) {
|
|
151
85
|
super(message, cause);
|
|
152
86
|
this.name = 'InvalidDateError';
|
|
153
87
|
}
|
|
154
88
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
*
|
|
163
|
-
* 1. URL Parameters: Short, clean names for URLs (e.g., 'eq', 'neq', 'before', 'after')
|
|
164
|
-
* 2. Internal Types: Consistent naming for our FilterOperation type
|
|
165
|
-
* 3. AG Grid Operations: Exact names expected by AG Grid API (e.g., 'equals', 'notEqual', 'lessThan')
|
|
166
|
-
*
|
|
167
|
-
* This approach keeps URLs readable while maintaining compatibility with AG Grid.
|
|
168
|
-
*/
|
|
169
|
-
/**
|
|
170
|
-
* URL shorthand mappings for cleaner URLs.
|
|
171
|
-
* Maps internal operation names to shorter URL parameter names.
|
|
172
|
-
* Operations not listed here use their internal name as URL param.
|
|
173
|
-
*/
|
|
89
|
+
export class InvalidSerializationError extends Error {
|
|
90
|
+
constructor(format, cause) {
|
|
91
|
+
super(`Invalid ${format} serialization: ${cause.message}`);
|
|
92
|
+
this.name = 'InvalidSerializationError';
|
|
93
|
+
this.cause = cause;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
174
96
|
const URL_SHORTHAND_MAPPINGS = {
|
|
175
|
-
// Shared operations
|
|
176
97
|
notEqual: 'neq',
|
|
177
|
-
// Number operations
|
|
178
98
|
lessThan: 'lt',
|
|
179
99
|
lessThanOrEqual: 'lte',
|
|
180
100
|
greaterThan: 'gt',
|
|
181
101
|
greaterThanOrEqual: 'gte',
|
|
182
102
|
inRange: 'range',
|
|
183
|
-
// Date operations
|
|
184
103
|
dateBefore: 'before',
|
|
185
104
|
dateBeforeOrEqual: 'beforeEq',
|
|
186
105
|
dateAfter: 'after',
|
|
187
106
|
dateAfterOrEqual: 'afterEq',
|
|
188
107
|
dateRange: 'daterange'
|
|
189
108
|
};
|
|
190
|
-
/**
|
|
191
|
-
* AG Grid operation name mappings.
|
|
192
|
-
* Maps internal operation names to AG Grid API operation names.
|
|
193
|
-
* Operations not listed here use their internal name for AG Grid.
|
|
194
|
-
*/
|
|
195
109
|
const AG_GRID_NAME_MAPPINGS = {
|
|
196
|
-
// Shared operations
|
|
197
110
|
eq: 'equals',
|
|
198
|
-
// Date operations (AG Grid uses generic names)
|
|
199
111
|
dateBefore: 'lessThan',
|
|
200
112
|
dateBeforeOrEqual: 'lessThanOrEqual',
|
|
201
113
|
dateAfter: 'greaterThan',
|
|
202
114
|
dateAfterOrEqual: 'greaterThanOrEqual',
|
|
203
115
|
dateRange: 'inRange'
|
|
204
116
|
};
|
|
205
|
-
/**
|
|
206
|
-
* Creates operation mapping tables for URL and AG Grid integration
|
|
207
|
-
*/
|
|
208
117
|
function createOperationMaps() {
|
|
209
|
-
// Get all unique operations across filter types
|
|
210
118
|
const allOperations = [
|
|
211
119
|
...TEXT_FILTER_OPERATIONS,
|
|
212
120
|
...NUMBER_FILTER_OPERATIONS,
|
|
213
121
|
...DATE_FILTER_OPERATIONS
|
|
214
122
|
];
|
|
215
|
-
// Remove duplicates (operations like 'eq', 'blank' appear in multiple arrays)
|
|
216
123
|
const uniqueOperations = [...new Set(allOperations)];
|
|
217
|
-
// Generate URL mappings (bidirectional)
|
|
218
124
|
const operationMap = {};
|
|
219
125
|
const internalToUrlMap = {};
|
|
220
126
|
uniqueOperations.forEach(operation => {
|
|
@@ -222,7 +128,6 @@ function createOperationMaps() {
|
|
|
222
128
|
operationMap[urlName] = operation;
|
|
223
129
|
internalToUrlMap[operation] = urlName;
|
|
224
130
|
});
|
|
225
|
-
// Generate AG Grid mappings (bidirectional)
|
|
226
131
|
const agGridMap = {};
|
|
227
132
|
const reverseAgGridMap = {};
|
|
228
133
|
uniqueOperations.forEach(operation => {
|
|
@@ -238,22 +143,9 @@ function createOperationMaps() {
|
|
|
238
143
|
reverseAgGridMap
|
|
239
144
|
};
|
|
240
145
|
}
|
|
241
|
-
// Generate all mappings dynamically
|
|
242
146
|
const mappings = createOperationMaps();
|
|
243
|
-
/**
|
|
244
|
-
* Maps URL operation names to internal operation types
|
|
245
|
-
*/
|
|
246
147
|
export const OPERATION_MAP = mappings.operationMap;
|
|
247
|
-
/**
|
|
248
|
-
* Maps internal operation types to URL operation names
|
|
249
|
-
*/
|
|
250
148
|
export const INTERNAL_TO_URL_OPERATION_MAP = mappings.internalToUrlMap;
|
|
251
|
-
/**
|
|
252
|
-
* Maps internal operation types to AG Grid operation names
|
|
253
|
-
*/
|
|
254
149
|
export const AG_GRID_OPERATION_NAMES = mappings.agGridMap;
|
|
255
|
-
/**
|
|
256
|
-
* Maps AG Grid operation names to internal operation types
|
|
257
|
-
*/
|
|
258
150
|
export const REVERSE_AG_GRID_OPERATION_NAMES = mappings.reverseAgGridMap;
|
|
259
151
|
//# sourceMappingURL=types.js.map
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,96 +1,71 @@
|
|
|
1
1
|
import { validateFilterValue } from './validation.js';
|
|
2
2
|
import { INTERNAL_TO_URL_OPERATION_MAP } from './types.js';
|
|
3
|
+
import { serializeGrouped } from './serialization/grouped.js';
|
|
3
4
|
const FILTER_TYPES = {
|
|
4
5
|
TEXT: 'text',
|
|
5
6
|
NUMBER: 'number',
|
|
6
7
|
DATE: 'date'
|
|
7
8
|
};
|
|
8
|
-
/**
|
|
9
|
-
* Serializes a single column filter to URL parameter
|
|
10
|
-
*/
|
|
11
9
|
function serializeColumnFilter(columnName, filter, paramPrefix) {
|
|
12
10
|
const urlOperation = INTERNAL_TO_URL_OPERATION_MAP[filter.type];
|
|
13
11
|
if (!urlOperation)
|
|
14
12
|
return '';
|
|
15
13
|
const paramName = `${paramPrefix}${columnName}_${urlOperation}`;
|
|
16
|
-
// Handle date range operations
|
|
17
14
|
if (filter.type === 'dateRange' && filter.filterType === FILTER_TYPES.DATE) {
|
|
18
|
-
// Type guard: ensure this is a DateColumnFilter with dateRange operation
|
|
19
15
|
if ('filterTo' in filter && filter.filterTo !== undefined) {
|
|
20
|
-
// Don't encode the comma for range values - handle this directly
|
|
21
16
|
return `${paramName}=${filter.filter},${filter.filterTo}`;
|
|
22
17
|
}
|
|
23
18
|
return '';
|
|
24
19
|
}
|
|
25
|
-
// Handle number range operations
|
|
26
20
|
if (filter.type === 'inRange' && filter.filterType === FILTER_TYPES.NUMBER) {
|
|
27
|
-
// Type guard: ensure this is a NumberColumnFilter with inRange operation
|
|
28
21
|
if ('filterTo' in filter && filter.filterTo !== undefined) {
|
|
29
|
-
// Don't encode the comma for range values - handle this directly
|
|
30
22
|
return `${paramName}=${filter.filter},${filter.filterTo}`;
|
|
31
23
|
}
|
|
32
24
|
return '';
|
|
33
25
|
}
|
|
34
|
-
// Handle blank operations (shared across text, number, and date)
|
|
35
26
|
if (filter.type === 'blank' || filter.type === 'notBlank') {
|
|
36
27
|
return `${paramName}=true`;
|
|
37
28
|
}
|
|
38
|
-
// Handle date operations (ISO date format preservation)
|
|
39
29
|
if (filter.filterType === FILTER_TYPES.DATE) {
|
|
40
|
-
return `${paramName}=${filter.filter}`;
|
|
30
|
+
return `${paramName}=${filter.filter}`;
|
|
41
31
|
}
|
|
42
|
-
// Handle number operations
|
|
43
32
|
if (filter.filterType === FILTER_TYPES.NUMBER) {
|
|
44
33
|
return `${paramName}=${filter.filter}`;
|
|
45
34
|
}
|
|
46
|
-
// Handle text operations (existing logic)
|
|
47
35
|
if (filter.filterType === FILTER_TYPES.TEXT && filter.filter) {
|
|
48
|
-
// Note: Validation should be done at the serializeFilters level, not here
|
|
49
36
|
return `${paramName}=${encodeURIComponent(filter.filter.toString())}`;
|
|
50
37
|
}
|
|
51
38
|
return '';
|
|
52
39
|
}
|
|
53
|
-
/**
|
|
54
|
-
* Helper function to append a serialized parameter to URLSearchParams
|
|
55
|
-
*/
|
|
56
40
|
function appendSerializedParam(serialized, params, isRangeOperation = false) {
|
|
57
41
|
const [paramName, paramValue] = serialized.split('=');
|
|
58
42
|
if (paramName && paramValue) {
|
|
59
43
|
if (isRangeOperation) {
|
|
60
|
-
// For range operations (which contain commas), don't decode
|
|
61
44
|
params.append(paramName, paramValue);
|
|
62
45
|
}
|
|
63
46
|
else {
|
|
64
|
-
// For regular operations, decode special characters for text filters
|
|
65
47
|
params.append(paramName, decodeURIComponent(paramValue));
|
|
66
48
|
}
|
|
67
49
|
}
|
|
68
50
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Converts a filter state object into URL search parameters
|
|
71
|
-
*/
|
|
72
51
|
export function serializeFilters(filterState, config) {
|
|
73
52
|
const params = new URLSearchParams();
|
|
74
53
|
for (const [column, filter] of Object.entries(filterState)) {
|
|
75
|
-
// Support text, number, and date filters
|
|
76
54
|
if (filter.filterType !== FILTER_TYPES.TEXT &&
|
|
77
55
|
filter.filterType !== FILTER_TYPES.NUMBER &&
|
|
78
56
|
filter.filterType !== FILTER_TYPES.DATE)
|
|
79
57
|
continue;
|
|
80
|
-
// Apply validation for text filters before serialization
|
|
81
58
|
if (filter.filterType === FILTER_TYPES.TEXT) {
|
|
82
59
|
const validatedValue = validateFilterValue(filter.filter, config, filter.type);
|
|
83
60
|
const updatedFilter = { ...filter, filter: validatedValue };
|
|
84
61
|
const serialized = serializeColumnFilter(column, updatedFilter, config.paramPrefix);
|
|
85
62
|
if (serialized) {
|
|
86
|
-
appendSerializedParam(serialized, params, false);
|
|
63
|
+
appendSerializedParam(serialized, params, false);
|
|
87
64
|
}
|
|
88
65
|
}
|
|
89
66
|
else {
|
|
90
|
-
// Number and date filters don't need additional validation as they're already validated
|
|
91
67
|
const serialized = serializeColumnFilter(column, filter, config.paramPrefix);
|
|
92
68
|
if (serialized) {
|
|
93
|
-
// Check if this is a range operation
|
|
94
69
|
const isRangeOp = filter.type === 'inRange' || filter.type === 'dateRange';
|
|
95
70
|
appendSerializedParam(serialized, params, isRangeOp);
|
|
96
71
|
}
|
|
@@ -98,23 +73,30 @@ export function serializeFilters(filterState, config) {
|
|
|
98
73
|
}
|
|
99
74
|
return params;
|
|
100
75
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
76
|
+
function getPreservedParams(url, config, excludeParam) {
|
|
77
|
+
const params = new URLSearchParams();
|
|
78
|
+
for (const [key, value] of url.searchParams.entries()) {
|
|
79
|
+
if ((excludeParam && key === excludeParam) ||
|
|
80
|
+
(config.paramPrefix && key.startsWith(config.paramPrefix))) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
params.set(key, value);
|
|
84
|
+
}
|
|
85
|
+
return params;
|
|
86
|
+
}
|
|
104
87
|
export function generateUrl(baseUrl, filterState, config) {
|
|
105
88
|
const url = new URL(baseUrl);
|
|
89
|
+
if (config.serialization === 'grouped') {
|
|
90
|
+
return generateGroupedUrl(baseUrl, filterState, config);
|
|
91
|
+
}
|
|
106
92
|
const filterParams = serializeFilters(filterState, config);
|
|
107
|
-
|
|
108
|
-
for (const [key, value] of
|
|
109
|
-
|
|
110
|
-
filterParams.append(key, value);
|
|
111
|
-
}
|
|
93
|
+
const preservedParams = getPreservedParams(url, config);
|
|
94
|
+
for (const [key, value] of preservedParams.entries()) {
|
|
95
|
+
filterParams.append(key, value);
|
|
112
96
|
}
|
|
113
97
|
const queryString = filterParams.toString();
|
|
114
|
-
// If no filters, return the base URL without query string or trailing slash
|
|
115
98
|
if (!queryString) {
|
|
116
99
|
let result = url.toString().replace(/\?$/, '');
|
|
117
|
-
// Remove trailing slash for root paths when no query parameters
|
|
118
100
|
if (result.endsWith('/') && result === url.origin + '/') {
|
|
119
101
|
result = result.slice(0, -1);
|
|
120
102
|
}
|
|
@@ -123,4 +105,28 @@ export function generateUrl(baseUrl, filterState, config) {
|
|
|
123
105
|
url.search = queryString;
|
|
124
106
|
return url.toString();
|
|
125
107
|
}
|
|
108
|
+
function generateGroupedUrl(baseUrl, filterState, config) {
|
|
109
|
+
const url = new URL(baseUrl);
|
|
110
|
+
const groupedResult = serializeGrouped(filterState, config);
|
|
111
|
+
const preservedParams = getPreservedParams(url, config, config.groupedParam);
|
|
112
|
+
url.search = '';
|
|
113
|
+
for (const [key, value] of preservedParams.entries()) {
|
|
114
|
+
url.searchParams.set(key, value);
|
|
115
|
+
}
|
|
116
|
+
if (groupedResult.value) {
|
|
117
|
+
url.searchParams.set(groupedResult.paramName, groupedResult.value);
|
|
118
|
+
}
|
|
119
|
+
if (!groupedResult.value && url.searchParams.has(config.groupedParam)) {
|
|
120
|
+
url.searchParams.delete(config.groupedParam);
|
|
121
|
+
}
|
|
122
|
+
const queryString = url.searchParams.toString();
|
|
123
|
+
if (!queryString) {
|
|
124
|
+
let result = url.toString().replace(/\?$/, '');
|
|
125
|
+
if (result.endsWith('/') && result === url.origin + '/') {
|
|
126
|
+
result = result.slice(0, -1);
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
return url.toString();
|
|
131
|
+
}
|
|
126
132
|
//# sourceMappingURL=url-generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url-generator.js","sourceRoot":"","sources":["../../src/core/url-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"url-generator.js","sourceRoot":"","sources":["../../src/core/url-generator.ts"],"names":[],"mappings":"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"}
|