mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-11-30 01:42:29 +03:00
5f7bd12eec
no issue - returns the promise/result from `loadNextPage` so that it's return value can be utilised in closure actions - sets the `isLoading` property in `loadFirstPage` to match `loadNextPage` behaviour - reset the `isLoading` property even if the request fails - adds a `didReceivePaginationMeta` hook so that consumers of the mixin can use the metadata values without having to rely on observers - eg. pulling the `total` into a separate property that can be manipulated when items are added/removed but still reset to the sever's total value the next time a page is loaded - renames the `pagination-route` mixin to simply `pagination` as it's not tied to routes and works equally well in other objects that need to paginate an API resource
116 lines
3.4 KiB
JavaScript
116 lines
3.4 KiB
JavaScript
import Ember from 'ember';
|
|
import getRequestErrorMessage from 'ghost/utils/ajax';
|
|
|
|
const {
|
|
Mixin,
|
|
computed,
|
|
inject: {service}
|
|
} = Ember;
|
|
|
|
let defaultPaginationSettings = {
|
|
page: 1,
|
|
limit: 15
|
|
};
|
|
|
|
export default Mixin.create({
|
|
notifications: service(),
|
|
|
|
paginationModel: null,
|
|
paginationSettings: null,
|
|
|
|
// add a hook so that routes/controllers can do something with the meta data
|
|
paginationMeta: computed({
|
|
get() {
|
|
return this._paginationMeta;
|
|
},
|
|
set(key, value) {
|
|
if (this.didReceivePaginationMeta) {
|
|
this.didReceivePaginationMeta(value);
|
|
}
|
|
this._paginationMeta = value;
|
|
return value;
|
|
}
|
|
}),
|
|
|
|
init() {
|
|
let paginationSettings = this.get('paginationSettings');
|
|
let settings = Ember.$.extend({}, defaultPaginationSettings, paginationSettings);
|
|
|
|
this._super(...arguments);
|
|
this.set('paginationSettings', settings);
|
|
this.set('paginationMeta', {});
|
|
},
|
|
|
|
/**
|
|
* Takes an ajax response, concatenates any error messages, then generates an error notification.
|
|
* @param {jqXHR} response The jQuery ajax reponse object.
|
|
* @return
|
|
*/
|
|
reportLoadError(response) {
|
|
let message = 'A problem was encountered while loading more records';
|
|
|
|
if (response) {
|
|
// Get message from response
|
|
message += `: ${getRequestErrorMessage(response, true)}`;
|
|
} else {
|
|
message += '.';
|
|
}
|
|
|
|
this.get('notifications').showAlert(message, {type: 'error', key: 'pagination.load.failed'});
|
|
},
|
|
|
|
loadFirstPage() {
|
|
let paginationSettings = this.get('paginationSettings');
|
|
let modelName = this.get('paginationModel');
|
|
|
|
paginationSettings.page = 1;
|
|
|
|
this.set('isLoading', true);
|
|
|
|
return this.get('store').query(modelName, paginationSettings).then((results) => {
|
|
this.set('paginationMeta', results.meta);
|
|
return results;
|
|
}).catch((response) => {
|
|
this.reportLoadError(response);
|
|
}).finally(() => {
|
|
this.set('isLoading', false);
|
|
});
|
|
},
|
|
|
|
actions: {
|
|
loadFirstPage() {
|
|
return this.loadFirstPage();
|
|
},
|
|
|
|
/**
|
|
* Loads the next paginated page of posts into the ember-data store. Will cause the posts list UI to update.
|
|
* @return
|
|
*/
|
|
loadNextPage() {
|
|
let store = this.get('store');
|
|
let modelName = this.get('paginationModel');
|
|
let metadata = this.get('paginationMeta');
|
|
let nextPage = metadata.pagination && metadata.pagination.next;
|
|
let paginationSettings = this.get('paginationSettings');
|
|
|
|
if (nextPage) {
|
|
this.set('isLoading', true);
|
|
this.set('paginationSettings.page', nextPage);
|
|
|
|
return store.query(modelName, paginationSettings).then((results) => {
|
|
this.set('paginationMeta', results.meta);
|
|
return results;
|
|
}).catch((response) => {
|
|
this.reportLoadError(response);
|
|
}).finally(() => {
|
|
this.set('isLoading', false);
|
|
});
|
|
}
|
|
},
|
|
|
|
resetPagination() {
|
|
this.set('paginationSettings.page', 1);
|
|
}
|
|
}
|
|
});
|