@abgov/jsonforms-components 2.1.5 → 2.2.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/index.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as runtime from 'react/jsx-runtime';
2
2
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
3
3
  import React, { createContext, useContext, useReducer, useMemo, useEffect, useState, useRef, useCallback } from 'react';
4
- import { GoAFormItem, GoAInput, GoATextArea, GoACallout, GoAInputDate, GoAInputDateTime, GoAInputTime, GoARadioGroup, GoARadioItem, GoACheckbox, GoAIcon, GoAGrid, GoAFormStepper, GoAFormStep, GoAPages, GoAButton, GoAModal, GoAButtonGroup, GoATable, GoAIconButton, GoAFileUploadInput, GoACircularProgress, GoAContainer, GoADropdown, GoADropdownItem, GoADetails, GoASpinner } from '@abgov/react-components';
4
+ import { GoAFormItem, GoAInput, GoATextArea, GoACallout, GoAInputDate, GoAInputDateTime, GoAInputTime, GoARadioGroup, GoARadioItem, GoACheckbox, GoAIcon, GoAGrid, GoAFormStepper, GoAFormStep, GoAPages, GoAButton, GoAModal, GoAButtonGroup, GoATable, GoABadge, GoAIconButton, GoAFileUploadInput, GoACircularProgress, GoAContainer, GoADropdown, GoADropdownItem, GoADetails, GoASpinner } from '@abgov/react-components';
5
5
  import styled from 'styled-components';
6
6
  import axios from 'axios';
7
7
  import get$1 from 'lodash/get';
@@ -5435,7 +5435,9 @@ let _$6 = t => t,
5435
5435
  _t14$1,
5436
5436
  _t15$1,
5437
5437
  _t16$1,
