ts-client-lib 0.0.7
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/README.md +76 -0
- package/auth/TSJWT.d.ts +29 -0
- package/auth/TSJWT.js +44 -0
- package/auth/TSOAuth.d.ts +132 -0
- package/auth/TSOAuth.js +230 -0
- package/devices/TSCordova.d.ts +5 -0
- package/devices/TSCordova.js +52 -0
- package/entities/TSCountries.d.ts +14 -0
- package/entities/TSCountries.js +1188 -0
- package/entities/TSCurrencies.d.ts +35 -0
- package/entities/TSCurrencies.js +604 -0
- package/entities/TSMobilePhones.d.ts +167 -0
- package/entities/TSMobilePhones.js +206 -0
- package/entities/TSMoney.d.ts +149 -0
- package/entities/TSMoney.js +311 -0
- package/entities/currency-amount.d.ts +13 -0
- package/entities/currency-amount.js +43 -0
- package/finance/TSBonus.d.ts +197 -0
- package/finance/TSBonus.js +530 -0
- package/finance/TSKYC.d.ts +563 -0
- package/finance/TSKYC.js +1066 -0
- package/finance/TSTax.d.ts +49 -0
- package/finance/TSTax.js +106 -0
- package/finance/bonus-money.d.ts +41 -0
- package/finance/bonus-money.js +61 -0
- package/games/TSBetSlip.d.ts +72 -0
- package/games/TSBetSlip.js +179 -0
- package/games/TSBetSystem.d.ts +4 -0
- package/games/TSBetSystem.js +48 -0
- package/games/TSLotto.d.ts +35 -0
- package/games/TSLotto.js +205 -0
- package/games/TSPool.d.ts +28 -0
- package/games/TSPool.js +88 -0
- package/package.json +93 -0
- package/utils/TSArray.d.ts +9 -0
- package/utils/TSArray.js +87 -0
- package/utils/TSBoolean.d.ts +4 -0
- package/utils/TSBoolean.js +24 -0
- package/utils/TSCache.d.ts +167 -0
- package/utils/TSCache.js +531 -0
- package/utils/TSDate.d.ts +8 -0
- package/utils/TSDate.js +67 -0
- package/utils/TSHeuristic.d.ts +20 -0
- package/utils/TSHeuristic.js +197 -0
- package/utils/TSLZS.d.ts +42 -0
- package/utils/TSLZS.js +343 -0
- package/utils/TSLog.d.ts +40 -0
- package/utils/TSLog.js +110 -0
- package/utils/TSNumber.d.ts +6 -0
- package/utils/TSNumber.js +68 -0
- package/utils/TSObject.d.ts +29 -0
- package/utils/TSObject.js +312 -0
- package/utils/TSPagination.d.ts +282 -0
- package/utils/TSPagination.js +425 -0
- package/utils/TSPaginationMulti.d.ts +77 -0
- package/utils/TSPaginationMulti.js +356 -0
- package/utils/TSString.d.ts +10 -0
- package/utils/TSString.js +107 -0
- package/utils/TSValidator.d.ts +16 -0
- package/utils/TSValidator.js +74 -0
- package/utils/TSWorker.d.ts +3 -0
- package/utils/TSWorker.js +32 -0
- package/utils/diacritics-removal-map.d.ts +5 -0
- package/utils/diacritics-removal-map.js +341 -0
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pagination – shared source of truth for cursor-based pagination.
|
|
4
|
+
* Use on server (Node) and client (React, Angular, etc.) for consistent types and helpers.
|
|
5
|
+
* No framework or DB dependencies; pure TypeScript.
|
|
6
|
+
*
|
|
7
|
+
* Cursor pagination is O(1) per request (no offset). Navigation uses first/after (forward)
|
|
8
|
+
* or last/before (backward). "Last page" is requested with last=N and no before.
|
|
9
|
+
*/
|
|
10
|
+
var __assign = (this && this.__assign) || function () {
|
|
11
|
+
__assign = Object.assign || function(t) {
|
|
12
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
13
|
+
s = arguments[i];
|
|
14
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
15
|
+
t[p] = s[p];
|
|
16
|
+
}
|
|
17
|
+
return t;
|
|
18
|
+
};
|
|
19
|
+
return __assign.apply(this, arguments);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.TSPagination = exports.BAR_PRESETS = exports.MAX_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = void 0;
|
|
23
|
+
exports.clampPageSize = clampPageSize;
|
|
24
|
+
exports.getCurrentPage = getCurrentPage;
|
|
25
|
+
exports.getTotalPages = getTotalPages;
|
|
26
|
+
exports.getLastPageRangeStart = getLastPageRangeStart;
|
|
27
|
+
exports.isLastPageRequest = isLastPageRequest;
|
|
28
|
+
exports.getRangeStartToApplyAfterLoad = getRangeStartToApplyAfterLoad;
|
|
29
|
+
exports.getPageSize = getPageSize;
|
|
30
|
+
exports.getRangeStartAfterNext = getRangeStartAfterNext;
|
|
31
|
+
exports.getRangeStartAfterPrevious = getRangeStartAfterPrevious;
|
|
32
|
+
exports.clampRangeStartForSet = clampRangeStartForSet;
|
|
33
|
+
exports.isLastPageDisabled = isLastPageDisabled;
|
|
34
|
+
exports.getPageNumberStrip = getPageNumberStrip;
|
|
35
|
+
exports.formatShowingRange = formatShowingRange;
|
|
36
|
+
exports.resolveBarLayout = resolveBarLayout;
|
|
37
|
+
exports.getBarLayoutStripOptions = getBarLayoutStripOptions;
|
|
38
|
+
exports.getBarVisibility = getBarVisibility;
|
|
39
|
+
exports.getBarState = getBarState;
|
|
40
|
+
exports.getDisplayFromInput = getDisplayFromInput;
|
|
41
|
+
exports.addBarStateIfRequested = addBarStateIfRequested;
|
|
42
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
43
|
+
// Constants
|
|
44
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
45
|
+
exports.DEFAULT_PAGE_SIZE = 25;
|
|
46
|
+
exports.MAX_PAGE_SIZE = 100;
|
|
47
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
48
|
+
// Helpers (pure functions – same on server and client)
|
|
49
|
+
// ═══════════════════════════════════════════════════════════════════
|
|
50
|
+
/**
|
|
51
|
+
* Clamp page size to [1, max]. Use when building API inputs.
|
|
52
|
+
*/
|
|
53
|
+
function clampPageSize(size, max) {
|
|
54
|
+
if (max === void 0) { max = exports.MAX_PAGE_SIZE; }
|
|
55
|
+
return Math.min(Math.max(1, Math.floor(size)), max);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 1-based current page number from rangeStart and page size.
|
|
59
|
+
* rangeStart: 1-based index of the first item on the current page.
|
|
60
|
+
*/
|
|
61
|
+
function getCurrentPage(rangeStart, pageSize) {
|
|
62
|
+
if (rangeStart < 1 || pageSize < 1)
|
|
63
|
+
return 1;
|
|
64
|
+
return Math.floor((rangeStart - 1) / pageSize) + 1;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Total number of pages for a given total count and page size.
|
|
68
|
+
* Use for "Page X of Y" and to disable "Last" when on last page.
|
|
69
|
+
*/
|
|
70
|
+
function getTotalPages(totalCount, pageSize) {
|
|
71
|
+
if (totalCount <= 0 || pageSize < 1)
|
|
72
|
+
return 0;
|
|
73
|
+
return Math.ceil(totalCount / pageSize);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Range start (1-based) for the last page, given total count and number of nodes on that page.
|
|
77
|
+
* Call this after loading the last page (request with last=N, no before) and set rangeStart
|
|
78
|
+
* so "Showing X – Y of Z" is correct.
|
|
79
|
+
*/
|
|
80
|
+
function getLastPageRangeStart(totalCount, nodesLength) {
|
|
81
|
+
if (totalCount <= 0 || nodesLength <= 0)
|
|
82
|
+
return 1;
|
|
83
|
+
return Math.max(1, totalCount - nodesLength + 1);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* True when the request was for the last page (last=N, no before).
|
|
87
|
+
* Use to decide whether to set rangeStart from getLastPageRangeStart after the response.
|
|
88
|
+
* When false, the request may be "previous" (last + before) and rangeStart is already set by the client.
|
|
89
|
+
*/
|
|
90
|
+
function isLastPageRequest(pagination) {
|
|
91
|
+
return pagination.last != null && pagination.before == null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Single source of truth: returns the rangeStart to set after a paginated response, or null.
|
|
95
|
+
* Use in one place after every cursor-paginated load: if (v != null) setRangeStart(v).
|
|
96
|
+
* Encodes "when" (only for last-page request) and "value" (getLastPageRangeStart).
|
|
97
|
+
*/
|
|
98
|
+
function getRangeStartToApplyAfterLoad(pagination, totalCount, nodesLength) {
|
|
99
|
+
if (!isLastPageRequest(pagination) || totalCount <= 0 || nodesLength <= 0)
|
|
100
|
+
return null;
|
|
101
|
+
return getLastPageRangeStart(totalCount, nodesLength);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Effective page size from pagination state (first or last, or default).
|
|
105
|
+
*/
|
|
106
|
+
function getPageSize(pagination, defaultSize) {
|
|
107
|
+
var _a, _b;
|
|
108
|
+
if (defaultSize === void 0) { defaultSize = exports.DEFAULT_PAGE_SIZE; }
|
|
109
|
+
return (_b = (_a = pagination.first) !== null && _a !== void 0 ? _a : pagination.last) !== null && _b !== void 0 ? _b : defaultSize;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Range start after "Next": current + pageSize.
|
|
113
|
+
* Use in pagination lib only; hook passes (prev, pageSize).
|
|
114
|
+
*/
|
|
115
|
+
function getRangeStartAfterNext(currentRangeStart, pageSize) {
|
|
116
|
+
return currentRangeStart + pageSize;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Range start after "Previous": go back one page, not below 1.
|
|
120
|
+
* Use in pagination lib only; hook passes (prev, pageSize).
|
|
121
|
+
*/
|
|
122
|
+
function getRangeStartAfterPrevious(currentRangeStart, pageSize) {
|
|
123
|
+
return Math.max(1, currentRangeStart - pageSize);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Clamp value for setRangeStart: use value if >= 1, else keep current (avoid 0 or negative).
|
|
127
|
+
* Use when applying last-page range or external fixes.
|
|
128
|
+
*/
|
|
129
|
+
function clampRangeStartForSet(value, currentRangeStart) {
|
|
130
|
+
return value >= 1 ? value : currentRangeStart;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* True when the "Last" button should be disabled (on last page or no data).
|
|
134
|
+
* Pass hasNextPage from server when available so Last disables even if rangeStart lags.
|
|
135
|
+
*/
|
|
136
|
+
function isLastPageDisabled(totalCount, currentPage, pageSize, hasNextPage) {
|
|
137
|
+
if (totalCount <= 0)
|
|
138
|
+
return true;
|
|
139
|
+
if (hasNextPage === false)
|
|
140
|
+
return true;
|
|
141
|
+
var totalPages = getTotalPages(totalCount, pageSize);
|
|
142
|
+
return totalPages <= 0 || currentPage >= totalPages;
|
|
143
|
+
}
|
|
144
|
+
var DEFAULT_STRIP_OPTIONS = { start: 1, middle: 1, end: 1 };
|
|
145
|
+
function actionForPage(p, cur, totalPages) {
|
|
146
|
+
if (p === cur)
|
|
147
|
+
return null;
|
|
148
|
+
if (p === 1)
|
|
149
|
+
return cur === 1 ? null : 'first';
|
|
150
|
+
if (p === totalPages)
|
|
151
|
+
return cur === totalPages ? null : 'last';
|
|
152
|
+
if (p === cur - 1)
|
|
153
|
+
return 'previous';
|
|
154
|
+
if (p === cur + 1)
|
|
155
|
+
return 'next';
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Build page strip segments for cursor-safe UI: 1 ... current-1 [current] current+1 ... totalPages.
|
|
160
|
+
* Only segments with action first/previous/next/last are clickable (one O(1) request each).
|
|
161
|
+
* No duplicate page numbers (e.g. when on page 2 you get 1 2 3 ... not 1 1 2 3).
|
|
162
|
+
*/
|
|
163
|
+
function getPageNumberStrip(currentPage, totalPages, options) {
|
|
164
|
+
if (totalPages <= 0)
|
|
165
|
+
return [];
|
|
166
|
+
var cur = Math.max(1, Math.min(currentPage, totalPages));
|
|
167
|
+
var _a = __assign(__assign({}, DEFAULT_STRIP_OPTIONS), options), start = _a.start, middle = _a.middle, end = _a.end;
|
|
168
|
+
var startPages = Math.min(start, totalPages);
|
|
169
|
+
var endStart = Math.max(1, totalPages - end + 1);
|
|
170
|
+
var midLo;
|
|
171
|
+
var midHi;
|
|
172
|
+
if (start === 0 && end === 0) {
|
|
173
|
+
// Only middle chunk: treat middle as total count so we show only that many (e.g. 3 => prev, current, next). No disabled extras.
|
|
174
|
+
var total = Math.max(1, Math.min(middle, totalPages));
|
|
175
|
+
var half = Math.floor((total - 1) / 2);
|
|
176
|
+
midLo = Math.max(1, cur - half);
|
|
177
|
+
midHi = Math.min(totalPages, midLo + total - 1);
|
|
178
|
+
midLo = Math.max(1, midHi - total + 1);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
midLo = Math.max(1, cur - middle);
|
|
182
|
+
midHi = Math.min(totalPages, cur + middle);
|
|
183
|
+
}
|
|
184
|
+
var pageSet = new Set();
|
|
185
|
+
for (var p = 1; p <= startPages; p++)
|
|
186
|
+
pageSet.add(p);
|
|
187
|
+
for (var p = midLo; p <= midHi; p++)
|
|
188
|
+
pageSet.add(p);
|
|
189
|
+
for (var p = endStart; p <= totalPages; p++)
|
|
190
|
+
pageSet.add(p);
|
|
191
|
+
var sorted = Array.from(pageSet).sort(function (a, b) { return a - b; });
|
|
192
|
+
var segments = [];
|
|
193
|
+
var prev = 0;
|
|
194
|
+
for (var _i = 0, sorted_1 = sorted; _i < sorted_1.length; _i++) {
|
|
195
|
+
var p = sorted_1[_i];
|
|
196
|
+
if (prev > 0 && p > prev + 1)
|
|
197
|
+
segments.push({ type: 'ellipsis' });
|
|
198
|
+
segments.push({ type: 'number', page: p, action: actionForPage(p, cur, totalPages) });
|
|
199
|
+
prev = p;
|
|
200
|
+
}
|
|
201
|
+
return segments;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Format range as wordless numeric string for i18n: "X – Y / Z" or "0 / Z".
|
|
205
|
+
* Append optional itemLabel so the only translatable part is the label.
|
|
206
|
+
* Example: "1 – 25 / 100" or "1 – 25 / 100 users".
|
|
207
|
+
*/
|
|
208
|
+
function formatShowingRange(rangeStart, nodesLength, totalCount, itemLabel) {
|
|
209
|
+
if (itemLabel === void 0) { itemLabel = ''; }
|
|
210
|
+
var numeric;
|
|
211
|
+
if (totalCount <= 0)
|
|
212
|
+
numeric = '0 / 0';
|
|
213
|
+
else if (nodesLength <= 0)
|
|
214
|
+
numeric = "0 / ".concat(totalCount);
|
|
215
|
+
else
|
|
216
|
+
numeric = "".concat(rangeStart, " \u2013 ").concat(rangeStart + nodesLength - 1, " / ").concat(totalCount);
|
|
217
|
+
return itemLabel ? "".concat(numeric, " ").concat(itemLabel) : numeric;
|
|
218
|
+
}
|
|
219
|
+
/** Presets for common bar layouts. Single source of truth for app and any other consumer. */
|
|
220
|
+
exports.BAR_PRESETS = {
|
|
221
|
+
/** First | Previous | 1 … 59 [60] 61 … 100 | Next | Last */
|
|
222
|
+
full: { first: true, previous: true, strip: true, next: true, last: true },
|
|
223
|
+
/** Only the page number strip (no First/Previous/Next/Last buttons) */
|
|
224
|
+
numbersOnly: { strip: true },
|
|
225
|
+
/** First | 1 … [60] … 100 | Last (no Previous/Next) */
|
|
226
|
+
firstLastOnly: { first: true, strip: true, last: true },
|
|
227
|
+
/** First | Previous | Next | Last (no page numbers) */
|
|
228
|
+
firstPrevNextLast: { first: true, previous: true, next: true, last: true },
|
|
229
|
+
/** Only middle chunk: e.g. [10] 11 12 — the 3 numbers act as prev/current/next. */
|
|
230
|
+
middleOnly: { strip: { start: 0, middle: 3, end: 0 } },
|
|
231
|
+
/** First | [3 numbers] | Last — no Previous/Next; adjacent numbers do prev/next. */
|
|
232
|
+
fullMiddle3: { first: true, strip: { start: 0, middle: 3, end: 0 }, last: true }
|
|
233
|
+
};
|
|
234
|
+
/** Resolve layout from preset name or custom layout. Defaults to full. */
|
|
235
|
+
function resolveBarLayout(preset, layout) {
|
|
236
|
+
if (preset != null && exports.BAR_PRESETS[preset])
|
|
237
|
+
return exports.BAR_PRESETS[preset];
|
|
238
|
+
if (layout != null)
|
|
239
|
+
return layout;
|
|
240
|
+
return exports.BAR_PRESETS.full;
|
|
241
|
+
}
|
|
242
|
+
/** Strip options to pass to getDisplay/getPageNumberStrip from a bar layout and optional prop override. */
|
|
243
|
+
function getBarLayoutStripOptions(barLayout, propStripOptions) {
|
|
244
|
+
var strip = barLayout.strip;
|
|
245
|
+
if (strip === false)
|
|
246
|
+
return undefined;
|
|
247
|
+
if (typeof strip === 'object' && strip != null)
|
|
248
|
+
return strip;
|
|
249
|
+
return propStripOptions;
|
|
250
|
+
}
|
|
251
|
+
function getBarVisibility(barLayout) {
|
|
252
|
+
return {
|
|
253
|
+
showFirst: barLayout.first === true,
|
|
254
|
+
showPrevious: barLayout.previous === true,
|
|
255
|
+
showStrip: barLayout.strip === true || (typeof barLayout.strip === 'object' && barLayout.strip != null),
|
|
256
|
+
showNext: barLayout.next === true,
|
|
257
|
+
showLast: barLayout.last === true
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function getBarState(barLayout, input) {
|
|
261
|
+
var visibility = getBarVisibility(barLayout);
|
|
262
|
+
var display = input.display, pageInfo = input.pageInfo, loading = input.loading, isLastDisabled = input.isLastDisabled;
|
|
263
|
+
var currentPage = display.currentPage, totalPages = display.totalPages, pageStrip = display.pageStrip;
|
|
264
|
+
var prevDisabled = (totalPages <= 0 ? !pageInfo.hasPreviousPage : currentPage <= 1) || loading;
|
|
265
|
+
var nextDisabled = (totalPages <= 0 ? !pageInfo.hasNextPage : currentPage >= totalPages) || loading;
|
|
266
|
+
var lastDisabled = loading || (totalPages > 0 && currentPage >= totalPages) || isLastDisabled;
|
|
267
|
+
var segments = pageStrip.map(function (seg) {
|
|
268
|
+
if (seg.type === 'ellipsis')
|
|
269
|
+
return { type: 'ellipsis' };
|
|
270
|
+
var isCurrent = seg.action === null;
|
|
271
|
+
var disabled = isCurrent || loading;
|
|
272
|
+
return { type: 'number', page: seg.page, action: seg.action, disabled: disabled, isCurrent: isCurrent };
|
|
273
|
+
});
|
|
274
|
+
return {
|
|
275
|
+
visibility: visibility,
|
|
276
|
+
first: { disabled: prevDisabled },
|
|
277
|
+
previous: { disabled: prevDisabled },
|
|
278
|
+
next: { disabled: nextDisabled },
|
|
279
|
+
last: { disabled: lastDisabled },
|
|
280
|
+
strip: { visible: visibility.showStrip, segments: segments }
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/** Build display from input (used by both Orchestra and Function mode). */
|
|
284
|
+
function getDisplayFromInput(input) {
|
|
285
|
+
var rangeStart = input.rangeStart, nodesLength = input.nodesLength, totalCount = input.totalCount, pageSize = input.pageSize, hasNextPage = input.hasNextPage, _a = input.itemLabel, itemLabel = _a === void 0 ? '' : _a, stripOptions = input.stripOptions, pagination = input.pagination;
|
|
286
|
+
var totalPages = getTotalPages(totalCount, pageSize);
|
|
287
|
+
var computedPage = getCurrentPage(rangeStart, pageSize);
|
|
288
|
+
var isLastPageReq = pagination ? isLastPageRequest(pagination) : false;
|
|
289
|
+
var currentPage = totalPages > 0 && hasNextPage === false && isLastPageReq ? totalPages : computedPage;
|
|
290
|
+
return {
|
|
291
|
+
currentPage: currentPage,
|
|
292
|
+
totalPages: totalPages,
|
|
293
|
+
showingText: formatShowingRange(rangeStart, nodesLength, totalCount, itemLabel),
|
|
294
|
+
isLastDisabled: isLastPageDisabled(totalCount, currentPage, pageSize, hasNextPage),
|
|
295
|
+
pageStrip: getPageNumberStrip(currentPage, totalPages, stripOptions)
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/** Add barState to display when options (preset/layout/barLayout) are provided. Use in Orchestra and Function mode. */
|
|
299
|
+
function addBarStateIfRequested(display, options, hasNextPage) {
|
|
300
|
+
var _a, _b, _c;
|
|
301
|
+
var barLayout = (_a = options === null || options === void 0 ? void 0 : options.barLayout) !== null && _a !== void 0 ? _a : ((options === null || options === void 0 ? void 0 : options.preset) != null || (options === null || options === void 0 ? void 0 : options.layout) != null ? resolveBarLayout(options.preset, options.layout) : undefined);
|
|
302
|
+
if (barLayout != null && options != null) {
|
|
303
|
+
var pageInfo = {
|
|
304
|
+
hasNextPage: hasNextPage !== null && hasNextPage !== void 0 ? hasNextPage : false,
|
|
305
|
+
hasPreviousPage: (_b = options.hasPreviousPage) !== null && _b !== void 0 ? _b : false,
|
|
306
|
+
startCursor: undefined,
|
|
307
|
+
endCursor: undefined
|
|
308
|
+
};
|
|
309
|
+
var barState = getBarState(barLayout, {
|
|
310
|
+
display: display,
|
|
311
|
+
pageInfo: pageInfo,
|
|
312
|
+
loading: (_c = options.loading) !== null && _c !== void 0 ? _c : false,
|
|
313
|
+
isLastDisabled: display.isLastDisabled
|
|
314
|
+
});
|
|
315
|
+
return __assign(__assign({}, display), { barState: barState });
|
|
316
|
+
}
|
|
317
|
+
return display;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Minimal facade: call a few methods for common flows.
|
|
321
|
+
* For one-off calculations use the top-level functions (getCurrentPage, formatShowingRange, etc.).
|
|
322
|
+
*
|
|
323
|
+
* @example
|
|
324
|
+
* import { TSPagination } from 'ts-client-lib/utils/TSPagaination';
|
|
325
|
+
*
|
|
326
|
+
* // 1) UI: one call for all display values
|
|
327
|
+
* const display = TSPagination.getDisplay({
|
|
328
|
+
* rangeStart, nodesLength: nodes.length, totalCount, pageSize,
|
|
329
|
+
* hasNextPage: pageInfo.hasNextPage, itemLabel: 'users'
|
|
330
|
+
* });
|
|
331
|
+
* // use display.currentPage, display.showingText, display.isLastDisabled
|
|
332
|
+
*
|
|
333
|
+
* // 2) After response: should we update rangeStart?
|
|
334
|
+
* const rangeStartToApply = TSPagination.getRangeStartAfterResponse(pagination, totalCount, nodes.length);
|
|
335
|
+
* if (rangeStartToApply != null) setRangeStart(rangeStartToApply);
|
|
336
|
+
*
|
|
337
|
+
* // 3) Next/Previous: new rangeStart for a direction
|
|
338
|
+
* const nextRangeStart = TSPagination.getRangeStartAfterMove('next', rangeStart, pageSize);
|
|
339
|
+
*/
|
|
340
|
+
var TSPagination = /** @class */ (function () {
|
|
341
|
+
function TSPagination() {
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* One call for display (+ optional barState via addBarStateIfRequested). Uses getDisplayFromInput + addBarStateIfRequested.
|
|
345
|
+
*/
|
|
346
|
+
TSPagination.getDisplay = function (input, options) {
|
|
347
|
+
return addBarStateIfRequested(getDisplayFromInput(input), options, input.hasNextPage);
|
|
348
|
+
};
|
|
349
|
+
/**
|
|
350
|
+
* After a paginated response: returns rangeStart to set when the request was "last page", else null.
|
|
351
|
+
*/
|
|
352
|
+
TSPagination.getRangeStartAfterResponse = function (pagination, totalCount, nodesLength) {
|
|
353
|
+
return getRangeStartToApplyAfterLoad(pagination, totalCount, nodesLength);
|
|
354
|
+
};
|
|
355
|
+
/**
|
|
356
|
+
* New rangeStart after moving one page in a direction (for next or previous).
|
|
357
|
+
*/
|
|
358
|
+
TSPagination.getRangeStartAfterMove = function (direction, currentRangeStart, pageSize) {
|
|
359
|
+
return direction === 'next'
|
|
360
|
+
? getRangeStartAfterNext(currentRangeStart, pageSize)
|
|
361
|
+
: getRangeStartAfterPrevious(currentRangeStart, pageSize);
|
|
362
|
+
};
|
|
363
|
+
/** Effective page size from pagination state. Use this so you never need to call getPageSize from the lib. */
|
|
364
|
+
TSPagination.getPageSize = function (pagination, defaultSize) {
|
|
365
|
+
if (defaultSize === void 0) { defaultSize = exports.DEFAULT_PAGE_SIZE; }
|
|
366
|
+
return getPageSize(pagination, defaultSize);
|
|
367
|
+
};
|
|
368
|
+
/** Clamp value for setRangeStart (use value if >= 1, else keep current). */
|
|
369
|
+
TSPagination.clampRangeStartForSet = function (value, currentRangeStart) {
|
|
370
|
+
return clampRangeStartForSet(value, currentRangeStart);
|
|
371
|
+
};
|
|
372
|
+
/** 1-based current page from rangeStart and page size. */
|
|
373
|
+
TSPagination.getCurrentPage = function (rangeStart, pageSize) {
|
|
374
|
+
return getCurrentPage(rangeStart, pageSize);
|
|
375
|
+
};
|
|
376
|
+
/** Total pages for "Page X of Y". */
|
|
377
|
+
TSPagination.getTotalPages = function (totalCount, pageSize) {
|
|
378
|
+
return getTotalPages(totalCount, pageSize);
|
|
379
|
+
};
|
|
380
|
+
/** Whether the Last button should be disabled. */
|
|
381
|
+
TSPagination.isLastDisabled = function (totalCount, currentPage, pageSize, hasNextPage) {
|
|
382
|
+
return isLastPageDisabled(totalCount, currentPage, pageSize, hasNextPage);
|
|
383
|
+
};
|
|
384
|
+
/**
|
|
385
|
+
* Execute a navigation (first | previous | next | last). Use this in Orchestra mode so the
|
|
386
|
+
* orchestrator owns all behavior; the hook only holds state and calls this.
|
|
387
|
+
* When going 'previous' from the last page, pass totalCount so we don't use stale rangeStart.
|
|
388
|
+
*/
|
|
389
|
+
TSPagination.executeGo = function (direction, state, setters, defaultPageSize) {
|
|
390
|
+
var pagination = state.pagination, pageInfo = state.pageInfo, rangeStart = state.rangeStart, totalCount = state.totalCount;
|
|
391
|
+
var pageSize = getPageSize(pagination, defaultPageSize);
|
|
392
|
+
switch (direction) {
|
|
393
|
+
case 'first':
|
|
394
|
+
setters.setPagination({ first: defaultPageSize });
|
|
395
|
+
setters.setRangeStartState(1);
|
|
396
|
+
break;
|
|
397
|
+
case 'last':
|
|
398
|
+
setters.setPagination({ last: pageSize });
|
|
399
|
+
break;
|
|
400
|
+
case 'next':
|
|
401
|
+
if (pageInfo.hasNextPage && pageInfo.endCursor) {
|
|
402
|
+
setters.setPagination({ first: pageSize, after: pageInfo.endCursor });
|
|
403
|
+
setters.setRangeStartState(getRangeStartAfterNext(rangeStart, pageSize));
|
|
404
|
+
}
|
|
405
|
+
break;
|
|
406
|
+
case 'previous':
|
|
407
|
+
if (pageInfo.hasPreviousPage && pageInfo.startCursor) {
|
|
408
|
+
setters.setPagination({ last: pageSize, before: pageInfo.startCursor });
|
|
409
|
+
var newRangeStart = void 0;
|
|
410
|
+
if (pageInfo.hasNextPage === false && totalCount != null && totalCount > 0) {
|
|
411
|
+
// On last page; rangeStart may be stale. Use totalCount so we land on (totalPages - 1).
|
|
412
|
+
var totalPages = getTotalPages(totalCount, pageSize);
|
|
413
|
+
newRangeStart = Math.max(1, (totalPages - 2) * pageSize + 1);
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
newRangeStart = getRangeStartAfterPrevious(rangeStart, pageSize);
|
|
417
|
+
}
|
|
418
|
+
setters.setRangeStartState(newRangeStart);
|
|
419
|
+
}
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
return TSPagination;
|
|
424
|
+
}());
|
|
425
|
+
exports.TSPagination = TSPagination;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-feed cursor pagination — client-side emulation of legacy paginateMulti.
|
|
3
|
+
*
|
|
4
|
+
* Each feed keeps its own PGN-1 cursor; this module k-way merges by a shared sort field.
|
|
5
|
+
* Use for "All orders" / recent-activity views. Per-product tabs should use TSPagination alone.
|
|
6
|
+
*
|
|
7
|
+
* @see TSPagination.ts — single-feed cursor UI helpers
|
|
8
|
+
*/
|
|
9
|
+
import { TSPagination, type CursorConnection, type CursorPageInfo, type CursorPaginationState } from './TSPagination.js';
|
|
10
|
+
/** Which product feed a merged row came from (e.g. sports_order). */
|
|
11
|
+
export interface MultiFeedNodeMeta {
|
|
12
|
+
feedKey: string;
|
|
13
|
+
}
|
|
14
|
+
export type MergedFeedNode<T> = T & MultiFeedNodeMeta;
|
|
15
|
+
export interface MergeConnectionsOptions<T extends Record<string, unknown>> {
|
|
16
|
+
sortField: keyof T & string;
|
|
17
|
+
sortDir?: 'asc' | 'desc';
|
|
18
|
+
limit: number;
|
|
19
|
+
}
|
|
20
|
+
export interface MultiFeedSource<T extends Record<string, unknown>> {
|
|
21
|
+
key: string;
|
|
22
|
+
fetch: (pagination: CursorPaginationState) => Promise<CursorConnection<T>>;
|
|
23
|
+
/** Optional normalizer before merge (e.g. map API node → ClientOrderListRow). */
|
|
24
|
+
mapNode?: (node: T) => T;
|
|
25
|
+
}
|
|
26
|
+
export interface MultiFeedPageResult<T extends Record<string, unknown>> {
|
|
27
|
+
nodes: Array<MergedFeedNode<T>>;
|
|
28
|
+
/** Sum when every feed returned a numeric totalCount; otherwise undefined. */
|
|
29
|
+
totalCount?: number;
|
|
30
|
+
/** True when more items may exist across any feed buffer or cursor. */
|
|
31
|
+
hasMore: boolean;
|
|
32
|
+
feeds: Record<string, {
|
|
33
|
+
pageInfo: CursorPageInfo;
|
|
34
|
+
buffered: number;
|
|
35
|
+
}>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Stateless merge — legacy paginateMulti page-1 equivalent.
|
|
39
|
+
* Parallel responses are merged, sorted, and sliced to `limit`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function mergeConnectionsFirstPage<T extends Record<string, unknown>>(responses: Array<{
|
|
42
|
+
key: string;
|
|
43
|
+
connection: CursorConnection<T>;
|
|
44
|
+
}>, opts: MergeConnectionsOptions<T>): MultiFeedPageResult<T>;
|
|
45
|
+
/** Adapt merge result to ConnectionList / GraphQL connection shape. */
|
|
46
|
+
export declare function toMergedCursorConnection<T extends Record<string, unknown>>(result: MultiFeedPageResult<T>): CursorConnection<MergedFeedNode<T>>;
|
|
47
|
+
/**
|
|
48
|
+
* Maintains per-feed buffers and cursors; fetches the next globally sorted page.
|
|
49
|
+
*/
|
|
50
|
+
export declare class MultiFeedMergePaginator<T extends Record<string, unknown>> {
|
|
51
|
+
private readonly sources;
|
|
52
|
+
private readonly pageSize;
|
|
53
|
+
private readonly sortField;
|
|
54
|
+
private readonly sortDir;
|
|
55
|
+
private buffers;
|
|
56
|
+
private pageIndex;
|
|
57
|
+
constructor(sources: MultiFeedSource<T>[], pageSize: number, sortField: keyof T & string, sortDir?: 'asc' | 'desc');
|
|
58
|
+
reset(): void;
|
|
59
|
+
/** Fetch the next merged page (call reset() before the first page). */
|
|
60
|
+
fetchNextPage(): Promise<MultiFeedPageResult<T>>;
|
|
61
|
+
get currentPageIndex(): number;
|
|
62
|
+
private peekBestHead;
|
|
63
|
+
private refillBuffersWhereNeeded;
|
|
64
|
+
private resolveFetchPagination;
|
|
65
|
+
private fetchMore;
|
|
66
|
+
}
|
|
67
|
+
export declare class TSPaginationMulti {
|
|
68
|
+
static initialPageInfo(): CursorPageInfo;
|
|
69
|
+
/** One CursorPaginationState per feed key (tab mode). */
|
|
70
|
+
static createFeedStates(keys: string[], defaultPageSize?: number): Record<string, CursorPaginationState>;
|
|
71
|
+
static mergeFirstPage: typeof mergeConnectionsFirstPage;
|
|
72
|
+
static toCursorConnection: typeof toMergedCursorConnection;
|
|
73
|
+
static createPaginator<T extends Record<string, unknown>>(sources: MultiFeedSource<T>[], pageSize: number, sortField: keyof T & string, sortDir?: 'asc' | 'desc'): MultiFeedMergePaginator<T>;
|
|
74
|
+
/** Re-export for merged views that share the same pagination bar helpers. */
|
|
75
|
+
static getDisplay: typeof TSPagination.getDisplay;
|
|
76
|
+
static getRangeStartAfterMove: typeof TSPagination.getRangeStartAfterMove;
|
|
77
|
+
}
|