@codella-software/react 2.2.26 → 2.3.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.
@@ -1,35 +1,76 @@
1
- import { FiltersAndSortService } from '@codella-software/utils';
1
+ import { FiltersAndSortService, FilterAndSortState, SortDirection } from '@codella-software/utils';
2
+ /**
3
+ * Configuration for creating a new FiltersAndSortService instance
4
+ */
5
+ export interface FiltersAndSortConfig<T extends Record<string, any> = Record<string, any>> {
6
+ /** Unique storage key for persistence */
7
+ storageKey: string;
8
+ /** Whether to persist state to storage (default: true) */
9
+ persistToStorage?: boolean;
10
+ /** Initial state override */
11
+ initialState?: Partial<FilterAndSortState<T>>;
12
+ /** Default filter values used when clearing filters */
13
+ defaultFilters?: T;
14
+ /** Skip hydrating state from storage on init */
15
+ skipStorageHydration?: boolean;
16
+ /** Debounce time for storage persistence in ms (default: 300) */
17
+ storageDebounceMs?: number;
18
+ /** Optional storage key prefix */
19
+ storageKeyPrefix?: string;
20
+ }
2
21
  /**
3
22
  * Hook options for useFiltersAndSort
4
23
  */
5
- export interface UseFiltersAndSortOptions {
6
- /** FiltersAndSortService instance */
7
- service: FiltersAndSortService;
24
+ export interface UseFiltersAndSortOptions<T extends Record<string, any> = Record<string, any>> {
25
+ /** An existing FiltersAndSortService instance to use */
26
+ service?: FiltersAndSortService<T>;
27
+ /** Configuration to create a new service instance (mutually exclusive with service) */
28
+ config?: FiltersAndSortConfig<T>;
29
+ /** Enable debug logging */
30
+ debug?: boolean;
31
+ /** Custom equality function for state comparison */
32
+ isEqual?: (prev: FilterAndSortState<T>, next: FilterAndSortState<T>) => boolean;
8
33
  }
9
34
  /**
10
35
  * Hook return value for useFiltersAndSort
11
36
  */
12
- export interface UseFiltersAndSortReturn {
37
+ export interface UseFiltersAndSortReturn<T extends Record<string, any> = Record<string, any>> {
13
38
  /** Current filter state */
14
- filters: Record<string, any>;
39
+ filters: T;
15
40
  /** Current sort field */
16
41
  sortBy: string | null;
17
42
  /** Current sort direction */
18
- sortDirection: 'asc' | 'desc';
19
- /** Current page */
43
+ sortDirection: SortDirection;
44
+ /** Current page (0-based) */
20
45
  page: number;
21
46
  /** Page size */
22
47
  pageSize: number;
23
- /** Set filter */
24
- setFilter: (key: string, value: any) => void;
25
- /** Clear specific filter */
26
- clearFilter: (key: string) => void;
27
- /** Clear all filters */
48
+ /** Current search query */
49
+ query: string;
50
+ /** Full state object for advanced use cases */
51
+ state: FilterAndSortState<T>;
52
+ /** Set a single filter value */
53
+ setFilter: <K extends keyof T>(key: K, value: T[K]) => void;
54
+ /** Set multiple filters at once */
55
+ setFilters: (filters: Partial<T>) => void;
56
+ /** Clear a specific filter */
57
+ clearFilter: <K extends keyof T>(key: K) => void;
58
+ /** Clear all filters (resets to defaultFilters) */
28
59
  clearAllFilters: () => void;
29
- /** Set sort */
30
- setSort: (field: string, direction: 'asc' | 'desc') => void;
31
- /** Toggle sort direction for field */
60
+ /** Check if a specific filter is active */
61
+ hasFilter: <K extends keyof T>(key: K) => boolean;
62
+ /** Check if any filters are active */
63
+ hasAnyFilters: () => boolean;
64
+ /** Get count of active filters */
65
+ activeFilterCount: number;
66
+ /** Set/toggle sort (auto-toggles between asc -> desc -> none) */
67
+ setSort: (field: string) => void;
68
+ /** Toggle sort direction for field (alias for setSort) */
32
69
  toggleSort: (field: string) => void;
70
+ /** Clear current sort */
71
+ clearSort: () => void;
72
+ /** Check if a field is currently sorted */
73
+ isSortedBy: (field: string) => boolean;
33
74
  /** Set page */
34
75
  setPage: (page: number) => void;
35
76
  /** Set page size */
@@ -38,30 +79,78 @@ export interface UseFiltersAndSortReturn {
38
79
  nextPage: () => void;
39
80
  /** Go to previous page */
40
81
  prevPage: () => void;
82
+ /** Go to first page */
83
+ firstPage: () => void;
84
+ /** Check if on first page */
85
+ isFirstPage: boolean;
86
+ /** Calculate offset for API requests */
87
+ offset: number;
88
+ /** Set search query */
89
+ setQuery: (query: string) => void;
90
+ /** Clear search query */
91
+ clearQuery: () => void;
92
+ /** Reset to initial state */
93
+ reset: () => void;
94
+ /** Clear storage and reset */
95
+ clearStorageAndReset: () => void;
96
+ /** Get the storage key being used */
97
+ storageKey: string;
98
+ /** Direct access to the underlying service (for advanced use cases) */
99
+ getService: () => FiltersAndSortService<T>;
41
100
  }
42
101
  /**
43
- * React hook that wraps FiltersAndSortService
102
+ * React hook that wraps FiltersAndSortService with enhanced functionality
44
103
  *
45
- * @param options - Hook options including FiltersAndSortService instance
104
+ * @typeParam T - The filters object type
105
+ * @param options - Hook options including service instance or config
46
106
  * @returns Filters and sort state with control methods
47
107
  *
48
108
  * @example
49
109
  * ```tsx
50
- * const service = new FiltersAndSortService({ storageKey: 'my-filters' });
110
+ * // Option 1: Create service externally (recommended for sharing between components)
111
+ * const service = new FiltersAndSortService<MyFilters>({ storageKey: 'my-filters' });
51
112
  *
52
113
  * function MyTable() {
53
- * const filters = useFiltersAndSort({ service });
114
+ * const {
115
+ * filters,
116
+ * setFilter,
117
+ * clearAllFilters,
118
+ * hasAnyFilters,
119
+ * activeFilterCount
120
+ * } = useFiltersAndSort({ service });
121
+ *
54
122
  * return (
55
123
  * <div>
56
124
  * <input
57
- * value={filters.filters.name || ''}
58
- * onChange={(e) => filters.setFilter('name', e.target.value)}
125
+ * value={filters.name || ''}
126
+ * onChange={(e) => setFilter('name', e.target.value)}
59
127
  * />
60
- * <button onClick={() => filters.clearAllFilters()}>Clear</button>
128
+ * {hasAnyFilters() && (
129
+ * <button onClick={clearAllFilters}>
130
+ * Clear ({activeFilterCount})
131
+ * </button>
132
+ * )}
61
133
  * </div>
62
134
  * );
63
135
  * }
136
+ *
137
+ * // Option 2: Let the hook create the service (simpler for single-component use)
138
+ * function SimpleTable() {
139
+ * const filters = useFiltersAndSort({
140
+ * config: {
141
+ * storageKey: 'simple-table',
142
+ * defaultFilters: { status: 'all' }
143
+ * }
144
+ * });
145
+ * // ...
146
+ * }
64
147
  * ```
65
148
  */
66
- export declare function useFiltersAndSort(options: UseFiltersAndSortOptions): UseFiltersAndSortReturn;
149
+ export declare function useFiltersAndSort<T extends Record<string, any> = Record<string, any>>(options: UseFiltersAndSortOptions<T>): UseFiltersAndSortReturn<T>;
150
+ /**
151
+ * Convenience hook for creating a filters service with simpler API
152
+ * Equivalent to useFiltersAndSort({ config: ... })
153
+ */
154
+ export declare function useFilters<T extends Record<string, any> = Record<string, any>>(storageKey: string, options?: Omit<FiltersAndSortConfig<T>, 'storageKey'>): UseFiltersAndSortReturn<T>;
155
+ export type { FilterAndSortState, SortDirection };
67
156
  //# sourceMappingURL=useFiltersAndSort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useFiltersAndSort.d.ts","sourceRoot":"","sources":["../../src/filters-and-sort/useFiltersAndSort.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,yBAAyB,CAAA;AAGxF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,qCAAqC;IACrC,OAAO,EAAE,qBAAqB,CAAA;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,yBAAyB;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,6BAA6B;IAC7B,aAAa,EAAE,KAAK,GAAG,MAAM,CAAA;IAC7B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB;IACjB,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;IAC5C,4BAA4B;IAC5B,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,wBAAwB;IACxB,eAAe,EAAE,MAAM,IAAI,CAAA;IAC3B,eAAe;IACf,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,MAAM,KAAK,IAAI,CAAA;IAC3D,sCAAsC;IACtC,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,eAAe;IACf,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,oBAAoB;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,sBAAsB;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,uBAAuB,CAuEzB"}
1
+ {"version":3,"file":"useFiltersAndSort.d.ts","sourceRoot":"","sources":["../../src/filters-and-sort/useFiltersAndSort.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFormBuilder.d.ts","sourceRoot":"","sources":["../../src/form-builder/useFormBuilder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAGrD;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAClE,2BAA2B;IAC3B,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACjE,0BAA0B;IAC1B,MAAM,EAAE,CAAC,CAAA;IACT,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC1C,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,mCAAmC;IACnC,YAAY,EAAE,OAAO,CAAA;IACrB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB;IACtB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,wBAAwB;IACxB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3D,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC3D,kBAAkB;IAClB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAC/B,mCAAmC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1D,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAChC,oBAAoB,CAAC,CAAC,CAAC,CA0EzB"}
1
+ {"version":3,"file":"useFormBuilder.d.ts","sourceRoot":"","sources":["../../src/form-builder/useFormBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAGrD;;GAEG;AACH,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAClE,2BAA2B;IAC3B,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACjE,0BAA0B;IAC1B,MAAM,EAAE,CAAC,CAAA;IACT,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC1C,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,mCAAmC;IACnC,YAAY,EAAE,OAAO,CAAA;IACrB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,sBAAsB;IACtB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,wBAAwB;IACxB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC3D,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;IAC3D,kBAAkB;IAClB,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAC/B,mCAAmC;IACnC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1D,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAChC,oBAAoB,CAAC,CAAC,CAAC,CAwEzB"}