@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.
- package/CHANGELOG.md +28 -0
- package/README.md +27 -5
- package/dist/array/index.d.ts +3 -0
- package/dist/array/index.js +46 -38
- package/dist/array/source.d.ts +3 -0
- package/dist/array/types.d.ts +3 -0
- package/dist/array/view.d.ts +6 -0
- package/dist/core/fetch-all.d.ts +14 -0
- package/dist/core/source-error.d.ts +13 -1
- package/dist/fetch-all-J37bOtgc.js +86 -0
- package/dist/{flex-table-BDTykqUE.js → flex-table-BD_T3SqO.js} +84 -77
- package/dist/flex-table.d.ts +29 -9
- package/dist/flex-table.js +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/{locale-Cfm-vJji.js → locale-D9g0ksXq.js} +4 -2
- package/dist/locale.d.ts +1 -1
- package/dist/odata/index.d.ts +4 -0
- package/dist/odata/index.js +5 -5
- package/dist/odata/query.d.ts +7 -3
- package/dist/odata/source.d.ts +9 -0
- package/dist/odata/types.d.ts +3 -0
- package/dist/react.d.ts +2 -0
- package/dist/react.js +75 -62
- package/dist/source-DNPtWmC3.js +202 -0
- package/dist/{view-DiLr-TdY.js → view-BtoXdUGF.js} +13 -2
- package/package.json +1 -1
- package/skills/iyulab-flex-table/references/api.md +8 -4
- package/skills/iyulab-flex-table/references/react.md +2 -1
- package/dist/query-Dw4iO0ir.js +0 -37
- package/dist/source-DOue0Ti3.js +0 -223
package/dist/odata/query.d.ts
CHANGED
|
@@ -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
|
|
56
|
-
|
|
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;
|
package/dist/odata/source.d.ts
CHANGED
|
@@ -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>;
|
package/dist/odata/types.d.ts
CHANGED
|
@@ -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-
|
|
2
|
-
import {
|
|
3
|
-
import { t as
|
|
4
|
-
import { t as
|
|
5
|
-
import
|
|
6
|
-
import { createComponent as
|
|
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
|
|
9
|
-
let [
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
function m(e, t = {}) {
|
|
9
|
+
let [n] = d(() => i(e, t));
|
|
10
|
+
l(() => {
|
|
11
|
+
n.update(e, t);
|
|
12
12
|
});
|
|
13
|
-
let
|
|
13
|
+
let r = f(n.subscribe, n.getState, n.getState), a = c((e) => {
|
|
14
14
|
let t = e.detail?.criteria;
|
|
15
|
-
t &&
|
|
16
|
-
}, [
|
|
15
|
+
t && n.setSort(t);
|
|
16
|
+
}, [n]);
|
|
17
17
|
return {
|
|
18
|
-
...
|
|
19
|
-
setPage:
|
|
20
|
-
setPageSize:
|
|
21
|
-
onSortChange:
|
|
22
|
-
setSearch:
|
|
23
|
-
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
|
|
29
|
-
let { pageSize:
|
|
30
|
-
defaultOrderBy:
|
|
31
|
-
initialPage:
|
|
32
|
-
initialSearch:
|
|
33
|
-
initialSort:
|
|
34
|
-
}), [
|
|
35
|
-
|
|
36
|
-
let
|
|
37
|
-
|
|
38
|
-
}, []),
|
|
39
|
-
|
|
40
|
-
}, []),
|
|
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 && (
|
|
43
|
-
}, []),
|
|
44
|
-
search:
|
|
45
|
-
sortCriteria:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
]),
|
|
59
|
-
return
|
|
60
|
-
data:
|
|
61
|
-
totalCount:
|
|
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:
|
|
65
|
-
setPage:
|
|
66
|
-
pageSize:
|
|
67
|
-
setPageSize:
|
|
68
|
-
sortCriteria:
|
|
69
|
-
onSortChange:
|
|
70
|
-
search:
|
|
71
|
-
setSearch:
|
|
72
|
-
refresh:
|
|
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
|
|
88
|
+
var g = p({
|
|
76
89
|
tagName: "flex-table",
|
|
77
90
|
elementClass: e,
|
|
78
|
-
react:
|
|
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 {
|
|
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
|
|
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
|
@@ -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,
|
|
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
|
|
package/dist/query-Dw4iO0ir.js
DELETED
|
@@ -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 };
|