ag-grid-url-sync 0.1.1 → 0.2.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.
Files changed (42) hide show
  1. package/README.md +407 -43
  2. package/dist/{ag-grid-url-sync.js → core/ag-grid-url-sync.js} +4 -2
  3. package/dist/core/ag-grid-url-sync.js.map +1 -0
  4. package/dist/core/grid-integration.d.ts +9 -0
  5. package/dist/core/grid-integration.js +66 -0
  6. package/dist/core/grid-integration.js.map +1 -0
  7. package/dist/core/index.d.ts +6 -0
  8. package/dist/core/index.js +11 -0
  9. package/dist/core/index.js.map +1 -0
  10. package/dist/core/types.d.ts +112 -0
  11. package/dist/core/types.js +79 -0
  12. package/dist/core/types.js.map +1 -0
  13. package/dist/core/url-generator.d.ts +9 -0
  14. package/dist/core/url-generator.js +42 -0
  15. package/dist/core/url-generator.js.map +1 -0
  16. package/dist/core/url-parser.d.ts +9 -0
  17. package/dist/core/url-parser.js +85 -0
  18. package/dist/core/url-parser.js.map +1 -0
  19. package/dist/core/validation.d.ts +18 -0
  20. package/dist/core/validation.js +28 -0
  21. package/dist/core/validation.js.map +1 -0
  22. package/dist/index.d.ts +6 -3
  23. package/dist/index.js +11 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/react/index.d.ts +3 -0
  26. package/dist/react/index.js +2 -0
  27. package/dist/react/index.js.map +1 -0
  28. package/dist/react/types.d.ts +64 -0
  29. package/dist/react/types.js +2 -0
  30. package/dist/react/types.js.map +1 -0
  31. package/dist/react/use-ag-grid-url-sync.d.ts +10 -0
  32. package/dist/react/use-ag-grid-url-sync.js +215 -0
  33. package/dist/react/use-ag-grid-url-sync.js.map +1 -0
  34. package/package.json +95 -6
  35. package/dist/ag-grid-url-sync.js.map +0 -1
  36. package/dist/types.d.ts +0 -69
  37. package/dist/types.js +0 -31
  38. package/dist/types.js.map +0 -1
  39. package/dist/utils.d.ts +0 -36
  40. package/dist/utils.js +0 -188
  41. package/dist/utils.js.map +0 -1
  42. /package/dist/{ag-grid-url-sync.d.ts → core/ag-grid-url-sync.d.ts} +0 -0
