@thecb/components 10.12.3-beta.0 → 10.12.3-beta.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.
Files changed (211) hide show
  1. package/README.md +0 -4
  2. package/dist/index.cjs.js +2526 -1617
  3. package/dist/index.cjs.js.map +1 -1
  4. package/dist/index.d.ts +4 -5
  5. package/dist/index.esm.js +2527 -1617
  6. package/dist/index.esm.js.map +1 -1
  7. package/package.json +13 -25
  8. package/src/components/atoms/alert/Alert.stories.js +26 -148
  9. package/src/components/atoms/badge/Badge.js +2 -2
  10. package/src/components/atoms/badge/Badge.stories.js +29 -143
  11. package/src/components/atoms/breadcrumb/Breadcrumb.stories.js +29 -38
  12. package/src/components/atoms/button-with-action/ButtonWithAction.stories.js +55 -108
  13. package/src/components/atoms/button-with-link/ButtonWithLink.stories.js +31 -160
  14. package/src/components/atoms/checkbox/Checkbox.stories.js +29 -148
  15. package/src/components/atoms/country-dropdown/CountryDropdown.stories.js +27 -61
  16. package/src/components/atoms/detail/Detail.js +26 -0
  17. package/src/components/atoms/display-box/DisplayBox.stories.js +21 -65
  18. package/src/components/atoms/display-card/DisplayCard.stories.js +22 -163
  19. package/src/components/atoms/dropdown/Dropdown.stories.js +10 -91
  20. package/src/components/atoms/form-layouts/FormInput.stories.js +26 -212
  21. package/src/components/atoms/form-select/FormSelect.stories.js +29 -55
  22. package/src/components/atoms/formatted-address/FormattedAddress.stories.js +27 -133
  23. package/src/components/atoms/icons/icons.stories.js +116 -0
  24. package/src/components/atoms/labeled-amount/LabeledAmount.stories.js +34 -110
  25. package/src/components/atoms/line-item/LineItem.stories.js +22 -89
  26. package/src/components/atoms/link/Link.stories.js +49 -155
  27. package/src/components/atoms/loading-line/LoadingLine.js +10 -14
  28. package/src/components/atoms/loading-line/LoadingLine.stories.js +28 -132
  29. package/src/components/atoms/nav-footer/NavFooter.stories.js +22 -235
  30. package/src/components/atoms/nav-header/NavHeader.stories.js +21 -122
  31. package/src/components/atoms/password-requirements/PasswordRequirements.stories.js +44 -108
  32. package/src/components/atoms/placeholder/Placeholder.stories.js +36 -164
  33. package/src/components/atoms/searchable-select/SearchableSelect.stories.js +28 -103
  34. package/src/components/atoms/state-province-dropdown/StateProvinceDropdown.stories.js +40 -65
  35. package/src/components/atoms/table/Table.stories.js +75 -59
  36. package/src/components/atoms/table/TableRow.js +0 -1
  37. package/src/components/atoms/title/Title.js +23 -0
  38. package/src/components/atoms/toggle-switch/ToggleSwitch.stories.js +20 -103
  39. package/src/components/atoms/toggle-switch/ToggleSwitch.theme.js +5 -8
  40. package/src/components/molecules/address-form/AddressForm.stories.js +20 -223
  41. package/src/components/molecules/banner/Banner.stories.js +26 -122
  42. package/src/components/molecules/change-password-form/ChangePasswordForm.stories.js +19 -203
  43. package/src/components/molecules/collapsible-section/CollapsibleSection.stories.js +61 -210
  44. package/src/components/molecules/edit-name-form/EdidNameForm.stories.js +24 -0
  45. package/src/components/molecules/index.js +0 -1
  46. package/src/components/molecules/link-card/LinkCard.stories.js +72 -287
  47. package/src/components/molecules/login-form/LoginForm.stories.js +21 -117
  48. package/src/components/molecules/modal/Modal.stories.js +128 -342
  49. package/src/components/molecules/module/Module.stories.js +25 -267
  50. package/src/components/molecules/multiple-select-filter/MultipleSelectFilter.js +61 -295
  51. package/src/components/molecules/multiple-select-filter/{MultipleSelectFilter.oldstories.js → MultipleSelectFilter.stories.js} +1 -1
  52. package/src/components/molecules/multiple-select-filter/MultipleSelectFilter.styled.js +4 -4
  53. package/src/components/molecules/multiple-select-filter/__private__/ActionLinkButton.js +24 -0
  54. package/src/components/molecules/multiple-select-filter/__private__/FilterButton.js +85 -0
  55. package/src/components/molecules/multiple-select-filter/__private__/FilterDropdown.js +23 -0
  56. package/src/components/molecules/multiple-select-filter/__private__/FilterableList.js +144 -0
  57. package/src/components/molecules/multiple-select-filter/__private__/FilterableListItem.js +67 -0
  58. package/src/components/molecules/multiple-select-filter/__private__/SearchBox.js +38 -0
  59. package/src/components/molecules/multiple-select-filter/__private__/useKeyboardNavigation.js +84 -0
  60. package/src/components/molecules/multiple-select-filter/__private__/util.js +31 -0
  61. package/src/components/molecules/obligation/icons/PropertyPersonalIcon.js +1 -1
  62. package/src/components/molecules/pagination/Pagination.stories.js +28 -177
  63. package/src/components/molecules/tabs/Tabs.stories.js +227 -135
  64. package/src/components/molecules/toast-notification/ToastNotification.stories.js +105 -0
  65. package/src/hooks/use-outside-click/index.js +4 -5
  66. package/src/util/index.js +1 -3
  67. package/src/components/atoms/alert/Alert.mdx +0 -19
  68. package/src/components/atoms/badge/Badge.mdx +0 -27
  69. package/src/components/atoms/breadcrumb/Breadcrumb.mdx +0 -21
  70. package/src/components/atoms/button-with-link/ButtonWithLink.mdx +0 -21
  71. package/src/components/atoms/card/Card.mdx +0 -41
  72. package/src/components/atoms/card/Card.stories.js +0 -360
  73. package/src/components/atoms/checkbox/Checkbox.mdx +0 -15
  74. package/src/components/atoms/checkbox/Checkbox.oldstories.js +0 -30
  75. package/src/components/atoms/country-dropdown/CountryDropdown.mdx +0 -36
  76. package/src/components/atoms/detail/Detail.mdx +0 -32
  77. package/src/components/atoms/detail/Detail.stories.js +0 -156
  78. package/src/components/atoms/display-box/DisplayBox.mdx +0 -11
  79. package/src/components/atoms/display-card/DisplayCard.mdx +0 -13
  80. package/src/components/atoms/dropdown/Dropdown.mdx +0 -65
  81. package/src/components/atoms/form-layouts/FormInput.mdx +0 -38
  82. package/src/components/atoms/form-select/FormSelect.mdx +0 -42
  83. package/src/components/atoms/formatted-address/FormattedAddress.mdx +0 -13
  84. package/src/components/atoms/formatted-bank-account/FormattedBankAccount.mdx +0 -17
  85. package/src/components/atoms/formatted-bank-account/FormattedBankAccount.stories.js +0 -57
  86. package/src/components/atoms/formatted-credit-card/FormattedCreditCard.mdx +0 -40
  87. package/src/components/atoms/formatted-credit-card/FormattedCreditCard.stories.js +0 -74
  88. package/src/components/atoms/icons/Icons.mdx +0 -40
  89. package/src/components/atoms/icons/Icons.stories.js +0 -325
  90. package/src/components/atoms/labeled-amount/LabeledAmount.mdx +0 -23
  91. package/src/components/atoms/line-item/LineItem.mdx +0 -28
  92. package/src/components/atoms/link/Link.mdx +0 -19
  93. package/src/components/atoms/loading/Loading.mdx +0 -13
  94. package/src/components/atoms/loading/Loading.stories.js +0 -22
  95. package/src/components/atoms/loading-line/LoadingLine.mdx +0 -15
  96. package/src/components/atoms/nav-footer/NavFooter.mdx +0 -15
  97. package/src/components/atoms/nav-header/NavHeader.mdx +0 -13
  98. package/src/components/atoms/nav-tabs/NavTabs.mdx +0 -30
  99. package/src/components/atoms/nav-tabs/NavTabs.stories.js +0 -49
  100. package/src/components/atoms/password-requirements/PasswordRequirements.mdx +0 -39
  101. package/src/components/atoms/placeholder/Placeholder.mdx +0 -19
  102. package/src/components/atoms/searchable-select/SearchableSelect.mdx +0 -44
  103. package/src/components/atoms/state-province-dropdown/StateProvinceDropdown.mdx +0 -36
  104. package/src/components/atoms/table/Table.mdx +0 -71
  105. package/src/components/atoms/table/Table.oldstories.js +0 -84
  106. package/src/components/atoms/title/Title.mdx +0 -26
  107. package/src/components/atoms/title/Title.stories.js +0 -144
  108. package/src/components/atoms/toggle-switch/ToggleSwitch.mdx +0 -17
  109. package/src/components/atoms/typeahead-input/TypeaheadInput.mdx +0 -13
  110. package/src/components/atoms/typeahead-input/TypeaheadInput.stories.js +0 -63
  111. package/src/components/molecules/address-form/AddressForm.mdx +0 -18
  112. package/src/components/molecules/banner/Banner.mdx +0 -23
  113. package/src/components/molecules/change-password-form/ChangePasswordForm.mdx +0 -15
  114. package/src/components/molecules/collapsible-section/CollapsibleSection.mdx +0 -15
  115. package/src/components/molecules/edit-name-form/EditNameForm.mdx +0 -13
  116. package/src/components/molecules/edit-name-form/EditNameForm.stories.js +0 -117
  117. package/src/components/molecules/idle-modal/IdleModal.js +0 -101
  118. package/src/components/molecules/idle-modal/IdleModal.mdx +0 -17
  119. package/src/components/molecules/idle-modal/IdleModal.stories.js +0 -180
  120. package/src/components/molecules/idle-modal/index.d.ts +0 -16
  121. package/src/components/molecules/idle-modal/index.js +0 -3
  122. package/src/components/molecules/link-card/LinkCard.mdx +0 -17
  123. package/src/components/molecules/login-form/LoginForm.mdx +0 -16
  124. package/src/components/molecules/modal/Modal.mdx +0 -17
  125. package/src/components/molecules/module/Module.mdx +0 -17
  126. package/src/components/molecules/obligation/Obligation.mdx +0 -23
  127. package/src/components/molecules/obligation/Obligation.stories.js +0 -460
  128. package/src/components/molecules/pagination/Pagination.mdx +0 -15
  129. package/src/components/molecules/popover/Popover.mdx +0 -15
  130. package/src/components/molecules/popover/Popover.stories.js +0 -220
  131. package/src/components/molecules/tabs/Tabs.mdx +0 -17
  132. package/src/components/molecules/toast-notification/Toast.mdx +0 -15
  133. package/src/components/molecules/toast-notification/Toast.stories.js +0 -183
  134. package/src/stories/Button.stories.ts +0 -53
  135. package/src/stories/Button.tsx +0 -48
  136. package/src/stories/Configure.mdx +0 -364
  137. package/src/stories/Header.stories.ts +0 -33
  138. package/src/stories/Header.tsx +0 -56
  139. package/src/stories/Page.stories.ts +0 -32
  140. package/src/stories/Page.tsx +0 -73
  141. package/src/stories/assets/accessibility.png +0 -0
  142. package/src/stories/assets/accessibility.svg +0 -5
  143. package/src/stories/assets/addon-library.png +0 -0
  144. package/src/stories/assets/assets.png +0 -0
  145. package/src/stories/assets/avif-test-image.avif +0 -0
  146. package/src/stories/assets/context.png +0 -0
  147. package/src/stories/assets/discord.svg +0 -15
  148. package/src/stories/assets/docs.png +0 -0
  149. package/src/stories/assets/figma-plugin.png +0 -0
  150. package/src/stories/assets/github.svg +0 -3
  151. package/src/stories/assets/share.png +0 -0
  152. package/src/stories/assets/styling.png +0 -0
  153. package/src/stories/assets/testing.png +0 -0
  154. package/src/stories/assets/theming.png +0 -0
  155. package/src/stories/assets/tutorials.svg +0 -12
  156. package/src/stories/assets/youtube.svg +0 -4
  157. package/src/stories/button.css +0 -30
  158. package/src/stories/header.css +0 -32
  159. package/src/stories/page.css +0 -69
  160. package/src/util/idleTimerUtils.js +0 -36
  161. /package/src/components/atoms/add-obligation/{AddObligation.oldstories.js → AddObligation.stories.js} +0 -0
  162. /package/src/components/atoms/amount-callout/{AmountCallout.oldstories.js → AmountCallout.stories.js} +0 -0
  163. /package/src/components/atoms/checkbox-list/{CheckboxList.oldstories.js → CheckboxList.stories.js} +0 -0
  164. /package/src/components/atoms/form-layouts/{FormLayouts.oldstories.js → FormLayouts.stories.js} +0 -0
  165. /package/src/components/atoms/hamburger-button/{HamburgerButton.oldstories.js → HamburgerButton.stories.js} +0 -0
  166. /package/src/components/atoms/heading/{Heading.oldstories.js → Heading.stories.js} +0 -0
  167. /package/src/components/atoms/layouts/examples/box-example/{BoxExample.oldstories.js → BoxExample.stories.js} +0 -0
  168. /package/src/components/atoms/layouts/examples/center-example/{CenterExample.oldstories.js → CenterExample.stories.js} +0 -0
  169. /package/src/components/atoms/layouts/examples/cluster-example/{ClusterExample.oldstories.js → ClusterExample.stories.js} +0 -0
  170. /package/src/components/atoms/layouts/examples/cover-example/{CoverExample.oldstories.js → CoverExample.stories.js} +0 -0
  171. /package/src/components/atoms/layouts/examples/frame-example/{FrameExample.oldstories.js → FrameExample.stories.js} +0 -0
  172. /package/src/components/atoms/layouts/examples/grid-example/{GridExample.oldstories.js → GridExample.stories.js} +0 -0
  173. /package/src/components/atoms/layouts/examples/imposter-example/{ImposterExample.oldstories.js → ImposterExample.stories.js} +0 -0
  174. /package/src/components/atoms/layouts/examples/motion-example/{MotionExample.oldstories.js → MotionExample.stories.js} +0 -0
  175. /package/src/components/atoms/layouts/examples/reel-example/{ReelExample.oldstories.js → ReelExample.stories.js} +0 -0
  176. /package/src/components/atoms/layouts/examples/sidebar-example/{SidebarExample.oldstories.js → SidebarExample.stories.js} +0 -0
  177. /package/src/components/atoms/layouts/examples/stack-example/{StackExample.oldstories.js → StackExample.stories.js} +0 -0
  178. /package/src/components/atoms/layouts/examples/switcher-example/{SwitcherExample.oldstories.js → SwitcherExample.stories.js} +0 -0
  179. /package/src/components/atoms/paragraph/{Paragraph.oldstories.js → Paragraph.stories.js} +0 -0
  180. /package/src/components/atoms/processing-fee/{ProcessingFee.oldstories.js → ProcessingFee.stories.js} +0 -0
  181. /package/src/components/atoms/search/{Search.oldstories.js → Search.stories.js} +0 -0
  182. /package/src/components/atoms/solid-divider/{SolidDivider.oldstories.js → SolidDivider.stories.js} +0 -0
  183. /package/src/components/atoms/sortable-table-heading/{SortableTableHeading.oldstories.js → SortableTableHeading.stories.js} +0 -0
  184. /package/src/components/atoms/spinner/{Spinner.oldstories.js → Spinner.stories.js} +0 -0
  185. /package/src/components/atoms/tab/{Tab.oldstories.js → Tab.stories.js} +0 -0
  186. /package/src/components/atoms/text/{Text.oldstories.js → Text.stories.js} +0 -0
  187. /package/src/components/atoms/typeahead-input/{TypeaheadIinput.oldstories.js → TypeaheadIinput.stories.js} +0 -0
  188. /package/src/components/atoms/wallet-name/{WalletName.oldstories.js → WalletName.stories.js} +0 -0
  189. /package/src/components/molecules/account-and-routing-modal/{AccountAndRoutingModal.oldstories.js → AccountAndRoutingModal.stories.js} +0 -0
  190. /package/src/components/molecules/editable-list/{EditableList.oldstories.js → EditableList.stories.js} +0 -0
  191. /package/src/components/molecules/email-form/{EmailForm.oldstories.js → EmailForm.stories.js} +0 -0
  192. /package/src/components/molecules/forgot-password-form/{ForgotPasswordForm.oldstories.js → ForgotPasswordForm.stories.js} +0 -0
  193. /package/src/components/molecules/highlight-tab-row/{HighlightTabRow.oldstories.js → HighlightTabRow.stories.js} +0 -0
  194. /package/src/components/molecules/obligation/modules/{AmountModule.oldstories.js → AmountModule.stories.js} +0 -0
  195. /package/src/components/molecules/payment-button-bar/{PaymentButtonBar.oldstories.js → PaymentButtonBar.stories.js} +0 -0
  196. /package/src/components/molecules/payment-details/{PaymentDetails.oldstories.js → PaymentDetails.stories.js} +0 -0
  197. /package/src/components/molecules/payment-form-ach/{PaymentFormACH.oldstories.js → PaymentFormACH.stories.js} +0 -0
  198. /package/src/components/molecules/payment-form-card/{PaymentFormCard.oldstories.js → PaymentFormCard.stories.js} +0 -0
  199. /package/src/components/molecules/periscope-dashboard-iframe/{PeriscopeDashBoardIframe.oldstories.js → PeriscopeDashBoardIframe.stories.js} +0 -0
  200. /package/src/components/molecules/phone-form/{PhoneForm.oldstories.js → PhoneForm.stories.js} +0 -0
  201. /package/src/components/molecules/popup-menu/{PopupMenu.oldstories.js → PopupMenu.stories.js} +0 -0
  202. /package/src/components/molecules/radio-group/{RadioGroup.oldstories.js → RadioGroup.stories.js} +0 -0
  203. /package/src/components/molecules/radio-section/{RadioSection.oldstories.js → RadioSection.stories.js} +0 -0
  204. /package/src/components/molecules/registration-form/{RegistrationForm.oldstories.js → RegistrationForm.stories.js} +0 -0
  205. /package/src/components/molecules/reset-confirmation-form/{ResetConfirmationForm.oldstories.js → ResetConfirmationForm.stories.js} +0 -0
  206. /package/src/components/molecules/reset-password-form/{ResetPasswordForm.oldstories.js → ResetPasswordForm.stories.js} +0 -0
  207. /package/src/components/molecules/reset-password-success/{ResetPasswordSuccess.oldstories.js → ResetPasswordSuccess.stories.js} +0 -0
  208. /package/src/components/molecules/tab-sidebar/{TabSidebar.oldstories.js → TabSidebar.stories.js} +0 -0
  209. /package/src/components/molecules/terms-and-conditions/{TermsAndConditions.oldstories.js → TermsAndConditions.stories.js} +0 -0
  210. /package/src/components/molecules/terms-and-conditions-modal/{TermsAndConditionsModal.oldstories.js → TermsAndConditionsModal.stories.js} +0 -0
  211. /package/src/components/molecules/workflow-tile/{WorkflowTile.oldstories.js → WorkflowTile.stories.js} +0 -0
