Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion app/models/registration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export default class RegistrationModel extends NodeModel.extend(Validations) {
originalResponse!: AsyncBelongsTo<SchemaResponseModel> | SchemaResponseModel;

@belongsTo('schema-response', { inverse: null })
latestResponse!: AsyncBelongsTo<SchemaResponseModel> | SchemaResponseModel;
latestResponse!: AsyncBelongsTo<SchemaResponseModel> | SchemaResponseModel; // Latest accepted response

// Write-only relationships
@belongsTo('draft-registration', { inverse: null })
Expand Down
8 changes: 1 addition & 7 deletions 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 { validateLength, validatePresence } from 'ember-changeset-validations/validators';
import { validatePresence } from 'ember-changeset-validations/validators';
import DraftNode from 'ember-osf-web/models/draft-node';
import LicenseModel from 'ember-osf-web/models/license';

Expand Down Expand Up @@ -178,11 +178,5 @@ export function buildSchemaResponseValidations() {
type: 'blank',
})];
set(validationObj, 'revisionJustification', notBlank);
set(validationObj, 'updatedResponseKeys', [validateLength({
min: 1,
allowBlank: false,
allowNone: false,
type: 'no_updated_responses',
})]);
return validationObj;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.NextButton,
.ReviewButton,
.BackButton {
.BackButton,
.DeleteButton {
button {
width: 100%;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,13 @@
@date={{@draftManager.draftRegistration.datetimeUpdated}}
/>
</span>

{{#if @draftManager.currentUserIsAdmin}}
<DeleteButton
local-class='DeleteButton'
@delete={{perform @draftManager.deleteDraft}}
@modalTitle={{t 'registries.drafts.draft.delete_modal.title'}}
@modalBody={{t 'registries.drafts.draft.delete_modal.body'}}
@buttonLabel={{t 'registries.drafts.draft.delete_modal.button'}}
/>
{{/if}}
13 changes: 13 additions & 0 deletions lib/registries/addon/drafts/draft/draft-registration-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,19 @@ export default class DraftRegistrationManager {
}
}

@task
@waitFor
async deleteDraft() {
try {
await this.draftRegistration.destroyRecord();
this.router.transitionTo('registries.my-registrations');
} catch (e) {
const errorMessage = this.intl.t('registries.drafts.draft.delete_modal.delete_error');
captureException(e, { errorMessage });
this.toast.error(getApiErrorMessage(e), errorMessage);
}
}

@action
onPageChange(currentPage: number) {
if (this.hasVisitedPages) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.NextButton,
.ReviewButton,
.BackButton {
.BackButton,
.DeleteButton {
button {
width: 100%;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,13 @@
@date={{@revisionManager.revision.dateModified}}
/>
</span>

{{#if @revisionManager.showDeleteButton}}
<DeleteButton
local-class='DeleteButton'
@delete={{perform @revisionManager.deleteRevision}}
@modalTitle={{t 'registries.edit_revision.delete_modal.title'}}
@modalBody={{t 'registries.edit_revision.delete_modal.body'}}
@buttonLabel={{t 'registries.edit_revision.delete_modal.button'}}
/>
{{/if}}
19 changes: 0 additions & 19 deletions lib/registries/addon/edit-revision/controller.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import Controller from '@ember/controller';
import { assert } from '@ember/debug';
import { alias, not } from '@ember/object/computed';
import RouterService from '@ember/routing/router-service';
import { inject as service } from '@ember/service';
import { waitFor } from '@ember/test-waiters';
import { task } from 'ember-concurrency';
import IntlService from 'ember-intl/services/intl';
import RegistrationModel from 'ember-osf-web/models/registration';
import SchemaResponseModel from 'ember-osf-web/models/schema-response';
import captureException, { getApiErrorMessage } from 'ember-osf-web/utils/capture-exception';
import Media from 'ember-responsive';

export default class EditRevisionController extends Controller {
Expand All @@ -21,19 +17,4 @@ export default class EditRevisionController extends Controller {

@alias('model.revisionManager.revision') revision?: SchemaResponseModel;
@alias('model.revisionManager.registration') registration?: RegistrationModel;

@task
@waitFor
async deleteRevision() {
assert('this.revision is required to delete a revision', this.revision);
assert('this.registration is required to redirect after deleting a revision', this.registration);
try {
await this.revision.destroyRecord();
this.router.transitionTo('registries.overview.index', this.registration.id);
} catch (e) {
const errorMessage = this.intl.t('registries.edit_revision.delete_modal.delete_error');
captureException(e, { errorMessage });
this.toast.error(getApiErrorMessage(e), errorMessage);
}
}
}
4 changes: 0 additions & 4 deletions lib/registries/addon/edit-revision/justification/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,3 @@
.SchemaBlockLongText {
composes: SchemaBlockLongText from '../../drafts/draft/metadata/styles.scss';
}

.RevisedResponses {
font-style: italic;
}
15 changes: 1 addition & 14 deletions lib/registries/addon/edit-revision/justification/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,7 @@
@uniqueID={{reasonFieldId}}
/>
{{/let}}
{{#let (unique-id 'questions') as |questionsFieldId|}}
<label for={{questionsFieldId}} id='questions'>
<p local-class='DisplayText'>
{{t 'registries.edit_revision.updatedResponseKeys'}}
<span local-class='Required'>*</span>
</p>
</label>
<Registries::RevisedResponsesList
@revision={{this.revisionManager.revision}}
@schemaBlocks={{this.revisionManager.schemaBlocks}}
local-class='RevisedResponses'
/>
{{/let}}
</FormControls>
</form>
</main>
{{/if}}
{{/if}}
22 changes: 21 additions & 1 deletion lib/registries/addon/edit-revision/revision-manager.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { setOwner } from '@ember/application';
import { action, computed, set } from '@ember/object';
import { dependentKeyCompat } from '@ember/object/compat';
import { alias, filterBy, not, notEmpty, or } from '@ember/object/computed';
Expand Down Expand Up @@ -88,6 +89,11 @@ export default class RevisionManager {
return this.revision?.reviewsState === RevisionReviewStates.RevisionInProgress;
}

@computed('currentUserIsAdmin', 'isEditable')
get showDeleteButton() {
return this.currentUserIsAdmin && this.isEditable;
}

@computed('revision.reviewsState')
get isPendingAdminApproval() {
return this.revision.reviewsState === RevisionReviewStates.Unapproved;
Expand All @@ -103,7 +109,8 @@ export default class RevisionManager {
return this.registration.currentUserPermissions.includes(Permission.Admin);
}

constructor(loadModelsTask: LoadModelsTask, revisionId: string) {
constructor(owner: any, loadModelsTask: LoadModelsTask, revisionId: string) {
setOwner(this, owner);
set(this, 'loadModelsTask', loadModelsTask);
set(this, 'revisionId', revisionId);
taskFor(this.initializePageManagers).perform();
Expand Down Expand Up @@ -215,6 +222,19 @@ export default class RevisionManager {
}
}

@task
@waitFor
async deleteRevision() {
try {
await this.revision.destroyRecord();
this.router.transitionTo('registries.overview.index', this.registration.id);
} catch (e) {
const errorMessage = this.intl.t('registries.edit_revision.delete_modal.delete_error');
captureException(e, { errorMessage });
this.toast.error(getApiErrorMessage(e), errorMessage);
}
}

@action
onPageChange(currentPage: number) {
if (this.hasVisitedPages) {
Expand Down
3 changes: 2 additions & 1 deletion lib/registries/addon/edit-revision/route.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { getOwner } from '@ember/application';
import Store from '@ember-data/store';
import { action } from '@ember/object';
import Route from '@ember/routing/route';
Expand Down Expand Up @@ -53,7 +54,7 @@ export default class EditRevisionRoute extends Route {
model(params: { revisionId: string }) {
const { revisionId } = params;
const loadModelsTask = taskFor(this.loadModels).perform(revisionId) as LoadModelsTask;
const revisionManager = new RevisionManager(loadModelsTask, revisionId);
const revisionManager = new RevisionManager(getOwner(this), loadModelsTask, revisionId);
const navigationManager = new RevisionNavigationManager(revisionManager);
return {
navigationManager,
Expand Down
12 changes: 0 additions & 12 deletions lib/registries/addon/edit-revision/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -76,18 +76,6 @@
@label='{{t 'registries.drafts.draft.review.page_label'}}'
@navMode={{leftNav.leftGutterMode}}
/>
<leftNav.link
@icon='trash-alt'
as |link|
>
<link.icon />
<DeleteButton
@delete={{perform this.deleteRevision}}
@modalTitle={{t 'registries.edit_revision.delete_modal.title'}}
@modalBody={{t 'registries.edit_revision.delete_modal.body'}}
@buttonLabel={{t 'registries.edit_revision.delete_modal.button'}}
/>
</leftNav.link>
</layout.leftNav>
<layout.main local-class='Main'>
{{outlet}}
Expand Down
2 changes: 1 addition & 1 deletion mirage/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ export default function(this: Server) {
});

osfResource(this, 'draft-registration', {
only: ['index', 'show', 'update'],
only: ['index', 'show', 'update', 'delete'],
path: '/draft_registrations',
});
this.post('/draft_registrations', createDraftRegistration);
Expand Down
22 changes: 22 additions & 0 deletions tests/engines/registries/acceptance/draft/draft-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ module('Registries | Acceptance | draft form', hooks => {
assert.dom('[data-test-goto-register]').doesNotExist('RightNav: Register button not shown');
assert.dom('[data-test-nonadmin-warning-text]').exists('RightNav: Warning non-admins cannot register shown');
assert.dom('[data-test-goto-previous-page]').doesNotExist('RightNav: Back button not shown');
assert.dom('[data-test-delete-button]').doesNotExist('RightNav: Delete button not shown');

// check metadata and form renderer
assert.dom('[data-test-edit-button]').doesNotExist('MetadataRenderer: Edit button not shown');
Expand Down Expand Up @@ -170,6 +171,27 @@ module('Registries | Acceptance | draft form', hooks => {
assert.equal(currentRouteName(), 'registries.page-not-found', 'At page not found');
});

test('delete draft', async function(
this: DraftFormTestContext, assert,
) {
const initiator = server.create('user', 'loggedIn');
const registrationSchema = server.schema.registrationSchemas.find('testSchema');
const registration = server.create(
'draft-registration', {
registrationSchema,
initiator,
branchedFrom: this.branchedFrom,
},
);

await visit(`/registries/drafts/${registration.id}/`);

assert.equal(currentRouteName(), 'registries.drafts.draft.metadata', 'On metadata page');
await click('[data-test-delete-button]');
await click('[data-test-confirm-delete]');
assert.equal(currentRouteName(), 'registries.my-registrations', 'Reroutes to my-registrations');
});

test('left nav controls', async function(this: DraftFormTestContext, assert) {
const initiator = server.create('user', 'loggedIn');
const registrationSchema = server.schema.registrationSchemas.find('testSchema');
Expand Down
20 changes: 18 additions & 2 deletions tests/engines/registries/acceptance/edit-revision/revision-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ module('Registries | Acceptance | registries revision', hooks => {
assert.dom('[data-test-submit-revision]').doesNotExist('RightNav: Register button not shown');
assert.dom('[data-test-nonadmin-warning-text]').exists('RightNav: Warning non-admins cannot register shown');
assert.dom('[data-test-goto-previous-page]').doesNotExist('RightNav: Back button not shown');
assert.dom('[data-test-delete-button]').doesNotExist('RightNav: Delete button not shown');

// check form renderer
await percySnapshot('Read-only Revision Review page: Desktop');
Expand Down Expand Up @@ -158,6 +159,23 @@ module('Registries | Acceptance | registries revision', hooks => {
assert.equal(currentRouteName(), 'registries.edit-revision.justification', 'At the expected route');
});

test('delete revision in progress', async function(this: RevisionTestContext, assert) {
const initiatedBy = server.create('user', 'loggedIn');
const revision = server.create(
'schema-response',
{
initiatedBy,
revisionResponses: {},
registration: this.registration,
},
);
await visit(`/registries/revisions/${revision.id}/`);
assert.equal(currentRouteName(), 'registries.edit-revision.justification', 'At the expected route');
await click('[data-test-delete-button]');
await click('[data-test-confirm-delete]');
assert.equal(currentRouteName(), 'registries.overview.index', 'At the expected route');
});

test('left nav controls', async function(this: RevisionTestContext, assert) {
const initiatedBy = server.create('user', 'loggedIn');
const revision = server.create(
Expand Down Expand Up @@ -426,7 +444,6 @@ module('Registries | Acceptance | registries revision', hooks => {
assert.dom('[data-test-invalid-responses-text]').isVisible('Invalid response text shown');

assert.dom('[data-test-validation-errors="revisionJustification"]').exists('justification invalid');
assert.dom('[data-test-validation-errors="updatedResponseKeys"]').exists('revised responses invalid');
assert.dom(`[data-test-validation-errors="${deserializeResponseKey('page-one_short-text')}"]`)
.exists('short text invalid');
assert.dom(`[data-test-validation-errors="${deserializeResponseKey('page-one_long-text')}"]`)
Expand All @@ -450,7 +467,6 @@ module('Registries | Acceptance | registries revision', hooks => {
await click('[data-test-link="justification"]');
await fillIn('textarea[name="revisionJustification"]', 'Tell the world that ditto is the best');
assert.dom('[data-test-validation-errors="revisionJustification"]').doesNotExist('justification valid');
assert.dom('[data-test-revised-responses-list]').exists({ count: 1 }, 'revised responses list shown');

// check the review page to see if text is valid again
await click('[data-test-link="review"]');
Expand Down
11 changes: 8 additions & 3 deletions translations/en-us.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1188,6 +1188,11 @@ registries:
register: Register
unable_to_fetch_children_count: 'Unable to fetch project''s components'
submit_error: 'Unable to create a registration.'
delete_modal:
title: 'Delete this draft registration'
body: 'Are you sure you want to delete this draft registration?'
button: 'Delete Draft'
delete_error: 'Unable to delete draft registration'
edit_revision:
revisionJustification: 'Justification for update'
updatedResponseKeys: 'List of updated registration questions'
Expand Down Expand Up @@ -1216,9 +1221,9 @@ registries:
reason: 'What additional changes need to be made and why?'
submit: 'Submit'
delete_modal:
title: 'Delete this update'
body: 'Are you sure to delete this update?'
button: 'Cancel update'
title: 'Delete this draft update'
body: 'Are you sure you want to delete this draft update?'
button: 'Delete Draft Update'
delete_error: 'Unable to delete update'
index:
lead: 'The <span class="f-w-lg">open</span> registries network'
Expand Down