diff --git a/webapp/packages/core-app/public/icons/icons.svg b/webapp/packages/core-app/public/icons/icons.svg index 8bd9e9de6f..d617d669ec 100644 --- a/webapp/packages/core-app/public/icons/icons.svg +++ b/webapp/packages/core-app/public/icons/icons.svg @@ -299,4 +299,11 @@ + + + + + + + diff --git a/webapp/packages/core-blocks/src/FormControls/InputFieldNew.tsx b/webapp/packages/core-blocks/src/FormControls/InputFieldNew.tsx index fb2fe67919..55f2a57fc6 100644 --- a/webapp/packages/core-blocks/src/FormControls/InputFieldNew.tsx +++ b/webapp/packages/core-blocks/src/FormControls/InputFieldNew.tsx @@ -65,6 +65,7 @@ type BaseProps = Omit, 'onChange' | mod?: 'surface'; ref?: React.Ref; style?: ComponentStyle; + onCustomCopy?: () => void; }; type ControlledProps = BaseProps & { @@ -112,6 +113,7 @@ export const InputFieldNew: InputFieldType = observer(function InputFieldNew({ tiny, autoHide, onChange, + onCustomCopy, ...rest }: ControlledProps | ObjectProps, ref: React.Ref) { const [passwordRevealed, setPasswordRevealed] = useState(false); @@ -183,6 +185,11 @@ export const InputFieldNew: InputFieldType = observer(function InputFieldNew({ /> )} + {onCustomCopy && ( + + + + )} {description && ( diff --git a/webapp/packages/core-utils/src/copyToClipboard.ts b/webapp/packages/core-utils/src/copyToClipboard.ts index 5ae1c37cc4..6763612c75 100644 --- a/webapp/packages/core-utils/src/copyToClipboard.ts +++ b/webapp/packages/core-utils/src/copyToClipboard.ts @@ -23,6 +23,6 @@ export function copyToClipboard(data: string): void { document.body.removeChild(shadowElement); if (activeElement instanceof HTMLElement) { - activeElement.focus(); + activeElement.focus({ preventScroll: true }); } } diff --git a/webapp/packages/plugin-authentication/src/Administration/IdentityProviders/Options/AuthConfigurationOptions.tsx b/webapp/packages/plugin-authentication/src/Administration/IdentityProviders/Options/AuthConfigurationOptions.tsx index 131a818b0a..b29f48d6ba 100644 --- a/webapp/packages/plugin-authentication/src/Administration/IdentityProviders/Options/AuthConfigurationOptions.tsx +++ b/webapp/packages/plugin-authentication/src/Administration/IdentityProviders/Options/AuthConfigurationOptions.tsx @@ -14,7 +14,7 @@ import { AuthConfigurationParametersResource, AuthProvidersResource } from '@clo import { BASE_CONTAINERS_STYLES, ColoredContainer, ComboboxNew, FieldCheckboxNew, Group, GroupTitle, InputFieldNew, Link, ObjectPropertyInfoFormNew, SubmittingForm, TabContainerPanelComponent, - TextareaNew, useMapResource, useObjectPropertyCategories + TextareaNew, useClipboard, useMapResource, useObjectPropertyCategories } from '@cloudbeaver/core-blocks'; import { useTranslate } from '@cloudbeaver/core-localization'; import { AuthProviderConfigurationParametersFragment, CachedMapAllKey } from '@cloudbeaver/core-sdk'; @@ -37,6 +37,7 @@ export const AuthConfigurationOptions: TabContainerPanelComponent(null); const translate = useTranslate(); + const copy = useClipboard(); const style = useStyles(BASE_CONTAINERS_STYLES, styles); const providers = useMapResource(AuthConfigurationOptions, AuthProvidersResource, CachedMapAllKey); @@ -156,7 +157,9 @@ export const AuthConfigurationOptions: TabContainerPanelComponent copy(state.config.signInLink!, true)} > Sign in @@ -165,7 +168,9 @@ export const AuthConfigurationOptions: TabContainerPanelComponent copy(state.config.signOutLink!, true)} > Sign out