@iyulab/flex-table 0.39.0 → 0.40.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.
@@ -0,0 +1,72 @@
1
+ import type { SortCriteria } from '../core/sorting.js';
2
+ /**
3
+ * 검색어를 OData `$search` 표현식으로 인코딩한다 (`red shirt` → `"red" AND "shirt"`).
4
+ *
5
+ * 토큰을 인용하는 이유: OData 4.0의 `searchWord`는 문자(Unicode L/Nl)만 허용해
6
+ * `2026`·`ZT-E2E-A` 같은 검색어가 거부된다. 4.01이 숫자·하이픈을 허용하도록 완화했으나
7
+ * Microsoft.OData 렉서는 아직 4.0 규칙이다(odata.net#2445). `searchPhrase`는 두 버전
8
+ * 모두에서 적법하므로 서버 버전과 무관하게 안전하다.
9
+ *
10
+ * 통째로가 아니라 토큰별로 감싸는 이유: 인용 없는 다중 단어는 암묵 AND로 파싱되므로
11
+ * (`searchAndExpr = RWS [ 'AND' RWS ] searchExpr`), 전체를 한 phrase로 감싸면 연속
12
+ * 문자열 매칭으로 의미가 바뀐다. 토큰별 인용은 기존 의미론을 그대로 보존한다.
13
+ *
14
+ * `"`는 phrase 안에 넣을 수 없고 이스케이프 규칙도 없어(`qchar-no-AMP-DQUOTE`) 제거한다.
15
+ *
16
+ * @returns `$search` 표현식, 또는 유효 토큰이 없으면 `undefined`
17
+ */
18
+ export declare function buildSearchExpression(term: string): string | undefined;
19
+ /** `resolveInitialState`가 읽는 옵션 — 두 소스 훅의 옵션 타입이 공통으로 갖는 부분. */
20
+ export interface InitialSourceStateOptions {
21
+ defaultOrderBy?: string;
22
+ initialPage?: number;
23
+ initialSearch?: string;
24
+ initialSort?: SortCriteria[];
25
+ }
26
+ /**
27
+ * 옵션에서 `page`/`search`/`sortCriteria`의 **초기값**을 뽑는다.
28
+ *
29
+ * ★**두 훅이 이 함수 하나를 공유하는 것이 요점이다.** README가 *"same shape … so the same
30
+ * binding code works with either source"*를 계약으로 선언하는데, 초기값 해석을 양쪽에
31
+ * 복제하면 그 계약이 **문장으로만** 유지된다 — 이 리포가 반복 기록한 실패 형태다.
32
+ * 구현이 하나면 드리프트가 없다.
33
+ *
34
+ * ⚠**`initialSort`가 `defaultOrderBy`를 이긴다.** 둘은 같은 것을 서로 다른 표기로
35
+ * 말하고(`SortCriteria[]` ↔ `$orderby` 문자열), 더 구체적인 쪽을 우선한다.
36
+ * `initialSort`는 `onSortChange`가 주는 모양 그대로라 저장해 둔 정렬을 파싱 없이 되돌린다.
37
+ *
38
+ * ⚠**React가 useState 초기값을 첫 렌더에서만 읽는다는 사실이 계약의 일부다** — 이후의
39
+ * 옵션 변경은 무시되고, 이동은 `setPage`/`setSearch`로 한다. `defaultOrderBy`가 이미
40
+ * 그렇게 동작해 왔으므로 새 규칙이 아니다.
41
+ */
42
+ export declare function resolveInitialState(options: InitialSourceStateOptions): {
43
+ page: number;
44
+ search: string;
45
+ sortCriteria: SortCriteria[];
46
+ };
47
+ /**
48
+ * `$orderby` 문자열을 정렬 기준 배열로 파싱한다 (`'a asc, b desc'`).
49
+ * 방향이 생략되거나 `desc`가 아니면 `asc`로 본다(OData 기본값).
50
+ */
51
+ export declare function parseOrderBy(orderBy: string): SortCriteria[];
52
+ /** `buildODataQuery` 가 읽는 표 상태 — `useODataSource` 가 요청마다 넘기는 것과 같은 모양. */
53
+ export interface ODataQueryState {
54
+ /** 0부터 세는 페이지 번호. */
55
+ page: number;
56
+ pageSize: number;
57
+ sortCriteria?: SortCriteria[];
58
+ /** 정렬 기준이 비었을 때 쓰는 `$orderby` 문자열. */
59
+ defaultOrderBy?: string;
60
+ /** 사용자가 친 검색어(리터럴) — `buildSearchExpression` 으로 인코딩된다. */
61
+ search?: string;
62
+ /** odata-query 의 필터 객체(`{ IsActive: true }` 등). */
63
+ fixedFilter?: Record<string, unknown>;
64
+ }
65
+ /**
66
+ * 표 상태를 OData 쿼리 문자열(`?$top=…&$skip=…&$count=true…`)로 만든다.
67
+ *
68
+ * `useODataSource` 가 요청마다 하는 일 그대로다 — 훅 밖으로 꺼낸 이유는 `buildSearchExpression` 과
69
+ * 같다: React 없이 서버 페이징을 하는 소비자(Lit 앱의 표, 표가 아닌 목록)가 같은 쿼리를
70
+ * 재구현하지 않게. 정렬 기준이 있으면 그것이, 없으면 `defaultOrderBy` 가 `$orderby` 가 된다.
71
+ */
72
+ export declare function buildODataQuery(state: ODataQueryState): string;
@@ -1,57 +1,6 @@
1
- import type { SortCriteria } from '../core/sorting.js';
2
1
  import type { UseODataSourceOptions, UseODataSourceResult } from './types.js';
