@abgov/jsonforms-components 2.60.16 → 2.60.17

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
@@ -17609,20 +17609,66 @@ const NameInputs = ({
17609
17609
  handleInputChange,
17610
17610
  data,
17611
17611
  requiredFields,
17612
- disabled
17612
+ disabled,
17613
+ errors,
17614
+ onFieldBlur
17613
17615
  }) => {
17614
- var _errors$firstName, _errors$lastName;
17615
- const [errors, setErrors] = useState({});
17616
+ var _displayedErrors$firs, _displayedErrors$last;
17617
+ const [internalErrors, setInternalErrors] = useState({});
17618
+ const currentValues = {
17619
+ firstName,
17620
+ middleName: middleName || '',
17621
+ lastName
17622
+ };
17623
+ useEffect(() => {
17624
+ const timeout = window.setTimeout(() => {
17625
+ ['firstName', 'middleName', 'lastName'].forEach(field => {
17626
+ var _input$value;
17627
+ const input = document.querySelector(`goa-input[name="${field}"]`);
17628
+ const liveValue = (input == null || (_input$value = input.value) == null ? void 0 : _input$value.trim()) || '';
17629
+ if (liveValue && !currentValues[field]) {
17630
+ handleInputChange(field, liveValue);
17631
+ }
17632
+ });
17633
+ }, 50);
17634
+ return () => window.clearTimeout(timeout);
17635
+ }, [firstName, middleName, lastName, handleInputChange]);
17636
+ useEffect(() => {
17637
+ if (errors) {
17638
+ return;
17639
+ }
17640
+ setInternalErrors(currentErrors => {
17641
+ const nextErrors = Object.assign({}, currentErrors);
17642
+ let hasChanges = false;
17643
+ Object.keys(currentErrors).forEach(name => {
17644
+ const currentValue = (currentValues[name] || '').trim();
17645
+ if (requiredFields != null && requiredFields.includes(name) && currentValue === '') {
17646
+ return;
17647
+ }
17648
+ delete nextErrors[name];
17649
+ hasChanges = true;
17650
+ });
17651
+ return hasChanges ? nextErrors : currentErrors;
17652
+ });
17653
+ }, [errors, firstName, middleName, lastName, requiredFields]);
17616
17654
  // eslint-disable-next-line
17617
17655
  const handleRequiredFieldBlur = (name, updatedData) => {
17618
- const err = Object.assign({}, errors);
17619
- if ((!(data != null && data[name]) || (data == null ? void 0 : data[name]) === '') && requiredFields.includes(name) && (true)) {
17656
+ const err = Object.assign({}, internalErrors);
17657
+ if ((!(data != null && data[name]) || (data == null ? void 0 : data[name]) === '') && requiredFields != null && requiredFields.includes(name) && (true)) {
17620
17658
  const modifiedName = name === 'firstName' ? 'First name' : name === 'lastName' ? 'Last name' : '';
17621
17659
  err[name] = `${modifiedName} is required`;
17622
17660
  } else {
17623
17661
  err[name] = '';
17624
17662
  }
17625
- setErrors(err);
17663
+ setInternalErrors(err);
17664
+ };
17665
+ const displayedErrors = errors != null ? errors : internalErrors;
17666
+ const handleBlur = name => {
17667
+ if (onFieldBlur) {
17668
+ onFieldBlur(name);
17669
+ } else {
17670
+ handleRequiredFieldBlur(name);
17671
+ }
17626
17672
  };
17627
17673
  return jsxs(GoabGrid, {
17628
17674
  minChildWidth: "0ch",
@@ -17633,7 +17679,7 @@ const NameInputs = ({
17633
17679
  testId: "form-item-first-name",
17634
17680
  label: "First name",
17635
17681
  requirement: requiredFields != null && requiredFields.includes('firstName') ? 'required' : undefined,
17636
- error: (_errors$firstName = errors == null ? void 0 : errors['firstName']) != null ? _errors$firstName : '',
17682
+ error: (_displayedErrors$firs = displayedErrors == null ? void 0 : displayedErrors['firstName']) != null ? _displayedErrors$firs : '',
17637
17683
  children: jsx(GoabInput, {
17638
17684
  type: "text",
17639
17685
  name: "firstName",
@@ -17643,7 +17689,7 @@ const NameInputs = ({
17643
17689
  value: firstName || '',
17644
17690
  onChange: detail => handleInputChange(detail.name, detail.value),
17645
17691
  onBlur: detail => {
17646
- handleRequiredFieldBlur(detail.name);
17692
+ handleBlur(detail.name);
17647
17693
  },
17648
17694
  width: "100%"
17649
17695
  })
@@ -17665,7 +17711,7 @@ const NameInputs = ({
17665
17711
  testId: "form-item-last-name",
17666
17712
  label: "Last name",
17667
17713
  requirement: requiredFields != null && requiredFields.includes('lastName') ? 'required' : undefined,
17668
- error: (_errors$lastName = errors == null ? void 0 : errors['lastName']) != null ? _errors$lastName : '',
17714
+ error: (_displayedErrors$last = displayedErrors == null ? void 0 : displayedErrors['lastName']) != null ? _displayedErrors$last : '',
17669
17715
  children: jsx(GoabInput, {
17670
17716
  type: "text",
17671
17717
  name: "lastName",
@@ -17675,7 +17721,7 @@ const NameInputs = ({
17675
17721
  value: lastName || '',
17676
17722
  onChange: detail => handleInputChange(detail.name, detail.value),
17677
17723
  onBlur: detail => {
17678
- handleRequiredFieldBlur(detail.name);
17724
+ handleBlur(detail.name);
17679
17725
  },
17680
17726
  width: "100%"
17681
17727
  })
@@ -17847,6 +17893,8 @@ handleRequiredFieldBlur) {
17847
17893
  }, [formData]);
17848
17894
  }
17849
17895
 
17896
+ const AUTOFILL_FIELDS = ['firstName', 'middleName', 'lastName', 'dateOfBirth'];
17897
+ const getRequiredLabel = name => name === 'firstName' ? 'First name' : name === 'lastName' ? 'Last name' : name === 'dateOfBirth' ? 'Date of birth' : name;
17850
17898
  const normalizeNameDobData = value => ({
17851
17899
  firstName: (value == null ? void 0 : value.firstName) || '',
17852
17900
  middleName: (value == null ? void 0 : value.middleName) || '',
@@ -17854,7 +17902,7 @@ const normalizeNameDobData = value => ({
17854
17902
  dateOfBirth: (value == null ? void 0 : value.dateOfBirth) || ''
17855
17903
  });
17856
17904
  const FullNameDobControl = props => {
17857
- var _schema$required, _errors$firstName, _schema$required2, _schema$required3, _errors$lastName, _errors$dateOfBirth;
17905
+ var _errors$dateOfBirth;
17858
17906
  const {
17859
17907
  data,
17860
17908
  path,
@@ -17864,7 +17912,7 @@ const FullNameDobControl = props => {
17864
17912
  visible,
17865
17913
  uischema
17866
17914
  } = props;
17867
- const requiredFields = schema.required;
17915
+ const requiredFields = schema.required || [];
17868
17916
  const [errors, setErrors] = useState({});
17869
17917
  const controlRef = useRef(null);
17870
17918
  const formStepperCtx = useContext(JsonFormsStepperContext);
@@ -17879,9 +17927,9 @@ const FullNameDobControl = props => {
17879
17927
  };
17880
17928
  const [formData, setFormData] = useState(normalizeNameDobData(data));
17881
17929
  const updateFormData = updatedData => {
17882
- updatedData = Object.fromEntries(Object.entries(updatedData).filter(([_, value]) => value !== ''));
17883
- setFormData(updatedData);
17884
- handleChange(path, updatedData);
17930
+ const nextData = Object.fromEntries(Object.entries(updatedData).filter(([_, value]) => value !== ''));
17931
+ setFormData(nextData);
17932
+ handleChange(path, nextData);
17885
17933
  };
17886
17934
  useEffect(() => {
17887
17935
  const nextData = normalizeNameDobData(data);
@@ -17899,14 +17947,13 @@ const FullNameDobControl = props => {
17899
17947
  const err = Object.assign({}, errors);
17900
17948
  const liveInputValue = (_ref = (_ref2 = (_updatedData$name = updatedData == null ? void 0 : updatedData[name]) != null ? _updatedData$name : data == null ? void 0 : data[name]) != null ? _ref2 : (_document$querySelect = document.querySelector(`goa-input[name="${name}"]`)) == null ? void 0 : _document$querySelect.value) != null ? _ref : '';
17901
17949
  if (requiredFields.includes(name) && liveInputValue.trim() === '') {
17902
- const modifiedName = name === 'firstName' ? 'First name' : name === 'lastName' ? 'Last name' : name === 'dateOfBirth' ? 'Date of birth' : name;
17903
- err[name] = `${modifiedName} is required`;
17950
+ err[name] = `${getRequiredLabel(name)} is required`;
17904
17951
  } else {
17905
17952
  delete err[name];
17906
17953
  }
17907
17954
  setErrors(err);
17908
17955
  };
17909
- useSyncAutofillFields(['firstName', 'middleName', 'lastName', 'dateOfBirth'], formData, updateFormData, handleRequiredFieldBlur);
17956
+ useSyncAutofillFields(AUTOFILL_FIELDS, formData, updateFormData, handleRequiredFieldBlur);
17910
17957
  useEffect(() => {
17911
17958
  var _controlRef$current$q, _controlRef$current, _host$shadowRoot;
17912
17959
  const host = (_controlRef$current$q = (_controlRef$current = controlRef.current) == null ? void 0 : _controlRef$current.querySelector('goa-input[type="date"]')) != null ? _controlRef$current$q : null;
@@ -17947,64 +17994,16 @@ const FullNameDobControl = props => {
17947
17994
  visible: visible,
17948
17995
  children: jsxs("div", {
17949
17996
  ref: controlRef,
17950
- children: [jsxs(GoabGrid, {
17951
- minChildWidth: "0ch",
17952
- gap: "s",
17953
- mb: "m",
17954
- children: [jsx(GoabFormItem, {
17955
- label: "First name",
17956
- requirement: schema != null && (_schema$required = schema.required) != null && _schema$required.includes('firstName') ? 'required' : undefined,
17957
- error: (_errors$firstName = errors == null ? void 0 : errors['firstName']) != null ? _errors$firstName : '',
17958
- testId: "form-item-first-name",
17959
- children: jsx(GoabInput, {
17960
- disabled: !enabled,
17961
- type: "text",
17962
- name: "firstName",
17963
- testId: "name-form-first-name",
17964
- ariaLabel: 'name-form-first-name',
17965
- value: formData.firstName,
17966
- onChange: detail => {
17967
- handleInputChange(detail.name, detail.value);
17968
- },
17969
- onBlur: detail => {
17970
- handleRequiredFieldBlur(detail.name);
17971
- },
17972
- width: "100%"
17973
- })
17974
- }), jsx(GoabFormItem, {
17975
- label: "Middle name",
17976
- requirement: schema != null && (_schema$required2 = schema.required) != null && _schema$required2.includes('middleName') ? 'required' : undefined,
17977
- children: jsx(GoabInput, {
17978
- type: "text",
17979
- name: "middleName",
17980
- disabled: !enabled,
17981
- testId: "name-form-middle-name",
17982
- ariaLabel: 'name-form-middle-name',
17983
- value: formData.middleName || '',
17984
- onChange: detail => handleInputChange(detail.name, detail.value),
17985
- width: "100%"
17986
- })
17987
- }), jsx(GoabFormItem, {
17988
- label: "Last name",
17989
- requirement: schema != null && (_schema$required3 = schema.required) != null && _schema$required3.includes('lastName') ? 'required' : undefined,
17990
- error: (_errors$lastName = errors == null ? void 0 : errors['lastName']) != null ? _errors$lastName : '',
17991
- testId: "form-item-last-name",
17992
- children: jsx(GoabInput, {
17993
- type: "text",
17994
- name: "lastName",
17995
- disabled: !enabled,
17996
- testId: "name-form-last-name",
17997
- ariaLabel: 'name-form-last-name',
17998
- value: formData.lastName || '',
17999
- onChange: detail => {
18000
- handleInputChange(detail.name, detail.value);
18001
- },
18002
- onBlur: detail => {
18003
- handleRequiredFieldBlur(detail.name);
18004
- },
18005
- width: "100%"
18006
- })
18007
- })]
17997
+ children: [jsx(NameInputs, {
17998
+ firstName: formData.firstName,
17999
+ middleName: formData.middleName,
18000
+ lastName: formData.lastName,
18001
+ handleInputChange: handleInputChange,
18002
+ data: formData,
18003
+ disabled: !enabled,
18004
+ requiredFields: requiredFields,
18005
+ errors: errors,
18006
+ onFieldBlur: handleRequiredFieldBlur
18008
18007
  }), jsx(GoabGrid, {
18009
18008
  minChildWidth: "0ch",
18010
18009
  gap: "s",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abgov/jsonforms-components",
3
- "version": "2.60.16",
3
+ "version": "2.60.17",
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",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-04-27T20:33:20.640Z",
4
- "sourceCommit": "39950b0288e24ea3e4d895bf4bbe2b79c542625f",
3
+ "generatedAt": "2026-04-29T21:25:28.694Z",
4
+ "sourceCommit": "4a8e24eeb967cbbf32d54077d2a3aa489e565b67",
5
5
  "sourcePath": "libs/jsonforms-components/src/index.ts",
6
6
  "rendererCount": 33,
7
7
  "renderers": [
@@ -5,8 +5,10 @@ interface NameInputsProps {
5
5
  lastName: string;
6
6
  isStepperReview?: boolean;
7
7
  disabled?: boolean;
8
- data: any;
9
- requiredFields: string[];
8
+ data?: any;
9
+ requiredFields?: string[];
10
+ errors?: Record<string, string>;
11
+ onFieldBlur?: (name: string) => void;
10
12
  handleInputChange: (field: string, value: string) => void;
11
13
  }
12
14
  export declare const NameInputs: React.FC<NameInputsProps>;