Skip to content

Commit 15b9359

Browse files
authored
Merge pull request #162 from openmcac/post_pagination
Post pagination
2 parents a08d8eb + 7c651bc commit 15b9359

File tree

8 files changed

+70
-7
lines changed

8 files changed

+70
-7
lines changed

app/controllers/group/index.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import Ember from 'ember';
2+
import Pagination from 'ember-cli-jsonapi-pagination/mixins/controllers/jsonapi-pagination';
3+
4+
export default Ember.Controller.extend(Pagination, {
5+
totalPages: Ember.computed('size', 'number', 'model.posts.[]', function() {
6+
const pageParam =
7+
getParameterByName("page[number]", this.get("posts.links.last"));
8+
return parseInt(pageParam || 0);
9+
})
10+
});
11+
12+
function getParameterByName(name, url) {
13+
name = encodeURIComponent(name);
14+
const regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)");
15+
const results = regex.exec(url);
16+
17+
if (results && results[2]) {
18+
return decodeURIComponent(results[2].replace(/\+/g, " "));
19+
}
20+
}

app/routes/group/index.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import Ember from 'ember';
2+
import Pagination from 'ember-cli-jsonapi-pagination/mixins/routes/jsonapi-pagination';
23

34
const KIND_POST = 0;
45

5-
export default Ember.Route.extend({
6-
model() {
6+
export default Ember.Route.extend(Pagination, {
7+
model(params) {
78
const group = this.modelFor("group");
89

910
const filter = {
1011
group: group.get("id"),
1112
kind: KIND_POST
1213
};
1314

14-
const posts = this.store.query("post", {
15+
const posts = this.queryPaginated("post", {
1516
filter: filter,
16-
page: { size: 5 },
17+
size: params.size,
18+
number: params.number,
1719
sort: "-published_at"
1820
});
1921

app/templates/group/index.hbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
{{post-view post=post snippets=true}}
1111
</div>
1212
{{/each}}
13+
{{paginate-collection totalPages=totalPages currentPage=number setCurrentPage=(action "setCurrentPage")}}
1314
</div>
1415
</section>
1516
{{/if}}

mirage/config.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,18 @@ export default function() {
5252

5353
this.get("/posts", function(schema, request) {
5454
const groupId = request.queryParams["filter[group]"];
55+
const pageSize = parseInt(request.queryParams["page[size]"]);
56+
const pageNumber = parseInt(request.queryParams["page[number]"]);
5557

5658
if (groupId) {
5759
const group = schema.groups.find(groupId);
58-
return group.posts;
60+
const postIds = group.posts.models.map(model => model.id);
61+
const offset = (pageNumber - 1) * pageSize;
62+
const lastPage = Math.ceil(group.posts.models.length / pageSize);
63+
64+
let json = this.serialize(schema.posts.find(postIds.slice(offset, offset + pageSize)));
65+
json.links = { "last": `http://example.com/api/v1/posts?page%5Bnumber%5D=${lastPage}` };
66+
return json;
5967
}
6068

6169
return schema.posts.all();

mirage/scenarios/default.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default function(server) {
2121
server.createList("announcement", 5, { bulletin });
2222
}
2323

24-
server.createList("post", 10, { group: englishService });
24+
server.createList("post", 40, { group: englishService });
2525

2626
server.create("user", { email: "[email protected]", name: "Test User" });
2727
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"ember-cli-htmlbars": "^1.0.11",
4141
"ember-cli-htmlbars-inline-precompile": "^0.3.1",
4242
"ember-cli-inject-live-reload": "^1.3.1",
43+
"ember-cli-jsonapi-pagination": "0.0.2",
4344
"ember-cli-mirage": "^0.2.0",
4445
"ember-cli-moment-shim": "1.0.0",
4546
"ember-cli-page-object": "^1.1.0",

tests/acceptance/group/index-test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ test("handles groups that do not exist", function(assert) {
2525

2626
test("renders appropriate group details", function(assert) {
2727
const group = server.create("group", { slug: "random" });
28-
const posts = server.createList("post", 3, { group });
28+
const posts = server.createList("post", 15, { group });
29+
server.createList("post", 5, { group });
2930

3031
page.visit({ slug: group.slug });
3132

@@ -36,6 +37,7 @@ test("renders appropriate group details", function(assert) {
3637
assert.equal(page.bannerUrl(), `https://res.cloudinary.com/${ENV['CLOUDINARY_CLOUD_NAME']}/image/fetch/w_1920/${group.bannerUrl}`);
3738
assert.equal(page.profilePictureUrl(), `https://res.cloudinary.com/${ENV['CLOUDINARY_CLOUD_NAME']}/image/fetch/w_200/${group.profilePictureUrl}`);
3839

40+
assert.equal(page.posts().count, 15);
3941
posts.forEach(function(post, i) {
4042
assert.equal(page.posts(i).title, posts[i].title);
4143
});
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { moduleFor, test } from 'ember-qunit';
2+
3+
moduleFor('controller:group/index', 'Unit | Controller | group/index', {
4+
needs: ['service:metrics', 'service:router-scroll']
5+
});
6+
7+
test('totalPages: Fetches the total pages from metadata', function(assert) {
8+
const model = {
9+
posts: {
10+
links: { last: "https://mcac.church/api/v1/posts?page%5Bnumber%5D=4" }
11+
}
12+
};
13+
14+
const controller = this.subject(model);
15+
16+
assert.equal(controller.get("totalPages"), 4);
17+
});
18+
19+
test('totalPages: Returns 0 when URL has no page number', function(assert) {
20+
const model = {
21+
posts: {
22+
links: { last: "https://mcac.church/api/v1/posts" }
23+
}
24+
};
25+
26+
const controller = this.subject(model);
27+
28+
assert.equal(controller.get("totalPages"), 0);
29+
});

0 commit comments

Comments
 (0)