@relax.js/core 1.0.0 → 1.0.2
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/collections/DataLoader.d.ts +51 -0
- package/dist/collections/Pager.d.ts +6 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +4 -4
- package/dist/index.mjs +3 -3
- package/dist/index.mjs.map +4 -4
- package/docs/DataLoader.md +64 -0
- package/docs/Pager.md +59 -0
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# DataLoader
|
|
2
|
+
|
|
3
|
+
An interface for loading paginated, sortable data from any data source. Components like tables use this to fetch data on demand as users navigate pages or change sort order.
|
|
4
|
+
|
|
5
|
+
## Interface
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
interface DataLoader {
|
|
9
|
+
load(options: {
|
|
10
|
+
page: number;
|
|
11
|
+
pageSize: number;
|
|
12
|
+
sort: { column: string; direction: 'asc' | 'desc' }[];
|
|
13
|
+
}): Promise<{ rows: Record<string, any>[]; totalCount: number }>;
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### `load(options)`
|
|
18
|
+
|
|
19
|
+
| Option | Type | Description |
|
|
20
|
+
|-----------|-----------------------------------------------|---------------------------------|
|
|
21
|
+
| `page` | `number` | 1-based page number to load |
|
|
22
|
+
| `pageSize` | `number` | Number of rows per page |
|
|
23
|
+
| `sort` | `{ column: string; direction: 'asc' \| 'desc' }[]` | Sort specifications |
|
|
24
|
+
|
|
25
|
+
**Returns** `Promise<{ rows: Record<string, any>[]; totalCount: number }>`
|
|
26
|
+
|
|
27
|
+
- `rows` - The data for the requested page
|
|
28
|
+
- `totalCount` - Total number of rows across all pages (used for pagination)
|
|
29
|
+
|
|
30
|
+
## Example
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { DataLoader } from '@anthropic-ai/relax.js/core';
|
|
34
|
+
|
|
35
|
+
class UserDataLoader implements DataLoader {
|
|
36
|
+
async load(options) {
|
|
37
|
+
const params = new URLSearchParams({
|
|
38
|
+
page: options.page.toString(),
|
|
39
|
+
pageSize: options.pageSize.toString(),
|
|
40
|
+
sort: JSON.stringify(options.sort),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const response = await fetch(`/api/users?${params}`);
|
|
44
|
+
return response.json();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Using with Pager
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
import { DataLoader, Pager, PageSelectedEvent } from '@anthropic-ai/relax.js/core';
|
|
53
|
+
|
|
54
|
+
const loader: DataLoader = new UserDataLoader();
|
|
55
|
+
const result = await loader.load({ page: 1, pageSize: 25, sort: [] });
|
|
56
|
+
|
|
57
|
+
const pager = new Pager(container, result.totalCount, 25);
|
|
58
|
+
|
|
59
|
+
container.addEventListener('pageselected', async (e: PageSelectedEvent) => {
|
|
60
|
+
const data = await loader.load({ page: e.page, pageSize: 25, sort: [] });
|
|
61
|
+
pager.update(data.totalCount);
|
|
62
|
+
// render data.rows...
|
|
63
|
+
});
|
|
64
|
+
```
|
package/docs/Pager.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Pager
|
|
2
|
+
|
|
3
|
+
Renders pagination buttons (Previous, page numbers, Next) inside a container element and dispatches a `PageSelectedEvent` when the user clicks a page.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { Pager, PageSelectedEvent } from '@anthropic-ai/relax.js/core';
|
|
9
|
+
|
|
10
|
+
const container = document.querySelector('.pager');
|
|
11
|
+
const pager = new Pager(container, totalCount, pageSize);
|
|
12
|
+
|
|
13
|
+
container.addEventListener('pageselected', (e: PageSelectedEvent) => {
|
|
14
|
+
console.log('Selected page:', e.page);
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Constructor
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
new Pager(container: HTMLElement, totalCount: number, pageSize: number)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Parameter | Description |
|
|
25
|
+
|-------------|--------------------------------------|
|
|
26
|
+
| `container` | The element to render buttons into |
|
|
27
|
+
| `totalCount`| Total number of items across all pages |
|
|
28
|
+
| `pageSize` | Number of items per page |
|
|
29
|
+
|
|
30
|
+
## Methods
|
|
31
|
+
|
|
32
|
+
### `update(totalCount: number)`
|
|
33
|
+
|
|
34
|
+
Updates the total count and re-renders the buttons. If the current page exceeds the new page count, it resets to the last page.
|
|
35
|
+
|
|
36
|
+
### `getCurrentPage(): number`
|
|
37
|
+
|
|
38
|
+
Returns the current 1-based page number.
|
|
39
|
+
|
|
40
|
+
## PageSelectedEvent
|
|
41
|
+
|
|
42
|
+
Dispatched on the container element when the user selects a page. Bubbles and is composed.
|
|
43
|
+
|
|
44
|
+
| Property | Type | Description |
|
|
45
|
+
|----------|----------|---------------------------|
|
|
46
|
+
| `page` | `number` | The selected page number |
|
|
47
|
+
|
|
48
|
+
### Listening for page changes
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
container.addEventListener('pageselected', (e: PageSelectedEvent) => {
|
|
52
|
+
const rows = await loader.load({
|
|
53
|
+
page: e.page,
|
|
54
|
+
pageSize: 25,
|
|
55
|
+
sort: [],
|
|
56
|
+
});
|
|
57
|
+
// render rows...
|
|
58
|
+
});
|
|
59
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@relax.js/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Ship faster with less code. Web Component library with routing, forms, DI, templating, and i18n. No virtual DOM, no build magic, no surprise re-renders.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|