5438
- _t17$1;
5438
+ _t17$1,
5439
+ _t18$1,
5440
+ _t19$1;
5439
5441
  const ReviewItem = styled.div(_t$6 || (_t$6 = _$6`
5440
5442
  display: flex;
5441
5443
  flex-direction: column;
@@ -5536,6 +5538,13 @@ const TableReviewPageTitleRow = styled.div(_t16$1 || (_t16$1 = _$6`
5536
5538
  const TableReviewCategoryLabel = styled.h3(_t17$1 || (_t17$1 = _$6`
5537
5539
  color: var(--goa-color-text-secondary) !important;
5538
5540
  `));
5541
+ const TocStatus = styled.td(_t18$1 || (_t18$1 = _$6`
5542
+ width: var(--goa-space-xl);
5543
+ padding-right: var(--goa-space-xl);
5544
+ `));
5545
+ const TocPageRef = styled.td(_t19$1 || (_t19$1 = _$6`
5546
+ padding-left: var(--goa-space-xl);
5547
+ `));
5539
5548
 
5540
5549
  class ContextProviderClass {
5541
5550
  addDataByUrl(key, url, processDataFunction, token) {
@@ -6485,6 +6494,55 @@ const BackButton = ({
6485
6494
  });
6486
6495
  };
6487
6496
 
6497
+ var PageStatus;
6498
+ (function (PageStatus) {
6499
+ PageStatus["Complete"] = "Completed";
6500
+ PageStatus["Incomplete"] = "Incomplete";
6501
+ PageStatus["NotStarted"] = "Not started";
6502
+ })(PageStatus || (PageStatus = {}));
6503
+ const getPageStatus = category => {
6504
+ const status = category.isVisited ? category.isCompleted && category.isValid ? PageStatus.Complete : PageStatus.Incomplete : PageStatus.NotStarted;
6505
+ const badgeType = status === PageStatus.Complete ? 'success' : 'information';
6506
+ return jsx(GoABadge, {
6507
+ type: badgeType,
6508
+ content: status,
6509
+ ariaLabel: status
6510
+ });
6511
+ };
6512
+ /* eslint-disable jsx-a11y/anchor-is-valid */
6513
+ const TableOfContents = props => {
6514
+ var _a;
6515
+ const testid = 'table-of-contents';
6516
+ return jsx(PageBorder, {
6517
+ children: jsx("div", {
6518
+ "data-testid": testid,
6519
+ children: jsx(GoATable, {
6520
+ width: "100%",
6521
+ children: jsx("tbody", {
6522
+ children: (_a = props.categories) === null || _a === void 0 ? void 0 : _a.map((category, index) => {
6523
+ return jsxs("tr", {
6524
+ children: [jsx(TocPageRef, {
6525
+ children: jsx("a", {
6526
+ "data-testid": `page-ref-${index}`,
6527
+ href: "#",
6528
+ onClick: e => {
6529
+ e.preventDefault();
6530
+ props.onClick(index);
6531
+ },
6532
+ children: category.label
6533
+ })
6534
+ }), jsx(TocStatus, {
6535
+ children: getPageStatus(category)
6536
+ })]
6537
+ });
6538
+ })
6539
+ })
6540
+ })
6541
+ })
6542
+ });
6543
+ };
6544
+ rankWith(1, uiTypeIs('TaskSection'));
6545
+
6488
6546
  const FormStepperPageReviewer = props => {
6489
6547
  const {
6490
6548
  uischema,
@@ -6579,35 +6637,18 @@ const FormStepperPageReviewer = props => {
6579
6637
  };
6580
6638
  withAjvProps(withTranslateProps(withJsonFormsLayoutProps(FormStepperPageReviewer)));
6581
6639
 
6582
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
6583
- const FormPageStepper = props => {
6584
- const formStepperCtx = useContext(JsonFormsStepperContext);
6585
- /**
6586
- * StepperCtx can only be provided once to prevent issues from categorization in categorization
6587
- * */
6588
- if ((formStepperCtx === null || formStepperCtx === void 0 ? void 0 : formStepperCtx.isProvided) === true) {
6589
- return jsx(FormPagesView, Object.assign({}, props));
6590
- }
6591
- return jsx(JsonFormsStepperContextProvider, {
6592
- StepperProps: Object.assign({}, props),
6593
- children: jsx(FormPagesView, Object.assign({}, props))
6594
- });
6595
- };
6596
- const FormPagesView = props => {
6640
+ const RenderPages = props => {
6597
6641
  const {
6598
- uischema,
6599
6642
  data,
6600
6643
  schema,
6601
6644
  path,
6602
6645
  cells,
6603
6646
  renderers,
6604
- visible,
6605
- t
6606
- } = props;
6647
+ visible
6648
+ } = props.categoryProps;
6607
6649
  const enumerators = useContext(JsonFormContext);
6608
6650
  const formStepperCtx = useContext(JsonFormsStepperContext);
6609
6651
  const {
6610
- validatePage,
6611
6652
  goToPage,
6612
6653
  toggleShowReviewLink
6613
6654
  } = formStepperCtx;
@@ -6630,9 +6671,6 @@ const FormPagesView = props => {
6630
6671
  const onCloseModal = () => {
6631
6672
  setIsOpen(false);
6632
6673
  };
6633
- useEffect(() => {
6634
- validatePage(activeId);
6635
- }, [data]);
6636
6674
  return jsxs("div", {
6637
6675
  "data-testid": "form-stepper-test-wrapper",
6638
6676
  children: [jsx(Visible, {
@@ -6658,11 +6696,7 @@ const FormPagesView = props => {
6658
6696
  style: {
6659
6697
  marginTop: '1.5rem'
6660
6698
  },
6661
- children: [index > 0 && jsx(BackButton, {
6662
- testId: "back-button",
6663
- link: () => goToPage(activeId - 1),
6664
- text: "Back"
6665
- }), jsxs(PageRenderPadding, {
6699
+ children: [props.renderBackButton(index, activeId), jsxs(PageRenderPadding, {
6666
6700
  children: [jsxs("h3", {
6667
6701
  children: ["Step ", index + 1, " of ", categories.length]
6668
6702
  }), jsx(RenderStepElements, Object.assign({}, categoryProps))]
@@ -6690,7 +6724,7 @@ const FormPagesView = props => {
6690
6724
  }
6691
6725
  }), isOnReview && jsxs("div", {
6692
6726
  "data-testid": "stepper-pages-review-page",
6693
- children: [jsx(FormStepperPageReviewer, Object.assign({}, props, {
6727
+ children: [jsx(FormStepperPageReviewer, Object.assign({}, props.categoryProps, {
6694
6728
  navigationFunc: goToPage
6695
6729
  })), jsx(PageRenderPadding, {
6696
6730
  children: jsx(GoAButtonGroup, {
@@ -6727,6 +6761,68 @@ const FormPagesView = props => {
6727
6761
  })]
6728
6762
  });
6729
6763
  };
6764
+
6765
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
6766
+ const FormPageStepper = props => {
6767
+ const formStepperCtx = useContext(JsonFormsStepperContext);
6768
+ /**
6769
+ * StepperCtx can only be provided once to prevent issues from categorization in categorization
6770
+ * */
6771
+ if ((formStepperCtx === null || formStepperCtx === void 0 ? void 0 : formStepperCtx.isProvided) === true) {
6772
+ return jsx(FormPagesView, Object.assign({}, props));
6773
+ }
6774
+ return jsx(JsonFormsStepperContextProvider, {
6775
+ StepperProps: Object.assign({}, props),
6776
+ children: jsx(FormPagesView, Object.assign({}, props))
6777
+ });
6778
+ };
6779
+ const FormPagesView = props => {
6780
+ const data = props.data;
6781
+ const formStepperCtx = useContext(JsonFormsStepperContext);
6782
+ const {
6783
+ validatePage,
6784
+ goToPage
6785
+ } = formStepperCtx;
6786
+ const {
6787
+ categories,
6788
+ activeId
6789
+ } = formStepperCtx.selectStepperState();
6790
+ useEffect(() => {
6791
+ validatePage(activeId);
6792
+ }, [data]);
6793
+ const [showTOC, setShowTOC] = useState(true);
6794
+ const handleGoToPage = index => {
6795
+ setShowTOC(false);
6796
+ goToPage(index);
6797
+ };
6798
+ // Make sure the back button on the first page takes us to the Table of Contents.
6799
+ const renderBackButton = (index, activeId) => {
6800
+ if (index > 0) {
6801
+ return jsx(BackButton, {
6802
+ testId: "back-button",
6803
+ link: () => goToPage(activeId - 1),
6804
+ text: "Back"
6805
+ });
6806
+ }
6807
+ return jsx(BackButton, {
6808
+ testId: "back-button",
6809
+ link: () => setShowTOC(true),
6810
+ text: "Back"
6811
+ });
6812
+ };
6813
+ if (showTOC) {
6814
+ const tocProps = {
6815
+ categories,
6816
+ onClick: handleGoToPage
6817
+ };
6818
+ return jsx(TableOfContents, Object.assign({}, tocProps));
6819
+ } else {
6820
+ return jsx(RenderPages, {
6821
+ categoryProps: props,
6822
+ renderBackButton: renderBackButton
6823
+ });
6824
+ }
6825
+ };
6730
6826
  const FormStepperPagesControl = withAjvProps(withTranslateProps(withJsonFormsLayoutProps(FormPageStepper)));
6731
6827
 
6732
6828
  // Ensure that all children (Category) have valid elements or things tend
@@ -7558,11 +7654,16 @@ const renderCellColumn = ({
7558
7654
  }
7559
7655
  const path = `/${rowPath}/${index}/${element}/${index === 0 ? index : index - 1}`;
7560
7656
  const nestedErrors = errors === null || errors === void 0 ? void 0 : errors.filter(e => e.instancePath.includes(path));
7657
+ /* istanbul ignore next */
7561
7658
  if (typeof currentData === 'string') {
7562
7659
  return currentData;
7563
7660
  } else if (typeof currentData === 'object' || Array.isArray(currentData)) {
7564
7661
  const result = Object.keys(currentData);
7565
- if (result.length === 0) {
7662
+ if (!isRequired && nestedErrors.length === 0) {
7663
+ return jsx("pre", {
7664
+ children: JSON.stringify(currentData, null, 2)
7665
+ });
7666
+ } else if (result.length === 0) {
7566
7667
  return renderWarningCell();
7567
7668
  } else if (result.length > 0 && (isObjectArrayEmpty(currentData) || nestedErrors.length > 0)) {
7568
7669
  return jsx("pre", {
@@ -7742,7 +7843,7 @@ const NonEmptyCellComponent$1 = /*#__PURE__*/React.memo(function NonEmptyCellCom
7742
7843
  const errorRow = errors === null || errors === void 0 ? void 0 : errors.find(error => error.instancePath.includes(`/${props.rowPath.replace(/\./g, '/')}/${i}`));
7743
7844
  return jsxs("tr", {
7744
7845
  children: [Object.keys(properties).map((element, ix) => {
7745
- var _a;
7846
+ var _a, _b;
7746
7847
  const dataObject = properties[element];
7747
7848
  const schemaName = element;
7748
7849
  const currentData = data && data[num] ? data[num][element] : '';
@@ -7762,7 +7863,7 @@ const NonEmptyCellComponent$1 = /*#__PURE__*/React.memo(function NonEmptyCellCom
7762
7863
  children: renderCellColumn({
7763
7864
  currentData,
7764
7865
  error: error === null || error === void 0 ? void 0 : error.message,
7765
- isRequired: required === null || required === void 0 ? void 0 : required.includes(tableKeys[element]),
7866
+ isRequired: (_a = required === null || required === void 0 ? void 0 : required.includes(tableKeys[element])) !== null && _a !== void 0 ? _a : false,
7766
7867
  errors: errors !== undefined ? errors : [],
7767
7868
  count: count !== undefined ? count : -1,
7768
7869
  element,
@@ -7774,7 +7875,7 @@ const NonEmptyCellComponent$1 = /*#__PURE__*/React.memo(function NonEmptyCellCom
7774
7875
  }
7775
7876
  return jsx("td", {
7776
7877
  children: jsx(GoAFormItem, {
7777
- error: (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : '',
7878
+ error: (_b = error === null || error === void 0 ? void 0 : error.message) !== null && _b !== void 0 ? _b : '',
7778
7879
  mb: errorRow && !error && '2xl' || 'xs',
7779
7880
  children: dataObject.type === 'number' || dataObject.type === 'string' && !dataObject.enum ? jsx(GoAInput, {
7780
7881
  error: (error === null || error === void 0 ? void 0 : error.message.length) > 0,
@@ -8181,7 +8282,7 @@ const GenerateRows = (Cell, schema, rowPath, enabled, cells, uischema) => {
8181
8282
  cellPath: rowPath,
8182
8283
  enabled
8183
8284
  };
8184
- return jsx(Cell, Object.assign({}, props), rowPath);
8285
+ return jsx(Cell, Object.assign({}, props), `${rowPath}`);
8185
8286
  }
8186
8287
  };
8187
8288
  const getValidColumnProps = scopedSchema => {
@@ -8269,19 +8370,19 @@ const NonEmptyCellComponent = /*#__PURE__*/React.memo(function NonEmptyCellCompo
8269
8370
  return jsxs(Fragment, {
8270
8371
  children: [
8271
8372
  // eslint-disable-next-line
8272
- (_a = uischema === null || uischema === void 0 ? void 0 : uischema.elements) === null || _a === void 0 ? void 0 : _a.map(element => {
8373
+ (_a = uischema === null || uischema === void 0 ? void 0 : uischema.elements) === null || _a === void 0 ? void 0 : _a.map((element, index) => {
8273
8374
  return jsx(JsonFormsDispatch, {
8274
8375
  "data-testid": `jsonforms-object-list-defined-elements-dispatch`,
8275
8376
  schema: schema,
8276
8377
  uischema: element,
8277
- path: rowPath,
8378
+ path: `${rowPath}-${index}`,
8278
8379
  enabled: enabled,
8279
8380
  renderers: renderers,
8280
8381
  cells: cells
8281
8382
  }, rowPath);
8282
8383
  }),
8283
8384
  // eslint-disable-next-line
8284
- (_d = (_c = (_b = uischema === null || uischema === void 0 ? void 0 : uischema.options) === null || _b === void 0 ? void 0 : _b.detail) === null || _c === void 0 ? void 0 : _c.elements) === null || _d === void 0 ? void 0 : _d.map(element => {
8385
+ (_d = (_c = (_b = uischema === null || uischema === void 0 ? void 0 : uischema.options) === null || _b === void 0 ? void 0 : _b.detail) === null || _c === void 0 ? void 0 : _c.elements) === null || _d === void 0 ? void 0 : _d.map((element, index) => {
8285
8386
  return jsx(JsonFormsDispatch, {
8286
8387
  "data-testid": `jsonforms-object-list-defined-elements-dispatch`,
8287
8388
  schema: schema,
@@ -8290,7 +8391,7 @@ const NonEmptyCellComponent = /*#__PURE__*/React.memo(function NonEmptyCellCompo
8290
8391
  enabled: enabled,
8291
8392
  renderers: renderers,
8292
8393
  cells: cells
8293
- }, rowPath);
8394
+ }, `${rowPath}-${index}`);
8294
8395
  }), ((_e = uiSchemaElementsForNotDefined === null || uiSchemaElementsForNotDefined === void 0 ? void 0 : uiSchemaElementsForNotDefined.elements) === null || _e === void 0 ? void 0 : _e.length) > 0 && jsx(JsonFormsDispatch, {
8295
8396
  schema: schema,
8296
8397
  uischema: uiSchemaElementsForNotDefined,
@@ -8298,7 +8399,7 @@ const NonEmptyCellComponent = /*#__PURE__*/React.memo(function NonEmptyCellCompo
8298
8399
  enabled: enabled,
8299
8400
  renderers: renderers,
8300
8401
  cells: cells
8301
- })]
8402
+ }, `${rowPath}`)]
8302
8403
  });
8303
8404
  });
8304
8405
  const NonEmptyCell = ownProps => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abgov/jsonforms-components",
3
- "version": "2.1.5",
3
+ "version": "2.2.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Government of Alberta - React renderers for JSON Forms based on the design system.",
6
6
  "repository": "https://github.com/GovAlta/adsp-monorepo",
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { CategorizationStepperLayoutRendererProps } from './types';
3
+ export interface PageRenderingProps {
4
+ categoryProps: CategorizationStepperLayoutRendererProps;
5
+ renderBackButton: (index: number, activeId: number) => JSX.Element;
6
+ }
7
+ export declare const RenderPages: (props: PageRenderingProps) => JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { RankedTester } from '@jsonforms/core';
2
+ import { CategoriesState } from './context';
3
+ export interface TocProps {
4
+ categories: CategoriesState;
5
+ onClick: (id: number) => void;
6
+ }
7
+ export declare const TableOfContents: (props: TocProps) => JSX.Element;
8
+ export declare const TableOfContentsTester: RankedTester;
@@ -16,3 +16,5 @@ export declare const TableReviewItemSection: import("styled-components/dist/type
16
16
  export declare const TableReviewItem: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
17
17
  export declare const TableReviewPageTitleRow: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
18
18
  export declare const TableReviewCategoryLabel: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, never>> & string;
19
+ export declare const TocStatus: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").TdHTMLAttributes<HTMLTableDataCellElement>, HTMLTableDataCellElement>, never>> & string;
20
+ export declare const TocPageRef: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").TdHTMLAttributes<HTMLTableDataCellElement>, HTMLTableDataCellElement>, never>> & string;