@genesislcap/foundation-forms 14.488.1 → 14.488.2-FUI-2571.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.
Files changed (37) hide show
  1. package/dist/custom-elements.json +1381 -721
  2. package/dist/dts/form.d.ts +77 -0
  3. package/dist/dts/form.d.ts.map +1 -1
  4. package/dist/dts/form.styles.d.ts.map +1 -1
  5. package/dist/dts/form.template.d.ts.map +1 -1
  6. package/dist/dts/index.d.ts +3 -0
  7. package/dist/dts/index.d.ts.map +1 -1
  8. package/dist/dts/jsonforms/renderers/CategorizationWrapperRenderer.d.ts.map +1 -1
  9. package/dist/dts/react.d.ts +10 -0
  10. package/dist/dts/review.d.ts +34 -0
  11. package/dist/dts/review.d.ts.map +1 -0
  12. package/dist/dts/review.styles.d.ts +3 -0
  13. package/dist/dts/review.styles.d.ts.map +1 -0
  14. package/dist/dts/review.template.d.ts +6 -0
  15. package/dist/dts/review.template.d.ts.map +1 -0
  16. package/dist/dts/utils/index.d.ts +1 -0
  17. package/dist/dts/utils/index.d.ts.map +1 -1
  18. package/dist/dts/utils/review-utils.d.ts +73 -0
  19. package/dist/dts/utils/review-utils.d.ts.map +1 -0
  20. package/dist/dts/utils/schema-utils.d.ts +12 -0
  21. package/dist/dts/utils/schema-utils.d.ts.map +1 -1
  22. package/dist/esm/form.js +120 -1
  23. package/dist/esm/form.styles.js +9 -2
  24. package/dist/esm/form.template.js +58 -24
  25. package/dist/esm/index.js +3 -0
  26. package/dist/esm/jsonforms/renderers/CategorizationWrapperRenderer.js +1 -45
  27. package/dist/esm/review.js +63 -0
  28. package/dist/esm/review.styles.js +93 -0
  29. package/dist/esm/review.template.js +38 -0
  30. package/dist/esm/utils/index.js +1 -0
  31. package/dist/esm/utils/review-utils.js +269 -0
  32. package/dist/esm/utils/schema-utils.js +48 -0
  33. package/dist/foundation-forms.api.json +1229 -114
  34. package/dist/foundation-forms.d.ts +200 -0
  35. package/dist/react.cjs +7 -0
  36. package/dist/react.mjs +6 -0
  37. package/package.json +15 -15
@@ -179,6 +179,27 @@ export declare type ArrayRendererOptions = {
179
179
  showRowStatusIndicator?: boolean;
180
180
  };
181
181
 
182
+ /**
183
+ * Flattens `buildReviewSections` output into a single ordered list.
184
+ * Section titles are prepended to field labels as "Title — Field".
185
+ */
186
+ export declare function buildReviewFields(data: Record<string, any>, uiSchema: any, schema: any): Promise<ReviewField[]>;
187
+
188
+ /**
189
+ * Builds the review panel's fields grouped into sections by their nearest `Group` layout.
190
+ * Ungrouped fields are collected into a single section with a `null` title (rendered with
191
+ * a placeholder heading). Falls back to a flat, single ungrouped section when no UI schema
192
+ * is available.
193
+ *
194
+ * Async because connected-select fields backed by `options.allOptionsResourceName` (rather
195
+ * than a static `options.data`) resolve their display label with a criteria-filtered fetch
196
+ * — see `resolveResourceOptionLabel`. The UI schema is walked synchronously to collect one
197
+ * value-resolution promise per field (preserving encounter order), then all promises settle
198
+ * in parallel via `Promise.all` before fields are added to their sections — so a slow fetch
199
+ * for one field can't reorder fields that resolved faster.
200
+ */
201
+ export declare function buildReviewSections(data: Record<string, any>, uiSchema: any, schema: any): Promise<ReviewSection[]>;
202
+
182
203
  /**
183
204
  * Tracks the submission status and result for a single row in bulk insert mode.
184
205
  * @public
@@ -313,6 +334,12 @@ export declare type CategorizationRendererOptions = {
313
334
  */
