fix(timeline): fixed buttons in events to work on mobile

This commit is contained in:
Matej Glasnák committed 2026-02-11 21:47:32 +01:00
1 parent 40dd1d671d
commit 5b4e307e24
1 file changed
+32 -5
@@ -157,26 +157,30 @@
rounded rounded
class="event__footer__button me-2" class="event__footer__button me-2"
:class="{ completed: props.event.subtask?.is_finished }" :class="{ completed: props.event.subtask?.is_finished }"
@click.stop="emits('complete-task', props.event)" @click.stop="handleCompleteTask"
@touchend.stop.prevent="handleTouchEnd($event, 'complete-task')"
><img :src="checkmarkDouble" alt="" ><img :src="checkmarkDouble" alt=""
/></v-btn> /></v-btn>
<v-btn <v-btn
rounded rounded
class="event__footer__button me-2" class="event__footer__button me-2"
:class="{ completed: props.event._timeblock_is_finished }" :class="{ completed: props.event._timeblock_is_finished }"
@click.stop="emits('toggle-timeblock-is-finished', props.event)" @click.stop="handleToggleTimeblock"
@touchend.stop.prevent="handleTouchEnd($event, 'toggle-timeblock')"
><img :src="checkmark" alt="" ><img :src="checkmark" alt=""
/></v-btn> /></v-btn>
<v-btn <v-btn
rounded rounded
class="event__footer__button me-2" class="event__footer__button me-2"
@click.stop.prevent="emits('edit-task', props.event)" @click.stop.prevent="handleEditTask"
@touchend.stop.prevent="handleTouchEnd($event, 'edit-task')"
><img :src="eye" alt="" ><img :src="eye" alt=""
/></v-btn> /></v-btn>
<v-btn <v-btn
rounded rounded
class="event__footer__button me-2" class="event__footer__button me-2"
@click.stop.prevent="emits('delete-timeblock-in-task', props.event)" @click.stop.prevent="handleDeleteTimeblock"
@touchend.stop.prevent="handleTouchEnd($event, 'delete-timeblock')"
><img :src="bin" alt="" ><img :src="bin" alt=""
/></v-btn> /></v-btn>
</template> </template>
@@ -193,7 +197,7 @@ import {
pencil, pencil,
office365, office365,
} from '@/plugins/app/_img'; } from '@/plugins/app/_img';
import { computed, ComputedRef, defineProps, defineEmits } from 'vue'; import { computed, ComputedRef } from 'vue';
const props = defineProps<{ const props = defineProps<{
event: any; event: any;
@@ -208,6 +212,25 @@ const emits = defineEmits<{
(e: 'delete-timeblock-in-task', event: any): void; (e: 'delete-timeblock-in-task', event: any): void;
}>(); }>();
// iOS: touchend triggers the action (click often doesn't fire on touch devices)
const handleTouchEnd = (event: TouchEvent, action: string) => {
event.preventDefault();
event.stopPropagation();
if (action === 'complete-task') emits('complete-task', props.event);
else if (action === 'toggle-timeblock')
emits('toggle-timeblock-is-finished', props.event);
else if (action === 'edit-task') emits('edit-task', props.event);
else if (action === 'delete-timeblock')
emits('delete-timeblock-in-task', props.event);
};
const handleCompleteTask = () => emits('complete-task', props.event);
const handleToggleTimeblock = () =>
emits('toggle-timeblock-is-finished', props.event);
const handleEditTask = () => emits('edit-task', props.event);
const handleDeleteTimeblock = () =>
emits('delete-timeblock-in-task', props.event);
const deadline: ComputedRef<string | undefined> = computed(() => { const deadline: ComputedRef<string | undefined> = computed(() => {
if (!props.event.subtask) return undefined; if (!props.event.subtask) return undefined;
@@ -308,6 +331,10 @@ const isOfficeEvent: ComputedRef<boolean> = computed(() => {
&.completed &.completed
background: #06dece background: #06dece
// Disable pointer events on all child elements so button receives touch events
:deep(*)
pointer-events: none
img img
width: 18px width: 18px
</style> </style>