summaryrefslogtreecommitdiffstats
path: root/apps/theming/src
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2023-10-30 16:22:27 +0100
committerFerdinand Thiessen <opensource@fthiessen.de>2023-10-30 16:33:15 +0100
commit3e310228404a38aed98a4b299370934ff31a5992 (patch)
treec36b9d6c8739342aa5386cd11dee75b4276030a4 /apps/theming/src
parent51eb44dbfef18e057d7f3a0373bb73e670be478c (diff)
downloadnextcloud-server-3e310228404a38aed98a4b299370934ff31a5992.tar.gz
nextcloud-server-3e310228404a38aed98a4b299370934ff31a5992.zip
fix(theming): App order selector should keep the focus on click
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'apps/theming/src')
-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,
}
},