admin-ui-starter-kit 0.4.4 → 0.4.5

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.
@@ -55,6 +55,60 @@ export function AppRoot() {
55
55
  Do not put router, query, toast, telemetry, or i18n packages inside a package
56
56
  wrapper. They stay in the consuming app and enter through callbacks.
57
57
 
58
+ For serious migrations, prefer the package adapters over app-local action
59
+ wrappers:
60
+
61
+ ```tsx
62
+ import {
63
+ ActionOverlayOutlet,
64
+ ActionProvider,
65
+ createInertiaActionRunner,
66
+ createReactQueryActionFeedback,
67
+ } from 'admin-ui-starter-kit/services/actions';
68
+
69
+ <ActionProvider
70
+ requestRunner={createInertiaActionRunner({
71
+ router,
72
+ route,
73
+ defaults: { preserveScroll: true },
74
+ })}
75
+ feedback={createReactQueryActionFeedback({
76
+ queryClient,
77
+ invalidate: (event) => ({ queryKey: [event.actionId] }),
78
+ feedback: {
79
+ onError: (event) => event.message && toast.error(event.message),
80
+ },
81
+ })}
82
+ guards={{
83
+ can: (permission) => auth.can(permission),
84
+ hasAnyRole: (roles) => auth.hasAnyRole(roles),
85
+ }}
86
+ parseErrors={(error) => parseLaravelErrors(error)}
87
+ onOverlayOpenChange={(open) => polling.setPaused(open)}
88
+ onRunningChange={(running) => activity.setBusy(running)}
89
+ >
90
+ <App />
91
+ <ActionOverlayOutlet />
92
+ </ActionProvider>
93
+ ```
94
+
95
+ These helpers are dependency-free. They accept router-like and query-client-like
96
+ objects, so the package stays framework-neutral.
97
+
98
+ Provider contract:
99
+
100
+ | Prop | Consumer responsibility |
101
+ | --- | --- |
102
+ | `feedback` | Toasts, telemetry, global success/error handling. |
103
+ | `requestRunner` | Execute normalized `request` definitions through the app transport. |
104
+ | `guards` | Permission and role checks for `permission` and `roles`. |
105
+ | `parseErrors` | Normalize backend validation/errors into `{ fieldErrors, message }`. |
106
+ | `onOverlayOpenChange` | Pause polling or background refresh while action overlays are open. |
107
+ | `onRunningChange` | Track whether any action is running. |
108
+
109
+ Per-action `run`, `requestRunner`, and `parseErrors` override provider-level
110
+ defaults when a workflow needs special handling.
111
+
58
112
  ## Page Scope
59
113
 
60
114
  Register definitions once per scope. Do not register one action array per row.
@@ -116,6 +170,93 @@ For row menus, call `useActionSurface({ surface: 'table-row', payload: row })`
116
170
  from the row component and map the returned actions into the existing menu
117
171
  component.
118
172
 
173
+ Use `toPageAction`, `toMenuAction`, `toTableAction`, and `toCommandAction` to
174
+ map resolved package actions into package-owned surfaces without rebuilding the
175
+ same glue in every app.
176
+
177
+ ## Local Actions
178
+
179
+ Use `useLocalAction(definition, options)` when migrating an existing page-owned
180
+ action hook. It keeps the definition local to the component but still uses the
181
+ package lifecycle, guards, overlays, provider feedback, and request runner.
182
+
183
+ ```tsx
184
+ const action = useLocalAction<Booking, { note: string }, Booking>({
185
+ id: 'booking.confirm',
186
+ label: 'Confirm booking',
187
+ modality: {
188
+ type: 'dialog',
189
+ title: ({ payload }) => `Confirm ${payload?.reference}`,
190
+ formId: 'confirm-booking-form',
191
+ render: ({ getFormProps, isRunning }) => (
192
+ <form {...getFormProps()} id="confirm-booking-form">
193
+ <textarea name="note" disabled={isRunning} />
194
+ </form>
195
+ ),
196
+ },
197
+ request: {
198
+ method: 'post',
199
+ route: 'bookings.confirm',
200
+ params: ({ payload }) => payload?.id,
201
+ data: ({ values }) => values,
202
+ },
203
+ }, { payload: booking });
204
+ ```
205
+
206
+ Prefer `ActionScope` + `useActionSurface` once multiple surfaces need the same
207
+ definition.
208
+
209
+ ## Requests, Guards, And Errors
210
+
211
+ Use `run` for bespoke behavior. Use `request` when actions repeat the same
212
+ route/request boilerplate and a provider adapter can execute it.
213
+
214
+ ```tsx
215
+ const archiveBooking: ActionDefinition<Booking, undefined, Booking> = {
216
+ id: 'booking.archive',
217
+ label: 'Archive booking',
218
+ permission: ['bookings.archive', 'bookings.manage'],
219
+ roles: ['admin', 'ops'],
220
+ request: {
221
+ method: 'post',
222
+ route: 'bookings.archive',
223
+ params: ({ payload }) => payload?.id,
224
+ options: { preserveScroll: true },
225
+ },
226
+ successMessage: ({ payload }) => `${payload?.reference} archived`,
227
+ };
228
+ ```
229
+
230
+ `permission` arrays require every permission through `guards.can`. `roles`
231
+ passes the full role list to `guards.hasAnyRole`. If a definition declares a
232
+ permission or role and the matching guard is missing, the action is hidden.
233
+
234
+ Normalize backend errors once at the provider for Laravel/Inertia-style
235
+ validation:
236
+
237
+ ```tsx
238
+ <ActionProvider
239
+ parseErrors={(error) => {
240
+ const response = error as {
241
+ errors?: Record<string, string | string[]>;
242
+ message?: string;
243
+ };
244
+
245
+ return {
246
+ fieldErrors: response.errors,
247
+ message: response.message ?? 'Action failed.',
248
+ };
249
+ }}
250
+ >
251
+ <App />
252
+ <ActionOverlayOutlet />
253
+ </ActionProvider>
254
+ ```
255
+
256
+ Parsed `fieldErrors` land on `action.errors` and overlay render contexts.
257
+ Parsed messages are used by failed lifecycle feedback unless the action defines
258
+ an explicit `errorMessage`.
259
+
119
260
  ## Modality And Overlay Parity
120
261
 
121
262
  Use action modality for reusable modal workflows. A delete confirmation opened
package/CHANGELOG.md CHANGED
@@ -6,7 +6,7 @@ this project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
- ## [0.4.4] — 2026-06-20
9
+ ## [0.4.5] — 2026-06-20
10
10
 
11
11
  ### Added
12
12
 
@@ -16,6 +16,13 @@ this project adheres to [Semantic Versioning](https://semver.org/).
16
16
  now supports alert messages, custom footer composition, hidden headers,
17
17
  focus refs, escape/backdrop behavior, content classes, confirm style, icon /
18
18
  emphasis controls, and drawer footer visibility.
19
+ - **Action migration APIs** — added `useLocalAction` for incremental
20
+ page-owned action migration, provider-level guards, provider/action error
21
+ parsing, request runner support, overlay/running state callbacks, typed action
22
+ factories, and surface mapping helpers.
23
+ - **Dependency-free action adapters** — added HTTP, Inertia-like, and React
24
+ Query-like helpers that accept router/query-client objects without importing
25
+ framework packages into the library.
19
26
 
20
27
  ### Fixed
21
28
 
@@ -29,6 +36,10 @@ this project adheres to [Semantic Versioning](https://semver.org/).
29
36
  - Documented the recommended modality pattern: use
30
37
  `services/actions` + `ActionOverlayOutlet` for reusable modal workflows, and
31
38
  reserve `features/overlays` for one-off local state.
39
+ - Expanded package-facing action docs across `README.md`, `INTEGRATION.md`,
40
+ the service README, and the consumer migration skill with provider contracts,
41
+ request runners, guards, error parsing, local actions, and migration choice
42
+ points.
32
43
 
33
44
  ## [0.1.3] — 2026-05-22
34
45
 
@@ -122,7 +133,7 @@ Initial public release.
122
133
  - **What this is not:** a marketing-site UI kit. Built for admin panels
123
134
  and SaaS dashboards.
124
135
 
125
- [Unreleased]: https://github.com/nicolasvlachos/admin-ui-starter-kit/compare/v0.4.4...HEAD
126
- [0.4.4]: https://github.com/nicolasvlachos/admin-ui-starter-kit/compare/v0.1.3...v0.4.4
136
+ [Unreleased]: https://github.com/nicolasvlachos/admin-ui-starter-kit/compare/v0.4.5...HEAD
137
+ [0.4.5]: https://github.com/nicolasvlachos/admin-ui-starter-kit/compare/v0.1.3...v0.4.5
127
138
  [0.1.3]: https://github.com/nicolasvlachos/admin-ui-starter-kit/compare/v0.1.0...v0.1.3
128
139
  [0.1.0]: https://github.com/nicolasvlachos/admin-ui-starter-kit/releases/tag/v0.1.0
package/INTEGRATION.md CHANGED
@@ -157,13 +157,15 @@ components from a client component file (`'use client'`). The package is
157
157
  framework-neutral, but interactive UI still runs on the client.
158
158
 
159
159
  For shared actions, keep the registry framework-neutral and put framework
160
- calls inside callbacks:
160
+ calls inside callbacks or provider adapters:
161
161
 
162
162
  ```tsx
163
163
  import {
164
164
  ActionOverlayOutlet,
165
165
  ActionProvider,
166
166
  ActionScope,
167
+ createInertiaActionRunner,
168
+ createReactQueryActionFeedback,
167
169
  type ActionDefinition,
168
170
  } from 'admin-ui-starter-kit/services/actions';
169
171
 
@@ -180,9 +182,45 @@ const customerActions: ActionDefinition<Customer>[] = [
180
182
  run: ({ payload }) => router.delete(`/customers/${payload?.id}`),
181
183
  successMessage: ({ payload }) => `${payload?.name} deleted`,
182
184
  },
185
+ {
186
+ id: 'customer.archive',
187
+ label: 'Archive customer',
188
+ permission: 'customers.archive',
189
+ roles: ['admin', 'ops'],
190
+ modality: {
191
+ type: 'alert',
192
+ tone: 'warning',
193
+ title: ({ payload }) => `Archive ${payload?.name}?`,
194
+ confirmLabel: 'Archive',
195
+ },
196
+ request: {
197
+ method: 'post',
198
+ route: 'customers.archive',
199
+ params: ({ payload }) => payload?.id,
200
+ options: { preserveScroll: true },
201
+ },
202
+ successMessage: ({ payload }) => `${payload?.name} archived`,
203
+ },
183
204
  ];
184
205
 
185
- <ActionProvider feedback={{ onSuccess: (event) => event.message && toast.success(event.message) }}>
206
+ <ActionProvider
207
+ requestRunner={createInertiaActionRunner({ router, route })}
208
+ feedback={createReactQueryActionFeedback({
209
+ queryClient,
210
+ invalidate: (event) => ({ queryKey: [event.actionId] }),
211
+ feedback: {
212
+ onSuccess: (event) => event.message && toast.success(event.message),
213
+ onError: (event) => event.message && toast.error(event.message),
214
+ },
215
+ })}
216
+ guards={{
217
+ can: (permission) => auth.can(permission),
218
+ hasAnyRole: (roles) => auth.hasAnyRole(roles),
219
+ }}
220
+ parseErrors={(error) => parseLaravelActionError(error)}
221
+ onOverlayOpenChange={(open) => polling.setPaused(open)}
222
+ onRunningChange={(running) => activity.setBusy(running)}
223
+ >
186
224
  <ActionScope scope={`customer:${customer.id}`} actions={customerActions}>
187
225
  <CustomerPage />
188
226
  </ActionScope>
@@ -190,6 +228,14 @@ const customerActions: ActionDefinition<Customer>[] = [
190
228
  </ActionProvider>;
191
229
  ```
192
230
 
231
+ Use `useLocalAction(definition, options)` for one page-owned action during an
232
+ incremental migration. Use `<ActionScope>` and `useActionSurface(...)` once the
233
+ same definition needs to appear in page actions, table row menus, command
234
+ palette entries, cards, or action-owned overlays. `ActionOverlayOutlet` renders
235
+ action modality through the package `features/overlays`, so reusable modal
236
+ workflows keep the same focus, backdrop, loading, submit, and error behavior as
237
+ direct overlay usage.
238
+
193
239
  For form actions, set `modality.formId` and render a form through the modality
194
240
  render prop. The context exposes `getFormProps(...)`, `submit(values)`,
195
241
  `errors`, and loading/status flags. Keep `react-hook-form`, validation schemas,
package/README.md CHANGED
@@ -186,25 +186,86 @@ loading/error/overlay lifecycle. Keep one-off dialogs local with
186
186
  import {
187
187
  ActionOverlayOutlet,
188
188
  ActionProvider,
189
+ createInertiaActionRunner,
190
+ createReactQueryActionFeedback,
191
+ useLocalAction,
189
192
  } from 'admin-ui-starter-kit/services/actions';
190
193
 
191
194
  <ActionProvider
192
- feedback={{
193
- onSuccess: (event) => event.message && toast.success(event.message),
194
- onError: (event) => event.message && toast.error(event.message),
195
+ requestRunner={createInertiaActionRunner({
196
+ router,
197
+ route,
198
+ defaults: { preserveScroll: true },
199
+ })}
200
+ feedback={createReactQueryActionFeedback({
201
+ queryClient,
202
+ invalidate: (event) => ({ queryKey: [event.actionId] }),
203
+ feedback: {
204
+ onSuccess: (event) => event.message && toast.success(event.message),
205
+ onError: (event) => event.message && toast.error(event.message),
206
+ },
207
+ })}
208
+ guards={{
209
+ can: (permission) => auth.can(permission),
210
+ hasAnyRole: (roles) => auth.hasAnyRole(roles),
195
211
  }}
212
+ parseErrors={(error) => {
213
+ const response = error as {
214
+ errors?: Record<string, string | string[]>;
215
+ message?: string;
216
+ };
217
+
218
+ return {
219
+ fieldErrors: response.errors,
220
+ message: response.message ?? 'Action failed.',
221
+ };
222
+ }}
223
+ onOverlayOpenChange={(open) => polling.setPaused(open)}
224
+ onRunningChange={(running) => activity.setBusy(running)}
196
225
  >
197
226
  <App />
198
227
  <ActionOverlayOutlet />
199
228
  </ActionProvider>
200
229
  ```
201
230
 
231
+ Actions can be callback-driven with `run`, or data-driven through `request`
232
+ plus a provider/action `requestRunner`. Provider `guards` keep permission and
233
+ role checks app-owned, while `parseErrors` normalizes backend validation
234
+ payloads into `action.errors` and failed lifecycle messages. Use
235
+ `useLocalAction` for incremental page-owned migrations, and use
236
+ `<ActionScope>` + `useActionSurface` when one definition needs to power page,
237
+ table, card, command, or overlay surfaces.
238
+
239
+ ```tsx
240
+ const confirmBooking = useLocalAction<Booking, { note: string }, Booking>({
241
+ id: 'booking.confirm',
242
+ label: 'Confirm booking',
243
+ permission: 'bookings.confirm',
244
+ modality: {
245
+ type: 'dialog',
246
+ title: ({ payload }) => `Confirm ${payload?.reference}`,
247
+ formId: 'confirm-booking-form',
248
+ render: ({ getFormProps, isRunning }) => (
249
+ <form {...getFormProps()} id="confirm-booking-form">
250
+ <textarea name="note" disabled={isRunning} />
251
+ </form>
252
+ ),
253
+ },
254
+ request: {
255
+ method: 'post',
256
+ route: 'bookings.confirm',
257
+ params: ({ payload }) => payload?.id,
258
+ data: ({ values }) => values,
259
+ }}
260
+ }, { payload: booking });
261
+ ```
262
+
202
263
  Pages register contextual actions with `useRegisterActions` or
203
264
  `<ActionScope>`. Routing, permissions, translations, cache invalidation, and
204
- toasts stay in the consuming app through callbacks. Resolved actions expose
205
- `status`, `isRunning`, `isSuccess`, `isError`, `errors`, `result`, and
206
- timestamps; overlay form actions can use `modality.formId` with
207
- `getFormProps(...)` in the render context.
265
+ toasts stay in the consuming app through callbacks, provider adapters, and
266
+ lifecycle hooks. Resolved actions expose `status`, `isRunning`, `isSuccess`,
267
+ `isError`, `errors`, `message`, `result`, and timestamps; overlay form actions
268
+ can use `modality.formId` with `getFormProps(...)` in the render context.
208
269
 
209
270
  ### 7. Install the AI agent skills (optional)
210
271
 
@@ -0,0 +1,97 @@
1
+ import { ActionDefinition, ActionFeedbackHandlers, ActionLifecycleEvent, ActionMetadata, ActionModalityConfig, ActionRequestRunner, ResolvedAction } from './actions.types';
2
+ type MaybePromise<T> = T | Promise<T>;
3
+ export interface ActionHttpErrorOptions {
4
+ status: number;
5
+ statusText: string;
6
+ body: unknown;
7
+ response: Response;
8
+ }
9
+ export declare class ActionHttpError extends Error {
10
+ status: number;
11
+ statusText: string;
12
+ body: unknown;
13
+ response: Response;
14
+ errors?: unknown;
15
+ constructor({ status, statusText, body, response }: ActionHttpErrorOptions);
16
+ }
17
+ export interface CreateHttpActionRunnerOptions {
18
+ baseUrl?: string;
19
+ fetcher?: typeof fetch;
20
+ parseResponse?: (response: Response) => Promise<unknown>;
21
+ }
22
+ export declare function createHttpActionRunner<TResult = unknown>({ baseUrl, fetcher, parseResponse, }?: CreateHttpActionRunnerOptions): ActionRequestRunner<TResult>;
23
+ export interface InertiaRouterLike {
24
+ visit: (url: string, options?: Record<string, unknown>) => unknown;
25
+ }
26
+ export interface CreateInertiaActionRunnerOptions {
27
+ router: InertiaRouterLike;
28
+ route?: (name: string, params?: unknown) => string;
29
+ defaults?: Record<string, unknown>;
30
+ }
31
+ export declare function createInertiaActionRunner<TResult = unknown>({ router, route, defaults, }: CreateInertiaActionRunnerOptions): ActionRequestRunner<TResult>;
32
+ export interface QueryClientLike {
33
+ invalidateQueries?: (...args: unknown[]) => MaybePromise<unknown>;
34
+ }
35
+ export type QueryInvalidation = unknown | readonly unknown[] | ((event: ActionLifecycleEvent) => unknown | readonly unknown[] | undefined);
36
+ export interface CreateReactQueryActionFeedbackOptions {
37
+ queryClient: QueryClientLike;
38
+ invalidate?: QueryInvalidation;
39
+ feedback?: ActionFeedbackHandlers;
40
+ }
41
+ export declare function createReactQueryActionFeedback({ queryClient, invalidate, feedback, }: CreateReactQueryActionFeedbackOptions): ActionFeedbackHandlers;
42
+ export declare function defineAction<TPayload = unknown, TValues = unknown, TResult = unknown>(definition: ActionDefinition<TPayload, TValues, TResult>): ActionDefinition<TPayload, TValues, TResult>;
43
+ export declare function defineDeleteAction<TPayload = unknown, TResult = unknown>(definition: Omit<ActionDefinition<TPayload, undefined, TResult>, 'modality'> & {
44
+ modality: Omit<ActionModalityConfig<TPayload, undefined, TResult>, 'type' | 'tone'> & Partial<Pick<ActionModalityConfig<TPayload, undefined, TResult>, 'type' | 'tone'>>;
45
+ }): ActionDefinition<TPayload, undefined, TResult>;
46
+ export declare function defineFormAction<TPayload = unknown, TValues = unknown, TResult = unknown>(definition: Omit<ActionDefinition<TPayload, TValues, TResult>, 'modality'> & {
47
+ modality: Omit<ActionModalityConfig<TPayload, TValues, TResult>, 'type'> & Partial<Pick<ActionModalityConfig<TPayload, TValues, TResult>, 'type'>>;
48
+ }): ActionDefinition<TPayload, TValues, TResult>;
49
+ export declare function defineSilentAction<TPayload = unknown, TValues = unknown, TResult = unknown>(definition: Omit<ActionDefinition<TPayload, TValues, TResult>, 'modality'>): ActionDefinition<TPayload, TValues, TResult>;
50
+ type ActionVariant = 'primary' | 'secondary' | 'destructive' | 'success' | 'warning';
51
+ export declare function toPageAction<TPayload = unknown, TValues = unknown, TResult = unknown>(action: ResolvedAction<TPayload, TValues, TResult>): {
52
+ id: string;
53
+ label: import('react').ReactNode;
54
+ onClick: () => void;
55
+ disabled: boolean;
56
+ loading: boolean;
57
+ icon: import('react').ComponentType<{
58
+ className?: string;
59
+ }> | undefined;
60
+ variant: ActionVariant | undefined;
61
+ visible: boolean;
62
+ group: string | undefined;
63
+ placement: import('./actions.types').ActionPlacement;
64
+ };
65
+ export declare function toMenuAction<TPayload = unknown, TValues = unknown, TResult = unknown>(action: ResolvedAction<TPayload, TValues, TResult>): {
66
+ label: string;
67
+ onClick: () => void;
68
+ disabled: boolean;
69
+ icon: import('react').ComponentType<{
70
+ className?: string;
71
+ }> | undefined;
72
+ variant: string;
73
+ };
74
+ export declare function toTableAction<TData = unknown>(action: ResolvedAction<TData>): {
75
+ id: string;
76
+ label: string;
77
+ onClick: (row: TData) => void;
78
+ disabled: boolean;
79
+ isDisabled: () => boolean;
80
+ isVisible: () => boolean;
81
+ icon: import('react').ReactElement<{
82
+ className?: string;
83
+ }, string | import('react').JSXElementConstructor<any>> | undefined;
84
+ variant: string;
85
+ };
86
+ export declare function toCommandAction<TPayload = unknown, TValues = unknown, TResult = unknown>(action: ResolvedAction<TPayload, TValues, TResult>, metadata?: ActionMetadata): {
87
+ id: string;
88
+ label: string;
89
+ group: string | undefined;
90
+ disabled: boolean;
91
+ icon: import('react').ComponentType<{
92
+ className?: string;
93
+ }> | undefined;
94
+ onSelect: () => void;
95
+ };
96
+ export {};
97
+ //# sourceMappingURL=action-adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-adapters.d.ts","sourceRoot":"","sources":["../../../src/services/actions/action-adapters.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,6 @@ import { ActionStore } from './action-store';
3
3
  import { ActionProviderProps } from './actions.types';
4
4
  export declare const ActionStoreContext: import('react').Context<ActionStore | null>;
5
5
  export declare const ActionScopeContext: import('react').Context<string | null>;
6
- export declare function ActionProvider<TPayload = unknown, TValues = unknown, TResult = unknown>({ actions, feedback, children, }: ActionProviderProps<TPayload, TValues, TResult>): ReactNode;
6
+ export declare function ActionProvider<TPayload = unknown, TValues = unknown, TResult = unknown>({ actions, feedback, guards, parseErrors, requestRunner, onOverlayOpenChange, onRunningChange, children, }: ActionProviderProps<TPayload, TValues, TResult>): ReactNode;
7
7
  export declare function useActionStore(): ActionStore;
8
8
  //# sourceMappingURL=action-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"action-provider.d.ts","sourceRoot":"","sources":["../../../src/services/actions/action-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKN,KAAK,SAAS,EACd,MAAM,OAAO,CAAC;AAEf,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEhF,eAAO,MAAM,kBAAkB,6CAA0C,CAAC;AAC1E,eAAO,MAAM,kBAAkB,wCAAqC,CAAC;AAErE,wBAAgB,cAAc,CAC7B,QAAQ,GAAG,OAAO,EAClB,OAAO,GAAG,OAAO,EACjB,OAAO,GAAG,OAAO,EAChB,EACD,OAAO,EACP,QAAQ,EACR,QAAQ,GACR,EAAE,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAuB7D;AAED,wBAAgB,cAAc,IAAI,WAAW,CAM5C"}
1
+ {"version":3,"file":"action-provider.d.ts","sourceRoot":"","sources":["../../../src/services/actions/action-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAMN,KAAK,SAAS,EACd,MAAM,OAAO,CAAC;AAEf,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAEN,KAAK,mBAAmB,EAExB,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,kBAAkB,6CAA0C,CAAC;AAC1E,eAAO,MAAM,kBAAkB,wCAAqC,CAAC;AAErE,wBAAgB,cAAc,CAC7B,QAAQ,GAAG,OAAO,EAClB,OAAO,GAAG,OAAO,EACjB,OAAO,GAAG,OAAO,EAChB,EACD,OAAO,EACP,QAAQ,EACR,MAAM,EACN,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,QAAQ,GACR,EAAE,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAiC7D;AAsDD,wBAAgB,cAAc,IAAI,WAAW,CAM5C"}
@@ -1,6 +1,8 @@
1
- import { ActionDefinition, ActionFeedbackHandlers, ActionFieldErrors, ActionMessage, ActionMessageContext, ActionMetadata, ActionRegistrationOptions, ActionStoreSnapshot, ActionSurfaceOptions, ResolvedAction, UseActionOptions } from './actions.types';
1
+ import { ActionDefinition, ActionErrorParseContext, ActionErrorParser, ActionFeedbackHandlers, ActionFieldErrors, ActionGuards, ActionMessage, ActionMessageContext, ActionMetadata, ActionRegistrationOptions, ActionRequestConfig, ActionRequestRunner, ActionRunContext, ParsedActionError, ResolvedActionRequest, ActionStoreSnapshot, ActionSurfaceOptions, ResolvedAction, UseActionOptions } from './actions.types';
2
2
  export declare function extractActionFieldErrors(error: unknown): ActionFieldErrors;
3
3
  export declare function resolveActionMessage<TPayload = unknown, TValues = unknown, TResult = unknown>(message: ActionMessage<TPayload, TValues, TResult> | undefined, context: ActionMessageContext<TPayload, TValues, TResult>): string | undefined;
4
+ export declare function resolveActionRequest<TPayload = unknown, TValues = unknown>(request: ActionRequestConfig<TPayload, TValues>, context: ActionRunContext<TPayload, TValues>): ResolvedActionRequest;
5
+ export declare function parseActionError<TPayload = unknown, TValues = unknown>(error: unknown, context: ActionErrorParseContext<TPayload, TValues>, parser?: ActionErrorParser): ParsedActionError;
4
6
  export declare class ActionStore {
5
7
  private registrations;
6
8
  private runStates;
@@ -9,11 +11,20 @@ export declare class ActionStore {
9
11
  private snapshot;
10
12
  private readonly listeners;
11
13
  private feedback;
14
+ private guards;
15
+ private errorParser;
16
+ private requestRunner;
12
17
  private readonly abortControllers;
13
18
  private readonly runTokens;
14
19
  subscribe: (listener: () => void) => (() => void);
15
20
  getSnapshot: () => ActionStoreSnapshot;
16
21
  setFeedback(feedback?: ActionFeedbackHandlers): void;
22
+ setOptions(options: {
23
+ feedback?: ActionFeedbackHandlers;
24
+ guards?: ActionGuards;
25
+ parseErrors?: ActionErrorParser;
26
+ requestRunner?: ActionRequestRunner;
27
+ }): void;
17
28
  registerActions<TPayload = unknown, TValues = unknown, TResult = unknown>(actions: readonly ActionDefinition<TPayload, TValues, TResult>[], options?: ActionRegistrationOptions): () => void;
18
29
  selectSurfaceActions<TPayload = unknown, TValues = unknown, TResult = unknown>(options: ActionSurfaceOptions<TPayload>): ResolvedAction<TPayload, TValues, TResult>[];
19
30
  selectAction<TPayload = unknown, TValues = unknown, TResult = unknown>(actionId: string, options?: UseActionOptions<TPayload>): ResolvedAction<TPayload, TValues, TResult> | null;
@@ -32,6 +43,7 @@ export declare class ActionStore {
32
43
  private resolveEntry;
33
44
  private createRunContext;
34
45
  private isEntryDisabled;
46
+ private isEntryVisible;
35
47
  private emitLifecycle;
36
48
  private findEntry;
37
49
  private getRunState;
@@ -1 +1 @@
1
- {"version":3,"file":"action-store.d.ts","sourceRoot":"","sources":["../../../src/services/actions/action-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"action-store.d.ts","sourceRoot":"","sources":["../../../src/services/actions/action-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,gBAAgB,EAErB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAGjB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EAEnB,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EAGrB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,MAAM,iBAAiB,CAAC;AA2HzB,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAkB1E;AAED,wBAAgB,oBAAoB,CACnC,QAAQ,GAAG,OAAO,EAClB,OAAO,GAAG,OAAO,EACjB,OAAO,GAAG,OAAO,EAEjB,OAAO,EAAE,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,EAC9D,OAAO,EAAE,oBAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GACvD,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACzE,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAC/C,OAAO,EAAE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,GAC1C,qBAAqB,CAUvB;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACrE,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,EACnD,MAAM,CAAC,EAAE,iBAAiB,GACxB,iBAAiB,CAGnB;AAED,qBAAa,WAAW;IACvB,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAwD;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAsC;IACvE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAG9C;IAEF,WAAW,QAAO,mBAAmB,CAAkB;IAEvD,WAAW,CAAC,QAAQ,CAAC,EAAE,sBAAsB,GAAG,IAAI;IAIpD,UAAU,CAAC,OAAO,EAAE;QACnB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;QAClC,MAAM,CAAC,EAAE,YAAY,CAAC;QACtB,WAAW,CAAC,EAAE,iBAAiB,CAAC;QAChC,aAAa,CAAC,EAAE,mBAAmB,CAAC;KACpC,GAAG,IAAI;IAaR,eAAe,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACvE,OAAO,EAAE,SAAS,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAChE,OAAO,GAAE,yBAA8B,GACrC,MAAM,IAAI;IA6Bb,oBAAoB,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC5E,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,GACrC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;IAmB/C,YAAY,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACpE,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAgB,CAAC,QAAQ,CAAM,GACtC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI;IAcpD,eAAe,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,KACrE,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,GAC1C,IAAI;IAWP,UAAU,CAAC,QAAQ,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI;IA4BhG,WAAW,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,IAAI;IAU9C,YAAY,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACtD,MAAM,CAAC,EAAE,OAAO,GACd,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAuBzB,aAAa,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC3E,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;QACL,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,cAAc,CAAC;KACrB,GACJ,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAqG/B,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,YAAY;IAuEpB,OAAO,CAAC,gBAAgB;IAoBxB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,aAAa;IA2CrB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,OAAO;CAUf;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C"}