@burojs/ui-shadcn 0.5.0 → 0.7.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/README.md +9 -0
- package/dist/bulk-summary-BWSAS7k2.js +143 -0
- package/dist/bulk-summary-BWSAS7k2.js.map +1 -0
- package/dist/bulk-summary-CrEij5vq.cjs +143 -0
- package/dist/bulk-summary-CrEij5vq.cjs.map +1 -0
- package/dist/candidates-relation-picker-CS_JZ4Fd.js +31 -0
- package/dist/candidates-relation-picker-CS_JZ4Fd.js.map +1 -0
- package/dist/candidates-relation-picker-y5M6_oe4.cjs +31 -0
- package/dist/candidates-relation-picker-y5M6_oe4.cjs.map +1 -0
- package/dist/{check-confirm-dialog-CkaVTPT9.js → check-confirm-dialog-2j0gOd7x.js} +392 -103
- package/dist/check-confirm-dialog-2j0gOd7x.js.map +1 -0
- package/dist/{check-confirm-dialog-BRByTFpg.cjs → check-confirm-dialog-C-NHgMST.cjs} +476 -102
- package/dist/check-confirm-dialog-C-NHgMST.cjs.map +1 -0
- package/dist/{dialog-B_rt9S1c.js → dialog-C123sVQ8.js} +4 -4
- package/dist/dialog-C123sVQ8.js.map +1 -0
- package/dist/{dialog-DRNUq9EA.cjs → dialog-vmMdfUWs.cjs} +3 -3
- package/dist/dialog-vmMdfUWs.cjs.map +1 -0
- package/dist/{filter-builder-B3mZFL-K.cjs → filter-builder-DFu0JP-1.cjs} +959 -128
- package/dist/filter-builder-DFu0JP-1.cjs.map +1 -0
- package/dist/{filter-builder-DOnaXNfP.js → filter-builder-DaWHUZuV.js} +863 -116
- package/dist/filter-builder-DaWHUZuV.js.map +1 -0
- package/dist/{flow-runtime-B6zOHYqI.cjs → flow-runtime-BpmrIUb6.cjs} +61 -29
- package/dist/flow-runtime-BpmrIUb6.cjs.map +1 -0
- package/dist/{flow-runtime-D8h99FSg.js → flow-runtime-DyqTmK3H.js} +62 -30
- package/dist/flow-runtime-DyqTmK3H.js.map +1 -0
- package/dist/{flow-screen-CX05b3G9.cjs → flow-screen-Bcz9NF2V.cjs} +132 -88
- package/dist/flow-screen-Bcz9NF2V.cjs.map +1 -0
- package/dist/{flow-screen-CmbARSqg.js → flow-screen-DCdli6Ha.js} +132 -88
- package/dist/flow-screen-DCdli6Ha.js.map +1 -0
- package/dist/index.cjs +951 -605
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +618 -332
- package/dist/index.d.ts +618 -332
- package/dist/index.js +863 -522
- package/dist/index.js.map +1 -1
- package/dist/{inline-flow-host-B7U1OJUe.cjs → inline-flow-host-3vw7LzzD.cjs} +5 -5
- package/dist/inline-flow-host-3vw7LzzD.cjs.map +1 -0
- package/dist/{inline-flow-host-C3H2UpSA.js → inline-flow-host-C0rI9B7f.js} +5 -5
- package/dist/inline-flow-host-C0rI9B7f.js.map +1 -0
- package/dist/label-66W1qbke.js.map +1 -1
- package/dist/label-w6JYf2cF.cjs.map +1 -1
- package/dist/lazy-relation-picker-dialog-Bt8lrEIu.cjs +153 -0
- package/dist/lazy-relation-picker-dialog-Bt8lrEIu.cjs.map +1 -0
- package/dist/lazy-relation-picker-dialog-CAScLPb2.js +135 -0
- package/dist/lazy-relation-picker-dialog-CAScLPb2.js.map +1 -0
- package/dist/markdown/index.d.cts +2 -3
- package/dist/markdown/index.d.ts +2 -3
- package/dist/{page-flow-route-CyXSvXSE.js → page-flow-route-BHUEpn0I.js} +36 -23
- package/dist/page-flow-route-BHUEpn0I.js.map +1 -0
- package/dist/{page-flow-route-CQ7HsbBm.cjs → page-flow-route-DS8IVTVH.cjs} +41 -28
- package/dist/page-flow-route-DS8IVTVH.cjs.map +1 -0
- package/dist/{place-node-SIp4XYQH.cjs → place-node-CNb3w-c7.cjs} +2227 -999
- package/dist/place-node-CNb3w-c7.cjs.map +1 -0
- package/dist/{place-node--GdsP688.js → place-node-CfzQvh4Y.js} +2164 -984
- package/dist/place-node-CfzQvh4Y.js.map +1 -0
- package/dist/{related-list-cards-B6x9HQQp.js → related-list-cards-BIqqY69Y.js} +9 -4
- package/dist/{related-list-cards-B6x9HQQp.js.map → related-list-cards-BIqqY69Y.js.map} +1 -1
- package/dist/{related-list-cards-nxuODlIA.cjs → related-list-cards-CelMxl4q.cjs} +9 -4
- package/dist/{related-list-cards-nxuODlIA.cjs.map → related-list-cards-CelMxl4q.cjs.map} +1 -1
- package/dist/{related-list-timeline-DEdfd-rr.js → related-list-timeline-CRh7xwLD.js} +6 -7
- package/dist/related-list-timeline-CRh7xwLD.js.map +1 -0
- package/dist/{related-list-timeline-BYJKEbmA.cjs → related-list-timeline-DsLdi8sv.cjs} +5 -6
- package/dist/related-list-timeline-DsLdi8sv.cjs.map +1 -0
- package/dist/{related-rows-B4levHcR.js → related-rows--uP2iKQC.js} +27 -17
- package/dist/related-rows--uP2iKQC.js.map +1 -0
- package/dist/{related-rows-zh5f_4QR.cjs → related-rows-MPnLCmPF.cjs} +32 -22
- package/dist/related-rows-MPnLCmPF.cjs.map +1 -0
- package/dist/{search-access-CURsWn-U.js → relation-create-C43cdPQt.js} +596 -29
- package/dist/relation-create-C43cdPQt.js.map +1 -0
- package/dist/{search-access-B7G5oR8n.cjs → relation-create-DDEYcKfw.cjs} +630 -32
- package/dist/relation-create-DDEYcKfw.cjs.map +1 -0
- package/dist/{relation-many-picker-gdAOD-qK.js → relation-many-picker-BJhaEqxz.js} +210 -107
- package/dist/relation-many-picker-BJhaEqxz.js.map +1 -0
- package/dist/{relation-many-picker-B-NCEUgX.cjs → relation-many-picker-DzuGJpEl.cjs} +218 -115
- package/dist/relation-many-picker-DzuGJpEl.cjs.map +1 -0
- package/dist/{relation-picker-BAY77ivO.js → relation-picker-D-tBBZW_.js} +40 -45
- package/dist/relation-picker-D-tBBZW_.js.map +1 -0
- package/dist/{relation-picker-Da_uhFvA.cjs → relation-picker-DaIMzf2H.cjs} +45 -50
- package/dist/relation-picker-DaIMzf2H.cjs.map +1 -0
- package/dist/{relation-picker-dialog-M0pQaWlp.cjs → relation-picker-dialog-9Vg5vvR1.cjs} +142 -40
- package/dist/relation-picker-dialog-9Vg5vvR1.cjs.map +1 -0
- package/dist/{relation-picker-dialog-hA9rYrZB.js → relation-picker-dialog-DoEY8EkH.js} +143 -41
- package/dist/relation-picker-dialog-DoEY8EkH.js.map +1 -0
- package/dist/relation-select-B8Fq4o-t.js +48 -0
- package/dist/relation-select-B8Fq4o-t.js.map +1 -0
- package/dist/relation-select-Cr3CfNLy.cjs +55 -0
- package/dist/relation-select-Cr3CfNLy.cjs.map +1 -0
- package/dist/{resource-page-router-OSQyRA5b.cjs → resource-page-router-C_kGW2o_.cjs} +552 -303
- package/dist/resource-page-router-C_kGW2o_.cjs.map +1 -0
- package/dist/{resource-page-router-T4vS5gbJ.js → resource-page-router-Diw6S6TK.js} +507 -258
- package/dist/resource-page-router-Diw6S6TK.js.map +1 -0
- package/dist/{rich-text-vTyVjDoa.cjs → rich-text-C_7JCvRo.cjs} +2 -2
- package/dist/{rich-text-vTyVjDoa.cjs.map → rich-text-C_7JCvRo.cjs.map} +1 -1
- package/dist/{rich-text-DFerywgz.js → rich-text-RcPBf6hr.js} +2 -2
- package/dist/{rich-text-DFerywgz.js.map → rich-text-RcPBf6hr.js.map} +1 -1
- package/dist/success-notices-Dl3M1fZP.cjs +46 -0
- package/dist/success-notices-Dl3M1fZP.cjs.map +1 -0
- package/dist/success-notices-LDEgEkc4.js +41 -0
- package/dist/success-notices-LDEgEkc4.js.map +1 -0
- package/dist/{toaster-C7CiYA4Z.cjs → toaster-BbByOytP.cjs} +72 -80
- package/dist/toaster-BbByOytP.cjs.map +1 -0
- package/dist/{toaster-CfCRLgR-.js → toaster-Ct_YHGs6.js} +66 -68
- package/dist/toaster-Ct_YHGs6.js.map +1 -0
- package/dist/{use-dialog-filter-state-BDcgS5Oz.js → use-dialog-filter-state-B_MqzHaT.js} +5 -4
- package/dist/use-dialog-filter-state-B_MqzHaT.js.map +1 -0
- package/dist/{use-dialog-filter-state-BBCC0OEK.cjs → use-dialog-filter-state-tNvqAAjh.cjs} +6 -5
- package/dist/use-dialog-filter-state-tNvqAAjh.cjs.map +1 -0
- package/dist/use-theme-DFlpXils.cjs.map +1 -1
- package/dist/use-theme-dnE3Od3I.js.map +1 -1
- package/package.json +11 -11
- package/dist/bulk-summary-CwSd6Yjb.cjs +0 -108
- package/dist/bulk-summary-CwSd6Yjb.cjs.map +0 -1
- package/dist/bulk-summary-GxMDP4bw.js +0 -108
- package/dist/bulk-summary-GxMDP4bw.js.map +0 -1
- package/dist/candidates-gate-CX2PBu6l.js +0 -63
- package/dist/candidates-gate-CX2PBu6l.js.map +0 -1
- package/dist/candidates-gate-DiFI52r7.cjs +0 -70
- package/dist/candidates-gate-DiFI52r7.cjs.map +0 -1
- package/dist/candidates-relation-picker-CBsVcnPR.js +0 -82
- package/dist/candidates-relation-picker-CBsVcnPR.js.map +0 -1
- package/dist/candidates-relation-picker-Dd_GVLlu.cjs +0 -84
- package/dist/candidates-relation-picker-Dd_GVLlu.cjs.map +0 -1
- package/dist/check-confirm-dialog-BRByTFpg.cjs.map +0 -1
- package/dist/check-confirm-dialog-CkaVTPT9.js.map +0 -1
- package/dist/dialog-B_rt9S1c.js.map +0 -1
- package/dist/dialog-DRNUq9EA.cjs.map +0 -1
- package/dist/filter-builder-B3mZFL-K.cjs.map +0 -1
- package/dist/filter-builder-DOnaXNfP.js.map +0 -1
- package/dist/flow-runtime-B6zOHYqI.cjs.map +0 -1
- package/dist/flow-runtime-D8h99FSg.js.map +0 -1
- package/dist/flow-screen-CX05b3G9.cjs.map +0 -1
- package/dist/flow-screen-CmbARSqg.js.map +0 -1
- package/dist/inline-flow-host-B7U1OJUe.cjs.map +0 -1
- package/dist/inline-flow-host-C3H2UpSA.js.map +0 -1
- package/dist/lazy-relation-picker-dialog-2oxnA6IR.js +0 -14
- package/dist/lazy-relation-picker-dialog-2oxnA6IR.js.map +0 -1
- package/dist/lazy-relation-picker-dialog-BfAGKzUG.cjs +0 -19
- package/dist/lazy-relation-picker-dialog-BfAGKzUG.cjs.map +0 -1
- package/dist/page-flow-route-CQ7HsbBm.cjs.map +0 -1
- package/dist/page-flow-route-CyXSvXSE.js.map +0 -1
- package/dist/peek-filter-CnqHwTMU.cjs +0 -51
- package/dist/peek-filter-CnqHwTMU.cjs.map +0 -1
- package/dist/peek-filter-ErLfO153.js +0 -28
- package/dist/peek-filter-ErLfO153.js.map +0 -1
- package/dist/place-node--GdsP688.js.map +0 -1
- package/dist/place-node-SIp4XYQH.cjs.map +0 -1
- package/dist/related-list-timeline-BYJKEbmA.cjs.map +0 -1
- package/dist/related-list-timeline-DEdfd-rr.js.map +0 -1
- package/dist/related-rows-B4levHcR.js.map +0 -1
- package/dist/related-rows-zh5f_4QR.cjs.map +0 -1
- package/dist/relation-create-BOaUe12G.cjs +0 -362
- package/dist/relation-create-BOaUe12G.cjs.map +0 -1
- package/dist/relation-create-Bg-eEJLs.js +0 -337
- package/dist/relation-create-Bg-eEJLs.js.map +0 -1
- package/dist/relation-many-picker-B-NCEUgX.cjs.map +0 -1
- package/dist/relation-many-picker-gdAOD-qK.js.map +0 -1
- package/dist/relation-picker-BAY77ivO.js.map +0 -1
- package/dist/relation-picker-Da_uhFvA.cjs.map +0 -1
- package/dist/relation-picker-dialog-M0pQaWlp.cjs.map +0 -1
- package/dist/relation-picker-dialog-hA9rYrZB.js.map +0 -1
- package/dist/resource-page-router-OSQyRA5b.cjs.map +0 -1
- package/dist/resource-page-router-T4vS5gbJ.js.map +0 -1
- package/dist/search-access-B7G5oR8n.cjs.map +0 -1
- package/dist/search-access-CURsWn-U.js.map +0 -1
- package/dist/shell-BPlk8hEa.js +0 -205
- package/dist/shell-BPlk8hEa.js.map +0 -1
- package/dist/shell-DxhlsPwm.cjs +0 -271
- package/dist/shell-DxhlsPwm.cjs.map +0 -1
- package/dist/toaster-C7CiYA4Z.cjs.map +0 -1
- package/dist/toaster-CfCRLgR-.js.map +0 -1
- package/dist/use-dialog-filter-state-BBCC0OEK.cjs.map +0 -1
- package/dist/use-dialog-filter-state-BDcgS5Oz.js.map +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { t as THEME_STORAGE_KEY } from "./theme-storage-key-pYlp4aDS.cjs";
|
|
2
|
+
import { webPlatform } from "@burojs/react/web";
|
|
2
3
|
import * as React$1 from "react";
|
|
3
|
-
import { AnchorHTMLAttributes,
|
|
4
|
-
import { ActionDensity, AnyFrameHandle, AppRuntime, AuthResult, Check, CheckSurface, CustomPageDef, DraftOption, EntityRef, ErasedResourceHandle, ExportArtifact, ExportTarget, FieldDeclaration, FilterExpression, FilterGroup, FilterOperator, FixedFilterInput, FormBody, FrameHandle, HrefOpts, I18nCaps, NavGroupDef, NavNode, PortableValue, RelationOpen, ResolvedFixedFilter, ResourceDef, ResourceFieldMap, ResourceHandle, RouteMatch, SavedViewDef, ScreenMode, ScreenSources, SearchDecl, SectionDef, SortExpression, StandardSchemaV1, TaskRunReport, UiSettingsIssue,
|
|
5
|
-
import { BlockImplementationCatalog, CheckGateState, CollectionDisplayProps, CollectionInputProps, DEFAULT_LANGUAGE_STORAGE_KEY, FieldBinding, FieldImplementation, FieldImplementationLayout, FieldPresentation, FilterFieldSpec, FilterKind, FormValues, QuickSettledRow, RowRecord, SavedViewEntry, ScalarDisplayProps, ScalarInputProps, UIPresentationHostProps, UIPresentationHosts, UseFormControllerFormOptions, modeForSurface } from "@burojs/react";
|
|
4
|
+
import { AnchorHTMLAttributes, ComponentType, JSX, ReactElement, ReactNode, SVGProps } from "react";
|
|
5
|
+
import { ActionDensity, AnyFrameHandle, AppRuntime, AuthResult, Check, CheckSurface, CustomPageDef, DraftOption, EntityRef, EnumControl, EnumNameOrRef, ErasedResourceHandle, ExportArtifact, ExportTarget, FieldDeclaration, FilterExpression, FilterGroup, FilterOperator, FixedFilterInput, FormBody, FrameHandle, HrefOpts, I18nCaps, NavGroupDef, NavNode, PortableValue, RecordId, RelationCandidate, RelationOpen, ResolvedColumnUi, ResolvedFixedFilter, ResourceDef, ResourceFieldMap, ResourceHandle, ResourceHandleOf, ResourceNameArg, ResourceNameOrRef, ResourceRefArg, RouteMatch, SavedViewDef, ScopeSource, ScreenMode, ScreenSources, SearchDecl, SectionDef, SortExpression, StandardSchemaV1, TaskRunReport, UiSettingsIssue, UiSurface, ValidationIssues, i18nPrefixToRef } from "@burojs/core";
|
|
6
|
+
import { BlockImplementationCatalog, CheckGateState, CollectionDisplayProps, CollectionInputProps, DEFAULT_LANGUAGE_STORAGE_KEY, FieldBinding, FieldImplementation, FieldImplementationLayout, FieldLinkState, FieldPresentation, FilterFieldSpec, FilterKind, FormSubmitContext, FormValues, ListOptionFilter, QuickSettledRow, RowRecord, SavedViewEntry, ScalarDisplayProps, ScalarInputProps, UIPresentationHostProps, UIPresentationHosts, UseFormControllerFormOptions, modeForSurface } from "@burojs/react";
|
|
6
7
|
import { ToasterProps as ToasterProps$1, toast } from "sonner";
|
|
7
8
|
import { z } from "zod";
|
|
8
9
|
import { isImage } from "@burojs/file-storage";
|
|
@@ -110,9 +111,9 @@ interface DocTrailHelpProps {
|
|
|
110
111
|
*
|
|
111
112
|
* Two things it does that per-entity icons structurally cannot:
|
|
112
113
|
*
|
|
113
|
-
* - **The trail is a CHAIN.**
|
|
114
|
+
* - **The trail is a CHAIN.** «Documents › wo:2921 › Codes» names two
|
|
114
115
|
* documented resources, and one control can offer both.
|
|
115
|
-
* - **It survives sub-pages.** On
|
|
116
|
+
* - **It survives sub-pages.** On «Documents › Creation» there is no record and
|
|
116
117
|
* no fields yet, but the reader can still reach the resource's help — which
|
|
117
118
|
* is exactly when they are most likely to want it.
|
|
118
119
|
*
|
|
@@ -257,9 +258,9 @@ interface NavMainProps {
|
|
|
257
258
|
*
|
|
258
259
|
* `null` renders NO heading — the entries sit bare above the first named
|
|
259
260
|
* section. That is the right shape when the block holds the two or three
|
|
260
|
-
* places a user starts from (
|
|
261
|
-
* over them has to invent a category, and every word that fits (
|
|
262
|
-
*
|
|
261
|
+
* places a user starts from («Home», the codes, the products): an eyebrow
|
|
262
|
+
* over them has to invent a category, and every word that fits («Resources»,
|
|
263
|
+
* «Misc») is less informative than the item names already are.
|
|
263
264
|
*
|
|
264
265
|
* Omitted → the framework's own `nav.resources` string, as before.
|
|
265
266
|
*/
|
|
@@ -353,7 +354,10 @@ declare function useLayout(key: string): NavLayout | undefined;
|
|
|
353
354
|
/**
|
|
354
355
|
* Non-hook-in-loop layout lookup: read the Components registry once, return a
|
|
355
356
|
* resolver `(key) => NavLayout | undefined`. Lets `NavChrome` resolve a
|
|
356
|
-
* variable-length group chain without violating Rules of Hooks.
|
|
357
|
+
* variable-length group chain without violating Rules of Hooks. The registry
|
|
358
|
+
* (`layout.<key>`) wins; the built-ins (`secondary-sidebar`, `tabs`) are the
|
|
359
|
+
* fallback, so they work without registration. `flat` and `collapsible` resolve
|
|
360
|
+
* to nothing: they are main-sidebar-only groupings.
|
|
357
361
|
*/
|
|
358
362
|
declare function useLayoutResolver(): (key: string) => NavLayout | undefined;
|
|
359
363
|
//#endregion
|
|
@@ -417,44 +421,19 @@ interface NavChromeProps {
|
|
|
417
421
|
/**
|
|
418
422
|
* Wrap the active page in its group-chain chrome. Walks `match.groupChain`
|
|
419
423
|
* innermost→outermost, wrapping the accumulating content in each group's
|
|
420
|
-
*
|
|
421
|
-
*
|
|
422
|
-
*
|
|
424
|
+
* content layout (secondary-sidebar / tabs). Groups whose layout has no
|
|
425
|
+
* content renderer (flat / collapsible — main-sidebar only) contribute no
|
|
426
|
+
* wrapping. No match → children bare (`/login`, a host's own routes).
|
|
427
|
+
*
|
|
428
|
+
* Mount it ONCE in the persistent layout, around whatever the router renders —
|
|
429
|
+
* `AppShell` does this by default. Moving within an area keeps the outer layout
|
|
430
|
+
* element at the same type and position, so React reconciles it in place: the
|
|
431
|
+
* secondary sidebar stays the same DOM node and only its active item changes.
|
|
432
|
+
* Output depends only on the registry, the adapter's pathname and i18n — no
|
|
433
|
+
* effect decides it, so it renders on the server as on the client.
|
|
423
434
|
*/
|
|
424
435
|
declare function NavChrome({ children, entryFilter, icons }: NavChromeProps): ReactElement;
|
|
425
436
|
//#endregion
|
|
426
|
-
//#region src/layout/nav-chrome-boundary.d.ts
|
|
427
|
-
declare function useNavChromeBoundary(): ReadonlySet<string>;
|
|
428
|
-
/**
|
|
429
|
-
* Merge `claim` into the ancestor boundary set and provide it downward. Nested
|
|
430
|
-
* NavAreaLayouts compose: each adds its own group (+ ancestors) to the set.
|
|
431
|
-
*/
|
|
432
|
-
declare function NavChromeBoundaryProvider({ claim, children }: {
|
|
433
|
-
claim: readonly string[];
|
|
434
|
-
children: ReactNode;
|
|
435
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
436
|
-
//#endregion
|
|
437
|
-
//#region src/layout/nav-area-layout.d.ts
|
|
438
|
-
interface NavAreaLayoutProps {
|
|
439
|
-
groupName: string;
|
|
440
|
-
children: ReactNode;
|
|
441
|
-
entryFilter?: (node: {
|
|
442
|
-
name: string;
|
|
443
|
-
}) => boolean;
|
|
444
|
-
icons?: BuildNavItemsArgs['icons'];
|
|
445
|
-
}
|
|
446
|
-
/**
|
|
447
|
-
* Persistent chrome for ONE group, meant to be rendered from a Next
|
|
448
|
-
* `layout.tsx` (so it reconciles across navigations within the area instead of
|
|
449
|
-
* remounting like the page does). Renders the group's registered content layout
|
|
450
|
-
* (active-state from the current match — the layout re-renders on navigation
|
|
451
|
-
* but does not remount, so internal state is preserved), and CLAIMS the group
|
|
452
|
-
* (+ its ancestors) in `NavChromeBoundary` so the descendant page `NavChrome`
|
|
453
|
-
* skips it (no double render). `chromeOn:'list'` groups still collapse on a
|
|
454
|
-
* resource detail action; the boundary claim holds regardless.
|
|
455
|
-
*/
|
|
456
|
-
declare function NavAreaLayout({ groupName, children, entryFilter, icons }: NavAreaLayoutProps): ReactElement;
|
|
457
|
-
//#endregion
|
|
458
437
|
//#region src/layout/resource-page-router.d.ts
|
|
459
438
|
interface ResourcePageRouterProps {
|
|
460
439
|
match: RouteMatch;
|
|
@@ -483,9 +462,11 @@ interface ResourcePageRouterProps {
|
|
|
483
462
|
*/
|
|
484
463
|
declare function ResourcePageRouter({ match }: ResourcePageRouterProps): ReactElement;
|
|
485
464
|
/**
|
|
486
|
-
*
|
|
487
|
-
*
|
|
488
|
-
*
|
|
465
|
+
* The page a host mounts: resolves the active route (`useMatch`, from the
|
|
466
|
+
* router adapter) and dispatches to the right framework component via
|
|
467
|
+
* `ResourcePageRouter`. Content only — the group-chain chrome (`NavChrome`)
|
|
468
|
+
* lives in the persistent layout around it (`AppShell` mounts it), so it
|
|
469
|
+
* survives navigation while this page remounts. No match → a not-found panel;
|
|
489
470
|
* no router adapter at all → the same panel, and in development one
|
|
490
471
|
* `console.error` naming `RouterAdapterProvider` (once per app), because
|
|
491
472
|
* then EVERY route is not-found. Wrapped in a `Suspense` boundary so a
|
|
@@ -502,12 +483,13 @@ declare function NavAreaPage(): ReactElement;
|
|
|
502
483
|
* `defaults` exists on `create` only: show and edit render the record as it
|
|
503
484
|
* is, so the type refuses it there rather than ignoring it.
|
|
504
485
|
*/
|
|
505
|
-
type RecordPageProps = {
|
|
506
|
-
|
|
486
|
+
type RecordPageProps<N extends string = string> = {
|
|
487
|
+
/** A name checked against the registered resources, or the entity ref. */
|
|
488
|
+
readonly resource?: ResourceNameOrRef<N>;
|
|
507
489
|
readonly action: Exclude<ScreenMode, 'create'>;
|
|
508
490
|
readonly defaults?: never;
|
|
509
491
|
} | {
|
|
510
|
-
readonly resource?:
|
|
492
|
+
readonly resource?: ResourceNameOrRef<N>;
|
|
511
493
|
readonly action?: Extract<ScreenMode, 'create'>;
|
|
512
494
|
/**
|
|
513
495
|
* The caller's tier of starting values, above each field's declared
|
|
@@ -528,7 +510,7 @@ type RecordPageProps = {
|
|
|
528
510
|
* `<ResourcePageRouter>` renders the record route itself; a different layout is a frame on the
|
|
529
511
|
* screen (`views.<mode>.frame`), never a replaced route (P6-56).
|
|
530
512
|
*/
|
|
531
|
-
declare function RecordPage(props: RecordPageProps): ReactElement;
|
|
513
|
+
declare function RecordPage<const N extends string = string>(props: RecordPageProps<N>): ReactElement;
|
|
532
514
|
//#endregion
|
|
533
515
|
//#region src/layout/record-breadcrumbs.d.ts
|
|
534
516
|
/**
|
|
@@ -552,13 +534,19 @@ declare function RecordPage(props: RecordPageProps): ReactElement;
|
|
|
552
534
|
declare function RecordBreadcrumbs(): ReactElement | null;
|
|
553
535
|
//#endregion
|
|
554
536
|
//#region src/record/record-screen.d.ts
|
|
555
|
-
type AnyResourceHandle = ResourceHandle<any, any, any, any>;
|
|
556
|
-
interface RecordScreenProps {
|
|
557
|
-
/**
|
|
558
|
-
|
|
537
|
+
type AnyResourceHandle$1 = ResourceHandle<any, any, any, any>;
|
|
538
|
+
interface RecordScreenProps<N extends string = string> {
|
|
539
|
+
/**
|
|
540
|
+
* The resource: its name (checked against the registered resources), its handle or its entity
|
|
541
|
+
* ref `{ namespace, id }`.
|
|
542
|
+
*/
|
|
543
|
+
readonly resource: ResourceNameArg<N> | AnyResourceHandle$1 | EntityRef;
|
|
559
544
|
readonly mode: 'show' | 'edit' | 'create';
|
|
560
|
-
/**
|
|
561
|
-
|
|
545
|
+
/**
|
|
546
|
+
* The record to read and write (show, edit), as its id field types it: a number for a numeric id
|
|
547
|
+
* field. Not needed when `record` is given.
|
|
548
|
+
*/
|
|
549
|
+
readonly recordId?: RecordId;
|
|
562
550
|
/**
|
|
563
551
|
* The accepted type of a typed create. Without a router, changing it remounts the form for the
|
|
564
552
|
* new type and discards unsaved input without asking for confirmation.
|
|
@@ -574,8 +562,12 @@ interface RecordScreenProps {
|
|
|
574
562
|
* (the form is dirty); any other key is dropped. Not a default, never trusted.
|
|
575
563
|
*/
|
|
576
564
|
readonly input?: Readonly<Record<string, unknown>>;
|
|
577
|
-
/**
|
|
578
|
-
|
|
565
|
+
/**
|
|
566
|
+
* Replaces the built-in update or create; receives the payload (the record's columns) and, as
|
|
567
|
+
* `context.links`, each inline link field's keys to add and remove; `context.idempotencyKey` and
|
|
568
|
+
* `context.resend` name the attempt (a resend of an unknown write keeps its key).
|
|
569
|
+
*/
|
|
570
|
+
readonly onSubmit?: (payload: Record<string, unknown>, context: FormSubmitContext) => Promise<unknown>;
|
|
579
571
|
/** Called after a successful submit with what the write returned. */
|
|
580
572
|
readonly onSuccess?: (result: unknown) => void;
|
|
581
573
|
/** Replaces Cancel's default back navigation. */
|
|
@@ -597,7 +589,7 @@ interface RecordScreenProps {
|
|
|
597
589
|
* `record` is given; writes with the resource's update or create unless
|
|
598
590
|
* `onSubmit` is given. A resource the app does not know renders not-found.
|
|
599
591
|
*/
|
|
600
|
-
declare function RecordScreen(props: RecordScreenProps): ReactElement;
|
|
592
|
+
declare function RecordScreen<const N extends string = string>(props: RecordScreenProps<N>): ReactElement;
|
|
601
593
|
//#endregion
|
|
602
594
|
//#region src/record/frame-pieces.d.ts
|
|
603
595
|
/**
|
|
@@ -622,11 +614,16 @@ declare const CopyId: () => ReactElement | null;
|
|
|
622
614
|
declare const FormActions: () => ReactElement | null;
|
|
623
615
|
//#endregion
|
|
624
616
|
//#region src/layout/default-nav-layouts.d.ts
|
|
625
|
-
/**
|
|
617
|
+
/**
|
|
618
|
+
* The built-in content-wrapping layouts as a Components-registry table.
|
|
619
|
+
*
|
|
620
|
+
* Optional: `secondary-sidebar` and `tabs` resolve without it. Spread it into
|
|
621
|
+
* `BuroProvider`'s `components` only to wrap or re-register the built-ins.
|
|
622
|
+
*/
|
|
626
623
|
declare const defaultNavLayouts: Record<string, NavLayout>;
|
|
627
624
|
//#endregion
|
|
628
625
|
//#region src/layout/context-picker.d.ts
|
|
629
|
-
interface
|
|
626
|
+
interface ContextPickerBase {
|
|
630
627
|
/**
|
|
631
628
|
* Slice name (also used in testid). Free-form — playground uses 'company',
|
|
632
629
|
* 'productGroup', 'location' etc.
|
|
@@ -638,8 +635,6 @@ interface ContextPickerProps {
|
|
|
638
635
|
value: string;
|
|
639
636
|
label: string;
|
|
640
637
|
}>;
|
|
641
|
-
value: string | null;
|
|
642
|
-
onChange: (value: string) => void;
|
|
643
638
|
placeholder?: string;
|
|
644
639
|
disabled?: boolean;
|
|
645
640
|
className?: string;
|
|
@@ -654,6 +649,19 @@ interface ContextPickerProps {
|
|
|
654
649
|
*/
|
|
655
650
|
hideLabel?: boolean;
|
|
656
651
|
}
|
|
652
|
+
type ContextPickerProps = (ContextPickerBase & {
|
|
653
|
+
allOption?: undefined;
|
|
654
|
+
value: string | null;
|
|
655
|
+
onChange: (value: string) => void;
|
|
656
|
+
}) | (ContextPickerBase & {
|
|
657
|
+
/**
|
|
658
|
+
* Adds an "All" item first: `true` labels it with the `scope.all` chrome string, a string
|
|
659
|
+
* is the label. `value: null` selects it and `onChange` receives `null` for it.
|
|
660
|
+
*/
|
|
661
|
+
allOption: true | string;
|
|
662
|
+
value: string | null;
|
|
663
|
+
onChange: (value: string | null) => void;
|
|
664
|
+
});
|
|
657
665
|
/**
|
|
658
666
|
* Generic context picker — a labeled dropdown that drives a slice value.
|
|
659
667
|
* Used in the sidebar / header to switch company, product group, location, etc.
|
|
@@ -661,7 +669,24 @@ interface ContextPickerProps {
|
|
|
661
669
|
* The component is presentational. Consumers wire it to whatever store they
|
|
662
670
|
* use (auth context, buro context engine, or local state).
|
|
663
671
|
*/
|
|
664
|
-
declare function ContextPicker({ sliceName, label, options, value, onChange, placeholder, disabled, className, hideLabel }: ContextPickerProps): React.ReactElement;
|
|
672
|
+
declare function ContextPicker({ sliceName, label, options, value, onChange, placeholder, disabled, className, hideLabel, allOption }: ContextPickerProps): React.ReactElement;
|
|
673
|
+
//#endregion
|
|
674
|
+
//#region src/layout/scope-dimension-picker.d.ts
|
|
675
|
+
interface ScopeDimensionPickerProps {
|
|
676
|
+
/** A key of `defineScope(...)`. */
|
|
677
|
+
dimension: string;
|
|
678
|
+
/** Falls back to `humanizeKey(dimension)`. */
|
|
679
|
+
label?: string;
|
|
680
|
+
hideLabel?: boolean;
|
|
681
|
+
className?: string;
|
|
682
|
+
}
|
|
683
|
+
/**
|
|
684
|
+
* The control for one scope dimension (read-scope spec 7c.3): the dimension's values as options,
|
|
685
|
+
* "All" first (nothing selected means everything allowed), writing `useScope().select`. A
|
|
686
|
+
* selection change, never a transition: no cache is cleared and nothing in flight is cancelled.
|
|
687
|
+
* Renders nothing for `select: 'none'`.
|
|
688
|
+
*/
|
|
689
|
+
declare function ScopeDimensionPicker(props: ScopeDimensionPickerProps): React.ReactElement | null;
|
|
665
690
|
//#endregion
|
|
666
691
|
//#region src/layout/use-theme.d.ts
|
|
667
692
|
/** What the user picked. `'system'` means "no explicit choice" — nothing is
|
|
@@ -737,75 +762,14 @@ declare function LanguageSwitch({ onChange, className }: LanguageSwitchProps): R
|
|
|
737
762
|
//#endregion
|
|
738
763
|
//#region src/layout/language-storage.d.ts
|
|
739
764
|
/**
|
|
740
|
-
*
|
|
741
|
-
*
|
|
742
|
-
*
|
|
743
|
-
*
|
|
744
|
-
*
|
|
745
|
-
* APPLICATIONS, and the replacement argument is weaker.** Until then this
|
|
746
|
-
* block said that `apps/playground` and `apps/l2-web-ui` hand-rolled their own
|
|
747
|
-
* two-language dropdown submenu against `loadLanguage`/`saveLanguage`/
|
|
748
|
-
* `LanguageCode`/`DEFAULT_LANGUAGE` directly, so narrowing or reshaping them
|
|
749
|
-
* would break real, working code outside this package. Both applications are
|
|
750
|
-
* gone (`docs/departing-apps.md`). Measured again after SP9 task 10, over the
|
|
751
|
-
* whole repository:
|
|
752
|
-
*
|
|
753
|
-
* - `loadLanguage` has exactly ONE consumer left — `fields/format.ts`, the
|
|
754
|
-
* no-provider locale fallback for the `Intl` renderers, which keeps it
|
|
755
|
-
* deliberately (`ru-RU` and `en-US` are both real answers for a formatter
|
|
756
|
-
* and neither is neutral). Task 10 removed the other two:
|
|
757
|
-
* `notification/notification-provider.ts` reads `loadLocale()` and
|
|
758
|
-
* `resource/list-error-state.tsx` reads the live `useLocale()`, because an
|
|
759
|
-
* app registering `en`/`es`/`fr` was served the RUSSIAN error catalogue
|
|
760
|
-
* through this pair's `'ru'` default — in every locale and on every first
|
|
761
|
-
* visit;
|
|
762
|
-
* - `saveLanguage`, `LanguageCode` and `DEFAULT_LANGUAGE` have **no consumer
|
|
763
|
-
* in any application or example**, only this package's own tests.
|
|
764
|
-
*
|
|
765
|
-
* They are still exported, so reshaping them is still a published-API break
|
|
766
|
-
* needing a `minor` changeset that says "breaking" — but it is no longer
|
|
767
|
-
* blocked by an in-repository consumer, which is what the old sentence
|
|
768
|
-
* claimed.
|
|
769
|
-
*/
|
|
770
|
-
type LanguageCode = 'en' | 'ru';
|
|
771
|
-
/**
|
|
772
|
-
* Default locale applied when the user has NOT explicitly chosen a
|
|
773
|
-
* language yet (fresh visit / no stored preference / SSR). The default
|
|
774
|
-
* targets a Russian-first app, so a first visit renders in
|
|
775
|
-
* `'ru'`; picking `EN` in the legacy two-language submenu persists the
|
|
776
|
-
* choice and it takes precedence on every subsequent load.
|
|
777
|
-
*/
|
|
778
|
-
declare const DEFAULT_LANGUAGE: LanguageCode;
|
|
779
|
-
/**
|
|
780
|
-
* Read the stored language preference. Returns {@link DEFAULT_LANGUAGE}
|
|
781
|
-
* (`'ru'`) when nothing is stored (or when localStorage is unavailable,
|
|
782
|
-
* e.g. SSR / disabled) so a fresh visit is Russian-first.
|
|
783
|
-
*
|
|
784
|
-
* Legacy, RU/EN-only — see {@link LanguageCode}'s docblock. Exported so
|
|
785
|
-
* consumers can read the same value during provider boot (before the React
|
|
786
|
-
* tree mounts) — typical use is to feed the result into
|
|
787
|
-
* `createI18nextAdapter({ defaultLocale })` so the initial render is already
|
|
788
|
-
* in the correct language.
|
|
789
|
-
*/
|
|
790
|
-
declare function loadLanguage(storageKey?: string): LanguageCode;
|
|
791
|
-
/**
|
|
792
|
-
* Persist the language preference. Legacy, RU/EN-only — see
|
|
793
|
-
* {@link LanguageCode}'s docblock, which also records that its last two
|
|
794
|
-
* in-repository callers (the departing applications' two-language dropdown
|
|
795
|
-
* submenus) left with SP9. Exported so consumer apps can call it from custom
|
|
796
|
-
* UI without importing a component; nothing in this repository calls it
|
|
797
|
-
* outside this package's own tests.
|
|
798
|
-
*/
|
|
799
|
-
declare function saveLanguage(code: LanguageCode, storageKey?: string): void;
|
|
800
|
-
/**
|
|
801
|
-
* Read an arbitrary locale code (not restricted to 'en'/'ru') under a
|
|
802
|
-
* localStorage key. Returns `undefined` when nothing is stored, unavailable,
|
|
803
|
-
* or empty — unlike {@link loadLanguage} there is no fixed two-code default
|
|
804
|
-
* to fall back to, so the caller (which knows its own registry) decides what
|
|
805
|
-
* "nothing chosen yet" means.
|
|
765
|
+
* Read the locale code a previous session persisted under a localStorage key.
|
|
766
|
+
* Returns `undefined` when nothing is stored or storage is unavailable (SSR,
|
|
767
|
+
* disabled). There is no default here: the caller knows its own registry, so
|
|
768
|
+
* it decides what "nothing chosen yet" means — normally `registry.primary()`.
|
|
769
|
+
* The stored code is untrusted; validate it against `registry.locales()`.
|
|
806
770
|
*/
|
|
807
771
|
declare function loadLocale(storageKey?: string): string | undefined;
|
|
808
|
-
/** Persist
|
|
772
|
+
/** Persist a locale code. Counterpart to {@link loadLocale}. */
|
|
809
773
|
declare function saveLocale(code: string, storageKey?: string): void;
|
|
810
774
|
//#endregion
|
|
811
775
|
//#region src/layout/breadcrumbs.d.ts
|
|
@@ -830,9 +794,9 @@ interface BreadcrumbsBaseProps {
|
|
|
830
794
|
'data-testid'?: string;
|
|
831
795
|
}
|
|
832
796
|
/** A trail that ends at, or passes through, a resource: its list link, then the record. */
|
|
833
|
-
interface ResourceBreadcrumbsProps extends BreadcrumbsBaseProps {
|
|
834
|
-
/** Resource name (the registry key). */
|
|
835
|
-
resource:
|
|
797
|
+
interface ResourceBreadcrumbsProps<N extends string = string> extends BreadcrumbsBaseProps {
|
|
798
|
+
/** Resource name (the registry key), checked against the registered resources; or its entity ref. */
|
|
799
|
+
resource: ResourceNameOrRef<N>;
|
|
836
800
|
name?: never;
|
|
837
801
|
/** Identifier for the current page (testid only); a record id on show/edit pages. */
|
|
838
802
|
recordId?: string;
|
|
@@ -858,7 +822,7 @@ interface PageBreadcrumbsProps extends BreadcrumbsBaseProps {
|
|
|
858
822
|
recordId?: never;
|
|
859
823
|
middleSegments?: never;
|
|
860
824
|
}
|
|
861
|
-
type BreadcrumbsProps = ResourceBreadcrumbsProps | PageBreadcrumbsProps;
|
|
825
|
+
type BreadcrumbsProps<N extends string = string> = ResourceBreadcrumbsProps<N> | PageBreadcrumbsProps;
|
|
862
826
|
/**
|
|
863
827
|
* The navigation breadcrumb, in two shapes. With `resource`: the leading
|
|
864
828
|
* segments, the resource (a link to its canonical, nesting-aware list href,
|
|
@@ -868,7 +832,7 @@ type BreadcrumbsProps = ResourceBreadcrumbsProps | PageBreadcrumbsProps;
|
|
|
868
832
|
* emphasised, non-linked span with `aria-current="page"`. Every crumb carries
|
|
869
833
|
* its label as a `title` tooltip, so a truncated one can still be read.
|
|
870
834
|
*/
|
|
871
|
-
declare function Breadcrumbs(
|
|
835
|
+
declare function Breadcrumbs<const N extends string = string>(input: BreadcrumbsProps<N>): ReactElement | null;
|
|
872
836
|
//#endregion
|
|
873
837
|
//#region src/layout/header-breadcrumbs.d.ts
|
|
874
838
|
/**
|
|
@@ -1094,7 +1058,7 @@ interface CommandPaletteRecentGroupProps {
|
|
|
1094
1058
|
heading?: string;
|
|
1095
1059
|
/**
|
|
1096
1060
|
* Re-read trigger. When this prop changes the component re-reads
|
|
1097
|
-
*
|
|
1061
|
+
* the platform's local store (e.g. flip from `false` → `true` on palette open).
|
|
1098
1062
|
* Optional — when omitted the component reads only on mount and when
|
|
1099
1063
|
* the user changes, which is sufficient for the typical "palette
|
|
1100
1064
|
* dialog re-mounts on each open" use case.
|
|
@@ -1268,6 +1232,7 @@ interface CommandPaletteRecordsGroupProps {
|
|
|
1268
1232
|
* ```tsx
|
|
1269
1233
|
* 'use client';
|
|
1270
1234
|
* import { useCommandPalette } from '@burojs/react';
|
|
1235
|
+
* import { useGlobalShortcut } from '@burojs/react/web';
|
|
1271
1236
|
* import {
|
|
1272
1237
|
* CommandPalette,
|
|
1273
1238
|
* CommandPaletteRecordsGroup,
|
|
@@ -1275,7 +1240,8 @@ interface CommandPaletteRecordsGroupProps {
|
|
|
1275
1240
|
* } from '@burojs/ui-shadcn';
|
|
1276
1241
|
*
|
|
1277
1242
|
* function Shell() {
|
|
1278
|
-
* const { open, setOpen } = useCommandPalette();
|
|
1243
|
+
* const { open, setOpen, toggle } = useCommandPalette();
|
|
1244
|
+
* useGlobalShortcut({ key: 'k', mod: true }, toggle);
|
|
1279
1245
|
* return (
|
|
1280
1246
|
* <CommandPalette open={open} onOpenChange={setOpen}>
|
|
1281
1247
|
* <CommandPaletteRecordsGroup
|
|
@@ -1531,7 +1497,7 @@ interface CommandPaletteCreateGroupProps {
|
|
|
1531
1497
|
*
|
|
1532
1498
|
* 1. Resources with no list page (`views.list.page: false`) are
|
|
1533
1499
|
* excluded — they are reached through a parent's placement.
|
|
1534
|
-
* 2. `
|
|
1500
|
+
* 2. `useResourceVisible()` (the sidebar's predicate: its `visible(ctx)`) must return true.
|
|
1535
1501
|
* Same predicate the sidebar + navigation group use, fail-closed
|
|
1536
1502
|
* on throwing predicates. Hidden in sidebar → hidden here.
|
|
1537
1503
|
* 3. Caller-supplied `resourceFilter` (if any). Returning `false`
|
|
@@ -1738,9 +1704,9 @@ interface ToasterProps extends ToasterProps$1 {}
|
|
|
1738
1704
|
*
|
|
1739
1705
|
* Bound to design tokens via `toastOptions.classNames`, so toasts inherit the
|
|
1740
1706
|
* app's light/dark theme through the same CSS-variable cascade as the rest of
|
|
1741
|
-
* the UI; `theme` is reactive via `useTheme()`. The error
|
|
1742
|
-
* ACTIVE
|
|
1743
|
-
* i18n provider
|
|
1707
|
+
* the UI; `theme` is reactive via `useTheme()`. The error sentences come from
|
|
1708
|
+
* the ACTIVE bundle (`requestError.*`), read per toast so a language switch is
|
|
1709
|
+
* honoured; with no i18n provider they are the English defaults.
|
|
1744
1710
|
*/
|
|
1745
1711
|
declare function Toaster(props: ToasterProps): React.ReactElement;
|
|
1746
1712
|
//#endregion
|
|
@@ -1814,6 +1780,7 @@ declare const shadcnFieldImplementations: Readonly<{
|
|
|
1814
1780
|
CollectionDisplay?: import("react").ComponentType<CollectionDisplayProps<unknown, Readonly<Record<string, unknown>>>> | undefined;
|
|
1815
1781
|
layout?: FieldImplementationLayout;
|
|
1816
1782
|
meta: import("@burojs/core").StandardSchemaV1<unknown, Readonly<Record<string, unknown>>>;
|
|
1783
|
+
texts?: Readonly<Record<string, string>>;
|
|
1817
1784
|
}>;
|
|
1818
1785
|
richText: FieldImplementation<unknown, Readonly<Record<string, unknown>>>;
|
|
1819
1786
|
'rich-text': FieldImplementation<unknown, Readonly<Record<string, unknown>>>;
|
|
@@ -1832,13 +1799,20 @@ declare const shadcnBlockImplementations: BlockImplementationCatalog;
|
|
|
1832
1799
|
//#region src/fields/registry.d.ts
|
|
1833
1800
|
interface FieldRendererProps {
|
|
1834
1801
|
value: unknown;
|
|
1802
|
+
/**
|
|
1803
|
+
* The value's formatted display text (REF-117 §4.6), when the surface declares a transform and
|
|
1804
|
+
* the value is not empty. A built-in display renders it instead of its own formatting; a custom
|
|
1805
|
+
* renderer may ignore it.
|
|
1806
|
+
*/
|
|
1807
|
+
text?: string;
|
|
1835
1808
|
/** True when this renderer is reached through a collection implementation. */
|
|
1836
1809
|
multiple?: boolean;
|
|
1837
1810
|
field?: {
|
|
1838
1811
|
name: string;
|
|
1839
1812
|
meta?: Record<string, unknown>;
|
|
1840
1813
|
ui?: Record<string, unknown>;
|
|
1841
|
-
|
|
1814
|
+
/** The field's declared `texts`; an option's label is read from it (`fieldOptionText`). */
|
|
1815
|
+
texts?: unknown;
|
|
1842
1816
|
};
|
|
1843
1817
|
options?: Array<{
|
|
1844
1818
|
value: string;
|
|
@@ -1854,6 +1828,12 @@ interface FieldRendererProps {
|
|
|
1854
1828
|
* and that adapter throws rather than emit a URL with `undefined` in it.
|
|
1855
1829
|
*/
|
|
1856
1830
|
resource?: string;
|
|
1831
|
+
/**
|
|
1832
|
+
* Registry key of the resource this field belongs to, namespace included (`crm:docs`; a
|
|
1833
|
+
* default-namespace resource keeps its short name). `resource` may be the bare id; a display
|
|
1834
|
+
* that looks the owner up in the registry (a link field's) reads this first.
|
|
1835
|
+
*/
|
|
1836
|
+
owner?: string;
|
|
1857
1837
|
/**
|
|
1858
1838
|
* The record this field is being rendered for. Absent on a create form,
|
|
1859
1839
|
* where no record exists yet.
|
|
@@ -1879,6 +1859,11 @@ interface FieldInputProps {
|
|
|
1879
1859
|
* `candidates` refs are read from (P7 3.4).
|
|
1880
1860
|
*/
|
|
1881
1861
|
metaSources?: ScreenSources;
|
|
1862
|
+
/**
|
|
1863
|
+
* An inline link field of a record form: what the user may do with it, the keys they cannot
|
|
1864
|
+
* see, and whether the form holds its keys. Only the to-many select reads it.
|
|
1865
|
+
*/
|
|
1866
|
+
link?: FieldLinkState;
|
|
1882
1867
|
id?: string;
|
|
1883
1868
|
value: unknown;
|
|
1884
1869
|
/** True when this renderer is reached through a collection implementation. */
|
|
@@ -1923,6 +1908,12 @@ interface FieldInputProps {
|
|
|
1923
1908
|
* be honored — `<RecordScreen>` already wires both together.
|
|
1924
1909
|
*/
|
|
1925
1910
|
ariaErrorMessage?: string;
|
|
1911
|
+
/**
|
|
1912
|
+
* Id of the field's label element, when the surface renders one with an id.
|
|
1913
|
+
* A control whose root is not labelable (a radio group) passes it to
|
|
1914
|
+
* `aria-labelledby`; a labelable one is already named by the label's `for`.
|
|
1915
|
+
*/
|
|
1916
|
+
ariaLabelledBy?: string;
|
|
1926
1917
|
/**
|
|
1927
1918
|
* Field metadata, mirroring `FieldRendererProps.field`. Forwarded by
|
|
1928
1919
|
* `<RecordScreen>` so renderers that depend on per-field meta (e.g.
|
|
@@ -1941,7 +1932,6 @@ interface FieldInputProps {
|
|
|
1941
1932
|
name: string;
|
|
1942
1933
|
meta?: Record<string, unknown>;
|
|
1943
1934
|
ui?: Record<string, unknown>;
|
|
1944
|
-
codec?: ValueCodec<unknown, unknown, unknown>;
|
|
1945
1935
|
};
|
|
1946
1936
|
/**
|
|
1947
1937
|
* Registry name of the resource this field belongs to.
|
|
@@ -1960,27 +1950,36 @@ interface FieldInputProps {
|
|
|
1960
1950
|
}
|
|
1961
1951
|
//#endregion
|
|
1962
1952
|
//#region src/fields/text.d.ts
|
|
1963
|
-
declare function TextDisplay({ value }: FieldRendererProps): React$1.ReactElement;
|
|
1953
|
+
declare function TextDisplay({ value, text: formatted }: FieldRendererProps): React$1.ReactElement;
|
|
1964
1954
|
declare function TextInput({ name, id, value, onChange, testid, placeholder, disabled, required, ariaInvalid, ariaDescribedBy, ariaErrorMessage, minLength, maxLength, pattern }: FieldInputProps): React$1.ReactElement;
|
|
1965
1955
|
//#endregion
|
|
1966
1956
|
//#region src/fields/number.d.ts
|
|
1967
|
-
declare function NumberDisplay({ value, field }: FieldRendererProps): React$1.ReactElement;
|
|
1957
|
+
declare function NumberDisplay({ value, field, text }: FieldRendererProps): React$1.ReactElement;
|
|
1968
1958
|
declare function NumberInput({ name, id, value, onChange, testid, placeholder, disabled, required, ariaInvalid, ariaDescribedBy, ariaErrorMessage, min, max }: FieldInputProps): React$1.ReactElement;
|
|
1969
1959
|
//#endregion
|
|
1970
1960
|
//#region src/fields/boolean.d.ts
|
|
1971
|
-
declare function BooleanDisplay({ value }: FieldRendererProps): React$1.ReactElement;
|
|
1961
|
+
declare function BooleanDisplay({ value, text }: FieldRendererProps): React$1.ReactElement;
|
|
1972
1962
|
declare function BooleanInput({ name, id, value, onChange, testid, disabled, required, ariaInvalid, ariaDescribedBy, ariaErrorMessage }: FieldInputProps): React$1.ReactElement;
|
|
1973
1963
|
//#endregion
|
|
1974
1964
|
//#region src/fields/date.d.ts
|
|
1975
|
-
declare function DateDisplay({ value }: FieldRendererProps): React$1.ReactElement;
|
|
1976
|
-
declare function DateInput(
|
|
1965
|
+
declare function DateDisplay({ value, text }: FieldRendererProps): React$1.ReactElement;
|
|
1966
|
+
declare function DateInput(props: FieldInputProps): React$1.ReactElement;
|
|
1977
1967
|
//#endregion
|
|
1978
1968
|
//#region src/fields/enum.d.ts
|
|
1979
1969
|
declare function EnumDisplay({ value, options, field, resource }: FieldRendererProps): React$1.ReactElement;
|
|
1980
|
-
|
|
1970
|
+
/**
|
|
1971
|
+
* The options-driven enum input: a field with inline options, or one bound to
|
|
1972
|
+
* an enum only through `meta.enumNamespace`. Renders the control the field
|
|
1973
|
+
* asks for (`ui.control`), else the bound enum's `control`, else a select; the
|
|
1974
|
+
* non-select controls are the shared `EnumChoiceGroup`. When the field is bound
|
|
1975
|
+
* to an enum namespace, each value's summary is read the way `EnumPicker` reads
|
|
1976
|
+
* it (`enum/<ns>/<value>`), so one enum looks the same however its field is
|
|
1977
|
+
* bound; a truly inline enum has no value docs and shows labels only.
|
|
1978
|
+
*/
|
|
1979
|
+
declare function EnumInput({ name, id, value, onChange, testid, options, field, placeholder, disabled, required, ariaInvalid, ariaDescribedBy, ariaErrorMessage, ariaLabelledBy, resource }: FieldInputProps): React$1.ReactElement;
|
|
1981
1980
|
//#endregion
|
|
1982
1981
|
//#region src/fields/textarea.d.ts
|
|
1983
|
-
declare function TextareaDisplay({ value }: FieldRendererProps): React$1.ReactElement;
|
|
1982
|
+
declare function TextareaDisplay({ value, text: formatted }: FieldRendererProps): React$1.ReactElement;
|
|
1984
1983
|
declare function TextareaInput({ name, id, value, onChange, testid, placeholder, disabled, required, ariaInvalid, ariaDescribedBy, ariaErrorMessage, className, onKeyDown, minLength, maxLength }: FieldInputProps & {
|
|
1985
1984
|
className?: string;
|
|
1986
1985
|
onKeyDown?: React$1.KeyboardEventHandler<HTMLTextAreaElement>;
|
|
@@ -1998,7 +1997,7 @@ declare function TextareaInput({ name, id, value, onChange, testid, placeholder,
|
|
|
1998
1997
|
* `<ResourceList>`.
|
|
1999
1998
|
*
|
|
2000
1999
|
* `underline-offset-4` is intentional (vs the more common `-2`) to
|
|
2001
|
-
* clear descenders
|
|
2000
|
+
* clear the descenders of non-Latin glyphs seen in our
|
|
2002
2001
|
* playground's Locations column.
|
|
2003
2002
|
*/
|
|
2004
2003
|
declare const relationLinkClassName = "rounded text-foreground underline decoration-muted-foreground/40 decoration-dotted underline-offset-4 transition-all hover:decoration-foreground hover:decoration-solid focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring";
|
|
@@ -2037,17 +2036,30 @@ declare function RelationDisplay({ value, field }: FieldRendererProps): React$1.
|
|
|
2037
2036
|
* `RelationDisplay` above), so this wrapper just shapes that `meta` object;
|
|
2038
2037
|
* `field.name` is set to `''` since standalone usage has no owning field.
|
|
2039
2038
|
*/
|
|
2040
|
-
declare function RelationField({ to, value }: {
|
|
2039
|
+
declare function RelationField<const N extends string = string>({ to: toInput, value }: {
|
|
2041
2040
|
/** Target resource name (matches `f.relation({ to: '...' })`). */
|
|
2042
|
-
to:
|
|
2041
|
+
to: ResourceNameOrRef<N>;
|
|
2043
2042
|
/** FK value to resolve, or null/undefined/'' when empty. */
|
|
2044
2043
|
value: unknown;
|
|
2045
2044
|
}): React$1.ReactElement;
|
|
2045
|
+
//#endregion
|
|
2046
|
+
//#region src/fields/link-keys-display.d.ts
|
|
2047
|
+
/**
|
|
2048
|
+
* A link field (`f.relationMany({ through })`): the target keys its junction rows hold, each a
|
|
2049
|
+
* chip titled as {@link RelationDisplay} titles one key. The owner key is the record's value of
|
|
2050
|
+
* the field the junction's `sourceKey` relation names (`by`), else of the owner's id field. Keys
|
|
2051
|
+
* whose title read finds no row (the target is filtered or out of the user's reach) are counted in
|
|
2052
|
+
* one "not visible" chip, never dropped silently; an owner whose rows reach the read cap shows
|
|
2053
|
+
* how many keys were read instead of chips, since the set is not known to be whole. A failed read
|
|
2054
|
+
* says so, distinct from an empty link.
|
|
2055
|
+
*/
|
|
2056
|
+
declare function LinkKeysDisplay(props: FieldRendererProps): React$1.ReactElement;
|
|
2046
2057
|
/**
|
|
2047
2058
|
* A to-many relation (`f.relationMany`): each key rendered as {@link RelationDisplay} renders
|
|
2048
|
-
* one — eager keys share the aggregator's batched read, lazy keys read nothing.
|
|
2059
|
+
* one — eager keys share the aggregator's batched read, lazy keys read nothing. A link (a field
|
|
2060
|
+
* `linkOf` reads a link from) is drawn by {@link LinkKeysDisplay}.
|
|
2049
2061
|
*/
|
|
2050
|
-
declare function RelationManyDisplay(
|
|
2062
|
+
declare function RelationManyDisplay(props: FieldRendererProps): React$1.ReactElement;
|
|
2051
2063
|
//#endregion
|
|
2052
2064
|
//#region src/fields/candidates-gate.d.ts
|
|
2053
2065
|
/** A select that must not read its target now (P7 3.4): why, and what it tells the user. */
|
|
@@ -2089,9 +2101,9 @@ type CandidatesGate = {
|
|
|
2089
2101
|
* - target row for `value` not found → trigger shows the raw id
|
|
2090
2102
|
* (so the operator can at least see what was stored).
|
|
2091
2103
|
*/
|
|
2092
|
-
interface RelationPickerProps {
|
|
2104
|
+
interface RelationPickerProps<N extends string = string> {
|
|
2093
2105
|
/** Target resource name (matches `f.relation({ to: '...' })`). */
|
|
2094
|
-
to:
|
|
2106
|
+
to: ResourceNameOrRef<N>;
|
|
2095
2107
|
/** Currently-selected FK value, or null/undefined when empty. */
|
|
2096
2108
|
value: string | number | null | undefined;
|
|
2097
2109
|
/** Called with the new selected id (or `by` value), or null when cleared. */
|
|
@@ -2152,6 +2164,13 @@ interface RelationPickerProps {
|
|
|
2152
2164
|
fieldName?: string;
|
|
2153
2165
|
/** The field's `ui.open` (P7 3.6): what the "view" button opens, or no button for `none`. */
|
|
2154
2166
|
open?: RelationOpen;
|
|
2167
|
+
/**
|
|
2168
|
+
* The read scope of the option reads (the popover, "Advanced search" and the create hand-back).
|
|
2169
|
+
* Default `'context'`: the record around the picker narrows its options, except by the field
|
|
2170
|
+
* the picker itself edits (`fieldName`, else `name`). `'none'` reads every row the provider
|
|
2171
|
+
* allows; `'session'` the session's scope selection.
|
|
2172
|
+
*/
|
|
2173
|
+
scope?: ScopeSource;
|
|
2155
2174
|
disabled?: boolean;
|
|
2156
2175
|
required?: boolean;
|
|
2157
2176
|
className?: string;
|
|
@@ -2162,7 +2181,7 @@ interface RelationPickerProps {
|
|
|
2162
2181
|
/** Forwarded to the trigger button as `aria-errormessage` (WAI-ARIA 1.2). */
|
|
2163
2182
|
ariaErrorMessage?: string;
|
|
2164
2183
|
}
|
|
2165
|
-
declare function RelationPicker({ to, value, onChange, by, searchField, pageSize, clearable, placeholder, name, id, testid, fixedFilters, createSeeds, candidatesGate, rowFits, fieldName, open: openMode, disabled, required, className, ariaInvalid, ariaDescribedBy, ariaErrorMessage }: RelationPickerProps): React$1.ReactElement;
|
|
2184
|
+
declare function RelationPicker<const N extends string = string>({ to: toInput, value, onChange, by, searchField, pageSize, clearable, placeholder, name, id, testid, fixedFilters, createSeeds, candidatesGate, rowFits, fieldName, open: openMode, scope, disabled, required, className, ariaInvalid, ariaDescribedBy, ariaErrorMessage }: RelationPickerProps<N>): React$1.ReactElement;
|
|
2166
2185
|
/**
|
|
2167
2186
|
* Form-field adapter wrapping `<RelationPicker>` for use as a default
|
|
2168
2187
|
* Input renderer in the field registry. Reads `field.meta.to` for the
|
|
@@ -2197,8 +2216,8 @@ interface SelectCreate {
|
|
|
2197
2216
|
* #9 — compact, and the table area is a FIXED height so paging never resizes /
|
|
2198
2217
|
* jumps the dialog; responsive down to mobile.
|
|
2199
2218
|
*/
|
|
2200
|
-
interface RelationPickerDialogProps {
|
|
2201
|
-
to:
|
|
2219
|
+
interface RelationPickerDialogProps<N extends string = string> {
|
|
2220
|
+
to: ResourceNameOrRef<N>;
|
|
2202
2221
|
open: boolean;
|
|
2203
2222
|
onOpenChange: (open: boolean) => void;
|
|
2204
2223
|
onSelect: (value: string | number) => void;
|
|
@@ -2221,8 +2240,8 @@ interface RelationPickerDialogProps {
|
|
|
2221
2240
|
*/
|
|
2222
2241
|
searchField?: string;
|
|
2223
2242
|
/**
|
|
2224
|
-
* Which field of the chosen row `onSelect` returns. Defaults to
|
|
2225
|
-
* FK relation). Set to another column (e.g. `gtin`) for "relate by a non-id
|
|
2243
|
+
* Which field of the chosen row `onSelect` returns. Defaults to the target's id
|
|
2244
|
+
* field (`data.idField`, else `id`: a normal FK relation). Set to another column (e.g. `gtin`) for "relate by a non-id
|
|
2226
2245
|
* value" pickers — the core mechanic behind the playground GTIN field.
|
|
2227
2246
|
*/
|
|
2228
2247
|
valueField?: string;
|
|
@@ -2236,6 +2255,16 @@ interface RelationPickerDialogProps {
|
|
|
2236
2255
|
* renders it as an undeletable badge.
|
|
2237
2256
|
*/
|
|
2238
2257
|
fixedFilters?: readonly FixedFilterInput[];
|
|
2258
|
+
/**
|
|
2259
|
+
* The read scope of the dialog's list, as the select's own option reads take it. Default
|
|
2260
|
+
* `'context'`: the record around the select narrows the rows.
|
|
2261
|
+
*/
|
|
2262
|
+
scope?: ScopeSource;
|
|
2263
|
+
/**
|
|
2264
|
+
* The record field the select writes (`useList`'s `scopeField`): the record's value of it never
|
|
2265
|
+
* narrows the rows offered for it. Absent: every field of the record narrows.
|
|
2266
|
+
*/
|
|
2267
|
+
scopeField?: string;
|
|
2239
2268
|
/**
|
|
2240
2269
|
* The select's one pending create (P6-34), shared with its popover. With it the footer offers
|
|
2241
2270
|
* "+ Create" (the target's `quick.create`, handed back through the select's own query); without
|
|
@@ -2257,13 +2286,118 @@ interface RelationPickerDialogProps {
|
|
|
2257
2286
|
multiple?: boolean;
|
|
2258
2287
|
/** The keys already chosen (`multiple` only): their rows are marked. */
|
|
2259
2288
|
selected?: readonly (string | number)[];
|
|
2260
|
-
|
|
2289
|
+
/** A row toggled in `multiple` mode: its value, and the row itself. */
|
|
2290
|
+
onToggle?: (value: string | number, row: Record<string, unknown>) => void;
|
|
2291
|
+
/**
|
|
2292
|
+
* `multiple` only: the Select button confirms the choice through this instead of closing the
|
|
2293
|
+
* dialog with `onOpenChange(false)`, so a confirm and a dismissal can be told apart.
|
|
2294
|
+
*/
|
|
2295
|
+
onDone?: () => void;
|
|
2296
|
+
/**
|
|
2297
|
+
* Asked once per shown page with the keys of its rows: rows whose key is in the resolved set
|
|
2298
|
+
* are drawn checked and disabled (a link panel's already-linked targets). Until it answers the
|
|
2299
|
+
* page's rows cannot be picked and the footer says the rows are being checked; when it fails
|
|
2300
|
+
* none of them can, and the footer says so with a Retry.
|
|
2301
|
+
*/
|
|
2302
|
+
disabledKeys?: (keys: readonly (string | number)[], signal: AbortSignal) => Promise<ReadonlySet<string>>;
|
|
2303
|
+
/**
|
|
2304
|
+
* With `disabledKeys`: the footer's note for the page's disabled rows, given how many there
|
|
2305
|
+
* are (the caller says what they are, "3 already linked"). Absent: no note.
|
|
2306
|
+
*/
|
|
2307
|
+
disabledLabel?: (count: number) => React$1.ReactNode;
|
|
2261
2308
|
}
|
|
2262
|
-
declare function RelationPickerDialog({ to, open, onOpenChange, onSelect, onSelectRow, searchField, valueField, fixedFilters, create, createSeeds, fieldName, onBeforeCreate, pageSize, multiple, selected, onToggle }: RelationPickerDialogProps): React$1.ReactElement;
|
|
2263
2309
|
//#endregion
|
|
2264
2310
|
//#region src/fields/lazy-relation-picker-dialog.d.ts
|
|
2265
2311
|
/** The "Advanced search" dialog, loaded on the first open: nothing is drawn until it arrives. */
|
|
2266
|
-
declare function LazyRelationPickerDialog(props:
|
|
2312
|
+
declare function LazyRelationPickerDialog<const N extends string = string>(props: RelationPickerDialogProps<N>): ReactElement;
|
|
2313
|
+
//#endregion
|
|
2314
|
+
//#region src/fields/use-relation-picker.d.ts
|
|
2315
|
+
type AnyResourceHandle = ResourceHandle<any, any, any, any>;
|
|
2316
|
+
type FieldNamesOf<R> = R extends ResourceHandle<any, infer F, any, any> ? keyof F & string : R extends string ? FieldNamesOf<ResourceHandleOf<R>> : string;
|
|
2317
|
+
type UseRelationPickerOptions<R extends AnyResourceHandle | string | EntityRef, TSelect extends FieldNamesOf<R>> =
|
|
2318
|
+
/**
|
|
2319
|
+
* The target: its handle, its name (checked against the registered resources, and typing
|
|
2320
|
+
* `select` by the registered fields) or its entity ref.
|
|
2321
|
+
*/
|
|
2322
|
+
({
|
|
2323
|
+
readonly to: ResourceRefArg<R>;
|
|
2324
|
+
readonly field?: never;
|
|
2325
|
+
} |
|
|
2326
|
+
/** A relation field of the surrounding record (`useOptionalRecordFrame()`): `to`, `by` and `candidates` come from its declaration. */
|
|
2327
|
+
{
|
|
2328
|
+
readonly field: string;
|
|
2329
|
+
readonly to?: never;
|
|
2330
|
+
}) & {
|
|
2331
|
+
readonly multiple?: boolean;
|
|
2332
|
+
/** The row fields the promise hands back (plus the key), projected as of selection. Absent: the row as read. */
|
|
2333
|
+
readonly select?: readonly TSelect[];
|
|
2334
|
+
/** Declared-candidates grammar; refs resolve against the surrounding record's sources (`controller.sources`), literals only outside one. */
|
|
2335
|
+
readonly candidates?: readonly RelationCandidate[];
|
|
2336
|
+
readonly fixedFilters?: readonly FixedFilterInput[];
|
|
2337
|
+
/** The target field the keys hold; default: the field's `by`, else the target's id field. */
|
|
2338
|
+
readonly valueField?: string;
|
|
2339
|
+
/** Offers "+ Create" (the target's quick create) seeded with `seeds`; a created record settles as selected. */
|
|
2340
|
+
readonly create?: {
|
|
2341
|
+
readonly seeds?: Readonly<Record<string, unknown>>;
|
|
2342
|
+
};
|
|
2343
|
+
/** Default 'context'. */
|
|
2344
|
+
readonly scope?: ScopeSource;
|
|
2345
|
+
/** Rows of each shown page whose key is in the resolved set are drawn checked and disabled. */
|
|
2346
|
+
readonly disabledKeys?: (keys: readonly (string | number)[], signal: AbortSignal) => Promise<ReadonlySet<string>>;
|
|
2347
|
+
/** With `disabledKeys`: the dialog footer's note for a page's disabled rows, given their count. */
|
|
2348
|
+
readonly disabledLabel?: (count: number) => React$1.ReactNode;
|
|
2349
|
+
};
|
|
2350
|
+
type RelationPickerRow<TSelect extends string> = { readonly [K in TSelect]?: unknown; } & {
|
|
2351
|
+
readonly id?: unknown;
|
|
2352
|
+
};
|
|
2353
|
+
type RelationPickerCancelReason = 'dismissed' | 'aborted' | 'superseded' | 'unmounted' | 'session-changed' | 'not-mounted' | 'unavailable';
|
|
2354
|
+
/**
|
|
2355
|
+
* How an `open()` settled. `selected.rows` are the rows chosen during this open, each projected
|
|
2356
|
+
* to `select` plus `id` and the value field (`valueField`, else the field's `by`, else the id
|
|
2357
|
+
* field), so a row can be joined to its key. No row is re-read: a key passed in through
|
|
2358
|
+
* `open({ selected })` and left unchanged comes back in `keys` without a row, and so does a
|
|
2359
|
+
* created record whose quick create handed back no row.
|
|
2360
|
+
*/
|
|
2361
|
+
type RelationPickerResult<TRow> = {
|
|
2362
|
+
readonly kind: 'selected';
|
|
2363
|
+
readonly keys: readonly (string | number)[];
|
|
2364
|
+
readonly rows: readonly TRow[];
|
|
2365
|
+
} | {
|
|
2366
|
+
readonly kind: 'cancelled';
|
|
2367
|
+
readonly reason: RelationPickerCancelReason;
|
|
2368
|
+
};
|
|
2369
|
+
interface RelationPickerOpenOptions {
|
|
2370
|
+
readonly signal?: AbortSignal;
|
|
2371
|
+
/**
|
|
2372
|
+
* Multiple mode: the keys already chosen. Those left unchanged are returned in `keys` but have
|
|
2373
|
+
* no row in `rows` (they are not re-read).
|
|
2374
|
+
*/
|
|
2375
|
+
readonly selected?: readonly (string | number)[];
|
|
2376
|
+
}
|
|
2377
|
+
interface RelationPickerHandle<TRow> {
|
|
2378
|
+
open(opts?: RelationPickerOpenOptions): Promise<RelationPickerResult<TRow>>;
|
|
2379
|
+
/** Render it once, anywhere in the caller's tree. Always an element; it draws nothing while closed. */
|
|
2380
|
+
readonly element: React$1.ReactElement;
|
|
2381
|
+
}
|
|
2382
|
+
/**
|
|
2383
|
+
* A relation picker as a promise: `open()` shows the target's "Advanced search" dialog and settles
|
|
2384
|
+
* with the chosen keys and rows, or with why nothing was chosen. It never rejects.
|
|
2385
|
+
*
|
|
2386
|
+
* const picker = useRelationPicker({ to: merchants, select: ['name'] });
|
|
2387
|
+
* …
|
|
2388
|
+
* const result = await picker.open();
|
|
2389
|
+
* if (result.kind === 'selected') setMerchant(result.keys[0]);
|
|
2390
|
+
* …
|
|
2391
|
+
* return <>{…}{picker.element}</>;
|
|
2392
|
+
*
|
|
2393
|
+
* `open()` snapshots the record scope around the caller and the data session: the list reads with
|
|
2394
|
+
* the scope as it was at the call, and a session or scope change while open cancels. Candidate
|
|
2395
|
+
* filters, by contrast, resolve live: when they stop resolving while open (a ref they read is
|
|
2396
|
+
* cleared), the picker closes and settles `unavailable` rather than list rows without them. Render
|
|
2397
|
+
* `element` once, anywhere in the caller's tree; an `open()` while it is not rendered settles
|
|
2398
|
+
* `not-mounted`.
|
|
2399
|
+
*/
|
|
2400
|
+
declare function useRelationPicker<R extends AnyResourceHandle | string | EntityRef, TSelect extends FieldNamesOf<R> = FieldNamesOf<R>>(options: UseRelationPickerOptions<R, TSelect>): RelationPickerHandle<RelationPickerRow<TSelect>>;
|
|
2267
2401
|
//#endregion
|
|
2268
2402
|
//#region src/fields/use-dialog-filter-state.d.ts
|
|
2269
2403
|
/** The portable erased AST — the only shape this module deals in. */
|
|
@@ -2329,7 +2463,7 @@ interface DialogFilterState {
|
|
|
2329
2463
|
* screen real estate for a couple of always-visible facets); a modal has no
|
|
2330
2464
|
* spare real estate to spend on them.
|
|
2331
2465
|
*/
|
|
2332
|
-
declare function useDialogFilterState(
|
|
2466
|
+
declare function useDialogFilterState<const N extends string = string>(resourceInput: ResourceNameOrRef<N>, options: UseDialogFilterStateOptions): DialogFilterState;
|
|
2333
2467
|
//#endregion
|
|
2334
2468
|
//#region src/fields/file-display.d.ts
|
|
2335
2469
|
interface FileFieldProps extends FieldRendererProps {
|
|
@@ -2398,7 +2532,6 @@ type FieldLike = LegacyFieldLike & {
|
|
|
2398
2532
|
readonly ui?: object;
|
|
2399
2533
|
readonly options?: FieldDeclaration['options'];
|
|
2400
2534
|
readonly required?: boolean;
|
|
2401
|
-
readonly codec?: unknown;
|
|
2402
2535
|
};
|
|
2403
2536
|
interface ResolvedFieldDisplayProps {
|
|
2404
2537
|
readonly resource: EntityRef;
|
|
@@ -2415,8 +2548,18 @@ interface ResolvedFieldDisplayProps {
|
|
|
2415
2548
|
* `form`, so a field P5 withholds stays pending in a `meta` ref as it does everywhere else.
|
|
2416
2549
|
*/
|
|
2417
2550
|
readonly metaSources?: ScreenSources;
|
|
2551
|
+
/**
|
|
2552
|
+
* The surface the display is drawn on (REF-117 §4.13): `'display'` (the default) for record
|
|
2553
|
+
* screens, `'column'` for a table cell, `'card'` for the default card item. Its layers select
|
|
2554
|
+
* the implementation, its params and its transform.
|
|
2555
|
+
*/
|
|
2556
|
+
readonly uiSurface?: Exclude<UiSurface, 'input'>;
|
|
2557
|
+
/** A table cell's list entry, the last layer of the `column` surface. */
|
|
2558
|
+
readonly columnEntry?: {
|
|
2559
|
+
readonly display?: unknown;
|
|
2560
|
+
};
|
|
2418
2561
|
}
|
|
2419
|
-
interface ResolvedFieldInputProps extends Omit<ResolvedFieldDisplayProps, 'fallback'> {
|
|
2562
|
+
interface ResolvedFieldInputProps extends Omit<ResolvedFieldDisplayProps, 'fallback' | 'uiSurface' | 'columnEntry'> {
|
|
2420
2563
|
readonly inputId?: string;
|
|
2421
2564
|
readonly onChange: (value: unknown) => void;
|
|
2422
2565
|
/** Live form values, distinct from the edit record baseline. */
|
|
@@ -2426,6 +2569,12 @@ interface ResolvedFieldInputProps extends Omit<ResolvedFieldDisplayProps, 'fallb
|
|
|
2426
2569
|
readonly required?: boolean;
|
|
2427
2570
|
readonly placeholder?: string;
|
|
2428
2571
|
readonly descriptionId?: string;
|
|
2572
|
+
/**
|
|
2573
|
+
* Id of the label the surface renders for this field. A control that a
|
|
2574
|
+
* `<label for>` cannot name (an enum's radio group) uses it as its
|
|
2575
|
+
* `aria-labelledby`.
|
|
2576
|
+
*/
|
|
2577
|
+
readonly labelId?: string;
|
|
2429
2578
|
readonly errorId?: string;
|
|
2430
2579
|
readonly errorMessage?: string | null;
|
|
2431
2580
|
/** Current lifecycle state from the enclosing form. */
|
|
@@ -2445,6 +2594,8 @@ interface ResolvedFieldInputProps extends Omit<ResolvedFieldDisplayProps, 'fallb
|
|
|
2445
2594
|
* Never read from `field.meta`, which a layer can write.
|
|
2446
2595
|
*/
|
|
2447
2596
|
readonly fixedFilters?: readonly FixedFilterInput[];
|
|
2597
|
+
/** An inline link field's rights, hidden keys and load state, from the form controller. */
|
|
2598
|
+
readonly link?: FieldLinkState;
|
|
2448
2599
|
readonly fallback: ReactNode;
|
|
2449
2600
|
}
|
|
2450
2601
|
//#endregion
|
|
@@ -2487,7 +2638,7 @@ type FieldProps = Omit<ResolvedFieldInputProps, 'resource' | 'fallback'> & {
|
|
|
2487
2638
|
* wired to the field's value/onChange/disabled state.
|
|
2488
2639
|
*/
|
|
2489
2640
|
declare function Field({ resource, i18nPrefix, fallback, fixedFilters, field, doc, ...rest }: FieldProps): ReactElement;
|
|
2490
|
-
type FieldDisplayProps = Omit<ResolvedFieldDisplayProps, 'resource' | 'fallback'> & {
|
|
2641
|
+
type FieldDisplayProps = Omit<ResolvedFieldDisplayProps, 'resource' | 'fallback' | 'uiSurface' | 'columnEntry'> & {
|
|
2491
2642
|
readonly resource?: EntityRef;
|
|
2492
2643
|
readonly i18nPrefix?: string;
|
|
2493
2644
|
readonly fallback?: ReactNode;
|
|
@@ -2496,7 +2647,8 @@ type FieldDisplayProps = Omit<ResolvedFieldDisplayProps, 'resource' | 'fallback'
|
|
|
2496
2647
|
* Public, resource-independent single-field display brick over
|
|
2497
2648
|
* `ResolvedFieldDisplay`. See {@link Field} for the `resource`/`i18nPrefix`
|
|
2498
2649
|
* resolution rule. `fallback` defaults to a `<span>` rendering the value, or
|
|
2499
|
-
* an em dash when the value is empty.
|
|
2650
|
+
* an em dash when the value is empty. It draws the record screens' `display`
|
|
2651
|
+
* surface, with the field's copy action and overflow around it (REF-117 P8).
|
|
2500
2652
|
*/
|
|
2501
2653
|
declare function FieldDisplay({ resource, i18nPrefix, fallback, value, ...rest }: FieldDisplayProps): ReactElement;
|
|
2502
2654
|
//#endregion
|
|
@@ -2639,10 +2791,10 @@ interface DeclarativeDisplayProps<F extends ResourceFieldMap = ResourceFieldMap>
|
|
|
2639
2791
|
declare function DeclarativeDisplay<F extends ResourceFieldMap = ResourceFieldMap>(props: DeclarativeDisplayProps<F>): ReactElement;
|
|
2640
2792
|
//#endregion
|
|
2641
2793
|
//#region src/export/export-dialog.d.ts
|
|
2642
|
-
interface ExportDialogProps {
|
|
2794
|
+
interface ExportDialogProps<N extends string = string> {
|
|
2643
2795
|
readonly open: boolean;
|
|
2644
2796
|
readonly onOpenChange: (open: boolean) => void;
|
|
2645
|
-
readonly resource:
|
|
2797
|
+
readonly resource: ResourceNameOrRef<N>;
|
|
2646
2798
|
readonly target: ExportTarget;
|
|
2647
2799
|
/**
|
|
2648
2800
|
* The list's currently visible columns — what "as in table" (the default) sends as `request.columns`.
|
|
@@ -2652,6 +2804,8 @@ interface ExportDialogProps {
|
|
|
2652
2804
|
readonly visibleColumns: readonly string[];
|
|
2653
2805
|
/** Known row estimate, shown in the filter-scope title and handed to the exporter as a progress total hint. */
|
|
2654
2806
|
readonly estimatedCount?: number;
|
|
2807
|
+
/** How the export reads the resource: the scope of the list it exports (default `'session'`). */
|
|
2808
|
+
readonly scope?: ScopeSource;
|
|
2655
2809
|
}
|
|
2656
2810
|
/**
|
|
2657
2811
|
* Self-hosted export dialog — NOT presented through `useUIPresent`: an
|
|
@@ -2669,7 +2823,7 @@ interface ExportDialogProps {
|
|
|
2669
2823
|
* menu-held dialog, deleted in P4) — this dialog
|
|
2670
2824
|
* never repeats that shape.
|
|
2671
2825
|
*/
|
|
2672
|
-
declare function ExportDialog({ open, onOpenChange, resource, target, visibleColumns, estimatedCount }: ExportDialogProps): React$1.ReactElement;
|
|
2826
|
+
declare function ExportDialog<const N extends string = string>({ open, onOpenChange, resource: resourceInput, target, visibleColumns, estimatedCount, scope }: ExportDialogProps<N>): React$1.ReactElement;
|
|
2673
2827
|
//#endregion
|
|
2674
2828
|
//#region src/export/download.d.ts
|
|
2675
2829
|
/**
|
|
@@ -2692,8 +2846,8 @@ declare function ExportDialog({ open, onOpenChange, resource, target, visibleCol
|
|
|
2692
2846
|
declare function downloadArtifact(artifact: ExportArtifact): void;
|
|
2693
2847
|
//#endregion
|
|
2694
2848
|
//#region src/export/export-button.d.ts
|
|
2695
|
-
interface ExportButtonProps {
|
|
2696
|
-
resource:
|
|
2849
|
+
interface ExportButtonProps<N extends string = string> {
|
|
2850
|
+
resource: ResourceNameOrRef<N>;
|
|
2697
2851
|
className?: string;
|
|
2698
2852
|
}
|
|
2699
2853
|
/**
|
|
@@ -2723,7 +2877,7 @@ interface ExportButtonProps {
|
|
|
2723
2877
|
* of any rule. `useResourceExport` already answers the existence
|
|
2724
2878
|
* question; `useCapability` is asked ONLY about permission.
|
|
2725
2879
|
*/
|
|
2726
|
-
declare function ExportButton({ resource, className }: ExportButtonProps): React$1.ReactElement | null;
|
|
2880
|
+
declare function ExportButton<const N extends string = string>({ resource: resourceInput, className }: ExportButtonProps<N>): React$1.ReactElement | null;
|
|
2727
2881
|
//#endregion
|
|
2728
2882
|
//#region src/export/run-watcher.d.ts
|
|
2729
2883
|
/**
|
|
@@ -2752,9 +2906,12 @@ declare function ExportButton({ resource, className }: ExportButtonProps): React
|
|
|
2752
2906
|
declare function useExportRunWatcher(): void;
|
|
2753
2907
|
//#endregion
|
|
2754
2908
|
//#region src/enum/enum-badge.d.ts
|
|
2755
|
-
interface EnumBadgeProps {
|
|
2756
|
-
/**
|
|
2757
|
-
|
|
2909
|
+
interface EnumBadgeProps<N extends string = string> {
|
|
2910
|
+
/**
|
|
2911
|
+
* Name of the enum registered via `defineEnum` + `app.use(...)`, checked against the
|
|
2912
|
+
* registered enums, or its entity ref `{ namespace, id }` (untyped).
|
|
2913
|
+
*/
|
|
2914
|
+
enumName: EnumNameOrRef<N>;
|
|
2758
2915
|
/** Raw value as stored on the record. */
|
|
2759
2916
|
value: string | null | undefined;
|
|
2760
2917
|
/** Test-id override. Defaults to `enum-badge:<enumName>:<value>`. */
|
|
@@ -2783,12 +2940,13 @@ interface EnumBadgeProps {
|
|
|
2783
2940
|
* - Value is unknown AND no `fallback` declared → render the raw value
|
|
2784
2941
|
* as a plain badge (variant `outline`).
|
|
2785
2942
|
*/
|
|
2786
|
-
declare function EnumBadge({ enumName, value, testid, className, presentation }: EnumBadgeProps): React$1.ReactElement;
|
|
2943
|
+
declare function EnumBadge<const N extends string = string>({ enumName: enumInput, value, testid, className, presentation }: EnumBadgeProps<N>): React$1.ReactElement;
|
|
2787
2944
|
//#endregion
|
|
2788
2945
|
//#region src/enum/enum-display.d.ts
|
|
2789
2946
|
type EnumDisplayVariant = 'badge' | 'plain' | 'icon-label';
|
|
2790
|
-
interface EnumDisplayProps {
|
|
2791
|
-
|
|
2947
|
+
interface EnumDisplayProps<N extends string = string> {
|
|
2948
|
+
/** The enum's name, checked against the registered enums, or its entity ref `{ namespace, id }`. */
|
|
2949
|
+
enumName: EnumNameOrRef<N>;
|
|
2792
2950
|
value: string | null | undefined;
|
|
2793
2951
|
/** Display variant. Defaults to 'badge'. */
|
|
2794
2952
|
variant?: EnumDisplayVariant;
|
|
@@ -2809,10 +2967,9 @@ interface EnumDisplayProps {
|
|
|
2809
2967
|
* every variant. Unregistered enums fall back to raw value text (logged
|
|
2810
2968
|
* once via console.warn, dev-only).
|
|
2811
2969
|
*/
|
|
2812
|
-
declare function EnumDisplay$1({ enumName, value, variant, testid, className }: EnumDisplayProps): React$1.ReactElement;
|
|
2970
|
+
declare function EnumDisplay$1<const N extends string = string>({ enumName: enumInput, value, variant, testid, className }: EnumDisplayProps<N>): React$1.ReactElement;
|
|
2813
2971
|
//#endregion
|
|
2814
2972
|
//#region src/enum/enum-picker.d.ts
|
|
2815
|
-
type EnumPickerRenderAs = 'select' | 'radio' | 'segmented';
|
|
2816
2973
|
/**
|
|
2817
2974
|
* Internal sentinel used as the `value` for the "All" / clear item when
|
|
2818
2975
|
* `clearable` is set. Radix `<SelectItem value="">` is forbidden, so we use
|
|
@@ -2820,18 +2977,23 @@ type EnumPickerRenderAs = 'select' | 'radio' | 'segmented';
|
|
|
2820
2977
|
* it back to `undefined` before calling the consumer's `onChange`.
|
|
2821
2978
|
*/
|
|
2822
2979
|
declare const ENUM_PICKER_CLEAR_SENTINEL = "__buro_clear__";
|
|
2823
|
-
interface EnumPickerProps {
|
|
2824
|
-
|
|
2980
|
+
interface EnumPickerProps<N extends string = string> {
|
|
2981
|
+
/** The enum's name, checked against the registered enums, or its entity ref `{ namespace, id }`. */
|
|
2982
|
+
enumName: EnumNameOrRef<N>;
|
|
2825
2983
|
value: string | null | undefined;
|
|
2826
2984
|
/**
|
|
2827
|
-
* Called whenever the user picks an option.
|
|
2828
|
-
* the user picks the "All" item
|
|
2829
|
-
*
|
|
2830
|
-
*
|
|
2985
|
+
* Called whenever the user picks an option. `value` is `undefined` when
|
|
2986
|
+
* the user picks the select's "All" item (`clearable`) or the "None"
|
|
2987
|
+
* option of a non-required `cards` / `radio` / `segmented` control —
|
|
2988
|
+
* consumers use that to clear their state. Otherwise it is one of the
|
|
2989
|
+
* enum's declared values.
|
|
2831
2990
|
*/
|
|
2832
2991
|
onChange: (value: string | undefined) => void;
|
|
2833
|
-
/**
|
|
2834
|
-
|
|
2992
|
+
/**
|
|
2993
|
+
* The control that renders the values. Defaults to `'select'`. `cards`,
|
|
2994
|
+
* `radio` and `segmented` offer a "None" option first unless `required`.
|
|
2995
|
+
*/
|
|
2996
|
+
control?: EnumControl;
|
|
2835
2997
|
/** HTML name attribute (form integration). */
|
|
2836
2998
|
name?: string;
|
|
2837
2999
|
/** HTML id attribute. */
|
|
@@ -2848,6 +3010,12 @@ interface EnumPickerProps {
|
|
|
2848
3010
|
ariaDescribedBy?: string;
|
|
2849
3011
|
/** Current field-error element id, valid only while ariaInvalid is true. */
|
|
2850
3012
|
ariaErrorMessage?: string;
|
|
3013
|
+
/**
|
|
3014
|
+
* Id of the field's label. Names the `cards` / `radio` / `segmented` group
|
|
3015
|
+
* (`aria-labelledby`), which a `<label for>` cannot. The select trigger is a
|
|
3016
|
+
* labelable button and keeps its name from the label's `for`.
|
|
3017
|
+
*/
|
|
3018
|
+
ariaLabelledBy?: string;
|
|
2851
3019
|
className?: string;
|
|
2852
3020
|
/**
|
|
2853
3021
|
* When `true`, prepend an "All" item (label customizable via
|
|
@@ -2856,33 +3024,26 @@ interface EnumPickerProps {
|
|
|
2856
3024
|
* valid state. Defaults to `false` so existing form-input call sites
|
|
2857
3025
|
* (where the value is required) keep their old behavior.
|
|
2858
3026
|
*
|
|
2859
|
-
*
|
|
2860
|
-
*
|
|
3027
|
+
* Only honored by the `select` control. The other controls clear through
|
|
3028
|
+
* their "None" option, shown whenever `required` is not set.
|
|
2861
3029
|
*/
|
|
2862
3030
|
clearable?: boolean;
|
|
2863
3031
|
/** Label for the clear item. Defaults to "All". */
|
|
2864
3032
|
clearLabel?: string;
|
|
2865
3033
|
}
|
|
2866
3034
|
/**
|
|
2867
|
-
* Single picker primitive that renders enum values
|
|
2868
|
-
*
|
|
3035
|
+
* Single picker primitive that renders enum values with one of the
|
|
3036
|
+
* `EnumControl`s: a Select (default), bordered cards (`control='cards'`), a
|
|
3037
|
+
* compact radio list (`control='radio'`), or a segmented control
|
|
3038
|
+
* (`control='segmented'`). The three non-select controls are the shared
|
|
3039
|
+
* `EnumChoiceGroup`; this component only resolves the options (label, icon,
|
|
3040
|
+
* value summary) from the registered enum.
|
|
2869
3041
|
*
|
|
2870
3042
|
* Falls back to a disabled placeholder when the enum is not registered —
|
|
2871
3043
|
* matches the EnumBadge fallback policy: a half-shipped enum should not
|
|
2872
3044
|
* crash the form.
|
|
2873
|
-
*
|
|
2874
|
-
* The radio mode uses native HTML `<input type="radio">` rather than
|
|
2875
|
-
* pulling `@radix-ui/react-radio-group` into the bundle: the playground
|
|
2876
|
-
* doesn't need keyboard-focus arrow-key navigation in v1, and the dep
|
|
2877
|
-
* footprint is real (~6kB gzipped). If a future fire needs the richer
|
|
2878
|
-
* keyboard semantics, swap the `<input>` markup for the radix primitive
|
|
2879
|
-
* — the props API stays the same.
|
|
2880
|
-
*
|
|
2881
|
-
* Segmented mode renders a row of buttons styled like the Tabs primitive
|
|
2882
|
-
* but acts as a single-select control (one button is `aria-pressed=true`
|
|
2883
|
-
* at a time).
|
|
2884
3045
|
*/
|
|
2885
|
-
declare function EnumPicker({ enumName, value, onChange,
|
|
3046
|
+
declare function EnumPicker<const N extends string = string>({ enumName: enumInput, value, onChange, control, name, id, testid, placeholder, disabled, required, ariaInvalid, ariaDescribedBy, ariaErrorMessage, ariaLabelledBy, className, clearable, clearLabel }: EnumPickerProps<N>): React$1.ReactElement;
|
|
2886
3047
|
//#endregion
|
|
2887
3048
|
//#region src/primitives/button.d.ts
|
|
2888
3049
|
declare const buttonVariants: (props?: ({
|
|
@@ -2895,8 +3056,9 @@ interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement>, V
|
|
|
2895
3056
|
declare const Button: React$1.ForwardRefExoticComponent<ButtonProps & React$1.RefAttributes<HTMLButtonElement>>;
|
|
2896
3057
|
//#endregion
|
|
2897
3058
|
//#region src/actions/action-button.d.ts
|
|
2898
|
-
interface ActionButtonProps {
|
|
2899
|
-
|
|
3059
|
+
interface ActionButtonProps<N extends string = string> {
|
|
3060
|
+
/** A name checked against the registered resources, or the entity ref. */
|
|
3061
|
+
resource: ResourceNameOrRef<N>;
|
|
2900
3062
|
actionName: string;
|
|
2901
3063
|
record?: {
|
|
2902
3064
|
id: string;
|
|
@@ -2945,6 +3107,16 @@ interface ActionButtonProps {
|
|
|
2945
3107
|
* Destructive actions get destructive item styling.
|
|
2946
3108
|
*/
|
|
2947
3109
|
asMenuItem?: boolean;
|
|
3110
|
+
/**
|
|
3111
|
+
* The sources of the screen the button is drawn on (a record screen's header or frame:
|
|
3112
|
+
* `FormController.sources`), which the action's `when` reads before its own `record`, `scope`,
|
|
3113
|
+
* `user` and `route` (T4 D9 part 4: the screen's win where both have one, except `record`,
|
|
3114
|
+
* which stays the action's own unprojected row; the action's fill the rest). The screen loads
|
|
3115
|
+
* what its item actions' `when`s read (its show and edit demand them), never waiting on it. Absent in
|
|
3116
|
+
* a record's menu: a `when` there reads the action's own four only, and a ref to any other
|
|
3117
|
+
* source leaves it undecided, which hides the action.
|
|
3118
|
+
*/
|
|
3119
|
+
sources?: ScreenSources;
|
|
2948
3120
|
}
|
|
2949
3121
|
/**
|
|
2950
3122
|
* A denial the rule asked to SHOW.
|
|
@@ -2967,7 +3139,7 @@ interface ActionButtonProps {
|
|
|
2967
3139
|
* toast-on-click behaviour, and copying it into app code would fork the one
|
|
2968
3140
|
* place accessibility for a denied action is decided.
|
|
2969
3141
|
*/
|
|
2970
|
-
interface DisabledActionProps {
|
|
3142
|
+
interface DisabledActionProps<N extends string = string> {
|
|
2971
3143
|
reason?: string;
|
|
2972
3144
|
label: React.ReactNode;
|
|
2973
3145
|
icon?: string;
|
|
@@ -2982,7 +3154,7 @@ interface DisabledActionProps {
|
|
|
2982
3154
|
* same way the record form's field-lock reason is scoped, so a resource can
|
|
2983
3155
|
* override the generic wording via `resources.<res>.<key>`.
|
|
2984
3156
|
*/
|
|
2985
|
-
resource?:
|
|
3157
|
+
resource?: ResourceNameOrRef<N>;
|
|
2986
3158
|
/**
|
|
2987
3159
|
* Density for the STANDALONE control (ignored for `asMenuItem`, which is
|
|
2988
3160
|
* always icon + label). Defaults to `'regular'`, so every caller that
|
|
@@ -3001,12 +3173,12 @@ interface DisabledActionProps {
|
|
|
3001
3173
|
/** Surface name, for the same no-icon warning key `resolveControlChrome` keys on. */
|
|
3002
3174
|
surface?: string;
|
|
3003
3175
|
}
|
|
3004
|
-
declare function DisabledAction({ reason, label, icon, testid, size, variant, className, asMenuItem, resource, density, actionName, surface }: DisabledActionProps): React.ReactElement;
|
|
3005
|
-
declare function ActionButton(
|
|
3176
|
+
declare function DisabledAction<const N extends string = string>({ reason, label, icon, testid, size, variant, className, asMenuItem, resource: resourceInput, density, actionName, surface }: DisabledActionProps<N>): React.ReactElement;
|
|
3177
|
+
declare function ActionButton<const N extends string = string>(input: ActionButtonProps<N>): React.ReactElement | null;
|
|
3006
3178
|
//#endregion
|
|
3007
3179
|
//#region src/actions/action-overflow.d.ts
|
|
3008
|
-
interface ActionOverflowProps {
|
|
3009
|
-
resource:
|
|
3180
|
+
interface ActionOverflowProps<N extends string = string> {
|
|
3181
|
+
resource: ResourceNameOrRef<N>;
|
|
3010
3182
|
record: {
|
|
3011
3183
|
id: string;
|
|
3012
3184
|
} & Record<string, unknown>;
|
|
@@ -3027,6 +3199,14 @@ interface ActionOverflowProps {
|
|
|
3027
3199
|
* control wide. Default: {@link RowActionsCollapseContext}.
|
|
3028
3200
|
*/
|
|
3029
3201
|
collapse?: boolean;
|
|
3202
|
+
/**
|
|
3203
|
+
* The sources of the screen the actions are drawn on (a record screen's header or frame:
|
|
3204
|
+
* `FormController.sources`): an action's `when` reads them besides `record` (T4 D9 part 4). The
|
|
3205
|
+
* screen loads what its item actions' `when`s read (its show and edit demand them), so a `with`
|
|
3206
|
+
* source no node reads still decides here. Absent in a record's menu (a row, an overlay's item
|
|
3207
|
+
* menu): a `when` there reads `record` only, and a ref to any other source hides the action.
|
|
3208
|
+
*/
|
|
3209
|
+
sources?: ScreenSources;
|
|
3030
3210
|
}
|
|
3031
3211
|
/**
|
|
3032
3212
|
* Collapses an entity's actions into an overflow menu so tables and detail
|
|
@@ -3045,7 +3225,7 @@ interface ActionOverflowProps {
|
|
|
3045
3225
|
* `ghost` used to strip a destructive standalone action of its destructive
|
|
3046
3226
|
* look.
|
|
3047
3227
|
*/
|
|
3048
|
-
declare function ActionOverflow({ resource, record, surface, className, hideFlows, collapse }: ActionOverflowProps): React.ReactElement | null;
|
|
3228
|
+
declare function ActionOverflow<const N extends string = string>({ resource: resourceInput, record, surface, className, hideFlows, collapse, sources }: ActionOverflowProps<N>): React.ReactElement | null;
|
|
3049
3229
|
//#endregion
|
|
3050
3230
|
//#region src/actions/action-surface.d.ts
|
|
3051
3231
|
/**
|
|
@@ -3062,8 +3242,8 @@ type ActionSurface = 'row' | 'show' | 'edit' | 'list';
|
|
|
3062
3242
|
type BulkRecord = {
|
|
3063
3243
|
id: string;
|
|
3064
3244
|
} & Record<string, unknown>;
|
|
3065
|
-
interface BulkActionToolbarProps<TRecord extends BulkRecord = BulkRecord> {
|
|
3066
|
-
resource:
|
|
3245
|
+
interface BulkActionToolbarProps<TRecord extends BulkRecord = BulkRecord, N extends string = string> {
|
|
3246
|
+
resource: ResourceNameOrRef<N>;
|
|
3067
3247
|
/**
|
|
3068
3248
|
* TanStack table instance from the surrounding `<ResourceList>`. Used only
|
|
3069
3249
|
* as a FALLBACK, for standalone call sites that have no accumulated set of
|
|
@@ -3105,12 +3285,20 @@ interface BulkActionToolbarProps<TRecord extends BulkRecord = BulkRecord> {
|
|
|
3105
3285
|
* fields, minus any a `column` rule hides.
|
|
3106
3286
|
*/
|
|
3107
3287
|
visibleColumns?: readonly string[];
|
|
3288
|
+
/** How the built-in bulk Export reads the resource: the scope of the list the ids came from. */
|
|
3289
|
+
scope?: ScopeSource;
|
|
3290
|
+
/**
|
|
3291
|
+
* The bar's controls in place of the resource's bulk actions and the built-in Export (a link
|
|
3292
|
+
* panel's Detach). The count and Clear stay.
|
|
3293
|
+
*/
|
|
3294
|
+
actions?: React.ReactNode;
|
|
3108
3295
|
}
|
|
3109
|
-
declare function BulkActionToolbar<TRecord extends BulkRecord = BulkRecord>({ resource, table, selectedRecords, selectedIds, onClearSelection, onSelectionChange, className, visibleColumns }: BulkActionToolbarProps<TRecord>): React.ReactElement | null;
|
|
3296
|
+
declare function BulkActionToolbar<TRecord extends BulkRecord = BulkRecord, const N extends string = string>({ resource: resourceInput, table, selectedRecords, selectedIds, onClearSelection, onSelectionChange, className, visibleColumns, scope, actions }: BulkActionToolbarProps<TRecord, N>): React.ReactElement | null;
|
|
3110
3297
|
//#endregion
|
|
3111
3298
|
//#region src/flows/flow-action-button.d.ts
|
|
3112
|
-
interface FlowActionButtonProps {
|
|
3113
|
-
|
|
3299
|
+
interface FlowActionButtonProps<N extends string = string> {
|
|
3300
|
+
/** A name checked against the registered resources, or the entity ref. */
|
|
3301
|
+
readonly resource: ResourceNameOrRef<N>;
|
|
3114
3302
|
/** The flow's name in the resource's `actions`. */
|
|
3115
3303
|
readonly actionName: string;
|
|
3116
3304
|
readonly record?: {
|
|
@@ -3133,14 +3321,14 @@ interface FlowActionButtonProps {
|
|
|
3133
3321
|
* sources load then: until it has decided, the control is busy and a second click does nothing,
|
|
3134
3322
|
* so one click sends at most once.
|
|
3135
3323
|
*/
|
|
3136
|
-
declare function FlowActionButton(
|
|
3324
|
+
declare function FlowActionButton<const N extends string = string>(input: FlowActionButtonProps<N>): ReactElement | null;
|
|
3137
3325
|
//#endregion
|
|
3138
3326
|
//#region src/flows/app-flow-button.d.ts
|
|
3139
3327
|
interface AppFlowButtonProps {
|
|
3140
3328
|
/** The entry `useAppActions()` returned for a `kind: 'flow'` app action. */
|
|
3141
3329
|
readonly action: {
|
|
3142
3330
|
readonly name: string;
|
|
3143
|
-
readonly label
|
|
3331
|
+
readonly label?: string;
|
|
3144
3332
|
readonly icon?: string;
|
|
3145
3333
|
readonly disabledReason?: string;
|
|
3146
3334
|
/** A flow hosted on a custom page (P7 3.15): the control is a link to it, not a runner. */
|
|
@@ -3174,7 +3362,7 @@ interface CheckConfirmDialogProps {
|
|
|
3174
3362
|
readonly onAnchorFocus?: (field: string) => void;
|
|
3175
3363
|
/**
|
|
3176
3364
|
* Overrides the neutral `checks.dialogTitle` heading. The ACTION call sites
|
|
3177
|
-
* pass the action's own label here, so
|
|
3365
|
+
* pass the action's own label here, so «Archive» heads an archive
|
|
3178
3366
|
* prompt instead of a generic "please review".
|
|
3179
3367
|
*/
|
|
3180
3368
|
readonly title?: ReactNode;
|
|
@@ -3185,6 +3373,11 @@ interface CheckConfirmDialogProps {
|
|
|
3185
3373
|
* the old dialog's `confirmLabel` did.
|
|
3186
3374
|
*/
|
|
3187
3375
|
readonly proceedLabel?: ReactNode;
|
|
3376
|
+
/**
|
|
3377
|
+
* Overrides the neutral `checks.back` label on the cancelling button: a flow's own `dismiss`
|
|
3378
|
+
* ("Keep the order"), the word every cancel button of that flow says.
|
|
3379
|
+
*/
|
|
3380
|
+
readonly cancelLabel?: ReactNode;
|
|
3188
3381
|
/**
|
|
3189
3382
|
* `'destructive'` styles the confirming button destructively — restoring
|
|
3190
3383
|
* what `action.variant === 'destructive'` used to produce. Default
|
|
@@ -3205,7 +3398,7 @@ interface CheckConfirmDialogProps {
|
|
|
3205
3398
|
* is removed here too so a blocked user is never offered a button that does
|
|
3206
3399
|
* nothing.
|
|
3207
3400
|
*/
|
|
3208
|
-
declare function CheckConfirmDialog({ state, testid, onAnchorFocus, title, proceedLabel, tone }: CheckConfirmDialogProps): ReactElement;
|
|
3401
|
+
declare function CheckConfirmDialog({ state, testid, onAnchorFocus, title, proceedLabel, cancelLabel, tone }: CheckConfirmDialogProps): ReactElement;
|
|
3209
3402
|
//#endregion
|
|
3210
3403
|
//#region src/data-table/use-buro-data-table.d.ts
|
|
3211
3404
|
/**
|
|
@@ -3442,9 +3635,26 @@ interface FacetedFilterOption {
|
|
|
3442
3635
|
icon?: React.ComponentType<{
|
|
3443
3636
|
className?: string;
|
|
3444
3637
|
}>;
|
|
3638
|
+
/** Optional secondary line drawn under the label (an option filter's `doc.summary`). */
|
|
3639
|
+
summary?: string;
|
|
3445
3640
|
}
|
|
3446
|
-
|
|
3447
|
-
|
|
3641
|
+
/**
|
|
3642
|
+
* The column-free multi-select under {@link DataTableFacetedFilter}: the selection is a plain
|
|
3643
|
+
* list of option values the caller owns. Anything that is not a table column mounts it directly:
|
|
3644
|
+
* an option filter of a list (T4 D3) drives it from `filters.presets`, a scope dimension picker
|
|
3645
|
+
* from the dimension's selection.
|
|
3646
|
+
*/
|
|
3647
|
+
interface FacetedFilterPickerProps {
|
|
3648
|
+
/** The selected option values. */
|
|
3649
|
+
selected: readonly string[];
|
|
3650
|
+
/** Called with the whole next selection (empty for Clear or the last deselect). */
|
|
3651
|
+
onChange: (next: string[]) => void;
|
|
3652
|
+
/** A hint for the control: the trigger's tooltip and a line at the top of the popover. */
|
|
3653
|
+
hint?: string;
|
|
3654
|
+
/** Shown beside the title while nothing is selected, e.g. "All". */
|
|
3655
|
+
emptyLabel?: string;
|
|
3656
|
+
/** Whether the footer offers to clear the selection. Default `true`. */
|
|
3657
|
+
clearable?: boolean;
|
|
3448
3658
|
title: string;
|
|
3449
3659
|
options?: FacetedFilterOption[];
|
|
3450
3660
|
/**
|
|
@@ -3472,11 +3682,20 @@ interface DataTableFacetedFilterProps<TData, TValue> {
|
|
|
3472
3682
|
* 'search' → the cmdk search input
|
|
3473
3683
|
* 'option' → option item (value passed as second arg)
|
|
3474
3684
|
* 'clear' → the Clear-filters footer item
|
|
3685
|
+
* 'hint' → the hint line at the top of the popover
|
|
3475
3686
|
*/
|
|
3476
|
-
getTestId?: (role: 'trigger' | 'option' | 'clear' | 'search', value?: string) => string | undefined;
|
|
3687
|
+
getTestId?: (role: 'trigger' | 'option' | 'clear' | 'search' | 'hint', value?: string) => string | undefined;
|
|
3477
3688
|
className?: string;
|
|
3478
3689
|
}
|
|
3479
|
-
|
|
3690
|
+
interface DataTableFacetedFilterProps<TData, TValue> extends Omit<FacetedFilterPickerProps, 'selected' | 'onChange' | 'hint' | 'getTestId'> {
|
|
3691
|
+
column: Column<TData, TValue>;
|
|
3692
|
+
/** As `FacetedFilterPickerProps.getTestId`, without `'hint'`: a column filter has no hint. */
|
|
3693
|
+
getTestId?: (role: 'trigger' | 'option' | 'clear' | 'search', value?: string) => string | undefined;
|
|
3694
|
+
}
|
|
3695
|
+
/** A faceted filter bound to a TanStack column: the column's filter value is the selection. */
|
|
3696
|
+
declare function DataTableFacetedFilter<TData, TValue>({ column, getTestId, ...rest }: DataTableFacetedFilterProps<TData, TValue>): React.ReactElement;
|
|
3697
|
+
/** The picker behind `DataTableFacetedFilter`, controlled by a plain selection. */
|
|
3698
|
+
declare function FacetedFilterPicker({ title, options, loadOptions, selectedLabelFor, searchPlaceholder, emptyText, getTestId, className, selected: selectedList, onChange, hint, emptyLabel, clearable }: FacetedFilterPickerProps): React.ReactElement;
|
|
3480
3699
|
//#endregion
|
|
3481
3700
|
//#region src/data-table/data-table-text-filter.d.ts
|
|
3482
3701
|
/**
|
|
@@ -3628,7 +3847,7 @@ interface DataTableOperatorFilterProps<TData, TValue> {
|
|
|
3628
3847
|
* an adopter can override per-locale via composition rather than
|
|
3629
3848
|
* patching this file.
|
|
3630
3849
|
*/
|
|
3631
|
-
declare function formatOperatorLabel(op: FilterOperator,
|
|
3850
|
+
declare function formatOperatorLabel(op: FilterOperator, chromeT?: (key: string, opts?: {
|
|
3632
3851
|
defaultValue?: string;
|
|
3633
3852
|
}) => string): string;
|
|
3634
3853
|
declare function DataTableOperatorFilter<TData, TValue>({ column, operators, defaultOperator, valueKind, getTestId, className }: DataTableOperatorFilterProps<TData, TValue>): React.ReactElement;
|
|
@@ -3688,8 +3907,8 @@ interface DataTableViewOptionsProps<TData> {
|
|
|
3688
3907
|
*/
|
|
3689
3908
|
onReset?: () => void;
|
|
3690
3909
|
/**
|
|
3691
|
-
* Extra footer actions (#17), rendered below the column list — e.g.
|
|
3692
|
-
*
|
|
3910
|
+
* Extra footer actions (#17), rendered below the column list — e.g. «Reset
|
|
3911
|
+
* sizes» / «Restore defaults». Each is a full-width button. Shown
|
|
3693
3912
|
* in addition to `onReset`.
|
|
3694
3913
|
*/
|
|
3695
3914
|
footerActions?: Array<{
|
|
@@ -3840,20 +4059,14 @@ declare function DataTableToolbar<TData>({ table, searchColumnId, searchPlacehol
|
|
|
3840
4059
|
* once per character. Re-syncs from the external `value` when it changes
|
|
3841
4060
|
* (deep-link / saved view / clear-all).
|
|
3842
4061
|
*/
|
|
3843
|
-
declare function ListSearchInput({ resource
|
|
3844
|
-
resource:
|
|
3845
|
-
label: string;
|
|
4062
|
+
declare function ListSearchInput<const N extends string = string>({ resource: resourceInput, value, onCommit, placeholder }: {
|
|
4063
|
+
resource: ResourceNameOrRef<N>;
|
|
3846
4064
|
value: string;
|
|
3847
4065
|
onCommit: (next: string) => void;
|
|
3848
4066
|
/**
|
|
3849
|
-
* Override the placeholder. The default
|
|
3850
|
-
*
|
|
3851
|
-
*
|
|
3852
|
-
* repo passes an explicit `placeholder` instead of relying on this
|
|
3853
|
-
* default: `<ResourceListPage>` distinguishes a declarative
|
|
3854
|
-
* `views.list.search` (names its first field) from a resolver (generic
|
|
3855
|
-
* `list.search` label, since the framework cannot know what a resolver
|
|
3856
|
-
* matches), and a `related-list` placement names its own search field.
|
|
4067
|
+
* Override the placeholder. The default is the kit's `list.search` ("Search"):
|
|
4068
|
+
* a plain word that promises nothing about HOW the query is matched and
|
|
4069
|
+
* names no field, because the framework cannot know what the search matches.
|
|
3857
4070
|
*/
|
|
3858
4071
|
placeholder?: string;
|
|
3859
4072
|
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -3888,8 +4101,8 @@ declare function ListSearchInput({ resource, label, value, onCommit, placeholder
|
|
|
3888
4101
|
* label "Columns" with no icon, popover `align="start" w-64 p-2`
|
|
3889
4102
|
* with no header.
|
|
3890
4103
|
*/
|
|
3891
|
-
declare function ColumnsToggle({ resource, def, allAvailable, required, visibleColumns, defaultVisible, onChange, onResetSizes, onRestoreDefaults }: {
|
|
3892
|
-
resource:
|
|
4104
|
+
declare function ColumnsToggle<const N extends string = string>({ resource: resourceInput, def, allAvailable, required, visibleColumns, defaultVisible, onChange, onResetSizes, onRestoreDefaults }: {
|
|
4105
|
+
resource: ResourceNameOrRef<N>;
|
|
3893
4106
|
def: ResourceDef;
|
|
3894
4107
|
allAvailable: string[];
|
|
3895
4108
|
required: string[];
|
|
@@ -3938,8 +4151,8 @@ declare const ListSavedViews: () => ReactElement | null;
|
|
|
3938
4151
|
type RowRecord$1 = {
|
|
3939
4152
|
id: string;
|
|
3940
4153
|
} & Record<string, unknown>;
|
|
3941
|
-
interface ResourceListProps {
|
|
3942
|
-
resource:
|
|
4154
|
+
interface ResourceListProps<N extends string = string> {
|
|
4155
|
+
resource: ResourceNameOrRef<N>;
|
|
3943
4156
|
data?: RowRecord$1[];
|
|
3944
4157
|
total?: number;
|
|
3945
4158
|
page?: number;
|
|
@@ -3991,6 +4204,13 @@ interface ResourceListProps {
|
|
|
3991
4204
|
onMore: () => void;
|
|
3992
4205
|
};
|
|
3993
4206
|
selectable?: boolean;
|
|
4207
|
+
/**
|
|
4208
|
+
* The row-actions column (each row's item actions). `false` draws none: a read-only list
|
|
4209
|
+
* offers nothing to do with a row but open it. A function draws its own controls in the column
|
|
4210
|
+
* instead of the item actions (a link panel's Detach); keep its identity stable, the columns
|
|
4211
|
+
* are rebuilt when it changes.
|
|
4212
|
+
*/
|
|
4213
|
+
rowActions?: boolean | ((row: RowRecord$1) => React.ReactNode);
|
|
3994
4214
|
/**
|
|
3995
4215
|
* Accumulating selection owned by the caller. When provided the component
|
|
3996
4216
|
* is CONTROLLED: this is the WHOLE selected set (ids that are not on the
|
|
@@ -4028,7 +4248,12 @@ interface ResourceListProps {
|
|
|
4028
4248
|
createHref?: string;
|
|
4029
4249
|
/** Whether the list is currently filtered (changes empty-state copy). */
|
|
4030
4250
|
isFiltered?: boolean;
|
|
4031
|
-
/**
|
|
4251
|
+
/**
|
|
4252
|
+
* Called when the user clicks the "Clear filter" button in the empty state. The button is drawn
|
|
4253
|
+
* exactly when this is given: the caller decides whether there is anything to reset (a list
|
|
4254
|
+
* that starts filtered has rows narrowed and nothing to reset). `isFiltered` only picks the
|
|
4255
|
+
* wording.
|
|
4256
|
+
*/
|
|
4032
4257
|
onClearFilter?: () => void;
|
|
4033
4258
|
/**
|
|
4034
4259
|
* Replacement for the "no rows" rendering, forwarded to
|
|
@@ -4102,11 +4327,18 @@ interface ResourceListProps {
|
|
|
4102
4327
|
}[];
|
|
4103
4328
|
/**
|
|
4104
4329
|
* Sort request from a column header. `direction` is EXPLICIT when the header
|
|
4105
|
-
* menu picks
|
|
4330
|
+
* menu picks «ascending/descending/reset» (`'asc'`/`'desc'`/`null`); it
|
|
4106
4331
|
* is omitted when a caller wants the legacy 3-click toggle. Consumers should
|
|
4107
4332
|
* honour an explicit direction and fall back to toggling when it's undefined.
|
|
4108
4333
|
*/
|
|
4109
4334
|
onSort?: (field: string, direction?: 'asc' | 'desc' | null) => void;
|
|
4335
|
+
/**
|
|
4336
|
+
* Whether a column offers sort (T4 D7). The list kit passes the controller's
|
|
4337
|
+
* `sorting.sortable`; when omitted, core's `isColumnSortable` decides — nothing sorts by
|
|
4338
|
+
* default, a field's `sort` or the app's `lists.sortable` turns a column on, and a link never
|
|
4339
|
+
* sorts. A column offers sort only when this says yes AND `onSort` is supplied.
|
|
4340
|
+
*/
|
|
4341
|
+
sortable?: (column: string) => boolean;
|
|
4110
4342
|
/**
|
|
4111
4343
|
* Hide a column from a column-header menu. Receives the column name; the
|
|
4112
4344
|
* parent removes it from the visible-columns list. When omitted, the header
|
|
@@ -4136,6 +4368,24 @@ interface ResourceListProps {
|
|
|
4136
4368
|
* `views.list.optionalColumns` / `requiredColumns`).
|
|
4137
4369
|
*/
|
|
4138
4370
|
columns?: string[];
|
|
4371
|
+
/**
|
|
4372
|
+
* Each data column's resolved presentation by name (REF-117 §4.9, P10): its width (`default`,
|
|
4373
|
+
* `min`, `max`), whether it resizes, its alignment, and its cell display (implementation,
|
|
4374
|
+
* params, transform, overflow). The list controller's `columns.ui`, which `ListBody` passes.
|
|
4375
|
+
* A column it does not cover, or every column when it is omitted (a standalone mount),
|
|
4376
|
+
* resolves here with core's `resolveColumnUi` over its field and its `views.list` entry, so
|
|
4377
|
+
* a field's `ui.column` holds either way. A width is a default, not a floor: the floor is
|
|
4378
|
+
* `min` (C13).
|
|
4379
|
+
*/
|
|
4380
|
+
columnUi?: Readonly<Record<string, ResolvedColumnUi>>;
|
|
4381
|
+
/**
|
|
4382
|
+
* Where the user's column layout (widths, order, pinning) is stored: the list id of the
|
|
4383
|
+
* `buro/table-layout` UI setting, beside the resource (REF-117 §4.10, C18). The route list passes
|
|
4384
|
+
* `'route'`, a placement `<owner resource>/<placement key path>`. A list rendered by hand passes
|
|
4385
|
+
* its own stable id to keep the layout across mounts; without one, the layout lasts for the mount.
|
|
4386
|
+
* Nothing is stored without a `UiSettingsProvider` either.
|
|
4387
|
+
*/
|
|
4388
|
+
layoutId?: string;
|
|
4139
4389
|
/**
|
|
4140
4390
|
* Optional callback that hands the parent the underlying TanStack
|
|
4141
4391
|
* `Table` instance. Fires once after the table is mounted (and
|
|
@@ -4149,7 +4399,7 @@ interface ResourceListProps {
|
|
|
4149
4399
|
*/
|
|
4150
4400
|
tableRef?: (table: Table$1<RowRecord$1> | null) => void;
|
|
4151
4401
|
}
|
|
4152
|
-
declare function ResourceList({ resource, data, total, page, pageSize, onPageSize, onRequestCount, isCountingRows, pageSizeOptions, onPage, loadMore, selectable, selectedIds, onSelectionChange, className, isLoading, error, onRetry, createHref, isFiltered, onClearFilter, emptyState, rowsView, rowHref, rowQuick, rowLinkKey, renderCell, sort, onSort, onHideColumn, requiredColumns, resetLayout, columns: columnsOverride, tableRef }: ResourceListProps): React.ReactElement;
|
|
4402
|
+
declare function ResourceList<const N extends string = string>({ resource: resourceInput, data, total, page, pageSize, onPageSize, onRequestCount, isCountingRows, pageSizeOptions, onPage, loadMore, selectable, rowActions, selectedIds, onSelectionChange, className, isLoading, error, onRetry, createHref, isFiltered, onClearFilter, emptyState, rowsView, rowHref, rowQuick, rowLinkKey, renderCell, sort, onSort, sortable, onHideColumn, requiredColumns, resetLayout, columns: columnsOverride, columnUi, layoutId, tableRef }: ResourceListProps<N>): React.ReactElement;
|
|
4153
4403
|
//#endregion
|
|
4154
4404
|
//#region src/list-kit/cursor-load-more.d.ts
|
|
4155
4405
|
/**
|
|
@@ -4208,7 +4458,7 @@ declare function CursorLoadMore({ hasMore, loading, onMore }: CursorLoadMoreProp
|
|
|
4208
4458
|
/**
|
|
4209
4459
|
* Props of {@link ResourceListPage}.
|
|
4210
4460
|
*/
|
|
4211
|
-
interface ResourceListPageProps {
|
|
4461
|
+
interface ResourceListPageProps<N extends string = string> {
|
|
4212
4462
|
/**
|
|
4213
4463
|
* Registry name of the resource to list.
|
|
4214
4464
|
*
|
|
@@ -4218,7 +4468,7 @@ interface ResourceListPageProps {
|
|
|
4218
4468
|
* should 404 before mounting this component (the playground's
|
|
4219
4469
|
* `app/(admin)/[resource]/page.tsx` does exactly that).
|
|
4220
4470
|
*/
|
|
4221
|
-
resource:
|
|
4471
|
+
resource: ResourceNameOrRef<N>;
|
|
4222
4472
|
/**
|
|
4223
4473
|
* Extra `meta` merged into the underlying `useList` call — and therefore
|
|
4224
4474
|
* into the react-query cache key. This is the seam for app-level query
|
|
@@ -4243,10 +4493,10 @@ interface ResourceListPageProps {
|
|
|
4243
4493
|
*/
|
|
4244
4494
|
meta?: Record<string, unknown>;
|
|
4245
4495
|
/**
|
|
4246
|
-
* App-level per-cell renderer, consulted AFTER
|
|
4247
|
-
*
|
|
4248
|
-
*
|
|
4249
|
-
*
|
|
4496
|
+
* App-level per-cell renderer, consulted AFTER a typed resource's
|
|
4497
|
+
* discriminator badge and BEFORE the declared-`enum` badge and
|
|
4498
|
+
* `<ResourceList>`'s default field-type display. Return `undefined` to
|
|
4499
|
+
* fall through, exactly like `<ResourceList renderCell>`.
|
|
4250
4500
|
*
|
|
4251
4501
|
* The built-ins cover what the registry can describe on its own; this
|
|
4252
4502
|
* prop is for the rest — the playground uses it for a legacy hardcoded
|
|
@@ -4320,9 +4570,10 @@ interface ResourceListPageProps {
|
|
|
4320
4570
|
* covers:
|
|
4321
4571
|
*
|
|
4322
4572
|
* - **`list.cell.<resource>`** (level 1) is consulted for every cell, AFTER
|
|
4323
|
-
*
|
|
4324
|
-
*
|
|
4325
|
-
* display
|
|
4573
|
+
* a typed resource's discriminator badge and BEFORE the declared-`enum`
|
|
4574
|
+
* badge and `<ResourceList>`'s default field-type display (a field with
|
|
4575
|
+
* its own `ui.display` skips the enum badge) — the same position the
|
|
4576
|
+
* `renderCell` prop occupies, and the
|
|
4326
4577
|
* explicit prop wins when both are present. Everything else — filters,
|
|
4327
4578
|
* saved views, the columns menu, the table, pagination — stays standard.
|
|
4328
4579
|
* - **`list.filters.<resource>`** (level 2) replaces the filter region —
|
|
@@ -4343,13 +4594,14 @@ interface ResourceListPageProps {
|
|
|
4343
4594
|
*
|
|
4344
4595
|
* @see docs/superpowers/plans/2026-07-26-cfb3-assembled-page-slots.md — Tasks B3.1, B3.2
|
|
4345
4596
|
*/
|
|
4346
|
-
declare function ResourceListPage({ resource, meta, renderCell, emptyState }: ResourceListPageProps): import("react/jsx-runtime").JSX.Element;
|
|
4597
|
+
declare function ResourceListPage<const N extends string = string>({ resource: resourceInput, meta, renderCell, emptyState }: ResourceListPageProps<N>): import("react/jsx-runtime").JSX.Element;
|
|
4347
4598
|
//#endregion
|
|
4348
4599
|
//#region src/list-kit/filter-builder/filter-region.d.ts
|
|
4349
4600
|
/**
|
|
4350
|
-
* The default `list.filters.<resource>` content — search box,
|
|
4351
|
-
* controls, the builder popover trigger, applied-filter badges and a
|
|
4352
|
-
* "Clear
|
|
4601
|
+
* The default `list.filters.<resource>` content — search box, option
|
|
4602
|
+
* pickers, pinned controls, the builder popover trigger, applied-filter badges and a
|
|
4603
|
+
* "Clear filters" action (shown while `filters.canReset`, which returns the list to its initial
|
|
4604
|
+
* state), left to right. Props-free: like every list slot, it
|
|
4353
4605
|
* reads the live controller from `useResourceListContext()` rather than a
|
|
4354
4606
|
* prop chain, which is the SAME contract a registered
|
|
4355
4607
|
* `list.filters.<resource>` slot fulfils — an adopter that wants a
|
|
@@ -4358,7 +4610,7 @@ declare function ResourceListPage({ resource, meta, renderCell, emptyState }: Re
|
|
|
4358
4610
|
* exported) into its own region instead of forking this file.
|
|
4359
4611
|
*
|
|
4360
4612
|
* A THIN wrapper: everything that needs the list controller (the search
|
|
4361
|
-
* box, its placeholder, "Clear
|
|
4613
|
+
* box, its placeholder, "Clear filters") stays here — that's the page's
|
|
4362
4614
|
* concern, not the builder's — and everything else (the pinned controls,
|
|
4363
4615
|
* the panel, the badges, and the `open`/`focusPath`/`externalRemoval`
|
|
4364
4616
|
* wiring between them) is `<FilterBuilder>`'s job, which has no controller
|
|
@@ -4387,6 +4639,13 @@ interface FilterBuilderProps {
|
|
|
4387
4639
|
readonly pinnedFields?: readonly FilterFieldSpec[];
|
|
4388
4640
|
readonly pinnedValue?: readonly Expression$2[];
|
|
4389
4641
|
readonly setPinnedValue?: (next: readonly Expression$2[]) => void;
|
|
4642
|
+
/**
|
|
4643
|
+
* The list's option filters (`filters.presets`), drawn as faceted pickers before the pinned
|
|
4644
|
+
* controls. Absent where there are none (the relation picker's dialog).
|
|
4645
|
+
*/
|
|
4646
|
+
readonly presets?: readonly ListOptionFilter[];
|
|
4647
|
+
/** `filters.setPreset`: it resets the page itself, so no `setPage(1)` is composed here. */
|
|
4648
|
+
readonly setPreset?: (id: string, optionIds: readonly string[]) => void;
|
|
4390
4649
|
/** Apply / a pinned write / a badge × all reset to page 1, same as every other filter mutation. */
|
|
4391
4650
|
readonly setPage: (page: number) => void;
|
|
4392
4651
|
readonly testIdBase: string;
|
|
@@ -4561,33 +4820,6 @@ interface FilterBadgesProps {
|
|
|
4561
4820
|
readonly pinnedValue?: readonly Expression$1[];
|
|
4562
4821
|
readonly setPinnedValue?: (next: readonly Expression$1[]) => void;
|
|
4563
4822
|
}
|
|
4564
|
-
/**
|
|
4565
|
-
* One badge per top-level row of the APPLIED filter group, plus one per
|
|
4566
|
-
* `filters.fixed` entry that carries a `label`, plus one per PINNED-slot
|
|
4567
|
-
* expression no `pinnedFields` control claims (finding 3, see `pinnedValue`
|
|
4568
|
-
* above).
|
|
4569
|
-
*
|
|
4570
|
-
* Group-row badges have two very different click targets:
|
|
4571
|
-
* - the × removes that row and calls `setGroup` IMMEDIATELY, bypassing the
|
|
4572
|
-
* panel's draft entirely — this is a deletion, not an edit, and making
|
|
4573
|
-
* the user re-open the panel and press "Apply" to confirm a removal they
|
|
4574
|
-
* already committed to would be a broken expectation;
|
|
4575
|
-
* - the body opens the panel with `focusPath` pointing at this row, for a
|
|
4576
|
-
* user who wants to ADJUST rather than remove it. It is a real
|
|
4577
|
-
* `<button>` (finding 6 of the SP2 final review — it used to be a plain
|
|
4578
|
-
* `<div onClick>`, reachable and activatable only by mouse), so it picks
|
|
4579
|
-
* up keyboard focus, Enter/Space activation, and a browser-native
|
|
4580
|
-
* accessible name (its own text — the `describeRow` summary — same as
|
|
4581
|
-
* any other button whose label IS its content) for free. It sits beside
|
|
4582
|
-
* the × as a SIBLING, not a nested/overlapping hit target, so activating
|
|
4583
|
-
* one never also triggers the other.
|
|
4584
|
-
*
|
|
4585
|
-
* Fixed-filter badges (labelled call-site narrowing) and orphan pinned-slot
|
|
4586
|
-
* badges both render with NO body affordance: fixed badges because the
|
|
4587
|
-
* user did not add them and cannot remove them; pinned-slot badges because
|
|
4588
|
-
* there is no builder row behind them to focus — only a working × to
|
|
4589
|
-
* remove that one expression from the pinned slot.
|
|
4590
|
-
*/
|
|
4591
4823
|
declare function FilterBadges(props: FilterBadgesProps): React.ReactElement;
|
|
4592
4824
|
//#endregion
|
|
4593
4825
|
//#region src/list-kit/filter-builder/pinned-filter-controls.d.ts
|
|
@@ -4633,6 +4865,28 @@ interface PinnedFilterControlsProps {
|
|
|
4633
4865
|
*/
|
|
4634
4866
|
declare function PinnedFilterControls(props: PinnedFilterControlsProps): React.ReactElement;
|
|
4635
4867
|
//#endregion
|
|
4868
|
+
//#region src/list-kit/filter-builder/preset-filter-controls.d.ts
|
|
4869
|
+
interface PresetFilterControlsProps {
|
|
4870
|
+
/** The list's option filters (`filters.presets`). */
|
|
4871
|
+
readonly presets: readonly ListOptionFilter[];
|
|
4872
|
+
/**
|
|
4873
|
+
* `filters.setPreset`: it writes the whole selection of one filter and resets the page to 1
|
|
4874
|
+
* itself, so this component does not.
|
|
4875
|
+
*/
|
|
4876
|
+
readonly setPreset: (id: string, optionIds: readonly string[]) => void;
|
|
4877
|
+
readonly testIdBase: string;
|
|
4878
|
+
}
|
|
4879
|
+
/**
|
|
4880
|
+
* One faceted multi-select per option filter (T4 D3, D4): the filter's label is the trigger, its
|
|
4881
|
+
* `doc.summary` the hint, each option shows its label with its `doc.summary` under it. The
|
|
4882
|
+
* trigger doubles as the chip: it lists the selected options, and deselecting the last one (or
|
|
4883
|
+
* the picker's own Clear) writes an empty selection, which the URL keeps as `?<ns>.<id>=` so a
|
|
4884
|
+
* reload keeps the initial option removed.
|
|
4885
|
+
*
|
|
4886
|
+
* Test ids: `<base>:preset:<id>:trigger | :option:<optionId> | :clear | :search | :hint`.
|
|
4887
|
+
*/
|
|
4888
|
+
declare function PresetFilterControls(props: PresetFilterControlsProps): React.ReactElement;
|
|
4889
|
+
//#endregion
|
|
4636
4890
|
//#region src/list-kit/filter-builder/values/filter-value-control.d.ts
|
|
4637
4891
|
interface FilterValueControlProps {
|
|
4638
4892
|
readonly kind: FilterKind;
|
|
@@ -4652,7 +4906,9 @@ interface FilterValueControlProps {
|
|
|
4652
4906
|
*/
|
|
4653
4907
|
readonly fieldLabel?: string;
|
|
4654
4908
|
/**
|
|
4655
|
-
* Visible hint inside a text/number box (`ScalarValueInput`)
|
|
4909
|
+
* Visible hint inside a text/number box (`ScalarValueInput`), and the empty
|
|
4910
|
+
* text of a select-like trigger (enum, options, relation, boolean), whose
|
|
4911
|
+
* accessible name stays "Value for <field>". Only a caller
|
|
4656
4912
|
* that shows the control with nothing naming its field beside it passes one:
|
|
4657
4913
|
* the pinned toolbar (`PinnedFilterControls`) gives the field's label, so a
|
|
4658
4914
|
* pinned text filter is not an unlabelled empty box (REF-44). A builder row
|
|
@@ -4846,8 +5102,8 @@ declare function listSlot(region: ListSlotRegion, resource: string): string;
|
|
|
4846
5102
|
* `'filters'` overload's contract is byte-identical to before this
|
|
4847
5103
|
* region existed.
|
|
4848
5104
|
*/
|
|
4849
|
-
declare function useListSlot(region: 'cell', resource:
|
|
4850
|
-
declare function useListSlot(region: 'filters', resource:
|
|
5105
|
+
declare function useListSlot<const N extends string = string>(region: 'cell', resource: ResourceNameOrRef<N>): ListCellRenderer | undefined;
|
|
5106
|
+
declare function useListSlot<const N extends string = string>(region: 'filters', resource: ResourceNameOrRef<N>): ListSlot | undefined;
|
|
4851
5107
|
//#endregion
|
|
4852
5108
|
//#region src/saved-views/saved-views-dropdown.d.ts
|
|
4853
5109
|
/**
|
|
@@ -4894,7 +5150,14 @@ declare function useListSlot(region: 'filters', resource: string): ListSlot | un
|
|
|
4894
5150
|
* dialogs, and `onDeleteEntry`/`onManage` to the delete flow / manage
|
|
4895
5151
|
* dialog.
|
|
4896
5152
|
*/
|
|
4897
|
-
interface SavedViewsDropdownProps {
|
|
5153
|
+
interface SavedViewsDropdownProps<N extends string = string> {
|
|
5154
|
+
/**
|
|
5155
|
+
* The resource the views belong to. Declared views (`adopterViews`) read their label from
|
|
5156
|
+
* `resources.<resource>.savedViews.<id>` in the bundle (that resource's own entry only, never
|
|
5157
|
+
* `resources._` or `common`); without it they render as declared.
|
|
5158
|
+
* User-saved `entries` are user data and always render as written.
|
|
5159
|
+
*/
|
|
5160
|
+
resource?: ResourceNameOrRef<N>;
|
|
4898
5161
|
/** Adopter-defined views from `def.views.list.savedViews`. Always read-only. */
|
|
4899
5162
|
adopterViews: SavedViewDef[];
|
|
4900
5163
|
/** Adapter-backed entries, WITH scope/permission metadata (Task 9). */
|
|
@@ -4954,19 +5217,17 @@ interface SavedViewsDropdownProps {
|
|
|
4954
5217
|
/** Popover content alignment. Default: 'start'. */
|
|
4955
5218
|
popoverAlign?: 'start' | 'center' | 'end';
|
|
4956
5219
|
}
|
|
4957
|
-
declare function SavedViewsDropdown({ adopterViews, entries, issues, onApply, onSaveCurrent, canSaveCurrent, onManage, onRenameEntry, onDeleteEntry, onForkEntry, canFork, getTestId, triggerLabel, iconOnly, triggerClassName, popoverContentClassName, popoverAlign }: SavedViewsDropdownProps): React.ReactElement;
|
|
5220
|
+
declare function SavedViewsDropdown<const N extends string = string>({ resource: resourceInput, adopterViews, entries, issues, onApply, onSaveCurrent, canSaveCurrent, onManage, onRenameEntry, onDeleteEntry, onForkEntry, canFork, getTestId, triggerLabel, iconOnly, triggerClassName, popoverContentClassName, popoverAlign }: SavedViewsDropdownProps<N>): React.ReactElement;
|
|
4958
5221
|
//#endregion
|
|
4959
5222
|
//#region src/resource/list-error-state.d.ts
|
|
4960
5223
|
interface ListErrorStateProps {
|
|
4961
5224
|
/** Whatever the query threw. */
|
|
4962
|
-
error:
|
|
4963
|
-
message?: string;
|
|
4964
|
-
} | Error;
|
|
5225
|
+
error: unknown;
|
|
4965
5226
|
/** When provided, a Retry button is rendered and calls this. */
|
|
4966
5227
|
onRetry?: () => void;
|
|
4967
5228
|
/** Resource name, used to build the retry button's test id. */
|
|
4968
5229
|
resource?: string;
|
|
4969
|
-
/** Overrides the default
|
|
5230
|
+
/** Overrides the default heading (the `list.errorTitle` bundle entry). */
|
|
4970
5231
|
title?: string;
|
|
4971
5232
|
className?: string;
|
|
4972
5233
|
}
|
|
@@ -4979,19 +5240,21 @@ interface ListErrorStateProps {
|
|
|
4979
5240
|
* point of slots — but the slot then had to hand-roll its own error branch,
|
|
4980
5241
|
* and hand-rolled it worse: a bare red card printing
|
|
4981
5242
|
*
|
|
4982
|
-
*
|
|
5243
|
+
* «Could not load schedules. Temporal GET
|
|
4983
5244
|
* /namespaces/default/schedules?maximumPageSize=10 -> 502»
|
|
4984
5245
|
*
|
|
4985
5246
|
* — a raw internal HTTP trace under a Russian sentence, with NO way to retry.
|
|
4986
5247
|
* When Temporal was briefly down, the only recovery was reloading the page.
|
|
4987
5248
|
*
|
|
4988
5249
|
* A slot author should not have to re-derive an error state the framework
|
|
4989
|
-
* already knows how to render, so this is now shared by both. `
|
|
4990
|
-
*
|
|
4991
|
-
*
|
|
4992
|
-
*
|
|
5250
|
+
* already knows how to render, so this is now shared by both. It is the `list`
|
|
5251
|
+
* surface of `<LoadError>`: the sentence is the error's own text (its code's, its
|
|
5252
|
+
* message reference's), a plain-language sentence for a dead network or an
|
|
5253
|
+
* unavailable service, or `list.errorBody`; an HTTP trace or a thrown message is
|
|
5254
|
+
* never the sentence. The raw text stays reachable under «Details», in
|
|
5255
|
+
* development, for whoever has to file the bug.
|
|
4993
5256
|
*/
|
|
4994
|
-
declare function ListErrorState(
|
|
5257
|
+
declare function ListErrorState(props: ListErrorStateProps): React.ReactElement;
|
|
4995
5258
|
//#endregion
|
|
4996
5259
|
//#region src/resource/record-display-name.d.ts
|
|
4997
5260
|
/**
|
|
@@ -5001,9 +5264,9 @@ declare function ListErrorState({ error, onRetry, resource, title, className }:
|
|
|
5001
5264
|
declare function recordDisplayName(record: Record<string, unknown>, displayField?: string): string;
|
|
5002
5265
|
//#endregion
|
|
5003
5266
|
//#region src/resource/page-header.d.ts
|
|
5004
|
-
interface PageHeaderProps {
|
|
5267
|
+
interface PageHeaderProps<N extends string = string> {
|
|
5005
5268
|
/** Resource name (matches the registry key). Used for back-link target + label resolution. */
|
|
5006
|
-
resource:
|
|
5269
|
+
resource: ResourceNameOrRef<N>;
|
|
5007
5270
|
/**
|
|
5008
5271
|
* Page mode. Drives default title:
|
|
5009
5272
|
* - 'list' → labelPlural
|
|
@@ -5035,7 +5298,7 @@ interface PageHeaderProps {
|
|
|
5035
5298
|
*/
|
|
5036
5299
|
breadcrumbs?: ReactNode;
|
|
5037
5300
|
/**
|
|
5038
|
-
* Render the textual `←
|
|
5301
|
+
* Render the textual `← Back to …` link on detail pages. Defaults to FALSE.
|
|
5039
5302
|
*
|
|
5040
5303
|
* An app shell that already renders breadcrumbs in its top bar (the common
|
|
5041
5304
|
* layout, and what the playground does) makes this link a third redundant nav
|
|
@@ -5047,7 +5310,7 @@ interface PageHeaderProps {
|
|
|
5047
5310
|
* Render the page title as a VISIBLE heading. Defaults to FALSE.
|
|
5048
5311
|
*
|
|
5049
5312
|
* The title almost always restates the trailing breadcrumb directly above it
|
|
5050
|
-
* (
|
|
5313
|
+
* («Documents › Order codes №53» followed by an h1 «Order codes №53»), and an
|
|
5051
5314
|
* h1 plus its margins costs ~70px of vertical space on every screen — space a
|
|
5052
5315
|
* dense admin table wants back.
|
|
5053
5316
|
*
|
|
@@ -5060,21 +5323,21 @@ interface PageHeaderProps {
|
|
|
5060
5323
|
/**
|
|
5061
5324
|
* Replace the resource label used to BUILD the title, without replacing the
|
|
5062
5325
|
* title template. `title` overrides the whole string; this keeps the
|
|
5063
|
-
* localized
|
|
5326
|
+
* localized «Create: {{label}}» / «Edit {{label}}» phrasing and only
|
|
5064
5327
|
* swaps in a more specific noun (e.g. the picked document type). Callers
|
|
5065
5328
|
* therefore don't have to reimplement the i18n template to say
|
|
5066
|
-
*
|
|
5329
|
+
* «Create: Order codes».
|
|
5067
5330
|
*/
|
|
5068
5331
|
labelOverride?: string;
|
|
5069
5332
|
className?: string;
|
|
5070
5333
|
}
|
|
5071
|
-
declare function PageHeader({ resource, mode, recordName, backHref, backLabel, actions, title, breadcrumbs, backLink, visibleTitle, labelOverride, className }: PageHeaderProps): React.ReactElement | null;
|
|
5334
|
+
declare function PageHeader<const N extends string = string>({ resource: resourceInput, mode, recordName, backHref, backLabel, actions, title, breadcrumbs, backLink, visibleTitle, labelOverride, className }: PageHeaderProps<N>): React.ReactElement | null;
|
|
5072
5335
|
/**
|
|
5073
5336
|
* The show-page `<PageHeader>`: the breadcrumb, the record's title and the resolved
|
|
5074
5337
|
* `<ActionOverflow surface="show">` item-action list, then any `extraActions`.
|
|
5075
5338
|
*/
|
|
5076
|
-
declare function ShowPageHeader({ resource, record, extraActions, breadcrumbs }: {
|
|
5077
|
-
resource:
|
|
5339
|
+
declare function ShowPageHeader<const N extends string = string>({ resource: resourceInput, record, extraActions, breadcrumbs }: {
|
|
5340
|
+
resource: ResourceNameOrRef<N>;
|
|
5078
5341
|
record: {
|
|
5079
5342
|
id: string;
|
|
5080
5343
|
} & Record<string, unknown>;
|
|
@@ -5085,8 +5348,8 @@ declare function ShowPageHeader({ resource, record, extraActions, breadcrumbs }:
|
|
|
5085
5348
|
* The edit-page `<PageHeader>`: the back-link, the record's title and the resolved
|
|
5086
5349
|
* `<ActionOverflow surface="edit">` item-action list.
|
|
5087
5350
|
*/
|
|
5088
|
-
declare function EditPageHeader({ resource, record, backHref, breadcrumbs }: {
|
|
5089
|
-
resource:
|
|
5351
|
+
declare function EditPageHeader<const N extends string = string>({ resource: resourceInput, record, backHref, breadcrumbs }: {
|
|
5352
|
+
resource: ResourceNameOrRef<N>;
|
|
5090
5353
|
record: {
|
|
5091
5354
|
id: string;
|
|
5092
5355
|
} & Record<string, unknown>;
|
|
@@ -5095,9 +5358,9 @@ declare function EditPageHeader({ resource, record, backHref, breadcrumbs }: {
|
|
|
5095
5358
|
}): React.ReactElement;
|
|
5096
5359
|
//#endregion
|
|
5097
5360
|
//#region src/resource/create-button.d.ts
|
|
5098
|
-
interface CreateButtonProps {
|
|
5361
|
+
interface CreateButtonProps<N extends string = string> {
|
|
5099
5362
|
/** Resource this creates. Required — the button gates itself. */
|
|
5100
|
-
resource:
|
|
5363
|
+
resource: ResourceNameOrRef<N>;
|
|
5101
5364
|
/** Target create route, e.g. `resourceCreateHref(def, resource)`. Ignored with `onOpen`. */
|
|
5102
5365
|
href: string;
|
|
5103
5366
|
/**
|
|
@@ -5126,14 +5389,15 @@ interface CreateButtonProps {
|
|
|
5126
5389
|
* nothing for `absent`/`hidden`, a focusable `aria-disabled` control with a
|
|
5127
5390
|
* toast reason for `disabled`, and the normal link for `available`.
|
|
5128
5391
|
*/
|
|
5129
|
-
declare function CreateButton({ resource, href, testid, size, variant, label, className, onOpen }: CreateButtonProps): React.ReactElement | null;
|
|
5392
|
+
declare function CreateButton<const N extends string = string>({ resource: resourceInput, href, testid, size, variant, label, className, onOpen }: CreateButtonProps<N>): React.ReactElement | null;
|
|
5130
5393
|
//#endregion
|
|
5131
5394
|
//#region src/resource/form-context.d.ts
|
|
5132
5395
|
/**
|
|
5133
5396
|
* Minimal form-control handle exposed to field renderers so a field can update
|
|
5134
5397
|
* SIBLING fields (a field renderer otherwise only sees its own value). Used for
|
|
5135
5398
|
* reactive prefills — e.g. picking a product on a GTIN field also fills the
|
|
5136
|
-
*
|
|
5399
|
+
* «Product name» / «Code type» fields (#2). Every form host provides it:
|
|
5400
|
+
* `<RecordScreen>`, a flow's form and `<DeclarativeForm>`.
|
|
5137
5401
|
*/
|
|
5138
5402
|
interface FormControl {
|
|
5139
5403
|
/** Merge a patch of `{ fieldName: value }` into the form's live values. */
|
|
@@ -5577,8 +5841,22 @@ type SelectContentProps = React$1.ComponentPropsWithoutRef<typeof SelectPrimitiv
|
|
|
5577
5841
|
declare const SelectContent: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
5578
5842
|
type SelectLabelProps = React$1.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>;
|
|
5579
5843
|
declare const SelectLabel: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
5580
|
-
type SelectItemProps = React$1.ComponentPropsWithoutRef<typeof SelectPrimitive.Item
|
|
5581
|
-
|
|
5844
|
+
type SelectItemProps = React$1.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> & {
|
|
5845
|
+
/**
|
|
5846
|
+
* Secondary text rendered under the label. It sits outside `ItemText` on
|
|
5847
|
+
* purpose: Radix clones everything inside `ItemText` into the closed trigger,
|
|
5848
|
+
* so a description placed there would be glued onto the selected value.
|
|
5849
|
+
*/
|
|
5850
|
+
description?: React$1.ReactNode;
|
|
5851
|
+
};
|
|
5852
|
+
declare const SelectItem: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & {
|
|
5853
|
+
/**
|
|
5854
|
+
* Secondary text rendered under the label. It sits outside `ItemText` on
|
|
5855
|
+
* purpose: Radix clones everything inside `ItemText` into the closed trigger,
|
|
5856
|
+
* so a description placed there would be glued onto the selected value.
|
|
5857
|
+
*/
|
|
5858
|
+
description?: React$1.ReactNode;
|
|
5859
|
+
} & React$1.RefAttributes<HTMLDivElement>>;
|
|
5582
5860
|
type SelectSeparatorProps = React$1.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>;
|
|
5583
5861
|
declare const SelectSeparator: React$1.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
|
|
5584
5862
|
//#endregion
|
|
@@ -6082,14 +6360,22 @@ interface AppShellProps {
|
|
|
6082
6360
|
palette?: Slot;
|
|
6083
6361
|
/** Passed to `AppLayout`, typically `<DocPanel />`. */
|
|
6084
6362
|
docPanel?: ReactNode;
|
|
6363
|
+
/**
|
|
6364
|
+
* Default `true`: `children` render inside `<NavChrome>`, the secondary sidebar and tabs of
|
|
6365
|
+
* the active navigation group chain, mounted once here so it keeps its DOM node while the
|
|
6366
|
+
* user moves within an area. `false` renders `children` bare, for an app that places
|
|
6367
|
+
* `<NavChrome>` itself (also the way to pass it `entryFilter` or `icons`).
|
|
6368
|
+
*/
|
|
6369
|
+
navChrome?: boolean;
|
|
6085
6370
|
children: ReactNode;
|
|
6086
6371
|
}
|
|
6087
6372
|
/**
|
|
6088
|
-
* `AppLayout` with the default sidebar, header and command palette,
|
|
6089
|
-
* context they read. Renders inside
|
|
6090
|
-
* `LinkComponentProvider`; it does not boot the runtime,
|
|
6373
|
+
* `AppLayout` with the default sidebar, header and command palette, the area chrome
|
|
6374
|
+
* (`<NavChrome>`) around its children, and the brand and user context they read. Renders inside
|
|
6375
|
+
* `BuroProvider`, a `RouterAdapter` and a `LinkComponentProvider`; it does not boot the runtime,
|
|
6376
|
+
* own routes or guard auth.
|
|
6091
6377
|
*/
|
|
6092
|
-
declare function AppShell({ brand, user, loginPath, sidebar, header, palette, docPanel, children }: AppShellProps): ReactElement;
|
|
6378
|
+
declare function AppShell({ brand, user, loginPath, sidebar, header, palette, docPanel, navChrome, children }: AppShellProps): ReactElement;
|
|
6093
6379
|
//#endregion
|
|
6094
6380
|
//#region src/shell/default-command-palette.d.ts
|
|
6095
6381
|
interface DefaultCommandPaletteProps {
|
|
@@ -6202,7 +6488,7 @@ declare function useThemePaletteActions(): ActionItem[];
|
|
|
6202
6488
|
//#endregion
|
|
6203
6489
|
//#region src/shell/language-submenu.d.ts
|
|
6204
6490
|
/**
|
|
6205
|
-
* A locale's name in its own language ("English", "
|
|
6491
|
+
* A locale's name in its own language ("English", "Deutsch", "Français"),
|
|
6206
6492
|
* capitalised. Falls back to the bare code when `Intl.DisplayNames` does not
|
|
6207
6493
|
* know it (or the code is not a valid BCP-47 tag).
|
|
6208
6494
|
*/
|
|
@@ -6220,5 +6506,5 @@ declare function useLanguagePaletteActions(): ActionItem[];
|
|
|
6220
6506
|
declare const PACKAGE_NAME: "@burojs/ui-shadcn";
|
|
6221
6507
|
declare const PACKAGE_VERSION: "0.0.0";
|
|
6222
6508
|
//#endregion
|
|
6223
|
-
export { ActionButton, type ActionButtonProps, type ActionItem, ActionOverflow, type ActionOverflowProps, type ActionSurface, AlertDialog, AlertDialogAction, AlertDialogActionProps, AlertDialogCancel, AlertDialogCancelProps, AlertDialogContent, AlertDialogContentProps, AlertDialogDescription, AlertDialogDescriptionProps, AlertDialogFooter, AlertDialogFooterProps, AlertDialogHeader, AlertDialogHeaderProps, AlertDialogOverlay, AlertDialogOverlayProps, AlertDialogPortal, AlertDialogTitle, AlertDialogTitleProps, AlertDialogTrigger, AppActions, AppFlowButton, type AppFlowButtonProps, AppHeader, type AppHeaderProps, AppLayout, type AppLayoutProps, AppShell, type AppShellProps, AppSidebar, type AppSidebarProps, AuthPage, type AuthPageProps, Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, BooleanDisplay, BooleanInput, BrandMark, Breadcrumbs, type BreadcrumbsProps, type BuildNavItemsArgs, BulkActionToolbar, type BulkActionToolbarProps, Button, ButtonProps, Card, CardContent, CardContentProps, CardDescription, CardDescriptionProps, CardFooter, CardFooterProps, CardHeader, CardHeaderProps, CardProps, CardTitle, CardTitleProps, CheckConfirmDialog, type CheckConfirmDialogProps, Checkbox, CheckboxProps, Collapsible, CollapsibleContent, CollapsibleTrigger, ColumnsToggle, Command, CommandDialog, CommandDialogProps, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandLoadingProps, CommandPalette, CommandPaletteActionsGroup, type CommandPaletteActionsGroupProps, type CommandPaletteActionsTestIdRole, CommandPaletteCreateGroup, type CommandPaletteCreateGroupProps, type CommandPaletteCreateTestIdRole, CommandPaletteDocsGroup, type CommandPaletteDocsGroupProps, CommandPaletteNavigationGroups, type CommandPaletteNavigationGroupsProps, type CommandPaletteNavigationTestIdRole, type CommandPaletteProps, CommandPaletteRecentGroup, type CommandPaletteRecentGroupProps, type CommandPaletteRecentTestIdRole, CommandPaletteRecordsGroup, type CommandPaletteRecordsGroupProps, type CommandPaletteRecordsTestIdRole, type CommandPaletteTestIdRole, CommandPaletteTrigger, type CommandPaletteTriggerProps, CommandSeparator, ContextPicker, type ContextPickerProps, CopyId, CreateButton, type CreateButtonProps, CursorLoadMore, type CursorLoadMoreProps,
|
|
6509
|
+
export { ActionButton, type ActionButtonProps, type ActionItem, ActionOverflow, type ActionOverflowProps, type ActionSurface, AlertDialog, AlertDialogAction, AlertDialogActionProps, AlertDialogCancel, AlertDialogCancelProps, AlertDialogContent, AlertDialogContentProps, AlertDialogDescription, AlertDialogDescriptionProps, AlertDialogFooter, AlertDialogFooterProps, AlertDialogHeader, AlertDialogHeaderProps, AlertDialogOverlay, AlertDialogOverlayProps, AlertDialogPortal, AlertDialogTitle, AlertDialogTitleProps, AlertDialogTrigger, AppActions, AppFlowButton, type AppFlowButtonProps, AppHeader, type AppHeaderProps, AppLayout, type AppLayoutProps, AppShell, type AppShellProps, AppSidebar, type AppSidebarProps, AuthPage, type AuthPageProps, Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, BooleanDisplay, BooleanInput, BrandMark, Breadcrumbs, type BreadcrumbsProps, type BuildNavItemsArgs, BulkActionToolbar, type BulkActionToolbarProps, Button, ButtonProps, Card, CardContent, CardContentProps, CardDescription, CardDescriptionProps, CardFooter, CardFooterProps, CardHeader, CardHeaderProps, CardProps, CardTitle, CardTitleProps, CheckConfirmDialog, type CheckConfirmDialogProps, Checkbox, CheckboxProps, Collapsible, CollapsibleContent, CollapsibleTrigger, ColumnsToggle, Command, CommandDialog, CommandDialogProps, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandLoadingProps, CommandPalette, CommandPaletteActionsGroup, type CommandPaletteActionsGroupProps, type CommandPaletteActionsTestIdRole, CommandPaletteCreateGroup, type CommandPaletteCreateGroupProps, type CommandPaletteCreateTestIdRole, CommandPaletteDocsGroup, type CommandPaletteDocsGroupProps, CommandPaletteNavigationGroups, type CommandPaletteNavigationGroupsProps, type CommandPaletteNavigationTestIdRole, type CommandPaletteProps, CommandPaletteRecentGroup, type CommandPaletteRecentGroupProps, type CommandPaletteRecentTestIdRole, CommandPaletteRecordsGroup, type CommandPaletteRecordsGroupProps, type CommandPaletteRecordsTestIdRole, type CommandPaletteTestIdRole, CommandPaletteTrigger, type CommandPaletteTriggerProps, CommandSeparator, ContextPicker, type ContextPickerProps, CopyId, CreateButton, type CreateButtonProps, CursorLoadMore, type CursorLoadMoreProps, DEFAULT_LANGUAGE_STORAGE_KEY, DataTable, DataTableDateRangeFilter, type DataTableDateRangeFilterProps, DataTableEnumFilter, type DataTableEnumFilterProps, DataTableFacetedFilter, type DataTableFacetedFilterProps, DataTableNumRangeFilter, type DataTableNumRangeFilterProps, DataTableOperatorFilter, type DataTableOperatorFilterProps, type DataTableProps, DataTableRowActions, type DataTableRowActionsProps, DataTableTextFilter, type DataTableTextFilterProps, DataTableToolbar, type DataTableToolbarProps, DataTableViewOptions, type DataTableViewOptionsProps, DateDisplay, DateInput, DeclarativeDisplay, type DeclarativeDisplayProps, DeclarativeForm, type DeclarativeFormProps, type DeclarativeFormSlots, DefaultCommandPalette, type DefaultCommandPaletteProps, Dialog, DialogClose, DialogContent, DialogContentProps, DialogDescription, DialogDescriptionProps, type DialogFilterState, DialogFooter, DialogFooterProps, DialogHeader, DialogHeaderProps, DialogOverlayProps, DialogPresentationHost, DialogPresentationShell, DialogTitle, DialogTitleProps, DialogTrigger, DisabledAction, type DisabledActionProps, DocBrowser, type DocBrowserProps, DocInfo, type DocInfoProps, DocPanel, type DocPanelProps, DocTrailHelp, type DocTrailHelpProps, DocumentTitleProvider, type DraftRemovalSignal, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ENUM_PICKER_CLEAR_SENTINEL, EditPageHeader, EnumBadge, type EnumBadgeProps, EnumDisplay, EnumInput, EnumPicker, type EnumPickerProps, EnumDisplay$1 as EnumValueDisplay, type EnumDisplayProps as EnumValueDisplayProps, type EnumDisplayVariant as EnumValueDisplayVariant, ExportButton, type ExportButtonProps, ExportDialog, type ExportDialogProps, type FacetedFilterOption, FacetedFilterPicker, type FacetedFilterPickerProps, Field, FieldDisplay, type FieldDisplayProps, type FieldProps, FileDisplay, FileField, type FileFieldProps, FileInput, type FileInputProps, FilterBadges, type FilterBadgesProps, FilterBuilder, type FilterBuilderProps, type FilterOperator, FilterPanel, type FilterPanelProps, FilterRegion, FilterValueControl, type FilterValueControlProps, FlowActionButton, type FlowActionButtonProps, Form, FormActions, FormControl, FormControlProps, FormDescription, FormDescriptionProps, FormField, FormItem, FormItemProps, FormLabel, FormLabelProps, FormMessage, FormMessageProps, HeaderBreadcrumbs, HelpButton, type HelpButtonProps, Icon, IconComponent, IconProps, Input, InputProps, Label, LabelProps, LanguageSubmenu, LanguageSwitch, type LanguageSwitchApi, type LanguageSwitchProps, type LinkComponent, type LinkComponentProps, LinkComponentProvider, type LinkComponentProviderProps, LinkKeysDisplay, ListBody, ListBulkBar, type ListCellRenderer, ListColumns, ListControls, ListCreate, ListErrorState, type ListErrorStateProps, ListExport, ListFilters, ListFlows, ListLive, ListSavedViews, ListSearchInput, type ListSlot, type ListSlotRegion, type LoginCredentials, LoginForm, type LoginFormProps, NavAreaPage, NavChrome, type NavChromeProps, type NavItem, type NavLayout, type NavLayoutProps, NavMain, type NavMainProps, type NavTreeEntry, type NavTreeLayout, type NavTreeSection, NavigationGuardDialog, NumberDisplay, NumberInput, PACKAGE_NAME, PACKAGE_VERSION, type PageBreadcrumbsProps, PageHeader, type PageHeaderProps, type PaletteState, PinnedFilterControls, type PinnedFilterControlsProps, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverContentProps, PopoverPresentationHost, PopoverTrigger, type PresentationCopy, PresetFilterControls, type PresetFilterControlsProps, Progress, ProgressProps, RecordActions, RecordBreadcrumbs, RecordPage, type RecordPageProps, RecordScreen, type RecordScreenProps, RecordTitle, RefreshButton, type RefreshButtonProps, RelationDisplay, RelationField, RelationManyDisplay, RelationPicker, type RelationPickerCancelReason, LazyRelationPickerDialog as RelationPickerDialog, type RelationPickerDialogProps, type RelationPickerHandle, RelationPickerInput, type RelationPickerOpenOptions, type RelationPickerProps, type RelationPickerResult, type RelationPickerRow, type ResolvedTheme, type ResourceBreadcrumbsProps, ResourceList, ResourceListPage, type ResourceListPageProps, type ResourceListProps, ResourcePageRouter, type ResourcePageRouterProps, type RowActionDescriptor, SavedViewsDropdown, type SavedViewsDropdownProps, ScopeDimensionPicker, type ScopeDimensionPickerProps, type ScopeOption, ScopeSwitcher, type ScopeSwitcherProps, SecondarySidebarLayout, Select, SelectContent, SelectContentProps, SelectGroup, SelectItem, SelectItemProps, SelectLabel, SelectLabelProps, SelectScrollDownButton, SelectScrollDownButtonProps, SelectScrollUpButton, SelectScrollUpButtonProps, SelectSeparator, SelectSeparatorProps, SelectTrigger, SelectTriggerProps, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetContentProps, SheetDescription, SheetDescriptionProps, SheetFooter, SheetFooterProps, SheetHeader, SheetHeaderProps, SheetOverlayProps, SheetPresentationHost, SheetPresentationShell, SheetTitle, SheetTitleProps, SheetTrigger, type ShellBrand, type ShellContextValue, ShellProvider, type ShellProviderProps, type ShellUser, type ShellUserMapper, ShowPageHeader, Sidebar, SidebarBrand, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuButtonProps, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubButtonProps, SidebarMenuSubItem, SidebarProps, SidebarProvider, SidebarProviderProps, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, type Slot, type SpacingKey, THEME_CHOICES, THEME_STORAGE_KEY, Table, TableBody, TableBodyProps, TableCaption, TableCaptionProps, TableCell, TableCellProps, TableHead, TableHeadProps, TableHeader, TableHeaderProps, TableProps, TableRow, TableRowProps, Tabs, TabsContent, TabsContentProps, TabsLayout, TabsList, TabsListProps, TabsTrigger, TabsTriggerProps, TaskRunPanel, TaskRunPanelProps, TextDisplay, TextInput, Textarea, TextareaDisplay, TextareaInput, TextareaProps, type ThemeChoice, ThemeSubmenu, ThemeToggle, Toaster, type ToasterProps, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, type TypographyKey, type UseBuroDataTableOptions, type UseDialogFilterStateOptions, type UseNavTreeOptions, type UseRelationPickerOptions, type UseThemeResult, UserMenu, type UserMenuProps, badgeVariants, buildNavItems, buroSortingToTanStack, buttonVariants, cn, defaultNavLayouts, defaultUserMapper, downloadArtifact, formatOperatorLabel, hasIcon, i18nPrefixToRef, isImage, layoutSlot, listSlot, loadLocale, localeLabel, modeForSurface, recordDisplayName, registerIcons, relationLinkClassName, resolveNavIcon, resolveUpdater, saveLocale, shadcnBlockImplementations, shadcnFieldImplementations, shadcnPresentationHosts, spacing, tanStackSortingToBuro, toast, typography, useBuroDataTable, useCurrentUser, useDialogFilterState, useDocumentTitle, useExportRunWatcher, useFormControl, useFormField, useHref, useIsMobile, useLanguagePaletteActions, useLanguageSwitch, useLayout, useLayoutResolver, useLinkComponent, useListSlot, useMatch, useNavIcon, useNavTree, useNavVisible, useOptionalSidebar, usePaletteState, usePresentationCopy, useRelationPicker, useShell, useSidebar, useTheme, useThemePaletteActions, webPlatform, wrapperEnabled };
|
|
6224
6510
|
//# sourceMappingURL=index.d.cts.map
|