@powerportalspro/core 5.0.0-beta.3 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,12 +1,8 @@
1
1
  /**
2
- * URL builders for the framework's `/api/*` and UI endpoints. Mirrors the C# static
3
- * `Routes` class in `PowerPortalsPro.Web.Common` so the React side and the Blazor side
4
- * agree on URL shape without either codebase owning the templates.
5
- *
6
- * The C# version uses Pascal-cased property names (`Routes.Api.Auth.Login`); this
7
- * port uses camelCase per JS convention (`Routes.api.auth.login`). Path-segment
8
- * encoding matches the C# `Uri.EscapeDataString` calls verbatim — segments that the
9
- * C# leaves unencoded (table logical names, culture codes) are also unencoded here.
2
+ * URL builders for the framework's `/api/*` and UI endpoints. Path segments
3
+ * use `encodeURIComponent` where they're parameterised (record ids, view ids,
4
+ * table logical names that may contain user-supplied characters); known-safe
5
+ * segments (culture codes, fixed enum values) are unencoded.
10
6
  */
11
7
  /**
12
8
  * Static accessors for the framework's API and UI route groups. Mirrors the C#
@@ -28,14 +24,39 @@ declare const Routes: {
28
24
  readonly retrieveLocalizedStrings: "/api/localizedStrings/{culture}";
29
25
  /** Template — POST a batch of OrganizationRequest payloads. */
30
26
  readonly executeMultiple: "/api/executeMultiple";
31
- /** GET — environment-wide file upload settings (blocked extensions, max upload size). */
32
- readonly environmentFileSettings: "/api/environmentFileSettings";
27
+ /**
28
+ * GET — organization-wide settings sourced from the Dataverse `organization` record:
29
+ * default currency plus file-upload constraints (blocked extensions, max upload size).
30
+ * Replaces the legacy `/api/environmentFileSettings` endpoint.
31
+ */
32
+ readonly organizationSettings: "/api/organizationSettings";
33
33
  /** POST — clear all server-side caches. SystemAdmin-only. */
34
34
  readonly clearAllCaches: "/api/caches/clear";
35
35
  /** GET — every server-side cache name. SystemAdmin-only. */
36
36
  readonly cacheNames: "/api/caches";
37
37
  /** Template — POST to clear a single named cache. SystemAdmin-only. */
38
38
  readonly clearCache: "/api/caches/{cacheName}/clear";
39
+ /**
40
+ * GET — admin localization overview: configured sources plus the per-source
41
+ * load records produced by the most recent warmup. SystemAdmin-only. Backs
42
+ * the LocalizationAdmin component (Blazor-only today; React mirror TBD).
43
+ */
44
+ readonly localizationOverview: "/api/localizations/overview";
45
+ /**
46
+ * GET — JSON of the keys one source contributed to one culture during the most
47
+ * recent warmup. `sourceId` + `culture` are query-string parameters (a sourceId
48
+ * can contain colons/slashes, so they're not path segments). SystemAdmin-only.
49
+ */
50
+ readonly localizationSourceDownload: "/api/localizations/sources/download";
51
+ /**
52
+ * GET — JSON of every key the cache will serve for a culture (post-merge winning
53
+ * values across all sources). `culture` is a query-string parameter. SystemAdmin-only.
54
+ */
55
+ readonly localizationMergedDownload: "/api/localizations/merged/download";
56
+ /** GET — whether translation is configured, the managed solution is installed, and the candidate target languages. SystemAdmin-only. */
57
+ readonly localizationTranslationAvailability: "/api/localizations/translation/availability";
58
+ /** POST — translate an uploaded localization file into one or more target languages. SystemAdmin-only. */
59
+ readonly localizationTranslate: "/api/localizations/translation";
39
60
  /** Template — GET file metadata + (optionally) content for one record/column. */
40
61
  readonly retrieveFileInfo: "/api/files/{tableLogicalName}/{recordId}/{columnName}";
41
62
  /** Template — POST record ids; returns file info + content for many records of one column. */
