From 0dfbc65bad074838fd99440f24e71f0a3cdad886 Mon Sep 17 00:00:00 2001 From: Azri Kahar <42867097+azrikahar@users.noreply.github.com> Date: Thu, 14 Apr 2022 05:56:29 +0800 Subject: [PATCH] Add copy button to role ID in role permissions page's sidebar detail (#12706) * refactor to useClipboard composable * add copy button to role permissions page --- app/src/components/v-error/v-error.vue | 10 ++-- app/src/components/v-form/form-field-menu.vue | 11 ++-- app/src/components/v-form/form-field.vue | 31 +++-------- app/src/composables/use-clipboard.ts | 54 +++++++++++++++++++ .../components/role-info-sidebar-detail.vue | 52 +++++++++++------- .../shares-sidebar-detail.vue | 16 ++---- 6 files changed, 108 insertions(+), 66 deletions(-) create mode 100644 app/src/composables/use-clipboard.ts diff --git a/app/src/components/v-error/v-error.vue b/app/src/components/v-error/v-error.vue index 684571902c..e16d1dd159 100644 --- a/app/src/components/v-error/v-error.vue +++ b/app/src/components/v-error/v-error.vue @@ -2,7 +2,7 @@
[{{ code }}] {{ message }} !!navigator.clipboard?.writeText); + const { isCopySupported, copyToClipboard } = useClipboard(); - return { t, code, copyError, showCopy, copied, message }; + return { t, code, copyError, isCopySupported, copied, message }; async function copyError() { const error = props.error?.response?.data || props.error; - await navigator.clipboard.writeText( + const isCopied = await copyToClipboard( JSON.stringify(error, isPlainObject(error) ? null : Object.getOwnPropertyNames(error), 2) ); + if (!isCopied) return; copied.value = true; } }, diff --git a/app/src/components/v-form/form-field-menu.vue b/app/src/components/v-form/form-field-menu.vue index f99751c79e..309d992cd5 100644 --- a/app/src/components/v-form/form-field-menu.vue +++ b/app/src/components/v-form/form-field-menu.vue @@ -51,6 +51,7 @@ import { useI18n } from 'vue-i18n'; import { defineComponent, PropType, computed } from 'vue'; import { Field } from '@directus/shared/types'; +import useClipboard from '@/composables/use-clipboard'; export default defineComponent({ props: { @@ -75,6 +76,8 @@ export default defineComponent({ setup(props) { const { t } = useI18n(); + const { isCopySupported, isPasteSupported } = useClipboard(); + const defaultValue = computed(() => { const savedValue = props.field?.schema?.default_value; return savedValue !== undefined ? savedValue : null; @@ -84,14 +87,6 @@ export default defineComponent({ return props.field?.schema?.is_nullable === false; }); - const isCopySupported = computed(() => { - return !!navigator?.clipboard?.writeText; - }); - - const isPasteSupported = computed(() => { - return !!navigator?.clipboard?.readText; - }); - return { t, defaultValue, isRequired, isCopySupported, isPasteSupported }; }, }); diff --git a/app/src/components/v-form/form-field.vue b/app/src/components/v-form/form-field.vue index f20de34165..fc0571268c 100644 --- a/app/src/components/v-form/form-field.vue +++ b/app/src/components/v-form/form-field.vue @@ -69,7 +69,6 @@ diff --git a/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue b/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue index 44285e8da6..0fd91119e2 100644 --- a/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue +++ b/app/src/views/private/components/shares-sidebar-detail/shares-sidebar-detail.vue @@ -80,8 +80,8 @@ import { defineComponent, ref, computed } from 'vue'; import DrawerItem from '@/views/private/components/drawer-item'; import { getRootPath } from '@/utils/get-root-path'; import { unexpectedError } from '@/utils/unexpected-error'; -import { notify } from '@/utils/notify'; import { Share } from '@directus/shared/types'; +import useClipboard from '@/composables/use-clipboard'; import api from '@/api'; import ShareItem from './share-item.vue'; @@ -105,6 +105,8 @@ export default defineComponent({ setup(props) { const { t } = useI18n(); + const { copyToClipboard } = useClipboard(); + const shares = ref(null); const count = ref(0); const error = ref(null); @@ -168,17 +170,7 @@ export default defineComponent({ async function copy(id: string) { const url = window.location.origin + getRootPath() + 'admin/shared/' + id; - try { - await navigator?.clipboard?.writeText(url); - notify({ - title: t('share_copy_link_success'), - }); - } catch (err: any) { - notify({ - type: 'error', - title: t('share_copy_link_error'), - }); - } + await copyToClipboard(url, { success: t('share_copy_link_success'), fail: t('share_copy_link_error') }); } function select(id: string) {