@@ -0,0 +1,215 @@
1
+ import { useState, useEffect, useRef, useCallback, useMemo } from 'react';
2
+ import { AGGridUrlSync } from '../core/ag-grid-url-sync.js';
3
+ import { parseUrlFilters as parseFilters } from '../core/url-parser.js';
4
+ import { DEFAULT_CONFIG } from '../core/validation.js';
5
+ /**
6
+ * React hook for AG Grid URL synchronization
7
+ *
8
+ * @param gridApi - AG Grid API instance (can be null during initialization)
9
+ * @param options - Configuration options for the hook
10
+ * @returns Hook API for URL synchronization
11
+ */
12
+ export function useAGGridUrlSync(gridApi, options = {}) {
13
+ const { autoApplyOnMount = false, enabledWhenReady = true, ...coreOptions } = options;
14
+ // Internal state
15
+ const [isReady, setIsReady] = useState(false);
16
+ const [currentUrl, setCurrentUrl] = useState('');
17
+ const [hasFilters, setHasFilters] = useState(false);
18
+ // Refs to track state and prevent memory leaks
19
+ const urlSyncRef = useRef(null);
20
+ const autoAppliedRef = useRef(false);
21
+ const lastGridApiRef = useRef(null);
22
+ // Initialize or update URL sync instance when grid API changes
23
+ useEffect(() => {
24
+ if (gridApi && enabledWhenReady) {
25
+ // Clean up previous instance if grid API changed
26
+ if (lastGridApiRef.current && lastGridApiRef.current !== gridApi) {
27
+ urlSyncRef.current?.destroy();
28
+ urlSyncRef.current = null;
29
+ autoAppliedRef.current = false;
30
+ }
31
+ // Create new instance if needed
32
+ if (!urlSyncRef.current) {
33
+ try {
34
+ urlSyncRef.current = new AGGridUrlSync(gridApi, coreOptions);
35
+ setIsReady(true);
36
+ lastGridApiRef.current = gridApi;
37
+ }
38
+ catch (error) {
39
+ console.error('Failed to initialize AG Grid URL Sync:', error);
40
+ setIsReady(false);
41
+ }
42
+ }
43
+ }
44
+ else {
45
+ // Clean up when grid API is null or disabled
46
+ if (urlSyncRef.current) {
47
+ urlSyncRef.current.destroy();
48
+ urlSyncRef.current = null;
49
+ autoAppliedRef.current = false;
50
+ }
51
+ setIsReady(false);
52
+ lastGridApiRef.current = null;
53
+ }
54
+ }, [gridApi, enabledWhenReady, coreOptions]);
55
+ // Auto-apply URL filters on mount if enabled
56
+ useEffect(() => {
57
+ if (isReady &&
58
+ autoApplyOnMount &&
59
+ !autoAppliedRef.current &&
60
+ urlSyncRef.current) {
61
+ try {
62
+ urlSyncRef.current.applyFromUrl();
63
+ autoAppliedRef.current = true;
64
+ }
65
+ catch (error) {
66
+ console.error('Failed to auto-apply URL filters:', error);
67
+ coreOptions.onParseError?.(error);
68
+ }
69
+ }
70
+ }, [isReady, autoApplyOnMount, coreOptions]);
71
+ // Update current URL and filter state on filter changes
72
+ useEffect(() => {
73
+ if (!isReady || !urlSyncRef.current || !gridApi) {
74
+ setCurrentUrl('');
75
+ setHasFilters(false);
76
+ return;
77
+ }
78
+ const updateState = () => {
79
+ try {
80
+ const newUrl = urlSyncRef.current.generateUrl();
81
+ setCurrentUrl(newUrl);
82
+ // Check if there are active filters by comparing query params
83
+ const queryParams = urlSyncRef.current.getQueryParams();
84
+ const searchParams = new URLSearchParams(queryParams);
85
+ setHasFilters([...searchParams.entries()].length > 0); // Check if there are any query parameters
86
+ }
87
+ catch (error) {
88
+ console.error('Failed to update URL state:', error);
89
+ }
90
+ };
91
+ // Attach event listener for filter changes
92
+ const onFilterChanged = () => updateState();
93
+ gridApi.addEventListener('filterChanged', onFilterChanged);
94
+ // Initial state update
95
+ updateState();
96
+ // Cleanup event listener on unmount or gridApi change
97
+ return () => {
98
+ gridApi.removeEventListener('filterChanged', onFilterChanged);
99
+ };
100
+ }, [isReady, gridApi]);
101
+ // Cleanup on unmount
102
+ useEffect(() => {
103
+ return () => {
104
+ if (urlSyncRef.current) {
105
+ urlSyncRef.current.destroy();
106
+ urlSyncRef.current = null;
107
+ }
108
+ };
109
+ }, []);
110
+ // Memoized API methods
111
+ const shareUrl = useCallback((baseUrl) => {
112
+ if (!urlSyncRef.current) {
113
+ return (baseUrl || (typeof window !== 'undefined' ? window.location.href : ''));
114
+ }
115
+ try {
116
+ return urlSyncRef.current.generateUrl(baseUrl);
117
+ }
118
+ catch (error) {
119
+ console.error('Failed to generate share URL:', error);
120
+ return (baseUrl || (typeof window !== 'undefined' ? window.location.href : ''));
121
+ }
122
+ }, []);
123
+ const getQueryParams = useCallback(() => {
124
+ if (!urlSyncRef.current) {
125
+ return '';
126
+ }
127
+ try {
128
+ return urlSyncRef.current.getQueryParams();
129
+ }
130
+ catch (error) {
131
+ console.error('Failed to get query params:', error);
132
+ return '';
133
+ }
134
+ }, []);
135
+ const applyUrlFilters = useCallback((url) => {
136
+ if (!urlSyncRef.current) {
137
+ console.warn('AG Grid URL Sync not ready');
138
+ return;
139
+ }
140
+ try {
141
+ urlSyncRef.current.applyFromUrl(url);
142
+ }
143
+ catch (error) {
144
+ console.error('Failed to apply URL filters:', error);
145
+ coreOptions.onParseError?.(error);
146
+ }
147
+ }, [coreOptions]);
148
+ const clearFilters = useCallback(() => {
149
+ if (!urlSyncRef.current) {
150
+ console.warn('AG Grid URL Sync not ready');
151
+ return;
152
+ }
153
+ try {
154
+ urlSyncRef.current.clearFilters();
155
+ }
156
+ catch (error) {
157
+ console.error('Failed to clear filters:', error);
158
+ }
159
+ }, []);
160
+ const parseUrlFilters = useCallback((url) => {
161
+ if (!gridApi) {
162
+ console.warn('AG Grid API not available');
163
+ return {};
164
+ }
165
+ try {
166
+ const config = {
167
+ gridApi,
168
+ paramPrefix: coreOptions.paramPrefix ?? DEFAULT_CONFIG.paramPrefix,
169
+ maxValueLength: coreOptions.maxValueLength ?? DEFAULT_CONFIG.maxValueLength,
170
+ onParseError: coreOptions.onParseError ?? (() => { })
171
+ };
172
+ return parseFilters(url, config);
173
+ }
174
+ catch (error) {
175
+ console.error('Failed to parse URL filters:', error);
176
+ coreOptions.onParseError?.(error);
177
+ return {};
178
+ }
179
+ }, [coreOptions, gridApi]);
180
+ const applyFilters = useCallback((filters) => {
181
+ if (!urlSyncRef.current) {
182
+ console.warn('AG Grid URL Sync not ready');
183
+ return;
184
+ }
185
+ try {
186
+ urlSyncRef.current.applyFilters(filters);
187
+ }
188
+ catch (error) {
189
+ console.error('Failed to apply filters:', error);
190
+ }
191
+ }, []);
192
+ // Return the hook API
193
+ return useMemo(() => ({
194
+ shareUrl,
195
+ getQueryParams,
196
+ applyUrlFilters,
197
+ clearFilters,
198
+ isReady,
199
+ currentUrl,
200
+ hasFilters,
201
+ parseUrlFilters,
202
+ applyFilters
203
+ }), [
204
+ shareUrl,
205
+ getQueryParams,
206
+ applyUrlFilters,
207
+ clearFilters,
208
+ isReady,
209
+ currentUrl,
210
+ hasFilters,
211
+ parseUrlFilters,
212
+ applyFilters
213
+ ]);
214
+ }
215
+ //# sourceMappingURL=use-ag-grid-url-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-ag-grid-url-sync.js","sourceRoot":"","sources":["../../src/react/use-ag-grid-url-sync.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,72 @@
1
1
  {
2
2
  "name": "ag-grid-url-sync",
3
- "version": "0.1.1",
3
+ "version": "0.2.1",
4
4
  "description": "AG Grid URL Sync - Synchronize AG Grid text filters with URL parameters",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
+ "sideEffects": false,
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.js"
13
+ },
14
+ "./react": {
15
+ "types": "./dist/react/index.d.ts",
16
+ "import": "./dist/react/index.js",
17
+ "require": "./dist/react/index.js"
18
+ },
19
+ "./validation": {
20
+ "types": "./dist/core/validation.d.ts",
21
+ "import": "./dist/core/validation.js",
22
+ "require": "./dist/core/validation.js"
23
+ },
24
+ "./url-parser": {
25
+ "types": "./dist/core/url-parser.d.ts",
26
+ "import": "./dist/core/url-parser.js",
27
+ "require": "./dist/core/url-parser.js"
28
+ },
29
+ "./url-generator": {
30
+ "types": "./dist/core/url-generator.d.ts",
31
+ "import": "./dist/core/url-generator.js",
32
+ "require": "./dist/core/url-generator.js"
33
+ },
34
+ "./grid-integration": {
35
+ "types": "./dist/core/grid-integration.d.ts",
36
+ "import": "./dist/core/grid-integration.js",
37
+ "require": "./dist/core/grid-integration.js"
38
+ },
39
+ "./types": {
40
+ "types": "./dist/core/types.d.ts",
41
+ "import": "./dist/core/types.js",
42
+ "require": "./dist/core/types.js"
43
+ }
44
+ },
45
+ "typesVersions": {
46
+ "*": {
47
+ ".": [
48
+ "dist/index.d.ts"
49
+ ],
50
+ "react": [
51
+ "dist/react/index.d.ts"
52
+ ],
53
+ "validation": [
54
+ "dist/core/validation.d.ts"
55
+ ],
56
+ "url-parser": [
57
+ "dist/core/url-parser.d.ts"
58
+ ],
59
+ "url-generator": [
60
+ "dist/core/url-generator.d.ts"
61
+ ],
62
+ "grid-integration": [
63
+ "dist/core/grid-integration.d.ts"
64
+ ],
65
+ "types": [
66
+ "dist/core/types.d.ts"
67
+ ]
68
+ }
69
+ },
7
70
  "scripts": {
8
71
  "lint": "eslint .",
9
72
  "lint:fix": "eslint . --fix",
@@ -31,7 +94,8 @@
31
94
  "sync",
32
95
  "filter",
33
96
  "share",
34
- "typescript"
97
+ "typescript",
98
+ "react"
35
99
  ],
