From 772fcc6b19b70a09960424fb10d2cff97b6106e2 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 19 Jul 2023 09:31:48 -0500 Subject: [PATCH 01/92] refactor: move link to to docs (TUP-535:4,5) --- libs/tup-components/src/accounts/ManageAccountMfa.tsx | 9 --------- libs/tup-components/src/mfa/MfaHeader.tsx | 9 +++++++-- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/libs/tup-components/src/accounts/ManageAccountMfa.tsx b/libs/tup-components/src/accounts/ManageAccountMfa.tsx index 06977e934..a2524a272 100644 --- a/libs/tup-components/src/accounts/ManageAccountMfa.tsx +++ b/libs/tup-components/src/accounts/ManageAccountMfa.tsx @@ -120,15 +120,6 @@ const MfaUnpair: React.FC<{ pairing: MfaTokenResponse }> = ({ pairing }) => { const MfaSectionHeader: React.FC = () => (
MFA Pairing -
- - MFA Documentation - -
); diff --git a/libs/tup-components/src/mfa/MfaHeader.tsx b/libs/tup-components/src/mfa/MfaHeader.tsx index 883cc41fb..6d71428f5 100644 --- a/libs/tup-components/src/mfa/MfaHeader.tsx +++ b/libs/tup-components/src/mfa/MfaHeader.tsx @@ -1,4 +1,3 @@ -import { Link } from 'react-router-dom'; import styles from './Mfa.module.css'; import TicketCreateModal from '../tickets/TicketCreateModal'; @@ -8,7 +7,13 @@ const MfaHeader: React.FC = () => {
Multifactor Authentication Pairing
Get Help |{' '} - Exit Pairing Process + + MFA Documentation +
); From f958384a019636826657fd0b77e3d0ea90fefa77 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 19 Jul 2023 19:44:31 -0500 Subject: [PATCH 02/92] refactor!: prepare for c-nav--piped (TUP-535:3) The pipe i slost, but will return when core-styles.base.css is v2.12.1. Currently, this requires TACC/Core-CMS to load TACC/Core-Styles v2.12.1. Maybe (later), Portal should use diff version than CMS. BREAKING CHANGE: This removes the pipe. --- libs/tup-components/src/mfa/MfaHeader.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/tup-components/src/mfa/MfaHeader.tsx b/libs/tup-components/src/mfa/MfaHeader.tsx index 6d71428f5..77e795c9d 100644 --- a/libs/tup-components/src/mfa/MfaHeader.tsx +++ b/libs/tup-components/src/mfa/MfaHeader.tsx @@ -5,8 +5,8 @@ const MfaHeader: React.FC = () => { return (
Multifactor Authentication Pairing
-
- Get Help |{' '} +
+
); }; From bbce029664c9bfaf5ffc275dabdecfe07a02a542 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 19 Jul 2023 21:15:30 -0500 Subject: [PATCH 03/92] refactor: change 5m msg, get help link (TUP-535:6) - Change text of the "5 minutes" message. - Add either link to trigger modal open or link to open modal.* * This prevents two modals being hidden into the makup. --- libs/core-components/src/lib/Button/Button.tsx | 3 +++ .../tup-components/src/mfa/MfaValidationPanel.tsx | 15 +++++++++++++-- .../TicketCreateModal/TicketCreateModal.tsx | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libs/core-components/src/lib/Button/Button.tsx b/libs/core-components/src/lib/Button/Button.tsx index 2670ccf57..b64f47a28 100644 --- a/libs/core-components/src/lib/Button/Button.tsx +++ b/libs/core-components/src/lib/Button/Button.tsx @@ -39,6 +39,7 @@ type ButtonTypeOtherSize = { type ButtonProps = React.PropsWithChildren<{ className?: string; + id?: string; iconNameBefore?: string; iconNameAfter?: string; dataTestid?: string; @@ -54,6 +55,7 @@ const Button: React.FC = ({ className, iconNameBefore, iconNameAfter, + id, type = 'secondary', size = '', dataTestid, @@ -74,6 +76,7 @@ const Button: React.FC = ({ return ( + ) : ( + Get Help + )} )} {error && ( diff --git a/libs/tup-components/src/tickets/TicketCreateModal/TicketCreateModal.tsx b/libs/tup-components/src/tickets/TicketCreateModal/TicketCreateModal.tsx index 5d887a995..dc66918cf 100644 --- a/libs/tup-components/src/tickets/TicketCreateModal/TicketCreateModal.tsx +++ b/libs/tup-components/src/tickets/TicketCreateModal/TicketCreateModal.tsx @@ -22,7 +22,7 @@ const TicketCreateModal: React.FC< return ( <> - Date: Wed, 19 Jul 2023 21:16:10 -0500 Subject: [PATCH 04/92] refactor: change qr error to reuse a help modal --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index beba23b79..3b5e9d228 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -6,6 +6,13 @@ import styles from './Mfa.module.css'; const MfaQRPanel: React.FC = () => { const { mutate, isLoading, data, isError } = useMfaPairTotp(); + + const ticketCreateModalButton = document.getElementById('TicketCreateModal'); + const hasTicketCreateModal = Boolean( ticketCreateModalButton ); + const openTicketCreateModal = () => { + ticketCreateModalButton?.click() + }; + return (
@@ -55,9 +62,13 @@ const MfaQRPanel: React.FC = () => {
There was an error generating your QR code. If this error persists, please{' '} - - submit a ticket - {' '} + {hasTicketCreateModal ? ( + + ) : ( + + submit a ticket + + )}{' '} and TACC User Services will assist you.
From fa9aa7cd904d5a376c0adaa4dd1fd8cf7b11ec85 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 19 Jul 2023 21:19:52 -0500 Subject: [PATCH 05/92] style: npx nx format:write --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 8 +++++--- libs/tup-components/src/mfa/MfaValidationPanel.tsx | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 3b5e9d228..85de36ae0 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -8,9 +8,9 @@ const MfaQRPanel: React.FC = () => { const { mutate, isLoading, data, isError } = useMfaPairTotp(); const ticketCreateModalButton = document.getElementById('TicketCreateModal'); - const hasTicketCreateModal = Boolean( ticketCreateModalButton ); + const hasTicketCreateModal = Boolean(ticketCreateModalButton); const openTicketCreateModal = () => { - ticketCreateModalButton?.click() + ticketCreateModalButton?.click(); }; return ( @@ -63,7 +63,9 @@ const MfaQRPanel: React.FC = () => { There was an error generating your QR code. If this error persists, please{' '} {hasTicketCreateModal ? ( - + ) : ( submit a ticket diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index 75935af15..e2b84c5d3 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -15,9 +15,9 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ }; const ticketCreateModalButton = document.getElementById('TicketCreateModal'); - const hasTicketCreateModal = Boolean( ticketCreateModalButton ); + const hasTicketCreateModal = Boolean(ticketCreateModalButton); const openTicketCreateModal = () => { - ticketCreateModalButton?.click() + ticketCreateModalButton?.click(); }; const pairingMessage = { @@ -46,7 +46,9 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ Didn't receive a message within 5 minutes? {hasTicketCreateModal ? ( - + ) : ( Get Help )} From 0ec0fd2e964698fea8f78a889fdc73977f16604b Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 20 Jul 2023 11:41:24 -0500 Subject: [PATCH 06/92] refactor: simplify `qr-code-box` markup and styles --- libs/tup-components/src/mfa/Mfa.module.css | 21 +++++------------ libs/tup-components/src/mfa/MfaQRPanel.tsx | 26 ++++++++++------------ 2 files changed, 18 insertions(+), 29 deletions(-) diff --git a/libs/tup-components/src/mfa/Mfa.module.css b/libs/tup-components/src/mfa/Mfa.module.css index 55b142564..a552fa9cb 100644 --- a/libs/tup-components/src/mfa/Mfa.module.css +++ b/libs/tup-components/src/mfa/Mfa.module.css @@ -42,23 +42,14 @@ text-overflow: none; } -.qr-code-box { - display: flex; - justify-content: center; - align-items: center; -} -.qr-code-box > div { - display: flex; +.qr-code-box > * { + --border-width: var(--global-border-width--xx-thick); + width: 200px; height: 200px; - border: 7px solid #D8D8D8; - margin-top: 20px; - margin-bottom: 20px; - justify-content: center; -} -.qr-code-box > img { - width: 100%; - height: 100%; + outline: var(--border-width) solid #D8D8D8; + margin-block: 20px; + margin-inline: var(--border-width); } .qr-code-error { max-width: 200px; diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 85de36ae0..1d149dc29 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -27,20 +27,18 @@ const MfaQRPanel: React.FC = () => { and scan the following QR code:
-
- {!data && !isLoading && ( - - )} - {!data && isLoading && } - {data && ( - Google MFA QR Code - )} -
+ {!data && !isLoading && ( + + )} + {!data && isLoading && } + {data && ( + Google MFA QR Code + )}
{data && (
From 6116bcda06c182a6d36b028c4d6608bff7f20abf Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 20 Jul 2023 12:16:34 -0500 Subject: [PATCH 07/92] refactor: use lists for mfa panels --- libs/tup-components/src/mfa/Mfa.module.css | 17 +++++++++++++---- libs/tup-components/src/mfa/MfaPairingView.tsx | 16 ++++++++++------ libs/tup-components/src/mfa/MfaQRPanel.tsx | 6 +++--- libs/tup-components/src/mfa/MfaSmsPanel.tsx | 6 +++--- .../src/mfa/MfaValidationPanel.tsx | 4 ++-- 5 files changed, 31 insertions(+), 18 deletions(-) diff --git a/libs/tup-components/src/mfa/Mfa.module.css b/libs/tup-components/src/mfa/Mfa.module.css index a552fa9cb..355d365f6 100644 --- a/libs/tup-components/src/mfa/Mfa.module.css +++ b/libs/tup-components/src/mfa/Mfa.module.css @@ -3,14 +3,23 @@ display: flex; flex-wrap: wrap; padding: var(--global-space--section); - gap: 20px; + gap: var(--global-space--section-left); } -.pairing-container > div { - max-width: 375px; +ol.pairing-container { + margin-bottom: 0; /* overwrite core-styles.base.css */ } .pairing-separator { - border-left: 2px solid #D8D8D8 + border-left: var(--global-border-width--normal) solid var(--global-color-primary--light); +} +li.pairing-separator { + list-style-type: none; +} + +/* To add space between "2." and separator */ +.pairing-separator + li { + /* This assumes `list-style-position: outside` (browser default) */ + margin-left: 1.25em; } .mfa-type-selection { diff --git a/libs/tup-components/src/mfa/MfaPairingView.tsx b/libs/tup-components/src/mfa/MfaPairingView.tsx index b8e814767..ddbc52212 100644 --- a/libs/tup-components/src/mfa/MfaPairingView.tsx +++ b/libs/tup-components/src/mfa/MfaPairingView.tsx @@ -6,12 +6,16 @@ import styles from './Mfa.module.css'; const MfaPairingLayout: React.FC<{ method: 'sms' | 'totp' }> = ({ method }) => { return ( -
- {method === 'totp' && } - {method === 'sms' && } -
- -
+
    +
  1. + {method === 'totp' && } + {method === 'sms' && } +
  2. +
  3. +
  4. + +
  5. +
); }; diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 1d149dc29..4751561cc 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -14,9 +14,9 @@ const MfaQRPanel: React.FC = () => { }; return ( -
+ <>
- 1. Open an approved{' '} + Open an approved{' '} {
)} -
+ ); }; diff --git a/libs/tup-components/src/mfa/MfaSmsPanel.tsx b/libs/tup-components/src/mfa/MfaSmsPanel.tsx index b91a9cb56..9e9112ab5 100644 --- a/libs/tup-components/src/mfa/MfaSmsPanel.tsx +++ b/libs/tup-components/src/mfa/MfaSmsPanel.tsx @@ -12,8 +12,8 @@ const MfaSmsPanel: React.FC = () => { smsMutation.mutate({ phoneNumber }); }; return ( -
- 1. Enter your phone number: + <> + Enter your phone number:
onSubmit(e)} className={styles['mfa-form']}>
)} -
+ ); }; diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index e2b84c5d3..49acdf027 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -21,8 +21,8 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ }; const pairingMessage = { - totp: '2. Enter the token shown in the app to continue the pairing.', - sms: '2. Enter the token sent to your phone number.', + totp: 'Enter the token shown in the app to continue the pairing.', + sms: 'Enter the token sent to your phone number.', }; return ( From d2ba1308ff6c2c1b144bdb9dec3fae872f126ffe Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 20 Jul 2023 16:00:21 -0500 Subject: [PATCH 08/92] fix: missing space before "Get help." link --- libs/tup-components/src/mfa/MfaValidationPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index 49acdf027..aa1976618 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -44,7 +44,7 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ {tokenType === 'sms' && ( - Didn't receive a message within 5 minutes? + Didn't receive a message within 5 minutes?{' '} {hasTicketCreateModal ? (
{data && ( -
- If your mobile device does not have a camera capable of scanning QR - codes, the following text code can be used: -
- {data.otpkey.value_b32}  ( +

+ Can't scan QR code? data.otpkey.value_b32  ( ) -

+

)} {!data && isError && ( - -
- There was an error generating your QR code. If this error persists, - please{' '} - {hasTicketCreateModal ? ( - - ) : ( - - submit a ticket - - )}{' '} - and TACC User Services will assist you. -
+ + Unable to display QR code. If this error persists, + please{' '} + {hasTicketCreateModal ? ( + + ) : ( + + submit a ticket + + )}{' '} )} diff --git a/libs/tup-components/src/mfa/MfaSmsPanel.tsx b/libs/tup-components/src/mfa/MfaSmsPanel.tsx index 9e9112ab5..ae21b9f34 100644 --- a/libs/tup-components/src/mfa/MfaSmsPanel.tsx +++ b/libs/tup-components/src/mfa/MfaSmsPanel.tsx @@ -33,15 +33,12 @@ const MfaSmsPanel: React.FC = () => {
{smsMutation.isError && ( - -
- There was an error generating your SMS pairing. If this error - persists, please{' '} - - submit a ticket - {' '} - and TACC User Services will assist you. -
+ + Unable to pair via SMS. If this error + persists, please{' '} + + submit a ticket + )} diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index aa1976618..393e562bd 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -26,7 +26,7 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ }; return ( -
+ <> {pairingMessage[tokenType]}
onSubmit(e)} className={styles['mfa-form']}>
{tokenType === 'sms' && ( - +

Didn't receive a message within 5 minutes?{' '} {hasTicketCreateModal ? ( - ) : ( - - submit a ticket - - )}{' '} + Unable to display QR code. If this error persists,{' '} + + submit a ticket + )} diff --git a/libs/tup-components/src/mfa/MfaSmsPanel.tsx b/libs/tup-components/src/mfa/MfaSmsPanel.tsx index ae21b9f34..2eb0834d2 100644 --- a/libs/tup-components/src/mfa/MfaSmsPanel.tsx +++ b/libs/tup-components/src/mfa/MfaSmsPanel.tsx @@ -35,7 +35,7 @@ const MfaSmsPanel: React.FC = () => { {smsMutation.isError && ( Unable to pair via SMS. If this error - persists, please{' '} + persists,{' '} submit a ticket diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index 393e562bd..f48972e17 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -14,12 +14,6 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ mutate({ password: tokenValue, type: tokenType }); }; - const ticketCreateModalButton = document.getElementById('TicketCreateModal'); - const hasTicketCreateModal = Boolean(ticketCreateModalButton); - const openTicketCreateModal = () => { - ticketCreateModalButton?.click(); - }; - const pairingMessage = { totp: 'Enter the token shown in the app to continue the pairing.', sms: 'Enter the token sent to your phone number.', @@ -45,13 +39,7 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ {tokenType === 'sms' && (

Didn't receive a message within 5 minutes?{' '} - {hasTicketCreateModal ? ( - - ) : ( - Get Help - )} + Get Help

)} {error && ( From 1d5ca09b387d9c3bee2eb2511210ca5a7633999f Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 20 Jul 2023 16:48:22 -0500 Subject: [PATCH 11/92] fix: restore code that I had made text for testing --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index ba0c34a24..a22240ca0 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -35,7 +35,7 @@ const MfaQRPanel: React.FC = () => { {data && (

- Can't scan QR code? data.otpkey.value_b32  ( + Can't scan QR code? {data.otpkey.value_b32}  ( Date: Thu, 20 Jul 2023 16:58:49 -0500 Subject: [PATCH 13/92] feat: new message if QR code alt. is unavilable --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index a22240ca0..47552c8f5 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -33,7 +33,7 @@ const MfaQRPanel: React.FC = () => { Google MFA QR Code )} - {data && ( + {data && data.otpkey && (

Can't scan QR code? {data.otpkey.value_b32}  ( )} {!data && isLoading && } - {data && ( - Google MFA QR Code - )} + {data && Google MFA QR Code} {data && data.otpkey && (

@@ -48,19 +43,13 @@ const MfaQRPanel: React.FC = () => { {data && !data.otpkey && (

Can't scan QR code?{' '} - - submit a ticket - - . + submit a ticket.

)} {!data && isError && ( Unable to display QR code. If this error persists,{' '} - - submit a ticket - - . + submit a ticket. )} diff --git a/libs/tup-components/src/mfa/MfaSmsPanel.tsx b/libs/tup-components/src/mfa/MfaSmsPanel.tsx index 2845fab44..776d861c9 100644 --- a/libs/tup-components/src/mfa/MfaSmsPanel.tsx +++ b/libs/tup-components/src/mfa/MfaSmsPanel.tsx @@ -34,12 +34,8 @@ const MfaSmsPanel: React.FC = () => { {smsMutation.isError && ( - Unable to pair via SMS. If this error - persists,{' '} - - submit a ticket - - . + Unable to pair via SMS. If this error persists,{' '} + submit a ticket. )} diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index f48972e17..5486f3c5f 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -43,7 +43,11 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({

)} {error && ( - + Error validating MFA token: error.message )} From eb77b11305cbaa7f0a17fe1199d2ae6c31272036 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 11:24:53 -0500 Subject: [PATCH 20/92] fix: bad grammar in error message --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 00684fb07..2f6cc68c1 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -43,7 +43,7 @@ const MfaQRPanel: React.FC = () => { {data && !data.otpkey && (

Can't scan QR code?{' '} - submit a ticket. + Submit a ticket.

)} {!data && isError && ( From 2ecd7f5fb450b95b33dca8adc4694c8a97042e82 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 11:26:30 -0500 Subject: [PATCH 21/92] fix: bad grammar, remove please --- libs/tup-components/src/accounts/ManageAccountMfa.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/tup-components/src/accounts/ManageAccountMfa.tsx b/libs/tup-components/src/accounts/ManageAccountMfa.tsx index a2524a272..d37c41345 100644 --- a/libs/tup-components/src/accounts/ManageAccountMfa.tsx +++ b/libs/tup-components/src/accounts/ManageAccountMfa.tsx @@ -135,8 +135,7 @@ export const AccountMfa: React.FC = () => { There was an error retrieving your multifactor authentication status. - Your account may be in a non-valid state. if this error persists - please{' '} + Your account may be in a non-valid state. If this error persists,{' '} submit a ticket{' '} with this information and TACC User Services will assist you. From 1866868be57c58334ff89ee20874a42122c390f8 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 15:32:53 -0500 Subject: [PATCH 22/92] feat: TextCopyField.jsx to .tsx, and enable it --- libs/core-components/src/index.ts | 1 + .../src/lib/TextCopyField/TextCopyField.jsx | 91 ------------------- .../TextCopyField/TextCopyField.module.css | 8 +- .../src/lib/TextCopyField/TextCopyField.tsx | 77 ++++++++++++++++ 4 files changed, 80 insertions(+), 97 deletions(-) delete mode 100644 libs/core-components/src/lib/TextCopyField/TextCopyField.jsx create mode 100644 libs/core-components/src/lib/TextCopyField/TextCopyField.tsx diff --git a/libs/core-components/src/index.ts b/libs/core-components/src/index.ts index 599a3d804..4b41f5841 100644 --- a/libs/core-components/src/index.ts +++ b/libs/core-components/src/index.ts @@ -11,6 +11,7 @@ export { default as Paginator } from './lib/Paginator'; export { default as Pill } from './lib/Pill'; export { default as DropdownSelector } from './lib/DropdownSelector'; export { default as ShowMore } from './lib/ShowMore'; +export { default as TextCopyField } from './lib/TextCopyField'; export { default as SectionTableWrapper } from './lib/SectionTableWrapper'; export { default as InfiniteScrollTable } from './lib/InfiniteScrollTable'; export { default as Sidebar } from './lib/Sidebar'; diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.jsx b/libs/core-components/src/lib/TextCopyField/TextCopyField.jsx deleted file mode 100644 index 6022c5198..000000000 --- a/libs/core-components/src/lib/TextCopyField/TextCopyField.jsx +++ /dev/null @@ -1,91 +0,0 @@ -import React, { useCallback, useState } from 'react'; -import { CopyToClipboard } from 'react-copy-to-clipboard'; -import PropTypes from 'prop-types'; - -import Button from '../Button'; - -import styles from './TextCopyField.module.css'; - -const TextCopyField = ({ value, placeholder, buttonWrapper }) => { - const transitionDuration = 0.15; // second(s) - const stateDuration = 1; // second(s) - const stateTimeout = transitionDuration + stateDuration; // second(s) - - const [isCopied, setIsCopied] = useState(false); - - const onCopy = useCallback(() => { - setIsCopied(true); - - const timeout = setTimeout(() => { - setIsCopied(false); - clearTimeout(timeout); - }, stateTimeout * 1000); - }, [setIsCopied, stateTimeout]); - const isEmpty = !value || value.length === 0; - const onChange = (event) => { - // Swallow keyboard events on the Input control, but - // still allow selecting the text. readOnly property of - // Input is not adequate for this purpose because it - // prevents text selection - event.preventDefault(); - }; - - const ButtonWrapper = buttonWrapper; - const CopyButton = ( - - - - ); - const CopyField = ( - - ); - - return ( - <> - {ButtonWrapper ? ( - - - - ) : ( - - )} - - - ); -}; - -TextCopyField.propTypes = { - buttonWrapper: PropTypes.node, - placeholder: PropTypes.string, - value: PropTypes.string, -}; - -TextCopyField.defaultProps = { - buttonWrapper: undefined, - placeholder: '', - value: '', -}; - -export default TextCopyField; diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css b/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css index c0ad01b05..87667f65d 100644 --- a/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css +++ b/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css @@ -1,12 +1,8 @@ @import url('@tacc/core-styles/dist/settings/color--portal.css'); -.input { - /* composes: input from '@tacc/core-styles/dist/components/...form.css'; */ -} - .copy-button { - /* So JavaScript can set this (JavaScript also needs the value) */ - --transition-duration: 0; + /* WARNING: Must match JavaScript `transitionDuration` */ + --transition-duration: 0.15; transition: color var(--transition-duration), background-color var(--transition-duration); diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx b/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx new file mode 100644 index 000000000..6118b70cf --- /dev/null +++ b/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx @@ -0,0 +1,77 @@ +import React, { useCallback, useState } from 'react'; + +import Button from '../Button'; + +import styles from './TextCopyField.module.css'; + +type TextCopyFieldProps = { + value: string, + placeholder?: string, + ButtonWrapper?: React.FC, +}; + +const TextCopyField: React.FC = ({ value, placeholder, ButtonWrapper })=> { + /* WARNING: Must match CSS `--transition-duration` */ + const transitionDuration = 0.15; // second(s) + const stateDuration = 1; // second(s) + const stateTimeout = transitionDuration + stateDuration; // second(s) + + const [isCopied, setIsCopied] = useState(false); + + const onCopy = useCallback(() => { + navigator.clipboard.writeText(value); + setIsCopied(true); + + const timeout = setTimeout(() => { + setIsCopied(false); + clearTimeout(timeout); + }, stateTimeout * 1000); + }, [value, setIsCopied, stateTimeout]); + const isEmpty = !value || value.length === 0; + const onChange = (event: React.ChangeEvent) => { + // Swallow keyboard events on the Input control, but + // still allow selecting the text. readOnly property of + // Input is not adequate for this purpose because it + // prevents text selection + event.preventDefault(); + }; + + const CopyButton = () => {return ( + + )}; + const CopyField = () => {return ( + + )}; + + return ( + <> + {ButtonWrapper ? ( + + + + ) : ( + + )} + + + ); +}; + +export default TextCopyField; From 28ef6ad8db1a2534f2491916b2abf2b9095a95ac Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 15:34:07 -0500 Subject: [PATCH 23/92] feat: TextCopyModal --- libs/core-components/src/index.ts | 1 + .../src/lib/TextCopyModal/TextCopyModal.tsx | 67 +++++++++++++++++++ .../src/lib/TextCopyModal/index.ts | 1 + 3 files changed, 69 insertions(+) create mode 100644 libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx create mode 100644 libs/core-components/src/lib/TextCopyModal/index.ts diff --git a/libs/core-components/src/index.ts b/libs/core-components/src/index.ts index 4b41f5841..047524da1 100644 --- a/libs/core-components/src/index.ts +++ b/libs/core-components/src/index.ts @@ -12,6 +12,7 @@ export { default as Pill } from './lib/Pill'; export { default as DropdownSelector } from './lib/DropdownSelector'; export { default as ShowMore } from './lib/ShowMore'; export { default as TextCopyField } from './lib/TextCopyField'; +export { default as TextCopyModal } from './lib/TextCopyModal'; export { default as SectionTableWrapper } from './lib/SectionTableWrapper'; export { default as InfiniteScrollTable } from './lib/InfiniteScrollTable'; export { default as Sidebar } from './lib/Sidebar'; diff --git a/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx b/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx new file mode 100644 index 000000000..fc5cf103b --- /dev/null +++ b/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx @@ -0,0 +1,67 @@ +import React, { useState } from 'react'; +import { Modal, ModalHeader, ModalBody } from 'reactstrap'; +import { Formik } from 'formik'; +import { FieldWrapperFormik as FieldWrapper } from '@tacc/core-wrappers'; +import { Button, TextCopyField } from '@tacc/core-components'; + +const TextCopyModal: React.FC< + React.PropsWithChildren<{ + display: 'secondary' | 'link'; + title: string; + text: string; + hint?: React.ReactNode; + }> +> = ({ children, display, title, text, hint }) => { + const [isOpen, setIsOpen] = useState(false); + const toggle = () => { + setIsOpen(!isOpen); + }; + + const closeBtn = ( + + ); + + const ButtonWrapper: React.FC = ({ children }) => { + return
{children}
; + }; + + return ( + <> + + + + {title} + + + + + + + + + + + ); +}; + +export default TextCopyModal; diff --git a/libs/core-components/src/lib/TextCopyModal/index.ts b/libs/core-components/src/lib/TextCopyModal/index.ts new file mode 100644 index 000000000..d89575528 --- /dev/null +++ b/libs/core-components/src/lib/TextCopyModal/index.ts @@ -0,0 +1 @@ +export { default } from './TextCopyModal'; From f75372022c19a61c73d96280039642a3d77196d6 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 15:35:59 -0500 Subject: [PATCH 24/92] fix: FieldWrapper, opt. req. & let desc. be React --- libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx index 796466c69..dc5c430c1 100644 --- a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx +++ b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx @@ -4,8 +4,8 @@ import './FieldWrapper.css'; export type FieldWrapperProps = { label: string; - required: boolean; - description: string; + required?: boolean; + description: React.ReactNode; error?: string; children?: React.ReactNode; }; From fa7a9109f14daa4119dc848c97d9347e817b65c6 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 15:36:31 -0500 Subject: [PATCH 25/92] fix: FieldWrapperFormik, let desc. be React --- .../src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx index 577231874..a402cf386 100644 --- a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx +++ b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx @@ -6,7 +6,7 @@ export type FieldWrapperProps = { name: string; label: string; required?: boolean; - description?: string; + description?: React.ReactNode; }; const FieldWrapper: React.FC> = ({ name, From e3e45be325a234be79823f4206d0a3ceda0ef526 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 15:36:49 -0500 Subject: [PATCH 26/92] feat: text copy modal (TUP-535:2.1.3) --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 39 ++++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 2f6cc68c1..2a9648362 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -1,6 +1,11 @@ import React from 'react'; import { useMfaPairTotp } from '@tacc/tup-hooks'; -import { Button, LoadingSpinner, SectionMessage } from '@tacc/core-components'; +import { + Button, + LoadingSpinner, + SectionMessage, + TextCopyModal, +} from '@tacc/core-components'; import { TicketCreateModal } from '../tickets'; import styles from './Mfa.module.css'; @@ -28,19 +33,33 @@ const MfaQRPanel: React.FC = () => { {!data && isLoading && } {data && Google MFA QR Code} - {data && data.otpkey && ( + {( + // {data && data.otpkey && (

- Can't scan QR code? {data.otpkey.value_b32}  ( - - ) + View Alternative Verification Code +

)} - {data && !data.otpkey && ( + {false && data && !data.otpkey && (

Can't scan QR code?{' '} Submit a ticket. From d4e1bd0a14b8ba186098044fdd06c740c4346b35 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Fri, 21 Jul 2023 15:53:28 -0500 Subject: [PATCH 27/92] chore: uninstall react-copy-to-clipboard --- package-lock.json | 48 ----------------------------------------------- package.json | 1 - 2 files changed, 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55f8812ae..11312d189 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,6 @@ "js-cookie": "^3.0.1", "lodash": "^4.17.21", "react": "18.2.0", - "react-copy-to-clipboard": "^5.1.0", "react-dom": "18.2.0", "react-dropzone": "^14.2.3", "react-resize-detector": "^7.1.2", @@ -9278,14 +9277,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, "node_modules/copy-webpack-plugin": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", @@ -21194,18 +21185,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", - "dependencies": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": "^15.3.0 || 16 || 17 || 18" - } - }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -23824,11 +23803,6 @@ "node": ">=8.0" } }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -32357,14 +32331,6 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "requires": { - "toggle-selection": "^1.0.6" - } - }, "copy-webpack-plugin": { "version": "10.2.4", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz", @@ -41129,15 +41095,6 @@ "loose-envify": "^1.1.0" } }, - "react-copy-to-clipboard": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", - "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", - "requires": { - "copy-to-clipboard": "^3.3.1", - "prop-types": "^15.8.1" - } - }, "react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -43143,11 +43100,6 @@ "is-number": "^7.0.0" } }, - "toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", diff --git a/package.json b/package.json index e74ae04c3..b23b258aa 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "js-cookie": "^3.0.1", "lodash": "^4.17.21", "react": "18.2.0", - "react-copy-to-clipboard": "^5.1.0", "react-dom": "18.2.0", "react-dropzone": "^14.2.3", "react-resize-detector": "^7.1.2", From 6152efaf21488d4a5d8efcdb8a8bd3ea0a62213c Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Mon, 24 Jul 2023 13:26:35 -0500 Subject: [PATCH 28/92] feat: install @tacc/core-styles 2.14.0 --- apps/tup-ui/src/main.global.css | 2 +- package-lock.json | 71 ++++++++++++++++----------------- package.json | 2 +- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/apps/tup-ui/src/main.global.css b/apps/tup-ui/src/main.global.css index 883648de7..15e72dfbb 100644 --- a/apps/tup-ui/src/main.global.css +++ b/apps/tup-ui/src/main.global.css @@ -1,7 +1,7 @@ /* To use new c-nav component not yet in TACC/Core-CMS core-styles.base.css */ /* TODO: Remove when TACC/Core-CMS loads TACC/Core-Styles v2.13+ */ /* CAVEAT: Duplicates older, unchanged, global c-nav styles */ -@import url("https://unpkg.com/@tacc/core-styles@2.13.0/dist/components/c-nav.css"); +@import url("https://unpkg.com/@tacc/core-styles@2.14.0/dist/components/c-nav.css"); /* To overwrite @tacc/core-styles CEPv2 spacing */ :root { diff --git a/package-lock.json b/package-lock.json index 11312d189..444453ae8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "@nrwl/vite": "^15.6.3", "@nrwl/web": "15.6.3", "@nrwl/workspace": "15.6.3", - "@tacc/core-styles": "^2.6.2", + "@tacc/core-styles": "^2.14.0", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "13.4.0", "@testing-library/user-event": "^14.4.3", @@ -5703,9 +5703,9 @@ } }, "node_modules/@tacc/core-styles": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@tacc/core-styles/-/core-styles-2.6.2.tgz", - "integrity": "sha512-0JjPjbcmSvYg7z2zRWIq3Yhj2I0L8fz+6L66AV8HVQUJ/7fDG1vC34mGR0q+l36kFT3KYCTA2+XOyOhxnc/C3w==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tacc/core-styles/-/core-styles-2.14.0.tgz", + "integrity": "sha512-AXJIF9tOdUsiGdOehNntbN3OeuycKlE/cUjJCnG65kWkmryEUhcytSUZF29Xd7xXCvmNwr6qlCOSVNU39POlhA==", "dev": true, "bin": { "core-styles": "src/cli.js" @@ -5723,7 +5723,6 @@ "postcss": "^8.4.18", "postcss-banner": "^4.0.1", "postcss-cli": "^10.0.0", - "postcss-env-function": "^4.0.6", "postcss-extend": "^1.0.5", "postcss-import": "^15.0.0", "postcss-preset-env": "^7.8.3", @@ -19463,9 +19462,9 @@ } }, "node_modules/postcss-cli/node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "peer": true, "dependencies": { @@ -19480,15 +19479,15 @@ } }, "node_modules/postcss-cli/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "peer": true, "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -19543,9 +19542,9 @@ } }, "node_modules/postcss-cli/node_modules/slash": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.0.0.tgz", - "integrity": "sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "peer": true, "engines": { @@ -19556,9 +19555,9 @@ } }, "node_modules/postcss-cli/node_modules/yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, "peer": true, "engines": { @@ -29562,9 +29561,9 @@ } }, "@tacc/core-styles": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@tacc/core-styles/-/core-styles-2.6.2.tgz", - "integrity": "sha512-0JjPjbcmSvYg7z2zRWIq3Yhj2I0L8fz+6L66AV8HVQUJ/7fDG1vC34mGR0q+l36kFT3KYCTA2+XOyOhxnc/C3w==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@tacc/core-styles/-/core-styles-2.14.0.tgz", + "integrity": "sha512-AXJIF9tOdUsiGdOehNntbN3OeuycKlE/cUjJCnG65kWkmryEUhcytSUZF29Xd7xXCvmNwr6qlCOSVNU39POlhA==", "dev": true, "requires": {} }, @@ -39978,9 +39977,9 @@ }, "dependencies": { "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "peer": true, "requires": { @@ -39992,15 +39991,15 @@ } }, "globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "peer": true, "requires": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -40026,16 +40025,16 @@ } }, "slash": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.0.0.tgz", - "integrity": "sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "peer": true }, "yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, "peer": true } diff --git a/package.json b/package.json index b23b258aa..5c8416604 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "@nrwl/vite": "^15.6.3", "@nrwl/web": "15.6.3", "@nrwl/workspace": "15.6.3", - "@tacc/core-styles": "^2.6.2", + "@tacc/core-styles": "^2.14.0", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "13.4.0", "@testing-library/user-event": "^14.4.3", From 48efbdfa41302b891d4dd63721c438ac6f7d7e7e Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Mon, 24 Jul 2023 14:46:32 -0500 Subject: [PATCH 29/92] refactor: FieldWrapper mirror FeildWrapperFormik Make FieldWrapper look like FeildWrapperFormik. Lets FieldWrapper be used independent of Formik. --- .../src/lib/FieldWrapper/FieldWrapper.css | 14 ------ .../FieldWrapper.module.css} | 0 .../src/lib/FieldWrapper/FieldWrapper.tsx | 47 +++++++++---------- .../FieldWrapperFormik/FieldWrapperFormik.tsx | 8 +++- 4 files changed, 29 insertions(+), 40 deletions(-) delete mode 100644 libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css rename libs/core-wrappers/src/lib/{FieldWrapperFormik/FieldWrapperFormik.module.css => FieldWrapper/FieldWrapper.module.css} (100%) diff --git a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css deleted file mode 100644 index 75e38538f..000000000 --- a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css +++ /dev/null @@ -1,14 +0,0 @@ -.form-field__label { - font-weight: bold; -} - -.form-field__help { - font-style: italic; - font-weight: 400; -} - -.form-field__validation-error { - font-size: 0.8rem; - color: #eb6e6e; - padding-top: 5px; -} diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.module.css b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.module.css similarity index 100% rename from libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.module.css rename to libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.module.css diff --git a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx index dc5c430c1..2758528ea 100644 --- a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx +++ b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx @@ -1,45 +1,44 @@ import React from 'react'; -import { FormGroup, Label, FormText, Badge } from 'reactstrap'; -import './FieldWrapper.css'; +import { Badge } from 'reactstrap'; + +import styles from './FieldWrapper.module.css'; export type FieldWrapperProps = { + name?: string; label: string; required?: boolean; - description: React.ReactNode; + className?: string; + description?: React.ReactNode; error?: string; - children?: React.ReactNode; }; -const FieldWrapper: React.FC = ({ +const FieldWrapper: React.FC> = ({ + name, label, required, description, children, + className, error, }) => ( - -

+ + {children} - {error ? ( -
{error}
- ) : ( - description && ( - - {description} - - ) + {error && ( +
    +
  • {error}
  • +
)} - +
+ {description} +
+
); export default FieldWrapper; diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx index a402cf386..1d712464e 100644 --- a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx +++ b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx @@ -1,11 +1,14 @@ import React from 'react'; import { ErrorMessage } from 'formik'; import { Badge } from 'reactstrap'; -import styles from './FieldWrapperFormik.module.css'; + +import styles from '../FieldWrapper/FieldWrapper.module.css'; + export type FieldWrapperProps = { name: string; label: string; required?: boolean; + className?: string; description?: React.ReactNode; }; const FieldWrapper: React.FC> = ({ @@ -13,10 +16,11 @@ const FieldWrapper: React.FC> = ({ label, required, description, + className, children, }) => { return ( -
+
+ {tokenType === 'sms' && (

@@ -42,15 +44,6 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ Get Help

)} - {error && ( - - Error validating MFA token: error.message - - )} ); }; From 7d401abf96d994f634148f4a5fd19dc49ea91337 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Mon, 24 Jul 2023 16:57:52 -0500 Subject: [PATCH 39/92] chore: rename `qr-code-message` to `mfa-message` --- libs/tup-components/src/mfa/Mfa.module.css | 2 +- libs/tup-components/src/mfa/MfaQRPanel.tsx | 4 ++-- libs/tup-components/src/mfa/MfaValidationPanel.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/tup-components/src/mfa/Mfa.module.css b/libs/tup-components/src/mfa/Mfa.module.css index 646698a94..d2ca76a15 100644 --- a/libs/tup-components/src/mfa/Mfa.module.css +++ b/libs/tup-components/src/mfa/Mfa.module.css @@ -83,7 +83,7 @@ li.pairing-separator { position: relative; width: max-content; /* to not let wide child change parent width */ } - .qr-code-message { + .mfa-message { /* To position message beneath both paring steps */ position: absolute; top: 100%; diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index d1296565e..2d0d780ce 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -61,7 +61,7 @@ const MfaQRPanel: React.FC = () => { {data && data.otpkey && ( -

+

Can't scan QR code?{' '} {

)} {data && !data.otpkey && ( -

+

Can't scan QR code?{' '} Submit a ticket.

diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index fcf033316..e9e9866a5 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -39,7 +39,7 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ {tokenType === 'sms' && ( -

+

Didn't receive a message within 5 minutes?{' '} Get Help

From ce524d646488d35c1f8748d14589ffdf7ed34a70 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Mon, 24 Jul 2023 17:29:16 -0500 Subject: [PATCH 40/92] chore: remove unused `ButtonWrapper` --- libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx b/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx index 8bfb8dfc4..c66e1d1e2 100644 --- a/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx +++ b/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx @@ -24,10 +24,6 @@ const TextCopyModal: React.FC< ); - const ButtonWrapper: React.FC = ({ children }) => { - return
{children}
; - }; - return ( <>
); diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx index 133640009..6188aaec2 100644 --- a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx +++ b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx @@ -23,9 +23,7 @@ const FieldWrapper: React.FC> = ({ > {children} @@ -37,7 +35,7 @@ const FieldWrapper: React.FC> = ({ ); }} - {description && (
{description}
)} + {description &&
{description}
} ); }; From 74ed6a749860d2984f6c46e2bf8bd26ad7a5412b Mon Sep 17 00:00:00 2001 From: Wesley B <62723358+wesleyboar@users.noreply.github.com> Date: Tue, 25 Jul 2023 10:28:24 -0500 Subject: [PATCH 50/92] fix: grammar error from design --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index f216fe8bc..746b169e7 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -80,7 +80,7 @@ const MfaQRPanel: React.FC = () => { } > - View Alternative Verification Code + View alternative verification code.

)} From 83e10bf8e85410d869279c5dff889f1b55b79df8 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 10:11:17 -0500 Subject: [PATCH 51/92] chore: use installed @core-styles, not CDN --- apps/tup-ui/src/main.global.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tup-ui/src/main.global.css b/apps/tup-ui/src/main.global.css index 89a1a88eb..1f61c10d6 100644 --- a/apps/tup-ui/src/main.global.css +++ b/apps/tup-ui/src/main.global.css @@ -1,7 +1,7 @@ /* To use new c-nav component not yet in TACC/Core-CMS core-styles.base.css */ /* TODO: Remove when TACC/Core-CMS loads TACC/Core-Styles v2.13+ */ /* CAVEAT: Duplicates older, unchanged, global c-nav styles */ -@import url("https://unpkg.com/@tacc/core-styles@2.14.0/dist/components/c-nav.css"); +@import url("@tacc/core-styles/dist/components/c-nav.css"); /* To use s-affixed-input-wrapper which had been unused outside TACC/Core-CMS */ /* TODO: Remove when TACC/Core-CMS loads TACC/Core-Styles v2.14+ */ From cfe9d9273f744451370ac930fa8ee96eec780992 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 10:28:36 -0500 Subject: [PATCH 52/92] refactor: simplify TextCopyField (no CopyField) --- .../src/lib/TextCopyField/TextCopyField.tsx | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx b/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx index 20c2ac293..566e061fc 100644 --- a/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx +++ b/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx @@ -59,19 +59,6 @@ const TextCopyField: React.FC = ({ ); }; - const CopyField = () => { - return ( - - ); - }; return ( <> @@ -82,7 +69,15 @@ const TextCopyField: React.FC = ({ ) : ( )} - + ); }; From 529b3e80479e19f1798a8632ecb73f97902e2d8a Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 10:29:48 -0500 Subject: [PATCH 53/92] refactor: simplify TextCopyField (no ButtonWrapper) --- .../src/lib/TextCopyField/TextCopyField.tsx | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx b/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx index 566e061fc..f7ab5b33b 100644 --- a/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx +++ b/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx @@ -9,7 +9,6 @@ type TextCopyFieldProps = { placeholder?: string; className?: string; buttonClassName?: string; - ButtonWrapper?: React.FC; }; const TextCopyField: React.FC = ({ @@ -17,7 +16,6 @@ const TextCopyField: React.FC = ({ placeholder, className, buttonClassName, - ButtonWrapper, }) => { /* WARNING: Must match CSS `--transition-duration` */ const transitionDuration = 0.15; // second(s) @@ -44,8 +42,8 @@ const TextCopyField: React.FC = ({ event.preventDefault(); }; - const CopyButton = () => { - return ( + return ( + <> - ); - }; - - return ( - <> - {ButtonWrapper ? ( - - - - ) : ( - - )} Date: Wed, 26 Jul 2023 10:46:15 -0500 Subject: [PATCH 54/92] =?UTF-8?q?refactor:=20TextCopyModal=20hint=20?= =?UTF-8?q?=E2=86=92=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 29 ++++++++++++---------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 746b169e7..ec0ecc99a 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -11,6 +11,21 @@ import styles from './Mfa.module.css'; const MfaQRPanel: React.FC = () => { const { mutate, isLoading, data, isError } = useMfaPairTotp(); + + const TextCopyModalHint = () => ( + <> + Enter this code into an approved{' '} +
+ MFA pairing app + + . + + ) + return ( <>
@@ -66,19 +81,7 @@ const MfaQRPanel: React.FC = () => { display="link" title="Alternative Verification Code" text={data.otpkey.value_b32} - hint={ - <> - Enter this code into an approved{' '} - - MFA pairing app - - . - - } + hint={} > View alternative verification code. From 03ba9a2b67767352f458fc3f539ac0f384ee2873 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 10:50:58 -0500 Subject: [PATCH 55/92] feat: support and add id attr to )} @@ -73,25 +70,29 @@ const MfaQRPanel: React.FC = () => { - {data && data.otpkey && ( -

- Can't scan QR code?{' '} - } - > - View alternative verification code. - -

- )} - {data && !data.otpkey && ( -

- Can't scan QR code?{' '} - Submit a ticket. -

- )} +

+ {data && data.otpkey && ( + <> + Can't scan QR code?{' '} + } + > + View alternative verification code. + + + )} + {data && !data.otpkey && ( + <> + Can't scan QR code?{' '} + + Submit a ticket. + + + )} +

); }; diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index 862608595..a593bca2b 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -37,12 +37,14 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ Confirm Pairing - {tokenType === 'sms' && ( -

- Didn't receive a message within 5 minutes?{' '} - Get Help -

- )} +

+ {tokenType === 'sms' && ( + <> + Didn't receive a message within 5 minutes?{' '} + Get Help + + )} +

); }; From 7613a4f168a7b9e2eef3e425560e3b2f999800ca Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 14:49:08 -0500 Subject: [PATCH 62/92] fix(a11y): no use
diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index ac793f422..77afa84b3 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { useMfaPairTotp } from '@tacc/tup-hooks'; import { Button, - FieldWrapper, + InlineMessage, LoadingSpinner, TextCopyModal, } from '@tacc/core-components'; @@ -28,47 +28,40 @@ const MfaQRPanel: React.FC = () => { return ( <> -
- - Open an approved{' '} - - MFA pairing app - {' '} - and scan the following QR code: - - } - error={ - !data && - isError && ( - <> - Unable to display QR code. If this error persists,{' '} - - submit a ticket - - . - - ) - } - > -
- {!data && !isLoading && ( - - )} - {!data && isLoading && } - {data && ( - Google MFA QR Code - )} -
-
-
+
+ +
+ {!data && !isLoading && ( + + )} + {!data && isLoading && } + {data && ( + Google MFA QR Code + )} +
+
+ {!data && isError && ( + + Unable to display QR code. If this error persists,{' '} + submit a ticket. + + )} {data && data.otpkey && (

Can't scan QR code?{' '} diff --git a/libs/tup-components/src/mfa/MfaSmsPanel.tsx b/libs/tup-components/src/mfa/MfaSmsPanel.tsx index 2c8096620..eceab149e 100644 --- a/libs/tup-components/src/mfa/MfaSmsPanel.tsx +++ b/libs/tup-components/src/mfa/MfaSmsPanel.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { useMfaPairSms } from '@tacc/tup-hooks'; -import { Button, FieldWrapper } from '@tacc/core-components'; +import { Button, InlineMessage } from '@tacc/core-components'; import styles from './Mfa.module.css'; import { TicketCreateModal } from '../tickets'; @@ -12,28 +12,24 @@ const MfaSmsPanel: React.FC = () => { smsMutation.mutate({ phoneNumber }); }; return ( -

onSubmit(e)} className={styles['mfa-form']}> - - Unable to pair via SMS. If this error persists,{' '} - - submit a ticket - - . - - ) - } - > + onSubmit(e)} + className={`${styles['mfa-form']} s-form`} + > +
+ setPhoneNumber(e.target.value)} /> - + {smsMutation.isError && ( + + Unable to pair via SMS. If this error persists,{' '} + submit a ticket. + + )} +
diff --git a/libs/tup-components/src/mfa/MfaValidationPanel.tsx b/libs/tup-components/src/mfa/MfaValidationPanel.tsx index 862608595..d9c6eea52 100644 --- a/libs/tup-components/src/mfa/MfaValidationPanel.tsx +++ b/libs/tup-components/src/mfa/MfaValidationPanel.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { useMfaVerify } from '@tacc/tup-hooks'; -import { Button, FieldWrapper } from '@tacc/core-components'; +import { Button, InlineMessage } from '@tacc/core-components'; import TicketCreateModal from '../tickets/TicketCreateModal'; import styles from './Mfa.module.css'; @@ -21,18 +21,23 @@ const MfaValidationPanel: React.FC<{ tokenType: 'totp' | 'sms' }> = ({ return ( <> - onSubmit(e)} className={styles['mfa-form']}> - + onSubmit(e)} + className={`${styles['mfa-form']} s-form`} + > +
+ setTokenValue(e.target.value)} - > - + /> + {error && ( + + Error validating MFA token: "{error.message}" + + )} +
From ae380db86ccf77b301dd9d680507bbcda1d73d3d Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 17:32:00 -0500 Subject: [PATCH 70/92] chore: remove FieldWrapper (not Formik) --- libs/core-components/src/index.ts | 1 - .../src/lib/FieldWrapper/FieldWrapper.tsx | 38 ------------------- .../src/lib/FieldWrapper/index.ts | 4 -- 3 files changed, 43 deletions(-) delete mode 100644 libs/core-components/src/lib/FieldWrapper/FieldWrapper.tsx delete mode 100644 libs/core-components/src/lib/FieldWrapper/index.ts diff --git a/libs/core-components/src/index.ts b/libs/core-components/src/index.ts index c29a722a5..047524da1 100644 --- a/libs/core-components/src/index.ts +++ b/libs/core-components/src/index.ts @@ -6,7 +6,6 @@ export { default as InlineMessage } from './lib/InlineMessage'; export { default as SectionMessage } from './lib/SectionMessage'; export { default as LoadingSpinner } from './lib/LoadingSpinner'; export { default as DescriptionList } from './lib/DescriptionList'; -export { default as FieldWrapper } from './lib/FieldWrapper'; export { default as Message } from './lib/Message'; export { default as Paginator } from './lib/Paginator'; export { default as Pill } from './lib/Pill'; diff --git a/libs/core-components/src/lib/FieldWrapper/FieldWrapper.tsx b/libs/core-components/src/lib/FieldWrapper/FieldWrapper.tsx deleted file mode 100644 index f486c5bda..000000000 --- a/libs/core-components/src/lib/FieldWrapper/FieldWrapper.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; -import { Badge } from 'reactstrap'; - -export type FieldWrapperProps = { - name?: string; - label: React.ReactNode; - required?: boolean; - className?: string; - description?: React.ReactNode; - error?: React.ReactNode; -}; -const FieldWrapper: React.FC> = ({ - name, - label, - required, - description, - children, - className, - error, -}) => ( -
- - {children} - {error && ( -
    -
  • {error}
  • -
- )} - {description &&
{description}
} -
-); - -export default FieldWrapper; diff --git a/libs/core-components/src/lib/FieldWrapper/index.ts b/libs/core-components/src/lib/FieldWrapper/index.ts deleted file mode 100644 index 38fa2cdcb..000000000 --- a/libs/core-components/src/lib/FieldWrapper/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { default as FieldWrapper } from './FieldWrapper'; -export type { FieldWrapperProps } from './FieldWrapper'; - -export default FieldWrapper; From 58e15e9265651e9f2433a95381758c9fa4b5136d Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 17:37:13 -0500 Subject: [PATCH 71/92] refactor:return feild wrap CSS to comp. as global Return FieldWrapperFormik CSS back to component, but as global. --- apps/tup-ui/src/main.global.css | 13 ------------- .../FieldWrapperFormik.global.css | 12 ++++++++++++ .../lib/FieldWrapperFormik/FieldWrapperFormik.tsx | 1 + 3 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css diff --git a/apps/tup-ui/src/main.global.css b/apps/tup-ui/src/main.global.css index 52384a10d..2eda1e4f3 100644 --- a/apps/tup-ui/src/main.global.css +++ b/apps/tup-ui/src/main.global.css @@ -70,16 +70,3 @@ table { .s-form input + [role="status"] > .icon { display: none; } -/* To style "Required" flag on field */ -/* TODO: Remove this after making it moot: - - either use c-form__star instead of (like CMS) - - or add c-form__badge into TACC/Core-Styles -*/ -/* FAQ: Used by FieldWrapperFormik */ -.has-required .badge { - color: white; - font-weight: var(--medium); - - margin-left: 0.5em; - vertical-align: top; -} diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css new file mode 100644 index 000000000..bf29a4f42 --- /dev/null +++ b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css @@ -0,0 +1,12 @@ +/* To style "Required" flag on field */ +/* TODO: Remove this after making it moot: + - either use c-form__star instead of (like CMS) + - or add c-form__badge into TACC/Core-Styles +*/ +.c-form__field.has-required .badge { + color: white; + font-weight: var(--medium); + + margin-left: 0.5em; + vertical-align: top; +} diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx index 6188aaec2..7e4596a78 100644 --- a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx +++ b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { ErrorMessage } from 'formik'; import { Badge } from 'reactstrap'; +import './FieldWrapperFormik.global.css'; export type FieldWrapperProps = { name: string; From 0ab4bbabc1a186db6ee3131fea4b33ccdcf5ffbb Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Wed, 26 Jul 2023 17:37:31 -0500 Subject: [PATCH 72/92] npx nx format:write --- libs/tup-components/src/mfa/MfaSmsPanel.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/tup-components/src/mfa/MfaSmsPanel.tsx b/libs/tup-components/src/mfa/MfaSmsPanel.tsx index eceab149e..9c1ad0a91 100644 --- a/libs/tup-components/src/mfa/MfaSmsPanel.tsx +++ b/libs/tup-components/src/mfa/MfaSmsPanel.tsx @@ -26,7 +26,10 @@ const MfaSmsPanel: React.FC = () => { {smsMutation.isError && ( Unable to pair via SMS. If this error persists,{' '} - submit a ticket. + + submit a ticket + + . )} From 482362015de7b4ee6eba6f3085a821afd5f32186 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 27 Jul 2023 13:25:43 -0500 Subject: [PATCH 73/92] refactor: simpler id assignment --- libs/core-components/src/lib/Button/Button.tsx | 2 +- libs/core-components/src/lib/TextCopyField/TextCopyField.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core-components/src/lib/Button/Button.tsx b/libs/core-components/src/lib/Button/Button.tsx index 477fe7149..41b833057 100644 --- a/libs/core-components/src/lib/Button/Button.tsx +++ b/libs/core-components/src/lib/Button/Button.tsx @@ -76,7 +76,7 @@ const Button: React.FC = ({ return ( Date: Thu, 27 Jul 2023 13:35:26 -0500 Subject: [PATCH 74/92] fix: static mfa panel width so mfa-msg is centered --- libs/tup-components/src/mfa/Mfa.module.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libs/tup-components/src/mfa/Mfa.module.css b/libs/tup-components/src/mfa/Mfa.module.css index de0ff8237..66501613c 100644 --- a/libs/tup-components/src/mfa/Mfa.module.css +++ b/libs/tup-components/src/mfa/Mfa.module.css @@ -11,8 +11,7 @@ ol.pairing-container { } .pairing-container > *:not(.pairing-separator) { - min-width: 210px; - max-width: 375px; + width: 365px; /* FAQ: static width, so .mfa-message is centered */ } .pairing-separator { From 74e5aaed80243938ec8ea8affa069f0941c9d177 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 27 Jul 2023 14:21:21 -0500 Subject: [PATCH 75/92] refactor: no modal for text copty --- libs/tup-components/src/mfa/Mfa.module.css | 6 ++++ libs/tup-components/src/mfa/MfaQRPanel.tsx | 39 ++++++++-------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/libs/tup-components/src/mfa/Mfa.module.css b/libs/tup-components/src/mfa/Mfa.module.css index 66501613c..7c750dd5f 100644 --- a/libs/tup-components/src/mfa/Mfa.module.css +++ b/libs/tup-components/src/mfa/Mfa.module.css @@ -69,6 +69,12 @@ li.pairing-separator { .qr-code-box > button { width: var(--qr-code-size) !important; /* overwrite c-button, which is too specific */ } +label.qr-code-alt-label { + font-weight: normal; /* to overwrite core-styles */ +} +.s-affixed-input-wrapper { + display: inline-grid; /* to overwrite core-styles */ +} /* Wide */ diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 77afa84b3..212e1dca6 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -4,7 +4,7 @@ import { Button, InlineMessage, LoadingSpinner, - TextCopyModal, + TextCopyField, } from '@tacc/core-components'; import { TicketCreateModal } from '../tickets'; import styles from './Mfa.module.css'; @@ -12,20 +12,6 @@ import styles from './Mfa.module.css'; const MfaQRPanel: React.FC = () => { const { mutate, isLoading, data, isError } = useMfaPairTotp(); - const TextCopyModalHint = () => ( - <> - Enter this code into an approved{' '} - - MFA pairing app - - . - - ); - return ( <>
@@ -62,20 +48,23 @@ const MfaQRPanel: React.FC = () => { submit a ticket. )} - {data && data.otpkey && ( + {true && (

Can't scan QR code?{' '} - } - > - View alternative verification code. - + +

+ +

)} - {data && !data.otpkey && ( + {false && (

Can't scan QR code?{' '} Submit a ticket. From d60583da90c233b9eeea8e906806d9228f71fdeb Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 27 Jul 2023 14:34:36 -0500 Subject: [PATCH 76/92] fix: restore accientally deleted conditions --- libs/tup-components/src/mfa/MfaQRPanel.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/tup-components/src/mfa/MfaQRPanel.tsx b/libs/tup-components/src/mfa/MfaQRPanel.tsx index 212e1dca6..e65250cf9 100644 --- a/libs/tup-components/src/mfa/MfaQRPanel.tsx +++ b/libs/tup-components/src/mfa/MfaQRPanel.tsx @@ -48,7 +48,7 @@ const MfaQRPanel: React.FC = () => { submit a ticket. )} - {true && ( + {data && data.otpkey && (

Can't scan QR code?{' '}

)} - {false && ( + {data && !data.otpkey && (

Can't scan QR code?{' '} Submit a ticket. From eabd2bfb2bd30f0df935ac011161d4bbbec5e857 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 27 Jul 2023 14:58:52 -0500 Subject: [PATCH 77/92] chore: remove component changes moved to PR #277 https://github.com/TACC/tup-ui/pull/277 --- libs/core-components/src/index.ts | 2 - .../src/lib/TextCopyField/TextCopyField.jsx | 92 +++++++++++++++++++ .../TextCopyField/TextCopyField.module.css | 8 +- .../src/lib/TextCopyField/TextCopyField.tsx | 74 --------------- .../TextCopyModal/TextCopyModal.module.css | 3 - .../src/lib/TextCopyModal/TextCopyModal.tsx | 56 ----------- .../src/lib/TextCopyModal/index.ts | 1 - 7 files changed, 98 insertions(+), 138 deletions(-) create mode 100644 libs/core-components/src/lib/TextCopyField/TextCopyField.jsx delete mode 100644 libs/core-components/src/lib/TextCopyField/TextCopyField.tsx delete mode 100644 libs/core-components/src/lib/TextCopyModal/TextCopyModal.module.css delete mode 100644 libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx delete mode 100644 libs/core-components/src/lib/TextCopyModal/index.ts diff --git a/libs/core-components/src/index.ts b/libs/core-components/src/index.ts index 047524da1..599a3d804 100644 --- a/libs/core-components/src/index.ts +++ b/libs/core-components/src/index.ts @@ -11,8 +11,6 @@ export { default as Paginator } from './lib/Paginator'; export { default as Pill } from './lib/Pill'; export { default as DropdownSelector } from './lib/DropdownSelector'; export { default as ShowMore } from './lib/ShowMore'; -export { default as TextCopyField } from './lib/TextCopyField'; -export { default as TextCopyModal } from './lib/TextCopyModal'; export { default as SectionTableWrapper } from './lib/SectionTableWrapper'; export { default as InfiniteScrollTable } from './lib/InfiniteScrollTable'; export { default as Sidebar } from './lib/Sidebar'; diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.jsx b/libs/core-components/src/lib/TextCopyField/TextCopyField.jsx new file mode 100644 index 000000000..175307a7a --- /dev/null +++ b/libs/core-components/src/lib/TextCopyField/TextCopyField.jsx @@ -0,0 +1,92 @@ + +import React, { useCallback, useState } from 'react'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import PropTypes from 'prop-types'; + +import Button from '../Button'; + +import styles from './TextCopyField.module.css'; + +const TextCopyField = ({ value, placeholder, buttonWrapper }) => { + const transitionDuration = 0.15; // second(s) + const stateDuration = 1; // second(s) + const stateTimeout = transitionDuration + stateDuration; // second(s) + + const [isCopied, setIsCopied] = useState(false); + + const onCopy = useCallback(() => { + setIsCopied(true); + + const timeout = setTimeout(() => { + setIsCopied(false); + clearTimeout(timeout); + }, stateTimeout * 1000); + }, [setIsCopied, stateTimeout]); + const isEmpty = !value || value.length === 0; + const onChange = (event) => { + // Swallow keyboard events on the Input control, but + // still allow selecting the text. readOnly property of + // Input is not adequate for this purpose because it + // prevents text selection + event.preventDefault(); + }; + + const ButtonWrapper = buttonWrapper; + const CopyButton = ( + + + + ); + const CopyField = ( + + ); + + return ( + <> + {ButtonWrapper ? ( + + + + ) : ( + + )} + + + ); +}; + +TextCopyField.propTypes = { + buttonWrapper: PropTypes.node, + placeholder: PropTypes.string, + value: PropTypes.string, +}; + +TextCopyField.defaultProps = { + buttonWrapper: undefined, + placeholder: '', + value: '', +}; + +export default TextCopyField; diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css b/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css index 87667f65d..c0ad01b05 100644 --- a/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css +++ b/libs/core-components/src/lib/TextCopyField/TextCopyField.module.css @@ -1,8 +1,12 @@ @import url('@tacc/core-styles/dist/settings/color--portal.css'); +.input { + /* composes: input from '@tacc/core-styles/dist/components/...form.css'; */ +} + .copy-button { - /* WARNING: Must match JavaScript `transitionDuration` */ - --transition-duration: 0.15; + /* So JavaScript can set this (JavaScript also needs the value) */ + --transition-duration: 0; transition: color var(--transition-duration), background-color var(--transition-duration); diff --git a/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx b/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx deleted file mode 100644 index 58b712f06..000000000 --- a/libs/core-components/src/lib/TextCopyField/TextCopyField.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import React, { useCallback, useState } from 'react'; - -import Button from '../Button'; - -import styles from './TextCopyField.module.css'; - -type TextCopyFieldProps = { - value: string; - placeholder?: string; - className?: string; - id?: string; - buttonClassName?: string; -}; - -const TextCopyField: React.FC = ({ - value, - placeholder, - className, - id, - buttonClassName, -}) => { - /* WARNING: Must match CSS `--transition-duration` */ - const transitionDuration = 0.15; // second(s) - const stateDuration = 1; // second(s) - const stateTimeout = transitionDuration + stateDuration; // second(s) - - const [isCopied, setIsCopied] = useState(false); - - const onCopy = useCallback(() => { - navigator.clipboard.writeText(value); - setIsCopied(true); - - const timeout = setTimeout(() => { - setIsCopied(false); - clearTimeout(timeout); - }, stateTimeout * 1000); - }, [value, setIsCopied, stateTimeout]); - const isEmpty = !value || value.length === 0; - const onChange = (event: React.ChangeEvent) => { - // Swallow keyboard events on the Input control, but - // still allow selecting the text. readOnly property of - // Input is not adequate for this purpose because it - // prevents text selection - event.preventDefault(); - }; - - return ( - <> - - - - ); -}; - -export default TextCopyField; diff --git a/libs/core-components/src/lib/TextCopyModal/TextCopyModal.module.css b/libs/core-components/src/lib/TextCopyModal/TextCopyModal.module.css deleted file mode 100644 index 2a30e4004..000000000 --- a/libs/core-components/src/lib/TextCopyModal/TextCopyModal.module.css +++ /dev/null @@ -1,3 +0,0 @@ -.modal-body { - padding: calc(var(--global-space--section-gap) / 2); -} diff --git a/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx b/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx deleted file mode 100644 index b1fd6b985..000000000 --- a/libs/core-components/src/lib/TextCopyModal/TextCopyModal.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { useState } from 'react'; -import { Modal, ModalHeader, ModalBody } from 'reactstrap'; -import { Button, TextCopyField } from '../../'; - -import styles from './TextCopyModal.module.css'; - -const TextCopyModal: React.FC< - React.PropsWithChildren<{ - display: 'secondary' | 'link'; - title: string; - text: string; - hint?: React.ReactNode; - }> -> = ({ children, display, title, text, hint }) => { - const [isOpen, setIsOpen] = useState(false); - const toggle = () => { - setIsOpen(!isOpen); - }; - - const closeBtn = ( - - ); - - return ( - <> - - - - {title} - - -

- - - {hint} -
- - - - ); -}; - -export default TextCopyModal; diff --git a/libs/core-components/src/lib/TextCopyModal/index.ts b/libs/core-components/src/lib/TextCopyModal/index.ts deleted file mode 100644 index d89575528..000000000 --- a/libs/core-components/src/lib/TextCopyModal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default } from './TextCopyModal'; From b6e1cb16001871c9ace969da980cd4aae63d8af8 Mon Sep 17 00:00:00 2001 From: Wesley Bomar Date: Thu, 27 Jul 2023 15:00:48 -0500 Subject: [PATCH 78/92] chore: remove component changes moved to PR #276 https://github.com/TACC/tup-ui/pull/276 --- libs/core-wrappers/src/index.ts | 1 + .../src/lib/FieldWrapper/FieldWrapper.css | 14 ++++++ .../src/lib/FieldWrapper/FieldWrapper.tsx | 45 +++++++++++++++++++ .../src/lib/FieldWrapper/index.ts | 4 ++ .../FieldWrapperFormik.global.css | 12 ----- .../FieldWrapperFormik.module.css | 15 +++++++ .../FieldWrapperFormik/FieldWrapperFormik.tsx | 25 +++++------ 7 files changed, 91 insertions(+), 25 deletions(-) create mode 100644 libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css create mode 100644 libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx create mode 100644 libs/core-wrappers/src/lib/FieldWrapper/index.ts delete mode 100644 libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css create mode 100644 libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.module.css diff --git a/libs/core-wrappers/src/index.ts b/libs/core-wrappers/src/index.ts index a525b0f18..765d4fc22 100644 --- a/libs/core-wrappers/src/index.ts +++ b/libs/core-wrappers/src/index.ts @@ -4,6 +4,7 @@ export { default as QueryWrapper } from './lib/QueryWrapper'; export { default as SubmitWrapper } from './lib/SubmitWrapper'; export { default as Wizard, useWizard, WizardNavigation } from './lib/Wizard'; export type WizardStep = WizardStepType; +export { default as FieldWrapper } from './lib/FieldWrapper'; export { FieldWrapperFormik, FormikInput, diff --git a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css new file mode 100644 index 000000000..75e38538f --- /dev/null +++ b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.css @@ -0,0 +1,14 @@ +.form-field__label { + font-weight: bold; +} + +.form-field__help { + font-style: italic; + font-weight: 400; +} + +.form-field__validation-error { + font-size: 0.8rem; + color: #eb6e6e; + padding-top: 5px; +} diff --git a/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx new file mode 100644 index 000000000..796466c69 --- /dev/null +++ b/libs/core-wrappers/src/lib/FieldWrapper/FieldWrapper.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { FormGroup, Label, FormText, Badge } from 'reactstrap'; +import './FieldWrapper.css'; + +export type FieldWrapperProps = { + label: string; + required: boolean; + description: string; + error?: string; + children?: React.ReactNode; +}; +const FieldWrapper: React.FC = ({ + label, + required, + description, + children, + error, +}) => ( + + + {children} + {error ? ( +
{error}
+ ) : ( + description && ( + + {description} + + ) + )} +
+); + +export default FieldWrapper; diff --git a/libs/core-wrappers/src/lib/FieldWrapper/index.ts b/libs/core-wrappers/src/lib/FieldWrapper/index.ts new file mode 100644 index 000000000..38fa2cdcb --- /dev/null +++ b/libs/core-wrappers/src/lib/FieldWrapper/index.ts @@ -0,0 +1,4 @@ +import { default as FieldWrapper } from './FieldWrapper'; +export type { FieldWrapperProps } from './FieldWrapper'; + +export default FieldWrapper; diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css deleted file mode 100644 index bf29a4f42..000000000 --- a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.global.css +++ /dev/null @@ -1,12 +0,0 @@ -/* To style "Required" flag on field */ -/* TODO: Remove this after making it moot: - - either use c-form__star instead of (like CMS) - - or add c-form__badge into TACC/Core-Styles -*/ -.c-form__field.has-required .badge { - color: white; - font-weight: var(--medium); - - margin-left: 0.5em; - vertical-align: top; -} diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.module.css b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.module.css new file mode 100644 index 000000000..5a7a98a66 --- /dev/null +++ b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.module.css @@ -0,0 +1,15 @@ +.label { + display: flex; + flex-direction: row; + gap: 1rem; +} + +.required-badge { + color: white; + font-weight: var(--medium); +} + +.error-text { + font-style: italic; + color: #eb6e6e +} diff --git a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx index 7e4596a78..577231874 100644 --- a/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx +++ b/libs/core-wrappers/src/lib/FieldWrapperFormik/FieldWrapperFormik.tsx @@ -1,42 +1,41 @@ import React from 'react'; import { ErrorMessage } from 'formik'; import { Badge } from 'reactstrap'; -import './FieldWrapperFormik.global.css'; - +import styles from './FieldWrapperFormik.module.css'; export type FieldWrapperProps = { name: string; - label: React.ReactNode; + label: string; required?: boolean; - className?: string; - description?: React.ReactNode; + description?: string; }; const FieldWrapper: React.FC> = ({ name, label, required, description, - className, children, }) => { return ( -
-