@iyulab/flex-table 0.59.0 → 0.61.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.
@@ -51,9 +51,13 @@ export declare function resolveInitialState(options: InitialSourceStateOptions):
51
51
  export declare function parseOrderBy(orderBy: string): SortCriteria[];
52
52
  /** `buildODataQuery` 가 읽는 표 상태 — `useODataSource` 가 요청마다 넘기는 것과 같은 모양. */
53
53
  export interface ODataQueryState {
54
- /** 0부터 세는 페이지 번호. */
55
- page: number;
56
- pageSize: number;
54
+ /** 0부터 세는 페이지 번호. `pageSize` 와 함께 `$skip` 이 된다. */
55
+ page?: number;
56
+ /**
57
+ * 한 페이지의 행 수(`$top`). **생략하면 `$top`·`$skip` 없이** 조회 결과 전체를 묻는다 — 서버가 응답을 나누면
58
+ * (`@odata.nextLink`) 끝까지 따라가는 것은 부르는 쪽 몫이다(`ODataSource.fetchAll`).
59
+ */
60
+ pageSize?: number;
57
61
  sortCriteria?: SortCriteria[];
58
62
  /** 정렬 기준이 비었을 때 쓰는 `$orderby` 문자열. */
59
63
  defaultOrderBy?: string;
@@ -1,5 +1,6 @@
1
1
  import type { SortCriteria } from '../core/sorting.js';
2
2
  import { type SourceError } from '../core/source-error.js';
3
+ import { type FetchAllOptions } from '../core/fetch-all.js';
3
4
  /** OData 소스의 설정 — `useODataSource` 의 옵션과 같다(`initial*` 은 만들 때만 읽는다). */
4
5
  export interface ODataSourceOptions {
5
6
  pageSize?: number;
@@ -78,6 +79,14 @@ export interface ODataSource<T> {
78
79
  refresh(): void;
79
80
  /** 설정을 바꾼다 — 요청 조건이 바뀌면 다시 읽고(`fixedFilter` 값이 바뀌면 첫 장으로), `fetcher`·`onUnauthorized` 는 다음 요청부터. */
80
81
  update(url: string, options?: ODataSourceOptions): void;
82
+ /**
83
+ * **지금 조건(정렬 · 검색 · 고정 필터)의 결과 전체**를 읽는다 — 페이지 없이, 서버가 응답을 나누면(`@odata.nextLink`)
84
+ * 끝까지 따라가서. 내보내기처럼 «이 목록이 보여 주는 조회 결과 전부» 가 필요할 때 쓴다. 상태(`data`·`page` …)는
85
+ * 건드리지 않고 구독도 요구하지 않는다(`enabled: false` 여도 읽는다 — 부르는 것이 곧 요청이다).
86
+ *
87
+ * 실패는 `SourceRequestError`(`failure` 가 `SourceError`)로, 상한을 넘으면 그 하위 `RowLimitError` 로 거절한다.
88
+ */
89
+ fetchAll(options?: FetchAllOptions): Promise<T[]>;
81
90
  }
82
91
  /** OData v4 서버 사이드 데이터 소스를 만든다. flex-table 의 `dataMode="server"` 와 함께 쓴다. */
83
92
  export declare function createODataSource<T = Record<string, unknown>>(url: string, options?: ODataSourceOptions): ODataSource<T>;
@@ -1,5 +1,6 @@
1
1
  import type { SortCriteria } from '../core/sorting.js';
2
2
  import type { ODataSourceOptions, ODataSourceState } from './source.js';
3
+ import type { FetchAllOptions } from '../core/fetch-all.js';
3
4
  /** `useODataSource` 의 옵션 — 프레임워크 중립 소스(`createODataSource`)의 설정과 같다. `initial*` 은 첫 렌더에서만 읽힌다. */
4
5
  export type UseODataSourceOptions = ODataSourceOptions;
5
6
  export interface UseODataSourceResult<T> extends ODataSourceState<T> {
@@ -11,5 +12,7 @@ export interface UseODataSourceResult<T> extends ODataSourceState<T> {
11
12
  /** 검색어를 바꾸고 첫 장으로 간다. */
12
13
  setSearch: (term: string) => void;
13
14
  refresh: () => void;
15
+ /** 지금 조건의 결과 전체 — 페이지 없이, `@odata.nextLink` 를 끝까지(`ODataSource.fetchAll`). 내보내기에 쓴다. */
16
+ fetchAll: (options?: FetchAllOptions) => Promise<T[]>;
14
17
  }
15
18
  export type { SortCriteria };
package/dist/react.d.ts CHANGED
@@ -71,3 +71,5 @@ export type { UseODataSourceOptions, UseODataSourceResult } from './odata/types.
71
71
  export { useArraySource } from './array/use-array-source.js';
72
72
  export type { UseArraySourceOptions, UseArraySourceResult } from './array/types.js';
73
73
  export type { SourceError, SourceErrorDetail } from './core/source-error.js';
74
+ export { SourceRequestError, RowLimitError } from './core/source-error.js';
75
+ export type { FetchAllOptions } from './core/fetch-all.js';
package/dist/react.js CHANGED
@@ -1,81 +1,94 @@
1
- import { t as e } from "./flex-table-BDTykqUE.js";
2
- import { i as t } from "./query-Dw4iO0ir.js";
3
- import { t as n } from "./source-DOue0Ti3.js";
4
- import { t as r } from "./view-DiLr-TdY.js";
5
- import i, { useCallback as a, useEffect as o, useMemo as s, useState as c, useSyncExternalStore as l } from "react";
6
- import { createComponent as u } from "@lit/react";
1
+ import { t as e } from "./flex-table-BD_T3SqO.js";
2
+ import { n as t, r as n, u as r } from "./fetch-all-J37bOtgc.js";
3
+ import { t as i } from "./source-DNPtWmC3.js";
4
+ import { n as a, t as o } from "./view-BtoXdUGF.js";
5
+ import s, { useCallback as c, useEffect as l, useMemo as u, useState as d, useSyncExternalStore as f } from "react";
6
+ import { createComponent as p } from "@lit/react";
7
7
  //#region src/odata/use-odata-source.ts
8
- function d(e, t = {}) {
9
- let [r] = c(() => n(e, t));
10
- o(() => {
11
- r.update(e, t);
8
+ function m(e, t = {}) {
9
+ let [n] = d(() => i(e, t));
10
+ l(() => {
11
+ n.update(e, t);
12
12
  });
13
- let i = l(r.subscribe, r.getState, r.getState), s = a((e) => {
13
+ let r = f(n.subscribe, n.getState, n.getState), a = c((e) => {
14
14
  let t = e.detail?.criteria;
15
- t && r.setSort(t);
16
- }, [r]);
15
+ t && n.setSort(t);
16
+ }, [n]);
17
17
  return {
18
- ...i,
19
- setPage: r.setPage,
20
- setPageSize: r.setPageSize,
21
- onSortChange: s,
22
- setSearch: r.setSearch,
23
- refresh: r.refresh
18
+ ...r,
19
+ setPage: n.setPage,
20
+ setPageSize: n.setPageSize,
21
+ onSortChange: a,
22
+ setSearch: n.setSearch,
23
+ refresh: n.refresh,
24
+ fetchAll: n.fetchAll
24
25
  };
25
26
  }
26
27
  //#endregion
27
28
  //#region src/array/use-array-source.ts
28
- function f(e, n = {}) {
29
- let { pageSize: i = 20, defaultOrderBy: o, initialPage: l = 0, initialSearch: u = "", initialSort: d, columns: f, searchFields: p } = n, m = t({
30
- defaultOrderBy: o,
31
- initialPage: l,
32
- initialSearch: u,
33
- initialSort: d
34
- }), [h, g] = c(m.page), [_, v] = c(m.sortCriteria), [y, b] = c(m.search), [x, S] = c(i), [C, w] = c(i);
35
- i !== C && (w(i), S(i), g(0));
36
- let T = a((e) => {
37
- S(e), g(0);
38
- }, []), E = a((e) => {
39
- b(e), g(0);
40
- }, []), D = a((e) => {
29
+ function h(e, t = {}) {
30
+ let { pageSize: n = 20, defaultOrderBy: i, initialPage: s = 0, initialSearch: l = "", initialSort: f, columns: p, searchFields: m } = t, h = r({
31
+ defaultOrderBy: i,
32
+ initialPage: s,
33
+ initialSearch: l,
34
+ initialSort: f
35
+ }), [g, _] = d(h.page), [v, y] = d(h.sortCriteria), [b, x] = d(h.search), [S, C] = d(n), [w, T] = d(n);
36
+ n !== w && (T(n), C(n), _(0));
37
+ let E = c((e) => {
38
+ C(e), _(0);
39
+ }, []), D = c((e) => {
40
+ x(e), _(0);
41
+ }, []), O = c((e) => {
41
42
  let t = e.detail?.criteria;
42
- t && (v(t), g(0));
43
- }, []), O = a(() => {}, []), { data: k, totalCount: A } = s(() => r(e, {
44
- search: y,
45
- sortCriteria: _,
46
- page: h,
47
- pageSize: x,
48
- columns: f,
49
- searchFields: p
43
+ t && (y(t), _(0));
44
+ }, []), k = c(() => {}, []), A = c((t) => a(e, {
45
+ search: b,
46
+ sortCriteria: v,
47
+ columns: p,
48
+ searchFields: m
49
+ }, t), [
50
+ e,
51
+ b,
52
+ v,
53
+ p,
54
+ m
55
+ ]), { data: j, totalCount: M } = u(() => o(e, {
56
+ search: b,
57
+ sortCriteria: v,
58
+ page: g,
59
+ pageSize: S,
60
+ columns: p,
61
+ searchFields: m
50
62
  }), [
51
63
  e,
52
- y,
53
- _,
54
- h,
55
- x,
56
- f,
57
- p
58
- ]), j = A === 0 ? 0 : Math.ceil(A / x) - 1;
59
- return h > j && g(j), {
60
- data: k,
61
- totalCount: A,
64
+ b,
65
+ v,
66
+ g,
67
+ S,
68
+ p,
69
+ m
70
+ ]), N = M === 0 ? 0 : Math.ceil(M / S) - 1;
71
+ return g > N && _(N), {
72
+ data: j,
73
+ totalCount: M,
62
74
  loading: !1,
63
75
  error: null,
64
- page: h,
65
- setPage: g,
66
- pageSize: x,
67
- setPageSize: T,
68
- sortCriteria: _,
69
- onSortChange: D,
70
- search: y,
71
- setSearch: E,
72
- refresh: O
76
+ page: g,
77
+ setPage: _,
78
+ pageSize: S,
79
+ setPageSize: E,
80
+ sortCriteria: v,
81
+ onSortChange: O,
82
+ search: b,
83
+ setSearch: D,
84
+ refresh: k,
85
+ fetchAll: A
73
86
  };
74
87
  }
75
- var p = u({
88
+ var g = p({
76
89
  tagName: "flex-table",
77
90
  elementClass: e,
78
- react: i,
91
+ react: s,
79
92
  events: {
80
93
  onCellSelect: "cell-select",
81
94
  onCellEditCommit: "cell-edit-commit",
@@ -111,4 +124,4 @@ var p = u({
111
124
  }
112
125
  });
113
126
  //#endregion
114
- export { p as FlexTableReact, f as useArraySource, d as useODataSource };
127
+ export { g as FlexTableReact, t as RowLimitError, n as SourceRequestError, h as useArraySource, m as useODataSource };
@@ -0,0 +1,202 @@
1
+ import { a as e, i as t, n, o as r, r as i, s as a, t as o, u as s } from "./fetch-all-J37bOtgc.js";
2
+ //#region src/odata/source.ts
3
+ function c(e, t = {}) {
4
+ let i = e, c = t, d = u(t.fixedFilter), f = s({
5
+ defaultOrderBy: t.defaultOrderBy,
6
+ initialPage: t.initialPage ?? 0,
7
+ initialSearch: t.initialSearch ?? "",
8
+ initialSort: t.initialSort
9
+ }), p = {
10
+ data: [],
11
+ totalCount: 0,
12
+ loading: !0,
13
+ error: null,
14
+ page: f.page,
15
+ pageSize: t.pageSize ?? 20,
16
+ sortCriteria: f.sortCriteria,
17
+ search: f.search
18
+ }, m = x(), h = /* @__PURE__ */ new Set(), g = null, _ = !1, v = null;
19
+ function y() {
20
+ return c.enabled ?? !0;
21
+ }
22
+ function b() {
23
+ return p.pageSize;
24
+ }
25
+ function x() {
26
+ return {
27
+ ...p,
28
+ loading: p.loading || !y()
29
+ };
30
+ }
31
+ function S(e) {
32
+ p = {
33
+ ...p,
34
+ ...e
35
+ }, C();
36
+ }
37
+ function C() {
38
+ let e = x();
39
+ if (!Object.keys(e).every((t) => e[t] === m[t])) {
40
+ m = e;
41
+ for (let e of [...h]) e();
42
+ }
43
+ }
44
+ function w() {
45
+ return JSON.stringify([
46
+ i,
47
+ c.baseUrl,
48
+ b(),
49
+ c.defaultOrderBy,
50
+ d,
51
+ p.page,
52
+ p.sortCriteria,
53
+ p.search
54
+ ]);
55
+ }
56
+ function T() {
57
+ _ || (_ = !0, queueMicrotask(() => {
58
+ _ = !1, E();
59
+ }));
60
+ }
61
+ function E() {
62
+ if (h.size === 0) return;
63
+ if (!y()) {
64
+ g?.abort(), g = null, v = null, C();
65
+ return;
66
+ }
67
+ let e = w();
68
+ e !== v && (v = e, D());
69
+ }
70
+ function D() {
71
+ g?.abort();
72
+ let e = new AbortController();
73
+ g = e;
74
+ let { page: t, sortCriteria: n, search: o } = p, s = b(), u = c.fetcher ?? fetch, d = c.onUnauthorized;
75
+ S({
76
+ loading: !0,
77
+ error: null
78
+ });
79
+ let f = a({
80
+ page: t,
81
+ pageSize: s,
82
+ sortCriteria: n,
83
+ defaultOrderBy: c.defaultOrderBy,
84
+ search: o,
85
+ fixedFilter: c.fixedFilter
86
+ });
87
+ l(`${c.baseUrl ?? window.location.origin}${i}${f}`, {
88
+ fetcher: u,
89
+ signal: e.signal,
90
+ onUnauthorized: d
91
+ }, (e) => e.length < s).then(({ count: n, rows: r }) => {
92
+ if (e.signal.aborted) return;
93
+ let i = n ?? 0, a = i === 0 ? 0 : Math.ceil(i / s) - 1;
94
+ t > a ? (S({
95
+ data: r,
96
+ totalCount: i,
97
+ error: null,
98
+ page: a
99
+ }), T()) : S({
100
+ data: r,
101
+ totalCount: i,
102
+ error: null
103
+ });
104
+ }).catch((t) => {
105
+ e.signal.aborted || t?.name !== "AbortError" && S({
106
+ error: r(t),
107
+ data: [],
108
+ totalCount: 0
109
+ });
110
+ }).finally(() => {
111
+ e.signal.aborted || S({ loading: !1 });
112
+ });
113
+ }
114
+ return {
115
+ getState: () => m,
116
+ subscribe(e) {
117
+ return h.add(e), h.size === 1 && T(), () => {
118
+ !h.delete(e) || h.size > 0 || (g?.abort(), g = null, v = null);
119
+ };
120
+ },
121
+ setPage(e) {
122
+ S({ page: e }), T();
123
+ },
124
+ setPageSize(e) {
125
+ e !== p.pageSize && (S({
126
+ pageSize: e,
127
+ page: 0
128
+ }), T());
129
+ },
130
+ setSort(e) {
131
+ S({
132
+ sortCriteria: e,
133
+ page: 0
134
+ }), T();
135
+ },
136
+ setSearch(e) {
137
+ S({
138
+ search: e,
139
+ page: 0
140
+ }), T();
141
+ },
142
+ refresh() {
143
+ y() && (v = null, T());
144
+ },
145
+ async fetchAll({ maxRows: e = o, signal: t, onProgress: r } = {}) {
146
+ let { sortCriteria: s, search: u } = p, d = a({
147
+ sortCriteria: s,
148
+ defaultOrderBy: c.defaultOrderBy,
149
+ search: u,
150
+ fixedFilter: c.fixedFilter
151
+ }), { rows: f } = await l(`${c.baseUrl ?? window.location.origin}${i}${d}`, {
152
+ fetcher: c.fetcher ?? fetch,
153
+ signal: t,
154
+ onUnauthorized: c.onUnauthorized
155
+ }, (t, i) => {
156
+ if (i !== void 0 && i > e || t.length > e) throw new n(e, i);
157
+ return r?.(t.length, i), !0;
158
+ });
159
+ return f;
160
+ },
161
+ update(e, t = {}) {
162
+ let n = u(t.fixedFilter), r = n !== d, a = t.pageSize !== void 0 && t.pageSize !== c.pageSize;
163
+ i = e, c = t, d = n, r && (p = {
164
+ ...p,
165
+ page: 0
166
+ }), a && t.pageSize !== p.pageSize && (p = {
167
+ ...p,
168
+ pageSize: t.pageSize,
169
+ page: 0
170
+ }), C(), T();
171
+ }
172
+ };
173
+ }
174
+ async function l(n, { fetcher: r, signal: a, onUnauthorized: o }, s) {
175
+ let c = async (n) => {
176
+ let s;
177
+ try {
178
+ s = await r(n, { signal: a });
179
+ } catch (e) {
180
+ throw e?.name === "AbortError" ? e : t(e);
181
+ }
182
+ if (!s.ok) throw s.status === 401 && o && o(s), new i(await e(s));
183
+ return s.json();
184
+ }, l = await c(n), u = typeof l["@odata.count"] == "number" ? l["@odata.count"] : void 0, d = [...l.value ?? l], f = new URL(n).origin, p = /* @__PURE__ */ new Set([n]), m = n, h = l["@odata.nextLink"];
185
+ for (; s(d, u) && typeof h == "string" && h;) {
186
+ let e = new URL(h, m);
187
+ if (e.origin !== f) throw new i({ message: `OData nextLink points outside the source origin (${e.origin})` });
188
+ if (m = e.toString(), p.has(m)) throw new i({ message: `OData nextLink repeats an already-read page (${m})` });
189
+ p.add(m);
190
+ let t = await c(m);
191
+ d.push(...t.value ?? []), h = t["@odata.nextLink"];
192
+ }
193
+ return {
194
+ count: u,
195
+ rows: d
196
+ };
197
+ }
198
+ function u(e) {
199
+ return e ? JSON.stringify(e) : "";
200
+ }
201
+ //#endregion
202
+ export { c as t };
@@ -1,6 +1,7 @@
1
1
  import { t as e } from "./sorting-CjfjRxwL.js";
2
+ import { n as t, t as n } from "./fetch-all-J37bOtgc.js";
2
3
  //#region src/array/view.ts
3
- function t(t, { search: n, sortCriteria: r, page: i, pageSize: a, columns: o, searchFields: s }) {
4
+ function r(t, { search: n, sortCriteria: r, page: i, pageSize: a, columns: o, searchFields: s }) {
4
5
  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
6
  r.length > 0 && (u = e(l, r, o ?? []).map((e) => l[e]));
6
7
  let d = u.length, f = d === 0 ? 0 : Math.ceil(d / a) - 1, p = Math.min(Math.max(i, 0), f) * a;
@@ -9,5 +10,15 @@ function t(t, { search: n, sortCriteria: r, page: i, pageSize: a, columns: o, se
9
10
  totalCount: d
10
11
  };
11
12
  }
13
+ async function i(e, i, { maxRows: a = n, signal: o, onProgress: s } = {}) {
14
+ o?.throwIfAborted();
15
+ let { data: c, totalCount: l } = r(e, {
16
+ ...i,
17
+ page: 0,
18
+ pageSize: Math.max(e.length, 1)
19
+ });
20
+ if (l > a) throw new t(a, l);
21
+ return s?.(c.length, l), c;
22
+ }
12
23
  //#endregion
13
- export { t };
24
+ export { i as n, r as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iyulab/flex-table",
3
- "version": "0.59.0",
3
+ "version": "0.61.0",
4
4
  "description": "A minimalist, input-centric data grid web component",
5
5
  "type": "module",
6
6
  "main": "./dist/flex-table.js",
@@ -40,7 +40,7 @@ Replacing `data` with the same array reference does not trigger the clear-on-cha
40
40
  | `visibleColumns` | `ColumnDefinition[]` (non-hidden) |
41
41
  | `filteredRowCount` | `number` |
42
42
  | `filterKeys` | `string[]` |
43
- | `sortCriteria` | `SortCriteria[]` — `{ key, direction: 'asc' \| 'desc' }` |
43
+ | `sortCriteria` | `SortCriteria[]` — `{ key, direction: 'asc' \| 'desc' }`. Settable too (no `sort-change`): a source's sort goes in as is |
44
44
  | `activeCell` / `editingCell` | `CellPosition \| null` — `{ row, col }` |
45
45
  | `canUndo` / `canRedo` | `boolean` |
46
46
 
@@ -131,9 +131,13 @@ Enter/Escape and blur-to-commit behavior.
131
131
  | `setComment(dataIndex, colKey, text)` | `null` or `''` removes; undoable |
132
132
  | `getComment(dataIndex, colKey)` / `clearComments()` | |
133
133
  | `importFromFile(file)` | `Promise<void>`; `.xlsx`, `.csv`, `.tsv`; fires `data-import` |
134
- | `exportToString(format, { selectionOnly? })` | `string \| Uint8Array`; format `'csv' \| 'tsv' \| 'json' \| 'xlsx'` (xlsx returns uncompressed bytes — synchronous) |
135
- | `exportToBlob(format, { selectionOnly? })` | `Promise<Blob>` typed with the format's MIME; xlsx is DEFLATE-compressed |
136
- | `exportToFile(format, filename?)` | `Promise<void>` — triggers a download (xlsx compressed) |
134
+ | `exportToString(format, { selectionOnly? } \| { rows })` | `string \| Uint8Array`; format `'csv' \| 'tsv' \| 'json' \| 'xlsx'` (xlsx returns uncompressed bytes — synchronous). `rows`: export these rows with the visible columns |
135
+ | `exportToBlob(format, options?)` | `Promise<Blob>` typed with the format's MIME; xlsx is DEFLATE-compressed |
136
+ | `exportToFile(format, filename?, options?)` | `Promise<void>` — triggers a download (xlsx compressed) |
137
+
138
+ A server-paged table holds one page. Export the list's whole result with
139
+ `table.exportToFile('xlsx', 'x.xlsx', { rows: await source.fetchAll() })` — never the table's own rows there.
140
+ Table-less: `exportDataBlob(rows, columns, format)` + `downloadBlob(blob, name)` from the root entry.
137
141
 
138
142
  ## Events
139
143
 
@@ -114,6 +114,7 @@ function Orders() {
114
114
  | `sortCriteria`, `onSortChange` | Pass `onSortChange` to the table's `sort-change` (resets to page 0) |
115
115
  | `search`, `setSearch` | Literal text (resets to page 0) |
116
116
  | `refresh` | Re-run the current request |
117
+ | `fetchAll(options?)` | The whole result of the current sort/search/filter (no paging, follows `@odata.nextLink`) — for export. `maxRows` (default 100000) rejects with `RowLimitError` rather than cutting; `signal`, `onProgress` |
117
118
 
118
119
  Search is literal: each whitespace-separated token becomes a quoted phrase joined with `AND`
119
120
  (`red shirt` → `"red" AND "shirt"`); double quotes are stripped. If the result set shrinks below
@@ -159,7 +160,7 @@ Differences: `totalCount` is the count after search, `loading` is always `false`
159
160
 
160
161
  `useODataSource` adapts a framework-neutral source with the same options and state:
161
162
  `createODataSource(url, options)` → `getState()` · `subscribe(listener)` (the first subscriber starts loading, the last
162
- unsubscribe cancels) · `setPage` · `setPageSize` · `setSort(criteria)` · `setSearch` · `refresh` · `update(url, options)`. Changes in one
163
+ unsubscribe cancels) · `setPage` · `setPageSize` · `setSort(criteria)` · `setSearch` · `refresh` · `update(url, options)` · `fetchAll(options?)`. Changes in one
163
164
  tick become one request. For Lit, `ODataSourceController` subscribes on connect, cancels on disconnect and re-renders
164
165
  the host — from a URL, or from a source you already have (`new ODataSourceController(this, source)`, so a table and a pager share it):
165
166
 
@@ -1,37 +0,0 @@
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 };