-
Notifications
You must be signed in to change notification settings - Fork 0
/
vo-paginatie.js
146 lines (130 loc) · 4.09 KB
/
vo-paginatie.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import {LitElement, html} from './node_modules/vodomg-litelement/@polymer/lit-element/lit-element.js';
/**
* `vo-paginatie`
* De standaard paginatie component voor websites en applicaties van de Vlaamse overheid
*
* ### Events
*
* De volgende events zijn beschikbaar:
*
* Event | Uitleg | Detail object
* ------|--------|---------------
* `vo-paginatie-paginanummer-changed` | wordt afgevuurd wanneer er een nieuwe pagina moet worden opgehaald. | `paginanummer`
*
* @customElement
* @polymer
* @demo demo/vo-paginatie.html
*/
export class VoPaginatie extends LitElement {
static get EVENTS() {
return {
HAAL_PAGINA_OP: 'vo-paginatie-paginanummer-changed'
}
}
static get properties() {
return {
/**
* De huidige pagina die getoond wordt. Deze begint bij nul te tellen (0 -> eerste pagina)
*/
huidigePagina: {
type: Number,
attribute: 'huidige-pagina',
hasChanged(newValue, oldValue) {
return true;
}
},
/**
* Het totaal aantal paginas waarover gepagineerd kan worden.
*/
totaalAantalPaginas: {
type: Number,
attribute: 'totaal-aantal-paginas'
}
}
}
/**
* Rendert het element
* @return {TemplateResult}
*/
render() {
return html`
<button id="eerste" @click="${this._eerstePagina}" ?disabled="${this._isEerstePagina()}"><<</button>
<button id="vorige" @click="${this._vorige}" ?disabled="${this._isEerstePagina()}"><</button>
<span id="huidige_pagina">${this.huidigePagina+1}</span>/<span id="totaal_aantal_paginas">${this.totaalAantalPaginas}</span>
<button id="volgende" @click="${this._volgende}" ?disabled="${this._isLaatstePagina()}">></button>
<button id="laatste" @click="${this._laatstePagina}" ?disabled="${this._isLaatstePagina()}">>></button>
`;
}
/**
* Wordt gebruikt om naar de vorige pagina te navigeren.
* @return {void}
*/
_vorige () {
if (this.huidigePagina > 0) {
this.huidigePagina--;
this._dispatchHaalPaginaOpEvent(this.huidigePagina);
}
}
/**
* Wordt gebruikt om naar de volgende pagina te navigeren.
* @return {void}
*/
_volgende() {
if (this.huidigePagina < this.totaalAantalPaginas - 1) {
this.huidigePagina++;
this._dispatchHaalPaginaOpEvent(this.huidigePagina);
}
}
/**
* Dispatcht een VoPaginatie event
*
* @return {void}
*/
_dispatchHaalPaginaOpEvent(paginaNummer) {
this.dispatchEvent(new CustomEvent(VoPaginatie.EVENTS.HAAL_PAGINA_OP, {detail: paginaNummer, bubbles: true, composed: true}));
}
/**
* checkt of de huidige getoonde pagina de eerste pagina is.
*
* @return {boolean}
*/
_isEerstePagina() {
return this.huidigePagina == 0;
}
/**
* checkt of de huidige getoonde pagina de laatste pagina is.
*
* @return {boolean}
*/
_isLaatstePagina() {
return this.huidigePagina == this.totaalAantalPaginas - 1;
}
/**
* Zet de huidige pagina gelijk aan de eerst pagina en stuurt een event om die op te halen
*
* @return {void}
*/
_eerstePagina() {
this._setHuidigePagina(0);
this._dispatchHaalPaginaOpEvent(0);
}
/**
* Zet huidige pagina gelijk aan de laastste pagina en stuurt een event om die op te halen
*
* @return {void}
*/
_laatstePagina() {
let laatstePaginaNummer = this.totaalAantalPaginas - 1;
this._setHuidigePagina(laatstePaginaNummer);
this._dispatchHaalPaginaOpEvent(laatstePaginaNummer);
}
/**
* Zet de huidige pagina gelijk aan een waarde
* @param {*} value
* @return {void}
*/
_setHuidigePagina(value) {
this.huidigePagina = value;
}
}
customElements.define('vo-paginatie', VoPaginatie);