3
- /**
4
- * 검색어를 OData `$search` 표현식으로 인코딩한다 (`red shirt` → `"red" AND "shirt"`).
5
- *
6
- * 토큰을 인용하는 이유: OData 4.0의 `searchWord`는 문자(Unicode L/Nl)만 허용해
7
- * `2026`·`ZT-E2E-A` 같은 검색어가 거부된다. 4.01이 숫자·하이픈을 허용하도록 완화했으나
8
- * Microsoft.OData 렉서는 아직 4.0 규칙이다(odata.net#2445). `searchPhrase`는 두 버전
9
- * 모두에서 적법하므로 서버 버전과 무관하게 안전하다.
10
- *
11
- * 통째로가 아니라 토큰별로 감싸는 이유: 인용 없는 다중 단어는 암묵 AND로 파싱되므로
12
- * (`searchAndExpr = RWS [ 'AND' RWS ] searchExpr`), 전체를 한 phrase로 감싸면 연속
13
- * 문자열 매칭으로 의미가 바뀐다. 토큰별 인용은 기존 의미론을 그대로 보존한다.
14
- *
15
- * `"`는 phrase 안에 넣을 수 없고 이스케이프 규칙도 없어(`qchar-no-AMP-DQUOTE`) 제거한다.
16
- *
17
- * @returns `$search` 표현식, 또는 유효 토큰이 없으면 `undefined`
18
- */
19
- export declare function buildSearchExpression(term: string): string | undefined;
20
- /** `resolveInitialState`가 읽는 옵션 — 두 소스 훅의 옵션 타입이 공통으로 갖는 부분. */
21
- export interface InitialSourceStateOptions {
22
- defaultOrderBy?: string;
23
- initialPage?: number;
24
- initialSearch?: string;
25
- initialSort?: SortCriteria[];
26
- }
27
- /**
28
- * 옵션에서 `page`/`search`/`sortCriteria`의 **초기값**을 뽑는다.
29
- *
30
- * ★**두 훅이 이 함수 하나를 공유하는 것이 요점이다.** README가 *"same shape … so the same
31
- * binding code works with either source"*를 계약으로 선언하는데, 초기값 해석을 양쪽에
32
- * 복제하면 그 계약이 **문장으로만** 유지된다 — 이 리포가 반복 기록한 실패 형태다.
33
- * 구현이 하나면 드리프트가 없다.
34
- *
35
- * ⚠**`initialSort`가 `defaultOrderBy`를 이긴다.** 둘은 같은 것을 서로 다른 표기로
36
- * 말하고(`SortCriteria[]` ↔ `$orderby` 문자열), 더 구체적인 쪽을 우선한다.
37
- * `initialSort`는 `onSortChange`가 주는 모양 그대로라 저장해 둔 정렬을 파싱 없이 되돌린다.
38
- *
39
- * ⚠**React가 useState 초기값을 첫 렌더에서만 읽는다는 사실이 계약의 일부다** — 이후의
40
- * 옵션 변경은 무시되고, 이동은 `setPage`/`setSearch`로 한다. `defaultOrderBy`가 이미
41
- * 그렇게 동작해 왔으므로 새 규칙이 아니다.
42
- */
43
- export declare function resolveInitialState(options: InitialSourceStateOptions): {
44
- page: number;
45
- search: string;
46
- sortCriteria: SortCriteria[];
47
- };
48
2
  /**
49
3
  * OData v4 서버 사이드 데이터소스 React 훅.
50
4
  * flex-table의 dataMode="server"와 함께 사용한다.
51
5
  */
