diff --git a/src/Plugins/Pagination.js b/src/Plugins/Pagination.js
index 82b27d69a..4d98d94b2 100755
--- a/src/Plugins/Pagination.js
+++ b/src/Plugins/Pagination.js
@@ -98,17 +98,39 @@ class Pagination {
return false;
}
- isFiltered(value) {
+ isIncluded(value) {
+ const hasInclude = "include" in this.data.pagination;
+ const hasExclude = "exclude" in this.data.pagination;
+ if (hasInclude && hasExclude) {
+ throw new Error("Pagination cannot have both `include` and `exclude` properties.");
+ }
+ if (hasInclude) {
+ let included = this.data.pagination.include;
+ if (Array.isArray(included)) {
+ return included.includes(value);
+ }
+ return included === value;
+ }
+ if (hasExclude) {
+ let excluded = this.data.pagination.exclude;
+ if (Array.isArray(excluded)) {
+ return !excluded.includes(value);
+ }
+ return excluded !== value;
+ }
+
+ // Let's keep this code for backwards compatibility to V2.
+ // TODO remove in 3.0
if ("filter" in this.data.pagination) {
let filtered = this.data.pagination.filter;
if (Array.isArray(filtered)) {
- return filtered.indexOf(value) > -1;
+ return filtered.indexOf(value) === -1;
}
- return filtered === value;
+ return filtered !== value;
}
- return false;
+ return true;
}
_has(target, key) {
@@ -162,8 +184,12 @@ class Pagination {
result = result.reverse();
}
- if (this.data.pagination.filter) {
- result = result.filter((value) => !this.isFiltered(value));
+ if (
+ this.data.pagination.filter ||
+ this.data.pagination.include ||
+ this.data.pagination.exclude
+ ) {
+ result = result.filter((value) => this.isIncluded(value));
}
return result;
diff --git a/test/PaginationTest.js b/test/PaginationTest.js
index 15b6fb627..bfa83e466 100644
--- a/test/PaginationTest.js
+++ b/test/PaginationTest.js
@@ -498,6 +498,49 @@ test("Page over an object (use values)", async (t) => {
);
});
+test("Page over an object (excluded, array)", async (t) => {
+ let tmpl = await getNewTemplate(
+ "./test/stubs/paged/pagedobjectexcludearray.njk",
+ "./test/stubs/",
+ "./dist"
+ );
+
+ let data = await tmpl.getData();
+ let pages = await tmpl.getTemplates(data);
+
+ t.is(
+ (await pages[0].template.render(pages[0].data)).trim(),
+ "
- item1
- item2
- item3
- item5
"
+ );
+
+ t.is(
+ (await pages[1].template.render(pages[1].data)).trim(),
+ "- item6
- item7
- item8
- item9
"
+ );
+});
+
+test("Page over an object (excluded, string)", async (t) => {
+ let tmpl = await getNewTemplate(
+ "./test/stubs/paged/pagedobjectexcludestring.njk",
+ "./test/stubs/",
+ "./dist"
+ );
+
+ let data = await tmpl.getData();
+ let pages = await tmpl.getTemplates(data);
+ t.is(pages.length, 2);
+
+ t.is(
+ (await pages[0].template.render(pages[0].data)).trim(),
+ "- item1
- item2
- item3
- item5
"
+ );
+
+ t.is(
+ (await pages[1].template.render(pages[1].data)).trim(),
+ "- item6
- item7
- item8
- item9
"
+ );
+});
+
test("Page over an object (filtered, array)", async (t) => {
let tmpl = await getNewTemplate(
"./test/stubs/paged/pagedobjectfilterarray.njk",
diff --git a/test/stubs/paged/pagedobjectexcludearray.njk b/test/stubs/paged/pagedobjectexcludearray.njk
new file mode 100644
index 000000000..ac9702ce3
--- /dev/null
+++ b/test/stubs/paged/pagedobjectexcludearray.njk
@@ -0,0 +1,18 @@
+---
+pagination:
+ data: testdata
+ size: 4
+ exclude:
+ - item4
+testdata:
+ item1: itemvalue1
+ item2: itemvalue2
+ item3: itemvalue3
+ item4: itemvalue4
+ item5: itemvalue5
+ item6: itemvalue6
+ item7: itemvalue7
+ item8: itemvalue8
+ item9: itemvalue9
+---
+{% for item in pagination.items %}- {{ item }}
{% endfor %}
diff --git a/test/stubs/paged/pagedobjectexcludestring.njk b/test/stubs/paged/pagedobjectexcludestring.njk
new file mode 100644
index 000000000..6bdce1867
--- /dev/null
+++ b/test/stubs/paged/pagedobjectexcludestring.njk
@@ -0,0 +1,17 @@
+---
+pagination:
+ data: testdata
+ size: 4
+ exclude: item4
+testdata:
+ item1: itemvalue1
+ item2: itemvalue2
+ item3: itemvalue3
+ item4: itemvalue4
+ item5: itemvalue5
+ item6: itemvalue6
+ item7: itemvalue7
+ item8: itemvalue8
+ item9: itemvalue9
+---
+{% for item in pagination.items %}- {{ item }}
{% endfor %}
diff --git a/test/stubs/paged/pagedobjectincludearray.njk b/test/stubs/paged/pagedobjectincludearray.njk
new file mode 100644
index 000000000..e73336817
--- /dev/null
+++ b/test/stubs/paged/pagedobjectincludearray.njk
@@ -0,0 +1,19 @@
+---
+pagination:
+ data: testdata
+ size: 4
+ include:
+ - item3
+ - item4
+testdata:
+ item1: itemvalue1
+ item2: itemvalue2
+ item3: itemvalue3
+ item4: itemvalue4
+ item5: itemvalue5
+ item6: itemvalue6
+ item7: itemvalue7
+ item8: itemvalue8
+ item9: itemvalue9
+---
+{% for item in pagination.items %}- {{ item }}
{% endfor %}
diff --git a/test/stubs/paged/pagedobjectincludeexclude.njk b/test/stubs/paged/pagedobjectincludeexclude.njk
new file mode 100644
index 000000000..be877aba5
--- /dev/null
+++ b/test/stubs/paged/pagedobjectincludeexclude.njk
@@ -0,0 +1,18 @@
+---
+pagination:
+ data: testdata
+ size: 4
+ include: item4
+ exclude: item5
+testdata:
+ item1: itemvalue1
+ item2: itemvalue2
+ item3: itemvalue3
+ item4: itemvalue4
+ item5: itemvalue5
+ item6: itemvalue6
+ item7: itemvalue7
+ item8: itemvalue8
+ item9: itemvalue9
+---
+{% for item in pagination.items %}- {{ item }}
{% endfor %}
diff --git a/test/stubs/paged/pagedobjectincludestring.njk b/test/stubs/paged/pagedobjectincludestring.njk
new file mode 100644
index 000000000..029153899
--- /dev/null
+++ b/test/stubs/paged/pagedobjectincludestring.njk
@@ -0,0 +1,17 @@
+---
+pagination:
+ data: testdata
+ size: 4
+ include: item4
+testdata:
+ item1: itemvalue1
+ item2: itemvalue2
+ item3: itemvalue3
+ item4: itemvalue4
+ item5: itemvalue5
+ item6: itemvalue6
+ item7: itemvalue7
+ item8: itemvalue8
+ item9: itemvalue9
+---
+{% for item in pagination.items %}- {{ item }}
{% endfor %}