aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2023-10-30 19:04:32 +0100
committerGitHub <noreply@github.com>2023-10-30 19:04:32 +0100
commit1215379e0fd0352b4caf36ba0992052d96f39785 (patch)
tree9d350cf422d0b4106e7ebb3089d5e9fa367eeaca /apps
parentee9cad79f66470aee3d6176bbca7208da57c8f96 (diff)
parent7bb2aec7a6231d82473e587968a463b4aa0f726b (diff)
downloadnextcloud-server-1215379e0fd0352b4caf36ba0992052d96f39785.tar.gz
nextcloud-server-1215379e0fd0352b4caf36ba0992052d96f39785.zip
Merge pull request #41197 from nextcloud/fix/keep-focus-on-app-order
fix(theming): Ensure focus is kept on the button when reordering
Diffstat (limited to 'apps')
-rw-r--r--apps/theming/src/components/AppOrderSelector.vue17
-rw-r--r--apps/theming/src/components/AppOrderSelectorElement.vue12
2 files changed, 24 insertions, 5 deletions
diff --git a/apps/theming/src/components/AppOrderSelector.vue b/apps/theming/src/components/AppOrderSelector.vue
index bd4e4e7760d..392519de25e 100644
--- a/apps/theming/src/components/AppOrderSelector.vue
+++ b/apps/theming/src/components/AppOrderSelector.vue
@@ -2,6 +2,7 @@
<ol ref="listElement" data-cy-app-order class="order-selector">
<AppOrderSelectorElement v-for="app,index in appList"
:key="`${app.id}${renderCount}`"
+ ref="selectorElements"
:app="app"
:is-first="index === 0 || !!appList[index - 1].default"
:is-last="index === value.length - 1"
@@ -14,7 +15,7 @@
<script lang="ts">
import { useSortable } from '@vueuse/integrations/useSortable'
-import { PropType, computed, defineComponent, ref } from 'vue'
+import { PropType, computed, defineComponent, onUpdated, ref } from 'vue'
import AppOrderSelectorElement from './AppOrderSelectorElement.vue'
@@ -82,6 +83,19 @@ export default defineComponent({
useSortable(listElement, appList, { filter: '.order-selector-element--disabled' })
/**
+ * Array of all AppOrderSelectorElement components used to for keeping the focus after button click
+ */
+ const selectorElements = ref<InstanceType<typeof AppOrderSelectorElement>[]>([])
+
+ /**
+ * We use the updated hook here to verify all selector elements keep the focus on the last pressed button
+ * This is needed to be done in this component to make sure Sortable.JS has finished sorting the elements before focussing an element
+ */
+ onUpdated(() => {
+ selectorElements.value.forEach(element => element.keepFocus())
+ })
+
+ /**
* Handle element is moved up
* @param index The index of the element that is moved
*/
@@ -119,6 +133,7 @@ export default defineComponent({
moveUp,
renderCount,
+ selectorElements,
}
},
})
diff --git a/apps/theming/src/components/AppOrderSelectorElement.vue b/apps/theming/src/components/AppOrderSelectorElement.vue
index 73da7579d59..4c7266eb798 100644
--- a/apps/theming/src/components/AppOrderSelectorElement.vue
+++ b/apps/theming/src/components/AppOrderSelectorElement.vue
@@ -52,7 +52,7 @@
import type { PropType } from 'vue'
import { translate as t } from '@nextcloud/l10n'
-import { defineComponent, nextTick, onUpdated, ref } from 'vue'
+import { defineComponent, nextTick, ref } from 'vue'
import IconArrowDown from 'vue-material-design-icons/ArrowDown.vue'
import IconArrowUp from 'vue-material-design-icons/ArrowUp.vue'
@@ -116,10 +116,12 @@ export default defineComponent({
}
/**
- * onUpdated hook is used to reset the focus on the last used button (if requested)
+ * Reset the focus on the last used button.
* If the button is now visible anymore (because this element is the first/last) then the opposite button is focussed
+ *
+ * This function is exposed to the "AppOrderSelector" component which triggers this when the list was successfully rerendered
*/
- onUpdated(() => {
+ const keepFocus = () => {
if (needsFocus !== 0) {
// focus requested
if ((needsFocus === 1 || props.isLast) && !props.isFirst) {
@@ -130,7 +132,7 @@ export default defineComponent({
}
}
needsFocus = 0
- })
+ }
return {
buttonUp,
@@ -139,6 +141,8 @@ export default defineComponent({
moveUp,
moveDown,
+ keepFocus,
+
t,
}
},