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(), + "
  1. item1
  2. item2
  3. item3
  4. item5
" + ); + + t.is( + (await pages[1].template.render(pages[1].data)).trim(), + "
  1. item6
  2. item7
  3. item8
  4. 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(), + "
  1. item1
  2. item2
  3. item3
  4. item5
" + ); + + t.is( + (await pages[1].template.render(pages[1].data)).trim(), + "
  1. item6
  2. item7
  3. item8
  4. 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 %}
  1. {{ item }}
  2. {% 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 %}
  1. {{ item }}
  2. {% 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 %}
  1. {{ item }}
  2. {% 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 %}
  1. {{ item }}
  2. {% 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 %}
  1. {{ item }}
  2. {% endfor %}