tablevu 0.2.22 → 0.3.0-beta-4
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 +24 -113
- package/dist/adapters/array.d.ts +3 -0
- package/dist/adapters/odata.d.ts +4 -0
- package/dist/index.d.ts +6 -0
- package/dist/table.d.ts +174 -0
- package/dist/tablevu.cjs +765 -0
- package/dist/tablevu.esm.js +759 -0
- package/dist/types/adapter.d.ts +15 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/odata.d.ts +27 -0
- package/dist/types/tablevu-column.d.ts +22 -0
- package/dist/types/tablevu-emits.d.ts +4 -0
- package/dist/types/tablevu-footer.d.ts +10 -0
- package/dist/types/tablevu-group.d.ts +6 -0
- package/dist/types/tablevu-page.d.ts +10 -0
- package/dist/types/tablevu-props.d.ts +19 -0
- package/dist/types/tablevu-settings.d.ts +15 -0
- package/dist/types/tablevu-sort.d.ts +5 -0
- package/dist/types/tablevu-spec.d.ts +26 -0
- package/dist/types/tablevu-status.d.ts +6 -0
- package/package.json +26 -26
- package/LICENSE +0 -21
- package/dist/array.js +0 -1
- package/dist/get.js +0 -1
- package/dist/odata.js +0 -1
- package/dist/table.js +0 -1
- package/dist/webapi.js +0 -1
- package/index.js +0 -5
- package/src/array.js +0 -78
- package/src/get.js +0 -28
- package/src/odata.js +0 -179
- package/src/table.js +0 -609
- package/src/webapi.js +0 -33
package/README.md
CHANGED
|
@@ -1,125 +1,36 @@
|
|
|
1
|
-
#
|
|
2
|
-
Simple javasript table for vuejs 3.x (Doesn't work with vuejs 2.x)
|
|
1
|
+
# TableVu TypeScript package
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
This is a standalone TypeScript implementation of the Vue 3 table component. It is intentionally isolated from the legacy JavaScript package at the repository root. Build it from this directory with `npm install` and `npm run build`.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
## Run the browser example locally
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
From the `typescript/` directory, install dependencies and build the local bundle. Then start a static server from the same directory and open the example. This uses the local build and does not publish or install the package elsewhere.
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
* ...
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## Install
|
|
18
|
-
```shell
|
|
19
|
-
npm install tablevu
|
|
9
|
+
```sh
|
|
10
|
+
npm install
|
|
11
|
+
npm run build
|
|
12
|
+
python3 -m http.server 8080
|
|
20
13
|
```
|
|
21
14
|
|
|
15
|
+
Open `http://localhost:8080/example/test-northwind.html`. The browser needs internet access for Vue from the import map and the public Northwind OData service.
|
|
22
16
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* **grouping** : Grouping data specific column or function
|
|
27
|
-
|
|
28
|
-
* **filter** : Reactive filter value
|
|
29
|
-
|
|
30
|
-
* **search** : Reactive search value
|
|
31
|
-
|
|
32
|
-
* **rowid** : Key value for row.
|
|
33
|
-
|
|
34
|
-
* **class** : Table class name. (default "table")
|
|
35
|
-
|
|
36
|
-
* **buttonclass** : Arrow buttons class name (default "btn")
|
|
37
|
-
|
|
38
|
-
* **onRowClick** : Row click event
|
|
39
|
-
|
|
40
|
-
* **onRowDblClick** : Row double click event
|
|
41
|
-
|
|
42
|
-
* **columns**
|
|
43
|
-
* **name** : Column name
|
|
44
|
-
|
|
45
|
-
* **label** : Column label
|
|
46
|
-
|
|
47
|
-
* **searchable** : Column is searchable (default true)
|
|
48
|
-
|
|
49
|
-
* **orderable** : Column is orderable (default true)
|
|
50
|
-
|
|
51
|
-
* **width** : Column width
|
|
52
|
-
|
|
53
|
-
* **align** : Column align
|
|
54
|
-
|
|
55
|
-
* **style** : Column style
|
|
56
|
-
|
|
57
|
-
* **type** : Data type (datetime, date, time, numeric). Show local value
|
|
58
|
-
|
|
59
|
-
* **render** : Render value
|
|
17
|
+
```ts
|
|
18
|
+
import { TableVu, odata, type Filter, type TableVuExpose } from 'tablevu';
|
|
60
19
|
|
|
20
|
+
const filter: Filter = {
|
|
21
|
+
operator: 'and',
|
|
22
|
+
filters: [
|
|
23
|
+
{ field: 'status', operator: 'in', value: ['active', 'pending'] },
|
|
24
|
+
{ field: 'createdAt', operator: 'between', value: [new Date('2025-01-01'), new Date()] },
|
|
25
|
+
{ field: 'deletedAt', operator: 'isNull' },
|
|
26
|
+
{ field: 'Orders', operator: 'any', variable: 'order', filter: { field: 'Freight', operator: 'gt', value: 100 } },
|
|
27
|
+
{ field: 'Orders', operator: 'all', variable: 'order', filter: { field: 'Freight', operator: 'ge', value: 0 } }
|
|
28
|
+
]
|
|
29
|
+
};
|
|
61
30
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
* odata sample (Coming soon..)
|
|
65
|
-
* search sample (Coming soon..)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
**odata sample**
|
|
69
|
-
|
|
70
|
-
```code
|
|
71
|
-
<template>
|
|
72
|
-
<tablevu :data="grid" rowid="OrderId" />
|
|
73
|
-
</template>
|
|
74
|
-
|
|
75
|
-
<script>
|
|
76
|
-
import { tablevu, odata } from 'tablevu'
|
|
77
|
-
|
|
78
|
-
export default {
|
|
79
|
-
name: 'App',
|
|
80
|
-
components: {
|
|
81
|
-
tablevu
|
|
82
|
-
},
|
|
83
|
-
setup() {
|
|
84
|
-
const prm = {
|
|
85
|
-
url: `https://services.odata.org/V3/Northwind/Northwind.svc/Orders?$format=json`,
|
|
86
|
-
header: { 'Content-Type': 'application/json;odata=verbose' },
|
|
87
|
-
select: ['OrderID', 'OrderDate', 'ShipName', 'ShipAddress'],
|
|
88
|
-
expand: [
|
|
89
|
-
]
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const grid = {
|
|
93
|
-
adapter: (grd) => {
|
|
94
|
-
return odata(prm, grd);
|
|
95
|
-
},
|
|
96
|
-
pageSize: 10,
|
|
97
|
-
columns: [
|
|
98
|
-
{ name: 'OrderID', label: 'id', width: '26rem' },
|
|
99
|
-
{ name: 'OrderDate', label: 'name', width: '26rem' },
|
|
100
|
-
{ name: 'ShipName', label: 'name', width: '26rem' },
|
|
101
|
-
{ name: 'ShipAddress', label: 'name', width: '26rem' },
|
|
102
|
-
]
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return { grid }
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
</script>
|
|
31
|
+
const data = odata({ url: 'https://api.example.com/items', count: true, filter });
|
|
109
32
|
```
|
|
110
33
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
- [Vuejs](https://github.com/vuejs/vue) 3.0+
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
## Browser Support
|
|
117
|
-
|
|
118
|
-
Modern browsers.
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
## Authors
|
|
122
|
-
endb
|
|
34
|
+
The component exposes `first()`, `prior()`, `next()`, `last()`, `go(pageNumber)`, `page(pageNumber)`, `refresh()`, `sortBy(columnIndex, direction?)`, `getRows()` and `setRows(rows)` through its Vue template ref. `go` validates and clamps pages when the adapter reports a page count. `page` performs a direct reload even when the requested page is already current.
|
|
123
35
|
|
|
124
|
-
|
|
125
|
-
tablevu is open-sourced software licensed under the [MIT license](http://opensource.org/licenses/MIT).
|
|
36
|
+
Supported filter operators are `eq`, `ne`, `gt`, `ge`, `lt`, `le`, `contains`, `startsWith`, `endsWith`, `in`, `between`, `isNull`, `isNotNull`, `and`, `or`, `not`, `any`, `all`, `countGt`, `countGe`, `countLt`, and `countLe`. `field` accepts dotted paths; `column` is also accepted as an alias. `any` and `all` take a nested `filter` and may specify a `variable` (default `item`).
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AdapterParams, AdapterResult, Filter, ODataOptions } from '../types';
|
|
2
|
+
/** Converts the typed filter tree into an OData `$filter` expression. */
|
|
3
|
+
export declare function buildFilter(filter: Filter | string | null | undefined): string;
|
|
4
|
+
export declare function createODataAdapter(options: ODataOptions): (params?: AdapterParams) => Promise<AdapterResult>;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default as TableVu } from './table';
|
|
2
|
+
export * from './table';
|
|
3
|
+
export * from './types';
|
|
4
|
+
export { createODataAdapter as odata, buildFilter } from './adapters/odata';
|
|
5
|
+
export { default as adaptArray } from './adapters/array';
|
|
6
|
+
export * from './adapters/array';
|
package/dist/table.d.ts
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { TablevuStatus } from './types';
|
|
2
|
+
import type { TablevuSettings, AdapterFunction } from './types';
|
|
3
|
+
export interface TableVuExpose {
|
|
4
|
+
first: () => Promise<void>;
|
|
5
|
+
prior: () => void | Promise<void>;
|
|
6
|
+
next: () => void | Promise<void>;
|
|
7
|
+
last: () => void | Promise<void>;
|
|
8
|
+
go: (pageNumber: number) => void | Promise<void>;
|
|
9
|
+
page: (pageNumber: number) => Promise<void>;
|
|
10
|
+
refresh: () => Promise<void>;
|
|
11
|
+
sortBy: (columnIndex: number, direction?: string) => void | Promise<void>;
|
|
12
|
+
getRows: () => any[];
|
|
13
|
+
setRows: (rows: any[]) => void;
|
|
14
|
+
}
|
|
15
|
+
declare const tablevu: import("vue").DefineComponent<{
|
|
16
|
+
settings?: (TablevuSettings | null) | undefined;
|
|
17
|
+
data?: (any[] | AdapterFunction) | undefined;
|
|
18
|
+
group?: (string | import("./types").TablevuGroup) | undefined;
|
|
19
|
+
search?: string | undefined;
|
|
20
|
+
filter?: any;
|
|
21
|
+
command?: Array<{
|
|
22
|
+
name: "refresh" | "first" | "prior" | "next" | "last" | "go" | string;
|
|
23
|
+
page?: number;
|
|
24
|
+
}> | undefined;
|
|
25
|
+
rowid?: string | undefined;
|
|
26
|
+
onRowClick?: ((event: MouseEvent, row: any) => void) | undefined;
|
|
27
|
+
onRowDblClick?: ((event: MouseEvent, row: any) => void) | undefined;
|
|
28
|
+
class?: string | undefined;
|
|
29
|
+
style?: (string | Record<string, string> | null) | undefined;
|
|
30
|
+
}, {
|
|
31
|
+
renderHeader: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
32
|
+
[key: string]: any;
|
|
33
|
+
}>[];
|
|
34
|
+
renderBody: () => any[];
|
|
35
|
+
renderFooter: () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
36
|
+
[key: string]: any;
|
|
37
|
+
}>[];
|
|
38
|
+
renderCaption: () => string;
|
|
39
|
+
first: () => Promise<void>;
|
|
40
|
+
prior: () => Promise<void> | undefined;
|
|
41
|
+
next: () => Promise<void> | undefined;
|
|
42
|
+
last: () => Promise<void> | undefined;
|
|
43
|
+
go: (pageNumber: number) => Promise<void> | undefined;
|
|
44
|
+
page: (pageNumber: number) => Promise<void>;
|
|
45
|
+
refresh: () => Promise<void>;
|
|
46
|
+
sortBy: (columnIndex: number, direction?: string) => Promise<void>;
|
|
47
|
+
getRows: () => any[];
|
|
48
|
+
setRows: (newRows: any[]) => void;
|
|
49
|
+
state: {
|
|
50
|
+
caption: any;
|
|
51
|
+
group: {
|
|
52
|
+
value: any;
|
|
53
|
+
content: any;
|
|
54
|
+
expandAll: boolean;
|
|
55
|
+
class: string;
|
|
56
|
+
};
|
|
57
|
+
page: {
|
|
58
|
+
count: number;
|
|
59
|
+
size: number;
|
|
60
|
+
current: number;
|
|
61
|
+
type: string | null;
|
|
62
|
+
};
|
|
63
|
+
sort: {
|
|
64
|
+
index?: number | undefined;
|
|
65
|
+
name?: string | undefined;
|
|
66
|
+
dir?: "asc" | "desc" | null | string | undefined;
|
|
67
|
+
}[];
|
|
68
|
+
columns: {
|
|
69
|
+
name: string;
|
|
70
|
+
label?: string | undefined;
|
|
71
|
+
type?: "string" | "number" | "numeric" | "integer" | "date" | "time" | "datetime" | "boolean" | undefined;
|
|
72
|
+
align?: "left" | "center" | "right" | undefined;
|
|
73
|
+
width?: string | undefined;
|
|
74
|
+
style?: Record<string, string> | undefined;
|
|
75
|
+
render?: ((row: any) => any) | undefined;
|
|
76
|
+
colspan?: number | undefined;
|
|
77
|
+
depth?: string[] | undefined;
|
|
78
|
+
header?: {
|
|
79
|
+
colspan?: number | undefined;
|
|
80
|
+
style?: Record<string, string> | undefined;
|
|
81
|
+
align?: string | undefined;
|
|
82
|
+
} | undefined;
|
|
83
|
+
popup?: boolean | undefined;
|
|
84
|
+
filter?: any;
|
|
85
|
+
searchable?: boolean | undefined;
|
|
86
|
+
resizable?: boolean | undefined;
|
|
87
|
+
draggable?: boolean | undefined;
|
|
88
|
+
visible?: boolean | undefined;
|
|
89
|
+
}[];
|
|
90
|
+
footer: {
|
|
91
|
+
button: {
|
|
92
|
+
class: string;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
status: TablevuStatus;
|
|
96
|
+
time: number | null;
|
|
97
|
+
search: string | null;
|
|
98
|
+
filter: any;
|
|
99
|
+
onData?: ((rows: any[]) => any[]) | undefined;
|
|
100
|
+
settings?: {
|
|
101
|
+
group?: {
|
|
102
|
+
value?: string | number | bigint | ((row: any) => any) | undefined;
|
|
103
|
+
content?: string | number | ((row: any) => any) | undefined;
|
|
104
|
+
expandAll?: boolean | undefined;
|
|
105
|
+
class?: string | undefined;
|
|
106
|
+
} | undefined;
|
|
107
|
+
page?: {
|
|
108
|
+
size?: number | undefined;
|
|
109
|
+
type?: "incremental" | "dynamic" | undefined;
|
|
110
|
+
} | undefined;
|
|
111
|
+
sort?: {
|
|
112
|
+
index?: number | undefined;
|
|
113
|
+
name?: string | undefined;
|
|
114
|
+
dir?: "asc" | "desc" | null | string | undefined;
|
|
115
|
+
}[] | undefined;
|
|
116
|
+
columns?: {
|
|
117
|
+
name: string;
|
|
118
|
+
label?: string | undefined;
|
|
119
|
+
type?: "string" | "number" | "numeric" | "integer" | "date" | "time" | "datetime" | "boolean" | undefined;
|
|
120
|
+
align?: "left" | "center" | "right" | undefined;
|
|
121
|
+
width?: string | undefined;
|
|
122
|
+
style?: Record<string, string> | undefined;
|
|
123
|
+
render?: ((row: any) => any) | undefined;
|
|
124
|
+
colspan?: number | undefined;
|
|
125
|
+
depth?: string[] | undefined;
|
|
126
|
+
header?: {
|
|
127
|
+
colspan?: number | undefined;
|
|
128
|
+
style?: Record<string, string> | undefined;
|
|
129
|
+
align?: string | undefined;
|
|
130
|
+
} | undefined;
|
|
131
|
+
popup?: boolean | undefined;
|
|
132
|
+
filter?: any;
|
|
133
|
+
searchable?: boolean | undefined;
|
|
134
|
+
resizable?: boolean | undefined;
|
|
135
|
+
draggable?: boolean | undefined;
|
|
136
|
+
visible?: boolean | undefined;
|
|
137
|
+
}[] | undefined;
|
|
138
|
+
searchMinChar?: number | undefined;
|
|
139
|
+
footer?: {
|
|
140
|
+
button?: {
|
|
141
|
+
class?: string | undefined;
|
|
142
|
+
} | undefined;
|
|
143
|
+
} | undefined;
|
|
144
|
+
onData?: ((rows: any[]) => any[]) | undefined;
|
|
145
|
+
emptyMessage?: string | undefined;
|
|
146
|
+
} | undefined;
|
|
147
|
+
};
|
|
148
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("row-click" | "row-dbl-click")[], "row-click" | "row-dbl-click", import("vue").PublicProps, Readonly<{
|
|
149
|
+
settings?: (TablevuSettings | null) | undefined;
|
|
150
|
+
data?: (any[] | AdapterFunction) | undefined;
|
|
151
|
+
group?: (string | import("./types").TablevuGroup) | undefined;
|
|
152
|
+
search?: string | undefined;
|
|
153
|
+
filter?: any;
|
|
154
|
+
command?: Array<{
|
|
155
|
+
name: "refresh" | "first" | "prior" | "next" | "last" | "go" | string;
|
|
156
|
+
page?: number;
|
|
157
|
+
}> | undefined;
|
|
158
|
+
rowid?: string | undefined;
|
|
159
|
+
onRowClick?: ((event: MouseEvent, row: any) => void) | undefined;
|
|
160
|
+
onRowDblClick?: ((event: MouseEvent, row: any) => void) | undefined;
|
|
161
|
+
class?: string | undefined;
|
|
162
|
+
style?: (string | Record<string, string> | null) | undefined;
|
|
163
|
+
}> & Readonly<{
|
|
164
|
+
"onRow-click"?: ((...args: any[]) => any) | undefined;
|
|
165
|
+
"onRow-dbl-click"?: ((...args: any[]) => any) | undefined;
|
|
166
|
+
}>, {
|
|
167
|
+
readonly settings: TablevuSettings | null;
|
|
168
|
+
readonly command: {
|
|
169
|
+
name: string;
|
|
170
|
+
}[];
|
|
171
|
+
readonly class: string;
|
|
172
|
+
readonly style: string | Record<string, string>;
|
|
173
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
174
|
+
export default tablevu;
|