@@ -1,101 +0,0 @@
1
- import React from "react";
2
- import Modal from "../modal";
3
- import { Box, Motion, Stack } from "../../atoms/layouts";
4
- import Paragraph from "../../atoms/paragraph";
5
-
6
- const IdleModal = ({
7
- modalOpen,
8
- toggleModal,
9
- timeLeftToLogout = 0,
10
- totalLogoutTime = 30,
11
- logout,
12
- cancelLogout,
13
- useCheckoutContent
14
- }) => {
15
- const percent =
16
- (totalLogoutTime - timeLeftToLogout) * (100 / totalLogoutTime);
17
- const transition = {
18
- ease: "easeInOut",
19
- duration: totalLogoutTime
20
- };
21
- const variants = {
22
- enter: {
23
- x: "-100%",
24
- backgroundColor: "#317D4F"
25
- },
26
- animate: {
27
- x: ["-100%", `${percent}%`],
28
- backgroundColor: ["#317D4F", "#93A441", "#F4CB32", "#E36E43", "#D11053"],
29
- times: [0, 0.4, 0.5, 0.6, 0.8],
30
- transition
31
- }
32
- };
33
-
34
- const continueText = useCheckoutContent ? "Continue" : "Stay Logged In";
35
-
36
- const cancelText = useCheckoutContent ? "End Session" : "Log Off";
37
-
38
- const paragraphText = useCheckoutContent
39
- ? `Are you still there? Your payment will be cancelled in ${timeLeftToLogout} seconds.`
40
- : `Are you still there? For your security, you will be logged out in ${timeLeftToLogout} seconds.`;
41
-
42
- const modalBody = (
43
- <Box padding="0">
44
- <Stack>
45
- <Paragraph>{paragraphText}</Paragraph>
46
- <Motion>
47
- <Box
48
- padding="0 0 1px 0"
49
- minHeight="10px"
50
- width="100%"
51
- borderRadius="6px"
52
- extraStyles="position: relative; overflow: hidden;"
53
- >
54
- <Motion
55
- padding="0 0 1px 0"
56
- height="10px"
57
- width="100%"
58
- borderRadius="6px"
59
- extraStyles="position: absolute;"
60
- variants={variants}
61
- initial="enter"
62
- animate={modalOpen ? "animate" : "enter"}
63
- exit="enter"
64
- />
65
- </Box>
66
- </Motion>
67
- </Stack>
68
- </Box>
69
- );
70
- const modalExtraProps = {
71
- modalHeaderText: "Your session is about to expire!",
72
- modalBodyText: modalBody,
73
- continueButtonText: continueText,
74
- cancelButtonText: cancelText,
75
- continueAction: () => {
76
- cancelLogout();
77
- toggleModal(false);
78
- },
79
- cancelAction: () => {
80
- logout();
81
- toggleModal(false);
82
- }
83
- };
84
- return (
85
- <Modal
86
- showModal={() => toggleModal(true)}
87
- hideModal={() => {
88
- cancelLogout();
89
- toggleModal(false);
90
- }}
91
- modalOpen={modalOpen}
92
- defaultWrapper={false}
93
- underlayClickExits={false}
94
- {...modalExtraProps}
95
- >
96
- <Box padding="0" />
97
- </Modal>
98
- );
99
- };
100
-
101
- export default IdleModal;
@@ -1,17 +0,0 @@
1
- import { Canvas, Meta, Title, Story, Controls } from '@storybook/blocks';
2
-
3
- import * as IdleModalStories from './IdleModal.stories.js';
4
-
5
- <Meta of={IdleModalStories} />
6
-
7
- <Title />
8
-
9
- The IdleModal is a molecule used to display an animated progress bar and a message informing a user that they will shortly be logged out of an application due to idleness. The modal is a "dumb" component that requires the countdown timer be managed in the parent component. CB Components has a useful react hook contained in the `idleTimerUtils.js` file that NFE uses to help manage the running of the IdleModal.
10
-
11
- For detecting user inactivity, an application can either implement its own mouse/keyboard event tracking, or rely on a third party package like react-idle-timer. An implementation example is available in the component's story file.
12
-
13
- As of August 2024, all three of the applications (NFE, RevM, POS) to use the IdleModal use customized versions that live within the application code. A backlog ticket has been created to unify all existing implementations to the CB Components standard.
14
-
15
- <Controls />
16
-
17
- <Story />
@@ -1,180 +0,0 @@
1
- import React, { useState } from "react";
2
- import IdleModal from "./IdleModal";
3
- import { fn } from "@storybook/test";
4
- import { ButtonWithAction } from "../../atoms";
5
- import { Box, Stack } from "../../atoms/layouts";
6
- import Text from "../../atoms/text";
7
- import useLogoutTimers from "../../../util/idleTimerUtils";
8
-
9
- export default {
10
- title: "Molecules/IdleModal",
11
- component: IdleModal,
12
- tags: ["!autodocs"],
13
- parameters: {
14
- layout: "centered",
15
- controls: { expanded: true }
16
- },
17
- args: {
18
- modalOpen: undefined,
19
- toggleModal: fn(),
20
- timeLeftToLogout: 0,
21
- totalLogoutTime: 30,
22
- logout: fn(),
23
- cancelLogout: fn(),
24
- useCheckoutContent: undefined
25
- },
26
- argTypes: {
27
- modalOpen: {
28
- description: "Whether the modal is open",
29
- table: {
30
- type: { summary: "boolean" },
31
- defaultValue: { summary: undefined }
32
- }
33
- },
34
- toggleModal: {
35
- description: "Function to toggle the modal open or closed",
36
- table: {
37
- type: { summary: "function" },
38
- defaultValue: { summary: undefined }
39
- }
40
- },
41
- timeLeftToLogout: {
42
- description:
43
- "Amount of time remaining before logout function is called. Should be supplied by parent component using setInterval or other mechanism to decrement a counter.",
44
- table: {
45
- type: { summary: "number" },
46
- defaultValue: { summary: 0 }
47
- }
48
- },
49
- totalLogoutTime: {
50
- description:
51
- "Total amount of time before logout function is called. Used with timeLeftToLogout in order to animate the progress bar.",
52
- table: {
53
- type: { summary: "number" },
54
- defaultValue: { summary: 30 }
55
- }
56
- },
57
- logout: {
58
- description:
59
- "Function to run when timer reaches zero. Typically a redux action dispatcher, but can be a wrapping function that handles the logout sequence itself.",
60
- table: {
61
- type: { summary: "function" },
62
- defaultValue: { summary: undefined }
63
- }
64
- },
65
- cancelLogout: {
66
- description:
67
- "Function to run if user closes or cancels modal early. Typically a redux action dispatcher, but can be a wrapping function.",
68
- table: {
69
- type: { summary: "function" },
70
- defaultValue: { summary: undefined }
71
- }
72
- },
73
- useCheckoutContent: {
74
- description:
75
- "Whether text of modal should reference checkout experience / user's payment.",
76
- table: {
77
- type: { summary: "boolean" },
78
- defaultValue: { summary: undefined }
79
- }
80
- }
81
- }
82
- };
83
-
84
- const IdleModalComponent = args => {
85
- const { totalLogoutTime, ...rest } = args;
86
- const [modalOpen, setModalOpen] = useState(false);
87
- const [logoutTriggered, setLogoutTriggered] = useState(false);
88
- const [cancelLogoutTriggered, setCancelLogoutTriggered] = useState(false);
89
- const [timeLeftToLogout, setTimeLeftToLogout] = useState(totalLogoutTime);
90
- const [logoutTimerOn, setLogoutTimerOn] = useState(false);
91
-
92
- const runIdleModal = () => {
93
- setLogoutTriggered(false);
94
- setCancelLogoutTriggered(false);
95
- setModalOpen(true);
96
- setLogoutTimerOn(true);
97
- };
98
-
99
- const resetLogoutTimer = () => {
100
- clearInterval(logoutTimers.interval);
101
- clearTimeout(logoutTimers.timer);
102
- setTimeLeftToLogout(totalLogoutTime);
103
- };
104
-
105
- const handleLogout = () => {
106
- setModalOpen(false);
107
- setLogoutTriggered(true);
108
- setLogoutTimerOn(false);
109
- resetLogoutTimer();
110
- };
111
-
112
- const handleCancelLogout = () => {
113
- setModalOpen(false);
114
- setCancelLogoutTriggered(true);
115
- setLogoutTimerOn(false);
116
- resetLogoutTimer();
117
- };
118
-
119
- const logoutTimers = useLogoutTimers({
120
- logoutTimerOn,
121
- action: handleLogout,
122
- timeLeftToLogout,
123
- handleSetTimeLeft: setTimeLeftToLogout,
124
- initialTimeLeftToLogout: totalLogoutTime
125
- });
126
-
127
- let userStatus = "is logged in";
128
-
129
- if (logoutTriggered) {
130
- userStatus = "has logged out";
131
- }
132
- if (cancelLogoutTriggered) {
133
- userStatus = "has cancelled log out";
134
- }
135
-
136
- return (
137
- <Box>
138
- <Stack childGap="10rem">
139
- <Box>
140
- <Text>{`User Status: ${userStatus}`}</Text>
141
- </Box>
142
- <Box>
143
- <ButtonWithAction
144
- action={() => runIdleModal()}
145
- text="Trigger Idle Modal"
146
- />
147
- </Box>
148
- <Box>
149
- <IdleModal
150
- {...rest}
151
- totalLogoutTime={totalLogoutTime}
152
- timeLeftToLogout={timeLeftToLogout}
153
- modalOpen={modalOpen}
154
- toggleModal={() => setModalOpen(!modalOpen)}
155
- logout={() => handleLogout()}
156
- cancelLogout={() => handleCancelLogout()}
157
- />
158
- </Box>
159
- </Stack>
160
- </Box>
161
- );
162
- };
163
-
164
- export const BasicIdleModal = {
165
- render: args => IdleModalComponent(args)
166
- };
167
-
168
- export const CheckoutIdleModal = {
169
- args: {
170
- useCheckoutContent: true
171
- },
172
- render: args => IdleModalComponent(args)
173
- };
174
-
175
- export const LengthyIdleModal = {
176
- args: {
177
- totalLogoutTime: 300
178
- },
179
- render: args => IdleModalComponent(args)
180
- };
@@ -1,16 +0,0 @@
1
- import React, { HTMLAttributes } from "react";
2
- import Expand from "../../../util/expand";
3
- import { ReduxAction } from "../../../types/common";
4
-
5
- export interface IdleModalProps {
6
- modalOpen: boolean;
7
- toggleModal: (modalOpen: boolean) => void;
8
- timeLeftToLogout?: number; // in seconds
9
- totalLogoutTime?: number; // in seconds
10
- logout: () => ReduxAction;
11
- cancelLogout: () => ReduxAction;
12
- useCheckoutContent?: boolean;
13
- }
14
-
15
- export const IdleModal: React.FC<Expand<IdleModalProps> &
16
- HTMLAttributes<HTMLElement>>;
@@ -1,3 +0,0 @@
1
- import IdleModal from "./IdleModal";
2
-
3
- export default IdleModal;
@@ -1,17 +0,0 @@
1
- import { Canvas, Meta, Title, Story, Controls } from '@storybook/blocks';
2
-
3
- import * as LinkCardStories from './LinkCard.stories.js';
4
-
5
- <Meta of={LinkCardStories} />
6
-
7
- <Title />
8
-
9
- The LinkCard is a variant of the Card component that has been built to display a title, subtitle, and optionally additional content like a badge or icon. When clicked, the onClick function is called. Typically this function is used to navigate the user within the application.
10
-
11
- Currently, the LinkCard is used in NFE on the /find page to assist users in finding accounts to link to their profile or to make one-time payments on. The LinkCard can take arbitrary child components for both its left and right content, which makes it very flexible and useful for any application where a grid of tiles is needed.
12
-
13
- <Controls />
14
-
15
- <div style={{ marginBottom: "2em"}}>
16
- <Story />
17
- </div>
@@ -1,16 +0,0 @@
1
- import { Canvas, Meta, Title, Story, Controls } from '@storybook/blocks';
2
-
3
- import * as LoginFormStories from './LoginForm.stories.js';
4
-
5
- <Meta of={LoginFormStories} />
6
-
7
- <Title />
8
-
9
- Renders a form for users to login to the NFE User Profile. Built with [FormInput](?path=/docs/atoms-form-layouts-forminput--docs).
10
-
11
- The user is required to submit an email and password. Both inputs are validated as required inputs, while the email is also checked against the `isProbablyEmail` validator.
12
-
13
- <Controls />
14
-
15
-
16
- <Story />
@@ -1,17 +0,0 @@
1
- import { Canvas, Meta, Title, Story, Controls } from '@storybook/blocks';
2
-
3
- import * as ModalStories from './Modal.stories.js';
4
-
5
- <Meta of={ModalStories} />
6
-
7
- <Title />
8
-
9
- The Modal component is used to display modal popups to users. It uses the react-aria-modal package under the hood to ensure proper accessibility.
10
-
11
- The modal comes in two versions: v1 and v2. Version 1 is currently the most used version of the modal across our applications. In 2024, a refactored and redesigned version of the modal was built. This version, in addition to changing the design of the modal, fixed some longstanding issues with focus trapping and modals without buttons. All new implementations of modals should use v2, and the plan is to eventually transition all existing implementations of v1 modals to v2 modals.
12
-
13
- <Controls />
14
-
15
- <div style={{ marginBottom: "2em"}}>
16
- <Story />
17
- </div>
@@ -1,17 +0,0 @@
1
- import { Canvas, Meta, Title, Story, Controls } from '@storybook/blocks';
2
-
3
- import * as ModuleStories from './Module.stories.js';
4
-
5
- <Meta of={ModuleStories} />
6
-
7
- <Title />
8
-
9
- The Module is a component that is used to wrap content in a box with a preset box-shadow value. The component can take heading text to display above the child content, or just child content.
10
-
11
- If title text is supplied via the `heading` prop, current guidelines require use of the `as` and `fontSize` props to specify the HTML element and font size of the title text. Previous (now deprecated) versions of the Module relied on the `variant` prop to specify the element and font size of title text. For purposes of backwards compatability, that method is still supported, but all new use cases should try to use `as` and `fontSize` instead of `variant`.
12
-
13
- <Controls />
14
-
15
- <div style={{ marginBottom: "2em"}}>
16
- <Story />
17
- </div>
@@ -1,23 +0,0 @@
1
- import { Canvas, Meta, Title, Story, Controls } from '@storybook/blocks';
2
-
3
- import * as ObligationStories from './Obligation.stories.js';
4
-
5
- <Meta of={ObligationStories} />
6
-
7
- <Title />
8
-
9
- The Obligation is a purpose built component to display user accounts on NFE's User Profile. The component consumers configuration provided by FCS to dictate its icon and type. NFE uses this configuration to assemble the description and subDescription from the obligation's custom attributes. A full detail of the structure of the configuration object is beyond the scope of this documentation, but an example can be found in the story code, and further detail is available on Confluence within the implementation guides used by solutions engineers.
10
-
11
- The component currently has two states. An active obligation uses data from the user lookup and FCS to provide account details and amount due as well as controls to interact with the obligation, such as for viewing account details or enabling/disabling autopay.
12
-
13
- An inactive obligation is one whose data is not fully returned from lookup (this happens when our systems contain record of the account because of its association with a user, but the source system or source file ingested by FLS no longer provides that information, such as when a debt gets paid off). Inactive obligations look different and take some props to display a small amount of information to the user about what account used to be represented there.
14
-
15
- If the current user is a customer management admin accessing the profile via the RevM impersonation feature, then most of the interaction controls with the Obligation will be disabled.
16
-
17
- The Obligation was designed to be extensible to meet product needs in the future. New "modules" can be added to the modules directory that feature different collections of buttons or information display. Some work will need to be done to the main component code to support such additions.
18
-
19
- <Controls />
20
-
21
- <div style={{ marginBottom: "2em"}}>
22
- <Story />
23
- </div>