pagination navigation is working

This commit is contained in:
2020-07-19 13:00:46 +02:00
parent e32b0d1281
commit 9744b4695d
3 changed files with 171 additions and 54 deletions
+63 -47
View File
@@ -342,8 +342,14 @@ section[role="main-content"]{
} }
>nav{ >nav{
>section{ padding-bottom: 0;
padding:0 0 0 1.5em; $pager_h:2em;
section#toc{
box-sizing: content-box;
padding:0 0 1em 1.5em;
height:calc(100% - #{$pager_h});
overflow-x: hidden;
overflow-y: auto;
>ul{ >ul{
ul{ ul{
li{ li{
@@ -396,7 +402,17 @@ section[role="main-content"]{
span.toc-title{font-size: 0.882em;} span.toc-title{font-size: 0.882em;}
} }
} }
div#page-nav{
height:$pager_h;
overflow: hidden;
box-sizing: content-box;
padding:0 1.5em;
select{
option{
padding:0;
}
}
}
} }
} }
@@ -683,62 +699,62 @@ footer[role="tools"]{
text-transform: uppercase; text-transform: uppercase;
padding:0; padding:0;
} }
.v-select{
}
.v-select{
padding:0;
div[role="combobox"]{
background-color: #fff;
padding:0; padding:0;
div[role="combobox"]{ border-radius: 2px;
background-color: #fff; border: none;
padding:0; }
border-radius: 2px; input[type="search"]{
border: none; margin:0;
padding:0;
}
.vs__search{
&, &:focus{
font-size: 0.756em;
line-height: 1;
height:1.2em;
border:none;
box-sizing: border-box;
} }
input[type="search"]{ }
margin:0; .vs__actions{
padding:0; padding:1px 3px;
} svg[role="presentation"]{
.vs__search{ transform: scale(0.8);
&, &:focus{ path{
font-size: 0.756em; fill: $bleuroi;
line-height: 1;
height:1.2em;
border:none;
box-sizing: border-box;
} }
} }
.vs__actions{ }
padding:1px 3px; .vs__selected{
svg[role="presentation"]{ margin:0;
padding:0;
line-height:1;
font-size: 0.756em;
}
// border-radius: 2px;
// border: none;
}
.v-select{
.vs__selected{
background-color: #fff;
border:none;
padding:0.3em 0.5em;
button{
svg{
transform: scale(0.8); transform: scale(0.8);
path{ path{
fill: $bleuroi; fill: $bleuroi;
} }
} }
} }
.vs__selected{
margin:0;
padding:0;
line-height:1;
font-size: 0.756em;
}
// border-radius: 2px;
// border: none;
}
fieldset.filters .v-select{
.vs__selected{
background-color: #fff;
border:none;
padding:0.3em 0.5em;
button{
svg{
transform: scale(0.8);
path{
fill: $bleuroi;
}
}
}
}
} }
} }
// vue-select // vue-select
ul[role="listbox"]{ ul[role="listbox"]{
@include fontsans; @include fontsans;
+10 -4
View File
@@ -11,7 +11,8 @@ export default {
}, },
data: () => ({ data: () => ({
template: null, template: null,
html: null html: null,
pages: []
}), }),
watch: { watch: {
tei: function (newtei, oldtei) { tei: function (newtei, oldtei) {
@@ -26,6 +27,9 @@ export default {
this.buildTemplate() this.buildTemplate()
} }
}, },
mounted () {
this.$emit('onNewPageBreaks', this.pages)
},
methods: { methods: {
buildTemplate () { buildTemplate () {
// console.log('EdText buildTemplate: tei', this.tei) // console.log('EdText buildTemplate: tei', this.tei)
@@ -85,7 +89,7 @@ export default {
}, },
parsePageBreaks () { parsePageBreaks () {
let pbs = this.html.match(/<span role="pageBreak"[^>]+><\/span>/g) let pbs = this.html.match(/<span role="pageBreak"[^>]+><\/span>/g)
console.log('pagebreaks', pbs) // console.log('pagebreaks', pbs)
if (pbs) { if (pbs) {
let pbparts, newpb, num let pbparts, newpb, num
for (var i = 0; i < pbs.length; i++) { for (var i = 0; i < pbs.length; i++) {
@@ -93,14 +97,16 @@ export default {
if (!pbparts) { if (!pbparts) {
console.warn(`pageBreak ${i} maformed`, pbs[i]) console.warn(`pageBreak ${i} maformed`, pbs[i])
} else { } else {
console.log('pbparts', pbparts) // console.log('pbparts', pbparts)
num = pbparts[1] num = pbparts[1]
this.pages.push(num)
newpb = `<span` + newpb = `<span` +
// ` id="page-break-${num}"` +
` role="pageBreak"` + ` role="pageBreak"` +
` data-num="${num}"` + ` data-num="${num}"` +
` data-num-prev="${num - 1}"` + ` data-num-prev="${num - 1}"` +
` />` ` />`
console.log('newpb', newpb) // console.log('newpb', newpb)
this.html = this.html.replace(pbs[i], newpb) this.html = this.html.replace(pbs[i], newpb)
} }
} }
+98 -3
View File
@@ -48,6 +48,7 @@
:textid="textid" :textid="textid"
@onHoverLink="onHoverLink" @onHoverLink="onHoverLink"
@onLeaveLink="onLeaveLink" @onLeaveLink="onLeaveLink"
@onNewPageBreaks="onNewPageBreaks"
/> />
<infinite-loading <infinite-loading
:identifier="textid" :identifier="textid"
@@ -57,16 +58,34 @@
</div> </div>
<template #nav> <template #nav>
<EdToc :toc="toc" :loadedtextsuuids="textsuuids" @onClickTocItem="onClickTocItem" /> <EdToc id="toc" :toc="toc" :loadedtextsuuids="textsuuids" @onClickTocItem="onClickTocItem" />
<div v-if="pages.length" id="page-nav">
<!-- <select class="" name="page-nav" v-model="page_selected" placeholder="Pages">
<option value="" disabled selected>Pages</option>
<option v-for="(page, index) in pages" :key="index" :value="page">{{ page }}</option>
</select> -->
<v-select
id="page-nav-select"
type="select"
placeholder="Aller à la page ..."
append-to-body
:calculate-position="dropDownMenuPos"
:options="pages"
:clearable="false"
:value="page_selected"
@input="onPageSelected"
/>
</div>
</template> </template>
</MainContentLayout> </MainContentLayout>
</template> </template>
<script> <script>
import { createPopper } from '@popperjs/core'
import { REST } from 'api/rest-axios' import { REST } from 'api/rest-axios'
import { mapState, mapActions } from 'vuex' import { mapState, mapActions } from 'vuex'
import MainContentLayout from '../components/Layouts/MainContentLayout' import MainContentLayout from '../components/Layouts/MainContentLayout'
import EdText from '../components/Content/EdText' import EdText from '../components/Content/EdText'
import EdToc from '../components/Content/EdToc' import EdToc from '../components/Content/EdToc'
@@ -102,7 +121,11 @@ export default {
next_loaded: false, next_loaded: false,
center_scrolled: false, center_scrolled: false,
inifinite_load_distance: 10, inifinite_load_distance: 10,
reftoscrollto: null reftoscrollto: null,
//
pages: [],
pagesOptions: [],
page_selected: ''
}), }),
computed: { computed: {
...mapState({ ...mapState({
@@ -115,11 +138,17 @@ export default {
console.log('textid watcher', this, oldid, newid) console.log('textid watcher', this, oldid, newid)
this.texts = [] this.texts = []
this.textsuuids = [] this.textsuuids = []
this.pages = []
this.pagesOtpions = []
this.getTextContent(newid) this.getTextContent(newid)
}, },
textdata: function (newtxtdata, oldtxtdata) { textdata: function (newtxtdata, oldtxtdata) {
console.log('textdata watcher', oldtxtdata, newtxtdata) console.log('textdata watcher', oldtxtdata, newtxtdata)
this.metainfotitle = `${this.title} ${newtxtdata.meta.title}` this.metainfotitle = `${this.title} ${newtxtdata.meta.title}`
},
page_selected: function (newp, oldp) {
console.log('page_selected watcher', oldp, newp)
this.scrollToPage(newp)
} }
}, },
beforeCreate () { beforeCreate () {
@@ -276,6 +305,72 @@ export default {
} }
}) })
} }
},
onNewPageBreaks (p) {
// console.log('onNewPageBreaks', p)
for (var i = 0; i < p.length; i++) {
if (this.pages.indexOf(p[i]) === -1) {
this.pages.push(p[i])
}
}
// reorder array
this.pages.sort((a, b) => a - b)
// this.pagesOptions = []
// for (var j = 0; j < this.pages.length; j++) {
// this.pagesOptions.push({ code: this.pages[j], label: `page ${this.pages[j]}` })
// }
},
dropDownMenuPos (dropdownList, component, { width }) {
/**
* We need to explicitly define the dropdown width since
* it is usually inherited from the parent with CSS.
*/
dropdownList.style.width = width
/**
* Here we position the dropdownList relative to the $refs.toggle Element.
*
* The 'offset' modifier aligns the dropdown so that the $refs.toggle and
* the dropdownList overlap by 1 pixel.
*
* The 'toggleClass' modifier adds a 'drop-up' class to the Vue Select
* wrapper so that we can set some styles for when the dropdown is placed
* above.
*/
const popper = createPopper(component.$refs.toggle, dropdownList, {
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [0, -1]
}
},
{
name: 'toggleClass',
enabled: true,
phase: 'write',
fn ({ state }) {
component.$el.classList.toggle('drop-up', state.placement === 'top')
}
}]
})
/**
* To prevent memory leaks Popper needs to be destroyed.
* If you return function, it will be called just before dropdown is removed from DOM.
*/
return () => popper.destroy()
},
onPageSelected (e) {
console.log('onPageSelected', e)
this.page_selected = e
this.scrollToPage(e)
// this.scrollToPage(e.code)
},
scrollToPage (p) {
// console.log('scrollToPage', p)
this.reftoscrollto = `span[role="pageBreak"][data-num="${p}"]`
} }
} }
} }