52
6
  export declare function useODataSource<T = Record<string, unknown>>(url: string, options?: UseODataSourceOptions): UseODataSourceResult<T>;
53
- /**
54
- * `$orderby` 문자열을 정렬 기준 배열로 파싱한다 (`'a asc, b desc'`).
55
- * 방향이 생략되거나 `desc`가 아니면 `asc`로 본다(OData 기본값).
56
- */
57
- export declare function parseOrderBy(orderBy: string): SortCriteria[];
@@ -0,0 +1,37 @@
1
+ import e from "odata-query";
2
+ //#region src/odata/query.ts
3
+ function t(e) {
4
+ let t = e.split(/\s+/).map((e) => e.replace(/"/g, "")).filter((e) => e.length > 0);
5
+ if (t.length !== 0) return t.map((e) => `"${e}"`).join(" AND ");
6
+ }
7
+ function n(e) {
8
+ let { defaultOrderBy: t, initialPage: n = 0, initialSearch: i = "", initialSort: a } = e;
9
+ return {
10
+ page: n,
11
+ search: i,
12
+ sortCriteria: a ?? (t ? r(t) : [])
13
+ };
14
+ }
15
+ function r(e) {
16
+ return e.split(",").map((e) => {
17
+ let t = e.trim().split(/\s+/);
18
+ return {
19
+ key: t[0],
20
+ direction: t[1]?.toLowerCase() === "desc" ? "desc" : "asc"
21
+ };
22
+ });
23
+ }
24
+ function i(n) {
25
+ let { page: r, pageSize: i, sortCriteria: a = [], defaultOrderBy: o, search: s, fixedFilter: c } = n, l = a.length > 0 ? a.map((e) => `${e.key} ${e.direction}`).join(", ") : o, u = {
26
+ top: i,
27
+ skip: r * i,
28
+ count: !0
29
+ };
30
+ if (l && (u.orderBy = l), c && (u.filter = c), s) {
31
+ let e = t(s);
32
+ e && (u.search = e);
33
+ }
34
+ return e(u);
35
+ }
36
+ //#endregion
37
+ export { n as i, t as n, r, i as t };
package/dist/react.d.ts CHANGED
@@ -43,18 +43,22 @@ export type FlexTableReactProps<T = DataRow> = Omit<BaseProps, 'data' | 'columns
43
43
  * The underlying custom element (`FlexTable`) is a single registered class and cannot
44
44
  * itself be generic across instances — the DOM has no notion of `FlexTable<Order>` vs
45
45
  * `FlexTable<Consumer>`. `FlexTableReact<T>` performs one internal cast at this boundary
46
- * so consumers get end-to-end type safety (`data`, `columns`, `renderer`/`editor`/`validator`
46
+ * so consumers get end-to-end type safety (`data`, `columns`, `render`/`editor`/`validator`
47
47
  * callbacks) without casting at every call site.
48
48
  *
49
49
  * @example
50
50
  * ```tsx
51
51
  * const columns: ColumnDefinition<Order>[] = [
52
- * { key: 'id', header: 'ID' },
53
- * { key: 'total', header: 'Total', renderer: (v, row) => `${row.total} ${row.currency}` },
52
+ * { key: 'id', label: 'ID' },
53
+ * { key: 'total', label: 'Total', render: (v, row) => `${row.total} ${row.currency}` },
54
54
  * ];
55
55
  * <FlexTableReact<Order> data={orders} columns={columns} />
56
56
  * ```
57
57
  */
58
58
  export declare const FlexTableReact: <T = DataRow>(props: FlexTableReactProps<T> & React.RefAttributes<FlexTable>) => React.ReactElement | null;
59
59
  export type { FlexTable };
60
- export type { ColumnDefinition, DataRow, ColumnType, CellRenderer, CellEditor, CellValidator, ConditionalRule, SelectionMode, DataMode } from './models/types.js';
60
+ export type { ColumnDefinition, DataRow, ColumnType, ColumnAlign, CellRenderer, CellEditor, CellValidator, ConditionalRule, SelectionMode, DataMode } from './models/types.js';
61
+ export { useODataSource } from './odata/use-odata-source.js';
62
+ export type { UseODataSourceOptions, UseODataSourceResult } from './odata/types.js';
63
+ export { useArraySource } from './array/use-array-source.js';
64
+ export type { UseArraySourceOptions, UseArraySourceResult } from './array/types.js';
package/dist/react.js CHANGED
@@ -1,10 +1,146 @@
1
- import { t as e } from "./flex-table-JGaGcJTl.js";
2
- import t from "react";
3
- import { createComponent as n } from "@lit/react";
4
- var r = n({
1
+ import { t as e } from "./flex-table-CDEu8YQE.js";
2
+ import { i as t, t as n } from "./query-Dw4iO0ir.js";
3
+ import { t as r } from "./view-DiLr-TdY.js";
4
+ import i, { useCallback as a, useEffect as o, useMemo as s, useRef as c, useState as l } from "react";
5
+ import { createComponent as u } from "@lit/react";
6
+ //#region src/odata/use-odata-source.ts
7
+ function d(e, r = {}) {
8
+ let { pageSize: i = 20, defaultOrderBy: s, initialPage: u = 0, initialSearch: d = "", initialSort: f, fixedFilter: p, baseUrl: m, fetcher: h = fetch, onUnauthorized: g, enabled: _ = !0 } = r, v = p ? JSON.stringify(p) : "", [y, b] = l([]), [x, S] = l(0), [C, w] = l(!1), [T, E] = l(null), D = t({
9
+ defaultOrderBy: s,
10
+ initialPage: u,
11
+ initialSearch: d,
12
+ initialSort: f
13
+ }), [O, k] = l(D.page), [A, j] = l(D.sortCriteria), [M, N] = l(D.search), [P, F] = l(0), [I, L] = l(v);
14
+ v !== I && (L(v), k(0));
15
+ let R = c(null), z = a(() => {
16
+ F((e) => e + 1);
17
+ }, []), B = a((e) => {
18
+ N(e), k(0);
19
+ }, []), V = a((e) => {
20
+ let t = e.detail?.criteria;
21
+ t && (j(t), k(0));
22
+ }, []);
23
+ return o(() => {
24
+ if (R.current?.abort(), !_) return;
25
+ let t = new AbortController();
26
+ R.current = t, w(!0), E(null);
27
+ let r = n({
28
+ page: O,
29
+ pageSize: i,
30
+ sortCriteria: A,
31
+ defaultOrderBy: s,
32
+ search: M,
33
+ fixedFilter: p
34
+ }), a = `${m ?? window.location.origin}${e}${r}`, o = async (e) => {
35
+ let n = await h(e, { signal: t.signal });
36
+ if (!n.ok) {
37
+ (n.status === 401 || n.status === 403) && g && g(n);
38
+ let e = await n.text().catch(() => ""), t = `Request failed (${n.status})`;
39
+ try {
40
+ let n = JSON.parse(e);
41
+ t = n?.error?.message ?? n?.message ?? t;
42
+ } catch {}
43
+ throw Error(t);
44
+ }
45
+ return n.json();
46
+ };
47
+ return (async () => {
48
+ let e = await o(a), t = [...e.value ?? e], n = new URL(a).origin, r = /* @__PURE__ */ new Set([a]), s = a, c = e["@odata.nextLink"];
49
+ for (; typeof c == "string" && c && t.length < i;) {
50
+ let e = new URL(c, s);
51
+ if (e.origin !== n) throw Error(`OData nextLink points outside the source origin (${e.origin})`);
52
+ if (s = e.toString(), r.has(s)) throw Error(`OData nextLink repeats an already-read page (${s})`);
53
+ r.add(s);
54
+ let i = await o(s);
55
+ t.push(...i.value ?? []), c = i["@odata.nextLink"];
56
+ }
57
+ return {
58
+ count: e["@odata.count"],
59
+ rows: t
60
+ };
61
+ })().then(({ count: e, rows: n }) => {
62
+ if (t.signal.aborted) return;
63
+ let r = e ?? 0;
64
+ b(n), S(r), E(null);
65
+ let a = r === 0 ? 0 : Math.ceil(r / i) - 1;
66
+ O > a && k(a);
67
+ }).catch((e) => {
68
+ t.signal.aborted || e.name !== "AbortError" && (E(e.message), b([]), S(0));
69
+ }).finally(() => {
70
+ t.signal.aborted || w(!1);
71
+ }), () => t.abort();
72
+ }, [
73
+ _,
74
+ e,
75
+ O,
76
+ i,
77
+ A,
78
+ M,
79
+ v,
80
+ s,
81
+ P,
82
+ m
83
+ ]), {
84
+ data: y,
85
+ totalCount: x,
86
+ loading: C || !_,
87
+ error: T,
88
+ page: O,
89
+ setPage: k,
90
+ sortCriteria: A,
91
+ onSortChange: V,
92
+ search: M,
93
+ setSearch: B,
94
+ refresh: z
95
+ };
96
+ }
97
+ //#endregion
98
+ //#region src/array/use-array-source.ts
99
+ function f(e, n = {}) {
100
+ let { pageSize: i = 20, defaultOrderBy: o, initialPage: c = 0, initialSearch: u = "", initialSort: d, columns: f, searchFields: p } = n, m = t({
101
+ defaultOrderBy: o,
102
+ initialPage: c,
103
+ initialSearch: u,
104
+ initialSort: d
105
+ }), [h, g] = l(m.page), [_, v] = l(m.sortCriteria), [y, b] = l(m.search), x = a((e) => {
106
+ b(e), g(0);
107
+ }, []), S = a((e) => {
108
+ let t = e.detail?.criteria;
109
+ t && (v(t), g(0));
110
+ }, []), C = a(() => {}, []), { data: w, totalCount: T } = s(() => r(e, {
111
+ search: y,
112
+ sortCriteria: _,
113
+ page: h,
114
+ pageSize: i,
115
+ columns: f,
116
+ searchFields: p
117
+ }), [
118
+ e,
119
+ y,
120
+ _,
121
+ h,
122
+ i,
123
+ f,
124
+ p
125
+ ]), E = T === 0 ? 0 : Math.ceil(T / i) - 1;
126
+ return h > E && g(E), {
127
+ data: w,
128
+ totalCount: T,
129
+ loading: !1,
130
+ error: null,
131
+ page: h,
132
+ setPage: g,
133
+ sortCriteria: _,
134
+ onSortChange: S,
135
+ search: y,
136
+ setSearch: x,
137
+ refresh: C
138
+ };
139
+ }
140
+ var p = u({
5
141
  tagName: "flex-table",
6
142
  elementClass: e,
7
- react: t,
143
+ react: i,
8
144
  events: {
9
145
  onCellSelect: "cell-select",
10
146
  onCellEditCommit: "cell-edit-commit",
@@ -33,4 +169,4 @@ var r = n({
33
169
  }
34
170
  });
35
171
  //#endregion
36
- export { r as FlexTableReact };
172
+ export { p as FlexTableReact, f as useArraySource, d as useODataSource };
@@ -0,0 +1,13 @@
1
+ import { t as e } from "./sorting-CjfjRxwL.js";
2
+ //#region src/array/view.ts
3
+ function t(t, { search: n, sortCriteria: r, page: i, pageSize: a, columns: o, searchFields: s }) {
4
+ let c = n.trim().toLowerCase(), l = c ? t.filter((e) => (s ? s(e) : Object.values(e)).some((e) => e != null && String(e).toLowerCase().includes(c))) : t, u = l;
5
+ r.length > 0 && (u = e(l, r, o ?? []).map((e) => l[e]));
6
+ let d = u.length, f = d === 0 ? 0 : Math.ceil(d / a) - 1, p = Math.min(Math.max(i, 0), f) * a;
7
+ return {
8
+ data: u.slice(p, p + a),
9
+ totalCount: d
10
+ };
11
+ }
12
+ //#endregion
13
+ export { t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iyulab/flex-table",
3
- "version": "0.39.0",
3
+ "version": "0.40.0",
4
4
  "description": "A minimalist, input-centric data grid web component",
5
5
  "type": "module",
6
6
  "main": "./dist/flex-table.js",
@@ -1,118 +0,0 @@
1
- import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
2
- import i from "odata-query";
3
- //#region src/odata/use-odata-source.ts
4
- function a(e) {
5
- let t = e.split(/\s+/).map((e) => e.replace(/"/g, "")).filter((e) => e.length > 0);
6
- if (t.length !== 0) return t.map((e) => `"${e}"`).join(" AND ");
7
- }
8
- function o(e) {
9
- let { defaultOrderBy: t, initialPage: n = 0, initialSearch: r = "", initialSort: i } = e;
10
- return {
11
- page: n,
12
- search: r,
13
- sortCriteria: i ?? (t ? c(t) : [])
14
- };
15
- }
16
- function s(s, c = {}) {
17
- let { pageSize: l = 20, defaultOrderBy: u, initialPage: d = 0, initialSearch: f = "", initialSort: p, fixedFilter: m, baseUrl: h, fetcher: g = fetch, onUnauthorized: _, enabled: v = !0 } = c, y = m ? JSON.stringify(m) : "", [b, x] = r([]), [S, C] = r(0), [w, T] = r(!1), [E, D] = r(null), O = o({
18
- defaultOrderBy: u,
19
- initialPage: d,
20
- initialSearch: f,
21
- initialSort: p
22
- }), [k, A] = r(O.page), [j, M] = r(O.sortCriteria), [N, P] = r(O.search), [F, I] = r(0), [L, R] = r(y);
23
- y !== L && (R(y), A(0));
24
- let z = n(null), B = e(() => {
25
- I((e) => e + 1);
26
- }, []), V = e((e) => {
27
- P(e), A(0);
28
- }, []), H = e((e) => {
29
- let t = e.detail?.criteria;
30
- t && (M(t), A(0));
31
- }, []);
32
- return t(() => {
33
- if (z.current?.abort(), !v) return;
34
- let e = new AbortController();
35
- z.current = e, T(!0), D(null);
36
- let t = j.length > 0 ? j.map((e) => `${e.key} ${e.direction}`).join(", ") : u, n = {
37
- top: l,
38
- skip: k * l,
39
- count: !0
40
- };
41
- if (t && (n.orderBy = t), m && (n.filter = m), N) {
42
- let e = a(N);
43
- e && (n.search = e);
44
- }
45
- let r = i(n), o = `${h ?? window.location.origin}${s}${r}`, c = async (t) => {
46
- let n = await g(t, { signal: e.signal });
47
- if (!n.ok) {
48
- (n.status === 401 || n.status === 403) && _ && _(n);
49
- let e = await n.text().catch(() => ""), t = `Request failed (${n.status})`;
50
- try {
51
- let n = JSON.parse(e);
52
- t = n?.error?.message ?? n?.message ?? t;
53
- } catch {}
54
- throw Error(t);
55
- }
56
- return n.json();
57
- };
58
- return (async () => {
59
- let e = await c(o), t = [...e.value ?? e], n = new URL(o).origin, r = /* @__PURE__ */ new Set([o]), i = o, a = e["@odata.nextLink"];
60
- for (; typeof a == "string" && a && t.length < l;) {
61
- let e = new URL(a, i);
62
- if (e.origin !== n) throw Error(`OData nextLink points outside the source origin (${e.origin})`);
63
- if (i = e.toString(), r.has(i)) throw Error(`OData nextLink repeats an already-read page (${i})`);
64
- r.add(i);
65
- let o = await c(i);
66
- t.push(...o.value ?? []), a = o["@odata.nextLink"];
67
- }
68
- return {
69
- count: e["@odata.count"],
70
- rows: t
71
- };
72
- })().then(({ count: t, rows: n }) => {
73
- if (e.signal.aborted) return;
74
- let r = t ?? 0;
75
- x(n), C(r), D(null);
76
- let i = r === 0 ? 0 : Math.ceil(r / l) - 1;
77
- k > i && A(i);
78
- }).catch((t) => {
79
- e.signal.aborted || t.name !== "AbortError" && (D(t.message), x([]), C(0));
80
- }).finally(() => {
81
- e.signal.aborted || T(!1);
82
- }), () => e.abort();
83
- }, [
84
- v,
85
- s,
86
- k,
87
- l,
88
- j,
89
- N,
90
- y,
91
- u,
92
- F,
93
- h
94
- ]), {
95
- data: b,
96
- totalCount: S,
97
- loading: w || !v,
98
- error: E,
99
- page: k,
100
- setPage: A,
101
- sortCriteria: j,
102
- onSortChange: H,
103
- search: N,
104
- setSearch: V,
105
- refresh: B
106
- };
107
- }
108
- function c(e) {
109
- return e.split(",").map((e) => {
110
- let t = e.trim().split(/\s+/);
111
- return {
112
- key: t[0],
113
- direction: t[1]?.toLowerCase() === "desc" ? "desc" : "asc"
114
- };
115
- });
116
- }
117
- //#endregion
118
- export { s as i, c as n, o as r, a as t };