|
@@ -1,5 +1,5 @@
|
|
|
<template>
|
|
|
- <MainContentLayout id="edition">
|
|
|
+ <MainContentLayout id="edition" :reftoscrollto="reftoscrollto" @onCenterScrolled="onCenterScrolled">
|
|
|
<template v-if="!content" #header>
|
|
|
<span>Loading ...</span>
|
|
|
</template>
|
|
@@ -32,21 +32,32 @@
|
|
|
<!-- default slot -->
|
|
|
<div id="text">
|
|
|
<template v-if="texts.length">
|
|
|
- <infinite-loading direction="top" @infinite="prevText" />
|
|
|
+ <infinite-loading
|
|
|
+ v-if="center_scrolled"
|
|
|
+ :identifier="textid"
|
|
|
+ direction="top"
|
|
|
+ :distance="inifinite_load_distance"
|
|
|
+ @infinite="prevText"
|
|
|
+ />
|
|
|
<EdText
|
|
|
v-for="text in texts"
|
|
|
+ :ref="text.content.uuid"
|
|
|
:key="text.content.uuid"
|
|
|
:tei="text.content.tei"
|
|
|
:uuid="text.content.uuid"
|
|
|
+ :textid="textid"
|
|
|
@onHoverLink="onHoverLink"
|
|
|
@onLeaveLink="onLeaveLink"
|
|
|
/>
|
|
|
- <infinite-loading @infinite="nextText" />
|
|
|
+ <infinite-loading
|
|
|
+ :identifier="textid"
|
|
|
+ @infinite="nextText"
|
|
|
+ />
|
|
|
</template>
|
|
|
</div>
|
|
|
|
|
|
<template #nav>
|
|
|
- <EdToc :toc="toc" />
|
|
|
+ <EdToc :toc="toc" :loadedtextsuuids="textsuuids" @onClickTocItem="onClickTocItem" />
|
|
|
</template>
|
|
|
</MainContentLayout>
|
|
|
</template>
|
|
@@ -79,13 +90,19 @@ export default {
|
|
|
editionid: null,
|
|
|
textid: null,
|
|
|
texts: [],
|
|
|
+ textsuuids: [],
|
|
|
metainfotitle: undefined,
|
|
|
title: undefined,
|
|
|
author: undefined,
|
|
|
texttitle: undefined,
|
|
|
//
|
|
|
indexitem: null,
|
|
|
- tooltip_top: null
|
|
|
+ tooltip_top: null,
|
|
|
+ //
|
|
|
+ next_loaded: false,
|
|
|
+ center_scrolled: false,
|
|
|
+ inifinite_load_distance: 10,
|
|
|
+ reftoscrollto: null
|
|
|
}),
|
|
|
computed: {
|
|
|
...mapState({
|
|
@@ -97,6 +114,7 @@ export default {
|
|
|
textid: function (newid, oldid) {
|
|
|
console.log('textid watcher', this, oldid, newid)
|
|
|
this.texts = []
|
|
|
+ this.textsuuids = []
|
|
|
this.getTextContent(newid)
|
|
|
},
|
|
|
textdata: function (newtxtdata, oldtxtdata) {
|
|
@@ -181,11 +199,14 @@ export default {
|
|
|
console.log('text REST: data', data)
|
|
|
if (direction === 'next') {
|
|
|
this.texts.push(data)
|
|
|
+ this.textsuuids.push(data.content.uuid)
|
|
|
} else {
|
|
|
this.texts.unshift(data)
|
|
|
+ this.textsuuids.unshift(data.content.uuid)
|
|
|
}
|
|
|
if ($state) {
|
|
|
$state.loaded()
|
|
|
+ this.next_loaded = true
|
|
|
}
|
|
|
})
|
|
|
.catch((error) => {
|
|
@@ -193,6 +214,13 @@ export default {
|
|
|
Promise.reject(error)
|
|
|
})
|
|
|
},
|
|
|
+ onCenterScrolled (e) {
|
|
|
+ // console.log('Edition centerScrolled(e)', e.target.scrollTop)
|
|
|
+ if (!this.center_scrolled && e.target.scrollTop > this.inifinite_load_distance * 1.5) {
|
|
|
+ this.center_scrolled = true
|
|
|
+ }
|
|
|
+ this.indexitem = null
|
|
|
+ },
|
|
|
nextText ($state) {
|
|
|
console.log('infinite loading nextText()', this.texts[this.texts.length - 1].content.itemAfterUuid, $state)
|
|
|
if (this.texts[this.texts.length - 1].content.itemAfterUuid) {
|
|
@@ -223,17 +251,36 @@ export default {
|
|
|
REST.get(`/index${item.index.charAt(0).toUpperCase()}${item.index.slice(1)}/${item.uuid}`, {})
|
|
|
.then(({ data }) => {
|
|
|
console.log('index tooltip REST: data', data)
|
|
|
- this.indexitem = data.content
|
|
|
+ if (this.indexitem === 'loading') {
|
|
|
+ this.indexitem = data.content
|
|
|
+ }
|
|
|
})
|
|
|
.catch((error) => {
|
|
|
console.warn('Issue with index tooltip rest', error)
|
|
|
Promise.reject(error)
|
|
|
this.indexitem = null
|
|
|
})
|
|
|
+ },
|
|
|
+ onClickTocItem (uuid) {
|
|
|
+ console.log('Edition onClickTocItem', uuid, this.$refs)
|
|
|
+ if (this.textsuuids.indexOf(uuid) !== -1) {
|
|
|
+ // if already loaded, scroll to uuid
|
|
|
+ this.reftoscrollto = `.tei[data-uuid="${uuid}"]`
|
|
|
+ } else {
|
|
|
+ // if not already loaded, change route
|
|
|
+ this.$router.push({
|
|
|
+ name: `editiontext`,
|
|
|
+ params: {
|
|
|
+ id: this.editionid,
|
|
|
+ textid: uuid
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
+
|
|
|
</style>
|