36
100
  "author": "NearForm",
37
101
  "license": "ISC",
@@ -47,7 +111,9 @@
47
111
  "@commitlint/cli": "^19.8.1",
48
112
  "@commitlint/config-conventional": "^19.8.1",
49
113
  "@eslint/js": "^9.29.0",
114
+ "@testing-library/react": "^14.0.0",
50
115
  "@types/jsdom": "^21.1.7",
116
+ "@types/react": "^18.0.0",
51
117
  "@vitest/coverage-v8": "^3.2.4",
52
118
  "ag-grid-community": "^33.3.2",
53
119
  "bundlesize": "^0.18.2",
@@ -59,12 +125,19 @@
59
125
  "jsdom": "^26.1.0",
60
126
  "lint-staged": "^16.1.2",
61
127
  "prettier": "^3.6.0",
128
+ "react": "^18.0.0",
62
129
  "rimraf": "^6.0.1",
63
130
  "typescript": "^5.8.3",
64
131
  "vitest": "^3.2.4"
65
132
  },
66
133
  "peerDependencies": {
67
- "ag-grid-community": ">=28.0.0"
134
+ "ag-grid-community": ">=28.0.0",
135
+ "react": ">=16.8.0"
136
+ },
137
+ "peerDependenciesMeta": {
138
+ "react": {
139
+ "optional": true
140
+ }
68
141
  },