@@ -71,10 +92,10 @@ declare const Routes: {
71
92
  readonly getRetrieveTableMetadataRoute: (tableLogicalName: string) => string;
72
93
  /**
73
94
  * Resolved URL for retrieving the current user's combined
74
- * `TableSecurityPermission` mask for a single table. Mirrors the
75
- * server-side `ITablePermissionCache.GetPermissionForUserAsync` lookup
76
- * the Blazor grid buttons already use via DI exposed so the React
77
- * client can read the same answer without firing a grid query.
95
+ * `TableSecurityPermission` mask for a single table. Routes through
96
+ * the server-side `ITablePermissionCache.GetPermissionForUserAsync`
97
+ * lookup so the client can read the table-level answer without firing
98
+ * a grid query.
78
99
  * `GridDataResponse.tablePermissions` carries the same value when a
79
100
  * grid query happens to be in flight; this endpoint covers the other
80
101
  * cases (custom toolbars, conditional UI elsewhere on the page).
@@ -158,8 +179,8 @@ declare const Routes: {
158
179
  readonly confirmEmail: "/api/auth/confirm-email";
159
180
  /** POST — send a fresh confirmation email. */
160
181
  readonly resendEmailConfirmation: "/api/auth/resend-email-confirmation";
161
- /** GET — list of configured external (OAuth) login providers. */
162
- readonly externalProviders: "/api/auth/external-providers";
182
+ /** GET — anonymous auth options for the sign-in UI: the local-accounts flag plus the configured external (OAuth) providers. */
183
+ readonly options: "/api/auth/options";
163
184
  /** GET — kicks off the OAuth flow for the named external provider. Full-page navigate, do not fetch. */
164
185
  readonly externalLogin: "/api/auth/external-login";
165
186
  /** GET — snapshot the in-flight external-login cookie set by the OAuth callback. */
@@ -265,8 +286,8 @@ interface PowerPortalsProErrorInit {
265
286
  /**
266
287
  * Base error thrown by `Transport` for every non-2xx response. Subclasses
267
288
  * (`UnauthorizedAccessError`, `ArgumentError`, `ArgumentNullError`,
268
- * `InvalidOperationError`) are constructed when the server's `exceptionType`
269
- * extension matches a known CLR type, mirroring the in-process Blazor experience.
289
+ * `InvalidOperationError`) are constructed when the server's
290
+ * `exceptionType` extension matches a known CLR type.
270
291
  */
271
292
  declare class PowerPortalsProError extends Error {
272
293
  readonly status: number;
@@ -326,19 +347,19 @@ interface RequestOptions {
326
347
  headers?: Record<string, string>;
327
348
  }
328
349
  /**
329
- * Thin `fetch` wrapper that owns the cross-cutting concerns the C# `HttpClient`-based
330
- * `PowerPortalsProService` handles for Blazor:
350
+ * Thin `fetch` wrapper that owns the cross-cutting concerns of the typed
351
+ * client:
331
352
  *
332
- * 1. **Cookie auth.** Always sends `credentials: 'include'` so the ASP.NET Identity
333
- * cookie reaches `/api/*`, mirroring the Blazor WASM `CookieCredentialsHandler`.
353
+ * 1. **Cookie auth.** Always sends `credentials: 'include'` so the ASP.NET
354
+ * Identity cookie reaches `/api/*`.
334
355
  * 2. **JSON in / out.** Serializes the body as JSON (when present) and parses the
335
- * response as JSON. Sets the `Content-Type` and `Accept` headers accordingly.
356
+ * response as JSON. Sets the `Content-Type` and `Accept` headers accordingly.
336
357
  * 3. **Typed-error rehydration.** On non-2xx responses with `application/problem+json`,
337
- * maps the body's `exceptionType` extension to the matching
338
- * {@link PowerPortalsProError} subclass — `UnauthorizedAccessError`,
339
- * `ArgumentError`, `ArgumentNullError`, `InvalidOperationError`, or the base type
340
- * for unrecognized CLR exceptions. Non-problem-json failures throw the base type
341
- * with the raw response text as the detail.
358
+ * maps the body's `exceptionType` extension to the matching
359
+ * {@link PowerPortalsProError} subclass — `UnauthorizedAccessError`,
360
+ * `ArgumentError`, `ArgumentNullError`, `InvalidOperationError`, or the base type
361
+ * for unrecognized CLR exceptions. Non-problem-json failures throw the base type
362
+ * with the raw response text as the detail.
342
363
  *
343
364
  * `Transport` is an implementation detail of the higher-level clients
344
365
  * (`AuthClient`, etc.) and is rarely consumed directly. It's exported so advanced
@@ -822,7 +843,7 @@ interface paths {
822
843
  patch?: never;
823
844
  trace?: never;
824
845
  };
825
- "/api/environmentFileSettings": {
846
+ "/api/organizationSettings": {
826
847
  parameters: {
827
848
  query?: never;
828
849
  header?: never;
@@ -844,7 +865,7 @@ interface paths {
844
865
  [name: string]: unknown;
845
866
  };
846
867
  content: {
847
- "application/json": components["schemas"]["EnvironmentFileSettings"];
868
+ "application/json": components["schemas"]["OrganizationSettings"];
848
869
  };
849
870
  };
850
871
  };
@@ -1175,6 +1196,186 @@ interface paths {
1175
1196
  patch?: never;
1176
1197
  trace?: never;
1177
1198
  };
1199
+ "/api/localizations/overview": {
1200
+ parameters: {
1201
+ query?: never;
1202
+ header?: never;
1203
+ path?: never;
1204
+ cookie?: never;
1205
+ };
1206
+ get: {
1207
+ parameters: {
1208
+ query?: never;
1209
+ header?: never;
1210
+ path?: never;
1211
+ cookie?: never;
1212
+ };
1213
+ requestBody?: never;
1214
+ responses: {
1215
+ /** @description OK */
1216
+ 200: {
1217
+ headers: {
1218
+ [name: string]: unknown;
1219
+ };
1220
+ content: {
1221
+ "application/json": components["schemas"]["LocalizationOverview"];
1222
+ };
1223
+ };
1224
+ };
1225
+ };
1226
+ put?: never;
1227
+ post?: never;
1228
+ delete?: never;
1229
+ options?: never;
1230
+ head?: never;
1231
+ patch?: never;
1232
+ trace?: never;
1233
+ };
1234
+ "/api/localizations/sources/download": {
1235
+ parameters: {
1236
+ query?: never;
1237
+ header?: never;
1238
+ path?: never;
1239
+ cookie?: never;
1240
+ };
1241
+ get: {
1242
+ parameters: {
1243
+ query: {
1244
+ sourceId: string;
1245
+ culture: string;
1246
+ };
1247
+ header?: never;
1248
+ path?: never;
1249
+ cookie?: never;
1250
+ };
1251
+ requestBody?: never;
1252
+ responses: {
1253
+ /** @description OK */
1254
+ 200: {
1255
+ headers: {
1256
+ [name: string]: unknown;
1257
+ };
1258
+ content?: never;
1259
+ };
1260
+ };
1261
+ };
1262
+ put?: never;
1263
+ post?: never;
1264
+ delete?: never;
1265
+ options?: never;
1266
+ head?: never;
1267
+ patch?: never;
1268
+ trace?: never;
1269
+ };
1270
+ "/api/localizations/merged/download": {
1271
+ parameters: {
1272
+ query?: never;
1273
+ header?: never;
1274
+ path?: never;
1275
+ cookie?: never;
1276
+ };
1277
+ get: {
1278
+ parameters: {
1279
+ query: {
1280
+ culture: string;
1281
+ };
1282
+ header?: never;
1283
+ path?: never;
1284
+ cookie?: never;
1285
+ };
1286
+ requestBody?: never;
1287
+ responses: {
1288
+ /** @description OK */
1289
+ 200: {
1290
+ headers: {
1291
+ [name: string]: unknown;
1292
+ };
1293
+ content?: never;
1294
+ };
1295
+ };
1296
+ };
1297
+ put?: never;
1298
+ post?: never;
1299
+ delete?: never;
1300
+ options?: never;
1301
+ head?: never;
1302
+ patch?: never;
1303
+ trace?: never;
1304
+ };
1305
+ "/api/localizations/translation/availability": {
1306
+ parameters: {
1307
+ query?: never;
1308
+ header?: never;
1309
+ path?: never;
1310
+ cookie?: never;
1311
+ };
1312
+ get: {
1313
+ parameters: {
1314
+ query?: never;
1315
+ header?: never;
1316
+ path?: never;
1317
+ cookie?: never;
1318
+ };
1319
+ requestBody?: never;
1320
+ responses: {
1321
+ /** @description OK */
1322
+ 200: {
1323
+ headers: {
1324
+ [name: string]: unknown;
1325
+ };
1326
+ content: {
1327
+ "application/json": components["schemas"]["TranslationAvailability"];
1328
+ };
1329
+ };
1330
+ };
1331
+ };
1332
+ put?: never;
1333
+ post?: never;
1334
+ delete?: never;
1335
+ options?: never;
1336
+ head?: never;
1337
+ patch?: never;
1338
+ trace?: never;
1339
+ };
1340
+ "/api/localizations/translation": {
1341
+ parameters: {
1342
+ query?: never;
1343
+ header?: never;
1344
+ path?: never;
1345
+ cookie?: never;
1346
+ };
1347
+ get?: never;
1348
+ put?: never;
1349
+ post: {
1350
+ parameters: {
1351
+ query?: never;
1352
+ header?: never;
1353
+ path?: never;
1354
+ cookie?: never;
1355
+ };
1356
+ requestBody: {
1357
+ content: {
1358
+ "application/json": components["schemas"]["TranslationRequest"];
1359
+ };
1360
+ };
1361
+ responses: {
1362
+ /** @description OK */
1363
+ 200: {
1364
+ headers: {
1365
+ [name: string]: unknown;
1366
+ };
1367
+ content: {
1368
+ "application/json": components["schemas"]["TranslationResult"];
1369
+ };
1370
+ };
1371
+ };
1372
+ };
1373
+ delete?: never;
1374
+ options?: never;
1375
+ head?: never;
1376
+ patch?: never;
1377
+ trace?: never;
1378
+ };
1178
1379
  "/api/auth/external-login/remember-choice": {
1179
1380
  parameters: {
1180
1381
  query?: never;
@@ -1185,20 +1386,19 @@ interface paths {
1185
1386
  /**
1186
1387
  * Writes the chooser's "remember my choice" cookie for providerKey
1187
1388
  * and redirects to returnUrl. A trampoline used by server-rendered
1188
- * ExternalLogin pages — those run inside a Blazor circuit where the HTTP response
1189
- * has already flushed by the time the user clicks the chooser button, so a direct
1190
- * cookie write throws "Headers are read-only, response has already started." Hitting
1191
- * this endpoint via a top-level navigation creates a fresh response where headers
1192
- * are still writable. SPA flows skip this entirely — they write the cookie inline
1193
- * in `/external-login/select`.
1389
+ * ExternalLogin pages — by the time the user clicks the chooser button the page's
1390
+ * HTTP response has already flushed, so a direct cookie write throws "Headers are
1391
+ * read-only, response has already started." Hitting this endpoint via a top-level
1392
+ * navigation creates a fresh response where headers are still writable. SPA flows
1393
+ * skip this entirely — they write the cookie inline in `/external-login/select`.
1194
1394
  *
1195
1395
  * Anonymous on purpose: the cookie value is just a UI preference (per-provider-key
1196
1396
  * pick), nothing security-sensitive. returnUrl is validated as a
1197
1397
  * local URL to avoid open-redirect.
1198
1398
  * `internal` so PowerPortalsProWebServer.UsePowerPortalsProWebServer
1199
1399
  * can also wire it up — server-rendered hosts that don't call
1200
- * still need this trampoline,
1201
- * since their ExternalLogin Blazor page is the consumer of the redirect.
1400
+ * IEndpointRouteBuilder AuthEndpoints.MapAuthEndpoints&lt;TUser&gt;(WebApplication app) still need this trampoline,
1401
+ * since their server-rendered ExternalLogin page is the consumer of the redirect.
1202
1402
  */
1203
1403
  get: {
1204
1404
  parameters: {
@@ -1774,7 +1974,7 @@ interface paths {
1774
1974
  patch?: never;
1775
1975
  trace?: never;
1776
1976
  };
1777
- "/api/auth/external-providers": {
1977
+ "/api/auth/options": {
1778
1978
  parameters: {
1779
1979
  query?: never;
1780
1980
  header?: never;
@@ -1796,7 +1996,7 @@ interface paths {
1796
1996
  [name: string]: unknown;
1797
1997
  };
1798
1998
  content: {
1799
- "application/json": components["schemas"]["ExternalLoginProviderInfo"][];
1999
+ "application/json": components["schemas"]["AuthOptionsResponse"];
1800
2000
  };
1801
2001
  };
1802
2002
  };
@@ -2763,7 +2963,7 @@ interface components {
2763
2963
  AggregateType: 0 | 1 | 2 | 3 | 4 | 5 | 6;
2764
2964
  /**
2765
2965
  * @description Compression format for the archive produced by
2766
- * <see cref="!:Services.IPowerPortalsProService.CreateFileArchiveAsync" />.
2966
+ * `IPowerPortalsProService.CreateFileArchiveAsync`.
2767
2967
  * Currently only ArchiveFormat.Zip is supported; the enum is open-ended so
2768
2968
  * future formats can land without breaking the wire schema.
2769
2969
  * @enum {integer}
@@ -2791,6 +2991,29 @@ interface components {
2791
2991
  */
2792
2992
  authenticatorUri?: string;
2793
2993
  };
2994
+ /**
2995
+ * @description Auth configuration the SPA needs before rendering the sign-in experience, returned by
2996
+ * `GET /api/auth/options`. Anonymous-safe — the login page calls it on first paint to
2997
+ * decide whether to show the local email/password form (plus the register / password-reset
2998
+ * links) and which external-provider buttons to render.
2999
+ */
3000
+ AuthOptionsResponse: {
3001
+ /**
3002
+ * @description `true` when the portal accepts local username/password accounts (registration,
3003
+ * password sign-in, and password reset). `false` for internal-only portals where
3004
+ * users authenticate exclusively through an external provider (Microsoft/Entra) — the
3005
+ * SPA hides the local form and the register / forgot-password affordances. Defaults to
3006
+ * `true` so hosts that don't configure it keep the full local-account experience.
3007
+ */
3008
+ localAccountsEnabled?: boolean;
3009
+ /**
3010
+ * @description The configured external (OAuth) login providers — the auth schemes the host registered
3011
+ * via `AddAuthentication().AddMicrosoftAccount()` / `.AddGoogle()` / etc., minus
3012
+ * the cookie / 2FA / Identity-internal schemes. Drives the login page's provider buttons
3013
+ * and the manage-external-logins "add a provider" list.
3014
+ */
3015
+ externalProviders?: components["schemas"]["ExternalLoginProviderInfo"][];
3016
+ };
2794
3017
  /** @description One row of Task&lt;IReadOnlyList&lt;CacheClearResult&gt;&gt; ICacheManager.ClearAllAsync(CancellationToken cancellationToken = default(CancellationToken))'s report. */
2795
3018
  CacheClearResult: {
2796
3019
  /** @description Cache name (matches string IClearableCache.Name). */
@@ -2825,8 +3048,8 @@ interface components {
2825
3048
  };
2826
3049
  /**
2827
3050
  * @description Outcome of `POST /api/auth/manage/email/change`. Members carry explicit
2828
- * integer values so non-Blazor consumers comparing against the JSON wire form
2829
- * get a stable contract across reorderings.
3051
+ * integer values so the JSON wire form is a stable contract across
3052
+ * reorderings.
2830
3053
  * @enum {integer}
2831
3054
  */
2832
3055
  ChangeEmailResult: 0 | 1;
@@ -2854,8 +3077,8 @@ interface components {
2854
3077
  };
2855
3078
  /**
2856
3079
  * @description Outcome of `POST /api/auth/manage/password/change`. Members carry
2857
- * explicit integer values so non-Blazor consumers comparing against the JSON
2858
- * wire form get a stable contract across reorderings.
3080
+ * explicit integer values so the JSON wire form is a stable contract
3081
+ * across reorderings.
2859
3082
  * @enum {integer}
2860
3083
  */
2861
3084
  ChangePasswordResult: 0 | 1 | 2;
@@ -2892,7 +3115,7 @@ interface components {
2892
3115
  * @description Fully-shaped chart input: category labels plus one or more datasets.
2893
3116
  * Returned by `POST /api/charts/data` and consumed by the
2894
3117
  * `&lt;Chart&gt;` / `&lt;FluentUIChart&gt;` / `&lt;DataverseChart&gt;`
2895
- * components on both the Blazor and React sides.
3118
+ * components.
2896
3119
  */
2897
3120
  ChartData: {
2898
3121
  /** @description Category labels rendered along the primary axis. */
@@ -2929,7 +3152,7 @@ interface components {
2929
3152
  /**
2930
3153
  * @description Result column name to read chart labels (X axis) from. Required
2931
3154
  * for Guid? ChartDataRequest.ViewId and string? ChartDataRequest.FetchXml modes;
2932
- * derived from <see cref="!:AggregateChartConfig.GroupByColumn" />
3155
+ * derived from ChartGrouping AggregateChartConfig.GroupBy
2933
3156
  * when AggregateChartConfig? ChartDataRequest.Aggregate is set.
2934
3157
  */
2935
3158
  labelColumn?: null | string;
@@ -2944,8 +3167,8 @@ interface components {
2944
3167
  * @description Optional result column name used to split rows into multiple
2945
3168
  * datasets. When set, rows sharing the same series value form one
2946
3169
  * dataset. For AggregateChartConfig? ChartDataRequest.Aggregate mode, derived from
2947
- * <see cref="!:AggregateChartConfig.SeriesColumn" /> or implied by
2948
- * <see cref="!:AggregateChartConfig.SeriesDateGrouping" />.
3170
+ * ChartGrouping? AggregateChartConfig.Series or implied by its
3171
+ * ChartDateGrouping ChartGrouping.DateGrouping.
2949
3172
  */
2950
3173
  seriesColumn?: null | string;
2951
3174
  /**
@@ -3114,12 +3337,34 @@ interface components {
3114
3337
  /** @description Indicates whether this column can be modified when updating an existing record. */
3115
3338
  isValidForUpdate: boolean;
3116
3339
  };
3117
- /** @description Metadata for a Dataverse boolean (yes/no) column. */
3340
+ /**
3341
+ * @description Metadata for a Dataverse boolean (yes/no) column. A boolean is an option set under the hood —
3342
+ * Dataverse exposes a customizable true/false label pair — so it carries the same option-set
3343
+ * identity (string BoolMetadata.ChoiceLogicalName, bool BoolMetadata.IsGlobal) and a two-entry
3344
+ * List&lt;ChoiceValueMetadata&gt; BoolMetadata.Choices list (value 0 = false, value 1 = true) used as the default display
3345
+ * labels when no localization override is present.
3346
+ */
3118
3347
  ColumnMetadataBaseBoolMetadata: {
3119
3348
  /** @enum {integer} */
3120
3349
  $type?: 0;
3121
3350
  /** @description Returns Boolean. */
3122
3351
  columnType?: components["schemas"]["ColumnType"];
3352
+ /**
3353
+ * @description The logical name of the boolean's option set (Dataverse `OptionSet.Name`), used to
3354
+ * build the `choices.{name}.values.{0|1}.label` localization keys.
3355
+ */
3356
+ choiceLogicalName?: string;
3357
+ /**
3358
+ * @description Whether the boolean's option set is a global option set (rare for booleans). Determines
3359
+ * whether the localization keys live under the global `choices.*` subtree or the
3360
+ * table-scoped `tables.{table}.choices.*` subtree.
3361
+ */
3362
+ isGlobal?: boolean;
3363
+ /**
3364
+ * @description The default false/true display labels (value 0 and value 1) as configured in Dataverse,
3365
+ * used as a fallback when a localization override isn't available.
3366
+ */
3367
+ choices?: components["schemas"]["ChoiceValueMetadata"][];
3123
3368
  /** @description The logical name of the column in Dataverse (e.g. "firstname", "emailaddress1"). */
3124
3369
  columnName: string;
3125
3370
  /** @description The localized display name of the column as configured in Dataverse. */
@@ -3473,7 +3718,7 @@ interface components {
3473
3718
  };
3474
3719
  /**
3475
3720
  * @description A sort specification — a column to sort by and the direction. Shared
3476
- * across the framework: the Blazor grid uses it for UI sort state,
3721
+ * across the framework: grid UIs use it for sort state,
3477
3722
  * `IFetchXmlQueryComposer` uses it for FetchXML composition, and
3478
3723
  * the `POST /api/grids/data` endpoint receives it as part of the
3479
3724
  * GridDataRequest body. string ColumnSort.ColumnName may
@@ -3713,8 +3958,8 @@ interface components {
3713
3958
  };
3714
3959
  /**
3715
3960
  * @description Outcome of `POST /api/auth/external-login/confirm`. Members carry
3716
- * explicit integer values so non-Blazor consumers comparing against the JSON
3717
- * wire form get a stable contract across reorderings.
3961
+ * explicit integer values so the JSON wire form is a stable contract
3962
+ * across reorderings.
3718
3963
  * @enum {integer}
3719
3964
  */
3720
3965
  ConfirmExternalLoginResult: 0 | 1 | 2 | 3;
@@ -3760,6 +4005,52 @@ interface components {
3760
4005
  [key: string]: components["schemas"]["ColumnValueBase"];
3761
4006
  };
3762
4007
  };
4008
+ /**
4009
+ * @description A Dataverse `transactioncurrency` record, denormalized for client consumption.
4010
+ * Populated server-side onto Currency? TableRecord.Currency whenever a record carries
4011
+ * at least one money column, so currency-aware editors (`MoneyEdit` et al.) can
4012
+ * render the correct symbol without a separate round-trip.
4013
+ */
4014
+ Currency: {
4015
+ /**
4016
+ * Format: uuid
4017
+ * @description The `transactioncurrencyid` primary key. Matches the object? ColumnValueBase.Value
4018
+ * stored against the record's `transactioncurrencyid` column when present.
4019
+ */
4020
+ id: string;
4021
+ /**
4022
+ * @description The ISO 4217 three-letter code (e.g. `USD`, `EUR`, `JPY`). Read from
4023
+ * `isocurrencycode`. Useful for ARIA labels and culture-aware formatting fallbacks.
4024
+ */
4025
+ isoCode: string;
4026
+ /**
4027
+ * @description The display symbol Dataverse stores in `currencysymbol` — up to 5 characters,
4028
+ * typically a single Unicode glyph (`$`, `€`, `£`, `¥`) but
4029
+ * occasionally a short string for currencies that lack a single-glyph form
4030
+ * (`Fr`, `kr`, `R$`) or org-specific custom values. Rendered verbatim
4031
+ * in the editor — Unicode + font fallback covers every glyph; no SVG sidecar.
4032
+ */
4033
+ symbol: string;
4034
+ /**
4035
+ * @description The localized currency name from `currencyname` (e.g. `US Dollar`). Used
4036
+ * in pickers, tooltips, and accessibility text.
4037
+ */
4038
+ name: string;
4039
+ /**
4040
+ * Format: int32
4041
+ * @description Decimal places to display, sourced from `currencyprecision`. Falls back to 2
4042
+ * when Dataverse leaves the field null. Independent of int MoneyMetadata.Precision,
4043
+ * which is the column-level precision; this is the currency-level default.
4044
+ */
4045
+ precision?: number | string;
4046
+ /**
4047
+ * Format: double
4048
+ * @description Exchange rate against the org's base currency, from `exchangerate`. `1.0`
4049
+ * for the base currency itself. Surfaced primarily for diagnostic / advanced display
4050
+ * scenarios — editors don't perform conversion locally.
4051
+ */
4052
+ exchangeRate?: number | string;
4053
+ };
3763
4054
  /**
3764
4055
  * @description Snapshot of the signed-in user's available sign-in paths, returned by
3765
4056
  * `GET /api/auth/manage/login-info`. Combines the linked external logins
@@ -3903,7 +4194,7 @@ interface components {
3903
4194
  /**
3904
4195
  * @description The user's current password — required when the account has a local
3905
4196
  * password set, ignored otherwise (external-login-only accounts). Surfacing
3906
- * the requirement up-front via <see cref="!:DeletePersonalDataResponse.RequirePassword" />
4197
+ * the requirement up-front via DeletePersonalDataResult.RequireLocalPassword
3907
4198
  * keeps the form UX correct without a separate "is password set" probe.
3908
4199
  */
3909
4200
  password?: null | string;
@@ -3920,8 +4211,8 @@ interface components {
3920
4211
  };
3921
4212
  /**
3922
4213
  * @description Outcome of `POST /api/auth/manage/personal-data/delete`. Members carry
3923
- * explicit integer values so non-Blazor consumers comparing against the JSON
3924
- * wire form get a stable contract across reorderings.
4214
+ * explicit integer values so the JSON wire form is a stable contract
4215
+ * across reorderings.
3925
4216
  * @enum {integer}
3926
4217
  */
3927
4218
  DeletePersonalDataResult: 0 | 1 | 2;
@@ -3944,28 +4235,6 @@ interface components {
3944
4235
  success?: boolean;
3945
4236
  };
3946
4237
  EntityRole: number;
3947
- /**
3948
- * @description Environment-wide file upload constraints pulled from the Dataverse `organization`
3949
- * record. Clients use these to mirror server-side enforcement (blocked extensions,
3950
- * upload size ceiling) so users get a friendly client-side rejection instead of a
3951
- * round-trip failure.
3952
- */
3953
- EnvironmentFileSettings: {
3954
- /**
3955
- * @description Lowercase file extensions (without the leading dot) that Dataverse refuses to
3956
- * accept as uploads — for example `"svg"`, `"exe"`, `"bat"`. Sourced
3957
- * from the organization's `blockedattachments` setting (a semicolon-delimited
3958
- * string in Dataverse, parsed and normalised here).
3959
- */
3960
- blockedExtensions: string[];
3961
- /**
3962
- * Format: int64
3963
- * @description Maximum upload size for file attachments and file-column payloads, in bytes.
3964
- * Sourced from the organization's `maxuploadfilesize` setting. Dataverse stores
3965
- * it as bytes; callers should compare directly against file byte length.
3966
- */
3967
- maxUploadFileSizeInBytes: number | string;
3968
- };
3969
4238
  /**
3970
4239
  * @description One option presented to the user when a single external sign-in matches
3971
4240
  * both a Dataverse `systemuser` and a `contact`. Used by
@@ -3987,8 +4256,8 @@ interface components {
3987
4256
  };
3988
4257
  /**
3989
4258
  * @description Which Dataverse table backs an external-login candidate. Members carry
3990
- * explicit integer values so non-Blazor consumers comparing against the JSON
3991
- * wire form get a stable contract across reorderings.
4259
+ * explicit integer values so the JSON wire form is a stable contract
4260
+ * across reorderings.
3992
4261
  * @enum {integer}
3993
4262
  */
3994
4263
  ExternalLoginCandidateKind: 0 | 1;
@@ -4015,9 +4284,9 @@ interface components {
4015
4284
  providerDisplayName?: string;
4016
4285
  };
4017
4286
  /**
4018
- * @description Describes one configured external (OAuth) login provider, surfaced by
4019
- * `GET /api/auth/external-providers` so SPAs can render provider buttons
4020
- * without hardcoding the list.
4287
+ * @description Describes one configured external (OAuth) login provider, surfaced via
4288
+ * `GET /api/auth/options` (IReadOnlyList&lt;ExternalLoginProviderInfo&gt; AuthOptionsResponse.ExternalProviders) so SPAs
4289
+ * can render provider buttons without hardcoding the list.
4021
4290
  */
4022
4291
  ExternalLoginProviderInfo: {
4023
4292
  /**
@@ -4038,8 +4307,9 @@ interface components {
4038
4307
  * @description Returned by `GET /api/auth/manage/external-logins`. Lists the external
4039
4308
  * logins currently linked to the signed-in user.
4040
4309
  *
4041
- * To render an "add a new external login" picker, the client should call
4042
- * `GET /api/auth/external-providers` and subtract anything already in
4310
+ * To render an "add a new external login" picker, the client should read the providers
4311
+ * from `GET /api/auth/options` (IReadOnlyList&lt;ExternalLoginProviderInfo&gt; AuthOptionsResponse.ExternalProviders) and
4312
+ * subtract anything already in
4043
4313
  * IReadOnlyList&lt;ExternalLoginInfo&gt; ExternalLoginsResponse.CurrentLogins. To decide whether unlinking a given external
4044
4314
  * login would lock the user out (no local password AND only one external
4045
4315
  * login linked), call `GET /api/auth/manage/login-info` for the
@@ -4101,26 +4371,34 @@ interface components {
4101
4371
  };
4102
4372
  /**
4103
4373
  * @description Body of `POST /api/grids/data`. Lets clients run a paged,
4104
- * searchable, sortable query against either a stored Dataverse view
4105
- * (Guid? GridDataRequest.ViewId) or a caller-supplied FetchXML
4106
- * (string? GridDataRequest.FetchXml). Server composes the final FetchXML via the
4374
+ * searchable, sortable query against a stored Dataverse view
4375
+ * (Guid? GridDataRequest.ViewId), a caller-supplied FetchXML
4376
+ * (string? GridDataRequest.FetchXml), or both — in which case the FetchXML is the
4377
+ * query and the Guid? GridDataRequest.ViewId supplies the view-definition identity
4378
+ * used to resolve view-specific localized column titles. At least one of
4379
+ * the two must be supplied. Server composes the final FetchXML via the
4107
4380
  * shared `IFetchXmlQueryComposer` so the search / sort / paging
4108
- * semantics match the Blazor grid exactly.
4381
+ * semantics are consistent across every client of the endpoint.
4109
4382
  */
4110
4383
  GridDataRequest: {
4111
4384
  /**
4112
4385
  * Format: uuid
4113
- * @description Stored Dataverse view to use as the base query. Server loads the
4114
- * view's FetchXML and column list from `IViewMetadataCache`.
4115
- * Mutually exclusive with string? GridDataRequest.FetchXml; exactly one of the
4116
- * two must be supplied.
4386
+ * @description Stored Dataverse view to use as the base query. When supplied alone,
4387
+ * the server loads the view's FetchXML and column list from
4388
+ * `IViewMetadataCache`. When supplied alongside string? GridDataRequest.FetchXml,
4389
+ * the FetchXML drives the query and this id is used only as the
4390
+ * view-definition identity for view-specific localized column-title
4391
+ * resolution (`tables.{table}.views.{id}.columns.*`) — no savedquery
4392
+ * is loaded. At least one of Guid? GridDataRequest.ViewId / string? GridDataRequest.FetchXml
4393
+ * must be supplied.
4117
4394
  */
4118
4395
  viewId?: null | string;
4119
4396
  /**
4120
4397
  * @description Caller-supplied FetchXML used as the base query. Useful for
4121
4398
  * custom (in-memory) views, dynamic queries assembled by consumer
4122
- * code, or lookup-style minimal-fetch shapes. Mutually exclusive
4123
- * with Guid? GridDataRequest.ViewId.
4399
+ * code, or lookup-style minimal-fetch shapes. May be combined with
4400
+ * Guid? GridDataRequest.ViewId (see its docs) to give an in-memory view a
4401
+ * stable identity for localization.
4124
4402
  */
4125
4403
  fetchXml?: null | string;
4126
4404
  /**
@@ -4167,7 +4445,7 @@ interface components {
4167
4445
  * `&lt;link-entity&gt;`). Filters, sorts, and link-entity
4168
4446
  * definitions on the base query are preserved.
4169
4447
  * Use case: consumer-declared &lt;GridColumn&gt; children on
4170
- * the React / Blazor grid express the displayed column set
4448
+ * the grid component express the displayed column set
4171
4449
  * authoritatively — this field forwards that intent down to the
4172
4450
  * server so the resolved column list + fetched data line up with
4173
4451
  * what the consumer asked to see, regardless of what the underlying
@@ -4233,9 +4511,9 @@ interface components {
4233
4511
  * table scope (Create especially is table-scoped — it doesn't make sense
4234
4512
  * per-row), so toolbar buttons can gate "New" / "Delete" off this one
4235
4513
  * authoritative value instead of sampling the first row's mask as a
4236
- * proxy. Computed via the same cached
4237
- * `ITablePermissionCache.GetPermissionForUserAsync` the Blazor
4238
- * grid buttons already use, so both stacks read the same answer.
4514
+ * proxy. Computed via the cached
4515
+ * `ITablePermissionCache.GetPermissionForUserAsync` so every
4516
+ * caller reads the same answer.
4239
4517
  */
4240
4518
  tablePermissions: components["schemas"]["TableSecurityPermission"];
4241
4519
  /** @description Paging metadata describing the current page and how to request the next one. */
@@ -4265,9 +4543,9 @@ interface components {
4265
4543
  * to predict it (or fetch the parent metadata just to pick a filter shape).
4266
4544
  * The wire payload is identical for both directionalities.
4267
4545
  *
4268
- * Powers the React / Blazor `SubGrid` ("rows related to this parent")
4269
- * and the React `ManyToManyLookupEdit`'s initial-selection load. For
4270
- * the lookup edit's autocomplete pool ("records not currently related to
4546
+ * Powers the `SubGrid` component ("rows related to this parent")
4547
+ * and `ManyToManyLookupEdit`'s initial-selection load. For the
4548
+ * lookup edit's autocomplete pool ("records not currently related to
4271
4549
  * this parent"), set RelationshipFilterMode RelationshipFilter.Mode to
4272
4550
  * RelationshipFilterMode.ExcludeExistingRecords — that path
4273
4551
  * is many-to-many only and the server rejects it for one-to-many
@@ -4305,9 +4583,9 @@ interface components {
4305
4583
  JoinOperator: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
4306
4584
  /**
4307
4585
  * @description Top-level manifest for the localization-bundle endpoints. Returned by
4308
- * <see cref="!:Routes.Localizations.Manifest" />; clients fetch this on
4586
+ * string Localizations.Manifest; clients fetch this on
4309
4587
  * startup to discover supported locales, then issue a follow-up call to
4310
- * <see cref="!:Routes.Localizations.Thumbprints" /> for the resolved locale's
4588
+ * string Localizations.Thumbprints for the resolved locale's
4311
4589
  * thumbprints.
4312
4590
  * Splitting "what locales exist" from "what thumbprints does locale X have"
4313
4591
  * keeps the version response tiny (a handful of locale codes) regardless
@@ -4324,10 +4602,18 @@ interface components {
4324
4602
  * culture first).
4325
4603
  */
4326
4604
  supportedLocales: string[];
4605
+ /**
4606
+ * @description The configured UrlCultureStrategy as a
4607
+ * string (`PathPrefix` / `PathPrefixAll` / `CookieOnly`). Lets a SPA
4608
+ * client match the server's URL convention: prefix-based strategies drive locale from
4609
+ * the URL and navigate on switch, while `CookieOnly` switches in place via the
4610
+ * culture cookie without touching the URL.
4611
+ */
4612
+ urlCultureStrategy: string;
4327
4613
  };
4328
4614
  /**
4329
4615
  * @description Per-locale thumbprint manifest. Returned by
4330
- * <see cref="!:Routes.Localizations.Thumbprints" /> for a single resolved
4616
+ * string Localizations.Thumbprints for a single resolved
4331
4617
  * locale; carries the content-derived thumbprint for every downloadable
4332
4618
  * bundle a client could need at that locale.
4333
4619
  * Per-resource thumbprints mean unchanged tables/views keep the same URL
@@ -4338,12 +4624,12 @@ interface components {
4338
4624
  /**
4339
4625
  * @description Thumbprint for the cross-cutting "default" bundle (everything outside
4340
4626
  * `tables.*` / `choices.*`). Compose into the URL produced by
4341
- * <see cref="!:Routes.Localizations.GetDefaultBundleRoute" />.
4627
+ * string Localizations.GetDefaultBundleRoute(string locale, string thumbprint).
4342
4628
  */
4343
4629
  bundle: string;
4344
4630
  /**
4345
4631
  * @description Thumbprint per table logical name. The matching URL —
4346
- * <see cref="!:Routes.Localizations.GetTableBundleRoute" /> — returns every
4632
+ * string Localizations.GetTableBundleRoute(string tableName, string locale, string thumbprint) — returns every
4347
4633
  * `tables.{name}.*` string PLUS the global `choices.{set}.*`
4348
4634
  * strings the table's columns reference.
4349
4635
  */
@@ -4352,7 +4638,7 @@ interface components {
4352
4638
  };
4353
4639
  /**
4354
4640
  * @description Thumbprint per view id (lowercased GUID, no braces). The matching URL —
4355
- * <see cref="!:Routes.Localizations.GetViewBundleRoute" /> — returns every
4641
+ * string Localizations.GetViewBundleRoute(string viewId, string locale, string thumbprint) — returns every
4356
4642
  * `tables.{owningTable}.views.{viewId}.*` string for that view. The
4357
4643
  * owning table is resolved server-side, so the client only needs the view id.
4358
4644
  */
@@ -4360,6 +4646,144 @@ interface components {
4360
4646
  [key: string]: string;
4361
4647
  };
4362
4648
  };
4649
+ /**
4650
+ * @description Admin-facing snapshot of the string-localization pipeline: the static configuration
4651
+ * that drives the warmup loaders plus the runtime per-source load records produced by
4652
+ * the most recent warmup. Surfaced via Task&lt;LocalizationOverview&gt; IPowerPortalsProService.GetLocalizationOverviewAsync().
4653
+ */
4654
+ LocalizationOverview: {
4655
+ /**
4656
+ * @description The static configuration: registered directories, files, table-localization mode,
4657
+ * and supported cultures. Reflects the options at the time the overview was captured.
4658
+ */
4659
+ configuration: components["schemas"]["LocalizationPipelineConfiguration"];
4660
+ /**
4661
+ * @description Per-source records from the most recent warmup, in the order they were loaded.
4662
+ * Empty when the cache hasn't been warmed yet (rare — startup runs the warmup
4663
+ * hook synchronously). Later entries override earlier ones on a per-key basis;
4664
+ * the int LocalizationSourceLoad.KeysOverriding column on each row shows
4665
+ * how many of its keys replaced a non-empty value already in the cache.
4666
+ */
4667
+ sourceLoads: components["schemas"]["LocalizationSourceLoad"][];
4668
+ /**
4669
+ * Format: date-time
4670
+ * @description When the most recent warmup completed (UTC). `null` if no warmup has run.
4671
+ */
4672
+ lastReloadedOn?: null | string;
4673
+ };
4674
+ /**
4675
+ * @description Static view of the configuration that drives the localization warmup, suitable for
4676
+ * rendering in an admin "what's wired up" panel alongside the runtime source list.
4677
+ */
4678
+ LocalizationPipelineConfiguration: {
4679
+ /**
4680
+ * @description When `true`, every table's metadata is loaded; IReadOnlyList&lt;string&gt; LocalizationPipelineConfiguration.TablesToLocalize
4681
+ * is ignored. Defaults to `true` on a fresh `LocalizationOptions`.
4682
+ */
4683
+ localizeAllAvailableTables: boolean;
4684
+ /**
4685
+ * @description The table logical names configured via `options.AddTableToLocalize(...)`.
4686
+ * Only honored when bool LocalizationPipelineConfiguration.LocalizeAllAvailableTables is `false`.
4687
+ */
4688
+ tablesToLocalize: string[];
4689
+ /**
4690
+ * @description The relative directory paths registered via `options.AddLocalizationDirectory(...)`.
4691
+ * JSON files in these directories load LAST in the warmup, so they override anything
4692
+ * supplied by Dataverse metadata or web resources.
4693
+ */
4694
+ localizationDirectories: string[];
4695
+ /** @description Individual file paths registered via `options.AddLocalizationFile(...)`. */
4696
+ localizationFiles: string[];
4697
+ /**
4698
+ * @description The web-resource name pattern the cache uses to discover Dataverse-hosted JSON
4699
+ * localization files. Hard-coded today; surfaced here so the admin UI doesn't have
4700
+ * to reinvent the literal.
4701
+ */
4702
+ webResourcePathPattern: string;
4703
+ /** @description The default culture configured on CultureInfo LocalizationOptions.DefaultCulture. */
4704
+ defaultCulture: string;
4705
+ };
4706
+ /**
4707
+ * @description Discriminates the three localization source kinds the cache pulls from at warmup.
4708
+ * Underlying integer values are pinned so JSON / numeric serialization is stable
4709
+ * across releases — append new members with the next unused number and never
4710
+ * renumber existing entries.
4711
+ * @enum {integer}
4712
+ */
4713
+ LocalizationSourceKind: 0 | 1 | 2;
4714
+ /**
4715
+ * @description One row in the runtime load-events grid: a single loader invocation against a single
4716
+ * source (one Dataverse table's metadata, one web resource, one disk file).
4717
+ */
4718
+ LocalizationSourceLoad: {
4719
+ /**
4720
+ * Format: int32
4721
+ * @description 1-based load order. Combined with DateTimeOffset LocalizationSourceLoad.LoadedAt, gives the precedence
4722
+ * chain: lower-order loads' values can be overridden by higher-order loads.
4723
+ */
4724
+ loadOrder: number | string;
4725
+ /**
4726
+ * @description Stable identifier for this source, suitable for keying download endpoints
4727
+ * (e.g. `"folder:Resources/app.fr.json"`, `"webresource:/PowerPortalsPro/Localization/tables.fr.json"`,
4728
+ * `"metadata:account"`). Stable across reloads of the same configuration.
4729
+ */
4730
+ sourceId: string;
4731
+ /** @description The kind of source this row represents — drives the icon / grouping in the UI. */
4732
+ kind: components["schemas"]["LocalizationSourceKind"];
4733
+ /**
4734
+ * @description Human-readable name for the source — the table logical name, the web resource
4735
+ * name, or the file path (absolute, as resolved by the loader).
4736
+ */
4737
+ displayName: string;
4738
+ /**
4739
+ * @description The cultures (two-letter ISO codes for metadata, filename-derived for JSON) this
4740
+ * source contributed strings to. A Dataverse table contributes to every culture
4741
+ * with an installed language pack; a JSON file contributes to exactly one.
4742
+ */
4743
+ cultures: string[];
4744
+ /**
4745
+ * Format: int32
4746
+ * @description Total number of distinct keys this source contributed across all cultures
4747
+ * (sum of per-culture key counts).
4748
+ */
4749
+ keysContributed: number | string;
4750
+ /**
4751
+ * Format: int32
4752
+ * @description Of int LocalizationSourceLoad.KeysContributed, how many replaced a non-empty value an earlier
4753
+ * source had already stored. Useful for spotting which JSON file is actually
4754
+ * overriding Dataverse-supplied translations.
4755
+ */
4756
+ keysOverriding: number | string;
4757
+ /**
4758
+ * Format: int64
4759
+ * @description Wall-clock duration of the load in milliseconds.
4760
+ */
4761
+ durationMs: number | string;
4762
+ /**
4763
+ * @description Terminal status — LocalizationSourceStatus.Loaded for success,
4764
+ * LocalizationSourceStatus.Failed when the loader threw (with
4765
+ * string? LocalizationSourceLoad.Error populated), or LocalizationSourceStatus.Skipped
4766
+ * when the source was discovered but ineligible (e.g. an empty file).
4767
+ */
4768
+ status: components["schemas"]["LocalizationSourceStatus"];
4769
+ /**
4770
+ * @description Exception message when LocalizationSourceStatus LocalizationSourceLoad.Status is LocalizationSourceStatus.Failed,
4771
+ * otherwise `null`.
4772
+ */
4773
+ error?: null | string;
4774
+ /**
4775
+ * Format: date-time
4776
+ * @description When this individual source finished loading (UTC).
4777
+ */
4778
+ loadedAt: string;
4779
+ };
4780
+ /**
4781
+ * @description Terminal status of a single source's load. Underlying integer values are pinned
4782
+ * so JSON / numeric serialization is stable across releases — append new members
4783
+ * with the next unused number and never renumber existing entries.
4784
+ * @enum {integer}
4785
+ */
4786
+ LocalizationSourceStatus: 0 | 1 | 2;
4363
4787
  /**
4364
4788
  * @description Credentials submitted to `POST /api/auth/login`. Same-origin SPAs only need to
4365
4789
  * post this body; the server sets the auth cookie on success and returns a
@@ -4392,9 +4816,9 @@ interface components {
4392
4816
  * so the client can branch UI behavior without inspecting HTTP status codes.
4393
4817
  *
4394
4818
  * Members carry explicit integer values: this enum ships in JSON wire payloads, so
4395
- * non-Blazor consumers (React, Vue, mobile clients) compare against the numeric
4396
- * representation. Pinning the values prevents accidental drift if a future
4397
- * refactor reorders or inserts members.
4819
+ * the JSON numeric representation is a stable contract. Pinning the
4820
+ * values prevents accidental drift if a future refactor reorders or
4821
+ * inserts members.
4398
4822
  * @enum {integer}
4399
4823
  */
4400
4824
  LoginResult: 0 | 1 | 2 | 3 | 4;
@@ -4581,6 +5005,53 @@ interface components {
4581
5005
  [key: string]: components["schemas"]["ColumnValueBase"];
4582
5006
  };
4583
5007
  };
5008
+ /**
5009
+ * @description Stable, environment-wide settings sourced from the Dataverse `organization`
5010
+ * record. Cached server-side (they change very rarely — only when an admin updates
5011
+ * the org record) and re-served to clients via `/api/organizationSettings` so
5012
+ * the front end can prime defaults without firing its own Dataverse trip.
5013
+ * Two categories of fields live here today:
5014
+ * * Currency OrganizationSettings.DefaultCurrency — used by create-mode editors to render the
5015
+ * correct currency symbol on new records before they're saved.
5016
+ * * IReadOnlyList&lt;string&gt; OrganizationSettings.BlockedFileExtensions + long OrganizationSettings.MaxUploadFileSizeInBytes
5017
+ * — file-upload constraints clients mirror so users get a friendly client-side
5018
+ * rejection instead of a round-trip failure.
5019
+ * New properties are appended as additional organization-level defaults become
5020
+ * useful client-side (locale, base language, formatting policies, etc.).
5021
+ */
5022
+ OrganizationSettings: {
5023
+ /**
5024
+ * @description The org's base currency, resolved from the `organization.basecurrencyid`
5025
+ * lookup. `MoneyEdit` consumes this in create mode so a brand-new record
5026
+ * displays the right currency symbol before the user picks one or saves.
5027
+ */
5028
+ defaultCurrency: components["schemas"]["Currency"];
5029
+ /**
5030
+ * @description Lowercase file extensions (without the leading dot) that Dataverse refuses to
5031
+ * accept as uploads — for example `"svg"`, `"exe"`, `"bat"`. Sourced
5032
+ * from the organization's `blockedattachments` setting (a semicolon-delimited
5033
+ * string in Dataverse, parsed and normalised here). Clients reject these client-side
5034
+ * before the upload round-trips.
5035
+ */
5036
+ blockedFileExtensions: string[];
5037
+ /**
5038
+ * Format: int64
5039
+ * @description Maximum upload size for file attachments and file-column payloads, in bytes.
5040
+ * Sourced from the organization's `maxuploadfilesize` setting. Clients
5041
+ * compare file byte length directly against this for a pre-upload check.
5042
+ */
5043
+ maxUploadFileSizeInBytes: number | string;
5044
+ /**
5045
+ * @description The organization's default time-zone id (a Windows time-zone id such as
5046
+ * `Pacific Standard Time`, suitable for TimeZoneInfo TimeZoneInfo.FindSystemTimeZoneById(string id)),
5047
+ * resolved from the connecting app user's `usersettings.timezonecode`. The
5048
+ * `organization` entity has no time-zone column of its own, so this is the closest
5049
+ * org-wide default. Used server-side to format `UserLocal` dates for contacts (portal
5050
+ * users, which have no `usersettings` row); empty when it can't be resolved. Defaults to
5051
+ * empty for backward compatibility with older cached payloads.
5052
+ */
5053
+ defaultTimeZoneId?: string;
5054
+ };
4584
5055
  /** @description Paging metadata for a Dataverse query response. */
4585
5056
  PagingInfo: {
4586
5057
  /**
@@ -4755,8 +5226,7 @@ interface components {
4755
5226
  };
4756
5227
  /**
4757
5228
  * @description Outcome of a RegisterRequest. Members carry explicit integer
4758
- * values so non-Blazor consumers comparing against the JSON wire form get a
4759
- * stable contract across reorderings.
5229
+ * values so the JSON wire form is a stable contract across reorderings.
4760
5230
  * @enum {integer}
4761
5231
  */
4762
5232
  RegisterResult: 0 | 1 | 2;
@@ -4863,8 +5333,8 @@ interface components {
4863
5333
  };
4864
5334
  /**
4865
5335
  * @description Outcome of `POST /api/auth/reset-password`. Members carry explicit
4866
- * integer values so non-Blazor consumers comparing against the JSON wire form
4867
- * get a stable contract across reorderings.
5336
+ * integer values so the JSON wire form is a stable contract across
5337
+ * reorderings.
4868
5338
  * @enum {integer}
4869
5339
  */
4870
5340
  ResetPasswordResult: 0 | 1 | 2;
@@ -4921,7 +5391,7 @@ interface components {
4921
5391
  * the column matching `TableMetadata.PrimaryNameColumn` AND
4922
5392
  * belonging to the view's main table (not a linked-entity column).
4923
5393
  * Clients use this to optionally render the cell as a clickable link
4924
- * that triggers the grid's edit action (see Blazor's
5394
+ * that triggers the grid's edit action (gated by
4925
5395
  * `AllowNavigateOnPrimaryNameClick`). At most one column per
4926
5396
  * view will have this set; consumers can safely use it to decorate
4927
5397
  * "open this record"-style links without per-row metadata lookups.
@@ -4995,8 +5465,8 @@ interface components {
4995
5465
  };
4996
5466
  /**
4997
5467
  * @description Outcome of `POST /api/auth/switch-identity`. Members carry explicit
4998
- * integer values so non-Blazor consumers comparing against the JSON wire form
4999
- * get a stable contract across reorderings.
5468
+ * integer values so the JSON wire form is a stable contract across
5469
+ * reorderings.
5000
5470
  * @enum {integer}
5001
5471
  */
5002
5472
  SwitchIdentityResult: 0 | 1 | 2 | 3;
@@ -5045,6 +5515,7 @@ interface components {
5045
5515
  formattedValues?: {
5046
5516
  [key: string]: string;
5047
5517
  };
5518
+ currency?: null | components["schemas"]["Currency"];
5048
5519
  /** @description True when at least one column value has been changed since the record was loaded or void TableRecord.ResetState() was called. */
5049
5520
  isDirty?: boolean;
5050
5521
  /** Format: uuid */
@@ -5067,6 +5538,121 @@ interface components {
5067
5538
  * @enum {integer}
5068
5539
  */
5069
5540
  TableSecurityPermission: 0 | 1 | 2 | 4 | 8 | 16 | 32 | 63;
5541
+ /**
5542
+ * @description One target language's translated output plus how many strings were freshly translated
5543
+ * versus reused from the Dataverse translation memory.
5544
+ */
5545
+ TranslatedFile: {
5546
+ /** @description The portal culture this file was translated into (e.g. `"fr-FR"`). */
5547
+ targetCultureCode: string;
5548
+ /** @description Suggested filename for this language's download (e.g. `"app.fr-FR.json"`). */
5549
+ fileName: string;
5550
+ /**
5551
+ * Format: int32
5552
+ * @description Number of strings sent to the translation provider for this language this run.
5553
+ */
5554
+ translatedCount: number | string;
5555
+ /**
5556
+ * Format: int32
5557
+ * @description Number of strings that came from the Dataverse translation memory (not re-sent to the provider).
5558
+ */
5559
+ reusedCount: number | string;
5560
+ /**
5561
+ * Format: byte
5562
+ * @description UTF-8-encoded translated JSON body, in the same nested-object shape as the source.
5563
+ */
5564
+ content: string;
5565
+ };
5566
+ /**
5567
+ * @description Admin-facing description of whether the localization-translation feature is usable in
5568
+ * the current environment, returned by Task&lt;TranslationAvailability&gt; IPowerPortalsProService.GetTranslationAvailabilityAsync().
5569
+ * Drives whether the `LocalizationTranslator` UI shows its upload/translate panel, an
5570
+ * "install the managed solution" prompt, or nothing at all.
5571
+ */
5572
+ TranslationAvailability: {
5573
+ /**
5574
+ * @description `true` when a translation provider is registered and its credentials are configured
5575
+ * (the consumer called one of the `AddPowerPortalsPro&lt;Provider&gt;TranslationService()`
5576
+ * methods — Azure, DeepL, Google, … — and supplied the provider's key). When `false` the UI
5577
+ * renders nothing — translation is a host-wiring concern the admin can't self-serve.
5578
+ */
5579
+ isConfigured: boolean;
5580
+ /**
5581
+ * @description `true` when the translation managed solution (default unique name
5582
+ * `PowerPortalsProLocalization`) is installed in the connected environment, so the
5583
+ * translation-memory tables exist. When bool TranslationAvailability.IsConfigured is `true` but this
5584
+ * is `false`, the UI shows a prompt to install the solution.
5585
+ */
5586
+ isSolutionInstalled: boolean;
5587
+ /**
5588
+ * @description The candidate target languages — the portal's supported cultures, each annotated with
5589
+ * whether the configured translation provider can translate to it. Cultures the provider
5590
+ * doesn't support are still returned (so the admin sees them) but flagged via
5591
+ * bool TranslationLanguageOption.IsSupportedByProvider so the UI can disable them.
5592
+ * Empty when bool TranslationAvailability.IsConfigured is `false`.
5593
+ */
5594
+ targetLanguages: components["schemas"]["TranslationLanguageOption"][];
5595
+ };
5596
+ /**
5597
+ * @description One selectable target language in the translation UI: a portal-supported culture paired
5598
+ * with the translation-provider language code it maps to (when the provider supports it).
5599
+ */
5600
+ TranslationLanguageOption: {
5601
+ /** @description The portal culture code (e.g. `"fr-FR"`) — what the UI shows and the output file is named for. */
5602
+ cultureCode: string;
5603
+ /** @description Human-readable language/culture display name (e.g. `"French (France)"`). */
5604
+ displayName: string;
5605
+ /**
5606
+ * @description The translation-provider language code this culture maps to (e.g. `"fr"`), or `null`
5607
+ * when the configured provider doesn't support the culture's language.
5608
+ */
5609
+ providerLanguageCode?: null | string;
5610
+ /** @description `true` when the configured provider can translate to this culture (string? TranslationLanguageOption.ProviderLanguageCode is non-null). */
5611
+ isSupportedByProvider?: boolean;
5612
+ };
5613
+ /**
5614
+ * @description Request to translate one uploaded localization file into one or more target languages,
5615
+ * passed to Task&lt;TranslationResult&gt; IPowerPortalsProService.TranslateLocalizationFileAsync(TranslationRequest request).
5616
+ */
5617
+ TranslationRequest: {
5618
+ /** @description BCP-47 source language code (e.g. `"en"`), auto-detected from the filename but admin-editable. */
5619
+ sourceLanguage: string;
5620
+ /** @description The portal culture codes to translate into (the string TranslationLanguageOption.CultureCode values the admin selected). */
5621
+ targetCultureCodes: string[];
5622
+ /** @description The original uploaded filename (e.g. `"app.en.json"`) — used to name the per-language output files. */
5623
+ fileName: string;
5624
+ /**
5625
+ * Format: byte
5626
+ * @description The raw uploaded file bytes (UTF-8 JSON, optionally wrapped in a `var x = {...}` assignment, which the translator tolerates).
5627
+ */
5628
+ sourceContent: string;
5629
+ };
5630
+ /**
5631
+ * @description Result of a translate operation: one TranslatedFile per requested target
5632
+ * language plus a single zip of all of them, returned by
5633
+ * Task&lt;TranslationResult&gt; IPowerPortalsProService.TranslateLocalizationFileAsync(TranslationRequest request).
5634
+ */
5635
+ TranslationResult: {
5636
+ /** @description One entry per requested target language, each with its own counts and downloadable content. */
5637
+ files: components["schemas"]["TranslatedFile"][];
5638
+ /**
5639
+ * Format: byte
5640
+ * @description All IReadOnlyList&lt;TranslatedFile&gt; TranslationResult.Files packaged into a single zip — backs the "Download all" button.
5641
+ */
5642
+ zipContent: string;
5643
+ /** @description Suggested filename for the byte[] TranslationResult.ZipContent download. */
5644
+ zipFileName: string;
5645
+ /**
5646
+ * Format: int32
5647
+ * @description Total strings translated via the provider across all languages this run (sum of int TranslatedFile.TranslatedCount).
5648
+ */
5649
+ totalTranslated: number | string;
5650
+ /**
5651
+ * Format: int32
5652
+ * @description Total strings satisfied from the Dataverse translation memory across all languages (sum of int TranslatedFile.ReusedCount).
5653
+ */
5654
+ totalReused: number | string;
5655
+ };
5070
5656
  /**
5071
5657
  * @description Snapshot of the user's two-factor configuration, returned by
5072
5658
  * `GET /api/auth/manage/2fa`. Drives the Manage/TwoFactorAuthentication
@@ -5240,6 +5826,7 @@ type ConfirmEmailResponse = Schemas$1['ConfirmEmailResponse'];
5240
5826
  type ResendEmailConfirmationRequest = Schemas$1['ResendEmailConfirmationRequest'];
5241
5827
  type CurrentUserInfo = Schemas$1['CurrentUserInfo'];
5242
5828
  type ExternalLoginProviderInfo = Schemas$1['ExternalLoginProviderInfo'];
5829
+ type AuthOptionsResponse = Schemas$1['AuthOptionsResponse'];
5243
5830
  type PendingExternalLoginResponse = Schemas$1['PendingExternalLoginResponse'];
5244
5831
  type ConfirmExternalLoginRequest = Schemas$1['ConfirmExternalLoginRequest'];
5245
5832
  type ConfirmExternalLoginResponse = Schemas$1['ConfirmExternalLoginResponse'];
@@ -5270,16 +5857,16 @@ type PersonalDataResponse = Schemas$1['PersonalDataResponse'];
5270
5857
  type DeletePersonalDataRequest = Schemas$1['DeletePersonalDataRequest'];
5271
5858
  type DeletePersonalDataResponse = Schemas$1['DeletePersonalDataResponse'];
5272
5859
  /**
5273
- * SPA-facing wrapper over the framework's `/api/auth/*` endpoints — the React equivalent
5274
- * of `IAuthService` from `PowerPortalsPro.Web.Common.Auth`. Method names mirror the C#
5275
- * interface so a Blazor dev reading both sides finds the same vocabulary.
5860
+ * SPA-facing wrapper over the framework's `/api/auth/*` endpoints — sign-
5861
+ * in, profile, 2FA, external login, forgot-password, registration, and
5862
+ * confirmation flows.
5276
5863
  *
5277
5864
  * Cookie auth flows automatically (the underlying {@link Transport} sends
5278
5865
  * `credentials: 'include'`), so a successful `loginAsync` leaves subsequent calls
5279
5866
  * authenticated without any token wiring on the React side.
5280
5867
  *
5281
5868
  * Mid-flow steps (`login → 2FA`, `register → confirm email`, `forgot → reset`) each
5282
- * surface as their own method so the consuming SPA owns its routing/UX between steps
5869
+ * surface as their own method so the consuming SPA owns its routing/UX between steps
5283
5870
  * same design as the C# interface.
5284
5871
  */
5285
5872
  declare class AuthClient {
@@ -5321,8 +5908,13 @@ declare class AuthClient {
5321
5908
  * startup to decide whether to render signed-in UI vs. the login flow.
5322
5909
  */
5323
5910
  getCurrentUserAsync(signal?: AbortSignal): Promise<CurrentUserInfo>;
5324
- /** Lists the configured external (OAuth) login providers (Microsoft, Google, …). */
5325
- getExternalLoginProvidersAsync(signal?: AbortSignal): Promise<readonly ExternalLoginProviderInfo[]>;
5911
+ /**
5912
+ * Anonymous auth options for the sign-in UI: whether the portal accepts local
5913
+ * username/password accounts (`localAccountsEnabled`) plus the configured external
5914
+ * providers — one round-trip the login page uses to decide whether to render the
5915
+ * local form / register + reset links and which provider buttons to show.
5916
+ */
5917
+ getAuthOptionsAsync(signal?: AbortSignal): Promise<AuthOptionsResponse>;
5326
5918
  /**
5327
5919
  * Reads the in-flight external-login cookie set by an OAuth callback. Returns
5328
5920
  * `null` when no callback is in flight (the endpoint replies 204) — the client
@@ -5405,43 +5997,56 @@ declare class AuthClient {
5405
5997
  * Aggregate function applied to a column in an aggregate FetchXML query.
5406
5998
  */
5407
5999
  declare const AggregateType: {
6000
+ /** No aggregation. */
5408
6001
  readonly None: 0;
6002
+ /** Count of rows (including nulls). */
5409
6003
  readonly Count: 1;
6004
+ /** Count of rows where the column is not null. */
5410
6005
  readonly CountColumn: 2;
6006
+ /** Sum of values. */
5411
6007
  readonly Sum: 3;
6008
+ /** Arithmetic mean of values. */
5412
6009
  readonly Avg: 4;
6010
+ /** Minimum value. */
5413
6011
  readonly Min: 5;
6012
+ /** Maximum value. */
5414
6013
  readonly Max: 6;
5415
6014
  };
5416
6015
  type AggregateType = (typeof AggregateType)[keyof typeof AggregateType];
5417
6016
  /**
5418
6017
  * Compression format for the archive produced by
5419
- * <see cref="!:Services.IPowerPortalsProService.CreateFileArchiveAsync" />.
6018
+ * `IPowerPortalsProService.CreateFileArchiveAsync`.
5420
6019
  * Currently only ArchiveFormat.Zip is supported; the enum is open-ended so
5421
6020
  * future formats can land without breaking the wire schema.
5422
6021
  */
5423
6022
  declare const ArchiveFormat: {
6023
+ /** Standard ZIP archive (application/zip, .zip extension). Built via ZipArchive with Optimal. */
5424
6024
  readonly Zip: 0;
5425
6025
  };
5426
6026
  type ArchiveFormat = (typeof ArchiveFormat)[keyof typeof ArchiveFormat];
5427
6027
  /**
5428
6028
  * Outcome of `POST /api/auth/manage/email/change`. Members carry explicit
5429
- * integer values so non-Blazor consumers comparing against the JSON wire form
5430
- * get a stable contract across reorderings.
6029
+ * integer values so the JSON wire form is a stable contract across
6030
+ * reorderings.
5431
6031
  */
5432
6032
  declare const ChangeEmailResult: {
6033
+ /** A confirmation email was sent to the new address. The change does not take effect until the user clicks the link. */
5433
6034
  readonly ConfirmationEmailSent: 0;
6035
+ /** The submitted email matches the user's current email. Nothing was sent. The client should show a "this is already your email" message. */
5434
6036
  readonly SameAsCurrentEmail: 1;
5435
6037
  };
5436
6038
  type ChangeEmailResult = (typeof ChangeEmailResult)[keyof typeof ChangeEmailResult];
5437
6039
  /**
5438
6040
  * Outcome of `POST /api/auth/manage/password/change`. Members carry
5439
- * explicit integer values so non-Blazor consumers comparing against the JSON
5440
- * wire form get a stable contract across reorderings.
6041
+ * explicit integer values so the JSON wire form is a stable contract
6042
+ * across reorderings.
5441
6043
  */
5442
6044
  declare const ChangePasswordResult: {
6045
+ /** The password was changed. The auth cookie has been refreshed to pick up the new security stamp so other sessions are invalidated. */
5443
6046
  readonly Success: 0;
6047
+ /** The supplied old password did not match the current password. The client should show an "incorrect current password" error and allow retry. */
5444
6048
  readonly IncorrectOldPassword: 1;
6049
+ /** The new password did not satisfy the host's IdentityOptions.Password rules. Errors carries the per-rule messages so the client can show actionable feedback. */
5445
6050
  readonly InvalidPassword: 2;
5446
6051
  };
5447
6052
  type ChangePasswordResult = (typeof ChangePasswordResult)[keyof typeof ChangePasswordResult];
@@ -5455,16 +6060,27 @@ type ChangePasswordResult = (typeof ChangePasswordResult)[keyof typeof ChangePas
5455
6060
  * current culture.
5456
6061
  */
5457
6062
  declare const ChartDateGrouping: {
6063
+ /** No date grouping — the column is grouped by its raw value. */
5458
6064
  readonly None: 0;
6065
+ /** Group by day (dategrouping="day"). Label: day number. */
5459
6066
  readonly Day: 1;
6067
+ /** Group by ISO week (dategrouping="week"). Label: week number. */
5460
6068
  readonly Week: 2;
6069
+ /** Group by calendar month (dategrouping="month"). Label: abbreviated month name (Jan, Feb, …) in the current culture. */
5461
6070
  readonly Month: 3;
6071
+ /** Group by calendar quarter (dategrouping="quarter"). Label: quarter number. */
5462
6072
  readonly Quarter: 4;
6073
+ /** Group by calendar year (dategrouping="year"). Label: year. */
5463
6074
  readonly Year: 5;
6075
+ /** Group by month + year. Label: "Jan 2024". */
5464
6076
  readonly MonthAndYear: 6;
6077
+ /** Group by day + month. Label: "15 Jan". */
5465
6078
  readonly DayAndMonth: 7;
6079
+ /** Group by day + month + year. Label: "15 Jan 2024". */
5466
6080
  readonly DayAndMonthAndYear: 8;
6081
+ /** Group by ISO week + year. Label: "W15 2024". */
5467
6082
  readonly WeekAndYear: 9;
6083
+ /** Group by quarter + year. Label: "Q1 2024". */
5468
6084
  readonly QuarterAndYear: 10;
5469
6085
  };
5470
6086
  type ChartDateGrouping = (typeof ChartDateGrouping)[keyof typeof ChartDateGrouping];
@@ -5472,41 +6088,69 @@ type ChartDateGrouping = (typeof ChartDateGrouping)[keyof typeof ChartDateGroupi
5472
6088
  * Identifies the data type of a Dataverse column. Values 0–20 mirror the Dataverse SDK's `AttributeTypeCode`; values 40+ are PowerPortalsPro-specific column types not present in Dataverse.
5473
6089
  */
5474
6090
  declare const ColumnType: {
6091
+ /** A Boolean attribute. Value = 0. */
5475
6092
  readonly Boolean: 0;
6093
+ /** An attribute that represents a customer. Value = 1. */
5476
6094
  readonly Customer: 1;
6095
+ /** A date/time attribute. Value = 2. */
5477
6096
  readonly DateTime: 2;
6097
+ /** A decimal attribute. Value = 3. */
5478
6098
  readonly Decimal: 3;
6099
+ /** A double attribute. Value = 4. */
5479
6100
  readonly Double: 4;
6101
+ /** An integer attribute. Value = 5. */
5480
6102
  readonly Integer: 5;
6103
+ /** A lookup attribute. Value = 6. */
5481
6104
  readonly Lookup: 6;
6105
+ /** A memo attribute. Value = 7. */
5482
6106
  readonly Memo: 7;
6107
+ /** A money attribute. Value = 8. */
5483
6108
  readonly Money: 8;
6109
+ /** An owner attribute. Value = 9. */
5484
6110
  readonly Owner: 9;
6111
+ /** A partylist attribute. Value = 10. */
5485
6112
  readonly PartyList: 10;
6113
+ /** A picklist (single-select choice) attribute. Value = 11. */
5486
6114
  readonly Choice: 11;
6115
+ /** A state attribute. Value = 12. */
5487
6116
  readonly State: 12;
6117
+ /** A status attribute. Value = 13. */
5488
6118
  readonly Status: 13;
6119
+ /** A string attribute. Value = 14. */
5489
6120
  readonly String: 14;
6121
+ /** A unique identifier (GUID) attribute. Value = 15. */
5490
6122
  readonly Uniqueidentifier: 15;
6123
+ /** An attribute that contains calendar rules. Value = 16. */
5491
6124
  readonly CalendarRules: 16;
6125
+ /** An attribute that is created by the system at run time. Value = 17. */
5492
6126
  readonly Virtual: 17;
6127
+ /** A big integer (long) attribute. Value = 18. */
5493
6128
  readonly BigInt: 18;
6129
+ /** A managed property attribute. Value = 19. */
5494
6130
  readonly ManagedProperty: 19;
6131
+ /** An entity name attribute. Value = 20. */
5495
6132
  readonly EntityName: 20;
6133
+ /** A multi-select choice attribute. Value = 40. PowerPortalsPro-specific (not present in Dataverse AttributeTypeCode). */
5496
6134
  readonly MultiSelectChoice: 40;
6135
+ /** A file attachment attribute. Value = 41. PowerPortalsPro-specific (not present in Dataverse AttributeTypeCode). */
5497
6136
  readonly File: 41;
6137
+ /** An image attribute. Value = 42. PowerPortalsPro-specific (not present in Dataverse AttributeTypeCode). */
5498
6138
  readonly Image: 42;
5499
6139
  };
5500
6140
  type ColumnType = (typeof ColumnType)[keyof typeof ColumnType];
5501
6141
  /**
5502
6142
  * Outcome of `POST /api/auth/external-login/confirm`. Members carry
5503
- * explicit integer values so non-Blazor consumers comparing against the JSON
5504
- * wire form get a stable contract across reorderings.
6143
+ * explicit integer values so the JSON wire form is a stable contract
6144
+ * across reorderings.
5505
6145
  */
5506
6146
  declare const ConfirmExternalLoginResult: {
6147
+ /** The external login was linked (creating a new local account if needed) and the user has been signed in. The auth cookie is set on the response. */
5507
6148
  readonly SignedIn: 0;
6149
+ /** The account was created but the host requires email confirmation. A confirmation link has been sent; the user is NOT signed in yet. */
5508
6150
  readonly ConfirmationEmailSent: 1;
6151
+ /** No external-login cookie was found — the user landed on the confirm endpoint without a fresh OAuth callback. The client should redirect back to the login page. */
5509
6152
  readonly NoPendingExternalLogin: 2;
6153
+ /** Identity rejected the create / add-login operation (e.g. duplicate email already linked to a different account). Errors carries the per-rule messages. */
5510
6154
  readonly Failure: 3;
5511
6155
  };
5512
6156
  type ConfirmExternalLoginResult = (typeof ConfirmExternalLoginResult)[keyof typeof ConfirmExternalLoginResult];
@@ -5514,29 +6158,37 @@ type ConfirmExternalLoginResult = (typeof ConfirmExternalLoginResult)[keyof type
5514
6158
  * Specifies the date/time behavior of a DateTime column.
5515
6159
  */
5516
6160
  declare const DateTimeBehavior: {
6161
+ /** Only the date portion is stored; no time component. */
5517
6162
  readonly DateOnly: 1;
6163
+ /** The value is stored in UTC and converted to the user's local time zone for display. */
5518
6164
  readonly UserLocal: 2;
6165
+ /** The value is stored and displayed exactly as entered, without time zone conversion. */
5519
6166
  readonly TimeZoneIndependent: 3;
5520
6167
  };
5521
6168
  type DateTimeBehavior = (typeof DateTimeBehavior)[keyof typeof DateTimeBehavior];
5522
6169
  /**
5523
6170
  * Outcome of `POST /api/auth/manage/personal-data/delete`. Members carry
5524
- * explicit integer values so non-Blazor consumers comparing against the JSON
5525
- * wire form get a stable contract across reorderings.
6171
+ * explicit integer values so the JSON wire form is a stable contract
6172
+ * across reorderings.
5526
6173
  */
5527
6174
  declare const DeletePersonalDataResult: {
6175
+ /** The account was deleted and the auth cookie has been cleared. */
5528
6176
  readonly Success: 0;
6177
+ /** The user has a local password set, and one was supplied, but it did not match. The client should show an "incorrect password" error and allow retry. */
5529
6178
  readonly IncorrectPassword: 1;
6179
+ /** The user has a local password set but the request body's password field was empty. The client should prompt for the password and resubmit. Distinct from IncorrectPassword so the UI can choose between "please enter your password" and "that password is wrong." */
5530
6180
  readonly RequireLocalPassword: 2;
5531
6181
  };
5532
6182
  type DeletePersonalDataResult = (typeof DeletePersonalDataResult)[keyof typeof DeletePersonalDataResult];
5533
6183
  /**
5534
6184
  * Which Dataverse table backs an external-login candidate. Members carry
5535
- * explicit integer values so non-Blazor consumers comparing against the JSON
5536
- * wire form get a stable contract across reorderings.
6185
+ * explicit integer values so the JSON wire form is a stable contract
6186
+ * across reorderings.
5537
6187
  */
5538
6188
  declare const ExternalLoginCandidateKind: {
6189
+ /** The candidate is a Dataverse contact record. */
5539
6190
  readonly Contact: 0;
6191
+ /** The candidate is a Dataverse systemuser record. */
5540
6192
  readonly SystemUser: 1;
5541
6193
  };
5542
6194
  type ExternalLoginCandidateKind = (typeof ExternalLoginCandidateKind)[keyof typeof ExternalLoginCandidateKind];
@@ -5544,7 +6196,9 @@ type ExternalLoginCandidateKind = (typeof ExternalLoginCandidateKind)[keyof type
5544
6196
  * Determines how the server returns the archive bytes to the caller.
5545
6197
  */
5546
6198
  declare const FileArchiveResponseFormat: {
6199
+ /** Returns the raw archive bytes as the response body, with Content-Type: application/zip (or the matching MIME for the chosen ArchiveFormat) and a Content-Disposition: attachment; filename=… header. The caller hands the response directly to the browser's download path — no base64 round-trip. Default mode. */
5547
6200
  readonly BinaryStream: 0;
6201
+ /** Returns a JSON envelope (FileArchiveJsonResponse) that wraps the archive's bytes as base64. Useful when the consumer wants to inspect headers / filename / size programmatically before triggering a download, or when the host environment can't stream binary responses (some test harnesses, some service workers). Trades ~33% wire-size overhead for the JSON wrapper. */
5548
6202
  readonly Json: 1;
5549
6203
  };
5550
6204
  type FileArchiveResponseFormat = (typeof FileArchiveResponseFormat)[keyof typeof FileArchiveResponseFormat];
@@ -5552,15 +6206,25 @@ type FileArchiveResponseFormat = (typeof FileArchiveResponseFormat)[keyof typeof
5552
6206
  * Join type used on a FetchXML link-entity.
5553
6207
  */
5554
6208
  declare const JoinOperator: {
6209
+ /** Inner join — only matching rows are returned. */
5555
6210
  readonly Inner: 0;
6211
+ /** Left outer join — unmatched parent rows are returned with null link columns. */
5556
6212
  readonly LeftOuter: 1;
6213
+ /** Natural join. */
5557
6214
  readonly Natural: 2;
6215
+ /** Match first row using cross apply. */
5558
6216
  readonly MatchFirstRowUsingCrossApply: 3;
6217
+ /** In join — semi-join used for subqueries. */
5559
6218
  readonly In: 4;
6219
+ /** Exists join — semi-join evaluating existence. */
5560
6220
  readonly Exists: 5;
6221
+ /** Any-match semi-join. */
5561
6222
  readonly Any: 6;
6223
+ /** Inverse of Any. */
5562
6224
  readonly NotAny: 7;
6225
+ /** All-match semi-join. */
5563
6226
  readonly All: 8;
6227
+ /** Inverse of All. */
5564
6228
  readonly NotAll: 9;
5565
6229
  };
5566
6230
  type JoinOperator = (typeof JoinOperator)[keyof typeof JoinOperator];
@@ -5569,26 +6233,33 @@ type JoinOperator = (typeof JoinOperator)[keyof typeof JoinOperator];
5569
6233
  * so the client can branch UI behavior without inspecting HTTP status codes.
5570
6234
  *
5571
6235
  * Members carry explicit integer values: this enum ships in JSON wire payloads, so
5572
- * non-Blazor consumers (React, Vue, mobile clients) compare against the numeric
5573
- * representation. Pinning the values prevents accidental drift if a future
5574
- * refactor reorders or inserts members.
6236
+ * the JSON numeric representation is a stable contract. Pinning the
6237
+ * values prevents accidental drift if a future refactor reorders or
6238
+ * inserts members.
5575
6239
  */
5576
6240
  declare const LoginResult: {
6241
+ /** Credentials were accepted and the auth cookie has been set. The client should navigate to the post-login destination (typically ReturnUrl). */
5577
6242
  readonly Success: 0;
6243
+ /** Credentials were accepted but the account requires a second factor. The server has sent the 2FA code (e.g., via email) and is waiting for a follow-up call to POST /api/auth/login/2fa. No auth cookie is set yet. */
5578
6244
  readonly RequiresTwoFactor: 1;
6245
+ /** The email/password pair did not match any account, or the password was wrong. The client should show a generic "invalid credentials" message — the server deliberately does not distinguish between "no such email" and "wrong password" to avoid account-enumeration attacks. */
5579
6246
  readonly InvalidCredentials: 2;
6247
+ /** The account exists and the password matched, but the email address has not been confirmed and the host configured SignIn.RequireConfirmedAccount. The client should redirect to the registration-confirmation flow. */
5580
6248
  readonly EmailNotConfirmed: 3;
6249
+ /** The account is locked out (too many failed attempts, manual lockout, etc.). The client should show the lockout page. */
5581
6250
  readonly LockedOut: 4;
5582
6251
  };
5583
6252
  type LoginResult = (typeof LoginResult)[keyof typeof LoginResult];
5584
6253
  /**
5585
6254
  * Outcome of a RegisterRequest. Members carry explicit integer
5586
- * values so non-Blazor consumers comparing against the JSON wire form get a
5587
- * stable contract across reorderings.
6255
+ * values so the JSON wire form is a stable contract across reorderings.
5588
6256
  */
5589
6257
  declare const RegisterResult: {
6258
+ /** The account was created and a confirmation email has been sent. The user is NOT signed in yet — they must click the confirmation link first. */
5590
6259
  readonly ConfirmationEmailSent: 0;
6260
+ /** The account was created and the user has been signed in directly (the host did not configure SignIn.RequireConfirmedAccount). */
5591
6261
  readonly SignedIn: 1;
6262
+ /** An account with the same email already exists. The server returns this rather than silently succeeding to give the client an opportunity to surface a clear error, at the cost of allowing email enumeration. Hosts that prefer the enumeration- resistant path should treat this as success client-side. */
5592
6263
  readonly EmailAlreadyInUse: 2;
5593
6264
  };
5594
6265
  type RegisterResult = (typeof RegisterResult)[keyof typeof RegisterResult];
@@ -5605,7 +6276,9 @@ type RegisterResult = (typeof RegisterResult)[keyof typeof RegisterResult];
5605
6276
  * relationship is rejected by the server at filter-apply time.
5606
6277
  */
5607
6278
  declare const RelationshipFilterMode: {
6279
+ /** Return records currently associated with ParentRecord via the named relationship. For one-to-many, AND-merges a referencingColumn == parentRecord.Id condition. For many-to-many, AND-merges an intersect link-entity plus a condition on the parent-side intersect column. */
5608
6280
  readonly IncludeExistingRecords: 0;
6281
+ /** Return records that are NOT currently associated with ParentRecord. Many-to-many only — AND-merges a LEFT OUTER intersect link-entity (filtered to the parent's intersect rows) and an outer null-check on the parent-side intersect column, so unrelated records survive but related records get filtered out. */
5609
6282
  readonly ExcludeExistingRecords: 1;
5610
6283
  };
5611
6284
  type RelationshipFilterMode = (typeof RelationshipFilterMode)[keyof typeof RelationshipFilterMode];
@@ -5613,32 +6286,43 @@ type RelationshipFilterMode = (typeof RelationshipFilterMode)[keyof typeof Relat
5613
6286
  * Specifies whether a column value is required.
5614
6287
  */
5615
6288
  declare const RequiredLevel: {
6289
+ /** No requirements are specified. */
5616
6290
  readonly None: 0;
6291
+ /** The column is required by the system and cannot be null. */
5617
6292
  readonly SystemRequired: 1;
6293
+ /** The column is required by the application and should have a value. */
5618
6294
  readonly ApplicationRequired: 2;
6295
+ /** It is recommended that the column has a value, but it is not enforced. */
5619
6296
  readonly Recommended: 3;
5620
6297
  };
5621
6298
  type RequiredLevel = (typeof RequiredLevel)[keyof typeof RequiredLevel];
5622
6299
  /**
5623
6300
  * Outcome of `POST /api/auth/reset-password`. Members carry explicit
5624
- * integer values so non-Blazor consumers comparing against the JSON wire form
5625
- * get a stable contract across reorderings.
6301
+ * integer values so the JSON wire form is a stable contract across
6302
+ * reorderings.
5626
6303
  */
5627
6304
  declare const ResetPasswordResult: {
6305
+ /** The password was reset and the user can now sign in with the new password. */
5628
6306
  readonly Success: 0;
6307
+ /** The token was missing, malformed, expired, or already used. The client should redirect the user to the "request a new reset link" flow. */
5629
6308
  readonly InvalidOrExpiredToken: 1;
6309
+ /** The new password did not satisfy the host's password rules. The accompanying ProblemDetails (in the failed-validation HTTP 400) carries the per-rule error messages from IdentityResult.Errors. */
5630
6310
  readonly InvalidPassword: 2;
5631
6311
  };
5632
6312
  type ResetPasswordResult = (typeof ResetPasswordResult)[keyof typeof ResetPasswordResult];
5633
6313
  /**
5634
6314
  * Outcome of `POST /api/auth/switch-identity`. Members carry explicit
5635
- * integer values so non-Blazor consumers comparing against the JSON wire form
5636
- * get a stable contract across reorderings.
6315
+ * integer values so the JSON wire form is a stable contract across
6316
+ * reorderings.
5637
6317
  */
5638
6318
  declare const SwitchIdentityResult: {
6319
+ /** The alt identity was signed in and the auth cookie has been swapped. */
5639
6320
  readonly Switched: 0;
6321
+ /** The current principal has no alt-identity claim — there is nothing to switch to. */
5640
6322
  readonly NoAltIdentity: 1;
6323
+ /** The alt identity referenced by the claim no longer exists in Dataverse (or is disabled). */
5641
6324
  readonly AltIdentityNotFound: 2;
6325
+ /** The current request is unauthenticated. */
5642
6326
  readonly NotAuthenticated: 3;
5643
6327
  };
5644
6328
  type SwitchIdentityResult = (typeof SwitchIdentityResult)[keyof typeof SwitchIdentityResult];
@@ -5646,13 +6330,21 @@ type SwitchIdentityResult = (typeof SwitchIdentityResult)[keyof typeof SwitchIde
5646
6330
  * Bit flags describing the security operations the current user can perform on a record.
5647
6331
  */
5648
6332
  declare const TableSecurityPermission: {
6333
+ /** No permissions. */
5649
6334
  readonly None: 0;
6335
+ /** The record can be read. */
5650
6336
  readonly Read: 1;
6337
+ /** The record (or table) can have new records created. */
5651
6338
  readonly Create: 2;
6339
+ /** The record can be modified. */
5652
6340
  readonly Write: 4;
6341
+ /** The record can be deleted. */
5653
6342
  readonly Delete: 8;
6343
+ /** The record can be appended to other records (used as the child of a relationship). */
5654
6344
  readonly Append: 16;
6345
+ /** Other records can be appended to this record (used as the parent of a relationship). */
5655
6346
  readonly AppendTo: 32;
6347
+ /** All permissions except Create. */
5656
6348
  readonly All: 63;
5657
6349
  };
5658
6350
  type TableSecurityPermission = (typeof TableSecurityPermission)[keyof typeof TableSecurityPermission];
@@ -5691,8 +6383,9 @@ type BaseDataPoint = Schemas['DataPointBase'];
5691
6383
  type DataverseDataPoint = Schemas['DataPointDataverseDataPoint'];
5692
6384
  type ChartLinkedEntity = Schemas['ChartLinkedEntity'];
5693
6385
  type FileInfo = Schemas['FileInfo'];
5694
- type EnvironmentFileSettings = Schemas['EnvironmentFileSettings'];
5695
6386
  type CreateFileArchiveRequest = Schemas['CreateFileArchiveRequest'];
6387
+ type OrganizationSettings = Schemas['OrganizationSettings'];
6388
+ type Currency = Schemas['Currency'];
5696
6389
  /**
5697
6390
  * Client-side result of {@link PowerPortalsProClient.createFileArchiveAsync}.
5698
6391
  * Carries the archive bytes plus the metadata derived from the server's
@@ -5710,17 +6403,37 @@ interface FileArchiveResult {
5710
6403
  }
5711
6404
  type LocalizationBundleManifest = Schemas['LocalizationBundleManifest'];
5712
6405
  type LocalizationManifestForLocale = Schemas['LocalizationManifestForLocale'];
6406
+ type TranslationAvailability = Schemas['TranslationAvailability'];
6407
+ type TranslationLanguageOption = Schemas['TranslationLanguageOption'];
6408
+ type TranslationRequest = Schemas['TranslationRequest'];
6409
+ type TranslationResult = Schemas['TranslationResult'];
6410
+ type TranslatedFile = Schemas['TranslatedFile'];
6411
+ type LocalizationOverview = Schemas['LocalizationOverview'];
6412
+ type LocalizationPipelineConfiguration = Schemas['LocalizationPipelineConfiguration'];
6413
+ type LocalizationSourceLoad = Schemas['LocalizationSourceLoad'];
6414
+ type LocalizationSourceKind = Schemas['LocalizationSourceKind'];
6415
+ type LocalizationSourceStatus = Schemas['LocalizationSourceStatus'];
5713
6416
  /**
5714
- * SPA-facing wrapper over the framework's record / metadata / file endpoints under
5715
- * `/api/*` the React equivalent of `IPowerPortalsProService` from
5716
- * `PowerPortalsPro.Web.Common`. Method names mirror the C# interface verbatim
5717
- * (camel-cased) so a Blazor dev reading both languages finds the same vocabulary.
5718
- *
5719
- * Flat surface, no sub-namespacing — `IPowerPortalsProService` exposes everything
5720
- * (CRUD, metadata, files, …) at the root in C#; this class follows the same shape.
6417
+ * A localization file pulled from the per-source or merged download endpoint:
6418
+ * the UTF-8 JSON bytes plus the server-suggested filename (parsed from the
6419
+ * `Content-Disposition` header). Mirrors the C# `LocalizationDownload` shape so
6420
+ * both stacks share one mental model. The download methods return `null` (not
6421
+ * this) when the server has nothing for the requested source/culture (404).
6422
+ */
6423
+ interface LocalizationFileDownload {
6424
+ /** Server-suggested download filename (already includes the culture + `.json`). */
6425
+ readonly fileName: string;
6426
+ /** UTF-8-encoded JSON body. */
6427
+ readonly data: Uint8Array;
6428
+ }
6429
+ type CacheClearResult = Schemas['CacheClearResult'];
6430
+ /**
6431
+ * SPA-facing wrapper over the framework's record / metadata / file endpoints
6432
+ * under `/api/*`. Flat surface, no sub-namespacing — CRUD, metadata, files,
6433
+ * and aggregate-chart calls all live at the root.
5721
6434
  *
5722
- * Authentication is a separate concern handled by {@link AuthClient}, mirroring the
5723
- * `IAuthService` / `IPowerPortalsProService` split on the Blazor side.
6435
+ * Authentication is a separate concern handled by {@link AuthClient}, which
6436
+ * sits beside this class with its own surface.
5724
6437
  *
5725
6438
  * @example
5726
6439
  * ```ts
@@ -5739,10 +6452,9 @@ declare class PowerPortalsProClient {
5739
6452
  readonly transport: Transport;
5740
6453
  constructor(transportOrOptions?: Transport | TransportOptions);
5741
6454
  /**
5742
- * Creates a new record. URL is derived from `record.tableName`. Server marks all
5743
- * properties as modified before applying so column values arriving from JSON
5744
- * (which carry no dirty flags) round-trip the same way they do from Blazor's
5745
- * dirty-tracked records.
6455
+ * Creates a new record. URL is derived from `record.tableName`. The server
6456
+ * marks every property as modified before applying so column values
6457
+ * arriving from JSON (which carry no dirty flags) round-trip correctly.
5746
6458
  */
5747
6459
  createRecordAsync(record: TableRecord$1, signal?: AbortSignal): Promise<CreateResponse>;
5748
6460
  /**
@@ -5750,6 +6462,71 @@ declare class PowerPortalsProClient {
5750
6462
  * omit it for the table's full set of columns visible to the caller.
5751
6463
  */
5752
6464
  retrieveRecordAsync(tableLogicalName: string, recordId: string, columns?: readonly string[], signal?: AbortSignal): Promise<TableRecord$1>;
6465
+ /**
6466
+ * Probes whether the localization-translation feature is usable: whether a translation
6467
+ * provider is configured, whether the managed solution is installed, and the candidate
6468
+ * target languages (the portal's cultures annotated with provider-translatability).
6469
+ * SystemAdmin-gated.
6470
+ */
6471
+ getTranslationAvailabilityAsync(signal?: AbortSignal): Promise<TranslationAvailability>;
6472
+ /**
6473
+ * Translates an uploaded localization file into one or more target languages, reusing the
6474
+ * Dataverse translation memory. Returns one file per language (base64 `content`) plus a zip
6475
+ * of all and translated-vs-reused counts. SystemAdmin-gated.
6476
+ */
6477
+ translateLocalizationFileAsync(request: TranslationRequest, signal?: AbortSignal): Promise<TranslationResult>;
6478
+ /**
6479
+ * Reads the admin localization overview: the configured warmup pipeline plus the
6480
+ * per-source load records (load order, source kind, cultures touched, key counts,
6481
+ * how many keys overrode an earlier source, duration, status) from the most recent
6482
+ * warmup. Backs the `<LocalizationAdmin />` panel. SystemAdmin-gated.
6483
+ */
6484
+ getLocalizationOverviewAsync(signal?: AbortSignal): Promise<LocalizationOverview>;
6485
+ /**
6486
+ * Downloads the JSON one source contributed to one culture during the most recent
6487
+ * warmup — a translation-handoff snapshot. Returns `null` when the source/culture
6488
+ * pair isn't tracked (the server answers 404 — cache cleared, source removed, or
6489
+ * the culture has no entries for that source). SystemAdmin-gated.
6490
+ */
6491
+ downloadLocalizationSourceAsync(sourceId: string, culture: string, signal?: AbortSignal): Promise<LocalizationFileDownload | null>;
6492
+ /**
6493
+ * Downloads the merged JSON of every key the cache will serve for a culture (the
6494
+ * post-merge winning value across all sources) — a complete-snapshot reference.
6495
+ * Returns `null` when the culture has no entries (404). SystemAdmin-gated.
6496
+ */
6497
+ downloadMergedLocalizationsAsync(culture: string, signal?: AbortSignal): Promise<LocalizationFileDownload | null>;
6498
+ /**
6499
+ * Shared binary-download path for the two localization download endpoints. Reads
6500
+ * the raw bytes via `response.arrayBuffer()` and derives the filename from the
6501
+ * `Content-Disposition` header (matching {@link createFileArchiveAsync}). Maps a
6502
+ * 404 to `null` so callers can show a "nothing to download" message instead of
6503
+ * surfacing it as an error.
6504
+ */
6505
+ private downloadLocalizationFile;
6506
+ /**
6507
+ * Lists every registered server-side cache by name — the values that
6508
+ * {@link clearCacheAsync} accepts. Backs the per-cache buttons on an admin
6509
+ * "clear caches" page; render them sorted client-side for a stable order.
6510
+ * SystemAdmin-gated.
6511
+ */
6512
+ getCacheNamesAsync(signal?: AbortSignal): Promise<readonly string[]>;
6513
+ /**
6514
+ * Clears every registered server-side cache and returns one
6515
+ * {@link CacheClearResult} per cache (name, success flag, error, elapsed ms).
6516
+ * Per-cache failures are reported in the result rows rather than thrown, so a
6517
+ * single misbehaving cache doesn't abort the rest — inspect `succeeded` on each
6518
+ * row. SystemAdmin-gated.
6519
+ */
6520
+ clearAllCachesAsync(signal?: AbortSignal): Promise<readonly CacheClearResult[]>;
6521
+ /**
6522
+ * Clears a single named cache (case-insensitive match against
6523
+ * {@link getCacheNamesAsync}). Returns the {@link CacheClearResult}, or `null`
6524
+ * when no cache by that name is registered (the server answers 404). A clear
6525
+ * that runs but throws internally comes back as a result row with
6526
+ * `succeeded: false` — that's distinct from the not-found `null`.
6527
+ * SystemAdmin-gated.
6528
+ */
6529
+ clearCacheAsync(name: string, signal?: AbortSignal): Promise<CacheClearResult | null>;
5753
6530
  /**
5754
6531
  * Runs a FetchXML query and returns the matching records plus paging info.
5755
6532
  * The query is the FetchXML XML literal — the same format Dataverse natively accepts.
@@ -5767,23 +6544,24 @@ declare class PowerPortalsProClient {
5767
6544
  * client can render headers + dispatch cells without a separate
5768
6545
  * metadata round-trip.
5769
6546
  *
5770
- * Exactly one of <c>request.viewId</c> or <c>request.fetchXml</c> must
5771
- * be supplied; sending both or neither returns a 400.
6547
+ * At least one of <c>request.viewId</c> or <c>request.fetchXml</c> must
6548
+ * be supplied (neither returns a 400). Both may be supplied together — the
6549
+ * <c>fetchXml</c> is the query and the <c>viewId</c> names the view for
6550
+ * localized column-title resolution.
5772
6551
  *
5773
- * Mirrors how the Blazor `IGridService` is consumed
6552
+ * Mirrors how the is consumed
5774
6553
  * `@powerportalspro/react`'s `useGridData` hook calls this method
5775
6554
  * internally, so most consumers don't invoke it directly.
5776
6555
  */
5777
6556
  loadGridAsync(request: GridDataRequest, signal?: AbortSignal): Promise<GridDataResponse>;
5778
6557
  /**
5779
- * Updates an existing record. URL is derived from `record.tableName` and `record.id`
6558
+ * Updates an existing record. URL is derived from `record.tableName` and `record.id`
5780
6559
  * `record.id` must be set. For a new record, use {@link createRecordAsync} instead.
5781
6560
  */
5782
6561
  updateRecordAsync(record: TableRecord$1, signal?: AbortSignal): Promise<UpdateResponse>;
5783
6562
  /**
5784
- * Executes a batch of {@link OrganizationRequest}s as a single round-trip,
5785
- * matching Blazor's `IPowerPortalsProService.ExecuteMultipleAsync`. The
5786
- * MainContext save flow uses this to ship every dirty descendant's
6563
+ * Executes a batch of {@link OrganizationRequest}s as a single round-trip.
6564
+ * The MainContext save flow uses this to ship every dirty descendant's
5787
6565
  * requests in one shot so a multi-record save lands transactionally
5788
6566
  * server-side.
5789
6567
  *
@@ -5806,7 +6584,7 @@ declare class PowerPortalsProClient {
5806
6584
  * query, performs the multi-series pivot, and applies combined
5807
6585
  * date-label formatting using the request culture.
5808
6586
  *
5809
- * Mirrors how the Blazor `IChartService` is consumed
6587
+ * Mirrors how the is consumed
5810
6588
  * `@powerportalspro/react-charts`'s `DataverseChartDataSource` family
5811
6589
  * calls this method internally, so most consumers don't invoke it
5812
6590
  * directly.
@@ -5818,12 +6596,13 @@ declare class PowerPortalsProClient {
5818
6596
  * Returns the current user's combined table-level `TableSecurityPermission`
5819
6597
  * bitmask for `tableLogicalName` — the bitwise union of Read / Create /
5820
6598
  * Write / Delete / Append / AppendTo flags any registered
5821
- * `ITablePermissionHandler` allows for that user on that table. Mirrors
5822
- * the cached `ITablePermissionCache.GetPermissionForUserAsync` lookup
5823
- * Blazor's grid buttons already use directly via DI. Wrapped client-side
5824
- * by the `useTablePermissions(tableName)` React hook with in-flight-promise
5825
- * dedup; reach for the raw client only when you're outside React (e.g.
5826
- * a sample stand-alone script) or need an imperative one-off check.
6599
+ * `ITablePermissionHandler` allows for that user on that table. Routed
6600
+ * server-side through the cached `ITablePermissionCache` lookup.
6601
+ *
6602
+ * Wrapped by the `useTablePermissions(tableName)` React hook with
6603
+ * in-flight-promise dedup; reach for the raw client only when you're
6604
+ * outside React (e.g. a stand-alone script) or need an imperative
6605
+ * one-off check.
5827
6606
  *
5828
6607
  * Returns `0` (`TableSecurityPermission.None`) when the user has no
5829
6608
  * permissions on the table; consumers compare via bit math (e.g.
@@ -5907,14 +6686,14 @@ declare class PowerPortalsProClient {
5907
6686
  * override files (last-wins). Use this to seed the React-side localizer
5908
6687
  * with one round-trip.
5909
6688
  *
5910
- * Returned shape is a nested object that mirrors the source JSON files
6689
+ * Returned shape is a nested object that mirrors the source JSON files
5911
6690
  * `{ app: { buttons: { save: { label: "Save" } } }, tables: { contact: ... } }`.
5912
6691
  * The client typically flattens this to dotted-key form for `t()` lookup
5913
6692
  * (see {@link flattenStrings} in `@powerportalspro/react`).
5914
6693
  *
5915
6694
  * @param culture culture code matching what server-side ASP.NET request
5916
- * localization recognizes — e.g. `"en"`, `"es"`, `"fr-CA"`. Falls back
5917
- * to the default culture server-side when the value isn't supported.
6695
+ * localization recognizes — e.g. `"en"`, `"es"`, `"fr-CA"`. Falls back
6696
+ * to the default culture server-side when the value isn't supported.
5918
6697
  */
5919
6698
  retrieveLocalizedStringsAsync(culture: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
5920
6699
  /**
@@ -5939,12 +6718,12 @@ declare class PowerPortalsProClient {
5939
6718
  * Two response shapes, selected by `request.responseFormat`:
5940
6719
  *
5941
6720
  * - **BinaryStream** (default): the server returns the raw archive bytes; this
5942
- * method reads them via `response.arrayBuffer()` and wraps the result in a
5943
- * {@link FileArchiveResult}, deriving `fileName` from the `Content-Disposition`
5944
- * header and `contentType` from `Content-Type`. Most consumers want this path.
6721
+ * method reads them via `response.arrayBuffer()` and wraps the result in a
6722
+ * {@link FileArchiveResult}, deriving `fileName` from the `Content-Disposition`
6723
+ * header and `contentType` from `Content-Type`. Most consumers want this path.
5945
6724
  * - **Json**: the server returns a {@link FileArchiveJsonResponse} envelope with
5946
- * the archive bytes base64-encoded. Useful for test harnesses, service workers,
5947
- * or callers that need to inspect filename/size before triggering a download.
6725
+ * the archive bytes base64-encoded. Useful for test harnesses, service workers,
6726
+ * or callers that need to inspect filename/size before triggering a download.
5948
6727
  *
5949
6728
  * Either way, the returned `data` is empty (`Uint8Array(0)`) when none of the
5950
6729
  * supplied records produced a usable file — the caller can surface a "nothing to
@@ -5956,7 +6735,21 @@ declare class PowerPortalsProClient {
5956
6735
  * upload size in KB). UI consumers use this to validate uploads client-side before
5957
6736
  * the round-trip, mirroring what the server enforces.
5958
6737
  */
5959
- getEnvironmentFileSettingsAsync(signal?: AbortSignal): Promise<EnvironmentFileSettings>;
6738
+ /**
6739
+ * Reads the org-wide settings sourced from the Dataverse `organization`
6740
+ * record: default currency plus file-upload constraints
6741
+ * (`blockedFileExtensions`, `maxUploadFileSizeInBytes`). Replaces the legacy
6742
+ * `getEnvironmentFileSettingsAsync` — file fields now live on this combined
6743
+ * response.
6744
+ * <para>
6745
+ * Primary consumers:
6746
+ * </para>
6747
+ * - Create-mode `<MoneyEdit>` reads `defaultCurrency` to render the right
6748
+ * symbol on brand-new records before save.
6749
+ * - File editors / FileGrid read the two file fields to reject invalid
6750
+ * uploads client-side before the round-trip.
6751
+ */
6752
+ getOrganizationSettingsAsync(signal?: AbortSignal): Promise<OrganizationSettings>;
5960
6753
  }
5961
6754
 
5962
6755
  type TableRecord = components['schemas']['TableRecord'];
@@ -5971,7 +6764,7 @@ type TableRecord = components['schemas']['TableRecord'];
5971
6764
  * Returns `undefined` when neither field carries a usable value (record
5972
6765
  * still loading, or a never-seeded create-mode record).
5973
6766
  *
5974
- * Mirrors Blazor's `TableRecord -> TableRecordReference` implicit conversion
6767
+ * Mirrors implicit conversion
5975
6768
  * (`Id == Guid.Empty ? _idForCreate : Id`). The server resolves either
5976
6769
  * shape via `ResolveAssociateRecordAsync` — both flows interoperate.
5977
6770
  */
@@ -5979,4 +6772,4 @@ declare function getRecordReferenceId(record: Pick<TableRecord, 'id' | '_idForCr
5979
6772
 
5980
6773
  declare const VERSION = "0.1.0";
5981
6774
 
5982
- export { type AggregateChartConfig, AggregateType, ArchiveFormat, ArgumentError, ArgumentNullError, type AssociateRequest, AuthClient, type AuthenticatorSetupResponse, type BaseDataPoint, type ChangeEmailRequest, type ChangeEmailResponse, ChangeEmailResult, type ChangePasswordRequest, type ChangePasswordResponse, ChangePasswordResult, type ChartAggregation, type ChartData, type ChartDataRequest, type ChartDataResponse, type ChartDataset, ChartDateGrouping, type ChartGrouping, type ChartLinkedEntity, type ColumnSort, ColumnType, type ConfirmEmailRequest, type ConfirmEmailResponse, type ConfirmExternalLoginRequest, type ConfirmExternalLoginResponse, ConfirmExternalLoginResult, type CreateRequest, type CreateResponse, type CurrentLoginInfo, type CurrentUserInfo, type DataPoint, type DataverseDataPoint, DateTimeBehavior, type DeletePersonalDataRequest, type DeletePersonalDataResponse, DeletePersonalDataResult, type DeleteRequest, type DeleteResponse, type Disable2faResponse, type DisassociateRequest, type EnvironmentFileSettings, ExternalLoginCandidateKind, type ExternalLoginProviderInfo, type ExternalLoginsResponse, FileArchiveResponseFormat, type FileInfo, type Forget2faResponse, type GridDataRequest, type GridDataResponse, type GridFilterBase, InvalidOperationError, JoinOperator, type LoginRequest, type LoginResponse, LoginResult, type OrganizationRequest, type OrganizationResponse, type PendingExternalLoginResponse, type PersonalDataResponse, PowerPortalsProClient, PowerPortalsProError, type PowerPortalsProErrorInit, type ProblemDetails, type ProfileResponse, type RecoveryCodesResponse, type RegisterRequest, type RegisterResponse, RegisterResult, type RelationshipFilter, RelationshipFilterMode, type RemoveExternalLoginRequest, type RemoveExternalLoginResponse, type RequestOptions, type RequestPasswordResetRequest, RequiredLevel, type ResendEmailConfirmationRequest, type ResetAuthenticatorResponse, type ResetPasswordRequest, type ResetPasswordResponse, ResetPasswordResult, type ResolvedColumn, type RetrieveRecordsResponse, Routes, type SelectExternalLoginRequest, type SendEmailConfirmationResponse, type SetPasswordRequest, type SetPasswordResponse, type SwitchIdentityResponse, SwitchIdentityResult, type TableMetadata, type TableRecord$1 as TableRecord, type TableRecordReference, TableSecurityPermission, Transport, type TransportOptions, type TwoFactorStatusResponse, UnauthorizedAccessError, type UpdateProfileRequest, type UpdateRequest, type UpdateResponse, VERSION, type VerifyAuthenticatorRequest, type VerifyAuthenticatorResponse, type VerifyTwoFactorRequest, type VerifyTwoFactorResponse, type ViewMetadata, type components, getRecordReferenceId, mapProblemDetails, type paths };
6775
+ export { type AggregateChartConfig, AggregateType, ArchiveFormat, ArgumentError, ArgumentNullError, type AssociateRequest, AuthClient, type AuthOptionsResponse, type AuthenticatorSetupResponse, type BaseDataPoint, type CacheClearResult, type ChangeEmailRequest, type ChangeEmailResponse, ChangeEmailResult, type ChangePasswordRequest, type ChangePasswordResponse, ChangePasswordResult, type ChartAggregation, type ChartData, type ChartDataRequest, type ChartDataResponse, type ChartDataset, ChartDateGrouping, type ChartGrouping, type ChartLinkedEntity, type ColumnSort, ColumnType, type ConfirmEmailRequest, type ConfirmEmailResponse, type ConfirmExternalLoginRequest, type ConfirmExternalLoginResponse, ConfirmExternalLoginResult, type CreateRequest, type CreateResponse, type Currency, type CurrentLoginInfo, type CurrentUserInfo, type DataPoint, type DataverseDataPoint, DateTimeBehavior, type DeletePersonalDataRequest, type DeletePersonalDataResponse, DeletePersonalDataResult, type DeleteRequest, type DeleteResponse, type Disable2faResponse, type DisassociateRequest, ExternalLoginCandidateKind, type ExternalLoginProviderInfo, type ExternalLoginsResponse, FileArchiveResponseFormat, type FileInfo, type Forget2faResponse, type GridDataRequest, type GridDataResponse, type GridFilterBase, InvalidOperationError, JoinOperator, type LocalizationFileDownload, type LocalizationOverview, type LocalizationPipelineConfiguration, type LocalizationSourceKind, type LocalizationSourceLoad, type LocalizationSourceStatus, type LoginRequest, type LoginResponse, LoginResult, type OrganizationRequest, type OrganizationResponse, type OrganizationSettings, type PendingExternalLoginResponse, type PersonalDataResponse, PowerPortalsProClient, PowerPortalsProError, type PowerPortalsProErrorInit, type ProblemDetails, type ProfileResponse, type RecoveryCodesResponse, type RegisterRequest, type RegisterResponse, RegisterResult, type RelationshipFilter, RelationshipFilterMode, type RemoveExternalLoginRequest, type RemoveExternalLoginResponse, type RequestOptions, type RequestPasswordResetRequest, RequiredLevel, type ResendEmailConfirmationRequest, type ResetAuthenticatorResponse, type ResetPasswordRequest, type ResetPasswordResponse, ResetPasswordResult, type ResolvedColumn, type RetrieveRecordsResponse, Routes, type SelectExternalLoginRequest, type SendEmailConfirmationResponse, type SetPasswordRequest, type SetPasswordResponse, type SwitchIdentityResponse, SwitchIdentityResult, type TableMetadata, type TableRecord$1 as TableRecord, type TableRecordReference, TableSecurityPermission, type TranslatedFile, type TranslationAvailability, type TranslationLanguageOption, type TranslationRequest, type TranslationResult, Transport, type TransportOptions, type TwoFactorStatusResponse, UnauthorizedAccessError, type UpdateProfileRequest, type UpdateRequest, type UpdateResponse, VERSION, type VerifyAuthenticatorRequest, type VerifyAuthenticatorResponse, type VerifyTwoFactorRequest, type VerifyTwoFactorResponse, type ViewMetadata, type components, getRecordReferenceId, mapProblemDetails, type paths };