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