Skip to content

Commit 1ce5948

Browse files
committed
Merge branch 'release/21.10.0'
2 parents a77ec98 + 39fd6db commit 1ce5948

File tree

173 files changed

+5490
-404
lines changed

Some content is hidden

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

173 files changed

+5490
-404
lines changed

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
44
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

7+
## [21.10.0] - 2021-11-30
8+
### Added
9+
- Registration versioning
10+
711
## [21.9.0] - 2021-11-08
812
### Changed
913
- Misc a11y fixes
@@ -1810,7 +1814,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
18101814
### Added
18111815
- Quick Files
18121816

1813-
[21.8.0]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.9.0
1817+
[21.10.0]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.10.0
1818+
[21.9.2]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.9.2
1819+
[21.9.1]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.9.1
1820+
[21.9.0]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.9.0
18141821
[21.8.0]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.8.0
18151822
[21.7.0]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.7.0
18161823
[21.6.3]: https://github.com/CenterForOpenScience/ember-osf-web/releases/tag/21.6.3
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import OsfAdapter from './osf-adapter';
2+
3+
export default class SchemaResponseActionAdapter extends OsfAdapter {
4+
parentRelationship = 'target';
5+
}
6+
7+
declare module 'ember-data/types/registries/adapter' {
8+
export default interface AdapterRegistry {
9+
'schema-response-action': SchemaResponseActionAdapter;
10+
} // eslint-disable-line semi
11+
}

app/adapters/schema-response.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import OsfAdapter from './osf-adapter';
2+
3+
export default class SchemaResponseAdapter extends OsfAdapter {
4+
}
5+
6+
declare module 'ember-data/types/registries/adapter' {
7+
export default interface AdapterRegistry {
8+
'schema-response': SchemaResponseAdapter;
9+
} // eslint-disable-line semi
10+
}

app/models/node.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,12 @@ export default class NodeModel extends AbstractNodeModel.extend(Validations, Col
218218
return Array.isArray(this.currentUserPermissions) && this.currentUserPermissions.includes(Permission.Read);
219219
}
220220

221+
@computed('currentUserPermissions.length')
222+
get currentUserIsReadOnly() {
223+
return Array.isArray(this.currentUserPermissions) && this.currentUserPermissions.includes(Permission.Read)
224+
&& this.currentUserPermissions.length === 1;
225+
}
226+
221227
/**
222228
* The type of this node.
223229
*/

