@jskit-ai/agent-docs 0.1.54 → 0.1.56
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/guide/agent/generators/advanced-cruds.md +168 -1
- package/package.json +1 -1
- package/patterns/INDEX.md +1 -1
- package/patterns/client-requests.md +11 -0
- package/patterns/crud-scaffolding.md +3 -1
- package/patterns/generated-ui-contract-tracking.md +5 -1
- package/reference/autogen/packages/users-web.md +37 -2
|
@@ -454,7 +454,9 @@ This is the list-page container.
|
|
|
454
454
|
Its job is usually to:
|
|
455
455
|
|
|
456
456
|
- call `useCrudListScreen()`
|
|
457
|
-
- pass page-local `listFilters` and `
|
|
457
|
+
- pass page-local `listFilters`, `listBulkActions`, and `listRowActions` when needed
|
|
458
|
+
- pass `syntheticRows` when the page needs non-CRUD display rows such as an owner/master row
|
|
459
|
+
- pass read options such as `requestQueryParams` and `readEnabled` when the list read needs them
|
|
458
460
|
- render the shared `CrudListScreen`
|
|
459
461
|
- resolve list/view/edit/new URLs
|
|
460
462
|
- pass route query state through when navigating deeper
|
|
@@ -470,6 +472,8 @@ Its job is usually to:
|
|
|
470
472
|
- call `useCrudViewScreen()`
|
|
471
473
|
- render the shared `CrudViewScreen`
|
|
472
474
|
- resolve "back" and "edit" navigation
|
|
475
|
+
- pass read options such as `requestQueryParams`, `readEnabled`, and `queryKeyFactory` when the detail read needs them
|
|
476
|
+
- use the shared view slots for page-specific sections around the generated field list
|
|
473
477
|
|
|
474
478
|
Again, the runtime behavior is mostly uphill. The page is a route-level composition layer.
|
|
475
479
|
|
|
@@ -822,6 +826,8 @@ Use this rule of thumb when deciding where to edit:
|
|
|
822
826
|
| Change SQL, joins, parent filters, or advanced search | `repository.js` | This is the data-access layer |
|
|
823
827
|
| Add cross-record or domain rules on save/delete | `service.js` | This is business logic |
|
|
824
828
|
| Change shared CRUD screen chrome, load states, or retry behavior | `users-web` shared screen components | Generated pages consume the shared screen contract |
|
|
829
|
+
| Add per-row commands to a generated list page | page-local `listRowActions.js`, usually calling `useCommand()`-backed composables | The shared list screen renders action chrome; the page owns explicit mutation behavior |
|
|
830
|
+
| Add non-CRUD display rows to a generated list page | route page `syntheticRows` input | Synthetic rows are presentation rows, not repository records |
|
|
825
831
|
| Change page-specific display behavior | the route pages, generated slots, and app-owned composables | This is presentation |
|
|
826
832
|
| Change form field layout and inputs | `_components/CrudAddEditForm.vue` and `CrudAddEditFormFields.js` | This is the generated form field layer |
|
|
827
833
|
|
|
@@ -832,6 +838,7 @@ The baseline generator output is only the start. As the tutorial's `contacts`, `
|
|
|
832
838
|
- `src/server/listQueryValidators.js` when a list needs extra query filters beyond `q`
|
|
833
839
|
- `src/server/service.test.js` once save/delete rules stop being trivial
|
|
834
840
|
- `packages/contacts/src/shared/contactListFilters.js` when the contacts CRUD gains structured list filters that both server and client should share
|
|
841
|
+
- `src/pages/.../contacts/listRowActions.js` when a generated list needs row-level commands such as Delete, Block, or Unblock
|
|
835
842
|
- `src/composables/addresses/useAddressDisplay.js` when addresses need app-specific display formatting
|
|
836
843
|
- `src/composables/comments/useCommentsListRuntime.js` when an embedded comments list needs local UI state
|
|
837
844
|
|
|
@@ -840,6 +847,81 @@ That is the right direction of growth:
|
|
|
840
847
|
- server customizations stay in the CRUD package
|
|
841
848
|
- presentation and page-specific UI state stay in app-owned client files
|
|
842
849
|
- shared structured list filters live best in a CRUD-package shared module that both server and client can import
|
|
850
|
+
- shared generated screen chrome stays in `users-web`; adapted pages feed it definitions, slots, and explicit command handlers
|
|
851
|
+
|
|
852
|
+
### Shared screen read options and detail slots
|
|
853
|
+
|
|
854
|
+
Use the shared list and detail screens first, even when a page needs includes, permission gating, or domain sections.
|
|
855
|
+
|
|
856
|
+
`useCrudListScreen(...)` accepts the common list read-pass-through options that adapted list pages usually need:
|
|
857
|
+
|
|
858
|
+
- `requestQueryParams`
|
|
859
|
+
- `readEnabled`
|
|
860
|
+
|
|
861
|
+
For example, a permission-gated list can stay on the shared list screen:
|
|
862
|
+
|
|
863
|
+
```js
|
|
864
|
+
const canReadProjectAccess = computed(() =>
|
|
865
|
+
access.value?.canManageProjectAccess === true
|
|
866
|
+
);
|
|
867
|
+
|
|
868
|
+
const screen = useCrudListScreen({
|
|
869
|
+
resource: projectAccessResource,
|
|
870
|
+
apiSuffix: "/project-access",
|
|
871
|
+
readEnabled: canReadProjectAccess,
|
|
872
|
+
requestQueryParams() {
|
|
873
|
+
return {
|
|
874
|
+
include: "userId,roleId"
|
|
875
|
+
};
|
|
876
|
+
}
|
|
877
|
+
});
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
`readEnabled` gates the underlying Query-backed read. The screen still owns load, empty, error, retry, filters, row actions, and responsive list chrome. The page owns only the permission condition.
|
|
881
|
+
|
|
882
|
+
`useCrudViewScreen(...)` accepts the same read-pass-through options that adapted detail pages usually need:
|
|
883
|
+
|
|
884
|
+
- `requestQueryParams`
|
|
885
|
+
- `readEnabled`
|
|
886
|
+
- `queryKeyFactory`
|
|
887
|
+
|
|
888
|
+
For example:
|
|
889
|
+
|
|
890
|
+
```js
|
|
891
|
+
const screen = useCrudViewScreen({
|
|
892
|
+
resource: drumResource,
|
|
893
|
+
apiUrlTemplate: "/drums/:recordId",
|
|
894
|
+
requestQueryParams() {
|
|
895
|
+
return {
|
|
896
|
+
include: "drumSpecId,locationId,contents,contents.processingLotId"
|
|
897
|
+
};
|
|
898
|
+
}
|
|
899
|
+
});
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
Render domain sections through `CrudViewScreen` slots instead of replacing the shared load/error/retry chrome:
|
|
903
|
+
|
|
904
|
+
```vue
|
|
905
|
+
<CrudViewScreen :screen="screen" resource-singular-title="Drum">
|
|
906
|
+
<template #before-fields="{ view }">
|
|
907
|
+
<DrumArrivalSummary :drum="view.record" />
|
|
908
|
+
</template>
|
|
909
|
+
|
|
910
|
+
<template #fields="{ view }">
|
|
911
|
+
<GeneratedDrumFields :record="view.record" />
|
|
912
|
+
</template>
|
|
913
|
+
|
|
914
|
+
<template #after-fields="{ view }">
|
|
915
|
+
<DrumProvenancePanel :drum="view.record" />
|
|
916
|
+
</template>
|
|
917
|
+
|
|
918
|
+
<template #supporting-content="{ view }">
|
|
919
|
+
<DrumContentsPanel :drum="view.record" />
|
|
920
|
+
</template>
|
|
921
|
+
</CrudViewScreen>
|
|
922
|
+
```
|
|
923
|
+
|
|
924
|
+
The screen still owns loading, not-found, retry, title, back/edit actions, and responsive shell structure. The page owns only the domain panels.
|
|
843
925
|
|
|
844
926
|
## Search and filters: the deep dive
|
|
845
927
|
|
|
@@ -1146,11 +1228,96 @@ The generated runtime passes action handlers:
|
|
|
1146
1228
|
|
|
1147
1229
|
Keep bulk action definitions page-local unless another page needs to share them.
|
|
1148
1230
|
|
|
1231
|
+
### Pattern 3C: row actions and synthetic display rows
|
|
1232
|
+
|
|
1233
|
+
Generated CRUD list pages can keep the shared list screen while adding per-row actions and non-CRUD display rows.
|
|
1234
|
+
|
|
1235
|
+
Use row actions for explicit commands on one record. JSKIT renders the action menu in card and table layouts, tracks per-row execution state, and passes the handler enough context to run app-owned commands. It does not invent or auto-replay writes.
|
|
1236
|
+
|
|
1237
|
+
For example:
|
|
1238
|
+
|
|
1239
|
+
```js
|
|
1240
|
+
import { defineCrudListRowActions } from "@jskit-ai/users-web/client/rowActions";
|
|
1241
|
+
|
|
1242
|
+
const listRowActions = defineCrudListRowActions([
|
|
1243
|
+
{
|
|
1244
|
+
key: "delete",
|
|
1245
|
+
label: "Delete",
|
|
1246
|
+
color: "error",
|
|
1247
|
+
visible: ({ record }) => record.isOwnerRow !== true,
|
|
1248
|
+
disabled: ({ record }) => record.isOwnerRow === true,
|
|
1249
|
+
loading: ({ record }) => deleteCommand.isRunningFor(record.id),
|
|
1250
|
+
async run({ record, reload }) {
|
|
1251
|
+
await deleteCommand.runFor(record);
|
|
1252
|
+
await reload();
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
]);
|
|
1256
|
+
|
|
1257
|
+
export { listRowActions };
|
|
1258
|
+
```
|
|
1259
|
+
|
|
1260
|
+
Pass the actions into the generated list screen:
|
|
1261
|
+
|
|
1262
|
+
```js
|
|
1263
|
+
import { listRowActions } from "./listRowActions.js";
|
|
1264
|
+
|
|
1265
|
+
const screen = useCrudListScreen({
|
|
1266
|
+
resource: uiResource,
|
|
1267
|
+
apiSuffix: "/allowed-login-emails",
|
|
1268
|
+
listRowActions
|
|
1269
|
+
});
|
|
1270
|
+
```
|
|
1271
|
+
|
|
1272
|
+
The row-action handler receives:
|
|
1273
|
+
|
|
1274
|
+
- `action`
|
|
1275
|
+
- `record`
|
|
1276
|
+
- `index`
|
|
1277
|
+
- `recordId`
|
|
1278
|
+
- `records`
|
|
1279
|
+
- `reload`
|
|
1280
|
+
|
|
1281
|
+
Use `syntheticRows` when the page needs display rows that do not come from the CRUD list response, such as an owner row at the top of an allowlist. An array is prepended by default. Use `{ prepend, append }` when placement matters.
|
|
1282
|
+
|
|
1283
|
+
```js
|
|
1284
|
+
const ownerRows = computed(() => owner.value
|
|
1285
|
+
? [
|
|
1286
|
+
{
|
|
1287
|
+
key: "owner",
|
|
1288
|
+
record: {
|
|
1289
|
+
id: owner.value.id,
|
|
1290
|
+
email: owner.value.email,
|
|
1291
|
+
role: "Owner",
|
|
1292
|
+
isOwnerRow: true
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
]
|
|
1296
|
+
: []);
|
|
1297
|
+
|
|
1298
|
+
const screen = useCrudListScreen({
|
|
1299
|
+
resource: uiResource,
|
|
1300
|
+
apiSuffix: "/allowed-login-emails",
|
|
1301
|
+
listRowActions,
|
|
1302
|
+
syntheticRows: ownerRows
|
|
1303
|
+
});
|
|
1304
|
+
```
|
|
1305
|
+
|
|
1306
|
+
Synthetic rows:
|
|
1307
|
+
|
|
1308
|
+
- render in the same card/table layouts as real rows
|
|
1309
|
+
- do not get standard Open/Edit CRUD navigation
|
|
1310
|
+
- are excluded from bulk selection by default
|
|
1311
|
+
- can still participate in row-action visibility/disabled logic
|
|
1312
|
+
|
|
1313
|
+
Use this seam for display rows only. If a row should be persisted, it should come from the CRUD list response.
|
|
1314
|
+
|
|
1149
1315
|
#### Exact file checklist
|
|
1150
1316
|
|
|
1151
1317
|
For a generated CRUD, treat this as the concrete file plan:
|
|
1152
1318
|
|
|
1153
1319
|
- edit `src/pages/.../contacts/listFilters.js`
|
|
1320
|
+
- create `src/pages/.../contacts/listRowActions.js` when the list needs row-level commands
|
|
1154
1321
|
- make sure the matching server route/action/repository code accepts and applies the declared query params when filters are server-backed
|
|
1155
1322
|
|
|
1156
1323
|
If the filter contract should be shared with server code, promote it into a CRUD package module and import it from both sides:
|
package/package.json
CHANGED
package/patterns/INDEX.md
CHANGED
|
@@ -30,7 +30,7 @@ How to use it:
|
|
|
30
30
|
- `client-requests.md`
|
|
31
31
|
- playwright, browser test, e2e, ui verification, authenticated ui test, test auth, dev login as, dev auth bypass
|
|
32
32
|
- `ui-testing.md`
|
|
33
|
-
- generated UI contract, design contract, navigation roles, density, placeholder copy, card shells, shared CRUD screens
|
|
33
|
+
- generated UI contract, design contract, navigation roles, density, placeholder copy, card shells, shared CRUD screens, row actions, synthetic rows, detail slots
|
|
34
34
|
- `generated-ui-contract-tracking.md`
|
|
35
35
|
- filter, filters, search facets, chips, date range, enum filter, lookup filter, `useCrudListFilters`, `createCrudListFilters`
|
|
36
36
|
- `filters.md`
|
|
@@ -44,6 +44,16 @@ Use the shared CRUD screen wrappers when the route is a generated CRUD page:
|
|
|
44
44
|
- `useCrudViewScreen()` plus `CrudViewScreen` for record view route pages
|
|
45
45
|
- `useCrudAddEditScreen()` plus `CrudAddEditScreen` for generated new/edit route pages
|
|
46
46
|
|
|
47
|
+
Generated screen wrapper extension rules:
|
|
48
|
+
|
|
49
|
+
- Use `useCrudListScreen({ readEnabled })` for permission-gated generated list reads instead of splitting the page or replacing the shared list screen.
|
|
50
|
+
- Use `useCrudListScreen({ requestQueryParams })` for list includes or other endpoint query params instead of putting query strings in `apiSuffix`.
|
|
51
|
+
- Use `useCrudViewScreen({ requestQueryParams })` for detail includes instead of putting query strings in `apiUrlTemplate`.
|
|
52
|
+
- Use `readEnabled` and `queryKeyFactory` on `useCrudViewScreen()` when the detail read needs the same gating or cache identity control as `useCrudView()`.
|
|
53
|
+
- Use `CrudViewScreen` slots (`before-fields`, `fields`, `after-fields`, `supporting-content`) for page-specific domain sections while keeping shared load/error/retry chrome.
|
|
54
|
+
- Use `listRowActions` with `defineCrudListRowActions(...)` for row-level commands in `CrudListScreen`.
|
|
55
|
+
- Use `syntheticRows` for display-only rows that do not come from the CRUD response, such as owner/master rows.
|
|
56
|
+
|
|
47
57
|
Use the CRUD wrappers when they fit:
|
|
48
58
|
|
|
49
59
|
- `useCrudList()` for routed CRUD lists
|
|
@@ -86,5 +96,6 @@ Avoid:
|
|
|
86
96
|
- manually concatenating scoped route params into API URLs
|
|
87
97
|
- using a lower-level seam when a higher-level routed CRUD or command runtime already fits
|
|
88
98
|
- smuggling query params into `apiUrlTemplate`
|
|
99
|
+
- replacing `CrudListScreen` or `CrudViewScreen` only to add read gating, row actions, synthetic display rows, includes, or domain detail sections
|
|
89
100
|
- reporting routine resource load errors through hand-written global snackbar/banner calls
|
|
90
101
|
- calling `useShellRequestRecoveryRuntime().report(...)` from normal panels just to recover an HTTP read
|
|
@@ -28,8 +28,10 @@ Rules:
|
|
|
28
28
|
- Generated CRUD UI must be compact-first. Lists need searchable cards on compact widths and tables only for medium/expanded layouts.
|
|
29
29
|
- Generated CRUD list screens need real loading, empty, and error states. Empty copy should name the resource, such as "No customers yet", and offer the create action when available.
|
|
30
30
|
- Generated CRUD view/new/edit screens should use page headers plus direct sheet panels. Do not use generic card shells as the page architecture.
|
|
31
|
+
- Permission-gated generated CRUD lists should pass `readEnabled` into `useCrudListScreen(...)` instead of replacing the shared list wrapper.
|
|
31
32
|
- Compact CRUD actions should be reachable without a drawer. Use a mobile-visible primary action or FAB for create flows.
|
|
32
|
-
- Row actions should
|
|
33
|
+
- Row actions should be declared with `defineCrudListRowActions(...)` in a page-local `listRowActions.js` and passed into `useCrudListScreen(...)`; the shared list screen owns the compact/wide action rendering.
|
|
34
|
+
- Use `syntheticRows` for display-only owner/master rows that should appear inside the shared list layout without becoming CRUD records.
|
|
33
35
|
- Bulk actions should be declared in the generated page-local `listBulkActions.js`. The generated list owns selection state, keeps selection controls hidden until actions exist, and exposes selected ids/records to action handlers.
|
|
34
36
|
- Structured filters should use shared filter definitions and collapse to compact filter controls/sheets when they outgrow simple search. Do not stack dense desktop filter bars on phone widths.
|
|
35
37
|
- Use `--navigation-role` for CRUD list placement intent. Main resources can stay `primary`; nested/detail/workflow CRUD routes should usually be `secondary`, `workflow`, or `none`.
|
|
@@ -57,6 +57,10 @@ Generated JSKIT apps should feel like real adaptive apps by default, not framewo
|
|
|
57
57
|
- Item 6 is complete for the default shell: compact app bars use compact density and bounded top-left/top-right regions, while primary navigation remains in semantic bottom navigation instead of app-bar chrome.
|
|
58
58
|
- CRUD filters are client-side by default: generated list pages create a page-local `listFilters.js` and pass it into `useCrudListScreen(...)`; the shared list screen wires `filterRuntime.queryParams` into the list request and renders `CrudListFilterSurface`. When server filtering is needed, promote the definitions into a shared package module and use `createCrudListFilterContract(...)` so route/action validators, JSON REST search schema, and repository query normalization stay derived from the same definition.
|
|
59
59
|
- CRUD bulk actions are client-side by default: generated list pages create a page-local `listBulkActions.js` and pass it into `useCrudListScreen(...)`; the shared list screen wires `useCrudListBulkActions(...)` and keeps selection controls hidden until actions are declared.
|
|
60
|
-
-
|
|
60
|
+
- CRUD row actions are client-side by default: generated list pages can create a page-local `listRowActions.js` with `defineCrudListRowActions(...)` and pass it into `useCrudListScreen(...)`; the shared list screen renders per-row actions in card and table layouts while action handlers stay explicit and page-owned.
|
|
61
|
+
- CRUD synthetic rows are display-only: pass `syntheticRows` into `useCrudListScreen(...)` for owner/master rows that are not repository records. Synthetic rows render through the shared list screen, skip standard Open/Edit links, and are excluded from bulk selection unless explicitly marked selectable.
|
|
62
|
+
- Generated CRUD page templates delegate their screen chrome to shared `users-web` screen components (`CrudListScreen`, `CrudViewScreen`, and `CrudAddEditScreen`) so list/view/form load states, retry actions, responsive shell layout, filters, bulk actions, row actions, and detail slots do not drift across generated pages.
|
|
63
|
+
- Generated CRUD list pages should use `useCrudListScreen({ requestQueryParams, readEnabled })` for list read pass-throughs instead of replacing the shared list chrome for includes or permission-gated reads.
|
|
64
|
+
- Generated CRUD detail pages should use `useCrudViewScreen({ requestQueryParams, readEnabled, queryKeyFactory })` for read pass-throughs and `CrudViewScreen` slots (`before-fields`, `fields`, `after-fields`, `supporting-content`) for domain sections instead of replacing the shared detail chrome.
|
|
61
65
|
- Routine resource-load errors stay local to the generated screen and retry affordance. Action feedback uses the shell error policy through `action-feedback`.
|
|
62
66
|
- `page.supporting-content` is a semantic supporting region in the default shell. Compact layout renders it as a closed bottom sheet; medium/expanded layouts render it as a closed side panel.
|
|
@@ -66,6 +66,14 @@ Local functions
|
|
|
66
66
|
- `clearChip(chip = {})`
|
|
67
67
|
- `clearFilters()`
|
|
68
68
|
|
|
69
|
+
### `src/client/components/CrudListRecordActionMenu.vue`
|
|
70
|
+
Exports
|
|
71
|
+
- None
|
|
72
|
+
Local functions
|
|
73
|
+
- `isRowActionLoading(action = {})`
|
|
74
|
+
- `isRowActionDisabled(action = {})`
|
|
75
|
+
- `runRowAction(action = {})`
|
|
76
|
+
|
|
69
77
|
### `src/client/components/CrudListScreen.vue`
|
|
70
78
|
Exports
|
|
71
79
|
- None
|
|
@@ -74,6 +82,12 @@ Local functions
|
|
|
74
82
|
- `formatListCardValue(value)`
|
|
75
83
|
- `resolveViewLocation(record)`
|
|
76
84
|
- `resolveEditLocation(record)`
|
|
85
|
+
- `hasRowActionsFor(record, index)`
|
|
86
|
+
- `isBulkRowSelected(row = {})`
|
|
87
|
+
- `setBulkRowSelected(row = {}, selected = true)`
|
|
88
|
+
- `allSelectableRowsSelected()`
|
|
89
|
+
- `someSelectableRowsSelected()`
|
|
90
|
+
- `setSelectableRowsSelected(selected = true)`
|
|
77
91
|
|
|
78
92
|
### `src/client/components/CrudViewScreen.vue`
|
|
79
93
|
Exports
|
|
@@ -484,15 +498,30 @@ Exports
|
|
|
484
498
|
Local functions
|
|
485
499
|
- `normalizeQueryKeyPrefix(value = [])`
|
|
486
500
|
|
|
501
|
+
### `src/client/composables/useCrudListRowActions.js`
|
|
502
|
+
Exports
|
|
503
|
+
- `useCrudListRowActions(actions = [], { resolveRecordId = null, resolveContext = null } = {})`
|
|
504
|
+
Local functions
|
|
505
|
+
- `normalizeRowActionKey(actionOrKey = "")`
|
|
506
|
+
- `normalizeRowId(value = "")`
|
|
507
|
+
- `createExecutionKey(actionKey = "", recordId = "", index = 0)`
|
|
508
|
+
- `asContextObject(value = null)`
|
|
509
|
+
|
|
487
510
|
### `src/client/composables/useCrudListScreen.js`
|
|
488
511
|
Exports
|
|
489
|
-
- `useCrudListScreen({ adapter = null, resource = null, resourceNamespace = "resource", apiSuffix = "", recordIdParam = "recordId", recordIdSelector = null, titleFallbackFieldKey = "", viewUrlTemplate = "", editUrlTemplate = "", newUrlTemplate = "", recordChangedEvents = [], listFilters = {}, listBulkActions = [], routeQueryBlacklist = Object.freeze(["include", "cursor", "limit"]), requestRecoveryLabel = "Records", fallbackLoadError = "Unable to load records." } = {})`
|
|
512
|
+
- `useCrudListScreen({ adapter = null, resource = null, resourceNamespace = "resource", apiSuffix = "", recordIdParam = "recordId", recordIdSelector = null, titleFallbackFieldKey = "", viewUrlTemplate = "", editUrlTemplate = "", newUrlTemplate = "", recordChangedEvents = [], listFilters = {}, listBulkActions = [], listRowActions = [], syntheticRows = null, routeQueryBlacklist = Object.freeze(["include", "cursor", "limit"]), requestQueryParams = null, readEnabled = true, requestRecoveryLabel = "Records", fallbackLoadError = "Unable to load records." } = {})`
|
|
490
513
|
Local functions
|
|
491
514
|
- `formatCrudListCardValue(value)`
|
|
515
|
+
- `asList(value = [])`
|
|
516
|
+
- `hasSyntheticRowGroups(value = null)`
|
|
517
|
+
- `normalizeSyntheticDisplayRow(source = null, index = 0, placement = "prepend")`
|
|
518
|
+
- `normalizeSyntheticDisplayRows(value = [], placement = "prepend")`
|
|
519
|
+
- `normalizeSyntheticDisplayRowGroups(syntheticRows = null)`
|
|
520
|
+
- `createCrudListDisplayRow(record = {}, index = 0, records = {})`
|
|
492
521
|
|
|
493
522
|
### `src/client/composables/useCrudViewScreen.js`
|
|
494
523
|
Exports
|
|
495
|
-
- `useCrudViewScreen({ adapter = null, resource = null, resourceNamespace = "resource", apiUrlTemplate = "", recordIdParam = "recordId", titleFallbackFieldKey = "", listUrlTemplate = "", editUrlTemplate = "", recordChangedEvent = "", requestRecoveryLabel = "Record", fallbackLoadError = "Unable to load record.", notFoundMessage = "Record not found." } = {})`
|
|
524
|
+
- `useCrudViewScreen({ adapter = null, resource = null, resourceNamespace = "resource", apiUrlTemplate = "", recordIdParam = "recordId", titleFallbackFieldKey = "", listUrlTemplate = "", editUrlTemplate = "", recordChangedEvent = "", requestQueryParams = null, readEnabled = true, queryKeyFactory = null, requestRecoveryLabel = "Record", fallbackLoadError = "Unable to load record.", notFoundMessage = "Record not found." } = {})`
|
|
496
525
|
|
|
497
526
|
### `src/client/composables/usePagedCollection.js`
|
|
498
527
|
Exports
|
|
@@ -605,6 +634,12 @@ Local functions
|
|
|
605
634
|
Exports
|
|
606
635
|
- `UsersWebClientProvider`
|
|
607
636
|
|
|
637
|
+
### `src/client/rowActions.js`
|
|
638
|
+
Exports
|
|
639
|
+
- `defineCrudListRowActions(actions = [])`
|
|
640
|
+
Local functions
|
|
641
|
+
- `normalizeCrudListRowAction(rawAction = {}, index = 0)`
|
|
642
|
+
|
|
608
643
|
### `src/client/support/contractGuards.js`
|
|
609
644
|
Exports
|
|
610
645
|
- `requireRecord(value, label = "value", owner = "Contract")`
|