diff --git a/CHANGELOG.md b/CHANGELOG.md index 023a6b7b6..f7255ea0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,32 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - file-widget, a file browser widget for quick files - humanFileSize, converting size number to a readable version like 5kB - toastr as an npm dependency +- `action` model/adapter/serializer + - New model in OSF API corresponding to a user-triggered state transition of an object +- fields on `preprint-provider` model: + - `permissions` + - `reviewsWorkflow` + - `reviewsCommentsPrivate` + - `reviewsCommentsAnonymous` +- properties on `preprint-provider` model: + - `reviewableStatusCounts` +- fields on `preprint` model + - `reviewsState` + - `dateLastTransitioned` + - `actions` + - `contributors` +- properties on `preprint` model + - `uniqueSubjects` + - `articleDoiUrl` + - `preprintDoiUrl` + - `licenseText` +- fields on `user` model: + - `canViewReviews` + - `actions` +- `user` property on `currentUser` service + - Returns a promise proxy object that resolves to the logged-in user or to `null` if no user is logged in +- `loadRelation` function in `utils/load-relationship` + - Like `loadAll`, but returns a promise proxy that resolves to the full array once the relationship is completely fetched ### Changed - Use delete link for delete url, if present @@ -24,6 +50,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - 'Search' button in navbar to link to search page - Moved ember-metrics and ember-toastr to dependencies - Upgraded ember-toastr to 1.7.0 +- Consolidate logic for serializing dirty relationships into `osf-serializer` + - Override `relationshipTypes` in a serializer to include `fieldName: 'apiType'` pairs of all relationships which may be included when saving updates ### Removed - toastr from bower dependencies diff --git a/addon/adapters/action.js b/addon/adapters/action.js new file mode 100644 index 000000000..f9d075992 --- /dev/null +++ b/addon/adapters/action.js @@ -0,0 +1,3 @@ +import OsfAdapter from './osf-adapter'; + +export default OsfAdapter.extend({}); diff --git a/addon/adapters/osf-adapter.js b/addon/adapters/osf-adapter.js index 1af477bb4..7675025b5 100644 --- a/addon/adapters/osf-adapter.js +++ b/addon/adapters/osf-adapter.js @@ -37,13 +37,13 @@ export default DS.JSONAPIAdapter.extend(HasManyQuery.RESTAdapterMixin, GenericDa * * @method buildQuery */ - buildQuery() { + buildQuery(snapshot) { let query = this._super(...arguments); if (query.include) { query.embed = query.include; } delete query.include; - return query; + return Ember.merge(query, Ember.getWithDefault(snapshot, 'adapterOptions.query', {})); }, buildURL(modelName, id, snapshot, requestType) { var url = this._super(...arguments); diff --git a/addon/authenticators/osf-cookie.js b/addon/authenticators/osf-cookie.js index ecacbd242..e0a5b9530 100644 --- a/addon/authenticators/osf-cookie.js +++ b/addon/authenticators/osf-cookie.js @@ -20,7 +20,8 @@ import { authenticatedAJAX } from 'ember-osf/utils/ajax-helpers'; */ export default Base.extend({ // HACK: Lets us clear session manually, rather than after .invalidate method resolves - session: Ember.inject.service('session'), + store: Ember.inject.service(), + session: Ember.inject.service(), _test() { return authenticatedAJAX({ @@ -31,7 +32,11 @@ export default Base.extend({ xhrFields: { withCredentials: true } - }).then(function(res) { + }).then(res => { + // Push the result into the store for later use by the current-user service + // Note: we have to deepcopy res because pushPayload mutates our data + // and causes an infinite loop because reasons + this.get('store').pushPayload(Ember.copy(res, true)); return res.data; }); }, @@ -64,11 +69,10 @@ export default Base.extend({ * @return {Promise} */ authenticate(code) { - let jqDeferred = this._test(code); - return new Ember.RSVP.Promise((resolve, reject) => { - // TODO: Improve param capture - jqDeferred.done((value) => resolve(value)); - jqDeferred.fail((reason) => reject(reason)); - }); + // NOTE: Must be wrapped in an RSVP promise + // _test returns a Jquery Promise but authenticate expects an RSVP Promise + return new Ember.RSVP.Promise((resolve, reject) => + this._test(code).then(resolve).fail(reject) + ); } }); diff --git a/addon/components/citation-widget/component.js b/addon/components/citation-widget/component.js index 2c76c57c1..d3aca84eb 100644 --- a/addon/components/citation-widget/component.js +++ b/addon/components/citation-widget/component.js @@ -35,7 +35,7 @@ export default Ember.Component.extend({ node: null, store: Ember.inject.service(), - didRender() { + didReceiveAttrs() { const node = this.get('node'); if (!node) { diff --git a/addon/components/new-osf-navbar/component.js b/addon/components/new-osf-navbar/component.js index 9b47c7c2b..1c7838a23 100644 --- a/addon/components/new-osf-navbar/component.js +++ b/addon/components/new-osf-navbar/component.js @@ -25,8 +25,8 @@ import AnalyticsMixin from 'ember-osf/mixins/analytics'; */ export default Ember.Component.extend(hostAppName, AnalyticsMixin, { layout, + osfServices, session: Ember.inject.service(), - osfServices: osfServices, serviceLinks: serviceLinks, host: config.OSF.url, currentService: Ember.computed('hostAppName', function() { // Pulls current service name from consuming service's config file @@ -41,7 +41,7 @@ export default Ember.Component.extend(hostAppName, AnalyticsMixin, { HOME: 'osfHome', PREPRINTS: 'preprintsHome', REGISTRIES: 'registriesHome', - MEETINGS: 'meetingsHome' + MEETINGS: 'meetingsHome', }; const service = this.get('currentService'); return this.get('serviceLinks')[serviceMapping[service]]; diff --git a/addon/components/new-osf-navbar/template.hbs b/addon/components/new-osf-navbar/template.hbs index 98ee067d5..6b27a3f04 100644 --- a/addon/components/new-osf-navbar/template.hbs +++ b/addon/components/new-osf-navbar/template.hbs @@ -36,7 +36,7 @@