diff --git a/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx b/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx index dfc6ba3b..ac38aef2 100644 --- a/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx +++ b/src/features/dashboard/components/ApiTokenForm/CreateTokenField/index.tsx @@ -36,6 +36,7 @@ const CreateTokenField = ({ }: TCreateTokenField) => { const { tokens } = useApiToken(); const [input_value, setInputValue] = useState(''); + const numberOfTokens = tokens.length; useEffect(() => { if (form_is_cleared) { @@ -43,7 +44,6 @@ const CreateTokenField = ({ setFormIsCleared(false); } }, [form_is_cleared]); - const getTokenNames = useMemo(() => { const token_names = []; for (const token_object of tokens) { @@ -75,21 +75,30 @@ const CreateTokenField = ({ -
setInputValue((e.target as HTMLInputElement).value)} - className={`${styles.customTextInput} ${error_border_active ? 'error-border' : ''}`} - > - +
+
setInputValue((e.target as HTMLInputElement).value)} + className={`${styles.customTextInput} ${error_border_active ? 'error-border' : ''}`} + > + + {is_toggle && } + +
- {is_toggle && }
{errors && errors.name && ( diff --git a/src/features/dashboard/components/ApiTokenForm/__tests__/api-token.form.test.tsx b/src/features/dashboard/components/ApiTokenForm/__tests__/api-token.form.test.tsx index f1e75e54..448f07d9 100644 --- a/src/features/dashboard/components/ApiTokenForm/__tests__/api-token.form.test.tsx +++ b/src/features/dashboard/components/ApiTokenForm/__tests__/api-token.form.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { cleanup, render, screen, within } from '@site/src/test-utils'; +import { cleanup, render, screen, waitFor, within } from '@site/src/test-utils'; import userEvent from '@testing-library/user-event'; import ApiTokenForm from '../api-token.form'; import useCreateToken from '../../../hooks/useCreateToken'; @@ -134,6 +134,13 @@ describe('Home Page', () => { expect(adminCheckbox.checked).toBeTruthy(); }); + it('Should show dynamic token label', async () => { + const tokenLabel = screen.getByTestId('token-count-label'); + await waitFor(() => { + expect(tokenLabel).toBeVisible(); + }); + }); + it('Should create token on form submit', async () => { const nameInput = screen.getByRole('textbox'); @@ -155,6 +162,20 @@ describe('Home Page', () => { expect(error).toBeVisible; }); + it('Should update token a value on create token', async () => { + const tokenLabel = screen.getByTestId('token-count-label'); + const nameInput = screen.getByRole('textbox'); + + await userEvent.type(nameInput, 'test create token'); + + const submitButton = screen.getByRole('button', { name: /Create/i }); + await userEvent.click(submitButton); + + await waitFor(() => { + expect(tokenLabel).toHaveTextContent('2'); + }); + }); + it('should hide restrictions if error is present', async () => { const nameInput = screen.getByRole('textbox'); const restrictions = screen.getByRole('list'); diff --git a/src/features/dashboard/components/ApiTokenForm/api-token.form.module.scss b/src/features/dashboard/components/ApiTokenForm/api-token.form.module.scss index 65c62c47..801aa94e 100644 --- a/src/features/dashboard/components/ApiTokenForm/api-token.form.module.scss +++ b/src/features/dashboard/components/ApiTokenForm/api-token.form.module.scss @@ -48,69 +48,59 @@ form { } } -.customTextInput { - align-items: center; - border: 1px solid var(--colors-greyLight400); - border-radius: rem(1.6); +.tokenWrapper { display: flex; - position: relative; - box-sizing: border-box; - margin: rem(0.5) 0; - &:hover { - border: 1px solid var(--colors-greyLight600); - } - &:focus-within { - border-color: var(--colors-blue500); - } + flex-direction: row; + align-items: center; button { - border-top-left-radius: 0; - border-bottom-left-radius: 0; + border-radius: 0 rem(1.6) rem(1.6) 0; height: rem(3); - border-top-right-radius: rem(1.6); - border-bottom-right-radius: rem(1.6); - } - label { - position: absolute; - color: var(--colors-greyLight600); - left: rem(1.2); - pointer-events: none; - transform-origin: top left; - transition: all 0.25s ease; - white-space: nowrap; - width: calc(100% - 100px); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + @media (max-width: 425px) { + border-radius: rem(1.6); + width: 91%; + } } - input[type='text'], - input[type='number'] { - background: 0 0; - box-sizing: border-box; - color: var(--ifm-color-emphasis-1000); - height: rem(4); - min-width: 0; + + .customTextInput { + align-items: center; + border: 1px solid var(--colors-greyLight400); + border-radius: rem(1.6) 0 0 rem(1.6); + display: flex; width: 100%; - border: none; - text-indent: rem(1.2); - font-size: rem(1.6); - &:not(:placeholder-shown) ~ label { - color: var(--colors-blue400); - background-color: var(--ifm-color-emphasis-0); - padding: 0 rem(0.4); - transform: translateY(rem(-2)) scale(0.75); - width: unset; - @media screen and (min-width: 320px) and (max-width: 425px) { - font-size: rem(1.4); - } - &.tokenInputLabel { - color: var(--smoke); - } + position: relative; + box-sizing: border-box; + margin: rem(0.5) 0; + &:hover { + border: 1px solid var(--colors-greyLight600); } - &:focus { - outline-color: unset; - outline: unset; - border-radius: rem(1.6); - & ~ label { + &:focus-within { + border-color: var(--colors-blue500); + } + label { + position: absolute; + color: var(--colors-greyLight600); + left: rem(1.2); + pointer-events: none; + transform-origin: top left; + transition: all 0.25s ease; + white-space: nowrap; + width: calc(100% - 100px); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + input[type='text'], + input[type='number'] { + background: 0 0; + box-sizing: border-box; + color: var(--ifm-color-emphasis-1000); + height: rem(4); + min-width: 0; + width: 100%; + border: none; + text-indent: rem(1.2); + font-size: rem(1.6); + &:not(:placeholder-shown) ~ label { color: var(--colors-blue400); background-color: var(--ifm-color-emphasis-0); padding: 0 rem(0.4); @@ -123,11 +113,36 @@ form { color: var(--smoke); } } + &:focus { + outline-color: unset; + outline: unset; + border-radius: rem(1.6); + & ~ label { + color: var(--colors-blue400); + background-color: var(--ifm-color-emphasis-0); + padding: 0 rem(0.4); + transform: translateY(rem(-2)) scale(0.75); + width: unset; + @media screen and (min-width: 320px) and (max-width: 425px) { + font-size: rem(1.4); + } + &.tokenInputLabel { + color: var(--smoke); + } + } + } + &::placeholder { + color: var(--colors-greyLight600); + } } - &::placeholder { - color: var(--colors-greyLight600); + @media (max-width: 425px) { + border-radius: rem(1.6); } } + @media (max-width: 425px) { + flex-direction: column; + gap: rem(0.5); + } } .card_wrapper {