Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
64ccdf3
Foundation: Mirage
adlius Jul 7, 2021
451b93b
mirage factory initial work
futa-ikeda Jul 7, 2021
c36c53a
model changes
adlius Jul 26, 2021
fb1d5db
rename schema-response fac to revision fac
adlius Jul 26, 2021
dd22e6a
partial
adlius Jul 26, 2021
85d2ac3
More mirage work
futa-ikeda Jul 26, 2021
43ba765
Rewire overview-form-renderer to take responses off of registration o…
futa-ikeda Jul 27, 2021
c31d91e
query param fun
adlius Jul 28, 2021
8d5f49e
[ENG-3034] Add version-metadata component and tests (#1239)
futa-ikeda Aug 4, 2021
0ee9a2b
prelim for edit-revision route
adlius Aug 5, 2021
8eac8e1
moar
adlius Aug 6, 2021
7929b9f
index route redirect + new isPendingCurrentUser field to revision model
adlius Aug 6, 2021
3d350cc
Mirage work for revision-actions
futa-ikeda Aug 6, 2021
091762e
Update models
futa-ikeda Aug 6, 2021
6d064fa
right nav component
adlius Aug 9, 2021
f3b4de5
moar
adlius Aug 10, 2021
461c609
more & more
adlius Aug 10, 2021
c52e0a7
more edit route fun
adlius Aug 11, 2021
c0bb13f
mobile
adlius Aug 11, 2021
3155f2b
Modal for admin requesting more edits
futa-ikeda Aug 12, 2021
aa7a40f
[ENG-3032] Added UpdateDropdown component for Outcome Reporting (#1244)
chth0n1x Sep 8, 2021
fbdba04
Merge branch 'develop' into feature/versioning-mirage
futa-ikeda Sep 8, 2021
849ff5e
[ENG-3031] Revisions permissions (#1260)
futa-ikeda Sep 8, 2021
63fcfda
[ENG-3036] Updates to registries moderation (#1263)
futa-ikeda Sep 8, 2021
45f596f
removed unused functionality.
chth0n1x Sep 9, 2021
92fed66
Minor updates before demo
futa-ikeda Sep 10, 2021
f7f10a0
Update dropdown work
futa-ikeda Sep 10, 2021
85af703
updated versionNumber to revisionNumber.
chth0n1x Sep 10, 2021
c61bad6
updated translation string for component with no revisions.
chth0n1x Sep 10, 2021
98fb4fe
readded sort(), fixed versionNumber to revisionNumber.
chth0n1x Sep 10, 2021
29af321
linting.
chth0n1x Sep 13, 2021
6cbcb23
updates to the version-metadata logic
futa-ikeda Sep 13, 2021
8c5e4e1
demo feedback
futa-ikeda Sep 13, 2021
1e3b840
update-dropdown paginatioon, moderation updates, demo feedback
futa-ikeda Sep 16, 2021
1670500
WIP tests
futa-ikeda Sep 16, 2021
e608ebd
Improve registrationlist loading state logic
futa-ikeda Sep 17, 2021
a0ce677
Rename revision model to schemaResponse
futa-ikeda Sep 20, 2021
1781878
Rename revision-actions to schema-response-actions
futa-ikeda Sep 20, 2021
d0d1b98
changed revision language to update(s), shortened length of messages.
chth0n1x Sep 27, 2021
6b8530b
Model changes and update-dropdown modifications
futa-ikeda Sep 28, 2021
b022571
reviewState -> reviewsState
futa-ikeda Sep 28, 2021
d743271
[ENG-3218] Revision files widget (#1282)
futa-ikeda Sep 29, 2021
67025a4
Merge branch 'develop' of https://github.com/CenterForOpenScience/emb…
futa-ikeda Oct 4, 2021
f2e8a08
Merge branch 'feature/versioning-mirage' of https://github.com/Center…
futa-ikeda Oct 5, 2021
a0ad808
[ENG-3242] Add Justification route to registration edit workflow (#1318)
futa-ikeda Oct 6, 2021
5d597c1
renamed revisionstates
futa-ikeda Oct 6, 2021
61bd425
add isOriginal field
futa-ikeda Oct 6, 2021
372abbb
Merge develop into feature branch (#1320)
adlius Oct 8, 2021
aa0c1be
Hide pending updates tab in moderation if provider does not allow upd…
futa-ikeda Oct 8, 2021
9830e27
Change how revisions in progress are shown in Overview page dropdown …
futa-ikeda Oct 11, 2021
7a0d221
misc changes (#1323)
adlius Oct 11, 2021
9a89e54
Update trigger names to match API
futa-ikeda Oct 12, 2021
e405e84
Update moderator reject trigger
futa-ikeda Oct 12, 2021
8301045
change trigger (#1324)
adlius Oct 12, 2021
e1ac3d4
show correct message when isOriginalResponse (#1325)
adlius Oct 13, 2021
fd486a0
Show revisions when registration is pending or initial + Fix moderati…
futa-ikeda Oct 13, 2021
2732175
Reroute users out of edit-revision route when needed (#1328)
futa-ikeda Oct 15, 2021
8b03910
Add normalize method to SchemaResponse serializer (#1327)
adlius Oct 18, 2021
daebc83
Restructure moderation tab (#1330)
futa-ikeda Oct 29, 2021
28b9cbb
Minor updates for versioning (#1333)
futa-ikeda Nov 1, 2021
dd43a5b
Update feature branch with latest develop. (#1344)
adlius Nov 10, 2021
a74e6fb
Merge diff-manager feature branch into versioning feature branch. (#1…
adlius Nov 10, 2021
79c6233
Update registration cards (#1346)
adlius Nov 11, 2021
1ba77c0
Feature/registries delete revision button (#1348)
adlius Nov 12, 2021
e159f0b
remove Latest Update label for node-card (#1349)
adlius Nov 12, 2021
ea4c8ba
Merge remote-tracking branch 'upstream/develop' into feature/versioni…
adlius Nov 13, 2021
5479ecc
revert some changes
adlius Nov 16, 2021
04be718
Merge remote-tracking branch 'upstream/develop' into feature/versioni…
adlius Nov 16, 2021
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
11 changes: 11 additions & 0 deletions app/adapters/schema-response-action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import OsfAdapter from './osf-adapter';

export default class SchemaResponseActionAdapter extends OsfAdapter {
parentRelationship = 'target';
}

declare module 'ember-data/types/registries/adapter' {
export default interface AdapterRegistry {
'schema-response-action': SchemaResponseActionAdapter;
} // eslint-disable-line semi
}
10 changes: 10 additions & 0 deletions app/adapters/schema-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import OsfAdapter from './osf-adapter';

export default class SchemaResponseAdapter extends OsfAdapter {
}

declare module 'ember-data/types/registries/adapter' {
export default interface AdapterRegistry {
'schema-response': SchemaResponseAdapter;
} // eslint-disable-line semi
}
6 changes: 6 additions & 0 deletions app/models/node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,12 @@ export default class NodeModel extends AbstractNodeModel.extend(Validations, Col
return Array.isArray(this.currentUserPermissions) && this.currentUserPermissions.includes(Permission.Read);
}

@computed('currentUserPermissions.length')
get currentUserIsReadOnly() {
return Array.isArray(this.currentUserPermissions) && this.currentUserPermissions.includes(Permission.Read)
&& this.currentUserPermissions.length === 1;
}

/**
* The type of this node.
*/
Expand Down
1 change: 1 addition & 0 deletions app/models/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export default abstract class ProviderModel extends OsfModel {
@attr('string') facebookAppId!: string;
@attr('boolean') allowSubmissions!: boolean;
@attr('boolean') allowCommenting!: boolean;
@attr('boolean') allowUpdates!: boolean;
@attr('fixstring') reviewsWorkflow!: string | null;
@attr('boolean') reviewsCommentsAnonymous!: boolean | null;
@attr() assets?: Partial<Assets>; // TODO: camelize in transform
Expand Down
34 changes: 30 additions & 4 deletions app/models/registration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { buildValidations, validator } from 'ember-cp-validations';

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

import CommentModel from './comment';
Expand All @@ -11,6 +12,7 @@ import InstitutionModel from './institution';
import NodeModel from './node';
import RegistrationProviderModel from './registration-provider';
import RegistrationSchemaModel, { RegistrationMetadata } from './registration-schema';
import { SchemaResponseActionTrigger } from './schema-response-action';
import UserModel from './user';

export enum RegistrationReviewStates {
Expand All @@ -25,11 +27,29 @@ export enum RegistrationReviewStates {
PendingWithdraw = 'pending_withdraw',
}

type NonActionableStates = RegistrationReviewStates.Initial
export type NonActionableRegistrationStates = RegistrationReviewStates.Initial
| RegistrationReviewStates.Withdrawn | RegistrationReviewStates.Rejected;

export type ReviewsStateToDecisionMap = Exclude<RegistrationReviewStates, NonActionableStates>;
export const reviewsStateToDecisionMap: { [index in ReviewsStateToDecisionMap]: ReviewActionTrigger[] } = {
export type ActionableRevisionStates = RevisionReviewStates.RevisionPendingModeration;

export type ReviewsStateToDecisionMap =
Exclude<RegistrationReviewStates, NonActionableRegistrationStates> | RevisionReviewStates.RevisionPendingModeration;
export const reviewsStateToDecisionMap: {
[index in ReviewsStateToDecisionMap]: Array<
Exclude<
ReviewActionTrigger,
ReviewActionTrigger.Submit
| ReviewActionTrigger.RequestWithdrawal
| ReviewActionTrigger.RequestEmbargoTermination>
|
Exclude<
SchemaResponseActionTrigger,
SchemaResponseActionTrigger.SubmitRevision
| SchemaResponseActionTrigger.AdminApproveRevision
| SchemaResponseActionTrigger.AdminRejectRevision
>
>
} = {
[RegistrationReviewStates.Accepted]: [ReviewActionTrigger.ForceWithdraw],
[RegistrationReviewStates.Embargo]: [ReviewActionTrigger.ForceWithdraw],
[RegistrationReviewStates.Pending]:
Expand All @@ -38,6 +58,8 @@ export const reviewsStateToDecisionMap: { [index in ReviewsStateToDecisionMap]:
[ReviewActionTrigger.AcceptWithdrawal, ReviewActionTrigger.RejectWithdrawal],
[RegistrationReviewStates.PendingWithdrawRequest]: [ReviewActionTrigger.ForceWithdraw],
[RegistrationReviewStates.PendingEmbargoTermination]: [ReviewActionTrigger.ForceWithdraw],
[RevisionReviewStates.RevisionPendingModeration]:
[SchemaResponseActionTrigger.AcceptRevision, SchemaResponseActionTrigger.RejectRevision],
};

const Validations = buildValidations({
Expand Down Expand Up @@ -79,9 +101,10 @@ export default class RegistrationModel extends NodeModel.extend(Validations) {
@attr('fixstring') articleDoi!: string | null;
@attr('object') registeredMeta!: RegistrationMetadata;
@attr('registration-responses') registrationResponses!: RegistrationResponse;
@attr('fixstring') reviewsState?: RegistrationReviewStates;
@attr('fixstring') reviewsState!: RegistrationReviewStates;
@attr('fixstring') iaUrl?: string;
@attr('array') providerSpecificMetadata!: ProviderMetadata[];
@attr('fixstring') revisionState!: RevisionReviewStates;
@attr('boolean') wikiEnabled!: boolean;

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

@hasMany('schema-response', { inverse: 'registration' })
schemaResponses!: AsyncHasMany<SchemaResponseModel> | SchemaResponseModel[];

// Write-only relationships
@belongsTo('draft-registration', { inverse: null })
draftRegistration!: DraftRegistrationModel;
Expand Down
53 changes: 53 additions & 0 deletions app/models/schema-response-action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { attr, belongsTo, AsyncBelongsTo } from '@ember-data/model';
import { computed } from '@ember/object';
import { inject as service } from '@ember/service';
import Intl from 'ember-intl/services/intl';
import SchemaResponseModel, { RevisionReviewStates } from 'ember-osf-web/models/schema-response';
import UserModel from 'ember-osf-web/models/user';
import OsfModel from './osf-model';

export enum SchemaResponseActionTrigger {
SubmitRevision = 'submit',
AdminApproveRevision = 'approve',
AdminRejectRevision = 'admin_reject',
AcceptRevision = 'accept',
RejectRevision = 'moderator_reject',
}

const TriggerToPastTenseTranslationKey: Record<SchemaResponseActionTrigger, string> = {
submit: 'registries.schemaResponseActions.triggerPastTense.submit',
approve: 'registries.schemaResponseActions.triggerPastTense.approve',
admin_reject: 'registries.schemaResponseActions.triggerPastTense.admin_reject',
accept: 'registries.schemaResponseActions.triggerPastTense.accept',
moderator_reject: 'registries.schemaResponseActions.triggerPastTense.moderator_reject',
};

export default class SchemaResponseActionModel extends OsfModel {
@service intl!: Intl;

@attr('string') actionTrigger!: SchemaResponseActionTrigger;
@attr('fixstring') comment!: string;
@attr('string') fromState!: RevisionReviewStates;
@attr('string') toState!: RevisionReviewStates;
@attr('date') dateCreated!: Date;
@attr('date') dateModified!: Date;
@attr('boolean') visible!: boolean;

@belongsTo('user', { inverse: null })
creator!: AsyncBelongsTo<UserModel> & UserModel;

@belongsTo('schema-response', { inverse: 'actions' })
target!: AsyncBelongsTo<SchemaResponseModel> & SchemaResponseModel;

@computed('actionTrigger')
get triggerPastTense(): string {
const key = TriggerToPastTenseTranslationKey[this.actionTrigger] || '';
return key ? this.intl.t(key) : '';
}
}

declare module 'ember-data/types/registries/model' {
export default interface ModelRegistry {
'schema-response-action': SchemaResponseActionModel;
} // eslint-disable-line semi
}
39 changes: 39 additions & 0 deletions app/models/schema-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { AsyncBelongsTo, AsyncHasMany, attr, belongsTo, hasMany } from '@ember-data/model';
import RegistrationModel from 'ember-osf-web/models/registration';
import RegistrationSchemaModel from 'ember-osf-web/models/registration-schema';
import SchemaResponseActionModel from 'ember-osf-web/models/schema-response-action';
import UserModel from 'ember-osf-web/models/user';
import { RegistrationResponse } from 'ember-osf-web/packages/registration-schema';

import OsfModel from './osf-model';

export enum RevisionReviewStates {
Unapproved = 'unapproved',
RevisionInProgress = 'in_progress',
RevisionPendingModeration = 'pending_moderation',
Approved = 'approved',
}

export default class SchemaResponseModel extends OsfModel {
@attr('fixstring') reviewsState!: RevisionReviewStates;
@attr('date') dateCreated!: Date;
@attr('date') dateModified!: Date;
@attr('fixstring') revisionJustification!: string;
@attr('registration-response-key-array') updatedResponseKeys!: string[];
@attr('registration-responses') revisionResponses!: RegistrationResponse;
@attr('boolean') isOriginalResponse!: boolean;
@attr('boolean') isPendingCurrentUserApproval!: boolean;

@belongsTo('user') initiatedBy!: AsyncBelongsTo<UserModel> & UserModel;
@belongsTo('registration') registration!: AsyncBelongsTo<RegistrationModel> & RegistrationModel;
@belongsTo('registration-schema')
registrationSchema!: AsyncBelongsTo<RegistrationSchemaModel> & RegistrationSchemaModel;
@hasMany('schema-response-action', { inverse: 'target' })
actions!: AsyncHasMany<SchemaResponseActionModel> | SchemaResponseActionModel[];
}

declare module 'ember-data/types/registries/model' {
export default interface ModelRegistry {
'schema-response': SchemaResponseModel;
} // eslint-disable-line semi
}
5 changes: 4 additions & 1 deletion app/packages/registration-schema/get-schema-block-group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ function isEmpty(input?: string | null) {
return false;
}

export function getSchemaBlockGroups(blocks: SchemaBlock[] | undefined) {
export function getSchemaBlockGroups(blocks: SchemaBlock[], updatedGroupKeys?: string[]) {
if (!blocks) {
assert('getSchemaBlockGroups() requires blocks');
return undefined;
Expand Down Expand Up @@ -52,6 +52,9 @@ export function getSchemaBlockGroups(blocks: SchemaBlock[] | undefined) {
schemaBlockGroup.inputBlock = block;
schemaBlockGroup.registrationResponseKey = block.registrationResponseKey;
schemaBlockGroup.groupType = block.blockType;
if (updatedGroupKeys && updatedGroupKeys.includes(schemaBlockGroup.registrationResponseKey!)) {
schemaBlockGroup.updated = true;
}
break;
case 'select-input-option':
if (schemaBlockGroup.inputBlock) {
Expand Down
2 changes: 1 addition & 1 deletion app/packages/registration-schema/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ export { getPages } from './get-pages';
export { getSchemaBlockGroups } from './get-schema-block-group';
export { SchemaBlock, SchemaBlockType } from './schema-block';
export { SchemaBlockGroup } from './schema-block-group';
export { buildValidation, buildMetadataValidations } from './validations';
export { buildValidation, buildMetadataValidations, buildSchemaResponseValidations } from './validations';
export {
FileReference,
RegistrationResponse,
Expand Down
1 change: 1 addition & 0 deletions app/packages/registration-schema/schema-block-group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ export interface SchemaBlockGroup {
registrationResponseKey?: string | null;
groupType?: string;
blocks?: SchemaBlock[];
updated?: boolean;
}
22 changes: 21 additions & 1 deletion app/packages/registration-schema/validations.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { assert } from '@ember/debug';
import { set } from '@ember/object';
import { ValidationObject, ValidatorFunction } from 'ember-changeset-validations';
import { validatePresence } from 'ember-changeset-validations/validators';
import { validateLength, validatePresence } from 'ember-changeset-validations/validators';
import DraftNode from 'ember-osf-web/models/draft-node';
import LicenseModel from 'ember-osf-web/models/license';

Expand All @@ -10,6 +10,7 @@ import NodeModel, { NodeLicense } from 'ember-osf-web/models/node';
import { RegistrationResponse } from 'ember-osf-web/packages/registration-schema';
import { SchemaBlockGroup } from 'ember-osf-web/packages/registration-schema/schema-block-group';
import { validateFileList } from 'ember-osf-web/validators/validate-response-format';
import SchemaResponseModel from 'ember-osf-web/models/schema-response';

export const NodeLicenseFields: Record<keyof NodeLicense, string> = {
copyrightHolders: 'Copyright Holders',
Expand Down Expand Up @@ -166,3 +167,22 @@ export function buildMetadataValidations() {
set(validationObj, DraftMetadataProperties.NodeLicenseProperty, validateNodeLicense());
return validationObj;
}

export function buildSchemaResponseValidations() {
const validationObj: ValidationObject<SchemaResponseModel> = {};
const notBlank: ValidatorFunction[] = [validatePresence({
presence: true,
ignoreBlank: true,
allowBlank: false,
allowNone: false,
type: 'blank',
})];
set(validationObj, 'revisionJustification', notBlank);
set(validationObj, 'updatedResponseKeys', [validateLength({
min: 1,
allowBlank: false,
allowNone: false,
type: 'no_updated_responses',
})]);
return validationObj;
}
4 changes: 2 additions & 2 deletions app/serializers/draft-registration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import { mapKeysAndValues } from 'ember-osf-web/utils/map-keys';
import { Resource } from 'osf-api';
import OsfSerializer from './osf-serializer';

interface JsonPayload {
export interface JsonPayload {
attributes: Record<string, {}>;
}

Expand Down Expand Up @@ -60,7 +60,7 @@ export function normalizeRegistrationResponses(value: ResponseValue, store: Stor
return value;
}

function serializeRegistrationResponses(value: NormalizedResponseValue) {
export function serializeRegistrationResponses(value: NormalizedResponseValue) {
if (Array.isArray(value) && value.length && isObject(value[0]) && 'materializedPath' in value[0]) {
return value.map(file => file.toFileReference());
}
Expand Down
15 changes: 15 additions & 0 deletions app/serializers/schema-response-action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import OsfSerializer from './osf-serializer';

export default class SchemaResponseActionSerializer extends OsfSerializer {
// Because `trigger` is a private method on DS.Model
attrs: any = {
...this.attrs, // from OsfSerializer
actionTrigger: 'trigger',
};
}

declare module 'ember-data/types/registries/serializer' {
export default interface SerializerRegistry {
'schema-response-action': SchemaResponseActionSerializer;
} // eslint-disable-line semi
}
48 changes: 48 additions & 0 deletions app/serializers/schema-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import Model from '@ember-data/model';
import DS from 'ember-data';
import {
NormalizedRegistrationResponse,
RegistrationResponse,
} from 'ember-osf-web/packages/registration-schema';
import { mapKeysAndValues } from 'ember-osf-web/utils/map-keys';
import { Resource } from 'osf-api';

import { JsonPayload, normalizeRegistrationResponses, serializeRegistrationResponses } from './draft-registration';
import OsfSerializer from './osf-serializer';

export default class SchemaResponseSerializer extends OsfSerializer {
normalize(modelClass: Model, resourceHash: Resource) {
if (resourceHash.attributes) {
const revisionResponses = resourceHash.attributes.revision_responses as RegistrationResponse;
// @ts-ignore: TODO: fix types
// eslint-disable-next-line no-param-reassign
resourceHash.attributes.revision_responses = mapKeysAndValues(
revisionResponses || {},
key => key,
value => normalizeRegistrationResponses(value, this.store),
) as NormalizedRegistrationResponse;
}
return super.normalize(modelClass, resourceHash) as { data: Resource };
}

serializeAttribute(snapshot: DS.Snapshot, json: JsonPayload, key: string, attribute: object): void {
super.serializeAttribute(snapshot, json, key, attribute);

if (key === 'revisionResponses' && json.attributes) {
const underscoreKey = this.keyForAttribute(key);
const revisionResponses = json.attributes[underscoreKey] as NormalizedRegistrationResponse;

// eslint-disable-next-line no-param-reassign
json.attributes[underscoreKey] = mapKeysAndValues(
revisionResponses || {},
k => k,
value => serializeRegistrationResponses(value),
);
}
}
}
declare module 'ember-data/types/registries/serializer' {
export default interface SerializerRegistry {
'schema-response': SchemaResponseSerializer;
} // eslint-disable-line semi
}
Loading