@genesislcap/foundation-forms 15.3.2 → 15.3.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/form.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/form.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,28 @@ export declare function resolveResourceOptionLabel(raw: any, options: any): Prom
66
66
  * @internal
67
67
  */
68
68
  export declare function resolveEnumLabel(raw: any, fieldName: string, schema: any): string | null;
69
+ /**
70
+ * Formats a raw value for the review panel by the same renderer type
71
+ * (`NumberControlRenderer`/`DateControlRenderer`) the form would use for this field. Numbers
72
+ * are formatted with `toIntlNumberFormat` (the same precision-safe path `NumberField` itself
73
+ * uses); dates/datetimes with `getDateFormatter`, adding hours/minutes for `GenesisType.DATETIME`
74
+ * fields. Returns `null` for non-number/date fields, or when no JSON schema is available to
75
+ * determine the field's type.
76
+ *
77
+ * `uischemaOptions` (the Control element's `options`, as passed to `resolveOptionLabel` etc.)
78
+ * carries the same display-affecting settings `NumberControlRenderer` reads directly —
79
+ * `formatOptions`, `withoutFormatting`, `prefix`, `suffix` — so a field configured with e.g.
80
+ * `withoutFormatting: true` or a custom `formatOptions.maximumFractionDigits` doesn't disagree
81
+ * with review over how many digits it shows.
82
+ *
83
+ * A `raw` array against an array-typed field schema (`{ type: 'array', items: {...} }`, per
84
+ * `isArray`'s convention) formats each element against `items` individually — e.g. an array of
85
+ * DATE values — falling back to the unformatted element for any that don't format, so
86
+ * `formatValueForReview`'s comma-join still sees a flat array of primitives. `uischemaOptions`
87
+ * applies to every element, matching how one Control renders every item in the array.
88
+ * @internal
89
+ */
90
+ export declare function formatValueByFieldType(raw: any, fieldName: string, schema: any, uischemaOptions?: any): string | unknown[] | null;
69
91
  /**
70
92
  * Navigates a `/properties/`-separated path in data to support nested object scopes
71
93
  * such as `ADDRESS/properties/STREET` produced by Group layout UI schemas.
@@ -1 +1 @@
1
- {"version":3,"file":"review-utils.d.ts","sourceRoot":"","sources":["../../../src/utils/review-utils.ts"],"names":[],"mappings":"AAIA,cAAc;AACd,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,cAAc;AACd,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,aAAa,EAAE,CAAC,CAuE1B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAc9F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAMxE;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8B/F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAiBxF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAEpE;AAYD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAwBvD"}
1
+ {"version":3,"file":"review-utils.d.ts","sourceRoot":"","sources":["../../../src/utils/review-utils.ts"],"names":[],"mappings":"AASA,cAAc;AACd,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,cAAc;AACd,MAAM,MAAM,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,GAAG,GACV,OAAO,CAAC,aAAa,EAAE,CAAC,CAwE1B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAc9F;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAMxE;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8B/F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAaxF;AAwED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,GAAG,EACX,eAAe,CAAC,EAAE,GAAG,GACpB,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,CAY3B;AAqED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,GAAG,CAEpE;AAYD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAwBvD"}
package/dist/esm/form.js CHANGED
@@ -393,7 +393,27 @@ let Form = class Form extends LifecycleMixin(FoundationElement) {
393
393
  this.$emit('submit', { payload, errors: this.errors });
394
394
  if (Object.entries(payload).length !== 0 && !this.hasValidationErrors() && this.resourceName) {
395
395
  this.submitting = true;
396
- const formSubmitReq = yield this.connect.commitEvent(this.resourceName, commitPayload);
396
+ // The try only wraps the network call itself: anything that can go wrong here is a
397
+ // genuine transport failure, so it's fair to report it as SUBMIT_ERROR. Response
398
+ // handling below (which can itself throw — e.g. a backend sending ERROR as a single
399
+ // object rather than an array) stays outside it, so a bug there surfaces as itself
400
+ // instead of being mislabeled as a transport failure with the server's real message lost.
401
+ // submitting is always cleared before the terminal $emit (success or failure) fires, not
402
+ // after, so a listener that reads it or re-triggers submission sees the request as done.
403
+ let formSubmitReq;
404
+ try {
405
+ formSubmitReq = yield this.connect.commitEvent(this.resourceName, commitPayload);
406
+ }
407
+ catch (error) {
408
+ // No applyServerFieldErrors here: a transport failure has no FIELD/PATH, so
409
+ // mapGenesisFieldErrorsToAdditionalErrors would map it to [] and wipe out any
410
+ // inline server errors already on screen from a prior submit, replacing them with
411
+ // nothing. Left to submit-failure listeners, matching the bulk/row-level paths below.
412
+ const errors = [{ CODE: 'SUBMIT_ERROR', TEXT: String(error) }];
413
+ this.submitting = false;
414
+ this.$emit('submit-failure', { payload, errors });
415
+ return;
416
+ }
397
417
  this.submitting = false;
398
418
  if (formSubmitReq.ERROR) {
399
419
  const approvalError = formSubmitReq.ERROR.find((err) => err.CODE === 'APPROVAL_MESSAGE_MISSING');
@@ -459,55 +479,66 @@ let Form = class Form extends LifecycleMixin(FoundationElement) {
459
479
  return;
460
480
  }
461
481
  this.submitting = true;
462
- // Initialize rows as pending, but preserve already successful rows
463
- for (let i = 0; i < items.length; i += 1) {
464
- const currentStatus = this.rowSubmitStatuses.get(i);
465
- // Don't reset rows that were already successfully submitted
466
- if ((currentStatus === null || currentStatus === void 0 ? void 0 : currentStatus.status) !== 'success') {
467
- this.rowSubmitStatuses.set(i, { status: 'pending' });
468
- }
469
- }
470
- // Trigger reactivity by reassigning and emit event
471
- this.rowSubmitStatuses = new Map(this.rowSubmitStatuses);
472
- this.$emit('row-status-changed', {
473
- statuses: this.rowSubmitStatuses,
474
- });
475
482
  const results = {
476
483
  successful: [],
477
484
  failed: [],
478
485
  };
479
- // Submit each item sequentially, skipping already successful rows
480
- /* oxlint-disable no-await-in-loop -- bulk submit must be sequential */
481
- for (let i = 0; i < items.length; i += 1) {
482
- // Skip rows that were already successfully submitted
483
- const currentStatus = this.rowSubmitStatuses.get(i);
484
- if ((currentStatus === null || currentStatus === void 0 ? void 0 : currentStatus.status) === 'success') {
485
- continue;
486
+ // Wraps everything from here through the end of the row loop: buildCommitPayload and the
487
+ // pre-request updateRowStatus call sit outside the per-row try below, so an unexpected
488
+ // throw from either of those (or from the row-init loop above) would otherwise skip
489
+ // `this.submitting = false` entirely and permanently wedge the form — _submit()'s
490
+ // `if (this.submitting) return` guard means every future submit attempt would silently
491
+ // no-op. The per-row try/catch already isolates genuine per-item transport failures; this
492
+ // finally is the backstop for anything else.
493
+ try {
494
+ // Initialize rows as pending, but preserve already successful rows
495
+ for (let i = 0; i < items.length; i += 1) {
496
+ const currentStatus = this.rowSubmitStatuses.get(i);
497
+ // Don't reset rows that were already successfully submitted
498
+ if ((currentStatus === null || currentStatus === void 0 ? void 0 : currentStatus.status) !== 'success') {
499
+ this.rowSubmitStatuses.set(i, { status: 'pending' });
500
+ }
486
501
  }
487
- const item = items[i];
488
- // Filter data to only include fields from UI schema
489
- const commitPayload = this.buildCommitPayload(item, true);
490
- // Update status to submitting
491
- this.updateRowStatus(i, { status: 'submitting' });
492
- try {
493
- const response = yield this.connect.commitEvent(this.resourceName, commitPayload);
494
- if (response.ERROR) {
495
- results.failed.push({ item, index: i, errors: response.ERROR });
496
- this.updateRowStatus(i, { status: 'failed', errors: response.ERROR });
502
+ // Trigger reactivity by reassigning and emit event
503
+ this.rowSubmitStatuses = new Map(this.rowSubmitStatuses);
504
+ this.$emit('row-status-changed', {
505
+ statuses: this.rowSubmitStatuses,
506
+ });
507
+ // Submit each item sequentially, skipping already successful rows
508
+ /* oxlint-disable no-await-in-loop -- bulk submit must be sequential */
509
+ for (let i = 0; i < items.length; i += 1) {
510
+ // Skip rows that were already successfully submitted
511
+ const currentStatus = this.rowSubmitStatuses.get(i);
512
+ if ((currentStatus === null || currentStatus === void 0 ? void 0 : currentStatus.status) === 'success') {
513
+ continue;
497
514
  }
498
- else {
499
- results.successful.push({ item, index: i, response });
500
- this.updateRowStatus(i, { status: 'success', response });
515
+ const item = items[i];
516
+ // Filter data to only include fields from UI schema
517
+ const commitPayload = this.buildCommitPayload(item, true);
518
+ // Update status to submitting
519
+ this.updateRowStatus(i, { status: 'submitting' });
520
+ try {
521
+ const response = yield this.connect.commitEvent(this.resourceName, commitPayload);
522
+ if (response.ERROR) {
523
+ results.failed.push({ item, index: i, errors: response.ERROR });
524
+ this.updateRowStatus(i, { status: 'failed', errors: response.ERROR });
525
+ }
526
+ else {
527
+ results.successful.push({ item, index: i, response });
528
+ this.updateRowStatus(i, { status: 'success', response });
529
+ }
530
+ }
531
+ catch (error) {
532
+ const errors = [{ CODE: 'SUBMIT_ERROR', TEXT: String(error) }];
533
+ results.failed.push({ item, index: i, errors });
534
+ this.updateRowStatus(i, { status: 'failed', errors });
501
535
  }
502
536
  }
503
- catch (error) {
504
- const errors = [{ CODE: 'SUBMIT_ERROR', TEXT: String(error) }];
505
- results.failed.push({ item, index: i, errors });
506
- this.updateRowStatus(i, { status: 'failed', errors });
507
- }
537
+ /* oxlint-enable no-await-in-loop */
538
+ }
539
+ finally {
540
+ this.submitting = false;
508
541
  }
509
- /* oxlint-enable no-await-in-loop */
510
- this.submitting = false;
511
542
  // Emit bulk-specific event with aggregated results
512
543
  this.$emit('bulk-submit-complete', results);
513
544
  // Also emit standard events based on overall result
@@ -802,19 +833,40 @@ let Form = class Form extends LifecycleMixin(FoundationElement) {
802
833
  DETAILS: this.pendingPayload,
803
834
  APPROVAL_MESSAGE: this.approvalMessage,
804
835
  };
805
- const formSubmitReq = yield this.connect.commitEvent(this.resourceName, commitPayload);
836
+ // See the equivalent comment in _performSubmit: the try only wraps the network call, so a
837
+ // failure while handling the response (e.g. closeApprovalModal's approvalModal.close()
838
+ // throwing) can't be reported as a transport failure for a submission that already
839
+ // succeeded — that previously fired submit-failure with payload: null (pendingPayload is
840
+ // cleared by closeApprovalModal before .close() runs) right after submit-success had
841
+ // already fired for the same request, and left the modal visually open despite its state
842
+ // saying otherwise.
843
+ const pendingPayload = this.pendingPayload;
844
+ let formSubmitReq;
845
+ try {
846
+ formSubmitReq = yield this.connect.commitEvent(this.resourceName, commitPayload);
847
+ }
848
+ catch (error) {
849
+ // No applyServerFieldErrors here: no FIELD/PATH, so it would wipe existing inline errors
850
+ // and show nothing in their place.
851
+ const errors = [{ CODE: 'SUBMIT_ERROR', TEXT: String(error) }];
852
+ this.submitting = false;
853
+ this.$emit('submit-failure', {
854
+ payload: pendingPayload,
855
+ errors,
856
+ });
857
+ return;
858
+ }
806
859
  this.submitting = false;
807
860
  if (formSubmitReq.ERROR) {
808
861
  this.applyServerFieldErrors(formSubmitReq.ERROR);
809
862
  this.$emit('submit-failure', {
810
- payload: this.pendingPayload,
863
+ payload: pendingPayload,
811
864
  errors: formSubmitReq.ERROR,
812
865
  });
813
866
  }
814
867
  else {
815
- this.$emit('submit-success', { payload: this.pendingPayload, response: formSubmitReq });
868
+ this.$emit('submit-success', { payload: pendingPayload, response: formSubmitReq });
816
869
  this.closeApprovalModal();
817
- this.pendingPayload = null;
818
870
  }
819
871
  });
820
872
  }
@@ -1,7 +1,12 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import { getDatasource } from '@genesislcap/foundation-comms';
3
3
  import { CriteriaBuilder, ExpressionBuilder } from '@genesislcap/foundation-criteria';
4
+ import { toIntlNumberFormat } from '@genesislcap/foundation-ui';
5
+ import { getDateFormatter } from '@genesislcap/foundation-utils';
4
6
  import { capitalCase } from 'change-case';
7
+ import { isOneOfDate } from '../jsonforms/testers/isDate';
8
+ import { isBigDecimal, isOneOfNumber } from '../jsonforms/testers/isOneOfNumber';
9
+ import { GenesisType } from './types';
5
10
  /**
6
11
  * Builds the review panel's fields grouped into sections by their nearest `Group` layout.
7
12
  * Sections are formed from consecutive runs of the same group title as fields are
@@ -39,8 +44,8 @@ export function buildReviewSections(data, uiSchema, schema) {
39
44
  }
40
45
  };
41
46
  const resolveDisplayValue = (raw, fieldName, options) => __awaiter(this, void 0, void 0, function* () {
42
- var _a, _b, _c;
43
- const displayValue = (_c = (_b = (_a = resolveOptionLabel(raw, options)) !== null && _a !== void 0 ? _a : (yield resolveResourceOptionLabel(raw, options))) !== null && _b !== void 0 ? _b : resolveEnumLabel(raw, fieldName, schema)) !== null && _c !== void 0 ? _c : raw;
47
+ var _a, _b, _c, _d;
48
+ const displayValue = (_d = (_c = (_b = (_a = resolveOptionLabel(raw, options)) !== null && _a !== void 0 ? _a : (yield resolveResourceOptionLabel(raw, options))) !== null && _b !== void 0 ? _b : resolveEnumLabel(raw, fieldName, schema)) !== null && _c !== void 0 ? _c : formatValueByFieldType(raw, fieldName, schema, options)) !== null && _d !== void 0 ? _d : raw;
44
49
  return formatValueForReview(displayValue);
45
50
  });
46
51
  const collect = (element, groupTitle) => {
@@ -170,24 +175,161 @@ export function resolveResourceOptionLabel(raw, options) {
170
175
  * @internal
171
176
  */
172
177
  export function resolveEnumLabel(raw, fieldName, schema) {
173
- var _a, _b, _c, _d;
178
+ var _a, _b, _c;
174
179
  if (typeof raw !== 'string')
175
180
  return null;
181
+ const fieldSchema = resolveFieldSchema(fieldName, schema);
182
+ if (!fieldSchema)
183
+ return null;
184
+ // Matches plain `enum: [...]` or nullable `oneOf: [{ enum: [...] }, { type: 'null' }]`
185
+ const enumValues = (_a = fieldSchema.enum) !== null && _a !== void 0 ? _a : (_c = (_b = fieldSchema.oneOf) === null || _b === void 0 ? void 0 : _b.find((x) => x.enum)) === null || _c === void 0 ? void 0 : _c.enum;
186
+ if (Array.isArray(enumValues) && enumValues.includes(raw)) {
187
+ return capitalCase(raw);
188
+ }
189
+ return null;
190
+ }
191
+ /**
192
+ * Navigates a `/properties/`-separated field name through `schema.properties` to find the
193
+ * JSON schema describing that field, honoring nested Group scopes
194
+ * (`ADDRESS/properties/STREET`). Returns `null` when `schema` has no `properties` (e.g. no
195
+ * JSON schema is available) or the path doesn't resolve.
196
+ * @internal
197
+ */
198
+ function resolveFieldSchema(fieldName, schema) {
199
+ var _a;
176
200
  if (!(schema === null || schema === void 0 ? void 0 : schema.properties))
177
201
  return null;
178
202
  let fieldSchema = schema;
179
203
  for (const part of fieldName.split('/properties/')) {
180
204
  fieldSchema = (_a = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.properties) === null || _a === void 0 ? void 0 : _a[part];
181
205
  }
206
+ return fieldSchema !== null && fieldSchema !== void 0 ? fieldSchema : null;
207
+ }
208
+ /** Minimal `Control` uischema used to drive the `isOneOfNumber`/`isOneOfDate` testers directly
209
+ * against an already-resolved field schema — `schemaMatches` only needs `scope` to be a
210
+ * non-empty string here, since a non-object field schema is tested as-is rather than resolved
211
+ * further via that scope. @internal */
212
+ const FIELD_SCHEMA_TESTER_CONTROL = { type: 'Control', scope: '#' };
213
+ const FIELD_SCHEMA_TESTER_CONTEXT = { config: {}, rootSchema: {} };
214
+ /** Matches `NumberControlRenderer`'s own `defaultOptions`, used whenever the uischema doesn't
215
+ * set `options.formatOptions`. */
216
+ const REVIEW_NUMBER_OPTIONS = {
217
+ maximumFractionDigits: 3,
218
+ minimumFractionDigits: 0,
219
+ };
220
+ /** `NumberField`'s own hardcoded default (`number-field.ts`) — `NumberControlRenderer` never
221
+ * forwards a `locale` from uischema options to the control, so every number field renders in
222
+ * this locale regardless of the user's browser locale. Matching it here (rather than e.g. the
223
+ * date branch's browser-locale resolution) is what "shows the same thing as the field" means
224
+ * for numbers specifically. */
225
+ const NUMBER_FIELD_DEFAULT_LOCALE = 'en-US';
226
+ /** Plain decimal or scientific notation only — matches what `Number()`/`Intl.NumberFormat`
227
+ * parse correctly. Excludes anything else (ids, free text) that a BigDecimal-described schema
228
+ * might still carry as bad data. */
229
+ const NUMERIC_STRING = /^-?\d+(\.\d+)?([eE][+-]?\d+)?$/;
230
+ // No `timeZone` override: `DateControlRenderer` builds its `<input>` value from
231
+ // `new Date(x.control.data)`'s local getters (`getFullYear`/`getMonth`/`getDate`/...), so
232
+ // formatting here must default to the runtime's local time zone too, or the review panel
233
+ // disagrees with the field the user just filled in for anyone not in UTC.
234
+ const REVIEW_DATE_OPTIONS = {
235
+ year: 'numeric',
236
+ month: '2-digit',
237
+ day: '2-digit',
238
+ };
239
+ const REVIEW_DATETIME_OPTIONS = Object.assign(Object.assign({}, REVIEW_DATE_OPTIONS), { hour: '2-digit', minute: '2-digit' });
240
+ /**
241
+ * The runtime's default `Intl` locale — the same one `Intl.DateTimeFormat(undefined, ...)`
242
+ * (and, in a browser, `<input type="date">`'s native rendering) resolves to. `getDateFormatter`
243
+ * defaults to a hardcoded `en-GB` when passed `undefined`, which would pin review to
244
+ * DD/MM/YYYY regardless of what locale the field actually renders in for the user.
245
+ * @internal
246
+ */
247
+ function resolveDefaultLocale() {
248
+ return new Intl.DateTimeFormat().resolvedOptions().locale;
249
+ }
250
+ /**
251
+ * Formats a raw value for the review panel by the same renderer type
252
+ * (`NumberControlRenderer`/`DateControlRenderer`) the form would use for this field. Numbers
253
+ * are formatted with `toIntlNumberFormat` (the same precision-safe path `NumberField` itself
254
+ * uses); dates/datetimes with `getDateFormatter`, adding hours/minutes for `GenesisType.DATETIME`
255
+ * fields. Returns `null` for non-number/date fields, or when no JSON schema is available to
256
+ * determine the field's type.
257
+ *
258
+ * `uischemaOptions` (the Control element's `options`, as passed to `resolveOptionLabel` etc.)
259
+ * carries the same display-affecting settings `NumberControlRenderer` reads directly —
260
+ * `formatOptions`, `withoutFormatting`, `prefix`, `suffix` — so a field configured with e.g.
261
+ * `withoutFormatting: true` or a custom `formatOptions.maximumFractionDigits` doesn't disagree
262
+ * with review over how many digits it shows.
263
+ *
264
+ * A `raw` array against an array-typed field schema (`{ type: 'array', items: {...} }`, per
265
+ * `isArray`'s convention) formats each element against `items` individually — e.g. an array of
266
+ * DATE values — falling back to the unformatted element for any that don't format, so
267
+ * `formatValueForReview`'s comma-join still sees a flat array of primitives. `uischemaOptions`
268
+ * applies to every element, matching how one Control renders every item in the array.
269
+ * @internal
270
+ */
271
+ export function formatValueByFieldType(raw, fieldName, schema, uischemaOptions) {
272
+ const fieldSchema = resolveFieldSchema(fieldName, schema);
273
+ if (!fieldSchema || raw === undefined || raw === null || raw === '' || Number.isNaN(raw))
274
+ return null;
275
+ if (Array.isArray(raw) && fieldSchema.items) {
276
+ return raw.map((item) => { var _a; return (_a = formatScalarByFieldSchema(item, fieldSchema.items, uischemaOptions)) !== null && _a !== void 0 ? _a : item; });
277
+ }
278
+ return formatScalarByFieldSchema(raw, fieldSchema, uischemaOptions);
279
+ }
280
+ /** Formats a single value against an already-resolved (non-array) field schema. @internal */
281
+ function formatScalarByFieldSchema(raw, fieldSchema, uischemaOptions) {
282
+ var _a, _b;
182
283
  if (!fieldSchema)
183
284
  return null;
184
- // Matches plain `enum: [...]` or nullable `oneOf: [{ enum: [...] }, { type: 'null' }]`
185
- const enumValues = (_b = fieldSchema.enum) !== null && _b !== void 0 ? _b : (_d = (_c = fieldSchema.oneOf) === null || _c === void 0 ? void 0 : _c.find((x) => x.enum)) === null || _d === void 0 ? void 0 : _d.enum;
186
- if (Array.isArray(enumValues) && enumValues.includes(raw)) {
187
- return capitalCase(raw);
285
+ if (isOneOfDate(FIELD_SCHEMA_TESTER_CONTROL, fieldSchema, FIELD_SCHEMA_TESTER_CONTEXT)) {
286
+ // Mirrors DateControlRenderer's own `!x.control.data` check, which treats a falsy
287
+ // timestamp (including 0) as "no value" and renders the input blank rather than
288
+ // 01/01/1970 — falling through to raw here avoids fabricating that date.
289
+ if (!raw)
290
+ return null;
291
+ // Mirrors typeSwitch's exact control flow (DateControlRenderer.ts), which short-circuits
292
+ // on `hasOwnProperty('oneOf')`: once `oneOf` is present it ONLY looks at branch-level
293
+ // `genesisType`, ignoring the field's own top-level `genesisType` entirely — it is not an
294
+ // OR of both. That matters because the server's actual nullable-field shape (see
295
+ // foundation-utils' `ORDER_DATETIME` fixture) puts `genesisType: 'DATETIME'` at the top
296
+ // level with bare, typeless `oneOf` branches — which typeSwitch (and so this) resolves to
297
+ // date-only, not datetime.
298
+ const isDatetime = fieldSchema.hasOwnProperty('oneOf')
299
+ ? fieldSchema.oneOf.some((branch) => branch.genesisType === GenesisType.DATETIME)
300
+ : fieldSchema.genesisType === GenesisType.DATETIME;
301
+ const formatted = getDateFormatter(resolveDefaultLocale(), isDatetime ? REVIEW_DATETIME_OPTIONS : REVIEW_DATE_OPTIONS)({ value: raw });
302
+ return formatted || null;
303
+ }
304
+ if (isOneOfNumber(FIELD_SCHEMA_TESTER_CONTROL, fieldSchema, FIELD_SCHEMA_TESTER_CONTEXT)) {
305
+ const isBigDecimalField = isBigDecimal(fieldSchema) ||
306
+ ((_a = fieldSchema.oneOf) === null || _a === void 0 ? void 0 : _a.some((branch) => isBigDecimal(branch)));
307
+ // BigDecimals arrive as strings and can carry Java's `toString()` scientific notation
308
+ // (e.g. `1E-7`) — guard against that (and other non-numeric bad data) up front, same as
309
+ // before, rather than handing it to `Intl`/`Number()` and rendering "NaN".
310
+ if (isBigDecimalField && (typeof raw !== 'string' || !NUMERIC_STRING.test(raw))) {
311
+ return null;
312
+ }
313
+ const withoutFormatting = !!(uischemaOptions === null || uischemaOptions === void 0 ? void 0 : uischemaOptions.withoutFormatting);
314
+ const formatOptions = (_b = uischemaOptions === null || uischemaOptions === void 0 ? void 0 : uischemaOptions.formatOptions) !== null && _b !== void 0 ? _b : REVIEW_NUMBER_OPTIONS;
315
+ // `NumberField`'s `value` is always a string internally, and `withFormatting: false` shows
316
+ // it completely unformatted (no grouping, no fraction-digit rounding) — matching that here
317
+ // means skipping `toIntlNumberFormat` entirely rather than applying it and stripping commas
318
+ // back out.
319
+ const core = withoutFormatting
320
+ ? String(raw)
321
+ : toIntlNumberFormat(String(raw), NUMBER_FIELD_DEFAULT_LOCALE, formatOptions);
322
+ if (!core)
323
+ return null;
324
+ return applyAffixes(core, uischemaOptions);
188
325
  }
189
326
  return null;
190
327
  }
328
+ /** Wraps a formatted value with `options.prefix`/`options.suffix`, matching the affix text
329
+ * `AffixMixin` (shared by `NumberField`/`TextField`) renders alongside the control. @internal */
330
+ function applyAffixes(value, options) {
331
+ return [options === null || options === void 0 ? void 0 : options.prefix, value, options === null || options === void 0 ? void 0 : options.suffix].filter(Boolean).join(' ');
332
+ }
191
333
  /**
192
334
  * Navigates a `/properties/`-separated path in data to support nested object scopes
193
335
  * such as `ADDRESS/properties/STREET` produced by Group layout UI schemas.
@@ -1970,6 +1970,29 @@ declare const Form_base: (new (...args: any[]) => {
1970
1970
  focus(options?: FocusOptions): void;
1971
1971
  }) & typeof FoundationElement;
1972
1972
 
1973
+ /**
1974
+ * Formats a raw value for the review panel by the same renderer type
1975
+ * (`NumberControlRenderer`/`DateControlRenderer`) the form would use for this field. Numbers
1976
+ * are formatted with `toIntlNumberFormat` (the same precision-safe path `NumberField` itself
1977
+ * uses); dates/datetimes with `getDateFormatter`, adding hours/minutes for `GenesisType.DATETIME`
1978
+ * fields. Returns `null` for non-number/date fields, or when no JSON schema is available to
1979
+ * determine the field's type.
1980
+ *
1981
+ * `uischemaOptions` (the Control element's `options`, as passed to `resolveOptionLabel` etc.)
1982
+ * carries the same display-affecting settings `NumberControlRenderer` reads directly —
1983
+ * `formatOptions`, `withoutFormatting`, `prefix`, `suffix` — so a field configured with e.g.
1984
+ * `withoutFormatting: true` or a custom `formatOptions.maximumFractionDigits` doesn't disagree
1985
+ * with review over how many digits it shows.
1986
+ *
1987
+ * A `raw` array against an array-typed field schema (`{ type: 'array', items: {...} }`, per
1988
+ * `isArray`'s convention) formats each element against `items` individually — e.g. an array of
1989
+ * DATE values — falling back to the unformatted element for any that don't format, so
1990
+ * `formatValueForReview`'s comma-join still sees a flat array of primitives. `uischemaOptions`
1991
+ * applies to every element, matching how one Control renders every item in the array.
1992
+ * @internal
1993
+ */
1994
+ export declare function formatValueByFieldType(raw: any, fieldName: string, schema: any, uischemaOptions?: any): string | unknown[] | null;
1995
+
1973
1996
  /**
1974
1997
  * Converts a raw field value to a display string for the review panel.
1975
1998
  * Arrays of primitives are comma-joined; arrays of objects and plain objects
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/foundation-forms",
3
3
  "description": "Genesis Foundation Forms",
4
- "version": "15.3.2",
4
+ "version": "15.3.3",
5
5
  "sideEffects": false,
6
6
  "license": "SEE LICENSE IN license.txt",
7
7
  "main": "dist/esm/index.js",
@@ -59,13 +59,13 @@
59
59
  }
60
60
  },
61
61
  "devDependencies": {
62
- "@genesislcap/foundation-testing": "15.3.2",
63
- "@genesislcap/genx": "15.3.2",
64
- "@genesislcap/rollup-builder": "15.3.2",
65
- "@genesislcap/ts-builder": "15.3.2",
66
- "@genesislcap/uvu-playwright-builder": "15.3.2",
67
- "@genesislcap/vite-builder": "15.3.2",
68
- "@genesislcap/webpack-builder": "15.3.2",
62
+ "@genesislcap/foundation-testing": "15.3.3",
63
+ "@genesislcap/genx": "15.3.3",
64
+ "@genesislcap/rollup-builder": "15.3.3",
65
+ "@genesislcap/ts-builder": "15.3.3",
66
+ "@genesislcap/uvu-playwright-builder": "15.3.3",
67
+ "@genesislcap/vite-builder": "15.3.3",
68
+ "@genesislcap/webpack-builder": "15.3.3",
69
69
  "@types/json-schema": "^7.0.11",
70
70
  "@types/papaparse": "^5.3.14"
71
71
  },
@@ -82,12 +82,12 @@
82
82
  }
83
83
  },
84
84
  "dependencies": {
85
- "@genesislcap/foundation-comms": "15.3.2",
86
- "@genesislcap/foundation-criteria": "15.3.2",
87
- "@genesislcap/foundation-logger": "15.3.2",
88
- "@genesislcap/foundation-notifications": "15.3.2",
89
- "@genesislcap/foundation-ui": "15.3.2",
90
- "@genesislcap/foundation-utils": "15.3.2",
85
+ "@genesislcap/foundation-comms": "15.3.3",
86
+ "@genesislcap/foundation-criteria": "15.3.3",
87
+ "@genesislcap/foundation-logger": "15.3.3",
88
+ "@genesislcap/foundation-notifications": "15.3.3",
89
+ "@genesislcap/foundation-ui": "15.3.3",
90
+ "@genesislcap/foundation-utils": "15.3.3",
91
91
  "@json-schema-tools/dereferencer": "^1.6.1",
92
92
  "@jsonforms/core": "^3.2.1",
93
93
  "@microsoft/fast-components": "2.30.6",
@@ -109,5 +109,5 @@
109
109
  "access": "public"
110
110
  },
111
111
  "customElements": "dist/custom-elements.json",
112
- "gitHead": "9b3b32a9d7642518469a81d1ed9cc79b3a6c0ece"
112
+ "gitHead": "f02b0631f64efa5fa842ba5f44028246fad7252c"
113
113
  }