Skip to content

Commit baeede0

Browse files
authored
Merge pull request #3787 from skoeva/secret-copy
frontend: Secret: Add button to copy to clipboard
2 parents 9cc5a74 + f00a345 commit baeede0

18 files changed

+133
-0
lines changed

frontend/src/components/common/Resource/Resource.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,15 +501,47 @@ export function DataField(props: DataFieldProps) {
501501
export function SecretField(props: InputProps) {
502502
const { value, ...other } = props;
503503
const [showPassword, setShowPassword] = React.useState(false);
504+
const [copied, setCopied] = React.useState(false);
504505
const { t } = useTranslation();
505506

507+
const secret = String(value ?? '');
508+
506509
function handleClickShowPassword() {
507510
setShowPassword(!showPassword);
508511
}
509512

513+
async function onCopy() {
514+
if (!secret) {
515+
return;
516+
}
517+
518+
try {
519+
await navigator.clipboard.writeText(secret);
520+
setCopied(true);
521+
setTimeout(() => setCopied(false), 1200);
522+
} catch (err) {
523+
console.error(`Error copying secret to clipboard: ${err}`);
524+
}
525+
}
526+
527+
const tooltipTitle = copied ? t('translation|Copied') : t('translation|Copy to clipboard');
528+
const copyButton: JSX.Element = (
529+
<IconButton
530+
edge="start"
531+
aria-label={t('translation|Copy to clipboard')}
532+
onClick={onCopy}
533+
onMouseDown={e => e.preventDefault()}
534+
size="medium"
535+
disabled={!secret}
536+
>
537+
<Icon icon={'mdi:content-copy'} />
538+
</IconButton>
539+
);
540+
510541
return (
511542
<Grid container alignItems="stretch" spacing={2}>
512543
<Grid item>
544+
{!!secret ? <LightTooltip title={tooltipTitle}>{copyButton}</LightTooltip> : copyButton}
513545
<IconButton
514546
edge="end"
515547
aria-label={t('toggle field visibility')}

frontend/src/components/secret/__snapshots__/Details.WithBase.stories.storyshot

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,17 @@
234234
<div
235235
class="MuiGrid-root MuiGrid-item css-13i4rnv-MuiGrid-root"
236236
>
237+
<button
238+
aria-label="Copy to clipboard"
239+
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeStart MuiIconButton-sizeMedium css-1t8as3w-MuiButtonBase-root-MuiIconButton-root"
240+
data-mui-internal-clone-element="true"
241+
tabindex="0"
242+
type="button"
243+
>
244+
<span
245+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
246+
/>
247+
</button>
237248
<button
238249
aria-label="toggle field visibility"
239250
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeEnd MuiIconButton-sizeMedium css-1d2b2o6-MuiButtonBase-root-MuiIconButton-root"
@@ -275,6 +286,17 @@
275286
<div
276287
class="MuiGrid-root MuiGrid-item css-13i4rnv-MuiGrid-root"
277288
>
289+
<button
290+
aria-label="Copy to clipboard"
291+
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeStart MuiIconButton-sizeMedium css-1t8as3w-MuiButtonBase-root-MuiIconButton-root"
292+
data-mui-internal-clone-element="true"
293+
tabindex="0"
294+
type="button"
295+
>
296+
<span
297+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
298+
/>
299+
</button>
278300
<button
279301
aria-label="toggle field visibility"
280302
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeEnd MuiIconButton-sizeMedium css-1d2b2o6-MuiButtonBase-root-MuiIconButton-root"
@@ -316,6 +338,17 @@
316338
<div
317339
class="MuiGrid-root MuiGrid-item css-13i4rnv-MuiGrid-root"
318340
>
341+
<button
342+
aria-label="Copy to clipboard"
343+
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeStart MuiIconButton-sizeMedium css-1t8as3w-MuiButtonBase-root-MuiIconButton-root"
344+
data-mui-internal-clone-element="true"
345+
tabindex="0"
346+
type="button"
347+
>
348+
<span
349+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
350+
/>
351+
</button>
319352
<button
320353
aria-label="toggle field visibility"
321354
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeEnd MuiIconButton-sizeMedium css-1d2b2o6-MuiButtonBase-root-MuiIconButton-root"

frontend/src/components/webhookconfiguration/__snapshots__/MutatingWebhookConfigDetails.WithService.stories.storyshot

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,17 @@
290290
<div
291291
class="MuiGrid-root MuiGrid-item css-13i4rnv-MuiGrid-root"
292292
>
293+
<button
294+
aria-label="Copy to clipboard"
295+
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeStart MuiIconButton-sizeMedium css-1t8as3w-MuiButtonBase-root-MuiIconButton-root"
296+
data-mui-internal-clone-element="true"
297+
tabindex="0"
298+
type="button"
299+
>
300+
<span
301+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
302+
/>
303+
</button>
293304
<button
294305
aria-label="toggle field visibility"
295306
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeEnd MuiIconButton-sizeMedium css-1d2b2o6-MuiButtonBase-root-MuiIconButton-root"

frontend/src/components/webhookconfiguration/__snapshots__/MutatingWebhookConfigDetails.WithURL.stories.storyshot

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,17 @@
287287
<div
288288
class="MuiGrid-root MuiGrid-item css-13i4rnv-MuiGrid-root"
289289
>
290+
<button
291+
aria-label="Copy to clipboard"
292+
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeStart MuiIconButton-sizeMedium css-1t8as3w-MuiButtonBase-root-MuiIconButton-root"
293+
data-mui-internal-clone-element="true"
294+
tabindex="0"
295+
type="button"
296+
>
297+
<span
298+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
299+
/>
300+
</button>
290301
<button
291302
aria-label="toggle field visibility"
292303
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeEnd MuiIconButton-sizeMedium css-1d2b2o6-MuiButtonBase-root-MuiIconButton-root"

frontend/src/components/webhookconfiguration/__snapshots__/ValidatingWebhookConfigDetails.WithService.stories.storyshot

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,17 @@
290290
<div
291291
class="MuiGrid-root MuiGrid-item css-13i4rnv-MuiGrid-root"
292292
>
293+
<button
294+
aria-label="Copy to clipboard"
295+
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeStart MuiIconButton-sizeMedium css-1t8as3w-MuiButtonBase-root-MuiIconButton-root"
296+
data-mui-internal-clone-element="true"
297+
tabindex="0"
298+
type="button"
299+
>
300+
<span
301+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
302+
/>
303+
</button>
293304
<button
294305
aria-label="toggle field visibility"
295306
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeEnd MuiIconButton-sizeMedium css-1d2b2o6-MuiButtonBase-root-MuiIconButton-root"

frontend/src/components/webhookconfiguration/__snapshots__/ValidatingWebhookConfigDetails.WithURL.stories.storyshot

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,17 @@
287287
<div
288288
class="MuiGrid-root MuiGrid-item css-13i4rnv-MuiGrid-root"
289289
>
290+
<button
291+
aria-label="Copy to clipboard"
292+
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeStart MuiIconButton-sizeMedium css-1t8as3w-MuiButtonBase-root-MuiIconButton-root"
293+
data-mui-internal-clone-element="true"
294+
tabindex="0"
295+
type="button"
296+
>
297+
<span
298+
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
299+
/>
300+
</button>
290301
<button
291302
aria-label="toggle field visibility"
292303
class="MuiButtonBase-root MuiIconButton-root MuiIconButton-edgeEnd MuiIconButton-sizeMedium css-1d2b2o6-MuiButtonBase-root-MuiIconButton-root"

frontend/src/i18n/locales/de/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@
298298
"Forward port": "Port weiterleiten",
299299
"Delete port forward": "Portweiterleitung löschen",
300300
"Stop port forward": "Portweiterleitung stoppen",
301+
"Copied": "",
302+
"Copy to clipboard": "",
301303
"Mount Path": "Mount Path",
302304
"from": "von",
303305
"I/O": "I/O",

frontend/src/i18n/locales/en/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,8 @@
298298
"Forward port": "Forward port",
299299
"Delete port forward": "Delete port forward",
300300
"Stop port forward": "Stop port forward",
301+
"Copied": "Copied",
302+
"Copy to clipboard": "Copy to clipboard",
301303
"Mount Path": "Mount Path",
302304
"from": "from",
303305
"I/O": "I/O",

frontend/src/i18n/locales/es/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,8 @@
300300
"Forward port": "Redireccionar puerto",
301301
"Delete port forward": "Eliminar redireccionamiento de puerto",
302302
"Stop port forward": "Parar redireccionamiento de puerto",
303+
"Copied": "",
304+
"Copy to clipboard": "",
303305
"Mount Path": "Camino de montaje",
304306
"from": "desde",
305307
"I/O": "I/O",

frontend/src/i18n/locales/fr/translation.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,8 @@
300300
"Forward port": "Transférer le port",
301301
"Delete port forward": "Supprimer le transfert de port",
302302
"Stop port forward": "Arrêter le transfert de port",
303+
"Copied": "",
304+
"Copy to clipboard": "",
303305
"Mount Path": "Chemin de montage",
304306
"from": "de",
305307
"I/O": "Entrées/Sorties",

0 commit comments

Comments
 (0)