@cosmicdrift/kumiko-renderer 0.389.0 → 0.390.0
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/app/projection-detail-body.js +59 -394
- package/dist/app/projection-detail-header-model.d.ts +11 -0
- package/dist/app/projection-detail-header-model.js +33 -0
- package/dist/app/projection-detail-header-region.d.ts +28 -0
- package/dist/app/projection-detail-header-region.js +81 -0
- package/dist/app/projection-detail-header.d.ts +29 -0
- package/dist/app/projection-detail-header.js +84 -0
- package/dist/app/projection-detail-navigation.d.ts +13 -0
- package/dist/app/projection-detail-navigation.js +91 -0
- package/dist/app/projection-detail-states.d.ts +22 -0
- package/dist/app/projection-detail-states.js +26 -0
- package/dist/app/projection-drawer-host.d.ts +12 -0
- package/dist/app/projection-drawer-host.js +10 -0
- package/dist/app/projection-list-body.d.ts +1 -1
- package/dist/app/projection-list-body.js +69 -189
- package/dist/app/projection-list-render-props.d.ts +56 -0
- package/dist/app/projection-list-render-props.js +47 -0
- package/dist/app/projection-list-render.d.ts +26 -0
- package/dist/app/projection-list-render.js +20 -0
- package/dist/app/projection-list-row-click.d.ts +12 -0
- package/dist/app/projection-list-row-click.js +14 -0
- package/dist/app/use-projection-detail-actions.d.ts +35 -0
- package/dist/app/use-projection-detail-actions.js +156 -0
- package/dist/app/use-projection-detail-data.d.ts +19 -0
- package/dist/app/use-projection-detail-data.js +47 -0
- package/dist/app/use-projection-detail-layout.d.ts +17 -0
- package/dist/app/use-projection-detail-layout.js +23 -0
- package/dist/app/use-projection-list-actions.d.ts +31 -0
- package/dist/app/use-projection-list-actions.js +73 -0
- package/dist/app/use-projection-list-data.d.ts +20 -0
- package/dist/app/use-projection-list-data.js +26 -0
- package/dist/app/use-projection-list-definitions.d.ts +11 -0
- package/dist/app/use-projection-list-definitions.js +20 -0
- package/dist/app/use-projection-list-query.d.ts +28 -0
- package/dist/app/use-projection-list-query.js +83 -0
- package/dist/components/render-edit-banners.d.ts +12 -0
- package/dist/components/render-edit-banners.js +90 -0
- package/dist/components/render-edit-draft-save-helpers.d.ts +19 -0
- package/dist/components/render-edit-draft-save-helpers.js +42 -0
- package/dist/components/render-edit-field-grid.d.ts +4 -0
- package/dist/components/render-edit-field-grid.js +40 -0
- package/dist/components/render-edit-fields-section.d.ts +4 -0
- package/dist/components/render-edit-fields-section.js +76 -0
- package/dist/components/render-edit-form-actions.d.ts +4 -0
- package/dist/components/render-edit-form-actions.js +66 -0
- package/dist/components/render-edit-header-actions.d.ts +11 -0
- package/dist/components/render-edit-header-actions.js +120 -0
- package/dist/components/render-edit-layout-flags.d.ts +29 -0
- package/dist/components/render-edit-layout-flags.js +106 -0
- package/dist/components/render-edit-layout.d.ts +4 -0
- package/dist/components/render-edit-layout.js +79 -0
- package/dist/components/render-edit-render-model.d.ts +63 -0
- package/dist/components/render-edit-render-model.js +14 -0
- package/dist/components/render-edit-section-kinds.d.ts +4 -0
- package/dist/components/render-edit-section-kinds.js +115 -0
- package/dist/components/render-edit-submit-result.d.ts +8 -0
- package/dist/components/render-edit-submit-result.js +77 -0
- package/dist/components/render-edit-submit.d.ts +7 -0
- package/dist/components/render-edit-submit.js +113 -0
- package/dist/components/render-edit-titles.d.ts +17 -0
- package/dist/components/render-edit-titles.js +99 -0
- package/dist/components/render-edit-wizard-navigation.d.ts +11 -0
- package/dist/components/render-edit-wizard-navigation.js +115 -0
- package/dist/components/render-edit.d.ts +2 -2
- package/dist/components/render-edit.js +63 -1128
- package/dist/components/render-field-choice-inputs.d.ts +7 -0
- package/dist/components/render-field-choice-inputs.js +52 -0
- package/dist/components/render-field-control.d.ts +12 -0
- package/dist/components/render-field-control.js +93 -0
- package/dist/components/render-field-display-text.d.ts +4 -0
- package/dist/components/render-field-display-text.js +48 -0
- package/dist/components/render-field-fill-action.d.ts +13 -0
- package/dist/components/render-field-fill-action.js +63 -0
- package/dist/components/render-field-input-shared.d.ts +39 -0
- package/dist/components/render-field-input-shared.js +20 -0
- package/dist/components/render-field-input.d.ts +3 -0
- package/dist/components/render-field-input.js +34 -0
- package/dist/components/render-field-meta.d.ts +6 -0
- package/dist/components/render-field-meta.js +51 -0
- package/dist/components/render-field-read-only.d.ts +11 -0
- package/dist/components/render-field-read-only.js +75 -0
- package/dist/components/render-field-reference.d.ts +15 -0
- package/dist/components/render-field-reference.js +103 -0
- package/dist/components/render-field-scalar-inputs.d.ts +10 -0
- package/dist/components/render-field-scalar-inputs.js +35 -0
- package/dist/components/render-field-text-inputs.d.ts +3 -0
- package/dist/components/render-field-text-inputs.js +34 -0
- package/dist/components/render-field-values.d.ts +18 -0
- package/dist/components/render-field-values.js +111 -0
- package/dist/components/render-field-write-only.d.ts +9 -0
- package/dist/components/render-field-write-only.js +29 -0
- package/dist/components/render-field.d.ts +2 -2
- package/dist/components/render-field.js +39 -670
- package/dist/components/render-list-header-slot.d.ts +5 -0
- package/dist/components/render-list-header-slot.js +30 -0
- package/dist/components/render-list-reference-bridge.d.ts +3 -0
- package/dist/components/render-list-reference-bridge.js +25 -0
- package/dist/components/render-list-reference-columns.d.ts +25 -0
- package/dist/components/render-list-reference-columns.js +137 -0
- package/dist/components/render-list-table-props.d.ts +52 -0
- package/dist/components/render-list-table-props.js +53 -0
- package/dist/components/render-list-toolbar-model.d.ts +42 -0
- package/dist/components/render-list-toolbar-model.js +82 -0
- package/dist/components/render-list-toolbar.d.ts +38 -0
- package/dist/components/render-list-toolbar.js +40 -0
- package/dist/components/render-list-types.d.ts +113 -0
- package/dist/components/render-list-types.js +1 -0
- package/dist/components/render-list.d.ts +4 -113
- package/dist/components/render-list.js +91 -307
- package/dist/components/use-reference-input-state.d.ts +20 -0
- package/dist/components/use-reference-input-state.js +85 -0
- package/dist/components/use-render-edit-controlled-sync.d.ts +3 -0
- package/dist/components/use-render-edit-controlled-sync.js +26 -0
- package/dist/components/use-render-edit-draft-save.d.ts +29 -0
- package/dist/components/use-render-edit-draft-save.js +141 -0
- package/dist/components/use-render-edit-form.d.ts +10 -0
- package/dist/components/use-render-edit-form.js +101 -0
- package/dist/components/use-render-edit-sections.d.ts +15 -0
- package/dist/components/use-render-edit-sections.js +100 -0
- package/dist/components/use-render-edit-state.d.ts +65 -0
- package/dist/components/use-render-edit-state.js +158 -0
- package/dist/components/use-render-edit-steps.d.ts +13 -0
- package/dist/components/use-render-edit-steps.js +52 -0
- package/dist/components/use-render-list-columns.d.ts +18 -0
- package/dist/components/use-render-list-columns.js +41 -0
- package/dist/components/use-render-list-search.d.ts +4 -0
- package/dist/components/use-render-list-search.js +50 -0
- package/dist/primitives.d.ts +1 -1
- package/dist/web/app/dashboard-body.d.ts +1 -1
- package/dist/web/app/dashboard-body.js +42 -246
- package/dist/web/app/dashboard-header.d.ts +34 -0
- package/dist/web/app/dashboard-header.js +58 -0
- package/dist/web/app/dashboard-screen-controls.d.ts +11 -0
- package/dist/web/app/dashboard-screen-controls.js +42 -0
- package/dist/web/app/dashboard-screen-tiles.d.ts +8 -0
- package/dist/web/app/dashboard-screen-tiles.js +42 -0
- package/dist/web/app/dashboard-visibility.d.ts +42 -0
- package/dist/web/app/dashboard-visibility.js +102 -0
- package/dist/web/app/use-dashboard-screen-state.d.ts +35 -0
- package/dist/web/app/use-dashboard-screen-state.js +69 -0
- package/dist/web/primitives/data-table/actions-column.js +6 -5
- package/dist/web/primitives/data-table/card-body.d.ts +6 -0
- package/dist/web/primitives/data-table/card-body.js +32 -0
- package/dist/web/primitives/data-table/card-row.d.ts +5 -0
- package/dist/web/primitives/data-table/card-row.js +31 -0
- package/dist/web/primitives/data-table/card-view.d.ts +3 -0
- package/dist/web/primitives/data-table/card-view.js +13 -0
- package/dist/web/primitives/data-table/column-resize-handle.js +3 -1
- package/dist/web/primitives/data-table/data-cell-props.d.ts +7 -0
- package/dist/web/primitives/data-table/data-cell-props.js +8 -0
- package/dist/web/primitives/data-table/row-render-parts.d.ts +8 -0
- package/dist/web/primitives/data-table/row-render-parts.js +35 -0
- package/dist/web/primitives/data-table/table-body.d.ts +3 -0
- package/dist/web/primitives/data-table/table-body.js +32 -0
- package/dist/web/primitives/data-table/table-content.d.ts +3 -0
- package/dist/web/primitives/data-table/table-content.js +41 -0
- package/dist/web/primitives/data-table/table-data-cell.d.ts +4 -0
- package/dist/web/primitives/data-table/table-data-cell.js +25 -0
- package/dist/web/primitives/data-table/table-header-row.d.ts +3 -0
- package/dist/web/primitives/data-table/table-header-row.js +21 -0
- package/dist/web/primitives/data-table/table-view.d.ts +3 -0
- package/dist/web/primitives/data-table/table-view.js +25 -0
- package/dist/web/primitives/data-table/toolbar.d.ts +6 -0
- package/dist/web/primitives/data-table/toolbar.js +53 -0
- package/dist/web/primitives/data-table/use-data-table-state.d.ts +44 -0
- package/dist/web/primitives/data-table/use-data-table-state.js +123 -0
- package/dist/web/primitives/data-table.d.ts +3 -4
- package/dist/web/primitives/data-table.js +32 -252
- package/dist/web/primitives/file-value-list.js +1 -1
- package/dist/web/primitives/form-footer-parts.d.ts +25 -0
- package/dist/web/primitives/form-footer-parts.js +55 -0
- package/dist/web/primitives/form.js +33 -43
- package/dist/web/primitives/input-choice-kinds.d.ts +4 -0
- package/dist/web/primitives/input-choice-kinds.js +67 -0
- package/dist/web/primitives/input-file-kinds.d.ts +3 -0
- package/dist/web/primitives/input-file-kinds.js +6 -0
- package/dist/web/primitives/input-number-kinds.d.ts +4 -0
- package/dist/web/primitives/input-number-kinds.js +16 -0
- package/dist/web/primitives/input-optional-props.d.ts +20 -0
- package/dist/web/primitives/input-optional-props.js +24 -0
- package/dist/web/primitives/input-select-presentation.d.ts +13 -0
- package/dist/web/primitives/input-select-presentation.js +19 -0
- package/dist/web/primitives/input-shared.d.ts +22 -0
- package/dist/web/primitives/input-shared.js +10 -0
- package/dist/web/primitives/input-temporal-kinds.d.ts +5 -0
- package/dist/web/primitives/input-temporal-kinds.js +10 -0
- package/dist/web/primitives/input-text-kinds.d.ts +7 -0
- package/dist/web/primitives/input-text-kinds.js +33 -0
- package/dist/web/primitives/input.js +35 -161
- package/dist/web/widgets/chart-data.d.ts +35 -0
- package/dist/web/widgets/chart-data.js +37 -0
- package/dist/web/widgets/chart-markers.d.ts +26 -0
- package/dist/web/widgets/chart-markers.js +64 -0
- package/dist/web/widgets/chart-parts.d.ts +20 -0
- package/dist/web/widgets/chart-parts.js +15 -0
- package/dist/web/widgets/charts.d.ts +5 -78
- package/dist/web/widgets/charts.js +7 -485
- package/dist/web/widgets/drawer-panel-class.d.ts +3 -0
- package/dist/web/widgets/drawer-panel-class.js +40 -0
- package/dist/web/widgets/drawer-resize-controls.d.ts +11 -0
- package/dist/web/widgets/drawer-resize-controls.js +12 -0
- package/dist/web/widgets/drawer-sizing.d.ts +19 -0
- package/dist/web/widgets/drawer-sizing.js +60 -0
- package/dist/web/widgets/drawer.js +17 -116
- package/dist/web/widgets/stacked-area-brush.d.ts +13 -0
- package/dist/web/widgets/stacked-area-brush.js +91 -0
- package/dist/web/widgets/stacked-area-chart.d.ts +6 -0
- package/dist/web/widgets/stacked-area-chart.js +45 -0
- package/dist/web/widgets/stacked-area-chrome.d.ts +7 -0
- package/dist/web/widgets/stacked-area-chrome.js +77 -0
- package/dist/web/widgets/stacked-area-geometry.d.ts +54 -0
- package/dist/web/widgets/stacked-area-geometry.js +83 -0
- package/dist/web/widgets/stacked-area-model.d.ts +11 -0
- package/dist/web/widgets/stacked-area-model.js +1 -0
- package/dist/web/widgets/stacked-area-plot.d.ts +3 -0
- package/dist/web/widgets/stacked-area-plot.js +51 -0
- package/dist/web/widgets/stacked-area-props.d.ts +83 -0
- package/dist/web/widgets/stacked-area-props.js +16 -0
- package/dist/web/widgets/stacked-area-svg.d.ts +3 -0
- package/dist/web/widgets/stacked-area-svg.js +38 -0
- package/dist/web/widgets/stacked-area-tooltip.d.ts +3 -0
- package/dist/web/widgets/stacked-area-tooltip.js +86 -0
- package/dist/web/widgets/use-drawer-resize.d.ts +22 -0
- package/dist/web/widgets/use-drawer-resize.js +52 -0
- package/dist/web/widgets/use-stacked-area-tooltip.d.ts +9 -0
- package/dist/web/widgets/use-stacked-area-tooltip.js +34 -0
- package/dist/web/widgets/use-stacked-area-window.d.ts +20 -0
- package/dist/web/widgets/use-stacked-area-window.js +76 -0
- package/package.json +9 -9
- package/src/changes.json +54 -0
|
@@ -1,31 +1,25 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useMemo, useState } from "react";
|
|
3
2
|
import { ListGroupPageBridges } from "../components/list-group-page-bridges.js";
|
|
4
|
-
import { RenderList } from "../components/render-list.js";
|
|
5
3
|
import { useOptionalDispatcher } from "../context/dispatcher-context.js";
|
|
6
4
|
import { useIsEmbeddedScreen } from "../context/embedded-screen-context.js";
|
|
7
5
|
import { useUserRoles } from "../context/user-roles-context.js";
|
|
8
|
-
import { useListUrlState } from "../hooks/use-list-url-state.js";
|
|
9
6
|
import { useTranslation } from "../i18n.js";
|
|
10
7
|
import { usePrimitives } from "../primitives.js";
|
|
11
|
-
import {
|
|
12
|
-
import { DrawerHost, useDrawerAction } from "./action-form-body.js";
|
|
8
|
+
import { useDrawerAction } from "./action-form-body.js";
|
|
13
9
|
import { useAppFeatures } from "./app-features-context.js";
|
|
14
10
|
import { useClientActionRuntime } from "./client-actions.js";
|
|
15
|
-
import { useListBulk } from "./list-bulk-actions.js";
|
|
16
|
-
import { isListNarrowed, useListEmptyContent } from "./list-empty-content.js";
|
|
17
|
-
import { buildFilterFacets, buildFilterPayload, mergeReferenceFacetOptions, resolveProjectionFacetSpecs, } from "./list-facets.js";
|
|
18
11
|
import { useNav } from "./nav.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
12
|
+
import { renderProjectionDrawerHost } from "./projection-drawer-host.js";
|
|
13
|
+
import { renderBadShapeBanner, renderProjectionList, renderQueryRetryBanner, } from "./projection-list-render.js";
|
|
14
|
+
import { resolveWrappedRowClick } from "./projection-list-row-click.js";
|
|
15
|
+
import { QueryLoadingBanner } from "./query-state-banners.js";
|
|
21
16
|
import { ReferenceFacetBridges } from "./reference-facet-bridge.js";
|
|
22
17
|
import { useReturnHost } from "./return-to.js";
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import { listPager
|
|
28
|
-
import { useScreenListTable } from "./use-screen-list-table.js";
|
|
18
|
+
import { useProjectionListActions } from "./use-projection-list-actions.js";
|
|
19
|
+
import { useProjectionListData } from "./use-projection-list-data.js";
|
|
20
|
+
import { useProjectionListDefinitions } from "./use-projection-list-definitions.js";
|
|
21
|
+
import { useProjectionListQuery } from "./use-projection-list-query.js";
|
|
22
|
+
import { listPager } from "./use-screen-list-rows.js";
|
|
29
23
|
// ---- projection-list ----
|
|
30
24
|
// Like entityList, but the list query comes DIRECTLY from `screen.query`
|
|
31
25
|
// (instead of being derived from an entity) — cross-feature capable.
|
|
@@ -45,206 +39,92 @@ export function ProjectionListBody({ schema, screen, translate, onRowClick, }) {
|
|
|
45
39
|
const effectiveTranslate = translate ?? t;
|
|
46
40
|
const userRoles = useUserRoles();
|
|
47
41
|
const appFeatures = useAppFeatures();
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return findEditScreenFor(detailFor, appFeatures, userRoles);
|
|
54
|
-
}, [appFeatures, screen.detailFor, userRoles]);
|
|
55
|
-
// searchable/sortable/paginated are derived at buildAppSchema time from the
|
|
56
|
-
// query handler's Zod schema — not authored on the screen.
|
|
57
|
-
const searchable = screen.searchable ?? false;
|
|
58
|
-
const sortable = screen.sortable ?? false;
|
|
59
|
-
const paginated = screen.paginated ?? false;
|
|
60
|
-
const entity = useMemo(() => synthesizeProjectionEntity(screen.columns, sortable), [screen.columns, sortable]);
|
|
61
|
-
const listScreen = useMemo(() => synthesizeProjectionScreen(screen), [screen]);
|
|
62
|
-
const urlState = useListUrlState(screen.id);
|
|
63
|
-
// Gated on the derived capability, not just on whether URL-state happens to
|
|
64
|
-
// carry a value — a stale/hand-crafted URL (?…q=x on a non-searchable
|
|
65
|
-
// screen) must not smuggle a param the query's Zod schema doesn't accept.
|
|
66
|
-
const activeSearch = searchable ? urlState.q : "";
|
|
67
|
-
// Same predicate that makes a header clickable: a stale link onto a
|
|
68
|
-
// sortable:false/unknown column must not reach the server (it answers 400).
|
|
69
|
-
const urlSort = urlState.sort;
|
|
70
|
-
const urlSortField = urlSort === null ? undefined : entity.fields[urlSort.field];
|
|
71
|
-
const urlSortAllowed = urlSortField !== undefined && "sortable" in urlSortField && urlSortField.sortable === true;
|
|
72
|
-
const activeSort = sortable
|
|
73
|
-
? ((urlSortAllowed ? urlSort : null) ?? screen.defaultSort ?? null)
|
|
74
|
-
: null;
|
|
75
|
-
const limit = urlState.pageSize ?? screen.pageSize ?? 50;
|
|
76
|
-
// Pages-mode only (see header comment) — an author-set pagination:
|
|
77
|
-
// "infinite" on a paginated projectionList is silently a no-op today.
|
|
78
|
-
const usePager = paginated && (screen.pagination ?? "pages") === "pages";
|
|
79
|
-
// Facets — a projectionList has no entity, so screen.facets is
|
|
80
|
-
// the only field inventory; resolveProjectionFacetSpecs reshapes +
|
|
81
|
-
// translates its explicit labels into the same ResolvedFacetSpec the
|
|
82
|
-
// entityList adapter produces, so both feed the same
|
|
83
|
-
// buildFilterFacets/buildFilterPayload.
|
|
84
|
-
const facetSpecs = useMemo(() => resolveProjectionFacetSpecs(screen.facets, effectiveTranslate, schema.featureName), [screen.facets, effectiveTranslate, schema.featureName]);
|
|
85
|
-
const [projectionReferenceFacetOptions, setProjectionReferenceFacetOptions] = useState({});
|
|
86
|
-
const handleProjectionFacetOptions = useCallback((field, options) => setProjectionReferenceFacetOptions((prev) => prev[field] === options ? prev : { ...prev, [field]: options }), []);
|
|
87
|
-
const resolvedFacetSpecs = useMemo(() => mergeReferenceFacetOptions(facetSpecs, projectionReferenceFacetOptions), [facetSpecs, projectionReferenceFacetOptions]);
|
|
88
|
-
const filterPayload = useMemo(() => buildFilterPayload(urlState.filters, (field) => facetSpecs.find((spec) => spec.field === field)?.type), [urlState.filters, facetSpecs]);
|
|
89
|
-
const { dateRangePayload, dateRangeFacets, handleDateRangeChange } = useProjectionDateRange(screen.facets, effectiveTranslate, urlState);
|
|
90
|
-
const queryPayload = useMemo(() => {
|
|
91
|
-
const payload = buildListQueryPayload({
|
|
92
|
-
limit,
|
|
93
|
-
search: activeSearch,
|
|
94
|
-
sort: activeSort,
|
|
95
|
-
usePager,
|
|
96
|
-
page: urlState.page,
|
|
97
|
-
useInfinite: false,
|
|
98
|
-
cursor: undefined,
|
|
99
|
-
});
|
|
100
|
-
// Gated on screen.filter/screen.facets being declared (not just on
|
|
101
|
-
// urlState/filterPayload happening to carry a value) — same rule as
|
|
102
|
-
// activeSearch/activeSort above: a stale URL must not smuggle a param
|
|
103
|
-
// the bound query's Zod schema doesn't accept.
|
|
104
|
-
if (screen.filter !== undefined) {
|
|
105
|
-
payload["filter"] = screen.filter;
|
|
106
|
-
}
|
|
107
|
-
if (screen.facets !== undefined && filterPayload.length > 0) {
|
|
108
|
-
payload["filters"] = filterPayload;
|
|
109
|
-
}
|
|
110
|
-
Object.assign(payload, dateRangePayload);
|
|
111
|
-
return payload;
|
|
112
|
-
}, [
|
|
113
|
-
limit,
|
|
114
|
-
activeSearch,
|
|
115
|
-
activeSort,
|
|
116
|
-
usePager,
|
|
117
|
-
urlState.page,
|
|
118
|
-
screen.filter,
|
|
119
|
-
screen.facets,
|
|
120
|
-
filterPayload,
|
|
121
|
-
dateRangePayload,
|
|
122
|
-
]);
|
|
123
|
-
const facetFilterFields = useMemo(() => (screen.facets ?? []).map((facet) => facet.field), [screen.facets]);
|
|
124
|
-
const listTable = useScreenListTable({
|
|
42
|
+
const drawer = useDrawerAction(schema);
|
|
43
|
+
const { openDrawer } = drawer;
|
|
44
|
+
const definitions = useProjectionListDefinitions(screen, appFeatures, userRoles);
|
|
45
|
+
const { defaultEditScreen, searchable, sortable, paginated, entity } = definitions;
|
|
46
|
+
const query = useProjectionListQuery({
|
|
125
47
|
screen,
|
|
126
48
|
featureName: schema.featureName,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
translate: effectiveTranslate,
|
|
49
|
+
effectiveTranslate,
|
|
50
|
+
entity,
|
|
51
|
+
searchable,
|
|
52
|
+
sortable,
|
|
53
|
+
paginated,
|
|
133
54
|
});
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
55
|
+
const data = useProjectionListData({
|
|
56
|
+
screen,
|
|
57
|
+
featureName: schema.featureName,
|
|
58
|
+
queryPayload: query.queryPayload,
|
|
59
|
+
limit: query.limit,
|
|
60
|
+
usePager: query.usePager,
|
|
61
|
+
effectiveTranslate,
|
|
62
|
+
resolvedFacetSpecs: query.resolvedFacetSpecs,
|
|
139
63
|
});
|
|
64
|
+
const { listRows } = data;
|
|
140
65
|
const refreshRows = listRows.refreshAfterWrite;
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
// in the NavApi impl. Unlike there: NO row["id"]
|
|
144
|
-
// fallback — projectionList rows come from an arbitrary query projection
|
|
145
|
-
// with no guaranteed "id" field. The boot validator therefore enforces an
|
|
146
|
-
// explicit entityId for projectionList entity targets. Same helper
|
|
147
|
-
// relatedList's rowActions reuse (related-list-section.tsx) — a
|
|
148
|
-
// projectionDetail relatedList row has the identical "no guaranteed id"
|
|
149
|
-
// shape.
|
|
150
|
-
const runNavigate = useCallback((action, row) => runProjectionRowNavigate(nav, action, row, host), [nav, host]);
|
|
151
|
-
const defaultEditRowAction = useMemo(() => buildDefaultEditRowAction(defaultEditScreen), [defaultEditScreen]);
|
|
152
|
-
const rowActions = useMemo(() => buildProjectionRowActions({
|
|
153
|
-
rowActions: screen.rowActions,
|
|
154
|
-
translate: effectiveTranslate,
|
|
155
|
-
dispatcher,
|
|
156
|
-
nav,
|
|
157
|
-
refetch: refreshRows,
|
|
158
|
-
openDrawer,
|
|
159
|
-
defaultEditRowAction,
|
|
160
|
-
host,
|
|
161
|
-
clientActions,
|
|
162
|
-
}), [
|
|
163
|
-
screen.rowActions,
|
|
66
|
+
const actions = useProjectionListActions({
|
|
67
|
+
screen,
|
|
164
68
|
effectiveTranslate,
|
|
165
69
|
dispatcher,
|
|
166
70
|
clientActions,
|
|
167
71
|
nav,
|
|
168
|
-
refreshRows,
|
|
169
|
-
openDrawer,
|
|
170
|
-
defaultEditRowAction,
|
|
171
|
-
host,
|
|
172
|
-
]);
|
|
173
|
-
const toolbarActions = useMemo(() => buildProjectionToolbarActions({
|
|
174
|
-
toolbarActions: screen.toolbarActions,
|
|
175
|
-
translate: effectiveTranslate,
|
|
176
|
-
dispatcher,
|
|
177
|
-
nav,
|
|
178
|
-
refetch: refreshRows,
|
|
179
|
-
openDrawer,
|
|
180
|
-
host,
|
|
181
|
-
access: { appFeatures, userRoles },
|
|
182
|
-
}), [
|
|
183
|
-
screen.toolbarActions,
|
|
184
|
-
effectiveTranslate,
|
|
185
|
-
nav,
|
|
186
72
|
host,
|
|
187
|
-
dispatcher,
|
|
188
73
|
refreshRows,
|
|
189
74
|
openDrawer,
|
|
190
75
|
appFeatures,
|
|
191
76
|
userRoles,
|
|
192
|
-
|
|
193
|
-
const bulk = useListBulk({
|
|
194
|
-
bulkActions: screen.bulkActions,
|
|
195
|
-
rowActions: screen.rowActions,
|
|
196
|
-
translate: effectiveTranslate,
|
|
197
|
-
dispatcher,
|
|
198
|
-
reload: refreshRows,
|
|
199
|
-
});
|
|
200
|
-
const emptyContent = useListEmptyContent(screen.emptyState, effectiveTranslate, {
|
|
201
|
-
nav,
|
|
202
|
-
host,
|
|
203
|
-
dispatcher,
|
|
204
|
-
openDrawer,
|
|
205
|
-
onWriteSuccess: refreshRows,
|
|
77
|
+
defaultEditScreen,
|
|
206
78
|
});
|
|
207
79
|
if (listRows.firstLoad) {
|
|
208
80
|
return _jsx(QueryLoadingBanner, {});
|
|
209
81
|
}
|
|
210
82
|
if (listRows.error && !listRows.hasData) {
|
|
211
|
-
return (
|
|
83
|
+
return renderQueryRetryBanner(listRows, listRows.error, effectiveTranslate);
|
|
212
84
|
}
|
|
213
85
|
// A failed refetch keeps the last good data on screen.
|
|
214
|
-
const refetchErrorBanner = listRows.error
|
|
86
|
+
const refetchErrorBanner = listRows.error
|
|
87
|
+
? renderQueryRetryBanner(listRows, listRows.error, effectiveTranslate)
|
|
88
|
+
: null;
|
|
215
89
|
// listRows.page is typed as PagedRows but the query handler is free to
|
|
216
90
|
// return anything at runtime (a bare array silently rendered an empty
|
|
217
91
|
// table instead of surfacing the mismatch), so the shape is checked.
|
|
218
92
|
if (listRows.page !== null && !Array.isArray(listRows.page.rows)) {
|
|
219
|
-
return (
|
|
93
|
+
return renderBadShapeBanner(screen, { Banner, Text });
|
|
220
94
|
}
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
:
|
|
227
|
-
|
|
228
|
-
: undefined;
|
|
95
|
+
const wrappedOnRowClick = resolveWrappedRowClick({
|
|
96
|
+
screen,
|
|
97
|
+
onRowClick,
|
|
98
|
+
entityName: definitions.listScreen.entity,
|
|
99
|
+
openDrawer,
|
|
100
|
+
runNavigate: actions.runNavigate,
|
|
101
|
+
});
|
|
229
102
|
// Same pager-construction as EntityListBody: no Pager UI until the
|
|
230
103
|
// server-provided `total` arrives (guards pagination="pages" without
|
|
231
104
|
// totalCount support).
|
|
232
|
-
const pager = listPager({
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
105
|
+
const pager = listPager({
|
|
106
|
+
usePager: query.usePager,
|
|
107
|
+
page: listRows.page,
|
|
108
|
+
limit: query.limit,
|
|
109
|
+
urlState: query.urlState,
|
|
110
|
+
});
|
|
111
|
+
return (_jsxs(_Fragment, { children: [refetchErrorBanner, _jsx(ListGroupPageBridges, { ...data.listTable.aggregates.groupPages }), _jsx(ReferenceFacetBridges, { specs: query.facetSpecs, onOptions: query.handleProjectionFacetOptions }), renderProjectionList({
|
|
112
|
+
schema,
|
|
113
|
+
screen,
|
|
114
|
+
translate,
|
|
115
|
+
effectiveTranslate,
|
|
116
|
+
isEmbeddedScreen,
|
|
117
|
+
definitions,
|
|
118
|
+
query,
|
|
119
|
+
data,
|
|
120
|
+
actions,
|
|
121
|
+
pager,
|
|
122
|
+
wrappedOnRowClick,
|
|
123
|
+
}), renderProjectionDrawerHost({
|
|
124
|
+
schema,
|
|
125
|
+
translate,
|
|
126
|
+
userRoles,
|
|
127
|
+
drawer,
|
|
128
|
+
refreshRows,
|
|
129
|
+
})] }));
|
|
250
130
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ProjectionListScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
|
|
2
|
+
import type { ListRowViewModel, Translate } from "../headless/index.ts";
|
|
3
|
+
import type { ListUrlStateApi } from "../hooks/use-list-url-state.ts";
|
|
4
|
+
import type { useProjectionListActions } from "./use-projection-list-actions.ts";
|
|
5
|
+
import type { useProjectionListData } from "./use-projection-list-data.ts";
|
|
6
|
+
import type { useProjectionListDefinitions } from "./use-projection-list-definitions.ts";
|
|
7
|
+
import type { useProjectionListQuery } from "./use-projection-list-query.ts";
|
|
8
|
+
import type { listPager } from "./use-screen-list-rows.ts";
|
|
9
|
+
export declare function projectionLeadProps(screen: ProjectionListScreenDefinition, effectiveTranslate: Translate, emptyContent: ReturnType<typeof useProjectionListActions>["emptyContent"]): {
|
|
10
|
+
description?: string | undefined;
|
|
11
|
+
emptyContent?: import("../components/list-empty-state.tsx").ListEmptyStateContent | undefined;
|
|
12
|
+
};
|
|
13
|
+
export declare function projectionLayoutProps(isEmbeddedScreen: boolean, screen: ProjectionListScreenDefinition, listScreen: ReturnType<typeof useProjectionListDefinitions>["listScreen"], pager: ReturnType<typeof listPager>, rowActions: ReturnType<typeof useProjectionListActions>["rowActions"]): {
|
|
14
|
+
screenPadding: boolean;
|
|
15
|
+
chromeless: boolean;
|
|
16
|
+
scrollBody?: boolean | undefined;
|
|
17
|
+
pager?: {
|
|
18
|
+
readonly page: number;
|
|
19
|
+
readonly limit: number;
|
|
20
|
+
readonly total: number;
|
|
21
|
+
readonly onPageChange: (next: number) => void;
|
|
22
|
+
readonly pageSizeOptions?: readonly number[];
|
|
23
|
+
readonly onPageSizeChange?: (next: number) => void;
|
|
24
|
+
} | undefined;
|
|
25
|
+
rowActions?: readonly import("../primitives.tsx").DataTableRowAction[] | undefined;
|
|
26
|
+
rowActionMode?: import("@cosmicdrift/kumiko-framework/ui-types").RowActionMode | undefined;
|
|
27
|
+
} | {
|
|
28
|
+
screenPadding: boolean;
|
|
29
|
+
scrollBody?: boolean | undefined;
|
|
30
|
+
pager?: {
|
|
31
|
+
readonly page: number;
|
|
32
|
+
readonly limit: number;
|
|
33
|
+
readonly total: number;
|
|
34
|
+
readonly onPageChange: (next: number) => void;
|
|
35
|
+
readonly pageSizeOptions?: readonly number[];
|
|
36
|
+
readonly onPageSizeChange?: (next: number) => void;
|
|
37
|
+
} | undefined;
|
|
38
|
+
rowActions?: readonly import("../primitives.tsx").DataTableRowAction[] | undefined;
|
|
39
|
+
rowActionMode?: import("@cosmicdrift/kumiko-framework/ui-types").RowActionMode | undefined;
|
|
40
|
+
};
|
|
41
|
+
export declare function projectionActionProps(actions: ReturnType<typeof useProjectionListActions>, translate: Translate | undefined, wrappedOnRowClick: ((row: ListRowViewModel) => void) | undefined): {
|
|
42
|
+
bulk?: import("../data-table-bulk-types.ts").DataTableBulk | undefined;
|
|
43
|
+
toolbarActions?: readonly import("../components/render-list-toolbar-action.tsx").ToolbarActionButton[] | undefined;
|
|
44
|
+
translate?: Translate | undefined;
|
|
45
|
+
onRowClick?: ((row: ListRowViewModel) => void) | undefined;
|
|
46
|
+
};
|
|
47
|
+
export declare function projectionFacetProps(filterFacets: ReturnType<typeof useProjectionListData>["filterFacets"], dateRangeFacets: ReturnType<typeof useProjectionListQuery>["dateRangeFacets"], onDateRangeChange: ReturnType<typeof useProjectionListQuery>["handleDateRangeChange"], urlState: ListUrlStateApi): {
|
|
48
|
+
filterFacets?: import("../data-table-facet-types.ts").DataTableFacet[] | undefined;
|
|
49
|
+
onFilterChange?: ((field: string, values: readonly string[]) => void) | undefined;
|
|
50
|
+
dateRangeFacets?: import("../data-table-facet-types.ts").DataTableDateRangeFacet[] | undefined;
|
|
51
|
+
onDateRangeChange?: ((field: string, bound: "from" | "to", value: string) => void) | undefined;
|
|
52
|
+
};
|
|
53
|
+
export declare function projectionFilterStateProps(filterFacets: ReturnType<typeof useProjectionListData>["filterFacets"], dateRangeFacets: ReturnType<typeof useProjectionListQuery>["dateRangeFacets"], urlState: ListUrlStateApi): {
|
|
54
|
+
filterValues?: Readonly<Record<string, readonly string[]>> | undefined;
|
|
55
|
+
onFilterReset?: (() => void) | undefined;
|
|
56
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { screenFillsHeight } from "../screen-fills-height.js";
|
|
2
|
+
export function projectionLeadProps(screen, effectiveTranslate, emptyContent) {
|
|
3
|
+
return {
|
|
4
|
+
...(screen.description !== undefined && {
|
|
5
|
+
description: effectiveTranslate(screen.description),
|
|
6
|
+
}),
|
|
7
|
+
...(emptyContent !== undefined && { emptyContent }),
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function projectionLayoutProps(isEmbeddedScreen, screen, listScreen, pager, rowActions) {
|
|
11
|
+
return {
|
|
12
|
+
...(isEmbeddedScreen ? { screenPadding: false, chromeless: true } : { screenPadding: true }),
|
|
13
|
+
...(screenFillsHeight(listScreen) && { scrollBody: true }),
|
|
14
|
+
...(pager !== undefined && { pager }),
|
|
15
|
+
...(rowActions !== undefined && { rowActions }),
|
|
16
|
+
...(screen.rowActionMode !== undefined && { rowActionMode: screen.rowActionMode }),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function projectionActionProps(actions, translate, wrappedOnRowClick) {
|
|
20
|
+
const { bulk, toolbarActions } = actions;
|
|
21
|
+
return {
|
|
22
|
+
...(bulk !== undefined && { bulk }),
|
|
23
|
+
...(toolbarActions !== undefined && { toolbarActions }),
|
|
24
|
+
...(translate !== undefined && { translate }),
|
|
25
|
+
...(wrappedOnRowClick !== undefined && { onRowClick: wrappedOnRowClick }),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function projectionFacetProps(filterFacets, dateRangeFacets, onDateRangeChange, urlState) {
|
|
29
|
+
return {
|
|
30
|
+
...(filterFacets.length > 0 && {
|
|
31
|
+
filterFacets,
|
|
32
|
+
onFilterChange: urlState.setFilter,
|
|
33
|
+
}),
|
|
34
|
+
...(dateRangeFacets.length > 0 && {
|
|
35
|
+
dateRangeFacets,
|
|
36
|
+
onDateRangeChange,
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function projectionFilterStateProps(filterFacets, dateRangeFacets, urlState) {
|
|
41
|
+
return {
|
|
42
|
+
...((filterFacets.length > 0 || dateRangeFacets.length > 0) && {
|
|
43
|
+
filterValues: urlState.filters,
|
|
44
|
+
onFilterReset: urlState.clearFilters,
|
|
45
|
+
}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ProjectionListScreenDefinition } from "@cosmicdrift/kumiko-framework/ui-types";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import type { ListRowViewModel, Translate } from "../headless/index.ts";
|
|
4
|
+
import type { usePrimitives } from "../primitives.tsx";
|
|
5
|
+
import type { FeatureSchema } from "./feature-schema.ts";
|
|
6
|
+
import type { useProjectionListActions } from "./use-projection-list-actions.ts";
|
|
7
|
+
import type { useProjectionListData } from "./use-projection-list-data.ts";
|
|
8
|
+
import type { useProjectionListDefinitions } from "./use-projection-list-definitions.ts";
|
|
9
|
+
import type { useProjectionListQuery } from "./use-projection-list-query.ts";
|
|
10
|
+
import type { listPager, ScreenListRows } from "./use-screen-list-rows.ts";
|
|
11
|
+
export type ProjectionListRenderModel = {
|
|
12
|
+
readonly schema: FeatureSchema;
|
|
13
|
+
readonly screen: ProjectionListScreenDefinition;
|
|
14
|
+
readonly translate: Translate | undefined;
|
|
15
|
+
readonly effectiveTranslate: Translate;
|
|
16
|
+
readonly isEmbeddedScreen: boolean;
|
|
17
|
+
readonly definitions: ReturnType<typeof useProjectionListDefinitions>;
|
|
18
|
+
readonly query: ReturnType<typeof useProjectionListQuery>;
|
|
19
|
+
readonly data: ReturnType<typeof useProjectionListData>;
|
|
20
|
+
readonly actions: ReturnType<typeof useProjectionListActions>;
|
|
21
|
+
readonly pager: ReturnType<typeof listPager>;
|
|
22
|
+
readonly wrappedOnRowClick: ((row: ListRowViewModel) => void) | undefined;
|
|
23
|
+
};
|
|
24
|
+
export declare function renderQueryRetryBanner(listRows: ScreenListRows, error: NonNullable<ScreenListRows["error"]>, effectiveTranslate: Translate): ReactNode;
|
|
25
|
+
export declare function renderBadShapeBanner(screen: ProjectionListScreenDefinition, primitives: Pick<ReturnType<typeof usePrimitives>, "Banner" | "Text">): ReactNode;
|
|
26
|
+
export declare function renderProjectionList(model: ProjectionListRenderModel): ReactNode;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { RenderList } from "../components/render-list.js";
|
|
3
|
+
import { isListNarrowed } from "./list-empty-content.js";
|
|
4
|
+
import { projectionActionProps, projectionFacetProps, projectionFilterStateProps, projectionLayoutProps, projectionLeadProps, } from "./projection-list-render-props.js";
|
|
5
|
+
import { QueryErrorBanner } from "./query-state-banners.js";
|
|
6
|
+
export function renderQueryRetryBanner(listRows, error, effectiveTranslate) {
|
|
7
|
+
return _jsx(QueryErrorBanner, { error: error, translate: effectiveTranslate, onRetry: listRows.retry });
|
|
8
|
+
}
|
|
9
|
+
export function renderBadShapeBanner(screen, primitives) {
|
|
10
|
+
const { Banner, Text } = primitives;
|
|
11
|
+
return (_jsxs(Banner, { padded: true, variant: "error", testId: "kumiko-screen-projection-list-bad-shape", children: ["Screen ", _jsx(Text, { variant: "code", children: screen.id }), " query", " ", _jsx(Text, { variant: "code", children: screen.query }), " did not return a PagedRows envelope; a projectionList query must return ", _jsx(Text, { variant: "code", children: "{ rows, nextCursor }" }), "."] }));
|
|
12
|
+
}
|
|
13
|
+
export function renderProjectionList(model) {
|
|
14
|
+
const { schema, screen, translate, effectiveTranslate, isEmbeddedScreen } = model;
|
|
15
|
+
const { definitions, query, data, actions, pager, wrappedOnRowClick } = model;
|
|
16
|
+
const { urlState } = query;
|
|
17
|
+
const { filterFacets, listRows, listTable } = data;
|
|
18
|
+
const { dateRangeFacets } = query;
|
|
19
|
+
return (_jsx(RenderList, { screen: definitions.listScreen, entity: definitions.entity, rows: listRows.rows, featureName: schema.featureName, searchable: definitions.searchable, narrowed: isListNarrowed(query.activeSearch, urlState.filters), ...projectionLeadProps(screen, effectiveTranslate, actions.emptyContent), searchValue: urlState.q, onSearchChange: urlState.setQ, sort: query.activeSort, onSortChange: urlState.setSort, ...projectionLayoutProps(isEmbeddedScreen, screen, definitions.listScreen, pager, actions.rowActions), ...projectionActionProps(actions, translate, wrappedOnRowClick), ...projectionFacetProps(filterFacets, dateRangeFacets, query.handleDateRangeChange, urlState), ...listTable.props, ...projectionFilterStateProps(filterFacets, dateRangeFacets, urlState) }));
|
|
20
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProjectionListScreenDefinition, RowActionNavigate } from "@cosmicdrift/kumiko-framework/ui-types";
|
|
2
|
+
import type { ListRowViewModel } from "../headless/index.ts";
|
|
3
|
+
import type { useDrawerAction } from "./action-form-body.tsx";
|
|
4
|
+
type RowClickInput = {
|
|
5
|
+
readonly screen: ProjectionListScreenDefinition;
|
|
6
|
+
readonly onRowClick: ((row: ListRowViewModel, entityName: string) => void) | undefined;
|
|
7
|
+
readonly entityName: string;
|
|
8
|
+
readonly openDrawer: ReturnType<typeof useDrawerAction>["openDrawer"];
|
|
9
|
+
readonly runNavigate: (action: RowActionNavigate, row: ListRowViewModel) => unknown;
|
|
10
|
+
};
|
|
11
|
+
export declare function resolveWrappedRowClick(input: RowClickInput): ((row: ListRowViewModel) => void) | undefined;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { findRowClickAction, runDrawerRowAction } from "./row-actions.js";
|
|
2
|
+
export function resolveWrappedRowClick(input) {
|
|
3
|
+
const { screen, onRowClick, entityName, openDrawer, runNavigate } = input;
|
|
4
|
+
const rowClickAction = findRowClickAction(screen.rowActions);
|
|
5
|
+
if (rowClickAction) {
|
|
6
|
+
return (row) => rowClickAction.kind === "drawer"
|
|
7
|
+
? runDrawerRowAction(rowClickAction, openDrawer, row)
|
|
8
|
+
: runNavigate(rowClickAction, row);
|
|
9
|
+
}
|
|
10
|
+
// skip: no row-click wiring when neither the screen nor the host supplies a handler
|
|
11
|
+
if (onRowClick === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
return (row) => onRowClick(row, entityName);
|
|
14
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ProjectionDetailScreenDefinition, RowAction } from "@cosmicdrift/kumiko-framework/ui-types";
|
|
2
|
+
import type { RenderEditAction } from "../components/render-edit.tsx";
|
|
3
|
+
import type { useOptionalDispatcher } from "../context/dispatcher-context.tsx";
|
|
4
|
+
import type { useUserRoles } from "../context/user-roles-context.tsx";
|
|
5
|
+
import type { Translate } from "../headless/index.ts";
|
|
6
|
+
import type { useDrawerAction } from "./action-form-body.tsx";
|
|
7
|
+
import type { useAppFeatures } from "./app-features-context.tsx";
|
|
8
|
+
import type { useClientActionRuntime } from "./client-actions.tsx";
|
|
9
|
+
import type { FeatureSchema } from "./feature-schema.ts";
|
|
10
|
+
import type { NavApi } from "./nav.tsx";
|
|
11
|
+
import { type useReturnHost, type useReturnTarget } from "./return-to.tsx";
|
|
12
|
+
import type { useProjectionDetailData } from "./use-projection-detail-data.ts";
|
|
13
|
+
type DetailActionsInput = {
|
|
14
|
+
readonly schema: FeatureSchema;
|
|
15
|
+
readonly screen: ProjectionDetailScreenDefinition & {
|
|
16
|
+
readonly detailFor?: string;
|
|
17
|
+
};
|
|
18
|
+
readonly effectiveTranslate: Translate;
|
|
19
|
+
readonly effectiveEntityId: string | undefined;
|
|
20
|
+
readonly nav: NavApi;
|
|
21
|
+
readonly host: ReturnType<typeof useReturnHost>;
|
|
22
|
+
readonly dispatcher: ReturnType<typeof useOptionalDispatcher>;
|
|
23
|
+
readonly clientActions: ReturnType<typeof useClientActionRuntime>;
|
|
24
|
+
readonly appFeatures: ReturnType<typeof useAppFeatures>;
|
|
25
|
+
readonly userRoles: ReturnType<typeof useUserRoles>;
|
|
26
|
+
readonly returnTarget: ReturnType<typeof useReturnTarget> | undefined;
|
|
27
|
+
readonly openDrawer: ReturnType<typeof useDrawerAction>["openDrawer"];
|
|
28
|
+
readonly detailQuery: ReturnType<typeof useProjectionDetailData>["detailQuery"];
|
|
29
|
+
readonly reloadDetail: ReturnType<typeof useProjectionDetailData>["reloadDetail"];
|
|
30
|
+
};
|
|
31
|
+
export declare function useProjectionDetailActions(input: DetailActionsInput): {
|
|
32
|
+
buildSectionActions: (actions: readonly RowAction[]) => readonly RenderEditAction[] | undefined;
|
|
33
|
+
headerActions: readonly RenderEditAction[] | undefined;
|
|
34
|
+
};
|
|
35
|
+
export {};
|