diff options
author | Christopher Ng <chrng8@gmail.com> | 2024-01-25 19:12:32 -0800 |
---|---|---|
committer | Christopher Ng <chrng8@gmail.com> | 2024-01-26 11:21:04 -0800 |
commit | 22ab251cfa3177121d94248a290806785bf17e21 (patch) | |
tree | ba7345afb839af2549d9396c4dc93ac9365bcea9 /apps | |
parent | beec3028fbf934b3f510f2f5ca79cf197a74a5e8 (diff) | |
download | nextcloud-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.vue | 4 | ||||
-rw-r--r-- | apps/files_sharing/src/components/SharingInput.vue | 7 | ||||
-rw-r--r-- | apps/files_sharing/src/views/SharingTab.vue | 142 |
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 + }) + } }, }, } |