@powerportalspro/core 5.0.0-beta.3 → 5.0.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.cts 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
  /**
@@ -3473,7 +3696,7 @@ interface components {
3473
3696
  };
3474
3697
  /**
3475
3698
  * @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,
3699
+ * across the framework: grid UIs use it for sort state,
3477
3700
  * `IFetchXmlQueryComposer` uses it for FetchXML composition, and
3478
3701
  * the `POST /api/grids/data` endpoint receives it as part of the
3479
3702
  * GridDataRequest body. string ColumnSort.ColumnName may
@@ -3713,8 +3936,8 @@ interface components {
3713
3936
  };
3714
3937
  /**
3715
3938
  * @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.
3939
+ * explicit integer values so the JSON wire form is a stable contract
3940
+ * across reorderings.
3718
3941
  * @enum {integer}
3719
3942
  */
3720
3943
  ConfirmExternalLoginResult: 0 | 1 | 2 | 3;
@@ -3760,6 +3983,52 @@ interface components {
3760
3983
  [key: string]: components["schemas"]["ColumnValueBase"];
3761
3984
  };
3762
3985
  };
3986
+ /**
3987
+ * @description A Dataverse `transactioncurrency` record, denormalized for client consumption.
3988
+ * Populated server-side onto Currency? TableRecord.Currency whenever a record carries
3989
+ * at least one money column, so currency-aware editors (`MoneyEdit` et al.) can
3990
+ * render the correct symbol without a separate round-trip.
3991
+ */
3992
+ Currency: {
3993
+ /**
3994
+ * Format: uuid
3995
+ * @description The `transactioncurrencyid` primary key. Matches the object? ColumnValueBase.Value
3996
+ * stored against the record's `transactioncurrencyid` column when present.
3997
+ */
3998
+ id: string;
3999
+ /**
4000
+ * @description The ISO 4217 three-letter code (e.g. `USD`, `EUR`, `JPY`). Read from
4001
+ * `isocurrencycode`. Useful for ARIA labels and culture-aware formatting fallbacks.
4002
+ */
4003
+ isoCode: string;
4004
+ /**
4005
+ * @description The display symbol Dataverse stores in `currencysymbol` — up to 5 characters,
4006
+ * typically a single Unicode glyph (`$`, `€`, `£`, `¥`) but
4007
+ * occasionally a short string for currencies that lack a single-glyph form
4008
+ * (`Fr`, `kr`, `R$`) or org-specific custom values. Rendered verbatim
4009
+ * in the editor — Unicode + font fallback covers every glyph; no SVG sidecar.
4010
+ */
4011
+ symbol: string;
4012
+ /**
4013
+ * @description The localized currency name from `currencyname` (e.g. `US Dollar`). Used
4014
+ * in pickers, tooltips, and accessibility text.
4015
+ */
4016
+ name: string;
4017
+ /**
4018
+ * Format: int32
4019
+ * @description Decimal places to display, sourced from `currencyprecision`. Falls back to 2
4020
+ * when Dataverse leaves the field null. Independent of int MoneyMetadata.Precision,
4021
+ * which is the column-level precision; this is the currency-level default.
4022
+ */
4023
+ precision?: number | string;
4024
+ /**
4025
+ * Format: double
4026
+ * @description Exchange rate against the org's base currency, from `exchangerate`. `1.0`
4027
+ * for the base currency itself. Surfaced primarily for diagnostic / advanced display
4028
+ * scenarios — editors don't perform conversion locally.
4029
+ */
4030
+ exchangeRate?: number | string;
4031
+ };
3763
4032
  /**
3764
4033
  * @description Snapshot of the signed-in user's available sign-in paths, returned by
3765
4034
  * `GET /api/auth/manage/login-info`. Combines the linked external logins
@@ -3903,7 +4172,7 @@ interface components {
3903
4172
  /**
3904
4173
  * @description The user's current password — required when the account has a local
3905
4174
  * password set, ignored otherwise (external-login-only accounts). Surfacing
3906
- * the requirement up-front via <see cref="!:DeletePersonalDataResponse.RequirePassword" />
4175
+ * the requirement up-front via DeletePersonalDataResult.RequireLocalPassword
3907
4176
  * keeps the form UX correct without a separate "is password set" probe.
3908
4177
  */
3909
4178
  password?: null | string;
@@ -3920,8 +4189,8 @@ interface components {
3920
4189
  };
3921
4190
  /**
3922
4191
  * @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.
4192
+ * explicit integer values so the JSON wire form is a stable contract
4193
+ * across reorderings.
3925
4194
  * @enum {integer}
3926
4195
  */
3927
4196
  DeletePersonalDataResult: 0 | 1 | 2;
@@ -3944,28 +4213,6 @@ interface components {
3944
4213
  success?: boolean;
3945
4214
  };
3946
4215
  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
4216
  /**
3970
4217
  * @description One option presented to the user when a single external sign-in matches
3971
4218
  * both a Dataverse `systemuser` and a `contact`. Used by
@@ -3987,8 +4234,8 @@ interface components {
3987
4234
  };
3988
4235
  /**
3989
4236
  * @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.
4237
+ * explicit integer values so the JSON wire form is a stable contract
4238
+ * across reorderings.
3992
4239
  * @enum {integer}
3993
4240
  */
3994
4241
  ExternalLoginCandidateKind: 0 | 1;
@@ -4015,9 +4262,9 @@ interface components {
4015
4262
  providerDisplayName?: string;
4016
4263
  };
4017
4264
  /**
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.
4265
+ * @description Describes one configured external (OAuth) login provider, surfaced via
4266
+ * `GET /api/auth/options` (IReadOnlyList&lt;ExternalLoginProviderInfo&gt; AuthOptionsResponse.ExternalProviders) so SPAs
4267
+ * can render provider buttons without hardcoding the list.
4021
4268
  */
