aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorChristopher Ng <chrng8@gmail.com>2024-01-25 19:12:32 -0800
committerChristopher Ng <chrng8@gmail.com>2024-01-26 11:21:04 -0800
commit22ab251cfa3177121d94248a290806785bf17e21 (patch)
treeba7345afb839af2549d9396c4dc93ac9365bcea9 /apps
parentbeec3028fbf934b3f510f2f5ca79cf197a74a5e8 (diff)
downloadnextcloud-server-22ab251cfa3177121d94248a290806785bf17e21.tar.gz
nextcloud-server-22ab251cfa3177121d94248a290806785bf17e21.zip
fix(files_sharing): Return focus to trigger element on sharing details close
Signed-off-by: Christopher Ng <chrng8@gmail.com>
Diffstat (limited to 'apps')
-rw-r--r--apps/files_sharing/src/components/SharingEntryLink.vue4
-rw-r--r--apps/files_sharing/src/components/SharingInput.vue7
-rw-r--r--apps/files_sharing/src/views/SharingTab.vue142
3 files changed, 91 insertions, 62 deletions
diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index accc349f734..d59f569dd0e 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -125,7 +125,9 @@
@close="onMenuClose">
<template v-if="share">
<template v-if="share.canEdit && canReshare">
- <NcActionButton :disabled="saving" @click.prevent="openSharingDetails">
+ <NcActionButton :disabled="saving"
+ :close-after-click="true"
+ @click.prevent="openSharingDetails">
<template #icon>
<Tune />
</template>
diff --git a/apps/files_sharing/src/components/SharingInput.vue b/apps/files_sharing/src/components/SharingInput.vue
index 1de28abef82..b8559dd0972 100644
--- a/apps/files_sharing/src/components/SharingInput.vue
+++ b/apps/files_sharing/src/components/SharingInput.vue
@@ -35,7 +35,7 @@
:user-select="true"
:options="options"
@search="asyncFind"
- @option:selected="openSharingDetails">
+ @option:selected="onSelected">
<template #no-options="{ search }">
{{ search ? noResultText : t('files_sharing', 'No recommendations. Start typing.') }}
</template>
@@ -155,6 +155,11 @@ export default {
},
methods: {
+ onSelected(option) {
+ this.value = null // Reset selected option
+ this.openSharingDetails(option)
+ },
+
async asyncFind(query) {
// save current query to check if we display
// recommendations or search results
diff --git a/apps/files_sharing/src/views/SharingTab.vue b/apps/files_sharing/src/views/SharingTab.vue
index ce21d3453f1..7f424dd4b32 100644
--- a/apps/files_sharing/src/views/SharingTab.vue
+++ b/apps/files_sharing/src/views/SharingTab.vue
@@ -28,68 +28,69 @@
<h2>{{ error }}</h2>
</div>
- <template v-if="!showSharingDetailsView">
- <!-- shares content -->
- <div class="sharingTab__content">
- <!-- shared with me information -->
- <ul>
- <SharingEntrySimple v-if="isSharedWithMe" v-bind="sharedWithMe" class="sharing-entry__reshare">
- <template #avatar>
- <NcAvatar :user="sharedWithMe.user"
- :display-name="sharedWithMe.displayName"
- class="sharing-entry__avatar" />
- </template>
- </SharingEntrySimple>
- </ul>
-
- <!-- add new share input -->
- <SharingInput v-if="!loading"
- :can-reshare="canReshare"
- :file-info="fileInfo"
- :link-shares="linkShares"
- :reshare="reshare"
- :shares="shares"
- @open-sharing-details="toggleShareDetailsView" />
-
- <!-- link shares list -->
- <SharingLinkList v-if="!loading"
- ref="linkShareList"
- :can-reshare="canReshare"
- :file-info="fileInfo"
- :shares="linkShares"
- @open-sharing-details="toggleShareDetailsView" />
-
- <!-- other shares list -->
- <SharingList v-if="!loading"
- ref="shareList"
- :shares="shares"
- :file-info="fileInfo"
- @open-sharing-details="toggleShareDetailsView" />
-
- <!-- inherited shares -->
- <SharingInherited v-if="canReshare && !loading" :file-info="fileInfo" />
-
- <!-- internal link copy -->
- <SharingEntryInternal :file-info="fileInfo" />
-
- <!-- projects -->
- <CollectionList v-if="projectsEnabled && fileInfo"
- :id="`${fileInfo.id}`"
- type="file"
- :name="fileInfo.name" />
- </div>
-
- <!-- additional entries, use it with cautious -->
- <div v-for="(section, index) in sections"
- :ref="'section-' + index"
- :key="index"
- class="sharingTab__additionalContent">
- <component :is="section($refs['section-'+index], fileInfo)" :file-info="fileInfo" />
- </div>
- </template>
+ <!-- shares content -->
+ <div v-show="!showSharingDetailsView"
+ class="sharingTab__content">
+ <!-- shared with me information -->
+ <ul>
+ <SharingEntrySimple v-if="isSharedWithMe" v-bind="sharedWithMe" class="sharing-entry__reshare">
+ <template #avatar>
+ <NcAvatar :user="sharedWithMe.user"
+ :display-name="sharedWithMe.displayName"
+ class="sharing-entry__avatar" />
+ </template>
+ </SharingEntrySimple>
+ </ul>
+
+ <!-- add new share input -->
+ <SharingInput v-if="!loading"
+ :can-reshare="canReshare"
+ :file-info="fileInfo"
+ :link-shares="linkShares"
+ :reshare="reshare"
+ :shares="shares"
+ @open-sharing-details="toggleShareDetailsView" />
+
+ <!-- link shares list -->
+ <SharingLinkList v-if="!loading"
+ ref="linkShareList"
+ :can-reshare="canReshare"
+ :file-info="fileInfo"
+ :shares="linkShares"
+ @open-sharing-details="toggleShareDetailsView" />
+
+ <!-- other shares list -->
+ <SharingList v-if="!loading"
+ ref="shareList"
+ :shares="shares"
+ :file-info="fileInfo"
+ @open-sharing-details="toggleShareDetailsView" />
+
+ <!-- inherited shares -->
+ <SharingInherited v-if="canReshare && !loading" :file-info="fileInfo" />
+
+ <!-- internal link copy -->
+ <SharingEntryInternal :file-info="fileInfo" />
+
+ <!-- projects -->
+ <CollectionList v-if="projectsEnabled && fileInfo"
+ :id="`${fileInfo.id}`"
+ type="file"
+ :name="fileInfo.name" />
+ </div>
+
+ <!-- additional entries, use it with cautious -->
+ <div v-for="(section, index) in sections"
+ v-show="!showSharingDetailsView"
+ :ref="'section-' + index"
+ :key="index"
+ class="sharingTab__additionalContent">
+ <component :is="section($refs['section-'+index], fileInfo)" :file-info="fileInfo" />
+ </div>
<!-- share details -->
- <SharingDetailsTab v-else :file-info="shareDetailsData.fileInfo"
+ <SharingDetailsTab v-if="showSharingDetailsView"
+ :file-info="shareDetailsData.fileInfo"
:share="shareDetailsData.share"
@close-sharing-details="toggleShareDetailsView"
@add:share="addShare"
@@ -154,6 +155,7 @@ export default {
projectsEnabled: loadState('core', 'projects_enabled', false),
showSharingDetailsView: false,
shareDetailsData: {},
+ returnFocusElement: null,
}
},
@@ -389,11 +391,31 @@ export default {
}
})
},
+
toggleShareDetailsView(eventData) {
+ if (!this.showSharingDetailsView) {
+ const isAction = Array.from(document.activeElement.classList)
+ .some(className => className.startsWith('action-'))
+ if (isAction) {
+ const menuId = document.activeElement.closest('[role="menu"]')?.id
+ this.returnFocusElement = document.querySelector(`[aria-controls="${menuId}"]`)
+ } else {
+ this.returnFocusElement = document.activeElement
+ }
+ }
+
if (eventData) {
this.shareDetailsData = eventData
}
+
this.showSharingDetailsView = !this.showSharingDetailsView
+
+ if (!this.showSharingDetailsView) {
+ this.$nextTick(() => { // Wait for next tick as the element must be visible to be focused
+ this.returnFocusElement?.focus()
+ this.returnFocusElement = null
+ })
+ }
},
},
}