Skip to content
This repository was archived by the owner on Apr 14, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
fb5cdda
[Feature] Update for reviews (#2)
aaxelb Aug 14, 2017
c237ed7
[Feature] Include reviewable when creating review logs (#3)
aaxelb Aug 18, 2017
429ce0e
Add dateLastTransitioned to preprint model (#5)
aaxelb Aug 25, 2017
55e69ab
[Fix] Only fetch the logged in user once
chrisseto Sep 6, 2017
d433892
Allow reviews settings to be nullable
chrisseto Sep 7, 2017
0cc20ec
Fix infinite authentication
chrisseto Sep 7, 2017
b844a34
Add support for using query parameters in findRecord
chrisseto Sep 11, 2017
a7f14a0
[Fix] Use `getRecords()` instead of `.record` (#8)
laurenbarker Sep 11, 2017
607311e
Tweaks and updates for reviews
chrisseto Sep 12, 2017
e416b28
Fix typo
chrisseto Sep 12, 2017
9cc89c5
[Feature][MOD-73] Rename log to action (minimal branch) (#2)
aaxelb Sep 14, 2017
838ad02
[MOD-72][Feature] Add "My Reviews" for users with view_submissions pe…
chrisseto Sep 12, 2017
024aa2b
Add actions property to user model
aaxelb Sep 15, 2017
e032fa4
Add `user` property to current-user instead
aaxelb Sep 18, 2017
6ad3b89
Add DOI alias properties to preprint model
aaxelb Sep 19, 2017
25e5913
Fix permissions check in navbar (#6)
laurenbarker Sep 25, 2017
c660ea5
Only serialize actually dirty relationships
aaxelb Sep 27, 2017
447e5e4
Wait for currentUser.user to resolve (#8)
laurenbarker Oct 2, 2017
81a9ffa
[Feature][MOD-111] Add preprint" button direct to the current provide…
sheriefvt Oct 5, 2017
f1ebddf
Use forked/fixed ember-data-has-many-query
aaxelb Oct 5, 2017
5eccd08
Update ember-data-has-many-query dependency
aaxelb Oct 5, 2017
6f49fc9
Revert to non-forked ember-data-has-many-query
aaxelb Oct 6, 2017
4964ade
Merge branch 'develop' into feature/reviews-minimal
aaxelb Oct 12, 2017
671c2b9
Merge branch 'develop' into feature/reviews-minimal
aaxelb Oct 17, 2017
e7e565b
Update CHANGELOG
aaxelb Oct 17, 2017
9d8e4b7
Merge branch 'develop' into feature/reviews-minimal
jamescdavis Oct 19, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
3 changes: 3 additions & 0 deletions addon/adapters/action.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import OsfAdapter from './osf-adapter';

export default OsfAdapter.extend({});
4 changes: 2 additions & 2 deletions addon/adapters/osf-adapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
20 changes: 12 additions & 8 deletions addon/authenticators/osf-cookie.js
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand All @@ -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;
});
},
Expand Down Expand Up @@ -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)
);
}
});
2 changes: 1 addition & 1 deletion addon/components/citation-widget/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export default Ember.Component.extend({
node: null,
store: Ember.inject.service(),

didRender() {
didReceiveAttrs() {
const node = this.get('node');

if (!node) {
Expand Down
4 changes: 2 additions & 2 deletions addon/components/new-osf-navbar/component.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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]];
Expand Down
2 changes: 1 addition & 1 deletion addon/components/new-osf-navbar/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
<div class="navbar-collapse collapse navbar-right" id="secondary-navigation">
<ul class="nav navbar-nav">
{{!SECONDARY NAVIGATION - displays corresponding links for selected service}}
{{#each (build-secondary-nav-links currentService) as |navLink|}}
{{#each (build-secondary-nav-links currentService baseServiceUrl) as |navLink|}}
{{#if (and (eq currentService 'HOME') (eq navLink.type "search"))}}
<li>
<a href="{{navLink.href}}" onclick={{action 'click' 'link' (concat 'Navbar - ' navlink.name)}}>
Expand Down
1 change: 1 addition & 0 deletions addon/const/service-links.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ const serviceLinks = {
registriesSupport: 'http://help.osf.io/m/registrations/',
search: `${osfUrl}search/`,
settings: `${osfUrl}settings/`,
reviewsHome: `${osfUrl}reviews/`,
};


Expand Down
18 changes: 14 additions & 4 deletions addon/helpers/build-secondary-nav-links.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,16 @@ import { serviceLinks } from '../const/service-links';

export default Ember.Helper.extend({ // Helper defined using a class, so can inject dependencies.
session: Ember.inject.service(),
currentUser: Ember.inject.service(),
compute(params) { // Helpers defined using a class need a compute function
const currentService = params[0].toUpperCase();
const baseServiceUrl = params[1];
const session = this.get('session');
let links = Ember.Object.create({
HOME: [
{
name: `${session.get('isAuthenticated') ? 'eosf.navbar.myProjects' : 'eosf.navbar.browse'}`,
href: `${session.get('isAuthenticated') ? serviceLinks.myProjects : serviceLinks.exploreActivity}`
name: session.get('isAuthenticated') ? 'eosf.navbar.myProjects' : 'eosf.navbar.browse',
href: session.get('isAuthenticated') ? serviceLinks.myProjects : serviceLinks.exploreActivity,
},
{
name: 'eosf.navbar.search',
Expand All @@ -40,12 +42,12 @@ export default Ember.Helper.extend({ // Helper defined using a class, so can in
PREPRINTS: [
{
name: 'eosf.navbar.addAPreprint',
href: serviceLinks.preprintsSubmit,
href: Ember.isEmpty(baseServiceUrl) ? serviceLinks.preprintsSubmit : baseServiceUrl + 'submit',
type: 'addAPreprint'
},
{
name: 'eosf.navbar.search',
href: serviceLinks.preprintsDiscover,
href: Ember.isEmpty(baseServiceUrl) ? serviceLinks.preprintsDiscover : baseServiceUrl + 'discover',
type: 'search'
},
{
Expand Down Expand Up @@ -99,6 +101,14 @@ export default Ember.Helper.extend({ // Helper defined using a class, so can in
href: serviceLinks.myQuickFiles
}
);
this.get('currentUser.user').then((user) => {
if (user.get('canViewReviews')) {
links.PREPRINTS.insertAt(1, {
name: 'eosf.navbar.reviews',
href: serviceLinks.reviewsHome,
});
}
})
} else {
links.HOME.push(
{
Expand Down
1 change: 1 addition & 0 deletions addon/locales/en/translations.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export default {
goHome: 'Go home',
myProjects: 'My Projects',
myQuickFiles: 'My Quick Files',
reviews: 'My Reviewing',
search: 'Search',
searchHelp: 'Search help',
searchTheOSF: 'Search the OSF',
Expand Down
16 changes: 16 additions & 0 deletions addon/models/action.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import DS from 'ember-data';
import OsfModel from './osf-model';

export default OsfModel.extend({
actionTrigger: DS.attr('string'),
comment: DS.attr('string'),
fromState: DS.attr('string'),
toState: DS.attr('string'),
dateCreated: DS.attr('date'),
dateModified: DS.attr('date'),

// Relationships
provider: DS.belongsTo('preprint-provider', { inverse: null, async: true }),
target: DS.belongsTo('preprint', { inverse: 'actions', async: true }),
creator: DS.belongsTo('user', { inverse: null, async: true }),
});
4 changes: 2 additions & 2 deletions addon/models/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,13 @@ export default OsfModel.extend(FileItemMixin, {
var contributors = this.hasMany('contributors').hasManyRelationship;
this.set(
'_dirtyRelationships.contributors.update',
contributors.members.list.filter(m => !m.record.get('isNew') && Object.keys(m.record.changedAttributes()).length > 0)
contributors.members.list.filter(m => !m.getRecord().get('isNew') && Object.keys(m.getRecord().changedAttributes()).length > 0)
);
// Need to included created contributors even in relationship
// hasLoaded is false
this.set(
'_dirtyRelationships.contributors.create',
contributors.members.list.filter(m => m.record.get('isNew'))
contributors.members.list.filter(m => m.getRecord().get('isNew'))
);
// Contributors are a 'real' delete, not just a de-reference
this.set(
Expand Down
10 changes: 5 additions & 5 deletions addon/models/osf-model.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,12 @@ export default DS.Model.extend(HasManyQuery.ModelMixin, {
var relation = this.resolveRelationship(rel);
// TODO(samchrisinger): not sure if hasLoaded is a subset if the hasData state
if (relation.hasData && relation.hasLoaded) {
var canonicalIds = relation.canonicalMembers.list.map(member => member.record.get('id'));
var currentIds = relation.members.list.map(member => member.record.get('id'));
var canonicalIds = relation.canonicalMembers.list.map(member => member.getRecord().get('id'));
var currentIds = relation.members.list.map(member => member.getRecord().get('id'));
var changes = {
create: relation.members.list.filter(m => m.record.get('isNew')),
add: relation.members.list.filter(m => !m.record.get('isNew') && canonicalIds.indexOf(m.record.get('id')) === -1),
remove: relation.canonicalMembers.list.filter(m => currentIds.indexOf(m.record.get('id')) === -1)
create: relation.members.list.filter(m => m.getRecord().get('isNew')),
add: relation.members.list.filter(m => !m.getRecord().get('isNew') && canonicalIds.indexOf(m.getRecord().get('id')) === -1),
remove: relation.canonicalMembers.list.filter(m => currentIds.indexOf(m.getRecord().get('id')) === -1)
};

var other = this.get('_dirtyRelationships.${rel}') || {};
Expand Down
9 changes: 9 additions & 0 deletions addon/models/preprint-provider.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Ember from 'ember';
import DS from 'ember-data';
import OsfModel from 'ember-osf/models/osf-model';

Expand All @@ -15,6 +16,14 @@ export default OsfModel.extend({
additionalProviders: DS.attr(),
shareSource: DS.attr('string'),
preprintWord: DS.attr('string'),

// Reviews settings
permissions: DS.attr(),
reviewsWorkflow: DS.attr('string'),
reviewsCommentsPrivate: DS.attr('boolean', {allowNull: true}),
reviewsCommentsAnonymous: DS.attr('boolean', {allowNull: true}),
reviewableStatusCounts: Ember.computed.alias('links.relationships.preprints.links.related.meta'),

// Relationships
taxonomies: DS.hasMany('taxonomy'),
highlightedTaxonomies: DS.hasMany('taxonomy'),
Expand Down
22 changes: 22 additions & 0 deletions addon/models/preprint.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Ember from 'ember';
import DS from 'ember-data';
import OsfModel from './osf-model';

Expand Down Expand Up @@ -27,10 +28,31 @@ export default OsfModel.extend({
isPublished: DS.attr('boolean'),
isPreprintOrphan: DS.attr('boolean'),
licenseRecord: DS.attr(),
reviewsState: DS.attr('string'),
dateLastTransitioned: DS.attr('date'),

// Relationships
node: DS.belongsTo('node', { inverse: null, async: true }),
license: DS.belongsTo('license', { inverse: null }),
primaryFile: DS.belongsTo('file', { inverse: null }),
provider: DS.belongsTo('preprint-provider', { inverse: 'preprints', async: true }),
actions: DS.hasMany('action', { inverse: 'target', async: true }),
contributors: DS.hasMany('contributors', { async: true }),

uniqueSubjects: Ember.computed('subjects', function() {
if (!this.get('subjects')) return [];
return this.get('subjects').reduce((acc, val) => acc.concat(val), []).uniqBy('id');
}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Better in the model. 👍


articleDoiUrl: Ember.computed.alias('links.doi'),
preprintDoiUrl: Ember.computed.alias('links.preprint_doi'),

licenseText: Ember.computed('license', function() {
const text = this.get('license.text') || '';
const {year = '', copyright_holders = []} = this.get('licenseRecord');

return text
.replace(/({{year}})/g, year)
.replace(/({{copyrightHolders}})/g, copyright_holders.join(', '));
}),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is much better doing this here!

});
3 changes: 3 additions & 0 deletions addon/models/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,16 @@ export default OsfModel.extend({

nodes: DS.hasMany('nodes'),
registrations: DS.hasMany('registrations'),
canViewReviews: DS.attr('boolean', {defaultValue: false}),

quickfiles: DS.hasMany('files'),

affiliatedInstitutions: DS.hasMany('institutions', {
inverse: 'users'
}),

actions: DS.hasMany('action', { inverse: null, async: true }),

// Calculated fields
profileURL: Ember.computed.alias('links.html'),
profileImage: Ember.computed.alias('links.profile_image')
Expand Down
12 changes: 12 additions & 0 deletions addon/serializers/action.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import OsfSerializer from './osf-serializer';

export default OsfSerializer.extend({
// Because `trigger` is a private method on DS.Model
attrs: {
actionTrigger: 'trigger',
},
// Serialize `target` relationship
relationshipTypes: {
target: 'preprints',
},
});
27 changes: 4 additions & 23 deletions addon/serializers/node.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,8 @@
import Ember from 'ember';
import OsfSerializer from './osf-serializer';

export default OsfSerializer.extend({
serialize(snapshot) {
// Normal OSF serializer strips out relationships. We need to add back primaryFile/node/provider for this endpoint
const res = this._super(...arguments);
res.data.relationships = {};
let hasRelation = false;
for (var rel in snapshot.record._dirtyRelationships) {
let relationship = Ember.String.underscore(rel);
if (relationship.includes('license')) {
res.data.relationships[relationship] = {
data: {
id: snapshot.belongsTo(rel, { id: true }),
type: 'licenses'
}
};
hasRelation = true;
}
}
if (!hasRelation) {
delete res.data.relationships;
}
return res;
}
// Serialize license relationship
relationshipTypes: {
license: 'licenses',
},
});
Loading