@himanshu-sorathiya/react-kit 1.0.4 → 1.0.6

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/index.d.ts CHANGED
@@ -1,10 +1,46 @@
1
1
  // Generated by dts-bundle-generator v9.5.1
2
2
 
3
- export interface ModalProps {
3
+ export interface ModalLayoutProps {
4
4
  children: React.ReactNode;
5
5
  className?: string;
6
6
  }
7
- export declare function Modal({ children, className }: ModalProps): import("react").ReactPortal;
7
+ export declare function ModalLayout({ children, className }: ModalLayoutProps): import("react").ReactPortal;
8
+ export type FilterType = "text" | "number" | "boolean" | "date" | "select" | "multiselect" | "custom";
9
+ export type TextOperator = "contains" | "equals" | "startsWith" | "endsWith" | "notContains";
10
+ export type NumberOperator = "equals" | "greaterThan" | "lessThan" | "greaterThanOrEqual" | "lessThanOrEqual" | "between";
11
+ export type BooleanOperator = "equals";
12
+ export type DateOperator = "equals" | "before" | "after" | "between";
13
+ export type SelectOperator = "equals" | "notEquals";
14
+ export type MultiselectOperator = "in" | "notIn" | "intersects";
15
+ export type CustomOperator = "custom";
16
+ export type FilterOperator = TextOperator | NumberOperator | BooleanOperator | DateOperator | SelectOperator | MultiselectOperator | CustomOperator;
17
+ export interface FilterOptions {
18
+ caseSensitive?: boolean;
19
+ compare?: (itemValue: any, filterValue: any, item: any) => boolean;
20
+ }
21
+ export interface FilterConfig extends FilterOptions {
22
+ id: string;
23
+ field: string;
24
+ type: FilterType;
25
+ operator: FilterOperator;
26
+ value: any;
27
+ }
28
+ export type FilterState = FilterConfig[];
29
+ export interface UseFilterReturn<T> {
30
+ filteredItems: T[];
31
+ filters: FilterState;
32
+ addFilter: (filter: FilterConfig) => void;
33
+ removeFilter: (id: string | string[]) => void;
34
+ clearFilters: () => void;
35
+ resetFilters: () => void;
36
+ setFilters: (filters: FilterConfig[]) => void;
37
+ toggleFilter: (filter: FilterConfig) => void;
38
+ updateFilterConfig: (id: string, partialConfig: Partial<Omit<FilterConfig, "id">>) => void;
39
+ getFilterValue: (id: string) => any;
40
+ updateFilterValue: (id: string, value: any) => void;
41
+ isFilterActive: (id: string) => boolean;
42
+ }
43
+ export declare function useFilter<T>(data: T[], initialFilters?: FilterState): UseFilterReturn<T>;
8
44
  export interface UseModalReturn<TData> {
9
45
  id: string | null;
10
46
  data: TData | undefined;
@@ -29,5 +65,36 @@ export interface UsePaginationReturn<T> {
29
65
  resetPageSize: () => void;
30
66
  }
31
67
  export declare function usePagination<T>(data: T[], initialPageSize: number, initialPageIndex?: number): UsePaginationReturn<T>;
68
+ export type SortType = "numeric" | "alphabetical" | "alphanumeric" | "boolean" | "date" | "basic" | "custom";
69
+ export interface SortOptions {
70
+ desc?: boolean;
71
+ caseSensitive?: boolean;
72
+ disableSortRemoval?: boolean;
73
+ invertSorting?: boolean;
74
+ sortUndefined?: "first" | "last" | false | -1 | 1;
75
+ compare?: (a: any, b: any) => number;
76
+ }
77
+ export interface SortConfig extends SortOptions {
78
+ id: string;
79
+ type: SortType;
80
+ field?: string;
81
+ }
82
+ export type SortState = Array<SortConfig>;
83
+ export interface UseSortReturn<T> {
84
+ sortedItems: T[];
85
+ sorts: SortState;
86
+ addSort: (sort: SortConfig) => void;
87
+ removeSort: (id: string | string[]) => void;
88
+ clearSorts: () => void;
89
+ resetSorts: () => void;
90
+ setSorts: (sorts: SortState) => void;
91
+ getSortDirection: (id: string) => "asc" | "desc" | undefined;
92
+ toggleSort: (id: string, type: SortType, options?: SortOptions & {
93
+ multi?: boolean;
94
+ }) => void;
95
+ getNextSortingOrder: (id: string) => "asc" | "desc" | "none";
96
+ getSortIndex: (id: string) => number | undefined;
97
+ }
98
+ export declare function useSort<T>(data: T[], initialSorts?: SortState): UseSortReturn<T>;
32
99
 
33
100
  export {};
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ function u() {
30
30
  }
31
31
  //#endregion
32
32
  //#region src/components/Modal.tsx
33
- function d({ children: e, className: n = "" }) {
33
+ function d({ children: e, className: n }) {
34
34
  let { id: i, closeModal: o } = u(), s = r(null);
35
35
  return t(() => {
36
36
  let e = s.current;
@@ -40,7 +40,7 @@ function d({ children: e, className: n = "" }) {
40
40
  onCancel: (e) => {
41
41
  e.preventDefault(), o();
42
42
  },
43
- className: `universal-modal ${n ?? ""}`,
43
+ className: `universal-modal ${n}`,
44
44
  children: /* @__PURE__ */ c("div", {
45
45
  className: "modal-container",
46
46
  children: e
@@ -48,8 +48,114 @@ function d({ children: e, className: n = "" }) {
48
48
  }), document.body);
49
49
  }
50
50
  //#endregion
51
+ //#region src/utils/filterUtils.ts
52
+ var f = {
53
+ text: {
54
+ contains: (e, t, n) => n?.caseSensitive ? String(e).includes(String(t)) : String(e).toLowerCase().includes(String(t).toLowerCase()),
55
+ equals: (e, t, n) => n?.caseSensitive ? String(e) === String(t) : String(e).toLowerCase() === String(t).toLowerCase(),
56
+ startsWith: (e, t, n) => n?.caseSensitive ? String(e).startsWith(String(t)) : String(e).toLowerCase().startsWith(String(t).toLowerCase()),
57
+ endsWith: (e, t, n) => n?.caseSensitive ? String(e).endsWith(String(t)) : String(e).toLowerCase().endsWith(String(t).toLowerCase()),
58
+ notContains: (e, t, n) => n?.caseSensitive ? !String(e).includes(String(t)) : !String(e).toLowerCase().includes(String(t).toLowerCase())
59
+ },
60
+ number: {
61
+ equals: (e, t) => Number(e) === Number(t),
62
+ greaterThan: (e, t) => Number(e) > Number(t),
63
+ lessThan: (e, t) => Number(e) < Number(t),
64
+ greaterThanOrEqual: (e, t) => Number(e) >= Number(t),
65
+ lessThanOrEqual: (e, t) => Number(e) <= Number(t),
66
+ between: (e, t) => Number(e) >= Number(t.min) && Number(e) <= Number(t.max)
67
+ },
68
+ boolean: { equals: (e, t) => !!e == !!t },
69
+ date: {
70
+ equals: (e, t) => {
71
+ if (!e || !t) return !1;
72
+ let n = new Date(e).getTime(), r = new Date(t).getTime();
73
+ return Number.isNaN(n) || Number.isNaN(r) ? !1 : n === r;
74
+ },
75
+ before: (e, t) => {
76
+ if (!e || !t) return !1;
77
+ let n = new Date(e).getTime(), r = new Date(t).getTime();
78
+ return Number.isNaN(n) || Number.isNaN(r) ? !1 : n < r;
79
+ },
80
+ after: (e, t) => {
81
+ if (!e || !t) return !1;
82
+ let n = new Date(e).getTime(), r = new Date(t).getTime();
83
+ return Number.isNaN(n) || Number.isNaN(r) ? !1 : n > r;
84
+ },
85
+ between: (e, t) => {
86
+ if (!e || !t?.min || !t?.max) return !1;
87
+ let n = new Date(e).getTime(), r = new Date(t.min).getTime(), i = new Date(t.max).getTime();
88
+ return Number.isNaN(n) || Number.isNaN(r) || Number.isNaN(i) ? !1 : n >= r && n <= i;
89
+ }
90
+ },
91
+ select: {
92
+ equals: (e, t) => e === t,
93
+ notEquals: (e, t) => e !== t
94
+ },
95
+ multiselect: {
96
+ in: (e, t) => t.includes(e),
97
+ notIn: (e, t) => !t.includes(e),
98
+ intersects: (e, t) => e.some((e) => t.includes(e))
99
+ }
100
+ };
101
+ //#endregion
102
+ //#region src/utils/utils.ts
103
+ function p(e, t, n) {
104
+ if (typeof e != "object" || !e) return e;
105
+ let r = (t || n) ?? "";
106
+ return r.includes(".") ? r.split(".").reduce((e, t) => e?.[t], e) : e?.[r];
107
+ }
108
+ //#endregion
109
+ //#region src/hooks/useFilter.ts
110
+ function m(t, r = []) {
111
+ let [a, o] = i(r), s = n(() => t.filter((e) => a.every((t) => {
112
+ let { id: n, field: r, type: i, operator: a, value: o, compare: s } = t, c = p(e, r, n);
113
+ if (i === "custom" || a === "custom") return s ? s(c, o, e) : !0;
114
+ let l = f[i];
115
+ if (!l) return !0;
116
+ let u = l[a];
117
+ return u ? u(c, o, t) : !0;
118
+ })), [t, a]), c = e((e) => {
119
+ o((t) => t.some((t) => t.id === e.id) ? t.map((t) => t.id === e.id ? e : t) : [...t, e]);
120
+ }, []), l = e((e) => {
121
+ o((t) => Array.isArray(e) ? t.filter((t) => !e.includes(t.id)) : t.filter((t) => t.id !== e));
122
+ }, []), u = e(() => {
123
+ o([]);
124
+ }, []), d = e(() => {
125
+ o(r);
126
+ }, [r]), m = e((e) => {
127
+ o(e);
128
+ }, []), h = e((e) => a.find((t) => t.id === e)?.value, [a]), g = e((e, t) => {
129
+ o((n) => n.map((n) => n.id === e ? {
130
+ ...n,
131
+ value: t
132
+ } : n));
133
+ }, []), _ = e((e) => a.some((t) => t.id === e), [a]);
134
+ return {
135
+ filteredItems: s,
136
+ filters: a,
137
+ addFilter: c,
138
+ removeFilter: l,
139
+ clearFilters: u,
140
+ resetFilters: d,
141
+ toggleFilter: e((e) => {
142
+ o((t) => t.some((t) => t.id === e.id) ? t.filter((t) => t.id !== e.id) : [...t, e]);
143
+ }, []),
144
+ updateFilterConfig: e((e, t) => {
145
+ o((n) => n.map((n) => n.id === e ? {
146
+ ...n,
147
+ ...t
148
+ } : n));
149
+ }, []),
150
+ setFilters: m,
151
+ getFilterValue: h,
152
+ updateFilterValue: g,
153
+ isFilterActive: _
154
+ };
155
+ }
156
+ //#endregion
51
157
  //#region src/hooks/usePagination.ts
52
- function f(t, r, a = 0) {
158
+ function h(t, r, a = 0) {
53
159
  let [o, s] = i(r), [c, l] = i(a), u = Math.max(1, Math.ceil(t.length / Math.max(1, o))), d = Math.min(Math.max(0, c), u - 1);
54
160
  return c !== d && l(d), {
55
161
  currentItems: n(() => typeof o != "number" || o < 1 ? [] : t.slice(c * o, (c + 1) * o), [
@@ -95,4 +201,153 @@ function f(t, r, a = 0) {
95
201
  };
96
202
  }
97
203
  //#endregion
98
- export { d as Modal, u as useModal, f as usePagination };
204
+ //#region src/utils/sortUtils.ts
205
+ function g(e, t, n = {}) {
206
+ let { sortUndefined: r, desc: i = !1 } = n, a = C(e, t, r, i);
207
+ if (a !== null) return a;
208
+ let o = !!e;
209
+ return o === !!t ? 0 : o ? 1 : -1;
210
+ }
211
+ function _(e, t, n = {}) {
212
+ let { sortUndefined: r, desc: i = !1 } = n, a = C(e, t, r, i);
213
+ if (a !== null) return a;
214
+ let o = e === "" || e === null ? NaN : Number(e), s = t === "" || t === null ? NaN : Number(t), c = Number.isNaN(o), l = Number.isNaN(s);
215
+ return c || l ? C(c ? void 0 : o, l ? void 0 : s, r, i) ?? 0 : o - s;
216
+ }
217
+ function v(e, t, n = {}) {
218
+ let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o = C(e, t, i, r);
219
+ if (o !== null) return o;
220
+ let s = String(e), c = String(t);
221
+ return s.localeCompare(c, void 0, { sensitivity: a ? "variant" : "base" });
222
+ }
223
+ function y(e, t, n = {}) {
224
+ let { desc: r = !1, sortUndefined: i, caseSensitive: a = !1 } = n, o = C(e, t, i, r);
225
+ if (o !== null) return o;
226
+ let s = String(e), c = String(t);
227
+ return s.localeCompare(c, void 0, {
228
+ numeric: !0,
229
+ sensitivity: a ? "variant" : "base"
230
+ });
231
+ }
232
+ function b(e, t, n = {}) {
233
+ let { desc: r = !1, sortUndefined: i } = n, a = C(e, t, i, r);
234
+ if (a !== null) return a;
235
+ let o = new Date(e).getTime(), s = new Date(t).getTime();
236
+ return (Number.isNaN(o) ? 0 : o) - (Number.isNaN(s) ? 0 : s);
237
+ }
238
+ function x(e, t, n = {}) {
239
+ let { desc: r = !1, sortUndefined: i } = n, a = C(e, t, i, r);
240
+ return a === null ? e < t ? -1 : +(e > t) : a;
241
+ }
242
+ function S(e, t, n = {}) {
243
+ let { desc: r = !1, sortUndefined: i, compare: a } = n, o = C(e, t, i, r);
244
+ return o === null ? typeof a == "function" ? a(e, t) : e < t ? -1 : +(e > t) : o;
245
+ }
246
+ function C(e, t, n = !1, r) {
247
+ let i = e ?? void 0, a = t ?? void 0;
248
+ if (i !== void 0 && a !== void 0) return null;
249
+ if (i === void 0 && a === void 0 || n === !1) return 0;
250
+ if (n === "first") return i === void 0 ? -1 : 1;
251
+ if (n === "last") return i === void 0 ? 1 : -1;
252
+ if (n === -1) {
253
+ let e = r ? 1 : -1;
254
+ return i === void 0 ? e : -e;
255
+ }
256
+ if (n === 1) {
257
+ let e = r ? 1 : -1;
258
+ return i === void 0 ? -e : e;
259
+ }
260
+ return null;
261
+ }
262
+ //#endregion
263
+ //#region src/hooks/useSort.ts
264
+ function w(t, r = []) {
265
+ let [a, o] = i(r);
266
+ return {
267
+ sortedItems: n(() => t.toSorted((e, t) => {
268
+ for (let n of a) {
269
+ let { type: r, field: i, id: a, desc: o = !1, invertSorting: s = !1 } = n, c = p(e, i, a), l = p(t, i, a), u;
270
+ switch (r) {
271
+ case "numeric":
272
+ u = _(c, l, n);
273
+ break;
274
+ case "alphabetical":
275
+ u = v(c, l, n);
276
+ break;
277
+ case "alphanumeric":
278
+ u = y(c, l, n);
279
+ break;
280
+ case "boolean":
281
+ u = g(c, l, n);
282
+ break;
283
+ case "date":
284
+ u = b(c, l, n);
285
+ break;
286
+ case "basic":
287
+ u = x(c, l, n);
288
+ break;
289
+ case "custom":
290
+ u = S(c, l, n);
291
+ break;
292
+ default: u = x(c, l, n);
293
+ }
294
+ if (u !== 0) return u * (o === s ? 1 : -1);
295
+ }
296
+ return 0;
297
+ }), [a, t]),
298
+ sorts: a,
299
+ addSort: e((e) => o((t) => t.some((t) => t.id === e.id) ? t.map((t) => t.id === e.id ? e : t) : [...t, e]), []),
300
+ removeSort: e((e) => {
301
+ o((t) => Array.isArray(e) ? t.filter((t) => !e.includes(t.id)) : t.filter((t) => t.id !== e));
302
+ }, []),
303
+ clearSorts: e(() => o([]), []),
304
+ resetSorts: e(() => o(r), [r]),
305
+ setSorts: e((e) => o(e), []),
306
+ getSortDirection: e((e) => {
307
+ let t = a.find((t) => t.id === e);
308
+ return t ? t.desc ? "desc" : "asc" : void 0;
309
+ }, [a]),
310
+ toggleSort: e((e, t, n) => {
311
+ let { multi: r = !1, ...i } = n || {};
312
+ o((n) => {
313
+ let a = n.find((t) => t.id === e);
314
+ if (!a) {
315
+ let a = {
316
+ id: e,
317
+ type: t,
318
+ ...i,
319
+ desc: !1
320
+ };
321
+ return r ? [...n, a] : [a];
322
+ }
323
+ if (!a.desc) {
324
+ let t = {
325
+ ...a,
326
+ ...i,
327
+ desc: !0
328
+ };
329
+ return r ? n.map((n) => n.id === e ? t : n) : [t];
330
+ }
331
+ if (a.disableSortRemoval || i.disableSortRemoval) {
332
+ let t = {
333
+ ...a,
334
+ ...i,
335
+ desc: !1
336
+ };
337
+ return r ? n.map((n) => n.id === e ? t : n) : [t];
338
+ }
339
+ return r ? n.filter((t) => t.id !== e) : [];
340
+ });
341
+ }, []),
342
+ getNextSortingOrder: e((e) => {
343
+ let t = a.find((t) => t.id === e);
344
+ return t ? t.desc ? t.disableSortRemoval ? "asc" : "none" : "desc" : "asc";
345
+ }, [a]),
346
+ getSortIndex: e((e) => {
347
+ let t = a.findIndex((t) => t.id === e);
348
+ return t === -1 ? void 0 : t + 1;
349
+ }, [a])
350
+ };
351
+ }
352
+ //#endregion
353
+ export { d as ModalLayout, m as useFilter, u as useModal, h as usePagination, w as useSort };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@himanshu-sorathiya/react-kit",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "An opinionated collection of react hooks, and reusable UI components.",
5
5
  "type": "module",
6
6
  "module": "./dist/index.js",
package/dist/index.css DELETED
@@ -1,2 +0,0 @@
1
- :where(html){scrollbar-gutter:stable both}:where(body:has(dialog[open])){overflow:hidden}:where(dialog.universal-modal){box-sizing:border-box;max-width:var(--modal-max-width,500px);background:0 0;border:none;width:calc(100% - 2rem);padding:0}:where(dialog.universal-modal .modal-container){box-sizing:border-box;padding:var(--modal-padding,24px);background-color:var(--modal-bg,#fff);border-radius:var(--modal-radius,8px);box-shadow:var(--modal-shadow,0 4px 12px #00000026)}dialog.universal-modal::backdrop{background-color:var(--modal-backdrop-bg,#00000080);-webkit-backdrop-filter:blur(var(--modal-backdrop-blur,none));backdrop-filter:blur(var(--modal-backdrop-blur,none))}:where(dialog.universal-modal[open]){animation:.2s ease-out modal-fade-in}@keyframes modal-fade-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}
2
- /*$vite$:1*/