mirror of
https://bitbucket.org/studiotem/jandl-taskmanager-app.git
synced 2026-10-21 14:29:34 +00:00
[CHR-7] Added hide on header scroll
This commit is contained in:
1 parent
5dac57a81b
commit
26be814406
4 files changed
+105
-23
No files matched your search
@@ -0,0 +1,89 @@
|
|||||||
|
export default {
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
header: {
|
||||||
|
initialized: false,
|
||||||
|
marginTop: 0,
|
||||||
|
calendar_previousScrollPosition: 0,
|
||||||
|
isVisible: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
unmounted() {
|
||||||
|
this.$refs.page?.querySelector('.vuecal__bg')?.removeEventListener('scroll', this.handleScroll)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
_initScrollListener(repeat = 0) {
|
||||||
|
if (this.initialized) return
|
||||||
|
|
||||||
|
const calendar = this.$refs.page?.querySelector('.vuecal__bg')
|
||||||
|
|
||||||
|
if (!calendar)
|
||||||
|
return setTimeout(() => {
|
||||||
|
if (repeat < 20) this._initScrollListener(repeat + 1)
|
||||||
|
}, 200)
|
||||||
|
|
||||||
|
calendar.addEventListener('scroll', this._handleScroll)
|
||||||
|
this.initialized = true
|
||||||
|
this.header.calendar_previousScrollPosition = calendar.scrollTop
|
||||||
|
// if (calendar.scrollTop > 0 && this.header.isVisible) {
|
||||||
|
// this.hideHeader()
|
||||||
|
// }
|
||||||
|
},
|
||||||
|
|
||||||
|
_handleScroll(e) {
|
||||||
|
const header = document.querySelector('div.subheader') as HTMLElement
|
||||||
|
|
||||||
|
// Check if the header is initialized
|
||||||
|
if (!this.initialized) {
|
||||||
|
this.header.calendar_previousScrollPosition = e.target.scrollTop
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.header.calendar_previousScrollPosition > e.target.scrollTop) {
|
||||||
|
// On the way up
|
||||||
|
if (!this.header.isVisible) {
|
||||||
|
this.showHeader()
|
||||||
|
}
|
||||||
|
} else if (header.offsetHeight > Math.abs(e.target.scrollTop)) {
|
||||||
|
// On the way down
|
||||||
|
if (this.header.isVisible) {
|
||||||
|
this.hideHeader()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// On the way down below filter height
|
||||||
|
if (this.header.isVisible) {
|
||||||
|
this.hideHeader()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.header.calendar_previousScrollPosition = e.target.scrollTop
|
||||||
|
},
|
||||||
|
|
||||||
|
hideHeader() {
|
||||||
|
const header = document.querySelector('div.subheader') as HTMLElement
|
||||||
|
|
||||||
|
header.style.transition = 'margin-top 0.5s'
|
||||||
|
header.style.marginTop = `-${header.offsetHeight}px`
|
||||||
|
this.header.isVisible = false
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
header.style.transition = ''
|
||||||
|
}, 500)
|
||||||
|
},
|
||||||
|
|
||||||
|
showHeader() {
|
||||||
|
const header = document.querySelector('div.subheader') as HTMLElement
|
||||||
|
|
||||||
|
header.style.transition = 'margin-top 0.5s'
|
||||||
|
header.style.marginTop = '0'
|
||||||
|
this.header.isVisible = true
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
header.style.transition = ''
|
||||||
|
}, 500)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div ref="page">
|
||||||
<A-project-filter v-if="$store.getters['tm/isInitialized']" @filterChanged="onFilterChanged" />
|
<A-project-filter v-if="$store.getters['tm/isInitialized']" @filterChanged="onFilterChanged" />
|
||||||
|
|
||||||
<W-loadable :content="filteredProjects" emptyMessage="Nenašli sa žiadne vyhovujúce projekty">
|
<W-loadable :content="filteredProjects" emptyMessage="Nenašli sa žiadne vyhovujúce projekty">
|
||||||
@@ -11,8 +11,11 @@
|
|||||||
<script>
|
<script>
|
||||||
import AProjectCalendar from './_components/a-project-calendar.vue'
|
import AProjectCalendar from './_components/a-project-calendar.vue'
|
||||||
import AProjectFilter from './_components/a-project-filter.vue'
|
import AProjectFilter from './_components/a-project-filter.vue'
|
||||||
|
import FilterMixin from '../_mixins/Filter.mixin'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
mixins: [FilterMixin],
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
AProjectCalendar,
|
AProjectCalendar,
|
||||||
AProjectFilter
|
AProjectFilter
|
||||||
@@ -77,6 +80,8 @@ export default {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$toast.error('Nepodarilo sa nacitat data!')
|
this.$toast.error('Nepodarilo sa nacitat data!')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._initScrollListener()
|
||||||
},
|
},
|
||||||
|
|
||||||
openMasterTaskModal(mastertaskId) {
|
openMasterTaskModal(mastertaskId) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div ref="page">
|
<div ref="page">
|
||||||
<A-task-filter v-if="$store.getters['tm/isInitialized']" :split-days="timelineData ? splitDays : null" @filter-changed="onFilterChanged" :style="{marginTop: headerMarginTop}" ref="filter" />
|
<A-task-filter v-if="$store.getters['tm/isInitialized']" :split-days="timelineData ? splitDays : null" @filter-changed="onFilterChanged" ref="filter" />
|
||||||
<Z-timeline v-if="timelineData" :calData="timelineData" :calConfig="config" :splits="splitDays" />
|
<Z-timeline v-if="timelineData" :calData="timelineData" :calConfig="config" :splits="splitDays" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -12,8 +12,11 @@ import { addDays, subDays } from 'date-fns'
|
|||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
import timelineUtils from './_utils/timeline.utils'
|
import timelineUtils from './_utils/timeline.utils'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
|
import FilterMixin from '../_mixins/Filter.mixin'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
mixins: [FilterMixin],
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
ATaskFilter,
|
ATaskFilter,
|
||||||
ZTimeline
|
ZTimeline
|
||||||
@@ -23,8 +26,6 @@ export default {
|
|||||||
return {
|
return {
|
||||||
filter: null,
|
filter: null,
|
||||||
subtasks: null,
|
subtasks: null,
|
||||||
headerMarginTop: '0px',
|
|
||||||
previousScrollTop: 0,
|
|
||||||
config: {
|
config: {
|
||||||
date: subDays(new Date(), 1),
|
date: subDays(new Date(), 1),
|
||||||
scrollHour: 7,
|
scrollHour: 7,
|
||||||
@@ -147,11 +148,6 @@ export default {
|
|||||||
this.$events.on('on-blocker-deleted', () => {
|
this.$events.on('on-blocker-deleted', () => {
|
||||||
this.onFilterChanged(this.filter)
|
this.onFilterChanged(this.filter)
|
||||||
})
|
})
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
this.$refs.page?.querySelector('.vuecal__bg')?.addEventListener('scroll', this.handleScroll)
|
|
||||||
}, 1000)
|
|
||||||
// window
|
|
||||||
},
|
},
|
||||||
|
|
||||||
unmounted() {
|
unmounted() {
|
||||||
@@ -159,8 +155,6 @@ export default {
|
|||||||
this.$events.off('on-subtask-deleted')
|
this.$events.off('on-subtask-deleted')
|
||||||
this.$events.off('on-blocker-edited')
|
this.$events.off('on-blocker-edited')
|
||||||
this.$events.off('on-blocker-deleted')
|
this.$events.off('on-blocker-deleted')
|
||||||
|
|
||||||
this.$refs.page?.querySelector('.vuecal__bg')?.removeEventListener('scroll', this.handleScroll)
|
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@@ -182,17 +176,8 @@ export default {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$toast.error('Nepodarilo sa nacitat data!')
|
this.$toast.error('Nepodarilo sa nacitat data!')
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
handleScroll(e) {
|
this._initScrollListener()
|
||||||
if (this.previousScrollTop > e.target.scrollTop)
|
|
||||||
this.headerMarginTop = '0px'
|
|
||||||
else
|
|
||||||
this.headerMarginTop = `-${this.$refs.filter.$el.offsetHeight}px`
|
|
||||||
|
|
||||||
console.log(this.headerMarginTop)
|
|
||||||
|
|
||||||
this.previousScrollTop = e.target.scrollTop
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div ref="page">
|
||||||
<A-team-filter v-if="$store.getters['tm/isInitialized']" :split-days="calendarData ? splitDays : null" @filter-changed="onFilterChanged" />
|
<A-team-filter v-if="$store.getters['tm/isInitialized']" :split-days="calendarData ? splitDays : null" @filter-changed="onFilterChanged" />
|
||||||
<Z-timeline v-if="calendarData" :cal-data="calendarData" :cal-config="calendarConfig" :splits="splitDays" />
|
<Z-timeline v-if="calendarData" :cal-data="calendarData" :cal-config="calendarConfig" :splits="splitDays" />
|
||||||
</div>
|
</div>
|
||||||
@@ -10,10 +10,11 @@ import ATeamFilter from './_components/a-team-filter.vue'
|
|||||||
import ZTimeline from '@/plugins/tm@dashboard/_components/z-timeline.vue'
|
import ZTimeline from '@/plugins/tm@dashboard/_components/z-timeline.vue'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
import TeamsCalendar from './_mixins/TeamsCalendar.mixin'
|
import TeamsCalendar from './_mixins/TeamsCalendar.mixin'
|
||||||
|
import FilterMixin from '../_mixins/Filter.mixin'
|
||||||
import { mapGetters } from 'vuex'
|
import { mapGetters } from 'vuex'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
mixins: [TeamsCalendar],
|
mixins: [TeamsCalendar, FilterMixin],
|
||||||
|
|
||||||
components: {
|
components: {
|
||||||
ATeamFilter,
|
ATeamFilter,
|
||||||
@@ -80,6 +81,8 @@ export default {
|
|||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.$toast.error('Nepodarilo sa nacitat data!')
|
this.$toast.error('Nepodarilo sa nacitat data!')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._initScrollListener()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user