Skip to content

Commit ccdefa6

Browse files
committed
Make some texts copyable
1 parent 40bfdd5 commit ccdefa6

File tree

4 files changed

+49
-5
lines changed

4 files changed

+49
-5
lines changed

ui/.eslintrc.cjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ module.exports = {
7979
},
8080
}],
8181
"vue/multi-word-component-names": ["error", {
82-
ignores: [],
82+
ignores: ["Copyable"],
8383
}],
8484
"vue/static-class-names-order": ["error"],
8585
"vue/attributes-order": ["error"],

ui/src/components/KubeObjectViewer.vue

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { useKubeDataStore } from "../stores";
88
import KubeObjectViewerActionBar from "./KubeObjectViewerActionBar.vue";
99
import KubeObjectViewerMenu from "./KubeObjectViewerMenu.vue";
1010
import KubeObjectViewerTabs from "./KubeObjectViewerTabs.vue";
11+
import Copyable from "./base/Copyable.vue";
1112
1213
const props = defineProps<{
1314
object: KubeObject
@@ -56,7 +57,7 @@ onMounted(async() => {
5657
namespace: props.object.namespace,
5758
}, (err) => {
5859
if (err) {
59-
console.error("KubeObjectViewer: watch inpsected object error", props.object, err);
60+
console.error("KubeObjectViewer: watch inspected object error", props.object, err);
6061
}
6162
});
6263
cleaner.addCleanup(unwatch);
@@ -73,10 +74,12 @@ onMounted(async() => {
7374
class="block font-semibold truncate"
7475
:class="objectClass"
7576
>
76-
<div
77+
<Copyable
7778
:title="titleText"
7879
class="truncate"
79-
>{{ titleText }}</div>
80+
:copy-text="object.name"
81+
:text="titleText"
82+
/>
8083
</a>
8184

8285
<KubeObjectViewerMenu :object="object" />

ui/src/components/KubeObjectViewerPodInsightsTab.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { KubeObject, V1Container, V1Pod } from "../common/types";
77
import CodeEditor from "./CodeEditor.vue";
88
import KubeObjectViewerPodConditions from "./KubeObjectViewerPodConditions.vue";
99
import KubeObjectViewerPodContainers from "./KubeObjectViewerPodContainers.vue";
10+
import Copyable from "./base/Copyable.vue";
1011
1112
const props = defineProps<{
1213
object: KubeObject<V1Pod>,
@@ -68,7 +69,7 @@ const selectedContainerYaml = computed(() => {
6869
<div class="cursor-default">
6970
IPs:
7071
</div>
71-
<div>{{ object.raw.status!.podIPs?.map((el) => el.ip)?.join(" ") }}</div>
72+
<Copyable :text="object.raw.status!.podIPs?.map((el) => el.ip)?.join(' ') || ''" />
7273
</div>
7374

7475
<div>

ui/src/components/base/Copyable.vue

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<script lang="ts" setup>
2+
import { ClipboardIcon, CheckIcon } from "@heroicons/vue/24/outline";
3+
import { useClipboard } from "@vueuse/core";
4+
import { ref } from "vue";
5+
6+
const props = defineProps<{
7+
text: string,
8+
copyText?: string,
9+
}>();
10+
11+
const clipboardIcon = ref(ClipboardIcon);
12+
13+
async function onCopyClick() {
14+
await useClipboard().copy(props.copyText || props.text);
15+
16+
clipboardIcon.value = CheckIcon;
17+
18+
setTimeout(() => {
19+
clipboardIcon.value = ClipboardIcon;
20+
}, 2000);
21+
}
22+
</script>
23+
24+
<template>
25+
<div class="flex group items-center">
26+
<slot>
27+
{{ text }}
28+
</slot>
29+
30+
<button
31+
class="bg-transparent border-none btn btn-square btn-xs group-hover:flex group-hover:opacity-50 hidden hover:!opacity-100 hover:bg-transparent z-40"
32+
@click="onCopyClick"
33+
>
34+
<component
35+
:is="clipboardIcon"
36+
class="w-[1rem]"
37+
/>
38+
</button>
39+
</div>
40+
</template>

0 commit comments

Comments
 (0)