feat: merge TaskDetailViewModal with modal
This commit is contained in:
parent
de626eab31
commit
6827390b77
3 changed files with 54 additions and 58 deletions
|
@ -36,9 +36,14 @@
|
||||||
</router-view>
|
</router-view>
|
||||||
|
|
||||||
<transition name="modal">
|
<transition name="modal">
|
||||||
<TaskDetailViewModal v-if="currentModal" >
|
<modal
|
||||||
|
v-if="currentModal"
|
||||||
|
@close="closeModal()"
|
||||||
|
variant="scrolling"
|
||||||
|
class="task-detail-view-modal"
|
||||||
|
>
|
||||||
<component :is="currentModal" />
|
<component :is="currentModal" />
|
||||||
</TaskDetailViewModal>
|
</modal>
|
||||||
</transition>
|
</transition>
|
||||||
|
|
||||||
<a
|
<a
|
||||||
|
@ -62,7 +67,6 @@ import {useEventListener} from '@vueuse/core'
|
||||||
import {CURRENT_LIST, KEYBOARD_SHORTCUTS_ACTIVE, MENU_ACTIVE} from '@/store/mutation-types'
|
import {CURRENT_LIST, KEYBOARD_SHORTCUTS_ACTIVE, MENU_ACTIVE} from '@/store/mutation-types'
|
||||||
import Navigation from '@/components/home/navigation.vue'
|
import Navigation from '@/components/home/navigation.vue'
|
||||||
import QuickActions from '@/components/quick-actions/quick-actions.vue'
|
import QuickActions from '@/components/quick-actions/quick-actions.vue'
|
||||||
import TaskDetailViewModal from '@/views/tasks/TaskDetailViewModal.vue'
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
|
|
||||||
function useRouteWithModal() {
|
function useRouteWithModal() {
|
||||||
|
@ -100,10 +104,22 @@ function useRouteWithModal() {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
return { routeWithModal, currentModal }
|
function closeModal() {
|
||||||
|
const historyState = computed(() => route.fullPath && window.history.state)
|
||||||
|
|
||||||
|
if (historyState.value) {
|
||||||
|
router.back()
|
||||||
|
} else {
|
||||||
|
const backdropRoute = historyState.value?.backdropView && router.resolve(historyState.value.backdropView)
|
||||||
|
router.push(backdropRoute)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const { routeWithModal, currentModal } = useRouteWithModal()
|
return { routeWithModal, currentModal, closeModal }
|
||||||
|
}
|
||||||
|
|
||||||
|
const { routeWithModal, currentModal, closeModal } = useRouteWithModal()
|
||||||
|
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,13 @@
|
||||||
'is-wide': wide
|
'is-wide': wide
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
|
<BaseButton
|
||||||
|
@click="emit('close')"
|
||||||
|
class="close"
|
||||||
|
>
|
||||||
|
<icon icon="times"/>
|
||||||
|
</BaseButton>
|
||||||
|
|
||||||
<slot>
|
<slot>
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<slot name="header"></slot>
|
<slot name="header"></slot>
|
||||||
|
@ -54,6 +61,8 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import BaseButton from '@/components/base/BaseButton.vue'
|
||||||
|
|
||||||
export const TRANSITION_NAMES = {
|
export const TRANSITION_NAMES = {
|
||||||
MODAL: 'modal',
|
MODAL: 'modal',
|
||||||
FADE: 'fade',
|
FADE: 'fade',
|
||||||
|
@ -71,6 +80,11 @@ function validValue(values) {
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'modal',
|
name: 'modal',
|
||||||
|
|
||||||
|
components: {
|
||||||
|
BaseButton,
|
||||||
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
document.addEventListener('keydown', (e) => {
|
document.addEventListener('keydown', (e) => {
|
||||||
// Close the model when escape is pressed
|
// Close the model when escape is pressed
|
||||||
|
@ -197,4 +211,23 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.close {
|
||||||
|
position: fixed;
|
||||||
|
top: 5px;
|
||||||
|
right: 26px;
|
||||||
|
color: var(--white);
|
||||||
|
font-size: 2rem;
|
||||||
|
|
||||||
|
@media screen and (max-width: $desktop) {
|
||||||
|
color: var(--dark);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
// Close icon SVG uses currentColor, change the color to keep it visible
|
||||||
|
.dark .task-detail-view-modal .close {
|
||||||
|
color: var(--grey-900);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -1,53 +0,0 @@
|
||||||
<template>
|
|
||||||
<modal
|
|
||||||
@close="close()"
|
|
||||||
variant="scrolling"
|
|
||||||
class="task-detail-view-modal"
|
|
||||||
>
|
|
||||||
<BaseButton @click="close()" class="close">
|
|
||||||
<icon icon="times"/>
|
|
||||||
</BaseButton>
|
|
||||||
<slot />
|
|
||||||
</modal>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import {computed} from 'vue'
|
|
||||||
import {useRouter, useRoute} from 'vue-router'
|
|
||||||
|
|
||||||
import BaseButton from '@/components/base/BaseButton.vue'
|
|
||||||
|
|
||||||
const route = useRoute()
|
|
||||||
const historyState = computed(() => route.fullPath && window.history.state)
|
|
||||||
|
|
||||||
const router = useRouter()
|
|
||||||
function close() {
|
|
||||||
if (historyState.value) {
|
|
||||||
router.back()
|
|
||||||
} else {
|
|
||||||
const backdropRoute = historyState.value?.backdropView && router.resolve(historyState.value.backdropView)
|
|
||||||
router.push(backdropRoute)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.close {
|
|
||||||
position: fixed;
|
|
||||||
top: 5px;
|
|
||||||
right: 26px;
|
|
||||||
color: var(--white);
|
|
||||||
font-size: 2rem;
|
|
||||||
|
|
||||||
@media screen and (max-width: $desktop) {
|
|
||||||
color: var(--dark);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
// Close icon SVG uses currentColor, change the color to keep it visible
|
|
||||||
.dark .task-detail-view-modal .close {
|
|
||||||
color: var(--grey-900);
|
|
||||||
}
|
|
||||||
</style>
|
|
Loading…
Reference in a new issue