@spscommerce/ds-react 5.12.3 → 5.13.1

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/lib/index.es.js CHANGED
@@ -256,6 +256,7 @@ const SpsForm = React.forwardRef((props2, ref2) => {
256
256
  if (formMeta) {
257
257
  formMeta.markAsDirty();
258
258
  formMeta.markAsBlurred();
259
+ formMeta.markAsSubmitted();
259
260
  }
260
261
  onSubmit(event);
261
262
  }
@@ -637,6 +638,19 @@ var lodash_isplainobject = isPlainObject$1;
637
638
  const OnBlurErrorKeys = new Set();
638
639
  const AsTypingErrorKeys = new Set();
639
640
  const PreventativeErrorKeys = new Set();
641
+ const OnSubmitErrorKeys = new Set();
642
+ function addOnChangeErrorKey(errorKey) {
643
+ if (OnBlurErrorKeys.has(errorKey) || PreventativeErrorKeys.has(errorKey) || OnSubmitErrorKeys.has(errorKey)) {
644
+ return;
645
+ }
646
+ AsTypingErrorKeys.add(errorKey);
647
+ }
648
+ function addOnSubmitErrorKey(errorKey) {
649
+ if (OnBlurErrorKeys.has(errorKey) || PreventativeErrorKeys.has(errorKey) || AsTypingErrorKeys.has(errorKey)) {
650
+ return;
651
+ }
652
+ OnSubmitErrorKeys.add(errorKey);
653
+ }
640
654
  const moment$5 = moment$6.default || moment$6;
641
655
  const FORMAT = "MM/DD/YYYY";
642
656
  const FORMAT_PATTERN = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
@@ -900,6 +914,7 @@ class SpsFormMetaBase {
900
914
  this.errors = null;
901
915
  this.revealAllErrors = false;
902
916
  this.preventativeErrors = [];
917
+ this.submitted = false;
903
918
  }
904
919
  setValidators(newValidators) {
905
920
  this.update(this.path, null, null, newValidators);
@@ -925,7 +940,7 @@ class SpsFormMetaBase {
925
940
  return !!this.errors;
926
941
  }
927
942
  isVisibilyInvalid() {
928
- return this.errors && (this.revealAllErrors || !this.isPristine() && Object.keys(this.errors).some((key) => AsTypingErrorKeys.has(key)));
943
+ return this.errors && (this.revealAllErrors && !Object.keys(this.errors).some((key) => OnSubmitErrorKeys.has(key)) || this.revealAllErrors && Object.keys(this.errors).some((key) => OnSubmitErrorKeys.has(key)) && this.isSubmitted() || !this.isPristine() && Object.keys(this.errors).some((key) => AsTypingErrorKeys.has(key)));
929
944
  }
930
945
  hasError(errorKey) {
931
946
  return this.errors && Object.prototype.hasOwnProperty.call(this.errors, errorKey);
@@ -939,6 +954,9 @@ class SpsFormMetaBase {
939
954
  isRequired() {
940
955
  return this.validators && this.validators.indexOf(SpsValidators.required) > -1;
941
956
  }
957
+ isSubmitted() {
958
+ return this.submitted;
959
+ }
942
960
  onFocus() {
943
961
  }
944
962
  onBlur() {
@@ -999,6 +1017,11 @@ class SpsFormFieldMeta extends SpsFormMetaBase {
999
1017
  this.preventativeErrors = [];
1000
1018
  return this;
1001
1019
  }
1020
+ markAsSubmitted() {
1021
+ this.submitted = true;
1022
+ this.update(null);
1023
+ return this;
1024
+ }
1002
1025
  }
1003
1026
  class SpsFormSetMeta extends SpsFormFieldMeta {
1004
1027
  constructor(inferValOrPath, pathOrUpdate, updateWhenInferring) {
@@ -1051,6 +1074,13 @@ class SpsFormSetMeta extends SpsFormFieldMeta {
1051
1074
  }
1052
1075
  return this;
1053
1076
  }
1077
+ markAsSubmitted() {
1078
+ super.markAsSubmitted();
1079
+ for (const key of Object.keys(this.fields)) {
1080
+ this.fields[key].markAsSubmitted();
1081
+ }
1082
+ return this;
1083
+ }
1054
1084
  }
1055
1085
  class SpsFormGroupMeta extends SpsFormSetMeta {
1056
1086
  inferMembers(inferFromValue) {
@@ -1241,6 +1271,11 @@ function useSpsForm(value, validatorMap) {
1241
1271
  const childMeta = meta.fields[key];
1242
1272
  if (!alreadyValidated.has(childMeta)) {
1243
1273
  meta.fields[key].validate(newSubValue[key]);
1274
+ if (dType === DiffChange.ADDITION && childMeta.fields) {
1275
+ for (const [fieldKey, field] of Object.entries(childMeta.fields)) {
1276
+ field.validate(newSubValue[key][fieldKey]);
1277
+ }
1278
+ }
1244
1279
  }
1245
1280
  }
1246
1281
  }
@@ -23787,6 +23822,22 @@ function useServerSideValidation(formControl2, initialState = null) {
23787
23822
  }, [status]);
23788
23823
  return [status, setStatus];
23789
23824
  }
23825
+ var ValidationMode;
23826
+ (function(ValidationMode2) {
23827
+ ValidationMode2[ValidationMode2["ON_CHANGE"] = 0] = "ON_CHANGE";
23828
+ ValidationMode2[ValidationMode2["ON_BLUR"] = 1] = "ON_BLUR";
23829
+ ValidationMode2[ValidationMode2["ON_SUBMIT"] = 2] = "ON_SUBMIT";
23830
+ })(ValidationMode || (ValidationMode = {}));
23831
+ function useCustomValidator(validator, validatorConfig = {}, dependencies = []) {
23832
+ for (const [key, validateOption] of Object.entries(validatorConfig)) {
23833
+ if (validateOption === 0) {
23834
+ addOnChangeErrorKey(key);
23835
+ } else if (validateOption === 2) {
23836
+ addOnSubmitErrorKey(key);
23837
+ }
23838
+ }
23839
+ return React.useCallback(validator, dependencies);
23840
+ }
23790
23841
  const SpsFormExamples = {
23791
23842
  a_basic: {
23792
23843
  label: "Basic Usage",
@@ -24178,6 +24229,68 @@ const SpsFormExamples = {
24178
24229
  `
24179
24230
  }
24180
24231
  }
24232
+ },
24233
+ custom_errors: {
24234
+ label: "Custom errors",
24235
+ description: () => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("p", null, "When using custom validators you can specify when to show the errors - on Change, on Blur or on Submit.", /* @__PURE__ */ React.createElement("br", null), "On Blur is the the default behavior. If you want to change that behavior you can use ", /* @__PURE__ */ React.createElement("b", null, "useCustomValidator hook"), ". It takes validation function as first argument, validator configuration (object containing errorKey as key and ValidationMode as value) as second argument and dependencies as third argument. useCustomValidator returns a React callback of the validation function with the given dependencies."), /* @__PURE__ */ React.createElement("p", null, /* @__PURE__ */ React.createElement("b", null, "!Note:"), " useCustomValidator hook will make changes to the global scope and once you set a custom error key you can't change it.")),
24236
+ examples: {
24237
+ basic: {
24238
+ react: code`
24239
+ function DemoComponent() {
24240
+
24241
+ const customValidator = useCustomValidator(
24242
+ (value) => value < 3 ? null : { customErrorKey: true },
24243
+ { customErrorKey: ValidationMode.ON_CHANGE }
24244
+ // or { customErrorKey: ValidationMode.ON_SUBMIT }
24245
+ );
24246
+
24247
+ const initValue = {
24248
+ customErrorField: "",
24249
+ };
24250
+
24251
+ const { formValue, formMeta, updateForm } = useSpsForm(initValue, {
24252
+ "customErrorField": [customValidator],
24253
+ });
24254
+
24255
+ function handleSubmit() {
24256
+ console.log("submit", formValue);
24257
+ }
24258
+
24259
+ function reset() {
24260
+ updateForm(initValue);
24261
+ formMeta.markAsPristine();
24262
+ }
24263
+
24264
+ return <>
24265
+ <SpsForm formMeta={formMeta} onSubmit={handleSubmit}>
24266
+ <div className="sfg-row">
24267
+ <div className="sfg-col-8">
24268
+ <SpsLabel
24269
+ for={formMeta.fields.customErrorField}
24270
+ errors={() => formMeta.fields.customErrorField.hasError("customErrorKey")
24271
+ && "Custom error description"}
24272
+ >
24273
+ Custom Error
24274
+ </SpsLabel>
24275
+ <SpsTextInput
24276
+ value={formValue.customErrorField}
24277
+ formMeta={formMeta.fields.customErrorField}
24278
+ />
24279
+ </div>
24280
+ </div>
24281
+
24282
+ <div className="sfg-row">
24283
+ <div className="sfg-col-12">
24284
+ <SpsButton className="mr-1" onClick={reset}>Reset</SpsButton>
24285
+ <SpsButton type={ButtonType.SUBMIT} kind={ButtonKind.CONFIRM}>Submit</SpsButton>
24286
+ </div>
24287
+ </div>
24288
+ </SpsForm>
24289
+ </>;
24290
+ }
24291
+ `
24292
+ }
24293
+ }
24181
24294
  }
24182
24295
  };
24183
24296
  const SpsAddRemoveFormRowExamples = {
@@ -38524,4 +38637,4 @@ Object.assign(SpsVr, {
38524
38637
  propTypes,
38525
38638
  displayName: "SpsDescriptionListTerm / SpsDt"
38526
38639
  });
38527
- export { AsTypingErrorKeys, ContentOrderExample, DEFAULT_PRESETS, FauxChangeEvent, I18nContext, MANIFEST, OnBlurErrorKeys, PortalContext, PreventativeErrorKeys, SimpleDateUtils, SpsAddRemoveFormRowExamples, SpsAdvancedSearch, SpsAdvancedSearchExamples, SpsAutocomplete, SpsAutocompleteExamples, SpsButton, SpsButtonExamples, SpsButtonGroup, SpsCard, SpsCardExamples, SpsCardTabbedPane, SpsCardV2, SpsCardV2Footer, SpsCardV2Header, SpsCardV2Title, SpsCheckbox, SpsCheckboxDropdown, SpsCheckboxExamples, SpsClickableTag, SpsClickableTagExamples, SpsColumnChooser, SpsColumnChooserColumn, SpsColumnChooserExamples, SpsConditionalField, SpsConditionalFieldExamples, SpsContentRow, SpsContentRowCol, SpsContentRowExamples, SpsContentRowExpansion, SpsCurrencyInput, SpsCurrencyInputExamples, SpsDateRangePicker, SpsDateRangePickerExamples, SpsDateRangePickerV2, SpsDateTime, SpsDatepicker, SpsDatepickerExamples, SpsDatepickerV2, SpsDatetimeExamples, SpsDd, SpsDescriptionList, SpsDescriptionListDefinition, SpsDescriptionListExamples, SpsDescriptionListTerm, SpsDl, SpsDropdown, SpsDropdownExamples, SpsDt, SpsFeedbackBlock, SpsFeedbackBlockExamples, SpsFieldset, SpsFieldsetExamples, SpsFilterPanel, SpsFilterPanelCap, SpsFilterPanelExamples, SpsFilterPanelFilterBox, SpsFilterPanelSection, SpsFilterTile, SpsFilterTileList, SpsFilterTileListExamples, SpsFocusedTask, SpsFocusedTaskActions, SpsFocusedTaskExamples, SpsForm, SpsFormArrayMeta, SpsFormComponentWrapper, SpsFormExamples, SpsFormFieldMeta, SpsFormGroupMeta, SpsFormMetaBase, SpsFormSetMeta, SpsGrowler, SpsGrowlerExamples, SpsI, SpsIconButtonPanel, SpsIncrementor, SpsIncrementorExamples, SpsInputGroup, SpsInsightTile, SpsInsights, SpsKeyValueList, SpsKeyValueListExamples, SpsKeyValueListItem, SpsKeyValueTag, SpsKeyValueTagExamples, SpsLabel, SpsLabelExamples, SpsListActionBar, SpsListActionBarExamples, SpsListToolbar, SpsListToolbarExamples, SpsListToolbarSearch, SpsListToolbarSearchInfo, SpsMicroBlock, SpsMicroBlockExamples, SpsMicroZeroState, SpsModal, SpsModalAction, SpsModalBody, SpsModalExamples, SpsModalFooter, SpsModalHeader, SpsModalOverlay, SpsModalV2, SpsModalV2Footer, SpsMultiSelect, SpsMultiSelectExamples, SpsPageSelector, SpsPageSubtitle, SpsPageTitle, SpsPageTitleExamples, SpsPagination, SpsPaginationExamples, SpsProductBar, SpsProductBarExamples, SpsProductBarTab, SpsProgressBar, SpsProgressBarExamples, SpsProgressRing, SpsRadioButton, SpsRadioButtonExamples, SpsScrollableContainer, SpsScrollableContainerExamples, SpsSearchResultsBar, SpsSearchResultsBarExamples, SpsSearchResultsBarV2, SpsSelect, SpsSelectExamples, SpsSideNav, SpsSideNavExamples, SpsSlackLink, SpsSlackLinkExamples, SpsSortingHeader, SpsSortingHeaderCell, SpsSortingHeaderExamples, SpsSpinner, SpsSpinnerExamples, SpsSplitButton, SpsSplitButtonExamples, SpsSteppedProgressBar, SpsSteppedProgressBarExamples, SpsSummaryListColumn, SpsSummaryListExamples, SpsSummaryListExpansion, SpsSummaryListRow, SpsTab, SpsTabPanel, SpsTable, SpsTableBody, SpsTableCell, SpsTableExamples, SpsTableHead, SpsTableHeader, SpsTableRow, SpsTabsV2, SpsTag, SpsTagExamples, SpsTaskQueue, SpsTaskQueueExamples, SpsTbody, SpsTd, SpsTextInput, SpsTextInputExamples, SpsTextarea, SpsTextareaExamples, SpsTh, SpsThead, SpsTile, SpsTileList, SpsTileListExamples, SpsToggle, SpsToggleExamples, SpsTooltip, SpsTooltipExamples, SpsTooltipTitle, SpsTr, SpsValidators, SpsVerticalRule, SpsVr, SpsWf, SpsWfDoc, SpsWfDs, SpsWfStep, SpsWizardExamples, SpsWizardSidebar, SpsWizardSubstep, SpsWorkflow, SpsWorkflowDocument, SpsWorkflowDocumentStatus, SpsWorkflowExamples, SpsWorkflowStep, SpsZeroState, SpsZeroStateExamples, TooltipVisibility, contentOf, date, dateConstraint, dateRange, findParentBranches, flipPosition, formArray, formControl, formGroup, getMember, getPosition, selectChildren, toggleTooltipState, useCheckDeprecatedProps, useDidUpdateEffect, useDocumentEventListener, useElementId, useForm, useGrowlers, useInputPopup, usePatchReducer, usePortal, useServerSideValidation, useSpsAction, useSpsForm, validate, weekOfMonth };
38640
+ export { AsTypingErrorKeys, ContentOrderExample, DEFAULT_PRESETS, FauxChangeEvent, I18nContext, MANIFEST, OnBlurErrorKeys, OnSubmitErrorKeys, PortalContext, PreventativeErrorKeys, SimpleDateUtils, SpsAddRemoveFormRowExamples, SpsAdvancedSearch, SpsAdvancedSearchExamples, SpsAutocomplete, SpsAutocompleteExamples, SpsButton, SpsButtonExamples, SpsButtonGroup, SpsCard, SpsCardExamples, SpsCardTabbedPane, SpsCardV2, SpsCardV2Footer, SpsCardV2Header, SpsCardV2Title, SpsCheckbox, SpsCheckboxDropdown, SpsCheckboxExamples, SpsClickableTag, SpsClickableTagExamples, SpsColumnChooser, SpsColumnChooserColumn, SpsColumnChooserExamples, SpsConditionalField, SpsConditionalFieldExamples, SpsContentRow, SpsContentRowCol, SpsContentRowExamples, SpsContentRowExpansion, SpsCurrencyInput, SpsCurrencyInputExamples, SpsDateRangePicker, SpsDateRangePickerExamples, SpsDateRangePickerV2, SpsDateTime, SpsDatepicker, SpsDatepickerExamples, SpsDatepickerV2, SpsDatetimeExamples, SpsDd, SpsDescriptionList, SpsDescriptionListDefinition, SpsDescriptionListExamples, SpsDescriptionListTerm, SpsDl, SpsDropdown, SpsDropdownExamples, SpsDt, SpsFeedbackBlock, SpsFeedbackBlockExamples, SpsFieldset, SpsFieldsetExamples, SpsFilterPanel, SpsFilterPanelCap, SpsFilterPanelExamples, SpsFilterPanelFilterBox, SpsFilterPanelSection, SpsFilterTile, SpsFilterTileList, SpsFilterTileListExamples, SpsFocusedTask, SpsFocusedTaskActions, SpsFocusedTaskExamples, SpsForm, SpsFormArrayMeta, SpsFormComponentWrapper, SpsFormExamples, SpsFormFieldMeta, SpsFormGroupMeta, SpsFormMetaBase, SpsFormSetMeta, SpsGrowler, SpsGrowlerExamples, SpsI, SpsIconButtonPanel, SpsIncrementor, SpsIncrementorExamples, SpsInputGroup, SpsInsightTile, SpsInsights, SpsKeyValueList, SpsKeyValueListExamples, SpsKeyValueListItem, SpsKeyValueTag, SpsKeyValueTagExamples, SpsLabel, SpsLabelExamples, SpsListActionBar, SpsListActionBarExamples, SpsListToolbar, SpsListToolbarExamples, SpsListToolbarSearch, SpsListToolbarSearchInfo, SpsMicroBlock, SpsMicroBlockExamples, SpsMicroZeroState, SpsModal, SpsModalAction, SpsModalBody, SpsModalExamples, SpsModalFooter, SpsModalHeader, SpsModalOverlay, SpsModalV2, SpsModalV2Footer, SpsMultiSelect, SpsMultiSelectExamples, SpsPageSelector, SpsPageSubtitle, SpsPageTitle, SpsPageTitleExamples, SpsPagination, SpsPaginationExamples, SpsProductBar, SpsProductBarExamples, SpsProductBarTab, SpsProgressBar, SpsProgressBarExamples, SpsProgressRing, SpsRadioButton, SpsRadioButtonExamples, SpsScrollableContainer, SpsScrollableContainerExamples, SpsSearchResultsBar, SpsSearchResultsBarExamples, SpsSearchResultsBarV2, SpsSelect, SpsSelectExamples, SpsSideNav, SpsSideNavExamples, SpsSlackLink, SpsSlackLinkExamples, SpsSortingHeader, SpsSortingHeaderCell, SpsSortingHeaderExamples, SpsSpinner, SpsSpinnerExamples, SpsSplitButton, SpsSplitButtonExamples, SpsSteppedProgressBar, SpsSteppedProgressBarExamples, SpsSummaryListColumn, SpsSummaryListExamples, SpsSummaryListExpansion, SpsSummaryListRow, SpsTab, SpsTabPanel, SpsTable, SpsTableBody, SpsTableCell, SpsTableExamples, SpsTableHead, SpsTableHeader, SpsTableRow, SpsTabsV2, SpsTag, SpsTagExamples, SpsTaskQueue, SpsTaskQueueExamples, SpsTbody, SpsTd, SpsTextInput, SpsTextInputExamples, SpsTextarea, SpsTextareaExamples, SpsTh, SpsThead, SpsTile, SpsTileList, SpsTileListExamples, SpsToggle, SpsToggleExamples, SpsTooltip, SpsTooltipExamples, SpsTooltipTitle, SpsTr, SpsValidators, SpsVerticalRule, SpsVr, SpsWf, SpsWfDoc, SpsWfDs, SpsWfStep, SpsWizardExamples, SpsWizardSidebar, SpsWizardSubstep, SpsWorkflow, SpsWorkflowDocument, SpsWorkflowDocumentStatus, SpsWorkflowExamples, SpsWorkflowStep, SpsZeroState, SpsZeroStateExamples, TooltipVisibility, ValidationMode, addOnChangeErrorKey, addOnSubmitErrorKey, contentOf, date, dateConstraint, dateRange, findParentBranches, flipPosition, formArray, formControl, formGroup, getMember, getPosition, selectChildren, toggleTooltipState, useCheckDeprecatedProps, useCustomValidator, useDidUpdateEffect, useDocumentEventListener, useElementId, useForm, useGrowlers, useInputPopup, usePatchReducer, usePortal, useServerSideValidation, useSpsAction, useSpsForm, validate, weekOfMonth };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spscommerce/ds-react",
3
3
  "description": "SPS Design System React components",
4
- "version": "5.12.3",
4
+ "version": "5.13.1",
5
5
  "author": "SPS Commerce",
6
6
  "license": "UNLICENSED",
7
7
  "repository": "https://github.com/spscommerce/design-system/tree/main/packages/@spscommerce/ds-react",
@@ -28,10 +28,10 @@
28
28
  },
29
29
  "peerDependencies": {
30
30
  "@react-stately/collections": "^3.3.3",
31
- "@spscommerce/ds-colors": "5.12.3",
32
- "@spscommerce/ds-shared": "5.12.3",
33
- "@spscommerce/positioning": "5.12.3",
34
- "@spscommerce/utils": "5.12.3",
31
+ "@spscommerce/ds-colors": "5.13.1",
32
+ "@spscommerce/ds-shared": "5.13.1",
33
+ "@spscommerce/positioning": "5.13.1",
34
+ "@spscommerce/utils": "5.13.1",
35
35
  "moment": "^2.25.3",
36
36
  "moment-timezone": "^0.5.28",
37
37
  "react": "^16.9.0",
@@ -39,10 +39,10 @@
39
39
  },
40
40
  "devDependencies": {
41
41
  "@react-stately/collections": "^3.3.3",
42
- "@spscommerce/ds-colors": "5.12.3",
43
- "@spscommerce/ds-shared": "5.12.3",
44
- "@spscommerce/positioning": "5.12.3",
45
- "@spscommerce/utils": "5.12.3",
42
+ "@spscommerce/ds-colors": "5.13.1",
43
+ "@spscommerce/ds-shared": "5.13.1",
44
+ "@spscommerce/positioning": "5.13.1",
45
+ "@spscommerce/utils": "5.13.1",
46
46
  "@testing-library/react": "^9.3.2",
47
47
  "@types/prop-types": "^15.7.1",
48
48
  "@types/react": "^16.9.0",