app/models/provider.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export default abstract class ProviderModel extends OsfModel {
5050
@attr('string') facebookAppId!: string;
5151
@attr('boolean') allowSubmissions!: boolean;
5252
@attr('boolean') allowCommenting!: boolean;
53+
@attr('boolean') allowUpdates!: boolean;
5354
@attr('fixstring') reviewsWorkflow!: string | null;
5455
@attr('boolean') reviewsCommentsAnonymous!: boolean | null;
5556
@attr() assets?: Partial<Assets>; // TODO: camelize in transform

app/models/registration.ts

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { buildValidations, validator } from 'ember-cp-validations';
33

44
import DraftRegistrationModel from 'ember-osf-web/models/draft-registration';
55
import ReviewActionModel, { ReviewActionTrigger } from 'ember-osf-web/models/review-action';
6+
import SchemaResponseModel, { RevisionReviewStates } from 'ember-osf-web/models/schema-response';
67
import { RegistrationResponse } from 'ember-osf-web/packages/registration-schema';
78

89
import CommentModel from './comment';
@@ -11,6 +12,7 @@ import InstitutionModel from './institution';
1112
import NodeModel from './node';
1213
import RegistrationProviderModel from './registration-provider';
1314
import RegistrationSchemaModel, { RegistrationMetadata } from './registration-schema';
15+
import { SchemaResponseActionTrigger } from './schema-response-action';
1416
import UserModel from './user';
1517

1618
export enum RegistrationReviewStates {
@@ -25,11 +27,29 @@ export enum RegistrationReviewStates {
2527
PendingWithdraw = 'pending_withdraw',
2628
}
2729

28-
type NonActionableStates = RegistrationReviewStates.Initial
30+
export type NonActionableRegistrationStates = RegistrationReviewStates.Initial
2931
| RegistrationReviewStates.Withdrawn | RegistrationReviewStates.Rejected;
3032

31-
export type ReviewsStateToDecisionMap = Exclude<RegistrationReviewStates, NonActionableStates>;
32-
export const reviewsStateToDecisionMap: { [index in ReviewsStateToDecisionMap]: ReviewActionTrigger[] } = {
33+
export type ActionableRevisionStates = RevisionReviewStates.RevisionPendingModeration;
34+
35+
export type ReviewsStateToDecisionMap =
36+
Exclude<RegistrationReviewStates, NonActionableRegistrationStates> | RevisionReviewStates.RevisionPendingModeration;
37+
export const reviewsStateToDecisionMap: {
38+
[index in ReviewsStateToDecisionMap]: Array<
39+
Exclude<
40+
ReviewActionTrigger,
41+
ReviewActionTrigger.Submit
42+
| ReviewActionTrigger.RequestWithdrawal
43+
| ReviewActionTrigger.RequestEmbargoTermination>
44+
|
45+
Exclude<
46+
SchemaResponseActionTrigger,
47+
SchemaResponseActionTrigger.SubmitRevision
48+
| SchemaResponseActionTrigger.AdminApproveRevision
49+
| SchemaResponseActionTrigger.AdminRejectRevision
50+
>
51+
>
52+
} = {
3353
[RegistrationReviewStates.Accepted]: [ReviewActionTrigger.ForceWithdraw],
3454
[RegistrationReviewStates.Embargo]: [ReviewActionTrigger.ForceWithdraw],
3555
[RegistrationReviewStates.Pending]:
@@ -38,6 +58,8 @@ export const reviewsStateToDecisionMap: { [index in ReviewsStateToDecisionMap]:
3858
[ReviewActionTrigger.AcceptWithdrawal, ReviewActionTrigger.RejectWithdrawal],
3959
[RegistrationReviewStates.PendingWithdrawRequest]: [ReviewActionTrigger.ForceWithdraw],
4060
[RegistrationReviewStates.PendingEmbargoTermination]: [ReviewActionTrigger.ForceWithdraw],
61+
[RevisionReviewStates.RevisionPendingModeration]:
62+
[SchemaResponseActionTrigger.AcceptRevision, SchemaResponseActionTrigger.RejectRevision],
4163
};
4264

4365
const Validations = buildValidations({
@@ -79,9 +101,10 @@ export default class RegistrationModel extends NodeModel.extend(Validations) {
79101
@attr('fixstring') articleDoi!: string | null;
80102
@attr('object') registeredMeta!: RegistrationMetadata;
81103
@attr('registration-responses') registrationResponses!: RegistrationResponse;
82-
@attr('fixstring') reviewsState?: RegistrationReviewStates;
104+
@attr('fixstring') reviewsState!: RegistrationReviewStates;
83105
@attr('fixstring') iaUrl?: string;
84106
@attr('array') providerSpecificMetadata!: ProviderMetadata[];
107+
@attr('fixstring') revisionState!: RevisionReviewStates;
85108
@attr('boolean') wikiEnabled!: boolean;
86109

87110
// Write-only attributes
@@ -121,6 +144,15 @@ export default class RegistrationModel extends NodeModel.extend(Validations) {
121144
@hasMany('review-action', { inverse: 'target' })
122145
reviewActions!: AsyncHasMany<ReviewActionModel> | ReviewActionModel[];
123146

147+
@hasMany('schema-response', { inverse: 'registration' })
148+
schemaResponses!: AsyncHasMany<SchemaResponseModel> | SchemaResponseModel[];
149+
150+
@belongsTo('schema-response', { inverse: null })
151+
originalResponse!: AsyncBelongsTo<SchemaResponseModel> | SchemaResponseModel;
152+
153+
@belongsTo('schema-response', { inverse: null })
154+
latestResponse!: AsyncBelongsTo<SchemaResponseModel> | SchemaResponseModel; // Latest accepted response
155+
124156
// Write-only relationships
125157
@belongsTo('draft-registration', { inverse: null })
126158
draftRegistration!: DraftRegistrationModel;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
import SchemaResponseModel, { RevisionReviewStates } from 'ember-osf-web/models/schema-response';
6+
import UserModel from 'ember-osf-web/models/user';
7+
import OsfModel from './osf-model';
8+
9+
export enum SchemaResponseActionTrigger {
10+
SubmitRevision = 'submit',
11+
AdminApproveRevision = 'approve',
12+
AdminRejectRevision = 'admin_reject',
13+
AcceptRevision = 'accept',
14+
RejectRevision = 'moderator_reject',
15+
}
16+
17+
const TriggerToPastTenseTranslationKey: Record<SchemaResponseActionTrigger, string> = {
18+
submit: 'registries.schemaResponseActions.triggerPastTense.submit',
19+
approve: 'registries.schemaResponseActions.triggerPastTense.approve',
20+
admin_reject: 'registries.schemaResponseActions.triggerPastTense.admin_reject',
21+
accept: 'registries.schemaResponseActions.triggerPastTense.accept',
22+
moderator_reject: 'registries.schemaResponseActions.triggerPastTense.moderator_reject',
23+
};
24+
25+
export default class SchemaResponseActionModel extends OsfModel {
26+
@service intl!: Intl;
27+
28+
@attr('string') actionTrigger!: SchemaResponseActionTrigger;
29+
@attr('fixstring') comment!: string;
30+
@attr('string') fromState!: RevisionReviewStates;
31+
@attr('string') toState!: RevisionReviewStates;
32+
@attr('date') dateCreated!: Date;
33+
@attr('date') dateModified!: Date;
34+
@attr('boolean') visible!: boolean;
35+
36+
@belongsTo('user', { inverse: null })
37+
creator!: AsyncBelongsTo<UserModel> & UserModel;
38+
39+
@belongsTo('schema-response', { inverse: 'actions' })
40+
target!: AsyncBelongsTo<SchemaResponseModel> & SchemaResponseModel;
41+
42+
@computed('actionTrigger')
43+
get triggerPastTense(): string {
44+
const key = TriggerToPastTenseTranslationKey[this.actionTrigger] || '';
45+
return key ? this.intl.t(key) : '';
46+
}
47+
}
48+
49+
declare module 'ember-data/types/registries/model' {
50+
export default interface ModelRegistry {
51+
'schema-response-action': SchemaResponseActionModel;
52+
} // eslint-disable-line semi
53+
}

app/models/schema-response.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { AsyncBelongsTo, AsyncHasMany, attr, belongsTo, hasMany } from '@ember-data/model';
2+
import RegistrationModel from 'ember-osf-web/models/registration';
3+
import RegistrationSchemaModel from 'ember-osf-web/models/registration-schema';
4+
import SchemaResponseActionModel from 'ember-osf-web/models/schema-response-action';
5+
import UserModel from 'ember-osf-web/models/user';
6+
import { RegistrationResponse } from 'ember-osf-web/packages/registration-schema';
7+
8+
import OsfModel from './osf-model';
9+
10+
export enum RevisionReviewStates {
11+
Unapproved = 'unapproved',
12+
RevisionInProgress = 'in_progress',
13+
RevisionPendingModeration = 'pending_moderation',
14+
Approved = 'approved',
15+
}
16+
17+
export default class SchemaResponseModel extends OsfModel {
18+
@attr('fixstring') reviewsState!: RevisionReviewStates;
19+
@attr('date') dateCreated!: Date;
20+
@attr('date') dateModified!: Date;
21+
@attr('fixstring') revisionJustification!: string;
22+
@attr('registration-response-key-array') updatedResponseKeys!: string[];
23+
@attr('registration-responses') revisionResponses!: RegistrationResponse;
24+
@attr('boolean') isOriginalResponse!: boolean;
25+
@attr('boolean') isPendingCurrentUserApproval!: boolean;
26+
27+
@belongsTo('user') initiatedBy!: AsyncBelongsTo<UserModel> & UserModel;
28+
@belongsTo('registration') registration!: AsyncBelongsTo<RegistrationModel> & RegistrationModel;
29+
@belongsTo('registration-schema')
30+
registrationSchema!: AsyncBelongsTo<RegistrationSchemaModel> & RegistrationSchemaModel;
31+
@hasMany('schema-response-action', { inverse: 'target' })
32+
actions!: AsyncHasMany<SchemaResponseActionModel> | SchemaResponseActionModel[];
33+
}
34+
35+
declare module 'ember-data/types/registries/model' {
36+
export default interface ModelRegistry {
37+
'schema-response': SchemaResponseModel;
38+
} // eslint-disable-line semi
39+
}

app/packages/registration-schema/get-schema-block-group.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function isEmpty(input?: string | null) {
88
return false;
99
}
1010

11-
export function getSchemaBlockGroups(blocks: SchemaBlock[] | undefined) {
11+
export function getSchemaBlockGroups(blocks: SchemaBlock[], updatedGroupKeys?: string[]) {
1212
if (!blocks) {
1313
assert('getSchemaBlockGroups() requires blocks');
1414
return undefined;
@@ -52,6 +52,9 @@ export function getSchemaBlockGroups(blocks: SchemaBlock[] | undefined) {
5252
schemaBlockGroup.inputBlock = block;
5353
schemaBlockGroup.registrationResponseKey = block.registrationResponseKey;
5454
schemaBlockGroup.groupType = block.blockType;
55+
if (updatedGroupKeys && updatedGroupKeys.includes(schemaBlockGroup.registrationResponseKey!)) {
56+
schemaBlockGroup.updated = true;
57+
}
5558
break;
5659
case 'select-input-option':
5760
if (schemaBlockGroup.inputBlock) {

app/packages/registration-schema/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ export { getPages } from './get-pages';
22
export { getSchemaBlockGroups } from './get-schema-block-group';
33
export { SchemaBlock, SchemaBlockType } from './schema-block';
44
export { SchemaBlockGroup } from './schema-block-group';
5-
export { buildValidation, buildMetadataValidations } from './validations';
5+
export { buildValidation, buildMetadataValidations, buildSchemaResponseValidations } from './validations';
66
export {
77
FileReference,
88
RegistrationResponse,

0 commit comments

Comments
 (0)