|
@@ -13,6 +13,7 @@
|
|
|
|
|
|
import { mapActions, mapState } from 'vuex'
|
|
|
import { Timeline } from 'vis-timeline'
|
|
|
+import moment from 'moment'
|
|
|
|
|
|
export default {
|
|
|
metaInfo: {
|
|
@@ -28,6 +29,7 @@ export default {
|
|
|
computed: {
|
|
|
...mapState({
|
|
|
titles: state => state.Corpus.titles,
|
|
|
+ titlesById: state => state.Corpus.titlesById,
|
|
|
editors: state => state.Corpus.editors
|
|
|
})
|
|
|
},
|
|
@@ -87,6 +89,7 @@ export default {
|
|
|
// stack: false
|
|
|
}
|
|
|
this.timeline = new Timeline(this.timelineContainer, this.titles, options)
|
|
|
+ // this.timeline.on('rangechanged', this.onRangeChanged.bind(this))
|
|
|
})
|
|
|
},
|
|
|
sockets: {
|
|
@@ -108,12 +111,101 @@ export default {
|
|
|
this.timeline.zoomIn(0.5)
|
|
|
break
|
|
|
}
|
|
|
+ },
|
|
|
+ scroll: function (data) {
|
|
|
+ console.log('received socket scroll', data)
|
|
|
+ // constant for day in milliseconds
|
|
|
+ let d = 1000 * 60 * 60 * 24
|
|
|
+ // get the current start and end dates of visible timeline
|
|
|
+ let startend = this.timeline.getWindow()
|
|
|
+ let start = moment.utc(new Date(startend.start))
|
|
|
+ let end = moment.utc(new Date(startend.end))
|
|
|
+ // compute the middle date of visible timeline
|
|
|
+ let diff = end - start
|
|
|
+ console.log('diff', diff / d)
|
|
|
+ let delta, unit
|
|
|
+ let newDate
|
|
|
+ // if zoom big enougth move by time range
|
|
|
+ let middleDate = moment.utc(new Date(startend.start)).add(diff / 2, 'ms')
|
|
|
+ // console.log('middleDate', middleDate)
|
|
|
+ let visibleItems = this.timeline.getVisibleItems()
|
|
|
+ console.log('visibleItems', visibleItems)
|
|
|
+ if (diff / d > 180) {
|
|
|
+ if (diff / d > 365) {
|
|
|
+ delta = 1
|
|
|
+ unit = 'y'
|
|
|
+ } else {
|
|
|
+ delta = 2
|
|
|
+ unit = 'M'
|
|
|
+ }
|
|
|
+ switch (data.mode) {
|
|
|
+ case 'forward':
|
|
|
+ newDate = moment(new Date(middleDate)).add(delta, unit)
|
|
|
+ break
|
|
|
+ case 'backward':
|
|
|
+ newDate = moment(new Date(middleDate)).subtract(delta, unit)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ } else if (visibleItems.length > 1) {
|
|
|
+ // else if visible items move by next or prev item
|
|
|
+ let item, itemStart, middleItemStart
|
|
|
+ let prevDate = moment.utc(start)
|
|
|
+ let nextDate = moment.utc(end)
|
|
|
+ // get the current middle item
|
|
|
+ for (let id of visibleItems) {
|
|
|
+ // console.log('id', id)
|
|
|
+ item = this.titlesById[id]
|
|
|
+ itemStart = moment.utc(item.start)
|
|
|
+ console.log('item', item.content, item.start)
|
|
|
+ if (!middleItemStart) {
|
|
|
+ middleItemStart = itemStart.clone()
|
|
|
+ } else if (Math.abs(middleItemStart.diff(middleDate)) > Math.abs(itemStart.diff(middleDate))) {
|
|
|
+ middleItemStart = itemStart.clone()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (let id of visibleItems) {
|
|
|
+ // console.log('id', id)
|
|
|
+ item = this.titlesById[id]
|
|
|
+ itemStart = moment.utc(item.start)
|
|
|
+ console.log('item', item.content, item.start)
|
|
|
+ if (itemStart.isAfter(prevDate) && itemStart.isBefore(middleItemStart)) {
|
|
|
+ prevDate = itemStart.clone()
|
|
|
+ } else if (itemStart.isAfter(middleItemStart) && itemStart.isBefore(nextDate)) {
|
|
|
+ nextDate = itemStart
|
|
|
+ }
|
|
|
+ }
|
|
|
+ console.log('middleDate', middleDate, 'nextDate', nextDate)
|
|
|
+ switch (data.mode) {
|
|
|
+ case 'forward':
|
|
|
+ newDate = moment(new Date(nextDate))
|
|
|
+ break
|
|
|
+ case 'backward':
|
|
|
+ newDate = moment(new Date(prevDate))
|
|
|
+ break
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // if no visible items jump to next year
|
|
|
+ let currentYear = middleDate.year()
|
|
|
+ switch (data.mode) {
|
|
|
+ case 'forward':
|
|
|
+ newDate = new Date(currentYear + 1, 0, 1)
|
|
|
+ break
|
|
|
+ case 'backward':
|
|
|
+ newDate = new Date(currentYear - 1, 0, 1)
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // eventually move the timeline
|
|
|
+ this.timeline.moveTo(newDate)
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
...mapActions({
|
|
|
getAllTitles: 'Corpus/getAllTitles'
|
|
|
- })
|
|
|
+ }),
|
|
|
+ onRangeChanged (args) {
|
|
|
+ console.log('onRangeChanged arg', args)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
</script>
|