4022
4269
  ExternalLoginProviderInfo: {
4023
4270
  /**
@@ -4038,8 +4285,9 @@ interface components {
4038
4285
  * @description Returned by `GET /api/auth/manage/external-logins`. Lists the external
4039
4286
  * logins currently linked to the signed-in user.
4040
4287
  *
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
4288
+ * To render an "add a new external login" picker, the client should read the providers
4289
+ * from `GET /api/auth/options` (IReadOnlyList&lt;ExternalLoginProviderInfo&gt; AuthOptionsResponse.ExternalProviders) and
4290
+ * subtract anything already in
4043
4291
  * IReadOnlyList&lt;ExternalLoginInfo&gt; ExternalLoginsResponse.CurrentLogins. To decide whether unlinking a given external
4044
4292
  * login would lock the user out (no local password AND only one external
4045
4293
  * login linked), call `GET /api/auth/manage/login-info` for the
@@ -4101,26 +4349,34 @@ interface components {
4101
4349
  };
4102
4350
  /**
4103
4351
  * @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
4352
+ * searchable, sortable query against a stored Dataverse view
4353
+ * (Guid? GridDataRequest.ViewId), a caller-supplied FetchXML
4354
+ * (string? GridDataRequest.FetchXml), or both — in which case the FetchXML is the
4355
+ * query and the Guid? GridDataRequest.ViewId supplies the view-definition identity
4356
+ * used to resolve view-specific localized column titles. At least one of
4357
+ * the two must be supplied. Server composes the final FetchXML via the
4107
4358
  * shared `IFetchXmlQueryComposer` so the search / sort / paging
4108
- * semantics match the Blazor grid exactly.
4359
+ * semantics are consistent across every client of the endpoint.
4109
4360
  */
4110
4361
  GridDataRequest: {
4111
4362
  /**
4112
4363
  * 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.
4364
+ * @description Stored Dataverse view to use as the base query. When supplied alone,
4365
+ * the server loads the view's FetchXML and column list from
4366
+ * `IViewMetadataCache`. When supplied alongside string? GridDataRequest.FetchXml,
4367
+ * the FetchXML drives the query and this id is used only as the
4368
+ * view-definition identity for view-specific localized column-title
4369
+ * resolution (`tables.{table}.views.{id}.columns.*`) — no savedquery
4370
+ * is loaded. At least one of Guid? GridDataRequest.ViewId / string? GridDataRequest.FetchXml
4371
+ * must be supplied.
4117
4372
  */
4118
4373
  viewId?: null | string;
4119
4374
  /**
4120
4375
  * @description Caller-supplied FetchXML used as the base query. Useful for
4121
4376
  * custom (in-memory) views, dynamic queries assembled by consumer
4122
- * code, or lookup-style minimal-fetch shapes. Mutually exclusive
4123
- * with Guid? GridDataRequest.ViewId.
4377
+ * code, or lookup-style minimal-fetch shapes. May be combined with
4378
+ * Guid? GridDataRequest.ViewId (see its docs) to give an in-memory view a
4379
+ * stable identity for localization.
4124
4380
  */
4125
4381
  fetchXml?: null | string;
4126
4382
  /**
@@ -4167,7 +4423,7 @@ interface components {
4167
4423
  * `&lt;link-entity&gt;`). Filters, sorts, and link-entity
4168
4424
  * definitions on the base query are preserved.
4169
4425
  * Use case: consumer-declared &lt;GridColumn&gt; children on
4170
- * the React / Blazor grid express the displayed column set
4426
+ * the grid component express the displayed column set
4171
4427
  * authoritatively — this field forwards that intent down to the
4172
4428
  * server so the resolved column list + fetched data line up with
4173
4429
  * what the consumer asked to see, regardless of what the underlying
@@ -4233,9 +4489,9 @@ interface components {
4233
4489
  * table scope (Create especially is table-scoped — it doesn't make sense
4234
4490
  * per-row), so toolbar buttons can gate "New" / "Delete" off this one
4235
4491
  * 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.
4492
+ * proxy. Computed via the cached
4493
+ * `ITablePermissionCache.GetPermissionForUserAsync` so every
4494
+ * caller reads the same answer.
4239
4495
  */
4240
4496
  tablePermissions: components["schemas"]["TableSecurityPermission"];
4241
4497
  /** @description Paging metadata describing the current page and how to request the next one. */
@@ -4265,9 +4521,9 @@ interface components {
4265
4521
  * to predict it (or fetch the parent metadata just to pick a filter shape).
4266
4522
  * The wire payload is identical for both directionalities.
4267
4523
  *
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
4524
+ * Powers the `SubGrid` component ("rows related to this parent")
4525
+ * and `ManyToManyLookupEdit`'s initial-selection load. For the
4526
+ * lookup edit's autocomplete pool ("records not currently related to
4271
4527
  * this parent"), set RelationshipFilterMode RelationshipFilter.Mode to
4272
4528
  * RelationshipFilterMode.ExcludeExistingRecords — that path
4273
4529
  * is many-to-many only and the server rejects it for one-to-many
@@ -4305,9 +4561,9 @@ interface components {
4305
4561
  JoinOperator: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
4306
4562
  /**
4307
4563
  * @description Top-level manifest for the localization-bundle endpoints. Returned by
4308
- * <see cref="!:Routes.Localizations.Manifest" />; clients fetch this on
4564
+ * string Localizations.Manifest; clients fetch this on
4309
4565
  * startup to discover supported locales, then issue a follow-up call to
4310
- * <see cref="!:Routes.Localizations.Thumbprints" /> for the resolved locale's
4566
+ * string Localizations.Thumbprints for the resolved locale's
4311
4567
  * thumbprints.
4312
4568
  * Splitting "what locales exist" from "what thumbprints does locale X have"
4313
4569
  * keeps the version response tiny (a handful of locale codes) regardless
@@ -4324,10 +4580,18 @@ interface components {
4324
4580
  * culture first).
4325
4581
  */
4326
4582
  supportedLocales: string[];
4583
+ /**
4584
+ * @description The configured UrlCultureStrategy as a
4585
+ * string (`PathPrefix` / `PathPrefixAll` / `CookieOnly`). Lets a SPA
4586
+ * client match the server's URL convention: prefix-based strategies drive locale from
4587
+ * the URL and navigate on switch, while `CookieOnly` switches in place via the
4588
+ * culture cookie without touching the URL.
4589
+ */
4590
+ urlCultureStrategy: string;
4327
4591
  };
4328
4592
  /**
4329
4593
  * @description Per-locale thumbprint manifest. Returned by
4330
- * <see cref="!:Routes.Localizations.Thumbprints" /> for a single resolved
4594
+ * string Localizations.Thumbprints for a single resolved
4331
4595
  * locale; carries the content-derived thumbprint for every downloadable
4332
4596
  * bundle a client could need at that locale.
4333
4597
  * Per-resource thumbprints mean unchanged tables/views keep the same URL
@@ -4338,12 +4602,12 @@ interface components {
4338
4602
  /**
4339
4603
  * @description Thumbprint for the cross-cutting "default" bundle (everything outside
4340
4604
  * `tables.*` / `choices.*`). Compose into the URL produced by
4341
- * <see cref="!:Routes.Localizations.GetDefaultBundleRoute" />.
4605
+ * string Localizations.GetDefaultBundleRoute(string locale, string thumbprint).
4342
4606
  */
4343
4607
  bundle: string;
4344
4608
  /**
4345
4609
  * @description Thumbprint per table logical name. The matching URL —
4346
- * <see cref="!:Routes.Localizations.GetTableBundleRoute" /> — returns every
4610
+ * string Localizations.GetTableBundleRoute(string tableName, string locale, string thumbprint) — returns every
4347
4611
  * `tables.{name}.*` string PLUS the global `choices.{set}.*`
4348
4612
  * strings the table's columns reference.
4349
4613
  */
@@ -4352,7 +4616,7 @@ interface components {
4352
4616
  };
4353
4617
  /**
4354
4618
  * @description Thumbprint per view id (lowercased GUID, no braces). The matching URL —
4355
- * <see cref="!:Routes.Localizations.GetViewBundleRoute" /> — returns every
4619
+ * string Localizations.GetViewBundleRoute(string viewId, string locale, string thumbprint) — returns every
4356
4620
  * `tables.{owningTable}.views.{viewId}.*` string for that view. The
4357
4621
  * owning table is resolved server-side, so the client only needs the view id.
4358
4622
  */
@@ -4360,6 +4624,144 @@ interface components {
4360
4624
  [key: string]: string;
4361
4625
  };
4362
4626
  };
4627
+ /**
4628
+ * @description Admin-facing snapshot of the string-localization pipeline: the static configuration
4629
+ * that drives the warmup loaders plus the runtime per-source load records produced by
4630
+ * the most recent warmup. Surfaced via Task&lt;LocalizationOverview&gt; IPowerPortalsProService.GetLocalizationOverviewAsync().
4631
+ */
4632
+ LocalizationOverview: {
4633
+ /**
4634
+ * @description The static configuration: registered directories, files, table-localization mode,
4635
+ * and supported cultures. Reflects the options at the time the overview was captured.
4636
+ */
4637
+ configuration: components["schemas"]["LocalizationPipelineConfiguration"];
4638
+ /**
4639
+ * @description Per-source records from the most recent warmup, in the order they were loaded.
4640
+ * Empty when the cache hasn't been warmed yet (rare — startup runs the warmup
4641
+ * hook synchronously). Later entries override earlier ones on a per-key basis;
4642
+ * the int LocalizationSourceLoad.KeysOverriding column on each row shows
4643
+ * how many of its keys replaced a non-empty value already in the cache.
4644
+ */
4645
+ sourceLoads: components["schemas"]["LocalizationSourceLoad"][];
4646
+ /**
4647
+ * Format: date-time
4648
+ * @description When the most recent warmup completed (UTC). `null` if no warmup has run.
4649
+ */
4650
+ lastReloadedOn?: null | string;
4651
+ };
4652
+ /**
4653
+ * @description Static view of the configuration that drives the localization warmup, suitable for
4654
+ * rendering in an admin "what's wired up" panel alongside the runtime source list.
4655
+ */
4656
+ LocalizationPipelineConfiguration: {
4657
+ /**
4658
+ * @description When `true`, every table's metadata is loaded; IReadOnlyList&lt;string&gt; LocalizationPipelineConfiguration.TablesToLocalize
4659
+ * is ignored. Defaults to `true` on a fresh `LocalizationOptions`.
4660
+ */
4661
+ localizeAllAvailableTables: boolean;
4662
+ /**
4663
+ * @description The table logical names configured via `options.AddTableToLocalize(...)`.
4664
+ * Only honored when bool LocalizationPipelineConfiguration.LocalizeAllAvailableTables is `false`.
4665
+ */
4666
+ tablesToLocalize: string[];
4667
+ /**
4668
+ * @description The relative directory paths registered via `options.AddLocalizationDirectory(...)`.
4669
+ * JSON files in these directories load LAST in the warmup, so they override anything
4670
+ * supplied by Dataverse metadata or web resources.
4671
+ */
4672
+ localizationDirectories: string[];
4673
+ /** @description Individual file paths registered via `options.AddLocalizationFile(...)`. */
4674
+ localizationFiles: string[];
4675
+ /**
4676
+ * @description The web-resource name pattern the cache uses to discover Dataverse-hosted JSON
4677
+ * localization files. Hard-coded today; surfaced here so the admin UI doesn't have
4678
+ * to reinvent the literal.
4679
+ */
4680
+ webResourcePathPattern: string;
4681
+ /** @description The default culture configured on CultureInfo LocalizationOptions.DefaultCulture. */
4682
+ defaultCulture: string;
4683
+ };
4684
+ /**
4685
+ * @description Discriminates the three localization source kinds the cache pulls from at warmup.
4686
+ * Underlying integer values are pinned so JSON / numeric serialization is stable
4687
+ * across releases — append new members with the next unused number and never
4688
+ * renumber existing entries.
4689
+ * @enum {integer}
4690
+ */
4691
+ LocalizationSourceKind: 0 | 1 | 2;
4692
+ /**
4693
+ * @description One row in the runtime load-events grid: a single loader invocation against a single
4694
+ * source (one Dataverse table's metadata, one web resource, one disk file).
4695
+ */
4696
+ LocalizationSourceLoad: {
4697
+ /**
4698
+ * Format: int32
4699
+ * @description 1-based load order. Combined with DateTimeOffset LocalizationSourceLoad.LoadedAt, gives the precedence
4700
+ * chain: lower-order loads' values can be overridden by higher-order loads.
4701
+ */
4702
+ loadOrder: number | string;
4703
+ /**
4704
+ * @description Stable identifier for this source, suitable for keying download endpoints
4705
+ * (e.g. `"folder:Resources/app.fr.json"`, `"webresource:/PowerPortalsPro/Localization/tables.fr.json"`,
4706
+ * `"metadata:account"`). Stable across reloads of the same configuration.
4707
+ */
4708
+ sourceId: string;
4709
+ /** @description The kind of source this row represents — drives the icon / grouping in the UI. */
4710
+ kind: components["schemas"]["LocalizationSourceKind"];
4711
+ /**
4712
+ * @description Human-readable name for the source — the table logical name, the web resource
4713
+ * name, or the file path (absolute, as resolved by the loader).
4714
+ */
4715
+ displayName: string;
4716
+ /**
4717
+ * @description The cultures (two-letter ISO codes for metadata, filename-derived for JSON) this
4718
+ * source contributed strings to. A Dataverse table contributes to every culture
4719
+ * with an installed language pack; a JSON file contributes to exactly one.
4720
+ */
4721
+ cultures: string[];
4722
+ /**
4723
+ * Format: int32
4724
+ * @description Total number of distinct keys this source contributed across all cultures
4725
+ * (sum of per-culture key counts).
4726
+ */
4727
+ keysContributed: number | string;
4728
+ /**
4729
+ * Format: int32
4730
+ * @description Of int LocalizationSourceLoad.KeysContributed, how many replaced a non-empty value an earlier
4731
+ * source had already stored. Useful for spotting which JSON file is actually
4732
+ * overriding Dataverse-supplied translations.
4733
+ */
4734
+ keysOverriding: number | string;
4735
+ /**
4736
+ * Format: int64
4737
+ * @description Wall-clock duration of the load in milliseconds.
4738
+ */
4739
+ durationMs: number | string;
4740
+ /**
4741
+ * @description Terminal status — LocalizationSourceStatus.Loaded for success,
4742
+ * LocalizationSourceStatus.Failed when the loader threw (with
4743
+ * string? LocalizationSourceLoad.Error populated), or LocalizationSourceStatus.Skipped
4744
+ * when the source was discovered but ineligible (e.g. an empty file).
4745
+ */
4746
+ status: components["schemas"]["LocalizationSourceStatus"];
4747
+ /**
4748
+ * @description Exception message when LocalizationSourceStatus LocalizationSourceLoad.Status is LocalizationSourceStatus.Failed,
4749
+ * otherwise `null`.
4750
+ */
4751
+ error?: null | string;
4752
+ /**
4753
+ * Format: date-time
4754
+ * @description When this individual source finished loading (UTC).
4755
+ */
4756
+ loadedAt: string;
4757
+ };
4758
+ /**
4759
+ * @description Terminal status of a single source's load. Underlying integer values are pinned
4760
+ * so JSON / numeric serialization is stable across releases — append new members
4761
+ * with the next unused number and never renumber existing entries.
4762
+ * @enum {integer}
4763
+ */
4764
+ LocalizationSourceStatus: 0 | 1 | 2;
4363
4765
  /**
4364
4766
  * @description Credentials submitted to `POST /api/auth/login`. Same-origin SPAs only need to
4365
4767
  * post this body; the server sets the auth cookie on success and returns a
@@ -4392,9 +4794,9 @@ interface components {
4392
4794
  * so the client can branch UI behavior without inspecting HTTP status codes.
4393
4795
  *
4394
4796
  * 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.
4797
+ * the JSON numeric representation is a stable contract. Pinning the
4798
+ * values prevents accidental drift if a future refactor reorders or
4799
+ * inserts members.
4398
4800
  * @enum {integer}
4399
4801
  */
4400
4802
  LoginResult: 0 | 1 | 2 | 3 | 4;
@@ -4581,6 +4983,43 @@ interface components {
4581
4983
  [key: string]: components["schemas"]["ColumnValueBase"];
4582
4984
  };
4583
4985
  };
4986
+ /**
4987
+ * @description Stable, environment-wide settings sourced from the Dataverse `organization`
4988
+ * record. Cached server-side (they change very rarely — only when an admin updates
4989
+ * the org record) and re-served to clients via `/api/organizationSettings` so
4990
+ * the front end can prime defaults without firing its own Dataverse trip.
4991
+ * Two categories of fields live here today:
4992
+ * * Currency OrganizationSettings.DefaultCurrency — used by create-mode editors to render the
4993
+ * correct currency symbol on new records before they're saved.
4994
+ * * IReadOnlyList&lt;string&gt; OrganizationSettings.BlockedFileExtensions + long OrganizationSettings.MaxUploadFileSizeInBytes
4995
+ * — file-upload constraints clients mirror so users get a friendly client-side
4996
+ * rejection instead of a round-trip failure.
4997
+ * New properties are appended as additional organization-level defaults become
4998
+ * useful client-side (locale, base language, formatting policies, etc.).
4999
+ */
5000
+ OrganizationSettings: {
5001
+ /**
5002
+ * @description The org's base currency, resolved from the `organization.basecurrencyid`
5003
+ * lookup. `MoneyEdit` consumes this in create mode so a brand-new record
5004
+ * displays the right currency symbol before the user picks one or saves.
5005
+ */
5006
+ defaultCurrency: components["schemas"]["Currency"];
5007
+ /**
5008
+ * @description Lowercase file extensions (without the leading dot) that Dataverse refuses to
5009
+ * accept as uploads — for example `"svg"`, `"exe"`, `"bat"`. Sourced
5010
+ * from the organization's `blockedattachments` setting (a semicolon-delimited
5011
+ * string in Dataverse, parsed and normalised here). Clients reject these client-side
5012
+ * before the upload round-trips.
5013
+ */
5014
+ blockedFileExtensions: string[];
5015
+ /**
5016
+ * Format: int64
5017
+ * @description Maximum upload size for file attachments and file-column payloads, in bytes.
5018
+ * Sourced from the organization's `maxuploadfilesize` setting. Clients
5019
+ * compare file byte length directly against this for a pre-upload check.
5020
+ */
5021
+ maxUploadFileSizeInBytes: number | string;
5022
+ };
4584
5023
  /** @description Paging metadata for a Dataverse query response. */
4585
5024
  PagingInfo: {
4586
5025
  /**
@@ -4755,8 +5194,7 @@ interface components {
4755
5194
  };
4756
5195
  /**
4757
5196
  * @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.
5197
+ * values so the JSON wire form is a stable contract across reorderings.
4760
5198
  * @enum {integer}
4761
5199
  */
4762
5200
  RegisterResult: 0 | 1 | 2;
@@ -4863,8 +5301,8 @@ interface components {
4863
5301
  };
4864
5302
  /**
4865
5303
  * @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.
5304
+ * integer values so the JSON wire form is a stable contract across
5305
+ * reorderings.
4868
5306
  * @enum {integer}
4869
5307
  */
4870
5308
  ResetPasswordResult: 0 | 1 | 2;
@@ -4921,7 +5359,7 @@ interface components {
4921
5359
  * the column matching `TableMetadata.PrimaryNameColumn` AND
4922
5360
  * belonging to the view's main table (not a linked-entity column).
4923
5361
  * Clients use this to optionally render the cell as a clickable link
4924
- * that triggers the grid's edit action (see Blazor's
5362
+ * that triggers the grid's edit action (gated by
4925
5363
  * `AllowNavigateOnPrimaryNameClick`). At most one column per
4926
5364
  * view will have this set; consumers can safely use it to decorate
4927
5365
  * "open this record"-style links without per-row metadata lookups.
@@ -4995,8 +5433,8 @@ interface components {
4995
5433
  };
4996
5434
  /**
4997
5435
  * @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.
5436
+ * integer values so the JSON wire form is a stable contract across
5437
+ * reorderings.
5000
5438
  * @enum {integer}
5001
5439
  */
5002
5440
  SwitchIdentityResult: 0 | 1 | 2 | 3;
@@ -5045,6 +5483,7 @@ interface components {
5045
5483
  formattedValues?: {
5046
5484
  [key: string]: string;
5047
5485
  };
5486
+ currency?: null | components["schemas"]["Currency"];
5048
5487
  /** @description True when at least one column value has been changed since the record was loaded or void TableRecord.ResetState() was called. */
5049
5488
  isDirty?: boolean;
5050
5489
  /** Format: uuid */
@@ -5067,6 +5506,121 @@ interface components {
5067
5506
  * @enum {integer}
5068
5507
  */
5069
5508
  TableSecurityPermission: 0 | 1 | 2 | 4 | 8 | 16 | 32 | 63;
5509
+ /**
5510
+ * @description One target language's translated output plus how many strings were freshly translated
5511
+ * versus reused from the Dataverse translation memory.
5512
+ */
5513
+ TranslatedFile: {
5514
+ /** @description The portal culture this file was translated into (e.g. `"fr-FR"`). */
5515
+ targetCultureCode: string;
5516
+ /** @description Suggested filename for this language's download (e.g. `"app.fr-FR.json"`). */
5517
+ fileName: string;
5518
+ /**
5519
+ * Format: int32
5520
+ * @description Number of strings sent to the translation provider for this language this run.
5521
+ */
5522
+ translatedCount: number | string;
5523
+ /**
5524
+ * Format: int32
5525
+ * @description Number of strings that came from the Dataverse translation memory (not re-sent to the provider).
5526
+ */
5527
+ reusedCount: number | string;
5528
+ /**
5529
+ * Format: byte
5530
+ * @description UTF-8-encoded translated JSON body, in the same nested-object shape as the source.
5531
+ */
5532
+ content: string;
5533
+ };
5534
+ /**
5535
+ * @description Admin-facing description of whether the localization-translation feature is usable in
5536
+ * the current environment, returned by Task&lt;TranslationAvailability&gt; IPowerPortalsProService.GetTranslationAvailabilityAsync().
5537
+ * Drives whether the `LocalizationTranslator` UI shows its upload/translate panel, an
5538
+ * "install the managed solution" prompt, or nothing at all.
5539
+ */
5540
+ TranslationAvailability: {
5541
+ /**
5542
+ * @description `true` when a translation provider is registered and its credentials are configured
5543
+ * (the consumer called one of the `AddPowerPortalsPro&lt;Provider&gt;TranslationService()`
5544
+ * methods — Azure, DeepL, Google, … — and supplied the provider's key). When `false` the UI
5545
+ * renders nothing — translation is a host-wiring concern the admin can't self-serve.
5546
+ */
5547
+ isConfigured: boolean;
5548
+ /**
5549
+ * @description `true` when the translation managed solution (default unique name
5550
+ * `PowerPortalsProLocalization`) is installed in the connected environment, so the
5551
+ * translation-memory tables exist. When bool TranslationAvailability.IsConfigured is `true` but this
5552
+ * is `false`, the UI shows a prompt to install the solution.
5553
+ */
5554
+ isSolutionInstalled: boolean;
5555
+ /**
5556
+ * @description The candidate target languages — the portal's supported cultures, each annotated with
5557
+ * whether the configured translation provider can translate to it. Cultures the provider
5558
+ * doesn't support are still returned (so the admin sees them) but flagged via
5559
+ * bool TranslationLanguageOption.IsSupportedByProvider so the UI can disable them.
5560
+ * Empty when bool TranslationAvailability.IsConfigured is `false`.
5561
+ */
5562
+ targetLanguages: components["schemas"]["TranslationLanguageOption"][];
5563
+ };
5564
+ /**
5565
+ * @description One selectable target language in the translation UI: a portal-supported culture paired
5566
+ * with the translation-provider language code it maps to (when the provider supports it).
5567
+ */
5568
+ TranslationLanguageOption: {
5569
+ /** @description The portal culture code (e.g. `"fr-FR"`) — what the UI shows and the output file is named for. */
5570
+ cultureCode: string;
5571
+ /** @description Human-readable language/culture display name (e.g. `"French (France)"`). */
5572
+ displayName: string;
5573
+ /**
5574
+ * @description The translation-provider language code this culture maps to (e.g. `"fr"`), or `null`
5575
+ * when the configured provider doesn't support the culture's language.
5576
+ */
5577
+ providerLanguageCode?: null | string;
5578
+ /** @description `true` when the configured provider can translate to this culture (string? TranslationLanguageOption.ProviderLanguageCode is non-null). */
5579
+ isSupportedByProvider?: boolean;
5580
+ };
5581
+ /**
5582
+ * @description Request to translate one uploaded localization file into one or more target languages,
5583
+ * passed to Task&lt;TranslationResult&gt; IPowerPortalsProService.TranslateLocalizationFileAsync(TranslationRequest request).
5584
+ */
5585
+ TranslationRequest: {
5586
+ /** @description BCP-47 source language code (e.g. `"en"`), auto-detected from the filename but admin-editable. */
5587
+ sourceLanguage: string;
5588
+ /** @description The portal culture codes to translate into (the string TranslationLanguageOption.CultureCode values the admin selected). */
5589
+ targetCultureCodes: string[];
5590
+ /** @description The original uploaded filename (e.g. `"app.en.json"`) — used to name the per-language output files. */
5591
+ fileName: string;
5592
+ /**
5593
+ * Format: byte
5594
+ * @description The raw uploaded file bytes (UTF-8 JSON, optionally wrapped in a `var x = {...}` assignment, which the translator tolerates).
5595
+ */
5596
+ sourceContent: string;
5597
+ };
5598
+ /**
5599
+ * @description Result of a translate operation: one TranslatedFile per requested target
5600
+ * language plus a single zip of all of them, returned by
5601
+ * Task&lt;TranslationResult&gt; IPowerPortalsProService.TranslateLocalizationFileAsync(TranslationRequest request).
5602
+ */
5603
+ TranslationResult: {
5604
+ /** @description One entry per requested target language, each with its own counts and downloadable content. */
5605
+ files: components["schemas"]["TranslatedFile"][];
5606
+ /**
5607
+ * Format: byte
5608
+ * @description All IReadOnlyList&lt;TranslatedFile&gt; TranslationResult.Files packaged into a single zip — backs the "Download all" button.
5609
+ */
5610
+ zipContent: string;
5611
+ /** @description Suggested filename for the byte[] TranslationResult.ZipContent download. */
5612
+ zipFileName: string;
5613
+ /**
5614
+ * Format: int32
5615
+ * @description Total strings translated via the provider across all languages this run (sum of int TranslatedFile.TranslatedCount).
5616
+ */
5617
+ totalTranslated: number | string;
5618
+ /**
5619
+ * Format: int32
5620
+ * @description Total strings satisfied from the Dataverse translation memory across all languages (sum of int TranslatedFile.ReusedCount).
5621
+ */
5622
+ totalReused: number | string;
5623
+ };
5070
5624
  /**
5071
5625
  * @description Snapshot of the user's two-factor configuration, returned by
5072
5626
  * `GET /api/auth/manage/2fa`. Drives the Manage/TwoFactorAuthentication
@@ -5240,6 +5794,7 @@ type ConfirmEmailResponse = Schemas$1['ConfirmEmailResponse'];
5240
5794
  type ResendEmailConfirmationRequest = Schemas$1['ResendEmailConfirmationRequest'];
5241
5795
  type CurrentUserInfo = Schemas$1['CurrentUserInfo'];
5242
5796
  type ExternalLoginProviderInfo = Schemas$1['ExternalLoginProviderInfo'];
5797
+ type AuthOptionsResponse = Schemas$1['AuthOptionsResponse'];
5243
5798
  type PendingExternalLoginResponse = Schemas$1['PendingExternalLoginResponse'];
5244
5799
  type ConfirmExternalLoginRequest = Schemas$1['ConfirmExternalLoginRequest'];
5245
5800
  type ConfirmExternalLoginResponse = Schemas$1['ConfirmExternalLoginResponse'];
@@ -5270,16 +5825,16 @@ type PersonalDataResponse = Schemas$1['PersonalDataResponse'];
5270
5825
  type DeletePersonalDataRequest = Schemas$1['DeletePersonalDataRequest'];
5271
5826
  type DeletePersonalDataResponse = Schemas$1['DeletePersonalDataResponse'];
5272
5827
  /**
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.
5828
+ * SPA-facing wrapper over the framework's `/api/auth/*` endpoints — sign-
5829
+ * in, profile, 2FA, external login, forgot-password, registration, and
5830
+ * confirmation flows.
5276
5831
  *
5277
5832
  * Cookie auth flows automatically (the underlying {@link Transport} sends
5278
5833
  * `credentials: 'include'`), so a successful `loginAsync` leaves subsequent calls
5279
5834
  * authenticated without any token wiring on the React side.
5280
5835
  *
5281
5836
  * 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
5837
+ * surface as their own method so the consuming SPA owns its routing/UX between steps
5283
5838
  * same design as the C# interface.
5284
5839
  */
5285
5840
  declare class AuthClient {
@@ -5321,8 +5876,13 @@ declare class AuthClient {
5321
5876
  * startup to decide whether to render signed-in UI vs. the login flow.
5322
5877
  */
5323
5878
  getCurrentUserAsync(signal?: AbortSignal): Promise<CurrentUserInfo>;
5324
- /** Lists the configured external (OAuth) login providers (Microsoft, Google, …). */
5325
- getExternalLoginProvidersAsync(signal?: AbortSignal): Promise<readonly ExternalLoginProviderInfo[]>;
5879
+ /**
5880
+ * Anonymous auth options for the sign-in UI: whether the portal accepts local
5881
+ * username/password accounts (`localAccountsEnabled`) plus the configured external
5882
+ * providers — one round-trip the login page uses to decide whether to render the
5883
+ * local form / register + reset links and which provider buttons to show.
5884
+ */
5885
+ getAuthOptionsAsync(signal?: AbortSignal): Promise<AuthOptionsResponse>;
5326
5886
  /**
5327
5887
  * Reads the in-flight external-login cookie set by an OAuth callback. Returns
5328
5888
  * `null` when no callback is in flight (the endpoint replies 204) — the client
@@ -5405,43 +5965,56 @@ declare class AuthClient {
5405
5965
  * Aggregate function applied to a column in an aggregate FetchXML query.
5406
5966
  */
5407
5967
  declare const AggregateType: {
5968
+ /** No aggregation. */
5408
5969
  readonly None: 0;
5970
+ /** Count of rows (including nulls). */
5409
5971
  readonly Count: 1;
5972
+ /** Count of rows where the column is not null. */
5410
5973
  readonly CountColumn: 2;
5974
+ /** Sum of values. */
5411
5975
  readonly Sum: 3;
5976
+ /** Arithmetic mean of values. */
5412
5977
  readonly Avg: 4;
5978
+ /** Minimum value. */
5413
5979
  readonly Min: 5;
5980
+ /** Maximum value. */
5414
5981
  readonly Max: 6;
5415
5982
  };
5416
5983
  type AggregateType = (typeof AggregateType)[keyof typeof AggregateType];
5417
5984
  /**
5418
5985
  * Compression format for the archive produced by
5419
- * <see cref="!:Services.IPowerPortalsProService.CreateFileArchiveAsync" />.
5986
+ * `IPowerPortalsProService.CreateFileArchiveAsync`.
5420
5987
  * Currently only ArchiveFormat.Zip is supported; the enum is open-ended so
5421
5988
  * future formats can land without breaking the wire schema.
5422
5989
  */
5423
5990
  declare const ArchiveFormat: {
5991
+ /** Standard ZIP archive (application/zip, .zip extension). Built via ZipArchive with Optimal. */
5424
5992
  readonly Zip: 0;
5425
5993
  };
5426
5994
  type ArchiveFormat = (typeof ArchiveFormat)[keyof typeof ArchiveFormat];
5427
5995
  /**
5428
5996
  * 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.
5997
+ * integer values so the JSON wire form is a stable contract across
5998
+ * reorderings.
5431
5999
  */
5432
6000
  declare const ChangeEmailResult: {
6001
+ /** A confirmation email was sent to the new address. The change does not take effect until the user clicks the link. */
5433
6002
  readonly ConfirmationEmailSent: 0;
6003
+ /** The submitted email matches the user's current email. Nothing was sent. The client should show a "this is already your email" message. */
5434
6004
  readonly SameAsCurrentEmail: 1;
5435
6005
  };
5436
6006
  type ChangeEmailResult = (typeof ChangeEmailResult)[keyof typeof ChangeEmailResult];
5437
6007
  /**
5438
6008
  * 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.
6009
+ * explicit integer values so the JSON wire form is a stable contract
6010
+ * across reorderings.
5441
6011
  */
5442
6012
  declare const ChangePasswordResult: {
6013
+ /** The password was changed. The auth cookie has been refreshed to pick up the new security stamp so other sessions are invalidated. */
5443
6014
  readonly Success: 0;
6015
+ /** The supplied old password did not match the current password. The client should show an "incorrect current password" error and allow retry. */
5444
6016
  readonly IncorrectOldPassword: 1;
6017
+ /** 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
6018
  readonly InvalidPassword: 2;
5446
6019
  };
5447
6020
  type ChangePasswordResult = (typeof ChangePasswordResult)[keyof typeof ChangePasswordResult];
@@ -5455,16 +6028,27 @@ type ChangePasswordResult = (typeof ChangePasswordResult)[keyof typeof ChangePas
5455
6028
  * current culture.
5456
6029
  */
5457
6030
  declare const ChartDateGrouping: {
6031
+ /** No date grouping — the column is grouped by its raw value. */
5458
6032
  readonly None: 0;
6033
+ /** Group by day (dategrouping="day"). Label: day number. */
5459
6034
  readonly Day: 1;
6035
+ /** Group by ISO week (dategrouping="week"). Label: week number. */
5460
6036
  readonly Week: 2;
6037
+ /** Group by calendar month (dategrouping="month"). Label: abbreviated month name (Jan, Feb, …) in the current culture. */
5461
6038
  readonly Month: 3;
6039
+ /** Group by calendar quarter (dategrouping="quarter"). Label: quarter number. */
5462
6040
  readonly Quarter: 4;
6041
+ /** Group by calendar year (dategrouping="year"). Label: year. */
5463
6042
  readonly Year: 5;
6043
+ /** Group by month + year. Label: "Jan 2024". */
5464
6044
  readonly MonthAndYear: 6;
6045
+ /** Group by day + month. Label: "15 Jan". */
5465
6046
  readonly DayAndMonth: 7;
6047
+ /** Group by day + month + year. Label: "15 Jan 2024". */
5466
6048
  readonly DayAndMonthAndYear: 8;
6049
+ /** Group by ISO week + year. Label: "W15 2024". */
5467
6050
  readonly WeekAndYear: 9;
6051
+ /** Group by quarter + year. Label: "Q1 2024". */
5468
6052
  readonly QuarterAndYear: 10;
5469
6053
  };
5470
6054
  type ChartDateGrouping = (typeof ChartDateGrouping)[keyof typeof ChartDateGrouping];
@@ -5472,41 +6056,69 @@ type ChartDateGrouping = (typeof ChartDateGrouping)[keyof typeof ChartDateGroupi
5472
6056
  * 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
6057
  */
5474
6058
  declare const ColumnType: {
6059
+ /** A Boolean attribute. Value = 0. */
5475
6060
  readonly Boolean: 0;
6061
+ /** An attribute that represents a customer. Value = 1. */
5476
6062
  readonly Customer: 1;
6063
+ /** A date/time attribute. Value = 2. */
5477
6064
  readonly DateTime: 2;
6065
+ /** A decimal attribute. Value = 3. */
5478
6066
  readonly Decimal: 3;
6067
+ /** A double attribute. Value = 4. */
5479
6068
  readonly Double: 4;
6069
+ /** An integer attribute. Value = 5. */
5480
6070
  readonly Integer: 5;
6071
+ /** A lookup attribute. Value = 6. */
5481
6072
  readonly Lookup: 6;
6073
+ /** A memo attribute. Value = 7. */
5482
6074
  readonly Memo: 7;
6075
+ /** A money attribute. Value = 8. */
5483
6076
  readonly Money: 8;
6077
+ /** An owner attribute. Value = 9. */
5484
6078
  readonly Owner: 9;
6079
+ /** A partylist attribute. Value = 10. */
5485
6080
  readonly PartyList: 10;
6081
+ /** A picklist (single-select choice) attribute. Value = 11. */
5486
6082
  readonly Choice: 11;
6083
+ /** A state attribute. Value = 12. */
5487
6084
  readonly State: 12;
6085
+ /** A status attribute. Value = 13. */
5488
6086
  readonly Status: 13;
6087
+ /** A string attribute. Value = 14. */
5489
6088
  readonly String: 14;
6089
+ /** A unique identifier (GUID) attribute. Value = 15. */
5490
6090
  readonly Uniqueidentifier: 15;
6091
+ /** An attribute that contains calendar rules. Value = 16. */
5491
6092
  readonly CalendarRules: 16;
6093
+ /** An attribute that is created by the system at run time. Value = 17. */
5492
6094
  readonly Virtual: 17;
6095
+ /** A big integer (long) attribute. Value = 18. */
5493
6096
  readonly BigInt: 18;
6097
+ /** A managed property attribute. Value = 19. */
5494
6098
  readonly ManagedProperty: 19;
6099
+ /** An entity name attribute. Value = 20. */
5495
6100
  readonly EntityName: 20;
6101
+ /** A multi-select choice attribute. Value = 40. PowerPortalsPro-specific (not present in Dataverse AttributeTypeCode). */
5496
6102
  readonly MultiSelectChoice: 40;
6103
+ /** A file attachment attribute. Value = 41. PowerPortalsPro-specific (not present in Dataverse AttributeTypeCode). */
5497
6104
  readonly File: 41;
6105
+ /** An image attribute. Value = 42. PowerPortalsPro-specific (not present in Dataverse AttributeTypeCode). */
5498
6106
  readonly Image: 42;
5499
6107
  };
5500
6108
  type ColumnType = (typeof ColumnType)[keyof typeof ColumnType];
5501
6109
  /**
5502
6110
  * 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.
6111
+ * explicit integer values so the JSON wire form is a stable contract
6112
+ * across reorderings.
5505
6113
  */
5506
6114
  declare const ConfirmExternalLoginResult: {
6115
+ /** 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
6116
  readonly SignedIn: 0;
6117
+ /** The account was created but the host requires email confirmation. A confirmation link has been sent; the user is NOT signed in yet. */
5508
6118
  readonly ConfirmationEmailSent: 1;
6119
+ /** 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
6120
  readonly NoPendingExternalLogin: 2;
6121
+ /** Identity rejected the create / add-login operation (e.g. duplicate email already linked to a different account). Errors carries the per-rule messages. */
5510
6122
  readonly Failure: 3;
5511
6123
  };
5512
6124
  type ConfirmExternalLoginResult = (typeof ConfirmExternalLoginResult)[keyof typeof ConfirmExternalLoginResult];
@@ -5514,29 +6126,37 @@ type ConfirmExternalLoginResult = (typeof ConfirmExternalLoginResult)[keyof type
5514
6126
  * Specifies the date/time behavior of a DateTime column.
5515
6127
  */
5516
6128
  declare const DateTimeBehavior: {
6129
+ /** Only the date portion is stored; no time component. */
5517
6130
  readonly DateOnly: 1;
6131
+ /** The value is stored in UTC and converted to the user's local time zone for display. */
5518
6132
  readonly UserLocal: 2;
6133
+ /** The value is stored and displayed exactly as entered, without time zone conversion. */
5519
6134
  readonly TimeZoneIndependent: 3;
5520
6135
  };
5521
6136
  type DateTimeBehavior = (typeof DateTimeBehavior)[keyof typeof DateTimeBehavior];
5522
6137
  /**
5523
6138
  * 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.
6139
+ * explicit integer values so the JSON wire form is a stable contract
6140
+ * across reorderings.
5526
6141
  */
5527
6142
  declare const DeletePersonalDataResult: {
6143
+ /** The account was deleted and the auth cookie has been cleared. */
5528
6144
  readonly Success: 0;
6145
+ /** 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
6146
  readonly IncorrectPassword: 1;
6147
+ /** 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
6148
  readonly RequireLocalPassword: 2;
5531
6149
  };
5532
6150
  type DeletePersonalDataResult = (typeof DeletePersonalDataResult)[keyof typeof DeletePersonalDataResult];
5533
6151
  /**
5534
6152
  * 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.
6153
+ * explicit integer values so the JSON wire form is a stable contract
6154
+ * across reorderings.
5537
6155
  */
5538
6156
  declare const ExternalLoginCandidateKind: {
6157
+ /** The candidate is a Dataverse contact record. */
5539
6158
  readonly Contact: 0;
6159
+ /** The candidate is a Dataverse systemuser record. */
5540
6160
  readonly SystemUser: 1;
5541
6161
  };
5542
6162
  type ExternalLoginCandidateKind = (typeof ExternalLoginCandidateKind)[keyof typeof ExternalLoginCandidateKind];
@@ -5544,7 +6164,9 @@ type ExternalLoginCandidateKind = (typeof ExternalLoginCandidateKind)[keyof type
5544
6164
  * Determines how the server returns the archive bytes to the caller.
5545
6165
  */
5546
6166
  declare const FileArchiveResponseFormat: {
6167
+ /** 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
6168
  readonly BinaryStream: 0;
6169
+ /** 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
6170
  readonly Json: 1;
5549
6171
  };
5550
6172
  type FileArchiveResponseFormat = (typeof FileArchiveResponseFormat)[keyof typeof FileArchiveResponseFormat];
@@ -5552,15 +6174,25 @@ type FileArchiveResponseFormat = (typeof FileArchiveResponseFormat)[keyof typeof
5552
6174
  * Join type used on a FetchXML link-entity.
5553
6175
  */
5554
6176
  declare const JoinOperator: {
6177
+ /** Inner join — only matching rows are returned. */
5555
6178
  readonly Inner: 0;
6179
+ /** Left outer join — unmatched parent rows are returned with null link columns. */
5556
6180
  readonly LeftOuter: 1;
6181
+ /** Natural join. */
5557
6182
  readonly Natural: 2;
6183
+ /** Match first row using cross apply. */
5558
6184
  readonly MatchFirstRowUsingCrossApply: 3;
6185
+ /** In join — semi-join used for subqueries. */
5559
6186
  readonly In: 4;
6187
+ /** Exists join — semi-join evaluating existence. */
5560
6188
  readonly Exists: 5;
6189
+ /** Any-match semi-join. */
5561
6190
  readonly Any: 6;
6191
+ /** Inverse of Any. */
5562
6192
  readonly NotAny: 7;
6193
+ /** All-match semi-join. */
5563
6194
  readonly All: 8;
6195
+ /** Inverse of All. */
5564
6196
  readonly NotAll: 9;
5565
6197
  };
5566
6198
  type JoinOperator = (typeof JoinOperator)[keyof typeof JoinOperator];
@@ -5569,26 +6201,33 @@ type JoinOperator = (typeof JoinOperator)[keyof typeof JoinOperator];
5569
6201
  * so the client can branch UI behavior without inspecting HTTP status codes.
5570
6202
  *
5571
6203
  * 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.
6204
+ * the JSON numeric representation is a stable contract. Pinning the
6205
+ * values prevents accidental drift if a future refactor reorders or
6206
+ * inserts members.
5575
6207
  */
5576
6208
  declare const LoginResult: {
6209
+ /** Credentials were accepted and the auth cookie has been set. The client should navigate to the post-login destination (typically ReturnUrl). */
5577
6210
  readonly Success: 0;
6211
+ /** 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
6212
  readonly RequiresTwoFactor: 1;
6213
+ /** 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
6214
  readonly InvalidCredentials: 2;
6215
+ /** 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
6216
  readonly EmailNotConfirmed: 3;
6217
+ /** The account is locked out (too many failed attempts, manual lockout, etc.). The client should show the lockout page. */
5581
6218
  readonly LockedOut: 4;
5582
6219
  };
5583
6220
  type LoginResult = (typeof LoginResult)[keyof typeof LoginResult];
5584
6221
  /**
5585
6222
  * 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.
6223
+ * values so the JSON wire form is a stable contract across reorderings.
5588
6224
  */
5589
6225
  declare const RegisterResult: {
6226
+ /** 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
6227
  readonly ConfirmationEmailSent: 0;
6228
+ /** The account was created and the user has been signed in directly (the host did not configure SignIn.RequireConfirmedAccount). */
5591
6229
  readonly SignedIn: 1;
6230
+ /** 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
6231
  readonly EmailAlreadyInUse: 2;
5593
6232
  };
5594
6233
  type RegisterResult = (typeof RegisterResult)[keyof typeof RegisterResult];
@@ -5605,7 +6244,9 @@ type RegisterResult = (typeof RegisterResult)[keyof typeof RegisterResult];
5605
6244
  * relationship is rejected by the server at filter-apply time.
5606
6245
  */
5607
6246
  declare const RelationshipFilterMode: {
6247
+ /** 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
6248
  readonly IncludeExistingRecords: 0;
6249
+ /** 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
6250
  readonly ExcludeExistingRecords: 1;
5610
6251
  };
5611
6252
  type RelationshipFilterMode = (typeof RelationshipFilterMode)[keyof typeof RelationshipFilterMode];
@@ -5613,32 +6254,43 @@ type RelationshipFilterMode = (typeof RelationshipFilterMode)[keyof typeof Relat
5613
6254
  * Specifies whether a column value is required.
5614
6255
  */
5615
6256
  declare const RequiredLevel: {
6257
+ /** No requirements are specified. */
5616
6258
  readonly None: 0;
6259
+ /** The column is required by the system and cannot be null. */
5617
6260
  readonly SystemRequired: 1;
6261
+ /** The column is required by the application and should have a value. */
5618
6262
  readonly ApplicationRequired: 2;
6263
+ /** It is recommended that the column has a value, but it is not enforced. */
5619
6264
  readonly Recommended: 3;
5620
6265
  };
5621
6266
  type RequiredLevel = (typeof RequiredLevel)[keyof typeof RequiredLevel];
5622
6267
  /**
5623
6268
  * 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.
6269
+ * integer values so the JSON wire form is a stable contract across
6270
+ * reorderings.
5626
6271
  */
5627
6272
  declare const ResetPasswordResult: {
6273
+ /** The password was reset and the user can now sign in with the new password. */
5628
6274
  readonly Success: 0;
6275
+ /** The token was missing, malformed, expired, or already used. The client should redirect the user to the "request a new reset link" flow. */
5629
6276
  readonly InvalidOrExpiredToken: 1;
6277
+ /** 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
6278
  readonly InvalidPassword: 2;
5631
6279
  };
5632
6280
  type ResetPasswordResult = (typeof ResetPasswordResult)[keyof typeof ResetPasswordResult];
5633
6281
  /**
5634
6282
  * 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.
6283
+ * integer values so the JSON wire form is a stable contract across
6284
+ * reorderings.
5637
6285
  */
5638
6286
  declare const SwitchIdentityResult: {
6287
+ /** The alt identity was signed in and the auth cookie has been swapped. */
5639
6288
  readonly Switched: 0;
6289
+ /** The current principal has no alt-identity claim — there is nothing to switch to. */
5640
6290
  readonly NoAltIdentity: 1;
6291
+ /** The alt identity referenced by the claim no longer exists in Dataverse (or is disabled). */
5641
6292
  readonly AltIdentityNotFound: 2;
6293
+ /** The current request is unauthenticated. */
5642
6294
  readonly NotAuthenticated: 3;
5643
6295
  };
5644
6296
  type SwitchIdentityResult = (typeof SwitchIdentityResult)[keyof typeof SwitchIdentityResult];
@@ -5646,13 +6298,21 @@ type SwitchIdentityResult = (typeof SwitchIdentityResult)[keyof typeof SwitchIde
5646
6298
  * Bit flags describing the security operations the current user can perform on a record.
5647
6299
  */
5648
6300
  declare const TableSecurityPermission: {
6301
+ /** No permissions. */
5649
6302
  readonly None: 0;
6303
+ /** The record can be read. */
5650
6304
  readonly Read: 1;
6305
+ /** The record (or table) can have new records created. */
5651
6306
  readonly Create: 2;
6307
+ /** The record can be modified. */
5652
6308
  readonly Write: 4;
6309
+ /** The record can be deleted. */
5653
6310
  readonly Delete: 8;
6311
+ /** The record can be appended to other records (used as the child of a relationship). */
5654
6312
  readonly Append: 16;
6313
+ /** Other records can be appended to this record (used as the parent of a relationship). */
5655
6314
  readonly AppendTo: 32;
6315
+ /** All permissions except Create. */
5656
6316
  readonly All: 63;
5657
6317
  };
5658
6318
  type TableSecurityPermission = (typeof TableSecurityPermission)[keyof typeof TableSecurityPermission];
@@ -5691,8 +6351,9 @@ type BaseDataPoint = Schemas['DataPointBase'];
5691
6351
  type DataverseDataPoint = Schemas['DataPointDataverseDataPoint'];
5692
6352
  type ChartLinkedEntity = Schemas['ChartLinkedEntity'];
5693
6353
  type FileInfo = Schemas['FileInfo'];
5694
- type EnvironmentFileSettings = Schemas['EnvironmentFileSettings'];
5695
6354
  type CreateFileArchiveRequest = Schemas['CreateFileArchiveRequest'];
6355
+ type OrganizationSettings = Schemas['OrganizationSettings'];
6356
+ type Currency = Schemas['Currency'];
5696
6357
  /**
5697
6358
  * Client-side result of {@link PowerPortalsProClient.createFileArchiveAsync}.
5698
6359
  * Carries the archive bytes plus the metadata derived from the server's
@@ -5710,17 +6371,37 @@ interface FileArchiveResult {
5710
6371
  }
5711
6372
  type LocalizationBundleManifest = Schemas['LocalizationBundleManifest'];
5712
6373
  type LocalizationManifestForLocale = Schemas['LocalizationManifestForLocale'];
6374
+ type TranslationAvailability = Schemas['TranslationAvailability'];
6375
+ type TranslationLanguageOption = Schemas['TranslationLanguageOption'];
6376
+ type TranslationRequest = Schemas['TranslationRequest'];
6377
+ type TranslationResult = Schemas['TranslationResult'];
6378
+ type TranslatedFile = Schemas['TranslatedFile'];
6379
+ type LocalizationOverview = Schemas['LocalizationOverview'];
6380
+ type LocalizationPipelineConfiguration = Schemas['LocalizationPipelineConfiguration'];
6381
+ type LocalizationSourceLoad = Schemas['LocalizationSourceLoad'];
6382
+ type LocalizationSourceKind = Schemas['LocalizationSourceKind'];
6383
+ type LocalizationSourceStatus = Schemas['LocalizationSourceStatus'];
5713
6384
  /**
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.
6385
+ * A localization file pulled from the per-source or merged download endpoint:
6386
+ * the UTF-8 JSON bytes plus the server-suggested filename (parsed from the
6387
+ * `Content-Disposition` header). Mirrors the C# `LocalizationDownload` shape so
6388
+ * both stacks share one mental model. The download methods return `null` (not
6389
+ * this) when the server has nothing for the requested source/culture (404).
6390
+ */
6391
+ interface LocalizationFileDownload {
6392
+ /** Server-suggested download filename (already includes the culture + `.json`). */
6393
+ readonly fileName: string;
6394
+ /** UTF-8-encoded JSON body. */
6395
+ readonly data: Uint8Array;
6396
+ }
6397
+ type CacheClearResult = Schemas['CacheClearResult'];
6398
+ /**
6399
+ * SPA-facing wrapper over the framework's record / metadata / file endpoints
6400
+ * under `/api/*`. Flat surface, no sub-namespacing — CRUD, metadata, files,
6401
+ * and aggregate-chart calls all live at the root.
5721
6402
  *
5722
- * Authentication is a separate concern handled by {@link AuthClient}, mirroring the
5723
- * `IAuthService` / `IPowerPortalsProService` split on the Blazor side.
6403
+ * Authentication is a separate concern handled by {@link AuthClient}, which
6404
+ * sits beside this class with its own surface.
5724
6405
  *
5725
6406
  * @example
5726
6407
  * ```ts
@@ -5739,10 +6420,9 @@ declare class PowerPortalsProClient {
5739
6420
  readonly transport: Transport;
5740
6421
  constructor(transportOrOptions?: Transport | TransportOptions);
5741
6422
  /**
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.
6423
+ * Creates a new record. URL is derived from `record.tableName`. The server
6424
+ * marks every property as modified before applying so column values
6425
+ * arriving from JSON (which carry no dirty flags) round-trip correctly.
5746
6426
  */
5747
6427
  createRecordAsync(record: TableRecord$1, signal?: AbortSignal): Promise<CreateResponse>;
5748
6428
  /**
@@ -5750,6 +6430,71 @@ declare class PowerPortalsProClient {
5750
6430
  * omit it for the table's full set of columns visible to the caller.
5751
6431
  */
5752
6432
  retrieveRecordAsync(tableLogicalName: string, recordId: string, columns?: readonly string[], signal?: AbortSignal): Promise<TableRecord$1>;
6433
+ /**
6434
+ * Probes whether the localization-translation feature is usable: whether a translation
6435
+ * provider is configured, whether the managed solution is installed, and the candidate
6436
+ * target languages (the portal's cultures annotated with provider-translatability).
6437
+ * SystemAdmin-gated.
6438
+ */
6439
+ getTranslationAvailabilityAsync(signal?: AbortSignal): Promise<TranslationAvailability>;
6440
+ /**
6441
+ * Translates an uploaded localization file into one or more target languages, reusing the
6442
+ * Dataverse translation memory. Returns one file per language (base64 `content`) plus a zip
6443
+ * of all and translated-vs-reused counts. SystemAdmin-gated.
6444
+ */
6445
+ translateLocalizationFileAsync(request: TranslationRequest, signal?: AbortSignal): Promise<TranslationResult>;
6446
+ /**
6447
+ * Reads the admin localization overview: the configured warmup pipeline plus the
6448
+ * per-source load records (load order, source kind, cultures touched, key counts,
6449
+ * how many keys overrode an earlier source, duration, status) from the most recent
6450
+ * warmup. Backs the `<LocalizationAdmin />` panel. SystemAdmin-gated.
6451
+ */
6452
+ getLocalizationOverviewAsync(signal?: AbortSignal): Promise<LocalizationOverview>;
6453
+ /**
6454
+ * Downloads the JSON one source contributed to one culture during the most recent
6455
+ * warmup — a translation-handoff snapshot. Returns `null` when the source/culture
6456
+ * pair isn't tracked (the server answers 404 — cache cleared, source removed, or
6457
+ * the culture has no entries for that source). SystemAdmin-gated.
6458
+ */
6459
+ downloadLocalizationSourceAsync(sourceId: string, culture: string, signal?: AbortSignal): Promise<LocalizationFileDownload | null>;
6460
+ /**
6461
+ * Downloads the merged JSON of every key the cache will serve for a culture (the
6462
+ * post-merge winning value across all sources) — a complete-snapshot reference.
6463
+ * Returns `null` when the culture has no entries (404). SystemAdmin-gated.
6464
+ */
6465
+ downloadMergedLocalizationsAsync(culture: string, signal?: AbortSignal): Promise<LocalizationFileDownload | null>;
6466
+ /**
6467
+ * Shared binary-download path for the two localization download endpoints. Reads
6468
+ * the raw bytes via `response.arrayBuffer()` and derives the filename from the
6469
+ * `Content-Disposition` header (matching {@link createFileArchiveAsync}). Maps a
6470
+ * 404 to `null` so callers can show a "nothing to download" message instead of
6471
+ * surfacing it as an error.
6472
+ */
6473
+ private downloadLocalizationFile;
6474
+ /**
6475
+ * Lists every registered server-side cache by name — the values that
6476
+ * {@link clearCacheAsync} accepts. Backs the per-cache buttons on an admin
6477
+ * "clear caches" page; render them sorted client-side for a stable order.
6478
+ * SystemAdmin-gated.
6479
+ */
6480
+ getCacheNamesAsync(signal?: AbortSignal): Promise<readonly string[]>;
6481
+ /**
6482
+ * Clears every registered server-side cache and returns one
6483
+ * {@link CacheClearResult} per cache (name, success flag, error, elapsed ms).
6484
+ * Per-cache failures are reported in the result rows rather than thrown, so a
6485
+ * single misbehaving cache doesn't abort the rest — inspect `succeeded` on each
6486
+ * row. SystemAdmin-gated.
6487
+ */
6488
+ clearAllCachesAsync(signal?: AbortSignal): Promise<readonly CacheClearResult[]>;
6489
+ /**
6490
+ * Clears a single named cache (case-insensitive match against
6491
+ * {@link getCacheNamesAsync}). Returns the {@link CacheClearResult}, or `null`
6492
+ * when no cache by that name is registered (the server answers 404). A clear
6493
+ * that runs but throws internally comes back as a result row with
6494
+ * `succeeded: false` — that's distinct from the not-found `null`.
6495
+ * SystemAdmin-gated.
6496
+ */
6497
+ clearCacheAsync(name: string, signal?: AbortSignal): Promise<CacheClearResult | null>;
5753
6498
  /**
5754
6499
  * Runs a FetchXML query and returns the matching records plus paging info.
5755
6500
  * The query is the FetchXML XML literal — the same format Dataverse natively accepts.
@@ -5767,23 +6512,24 @@ declare class PowerPortalsProClient {
5767
6512
  * client can render headers + dispatch cells without a separate
5768
6513
  * metadata round-trip.
5769
6514
  *
5770
- * Exactly one of <c>request.viewId</c> or <c>request.fetchXml</c> must
5771
- * be supplied; sending both or neither returns a 400.
6515
+ * At least one of <c>request.viewId</c> or <c>request.fetchXml</c> must
6516
+ * be supplied (neither returns a 400). Both may be supplied together — the
6517
+ * <c>fetchXml</c> is the query and the <c>viewId</c> names the view for
6518
+ * localized column-title resolution.
5772
6519
  *
5773
- * Mirrors how the Blazor `IGridService` is consumed
6520
+ * Mirrors how the is consumed
5774
6521
  * `@powerportalspro/react`'s `useGridData` hook calls this method
5775
6522
  * internally, so most consumers don't invoke it directly.
5776
6523
  */
5777
6524
  loadGridAsync(request: GridDataRequest, signal?: AbortSignal): Promise<GridDataResponse>;
5778
6525
  /**
5779
- * Updates an existing record. URL is derived from `record.tableName` and `record.id`
6526
+ * Updates an existing record. URL is derived from `record.tableName` and `record.id`
5780
6527
  * `record.id` must be set. For a new record, use {@link createRecordAsync} instead.
5781
6528
  */
5782
6529
  updateRecordAsync(record: TableRecord$1, signal?: AbortSignal): Promise<UpdateResponse>;
5783
6530
  /**
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
6531
+ * Executes a batch of {@link OrganizationRequest}s as a single round-trip.
6532
+ * The MainContext save flow uses this to ship every dirty descendant's
5787
6533
  * requests in one shot so a multi-record save lands transactionally
5788
6534
  * server-side.
5789
6535
  *
@@ -5806,7 +6552,7 @@ declare class PowerPortalsProClient {
5806
6552
  * query, performs the multi-series pivot, and applies combined
5807
6553
  * date-label formatting using the request culture.
5808
6554
  *
5809
- * Mirrors how the Blazor `IChartService` is consumed
6555
+ * Mirrors how the is consumed
5810
6556
  * `@powerportalspro/react-charts`'s `DataverseChartDataSource` family
5811
6557
  * calls this method internally, so most consumers don't invoke it
5812
6558
  * directly.
@@ -5818,12 +6564,13 @@ declare class PowerPortalsProClient {
5818
6564
  * Returns the current user's combined table-level `TableSecurityPermission`
5819
6565
  * bitmask for `tableLogicalName` — the bitwise union of Read / Create /
5820
6566
  * 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.
6567
+ * `ITablePermissionHandler` allows for that user on that table. Routed
6568
+ * server-side through the cached `ITablePermissionCache` lookup.
6569
+ *
6570
+ * Wrapped by the `useTablePermissions(tableName)` React hook with
6571
+ * in-flight-promise dedup; reach for the raw client only when you're
6572
+ * outside React (e.g. a stand-alone script) or need an imperative
6573
+ * one-off check.
5827
6574
  *
5828
6575
  * Returns `0` (`TableSecurityPermission.None`) when the user has no
5829
6576
  * permissions on the table; consumers compare via bit math (e.g.
@@ -5907,14 +6654,14 @@ declare class PowerPortalsProClient {
5907
6654
  * override files (last-wins). Use this to seed the React-side localizer
5908
6655
  * with one round-trip.
5909
6656
  *
5910
- * Returned shape is a nested object that mirrors the source JSON files
6657
+ * Returned shape is a nested object that mirrors the source JSON files
5911
6658
  * `{ app: { buttons: { save: { label: "Save" } } }, tables: { contact: ... } }`.
5912
6659
  * The client typically flattens this to dotted-key form for `t()` lookup
5913
6660
  * (see {@link flattenStrings} in `@powerportalspro/react`).
5914
6661
  *
5915
6662
  * @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.
6663
+ * localization recognizes — e.g. `"en"`, `"es"`, `"fr-CA"`. Falls back
6664
+ * to the default culture server-side when the value isn't supported.
5918
6665
  */
5919
6666
  retrieveLocalizedStringsAsync(culture: string, signal?: AbortSignal): Promise<Record<string, unknown>>;
5920
6667
  /**
@@ -5939,12 +6686,12 @@ declare class PowerPortalsProClient {
5939
6686
  * Two response shapes, selected by `request.responseFormat`:
5940
6687
  *
5941
6688
  * - **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.
6689
+ * method reads them via `response.arrayBuffer()` and wraps the result in a
6690
+ * {@link FileArchiveResult}, deriving `fileName` from the `Content-Disposition`
6691
+ * header and `contentType` from `Content-Type`. Most consumers want this path.
5945
6692
  * - **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.
6693
+ * the archive bytes base64-encoded. Useful for test harnesses, service workers,
6694
+ * or callers that need to inspect filename/size before triggering a download.
5948
6695
  *
5949
6696
  * Either way, the returned `data` is empty (`Uint8Array(0)`) when none of the
5950
6697
  * supplied records produced a usable file — the caller can surface a "nothing to
@@ -5956,7 +6703,21 @@ declare class PowerPortalsProClient {
5956
6703
  * upload size in KB). UI consumers use this to validate uploads client-side before
5957
6704
  * the round-trip, mirroring what the server enforces.
5958
6705
  */
5959
- getEnvironmentFileSettingsAsync(signal?: AbortSignal): Promise<EnvironmentFileSettings>;
6706
+ /**
6707
+ * Reads the org-wide settings sourced from the Dataverse `organization`
6708
+ * record: default currency plus file-upload constraints
6709
+ * (`blockedFileExtensions`, `maxUploadFileSizeInBytes`). Replaces the legacy
6710
+ * `getEnvironmentFileSettingsAsync` — file fields now live on this combined
6711
+ * response.
6712
+ * <para>
6713
+ * Primary consumers:
6714
+ * </para>
6715
+ * - Create-mode `<MoneyEdit>` reads `defaultCurrency` to render the right
6716
+ * symbol on brand-new records before save.
6717
+ * - File editors / FileGrid read the two file fields to reject invalid
6718
+ * uploads client-side before the round-trip.
6719
+ */
6720
+ getOrganizationSettingsAsync(signal?: AbortSignal): Promise<OrganizationSettings>;
5960
6721
  }
5961
6722
 
5962
6723
  type TableRecord = components['schemas']['TableRecord'];
@@ -5971,7 +6732,7 @@ type TableRecord = components['schemas']['TableRecord'];
5971
6732
  * Returns `undefined` when neither field carries a usable value (record
5972
6733
  * still loading, or a never-seeded create-mode record).
5973
6734
  *
5974
- * Mirrors Blazor's `TableRecord -> TableRecordReference` implicit conversion
6735
+ * Mirrors implicit conversion
5975
6736
  * (`Id == Guid.Empty ? _idForCreate : Id`). The server resolves either
5976
6737
  * shape via `ResolveAssociateRecordAsync` — both flows interoperate.
5977
6738
  */
@@ -5979,4 +6740,4 @@ declare function getRecordReferenceId(record: Pick<TableRecord, 'id' | '_idForCr
5979
6740
 
5980
6741
  declare const VERSION = "0.1.0";
5981
6742
 
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 };
6743
+ 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 };