314
335
  export declare type ChildUiSchemaResolver = (index: number, rowData: any, formData: any) => UiSchema;
315
336
 
337
+ /**
338
+ * Recursively walks a UI schema element, collecting visible Control fields into `out`.
339
+ * Passes the nearest Group label down so children are labelled "Group — Field".
340
+ */
341
+ export declare function collectReviewFields(element: any, data: any, out: ReviewField[], groupLabel: string | undefined, schema: any): void;
342
+
316
343
  /** @internal */
317
344
  export declare const comboboxRendererStyles: (prefix?: string) => string;
318
345
 
@@ -596,6 +623,13 @@ export declare function extractFieldsFromUiSchema(uiSchema: UiSchema): Array<{
596
623
  isHidden: boolean;
597
624
  }>;
598
625
 
626
+ /**
627
+ * Filters review sections down to fields whose label or value contains `query`
628
+ * (case-insensitive). Sections left with no matching fields are dropped entirely.
629
+ * Returns `sections` unchanged when `query` is blank.
630
+ */
631
+ export declare function filterReviewSections(sections: ReviewSection[], query: string): ReviewSection[];
632
+
599
633
  /**
600
634
  * Foundation filters component for automatically generated filters based on json schema
601
635
  * obtained from the api, supplied initial data or supplied JSON schema.
@@ -1196,6 +1230,12 @@ export declare class Form extends Form_base {
1196
1230
  * @internal
1197
1231
  */
1198
1232
  serverFieldErrors: ErrorObject[];
1233
+ /**
1234
+ * Reference to the json-forms child element — used to read live validation
1235
+ * errors at submit time so review mode never activates when the form is invalid.
1236
+ * @internal
1237
+ */
1238
+ jsonFormsEl: any;
1199
1239
  /**
1200
1240
  * Stores the approval message entered by the user.
1201
1241
  * @internal
@@ -1319,6 +1359,24 @@ export declare class Form extends Form_base {
1319
1359
  * @public
1320
1360
  */
1321
1361
  bulkInsert: boolean;
1362
+ /**
1363
+ * Text to appear on submit button
1364
+ * @default Submit
1365
+ * @public
1366
+ */
1367
+ submitButtonText: string;
1368
+ /**
1369
+ * Text to appear on submit button in bulk insert mode
1370
+ * @default Submit AllS
1371
+ * @public
1372
+ */
1373
+ bulkSubmitButtonText: string;
1374
+ /**
1375
+ * Text to appear on reset button
1376
+ * @default Submit
1377
+ * @public
1378
+ */
1379
+ resetButtonText: string;
1322
1380
  /**
1323
1381
  * Minimum number of items required in bulk insert mode.
1324
1382
  * @public
@@ -1339,16 +1397,68 @@ export declare class Form extends Form_base {
1339
1397
  * @internal
1340
1398
  */
1341
1399
  private userProvidedUiSchema;
1400
+ /**
1401
+ * When enabled, clicking submit with no validation errors shows a read-only preview
1402
+ * of the form data before the final submission.
1403
+ * @public
1404
+ */
1405
+ showSubmitReview: boolean;
1406
+ /**
1407
+ * Text to appear on reset button
1408
+ * @public
1409
+ */
1410
+ reviewButtonText: string;
1411
+ /**
1412
+ * Heading shown at the top of the review panel.
1413
+ * @public
1414
+ */
1415
+ reviewHeading: string;
1416
+ /**
1417
+ * Name of a top-level data field whose value is shown as an identifier next to the
1418
+ * review heading (e.g. a record's primary key). No identifier is shown when unset.
1419
+ * @public
1420
+ */
1421
+ reviewIdField: string;
1342
1422
  /**
1343
1423
  * Tracks the submission status for each row in bulk insert mode.
1344
1424
  * Key is the row index, value is the status object.
1345
1425
  * @public
1346
1426
  */
1347
1427
  rowSubmitStatuses: Map<number, BulkRowStatus>;
