mirror of https://github.com/wg-easy/wg-easy
Browse Source
* add view config btn and modal * show loading state * add note about keyboardpull/2293/head
committed by
GitHub
5 changed files with 125 additions and 2 deletions
@ -0,0 +1,29 @@ |
|||
<template> |
|||
<div class="overflow-x-auto rounded border-2 border-red-800 py-2"> |
|||
<pre |
|||
class="mx-2 inline-block" |
|||
@click="selectCode" |
|||
><code ref="codeBlock">{{ code }}</code></pre> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
defineProps<{ |
|||
code: string; |
|||
}>(); |
|||
|
|||
const codeBlock = useTemplateRef('codeBlock'); |
|||
|
|||
function selectCode() { |
|||
// TODO: keyboard support? |
|||
if (codeBlock.value) { |
|||
const range = document.createRange(); |
|||
range.selectNodeContents(codeBlock.value); |
|||
const sel = window.getSelection(); |
|||
if (sel) { |
|||
sel.removeAllRanges(); |
|||
sel.addRange(range); |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
@ -0,0 +1,74 @@ |
|||
<template> |
|||
<BaseDialog :trigger-class="triggerClass"> |
|||
<template #trigger> |
|||
<slot /> |
|||
</template> |
|||
<template #title> |
|||
{{ $t('client.config') }} |
|||
</template> |
|||
<template #description> |
|||
<div v-if="status === 'success'"> |
|||
<BaseCodeBlock :code="config ?? ''" /> |
|||
</div> |
|||
<div v-else> |
|||
<span>{{ $t('general.loading') }}</span> |
|||
</div> |
|||
</template> |
|||
<template #actions> |
|||
<DialogClose as-child> |
|||
<BaseSecondaryButton>{{ $t('dialog.cancel') }}</BaseSecondaryButton> |
|||
</DialogClose> |
|||
<DialogClose as-child> |
|||
<BasePrimaryButton @click="copyCode"> |
|||
{{ $t('copy.copy') }} |
|||
</BasePrimaryButton> |
|||
</DialogClose> |
|||
</template> |
|||
</BaseDialog> |
|||
</template> |
|||
|
|||
<script setup lang="ts"> |
|||
const props = defineProps<{ triggerClass?: string; clientId: number }>(); |
|||
|
|||
const toast = useToast(); |
|||
const { copied, copy, isSupported } = useClipboard({ |
|||
// fallback does not work |
|||
legacy: false, |
|||
}); |
|||
|
|||
const { data: config, status } = useFetch( |
|||
`/api/client/${props.clientId}/configuration`, |
|||
{ |
|||
responseType: 'text', |
|||
server: false, |
|||
} |
|||
); |
|||
|
|||
async function copyCode() { |
|||
if (status.value !== 'success') { |
|||
return; |
|||
} |
|||
|
|||
if (!isSupported.value) { |
|||
toast.showToast({ |
|||
type: 'error', |
|||
message: $t('copy.notSupported'), |
|||
}); |
|||
return; |
|||
} |
|||
|
|||
await copy(config.value ?? ''); |
|||
|
|||
if (copied.value) { |
|||
toast.showToast({ |
|||
type: 'success', |
|||
message: $t('copy.copied'), |
|||
}); |
|||
} else { |
|||
toast.showToast({ |
|||
type: 'error', |
|||
message: $t('copy.failed'), |
|||
}); |
|||
} |
|||
} |
|||
</script> |
|||
Loading…
Reference in new issue