PorterFormWrapper.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import React, { useState } from "react";
  2. import PorterForm from "./PorterForm";
  3. import { InjectedProps, PorterFormData } from "./types";
  4. import { PorterFormContextProvider } from "./PorterFormContextProvider";
  5. type PropsType = {
  6. formData: any;
  7. valuesToOverride?: any;
  8. isReadOnly?: boolean;
  9. onSubmit?: (values: any, cb?: () => void) => void;
  10. renderTabContents?: (currentTab: string, submitValues?: any) => any;
  11. leftTabOptions?: { value: string; label: string }[];
  12. rightTabOptions?: { value: string; label: string }[];
  13. saveButtonText?: string;
  14. isInModal?: boolean;
  15. color?: string;
  16. addendum?: any;
  17. saveValuesStatus?: string;
  18. showStateDebugger?: boolean;
  19. isLaunch?: boolean;
  20. includeHiddenFields?: boolean;
  21. hideBottomSpacer?: boolean;
  22. redirectTabAfterSave?: string;
  23. includeMetadata?: boolean;
  24. injectedProps?: InjectedProps;
  25. };
  26. const PorterFormWrapper: React.FC<PropsType> = ({
  27. formData,
  28. valuesToOverride,
  29. isReadOnly,
  30. onSubmit,
  31. renderTabContents,
  32. leftTabOptions,
  33. rightTabOptions,
  34. saveButtonText,
  35. isInModal,
  36. color,
  37. addendum,
  38. saveValuesStatus,
  39. showStateDebugger,
  40. isLaunch,
  41. includeHiddenFields,
  42. hideBottomSpacer,
  43. redirectTabAfterSave,
  44. includeMetadata,
  45. injectedProps,
  46. }) => {
  47. const hashCode = (s: string) => {
  48. return s?.split("").reduce(function (a, b) {
  49. a = (a << 5) - a + b.charCodeAt(0);
  50. return a & a;
  51. }, 0);
  52. };
  53. const getInitialTab = (): string => {
  54. if (leftTabOptions?.length > 0) {
  55. return leftTabOptions[0].value;
  56. } else if (formData?.tabs?.length > 0) {
  57. let includedTabs = formData.tabs;
  58. if (isLaunch) {
  59. includedTabs = formData.tabs.filter(
  60. (tab: any) => !tab?.settings?.omitFromLaunch
  61. );
  62. }
  63. return includedTabs[0].name;
  64. } else if (rightTabOptions?.length > 0) {
  65. return rightTabOptions[0].value;
  66. } else {
  67. return "";
  68. }
  69. };
  70. // Lifted into PorterFormWrapper to allow tab to be remembered on re-render (e.g., on revision select)
  71. const [currentTab, setCurrentTab] = useState(getInitialTab());
  72. return (
  73. <React.Fragment key={hashCode(JSON.stringify(formData))}>
  74. <PorterFormContextProvider
  75. rawFormData={formData as PorterFormData}
  76. overrideVariables={valuesToOverride}
  77. isReadOnly={isReadOnly}
  78. onSubmit={onSubmit}
  79. includeHiddenFields={includeHiddenFields}
  80. includeMetadata={includeMetadata}
  81. >
  82. <PorterForm
  83. showStateDebugger={showStateDebugger}
  84. addendum={addendum}
  85. isReadOnly={isReadOnly}
  86. leftTabOptions={leftTabOptions}
  87. rightTabOptions={rightTabOptions}
  88. renderTabContents={renderTabContents}
  89. saveButtonText={saveButtonText}
  90. isInModal={isInModal}
  91. color={color}
  92. saveValuesStatus={saveValuesStatus}
  93. currentTab={currentTab}
  94. setCurrentTab={setCurrentTab}
  95. isLaunch={isLaunch}
  96. hideSpacer={hideBottomSpacer}
  97. redirectTabAfterSave={redirectTabAfterSave}
  98. injectedProps={injectedProps}
  99. />
  100. </PorterFormContextProvider>
  101. </React.Fragment>
  102. );
  103. };
  104. export default PorterFormWrapper;