Skip to content

Commit 043629d

Browse files
committed
Merge branch 'release/22.11.0'
2 parents ee40d95 + e93bb25 commit 043629d

File tree

144 files changed

+3983
-836
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

144 files changed

+3983
-836
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
66

77

8+
## [22.11.0] - 2022-12-19
9+
### Changed
10+
- Collections Moderation
11+
812
## [22.10.0] - 2022-10-05
913
### Changed
1014
- Misc bug and a11y fixes.

app/adapters/action.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import OsfAdapter from './osf-adapter';
2+
3+
export default class Action extends OsfAdapter {
4+
parentRelationship = 'target';
5+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import ActionAdapter from './action';
2+
3+
export default class CollectionSubmissionActionAdapter extends ActionAdapter {
4+
urlForCreateRecord() {
5+
// Eventually remove this when we can just post to /v2/collection_submissions/:id/actions
6+
return `${this.urlPrefix()}/collection_submission_actions/`;
7+
}
8+
}
9+
10+
declare module 'ember-data/types/registries/adapter' {
11+
export default interface AdapterRegistry {
12+
'collection-submission-action': CollectionSubmissionActionAdapter;
13+
} // eslint-disable-line semi
14+
}

app/adapters/collected-metadatum.ts renamed to app/adapters/collection-submission.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@ import DS from 'ember-data';
77
import OsfAdapter from 'ember-osf-web/adapters/osf-adapter';
88
import param from 'ember-osf-web/utils/param';
99

10-
export default class CollectedMetadatumAdapter extends OsfAdapter {
10+
export default class CollectionSubmissionAdapter extends OsfAdapter {
1111
urlForHybridGuid(id: string): string {
1212
const splitId = id.split('-');
1313

14-
assert('ID for findRecord should be in the format: collectionId-collectedMetadatumId', splitId.length === 2);
14+
assert('ID for findRecord should be in the format: collectionSubmissionId-collectionId', splitId.length === 2);
1515

16-
const [collectionId, collectedMetadatumId] = splitId;
16+
const [collectionSubmissionId, collectionId] = splitId;
1717

18-
return `${this.urlPrefix()}/collections/${collectionId}/collected_metadata/${collectedMetadatumId}`;
18+
return `${this.urlPrefix()}/collections/${collectionId}/collection_submissions/${collectionSubmissionId}`;
1919
}
2020

2121
urlForCreateRecord(_: string | number, { record }: DS.Snapshot): string {
2222
const collectionId = record.belongsTo('collection').id();
23-
return `${this.urlPrefix()}/collections/${collectionId}/collected_metadata/`;
23+
return `${this.urlPrefix()}/collections/${collectionId}/collection_submissions/`;
2424
}
2525

2626
urlForFindRecord(id: string): string {
@@ -62,6 +62,6 @@ export default class CollectedMetadatumAdapter extends OsfAdapter {
6262

6363
declare module 'ember-data/types/registries/adapter' {
6464
export default interface AdapterRegistry {
65-
'collected-metadatum': CollectedMetadatumAdapter;
65+
'collection-submission': CollectionSubmissionAdapter;
6666
} // eslint-disable-line semi
6767
}

app/adapters/moderator.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ import OsfAdapter from './osf-adapter';
33

44
interface ModeratorAdapterOptions {
55
providerId: string;
6+
providerType: 'registrations' | 'collections';
67
}
78

89
export default class ModeratorAdapter extends OsfAdapter {
910
parentRelationship = 'provider';
1011
urlForFindRecord(id: string, _: string | number, snapshot: DS.Snapshot): string {
1112
const adapterOptions = snapshot.adapterOptions as ModeratorAdapterOptions;
12-
const { providerId } = adapterOptions;
13-
return `${this.urlPrefix()}/providers/registrations/${providerId}/moderators/${id}`;
13+
const { providerId, providerType } = adapterOptions;
14+
return `${this.urlPrefix()}/providers/${providerType}/${providerId}/moderators/${id}`;
1415
}
1516
}
1617

app/adapters/review-action.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import OsfAdapter from './osf-adapter';
1+
import ActionAdapter from './action';
22

3-
export default class ReviewActionAdapter extends OsfAdapter {
4-
parentRelationship = 'target';
3+
export default class ReviewActionAdapter extends ActionAdapter {
54
}
65

76
declare module 'ember-data/types/registries/adapter' {

app/adapters/schema-response-action.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import OsfAdapter from './osf-adapter';
1+
import ActionAdapter from './action';
22

3-
export default class SchemaResponseActionAdapter extends OsfAdapter {
4-
parentRelationship = 'target';
3+
export default class SchemaResponseActionAdapter extends ActionAdapter {
54
}
65

76
declare module 'ember-data/types/registries/adapter' {

app/models/action.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { attr, belongsTo, AsyncBelongsTo } from '@ember-data/model';
2+
3+
import UserModel from 'ember-osf-web/models/user';
4+
import OsfModel from './osf-model';
5+
6+
export default class Action extends OsfModel {
7+
// Override these in subclasses for better type safety
8+
@attr('string') actionTrigger!: string;
9+
@attr('string') fromState!: string;
10+
@attr('string') toState!: string;
11+
12+
@attr('fixstring') comment!: string;
13+
@attr('date') dateCreated!: Date;
14+
@attr('date') dateModified!: Date;
15+
@attr('boolean') visible!: boolean;
16+
@attr('boolean') auto!: boolean;
17+
18+
@belongsTo('user', { inverse: null })
19+
creator!: AsyncBelongsTo<UserModel> & UserModel;
20+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { attr, belongsTo, AsyncBelongsTo } from '@ember-data/model';
2+
import { computed } from '@ember/object';
3+
import { inject as service } from '@ember/service';
4+
import Intl from 'ember-intl/services/intl';
5+
6+
import CollectionSubmissionModel, { CollectionSubmissionReviewStates } from './collection-submission';
7+
import Action from './action';
8+
9+
export enum CollectionSubmissionActionTrigger {
10+
Submit = 'submit',
11+
Resubmit = 'resubmit',
12+
Accept = 'accept',
13+
Reject = 'reject',
14+
Remove = 'remove',
15+
}
16+
17+
const TriggerToPastTenseTranslationKey: Record<CollectionSubmissionActionTrigger, string> = {
18+
submit: 'collections.actions.triggerPastTense.submit',
19+
resubmit: 'collections.actions.triggerPastTense.resubmit',
20+
accept: 'collections.actions.triggerPastTense.accept',
21+
reject: 'collections.actions.triggerPastTense.reject',
22+
remove: 'collections.actions.triggerPastTense.remove',
23+
};
24+
25+
type ModeratorActionTriggers =
26+
CollectionSubmissionActionTrigger.Accept |
27+
CollectionSubmissionActionTrigger.Reject |
28+
CollectionSubmissionActionTrigger.Remove;
29+
30+
export const CollectionSubmissionActionTriggerToLabelMapKey: Record<ModeratorActionTriggers, string> = {
31+
[CollectionSubmissionActionTrigger.Accept]: 'osf-components.makeDecisionDropdown.acceptCollectionSubmission',
32+
[CollectionSubmissionActionTrigger.Reject]: 'osf-components.makeDecisionDropdown.rejectCollectionSubmission',
33+
[CollectionSubmissionActionTrigger.Remove]:
34+
'osf-components.makeDecisionDropdown.removeCollectionSubmission',
35+
};
36+
export const CollectionSubmissionActionTriggerToDescriptionKey: Record<ModeratorActionTriggers, string> = {
37+
[CollectionSubmissionActionTrigger.Accept]:
38+
'osf-components.makeDecisionDropdown.acceptCollectionSubmissionDescription',
39+
[CollectionSubmissionActionTrigger.Reject]:
40+
'osf-components.makeDecisionDropdown.rejectCollectionSubmissionDescription',
41+
[CollectionSubmissionActionTrigger.Remove]:
42+
'osf-components.makeDecisionDropdown.removeCollectionSubmissionDescription',
43+
};
44+
45+
export default class CollectionSubmissionAction extends Action{
46+
@service intl!: Intl;
47+
48+
@attr('string') actionTrigger!: CollectionSubmissionActionTrigger;
49+
@attr('string') fromState!: CollectionSubmissionReviewStates;
50+
@attr('string') toState!: CollectionSubmissionReviewStates;
51+
52+
@belongsTo('collection-submission', { inverse: 'collectionSubmissionActions' })
53+
target!: AsyncBelongsTo<CollectionSubmissionModel> & CollectionSubmissionModel;
54+
55+
@computed('actionTrigger')
56+
get triggerPastTense(): string {
57+
const translationKey = TriggerToPastTenseTranslationKey[this.actionTrigger];
58+
return translationKey ? this.intl.t(translationKey) : '';
59+
}
60+
}
61+
62+
declare module 'ember-data/types/registries/model' {
63+
export default interface ModelRegistry {
64+
'collection-submission-action': CollectionSubmissionAction;
65+
}
66+
}

app/models/collected-metadatum.ts renamed to app/models/collection-submission.ts

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
import { belongsTo, attr } from '@ember-data/model';
1+
import { belongsTo, hasMany, AsyncHasMany, attr } from '@ember-data/model';
22
import { computed } from '@ember/object';
33
import { alias as iAlias } from '@ember/object/computed';
44
import { buildValidations, validator } from 'ember-cp-validations';
55

66
import tuple from 'ember-osf-web/utils/tuple';
77

88
import Collection, { ChoicesFields } from './collection';
9+
import CollectionSubmissionAction, {
10+
CollectionSubmissionActionTrigger,
11+
} from './collection-submission-action';
912
import Node from './node';
1013
import OsfModel from './osf-model';
1114
import User from './user';
@@ -20,6 +23,31 @@ export const choiceFields = tuple(
2023
'schoolType',
2124
);
2225

26+
export enum CollectionSubmissionReviewStates {
27+
Accepted = 'accepted',
28+
InProgress = 'in_progress',
29+
Pending = 'pending',
30+
Removed = 'removed',
31+
Rejected = 'rejected',
32+
}
33+
34+
export const SubmissionIconMap = {
35+
[CollectionSubmissionReviewStates.Pending]: 'clock',
36+
[CollectionSubmissionReviewStates.Accepted]: 'check',
37+
[CollectionSubmissionReviewStates.Removed]: 'trash',
38+
[CollectionSubmissionReviewStates.Rejected]: 'times',
39+
[CollectionSubmissionReviewStates.InProgress]: 'times',
40+
};
41+
42+
export type ActionableCollectionSubmissionStates =
43+
CollectionSubmissionReviewStates.Accepted | CollectionSubmissionReviewStates.Pending;
44+
45+
export const collectionSubmissionStateToDecisionMap = {
46+
[CollectionSubmissionReviewStates.Accepted]: [CollectionSubmissionActionTrigger.Remove],
47+
[CollectionSubmissionReviewStates.Pending]:
48+
[CollectionSubmissionActionTrigger.Accept, CollectionSubmissionActionTrigger.Reject],
49+
};
50+
2351
const Validations = buildValidations({
2452
...choiceFields.reduce((acc, val) => {
2553
const disabled = computed('model.displayChoiceFields.[]', function(): boolean {
@@ -42,18 +70,21 @@ const Validations = buildValidations({
4270
}, {}),
4371
});
4472

45-
export default class CollectedMetadatumModel extends OsfModel.extend(Validations) {
73+
export default class CollectionSubmissionModel extends OsfModel.extend(Validations) {
4674
@attr('string') collectedType?: string;
4775
@attr('string') issue?: string;
4876
@attr('string') programArea?: string;
4977
@attr('string') status?: string;
5078
@attr('string') volume?: string;
79+
@attr('string') reviewsState?: CollectionSubmissionReviewStates;
5180
@attr('string') studyDesign?: string; // custom field for Character Lab
5281
@attr('string') schoolType?: string; // custom field for Character Lab
5382

5483
@belongsTo('collection') collection!: Collection;
5584
@belongsTo('node') guid!: Node;
5685
@belongsTo('user') creator!: User;
86+
@hasMany('collection-submission-action')
87+
collectionSubmissionActions!: AsyncHasMany<CollectionSubmissionAction> | CollectionSubmissionAction[];
5788

5889
@computed('collection.displayChoicesFields.[]')
5990
get displayChoiceFields() {
@@ -69,6 +100,6 @@ export default class CollectedMetadatumModel extends OsfModel.extend(Validations
69100

70101
declare module 'ember-data/types/registries/model' {
71102
export default interface ModelRegistry {
72-
'collected-metadatum': CollectedMetadatumModel;
103+
'collection-submission': CollectionSubmissionModel;
73104
} // eslint-disable-line semi
74105
}

0 commit comments

Comments
 (0)