69
142
  "lint-staged": {
70
143
  "*.{js,jsx,ts,tsx}": "eslint --cache --fix"
@@ -75,12 +148,28 @@
75
148
  "maxSize": "5KB"
76
149
  },
77
150
  {
78
- "path": "./dist/ag-grid-url-sync.js",
151
+ "path": "./dist/core/ag-grid-url-sync.js",
79
152
  "maxSize": "4KB"
80
153
  },
81
154
  {
82
- "path": "./dist/utils.js",
83
- "maxSize": "4KB"
155
+ "path": "./dist/core/validation.js",
156
+ "maxSize": "2KB"
157
+ },
158
+ {
159
+ "path": "./dist/core/url-parser.js",
160
+ "maxSize": "3KB"
161
+ },
162
+ {
163
+ "path": "./dist/core/url-generator.js",
164
+ "maxSize": "2KB"
165
+ },
166
+ {
167
+ "path": "./dist/core/grid-integration.js",
168
+ "maxSize": "2KB"
169
+ },
170
+ {
171
+ "path": "./dist/react/index.js",
172
+ "maxSize": "7KB"
84
173
  }
85
174
  ]
86
175
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"ag-grid-url-sync.js","sourceRoot":"","sources":["../src/ag-grid-url-sync.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EACL,eAAe,EACf,WAAW,EACX,cAAc,EACd,gBAAgB,EACjB,MAAM,YAAY,CAAA;AAEnB;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAgB;IAE9B;;;;OAIG;IACH,YAAY,OAAgB,EAAE,SAA8B,EAAE;QAC5D,IAAI,CAAC,MAAM,GAAG;YACZ,OAAO;YACP,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,cAAc,CAAC,WAAW;YAC7D,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,cAAc,CAAC,cAAc;YACtE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SAChD,CAAA;IACH,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAgB;QAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,MAAM,GAAG,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAA;QAC3C,OAAO,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACnD,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,OAAO,MAAM,CAAC,MAAM,CAAA;IACtB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,GAAY;QACvB,MAAM,UAAU,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAA;QAC9C,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QAC5D,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,WAAwB;QACnC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IAC5C,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IACvB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,2DAA2D;IAC7D,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAgB,EAChB,MAA4B;IAE5B,OAAO,IAAI,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC3C,CAAC"}
package/dist/types.d.ts DELETED
@@ -1,69 +0,0 @@
1
- import type { GridApi as AGGridApi } from 'ag-grid-community';
2
- /**
3
- * Configuration options for AG Grid URL Sync
4
- */
5
- export interface AGGridUrlSyncConfig {
6
- /**
7
- * Prefix for URL parameters. Default: 'f_'
8
- */
9
- paramPrefix?: string;
10
- /**
11
- * Maximum length for filter values. Default: 200
12
- */
13
- maxValueLength?: number;
14
- /**
15
- * Optional error handler for parsing errors
16
- */
17
- onParseError?: (error: Error) => void;
18
- }
19
- /**
20
- * Supported filter operations
21
- */
22
- export type FilterOperation = 'contains' | 'eq';
23
- /**
24
- * Filter state for a single column
25
- */
26
- export interface ColumnFilter {
27
- filterType: 'text';
28
- type: FilterOperation;
29
- filter: string;
30
- }
31
- /**
32
- * Complete filter state mapping
33
- */
34
- export interface FilterState {
35
- [columnId: string]: ColumnFilter;
36
- }
37
- /**
38
- * Internal configuration with defaults
39
- */
40
- export interface InternalConfig extends Required<AGGridUrlSyncConfig> {
41
- gridApi: AGGridApi;
42
- }
43
- /**
44
- * Error types for URL sync operations
45
- */
46
- export declare class URLSyncError extends Error {
47
- constructor(message: string);
48
- }
49
- export declare class InvalidFilterError extends URLSyncError {
50
- constructor(message: string);
51
- }
52
- export declare class InvalidURLError extends URLSyncError {
53
- constructor(message: string);
54
- }
55
- export type ParsedFilterParam = {
56
- columnName: string;
57
- operation: 'contains' | 'equals';
58
- value: string;
59
- action: 'apply' | 'remove';
60
- };
61
- export type GridApi = AGGridApi;
62
- export declare const OPERATION_MAP: {
63
- readonly contains: "contains";
64
- readonly eq: "equals";
65
- };
66
- export declare const REVERSE_OPERATION_MAP: {
67
- readonly contains: "contains";
68
- readonly equals: "eq";
69
- };
package/dist/types.js DELETED
@@ -1,31 +0,0 @@
1
- /**
2
- * Error types for URL sync operations
3
- */
4
- export class URLSyncError extends Error {
5
- constructor(message) {
6
- super(message);
7
- this.name = 'URLSyncError';
8
- }
9
- }
10
- export class InvalidFilterError extends URLSyncError {
11
- constructor(message) {
12
- super(message);
13
- this.name = 'InvalidFilterError';
14
- }
15
- }
16
- export class InvalidURLError extends URLSyncError {
17
- constructor(message) {
18
- super(message);
19
- this.name = 'InvalidURLError';
20
- }
21
- }
22
- // Internal operation mapping
23
- export const OPERATION_MAP = {
24
- contains: 'contains',
25
- eq: 'equals'
26
- };
27
- export const REVERSE_OPERATION_MAP = {
28
- contains: 'contains',
29
- equals: 'eq'
30
- };
31
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAkDA;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAYD,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,QAAQ,EAAE,UAAU;IACpB,EAAE,EAAE,QAAQ;CACJ,CAAA;AAEV,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,IAAI;CACJ,CAAA"}
package/dist/utils.d.ts DELETED
@@ -1,36 +0,0 @@
1
- import type { FilterState, ColumnFilter, InternalConfig } from './types.js';
2
- /**
3
- * Default configuration values
4
- */
5
- export declare const DEFAULT_CONFIG: {
6
- readonly paramPrefix: "f_";
7
- readonly maxValueLength: 200;
8
- };
9
- /**
10
- * Validates a filter value against configuration constraints
11
- */
12
- export declare function validateFilterValue(value: string, config: InternalConfig): string;
13
- /**
14
- * Parses a URL parameter into a column filter
15
- */
16
- export declare function parseFilterParam(param: string, value: string, expectedPrefix?: string): ColumnFilter;
17
- /**
18
- * Converts URL search params into a filter state object
19
- */
20
- export declare function parseUrlFilters(url: string, config: InternalConfig): FilterState;
21
- /**
22
- * Converts a filter state object into URL search parameters
23
- */
24
- export declare function serializeFilters(filterState: FilterState, config: InternalConfig): URLSearchParams;
25
- /**
26
- * Generates a URL with the current filter state
27
- */
28
- export declare function generateUrl(baseUrl: string, filterState: FilterState, config: InternalConfig): string;
29
- /**
30
- * Gets the current filter model from AG Grid
31
- */
32
- export declare function getFilterModel(config: InternalConfig): FilterState;
33
- /**
34
- * Applies a filter state to AG Grid
35
- */
36
- export declare function applyFilterModel(filterState: FilterState, config: InternalConfig): void;