1428
+ /**
1429
+ * Whether the form is currently showing the submit-review preview panel.
1430
+ * @internal
1431
+ */
1432
+ reviewMode: boolean;
1433
+ /**
1434
+ * Field label/value pairs rendered in the review panel, grouped into sections.
1435
+ * @internal
1436
+ */
1437
+ reviewSections: ReviewSection[];
1438
+ /**
1439
+ * Value of `reviewIdField` resolved from the current form data, if set.
1440
+ * @internal
1441
+ */
1442
+ get reviewRecordId(): string | undefined;
1348
1443
  /**
1349
1444
  * @internal
1350
1445
  */
1351
1446
  _submit(): Promise<void>;
1447
+ /**
1448
+ * Called from the review panel to go back to the form.
1449
+ * @internal
1450
+ */
1451
+ backFromReview(): void;
1452
+ /**
1453
+ * Called from the review panel submit button to perform the actual submission.
1454
+ * @internal
1455
+ */
1456
+ _submitFromReview(): Promise<void>;
1457
+ /**
1458
+ * Performs the actual API submission after review (or directly when review is disabled).
1459
+ * @internal
1460
+ */
1461
+ private _performSubmit;
1352
1462
  /**
1353
1463
  * Handles bulk insert submission by iterating through items and submitting each separately.
1354
1464
  * Updates rowSubmitStatuses to provide row-level feedback.
@@ -1837,6 +1947,13 @@ declare const Form_base: (new (...args: any[]) => {
1837
1947
  focus(options?: FocusOptions): void;
1838
1948
  }) & typeof FoundationElement;
1839
1949
 
1950
+ /**
1951
+ * Converts a raw field value to a display string for the review panel.
1952
+ * Arrays of primitives are comma-joined; arrays of objects and plain objects
1953
+ * are rendered as readable `key: value` lines.
1954
+ */
1955
+ export declare function formatValueForReview(value: any): string;
1956
+
1840
1957
  /**
1841
1958
  * Detail payload for the `data-change` event fired by {@link Form} and `JSONForms` whenever
1842
1959
  * the bound form data changes.
@@ -1862,6 +1979,12 @@ export declare type FormDataChangeEventDetail = {
1862
1979
  path?: string;
1863
1980
  };
1864
1981
 
1982
+ /** @internal */
1983
+ export declare const foundationFormReviewStyles: ElementStyles;
1984
+
1985
+ /** @internal */
1986
+ export declare const foundationFormReviewTemplate: ViewTemplate<Review, any>;
1987
+
1865
1988
  /** @internal */
1866
1989
  export declare const foundationFormStyles: ElementStyles;
1867
1990
 
