@antelopejs/interface-dms 0.10.0 → 0.10.1
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 +45 -0
- package/README.md +1 -1
- package/dist/base/table-view/internal/tabs.d.ts +1 -1
- package/dist/base/table-view/internal/tabs.js +3 -3
- package/dist/base/table-view/internal/tabs.js.map +1 -1
- package/dist/base/table-view/routes.d.ts +3 -1
- package/dist/base/table-view/routes.js +32 -28
- package/dist/base/table-view/routes.js.map +1 -1
- package/docs/3.base/4.tables.md +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,54 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.10.1
|
|
4
|
+
|
|
5
|
+
[compare changes](https://github.com/AntelopeJS/dms/compare/interface-v0.10.0...v0.10.1)
|
|
6
|
+
|
|
7
|
+
### 🚀 Enhancements
|
|
8
|
+
|
|
9
|
+
- **dms-layout:** Restore a static GitHub star link in the footer ([#546](https://github.com/AntelopeJS/dms/pull/546))
|
|
10
|
+
- **dms:** Support a read-only public demo ([#581](https://github.com/AntelopeJS/dms/pull/581))
|
|
11
|
+
|
|
12
|
+
### 🩹 Fixes
|
|
13
|
+
|
|
14
|
+
- **store:** Reuse the runtime id of an uninstalled module on reinstall ([#547](https://github.com/AntelopeJS/dms/pull/547))
|
|
15
|
+
- **chart:** Draw the one point per group a series data source answers ([#586](https://github.com/AntelopeJS/dms/pull/586))
|
|
16
|
+
|
|
17
|
+
### 💅 Refactors
|
|
18
|
+
|
|
19
|
+
- **frontend:** Remove type assertions in tests ([#525](https://github.com/AntelopeJS/dms/pull/525))
|
|
20
|
+
- **frontend:** Remove type assertions in core, auth and layout ([#526](https://github.com/AntelopeJS/dms/pull/526))
|
|
21
|
+
- **frontend:** Remove type assertions in ui components and composables ([#527](https://github.com/AntelopeJS/dms/pull/527))
|
|
22
|
+
- **frontend:** Remove type assertions in ui data types ([#528](https://github.com/AntelopeJS/dms/pull/528))
|
|
23
|
+
- **backend:** Remove SAFETY assertions in test fixtures ([#542](https://github.com/AntelopeJS/dms/pull/542))
|
|
24
|
+
- **backend:** Remove SAFETY assertions in serialized-option and fixture tests ([#543](https://github.com/AntelopeJS/dms/pull/543))
|
|
25
|
+
- **agents:** Fix the lint findings in dms's own agent files ([#548](https://github.com/AntelopeJS/dms/pull/548))
|
|
26
|
+
|
|
27
|
+
### 📖 Documentation
|
|
28
|
+
|
|
29
|
+
- **readme:** Rewrite the README as a landing page ([#554](https://github.com/AntelopeJS/dms/pull/554))
|
|
30
|
+
|
|
31
|
+
### 🏡 Chore
|
|
32
|
+
|
|
33
|
+
- **release:** @antelopejs/dms v0.12.0 ([fdfcc0ad](https://github.com/AntelopeJS/dms/commit/fdfcc0ad))
|
|
34
|
+
- **package:** Update the npm description and keywords ([#580](https://github.com/AntelopeJS/dms/pull/580))
|
|
35
|
+
- **package:** Restore realtime in the npm description ([#588](https://github.com/AntelopeJS/dms/pull/588))
|
|
36
|
+
|
|
37
|
+
### ❤️ Contributors
|
|
38
|
+
|
|
39
|
+
- Antony Rizzitelli ([@Upd4ting](http://github.com/Upd4ting))
|
|
40
|
+
|
|
3
41
|
## v0.10.0
|
|
4
42
|
|
|
5
43
|
[compare changes](https://github.com/AntelopeJS/dms/compare/interface-v0.9.1...v0.10.0)
|
|
6
44
|
|
|
45
|
+
### Upgrade notes
|
|
46
|
+
|
|
47
|
+
- 16 new modules (11 public, 5 `@internal`) hold the types that pages, components and tables share: `component-options/*` (`action-target`, `button`, `confirm-dialog`, `row-action`, `form-field`, `data-type`, `page-layout`, and their `internal/` counterparts), `tones`, `watch-actions`, `export-status` and `invite-extension-payloads` ([#539](https://github.com/AntelopeJS/dms/pull/539)). Every old subpath still exports the same names, re-exported from the new module, so no import changes.
|
|
48
|
+
- Do not augment `WatchFunctionParamMap` through `watch-actions`: keep augmenting it through `base/types`, as before.
|
|
49
|
+
- Two type-only layer exceptions remain (`component.ts` to `page.ts`, and the `User` table to the default data types). They are removed in the next breaking release ([#531](https://github.com/AntelopeJS/dms/issues/531)).
|
|
50
|
+
- Modules implementing interface-dms move to `>=0.10.0 <0.11.0`; `@antelopejs/dms` implements it.
|
|
51
|
+
|
|
7
52
|
### 🚀 Enhancements
|
|
8
53
|
|
|
9
54
|
- **interface-dms:** Expose stable default data type subpaths ([#475](https://github.com/AntelopeJS/dms/pull/475))
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
<a href="https://www.npmjs.com/package/@antelopejs/interface-dms"><img alt="npm" src="https://img.shields.io/npm/v/@antelopejs/interface-dms?style=for-the-badge&labelColor=000000&color=000000"></a>
|
|
6
6
|
<a href="./LICENSE"><img alt="License" src="https://img.shields.io/npm/l/@antelopejs/interface-dms?style=for-the-badge&labelColor=000000&color=000000"></a>
|
|
7
|
-
<a href="https://discord.gg/
|
|
7
|
+
<a href="https://discord.gg/g4pFt6eXqu"><img alt="Discord" src="https://img.shields.io/badge/Discord-18181B?logo=discord&style=for-the-badge&color=000000"></a>
|
|
8
8
|
<a href="https://dms.antelopejs.com/docs/interfaces"><img alt="Documentation" src="https://img.shields.io/badge/Docs-18181B?style=for-the-badge&color=000000"></a>
|
|
9
9
|
|
|
10
10
|
The public contracts of the AntelopeJS DMS: pages and components, permissions and tenancy, authentication, notifications and HTML rendering.
|
|
@@ -30,7 +30,7 @@ export declare function declaresCounters(options: Pick<TableViewOptions, "tabs"
|
|
|
30
30
|
export declare function servesRoute(endpoints: Record<string, DataControllerCallbackWithOptions>, path: string, method: string): boolean;
|
|
31
31
|
/**
|
|
32
32
|
* Warn, once per controller, when a table view declares filter tabs, counted
|
|
33
|
-
* views or counted groups but its controller mounts no `
|
|
33
|
+
* views or counted groups but its controller mounts no `GET count/batch`
|
|
34
34
|
* route: every counter request would fail. The fix belongs in the controller
|
|
35
35
|
* (mount `countBatch: TableViewRoutes.CountBatch`), so this only reports it.
|
|
36
36
|
*
|
|
@@ -86,7 +86,7 @@ function declaresCounters(options) {
|
|
|
86
86
|
!!options.grouped?.count);
|
|
87
87
|
}
|
|
88
88
|
const COUNT_BATCH_PATH = "count/batch";
|
|
89
|
-
const COUNT_BATCH_METHOD = "
|
|
89
|
+
const COUNT_BATCH_METHOD = "get";
|
|
90
90
|
const EDGE_SLASHES = /^\/+|\/+$/g;
|
|
91
91
|
const controllersWarnedForTabCounts = new WeakSet();
|
|
92
92
|
/** @internal */
|
|
@@ -96,7 +96,7 @@ function servesRoute(endpoints, path, method) {
|
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
98
98
|
* Warn, once per controller, when a table view declares filter tabs, counted
|
|
99
|
-
* views or counted groups but its controller mounts no `
|
|
99
|
+
* views or counted groups but its controller mounts no `GET count/batch`
|
|
100
100
|
* route: every counter request would fail. The fix belongs in the controller
|
|
101
101
|
* (mount `countBatch: TableViewRoutes.CountBatch`), so this only reports it.
|
|
102
102
|
*
|
|
@@ -108,6 +108,6 @@ function warnIfTabsLackCountBatch(controller, location, hasCounters, endpoints)
|
|
|
108
108
|
if (servesRoute(endpoints, COUNT_BATCH_PATH, COUNT_BATCH_METHOD))
|
|
109
109
|
return;
|
|
110
110
|
controllersWarnedForTabCounts.add(controller);
|
|
111
|
-
logging_1.Logging.Warn(`[DMS] TableView on "${controller.name}" (${location}) declares filter tabs, counted views or counted groups but its controller mounts no
|
|
111
|
+
logging_1.Logging.Warn(`[DMS] TableView on "${controller.name}" (${location}) declares filter tabs, counted views or counted groups but its controller mounts no GET ${location}/${COUNT_BATCH_PATH} route: their counters will fail. Mount \`countBatch: TableViewRoutes.CountBatch\` on the controller.`);
|
|
112
112
|
}
|
|
113
113
|
//# sourceMappingURL=tabs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../../src/base/table-view/internal/tabs.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../../../src/base/table-view/internal/tabs.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,9 @@ export declare namespace TableViewRoutes {
|
|
|
10
10
|
*/
|
|
11
11
|
const Count: DataControllerCallback;
|
|
12
12
|
/**
|
|
13
|
-
* `
|
|
13
|
+
* `GET <location>/count/batch`: one count per repeated `query` value,
|
|
14
|
+
* encoded as an escaped id, `?`, and its list query string. Accepts up to
|
|
15
|
+
* 50 entries and 8,192 UTF-8 bytes in the encoded path plus search.
|
|
14
16
|
* Filter tabs with counters require the controller to mount
|
|
15
17
|
* `countBatch: TableViewRoutes.CountBatch`; a table view declaring `tabs`
|
|
16
18
|
* without it gets failing counters and a registration warning.
|
|
@@ -17,30 +17,34 @@ const realtime_1 = require("./internal/realtime");
|
|
|
17
17
|
const meta_1 = require("./meta");
|
|
18
18
|
const row_rules_1 = require("./internal/row-rules");
|
|
19
19
|
const MAX_BATCH_COUNT_QUERIES = 50;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
for (const query of queries) {
|
|
28
|
-
(0, interface_api_util_1.assert)(
|
|
29
|
-
// oxlint-disable-next-line anti-slop/no-runtime-typeof -- The count-batch parser checks each request entry's id representation; a stronger schema would reject inputs currently accepted by this published route.
|
|
30
|
-
query && typeof query.id === "string" && query.query, 400, "Invalid count batch query.");
|
|
20
|
+
const MAX_BATCH_COUNT_TARGET_BYTES = 8_192;
|
|
21
|
+
const HTTP_BAD_REQUEST = 400;
|
|
22
|
+
const HTTP_URI_TOO_LONG = 414;
|
|
23
|
+
const COUNT_QUERY_SEPARATOR = "?";
|
|
24
|
+
function decodeCountId(id) {
|
|
25
|
+
try {
|
|
26
|
+
return decodeURIComponent(id);
|
|
31
27
|
}
|
|
32
|
-
|
|
28
|
+
catch {
|
|
29
|
+
(0, interface_api_util_1.assert)(false, HTTP_BAD_REQUEST, "Invalid count batch query.");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function parseBatchCountQueries(ctx, values) {
|
|
33
|
+
(0, interface_api_util_1.assert)(Buffer.byteLength(ctx.url.pathname + ctx.url.search, "utf8") <=
|
|
34
|
+
MAX_BATCH_COUNT_TARGET_BYTES, HTTP_URI_TOO_LONG, "Count batch URI too long.");
|
|
35
|
+
(0, interface_api_util_1.assert)(values.length <= MAX_BATCH_COUNT_QUERIES, HTTP_BAD_REQUEST, "Too many count batch queries.");
|
|
36
|
+
return values.map((value) => {
|
|
37
|
+
const separator = value.indexOf(COUNT_QUERY_SEPARATOR);
|
|
38
|
+
(0, interface_api_util_1.assert)(separator >= 0, HTTP_BAD_REQUEST, "Invalid count batch query.");
|
|
39
|
+
return {
|
|
40
|
+
id: decodeCountId(value.slice(0, separator)),
|
|
41
|
+
query: new URLSearchParams(value.slice(separator + 1)),
|
|
42
|
+
};
|
|
43
|
+
});
|
|
33
44
|
}
|
|
34
45
|
function buildBatchCountContext(ctx, query) {
|
|
35
46
|
const url = new URL(ctx.url);
|
|
36
|
-
url.search =
|
|
37
|
-
for (const [key, value] of Object.entries(query)) {
|
|
38
|
-
if (value === undefined)
|
|
39
|
-
continue;
|
|
40
|
-
for (const item of Array.isArray(value) ? value : [value]) {
|
|
41
|
-
url.searchParams.append(key, String(item));
|
|
42
|
-
}
|
|
43
|
-
}
|
|
47
|
+
url.search = query.toString();
|
|
44
48
|
return { ...ctx, url };
|
|
45
49
|
}
|
|
46
50
|
const createBulkOperationRoute = (operationFunc) => ({
|
|
@@ -100,13 +104,11 @@ function createSummaryRoute(actionId) {
|
|
|
100
104
|
}
|
|
101
105
|
function createBatchCountRoute(actionId) {
|
|
102
106
|
return {
|
|
103
|
-
func: async function (ctx,
|
|
104
|
-
|
|
105
|
-
body, user) {
|
|
106
|
-
const parsed = parseBatchCountBody(body);
|
|
107
|
+
func: async function (ctx, values, user) {
|
|
108
|
+
const queries = parseBatchCountQueries(ctx, values);
|
|
107
109
|
const permissions = await (0, auth_2.authorizeAction)(this, actionId, user, (0, request_tenant_1.getRequestTenantId)(ctx));
|
|
108
110
|
const meta = (0, interface_data_api_1.GetDataControllerMeta)(this);
|
|
109
|
-
const entries = await Promise.all(
|
|
111
|
+
const entries = await Promise.all(queries.map(async ({ id, query }) => {
|
|
110
112
|
const queryContext = buildBatchCountContext(ctx, query);
|
|
111
113
|
const listParams = {
|
|
112
114
|
filters: components_1.Parameters.ExtractFilters(queryContext, meta),
|
|
@@ -116,8 +118,8 @@ function createBatchCountRoute(actionId) {
|
|
|
116
118
|
}));
|
|
117
119
|
return Object.fromEntries(entries);
|
|
118
120
|
},
|
|
119
|
-
args: [(0, interface_api_1.Context)(), (0, interface_api_1.
|
|
120
|
-
method: "
|
|
121
|
+
args: [(0, interface_api_1.Context)(), (0, interface_api_1.MultiParameter)("query", "query"), (0, auth_1.AuthUser)()],
|
|
122
|
+
method: "get",
|
|
121
123
|
};
|
|
122
124
|
}
|
|
123
125
|
function createEditRoute(baseRoute) {
|
|
@@ -136,7 +138,9 @@ var TableViewRoutes;
|
|
|
136
138
|
*/
|
|
137
139
|
TableViewRoutes.Count = createCountRoute(auth_2.LIST_ACTION);
|
|
138
140
|
/**
|
|
139
|
-
* `
|
|
141
|
+
* `GET <location>/count/batch`: one count per repeated `query` value,
|
|
142
|
+
* encoded as an escaped id, `?`, and its list query string. Accepts up to
|
|
143
|
+
* 50 entries and 8,192 UTF-8 bytes in the encoded path plus search.
|
|
140
144
|
* Filter tabs with counters require the controller to mount
|
|
141
145
|
* `countBatch: TableViewRoutes.CountBatch`; a table view declaring `tabs`
|
|
142
146
|
* without it gets failing counters and a registration warning.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/base/table-view/routes.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/base/table-view/routes.ts"],"names":[],"mappings":"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"}
|
package/docs/3.base/4.tables.md
CHANGED
|
@@ -104,7 +104,7 @@ export class roleDataAPI extends DataController(
|
|
|
104
104
|
| `List` | Paginated list with search, filters and sorting. |
|
|
105
105
|
| `Select` | List with the `select` pluck mode, used by relation pickers. `?ids=a&ids=b` (with `idKey` when the value is another field) answers those rows alone, as `List` does: a picker and a filter chip name the ids they hold this way. |
|
|
106
106
|
| `Count` | Row count for the current query. |
|
|
107
|
-
| `CountBatch` | One count per query
|
|
107
|
+
| `CountBatch` | One count per repeated `query` value in `GET /count/batch` (tab, view and group counters). Each value is `encodeURIComponent(id) + "?" + listQueryString`, with repeated filters preserved. Requests accept up to 50 entries and 8,192 UTF-8 bytes in the encoded path plus search; the client packs larger batches into bounded GET requests. |
|
|
108
108
|
| `Summary` | `GET /summary?ids=…`: the footer summaries a table view declared, over every row the request's filters list. |
|
|
109
109
|
| `New` | Create a row. |
|
|
110
110
|
| `Edit` | Update a row. |
|
package/package.json
CHANGED