@@ -1939,9 +2062,18 @@ export declare enum GenesisType {
1939
2062
  */
1940
2063
  export declare const getAnyOfErrorMessage: (errors: Array<any> | undefined, schema: any, controlPath: string | undefined, uiCustomMsg?: string) => string;
1941
2064
 
2065
+ /**
2066
+ * Navigates a `/properties/`-separated path in data to support nested object scopes
2067
+ * such as `ADDRESS/properties/STREET` produced by Group layout UI schemas.
2068
+ */
2069
+ export declare function getDataValueAtPath(data: any, fieldName: string): any;
2070
+
1942
2071
  /** @internal */
1943
2072
  export declare const getPrefixedForm: (prefix: any) => ViewTemplate<Form, any>;
1944
2073
 
2074
+ /** @internal */
2075
+ export declare const getPrefixedReview: (prefix: any) => ViewTemplate<Review, any>;
2076
+
1945
2077
  /**
1946
2078
  * Fixed height (CSS value) for vertical categorization when `layout` is `{ type: 'vertical'; height?: string }`.
1947
2079
  * @public
@@ -2298,6 +2430,74 @@ export declare type RendererEntry = {
2298
2430
  */
2299
2431
  export declare const renderers: any[];
2300
2432
 
2433
+ /**
2434
+ * For plain enum combobox fields (no options.data), applies the same `capitalCase`
2435
+ * transform the renderer uses — e.g. `SEMI_ANNUAL` → `Semi Annual`.
2436
+ * Navigates the JSON schema via the fieldName path to confirm the field is an enum
2437
+ * before transforming. Returns `null` for non-enum fields.
2438
+ */
2439
+ export declare function resolveEnumLabel(raw: any, fieldName: string, schema: any): string | null;
2440
+
2441
+ /**
2442
+ * Looks up the display label for a raw value from `options.data` (used by segmented,
2443
+ * radio group, connected-select, and enum-with-explicit-data renderers). Honors
2444
+ * `options.valueField`/`options.labelField` when set, defaulting to `value`/`label`.
2445
+ * Returns `null` when no match found.
2446
+ */
2447
+ export declare function resolveOptionLabel(raw: any, options: any): string | null;
2448
+
2449
+ /**
2450
+ * Resolves the display label for a connected-select field backed by
2451
+ * `options.allOptionsResourceName` (a Data Server/Request Server resource) rather than a
2452
+ * static `options.data` array — e.g. `ConnectedSelectControlRenderer` in async/remote mode.
2453
+ * Fetches a single row via a criteria-filtered snapshot matching `valueField === raw`,
2454
+ * then reads `labelField` off the returned row. Returns `null` when there's no resource
2455
+ * to query, the resource can't be reached, or no row matches.
2456
+ */
2457
+ export declare function resolveResourceOptionLabel(raw: any, options: any): Promise<string | null>;
2458
+
2459
+ /**
2460
+ * Read-only preview panel shown by `<foundation-form>` when `show-submit-review` is enabled.
2461
+ * Renders the reviewed data grouped into sections with a header and a filter field.
2462
+ * @public
2463
+ */
2464
+ export declare class Review extends FASTElement {
2465
+ prefix: string;
2466
+ /**
2467
+ * Title shown in the review header.
2468
+ * @public
2469
+ */
2470
+ heading: string;
2471
+ /**
2472
+ * Optional identifier shown next to the heading, e.g. a record's primary key.
2473
+ * @public
2474
+ */
2475
+ recordId: string;
2476
+ /**
2477
+ * Sections of label/value pairs to render, grouped by their nearest UI schema `Group`.
2478
+ * @public
2479
+ */
2480
+ sections: ReviewSection[];
2481
+ /**
2482
+ * Free-text query filtering fields by label or value. Sections with no matching
2483
+ * fields are hidden.
2484
+ * @internal
2485
+ */
2486
+ filterText: string;
2487
+ /** @internal */
2488
+ get filteredSections(): ReviewSection[];
2489
+ }
2490
+
2491
+ export declare type ReviewField = {
2492
+ label: string;
2493
+ value: string;
2494
+ };
2495
+
2496
+ export declare type ReviewSection = {
2497
+ title: string | null;
2498
+ fields: ReviewField[];
2499
+ };
2500
+
2301
2501
  /**
2302
2502
  * Detail payload for the `row-status-changed` event fired by {@link Form} whenever the
2303
2503
  * submission status of one or all bulk insert rows changes.
package/dist/react.cjs CHANGED
@@ -17,6 +17,7 @@ const { StepperWrapper: StepperWrapperWC } = require('./esm/jsonforms/renderers/
17
17
  const { VerticalCategorizationWrapper: VerticalCategorizationWrapperWC } = require('./esm/jsonforms/renderers/VerticalCategorizationWrapperRenderer.js');
18
18
  const { DispatchRenderer: DispatchRendererWC } = require('./esm/jsonforms/renderers/dispatch-renderer.js');
19
19
  const { FoundationReactSlot: FoundationReactSlotWC } = require('./esm/jsonforms/renderers/foundation-react-slot.js');
20
+ const { Review: ReviewWC } = require('./esm/review.js');
20
21
 
21
22
  function _mergeRefs(...refs) {
22
23
  return (value) => {
@@ -104,6 +105,11 @@ const Form = React.forwardRef(function Form(props, ref) {
104
105
  return React.createElement(customElements.getName(FormWC) ?? 'foundation-form', { ...rest, ref: _mergeRefs(_innerRef, ref) }, children);
105
106
  });
106
107
 
108
+ const Review = React.forwardRef(function Review(props, ref) {
109
+ const { children, ...rest } = props;
110
+ return React.createElement(customElements.getName(ReviewWC) ?? 'foundation-form-review', { ...rest, ref }, children);
111
+ });
112
+
107
113
  const Filters = React.forwardRef(function Filters(props, ref) {
108
114
  const { children, ...rest } = props;
109
115
  return React.createElement(customElements.getName(FiltersWC) ?? 'foundation-filters', { ...rest, ref }, children);
@@ -168,6 +174,7 @@ const FoundationReactSlot = React.forwardRef(function FoundationReactSlot(props,
168
174
 
169
175
  module.exports = {
170
176
  Form,
177
+ Review,
171
178
  Filters,
172
179
  JSONForms,
173
180
  ArrayListWrapper,
package/dist/react.mjs CHANGED
@@ -15,6 +15,7 @@ import { StepperWrapper as StepperWrapperWC } from './esm/jsonforms/renderers/St
15
15
  import { VerticalCategorizationWrapper as VerticalCategorizationWrapperWC } from './esm/jsonforms/renderers/VerticalCategorizationWrapperRenderer.js';
16
16
  import { DispatchRenderer as DispatchRendererWC } from './esm/jsonforms/renderers/dispatch-renderer.js';
17
17
  import { FoundationReactSlot as FoundationReactSlotWC } from './esm/jsonforms/renderers/foundation-react-slot.js';
18
+ import { Review as ReviewWC } from './esm/review.js';
18
19
 
19
20
  function _mergeRefs(...refs) {
20
21
  return (value) => {
@@ -102,6 +103,11 @@ export const Form = React.forwardRef(function Form(props, ref) {
102
103
  return React.createElement(customElements.getName(FormWC) ?? 'foundation-form', { ...rest, ref: _mergeRefs(_innerRef, ref) }, children);
103
104
  });
104
105
 
106
+ export const Review = React.forwardRef(function Review(props, ref) {
107
+ const { children, ...rest } = props;
108
+ return React.createElement(customElements.getName(ReviewWC) ?? 'foundation-form-review', { ...rest, ref }, children);
109
+ });
110
+
105
111
  export const Filters = React.forwardRef(function Filters(props, ref) {
106
112
  const { children, ...rest } = props;
107
113
  return React.createElement(customElements.getName(FiltersWC) ?? 'foundation-filters', { ...rest, ref }, children);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/foundation-forms",
3
3
  "description": "Genesis Foundation Forms",
4
- "version": "14.488.1",
4
+ "version": "14.488.2-FUI-2571.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": "14.488.1",
63
- "@genesislcap/genx": "14.488.1",
64
- "@genesislcap/rollup-builder": "14.488.1",
65
- "@genesislcap/ts-builder": "14.488.1",
66
- "@genesislcap/uvu-playwright-builder": "14.488.1",
67
- "@genesislcap/vite-builder": "14.488.1",
68
- "@genesislcap/webpack-builder": "14.488.1",
62
+ "@genesislcap/foundation-testing": "14.488.2-FUI-2571.3",
63
+ "@genesislcap/genx": "14.488.2-FUI-2571.3",
64
+ "@genesislcap/rollup-builder": "14.488.2-FUI-2571.3",
65
+ "@genesislcap/ts-builder": "14.488.2-FUI-2571.3",
66
+ "@genesislcap/uvu-playwright-builder": "14.488.2-FUI-2571.3",
67
+ "@genesislcap/vite-builder": "14.488.2-FUI-2571.3",
68
+ "@genesislcap/webpack-builder": "14.488.2-FUI-2571.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": "14.488.1",
86
- "@genesislcap/foundation-criteria": "14.488.1",
87
- "@genesislcap/foundation-logger": "14.488.1",
88
- "@genesislcap/foundation-notifications": "14.488.1",
89
- "@genesislcap/foundation-ui": "14.488.1",
90
- "@genesislcap/foundation-utils": "14.488.1",
85
+ "@genesislcap/foundation-comms": "14.488.2-FUI-2571.3",
86
+ "@genesislcap/foundation-criteria": "14.488.2-FUI-2571.3",
87
+ "@genesislcap/foundation-logger": "14.488.2-FUI-2571.3",
88
+ "@genesislcap/foundation-notifications": "14.488.2-FUI-2571.3",
89
+ "@genesislcap/foundation-ui": "14.488.2-FUI-2571.3",
90
+ "@genesislcap/foundation-utils": "14.488.2-FUI-2571.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": "59f08be328928035b4591fa97da580cc650f96c3"
112
+ "gitHead": "faafa39ff0c79190190672db8d6f26b6e51bd642"
113
113
  }