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
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
35 changes: 21 additions & 14 deletions lib/registries/addon/drafts/draft/-components/register/template.hbs
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
<BsButton
data-test-goto-register
data-analytics-name='Go to register'
local-class='registerButton {{if @showMobileView 'mobileReviewButtonItem'}}'
@type='success'
@onClick={{perform this.onClickRegister}}
disabled={{or (not this.draftManager.registrationResponsesIsValid) (not this.currentUserIsAdmin)}}
>
{{#if this.onClickRegister.isRunning}}
<LoadingIndicator @inline={{true}} />
{{else}}
{{t 'registries.drafts.draft.register'}}
{{/if}}
</BsButton>
{{#if this.currentUserIsAdmin}}
<BsButton
data-test-goto-register
data-analytics-name='Go to register'
local-class='registerButton {{if @showMobileView 'mobileReviewButtonItem'}}'
@type='success'
@onClick={{perform this.onClickRegister}}
disabled={{or (not this.draftManager.registrationResponsesIsValid) (not this.currentUserIsAdmin)}}
>
{{#if this.onClickRegister.isRunning}}
<LoadingIndicator @inline={{true}} />
{{else}}
{{t 'registries.drafts.draft.register'}}
{{/if}}
</BsButton>
{{/if}}
{{#if (and (not this.currentUserIsAdmin) (not @showMobileView))}}
<div data-test-nonadmin-warning-text>
{{t 'registries.drafts.draft.review.non_admin_warning'}}
</div>
{{/if}}
{{#if (and this.isInvalid (not @showMobileView))}}
<div data-test-invalid-responses-text class='text-danger'>
{{t 'registries.drafts.draft.review.invalid_warning'}}
Expand Down
8 changes: 8 additions & 0 deletions lib/registries/addon/drafts/draft/review/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@
<main
{{did-insert this.markAndValidatedPages}}
>
{{#if (and (not draftManager.currentUserIsAdmin) this.showMobileView)}}
<div
data-test-nonadmin-warning-text
local-class='WarningMessage'
>
{{t 'registries.drafts.draft.review.non_admin_warning'}}
</div>
{{/if}}
{{#if (and (not draftManager.registrationResponsesIsValid) this.showMobileView)}}
<div
data-test-invalid-responses-text
Expand Down
13 changes: 0 additions & 13 deletions lib/registries/addon/drafts/draft/styles.scss
Original file line number Diff line number Diff line change
Expand Up @@ -117,19 +117,6 @@
width: 100%;
}

.MobileNavPageLabelSection {
min-width: 0;
width: 100%;
}

.MobileNavPageLabel {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-weight: 600;
color: $color-text-black;
}

@media screen and (min-width: 992px) {
.ContentBackground {
display: flex;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
</Button>
</OsfLink>
{{/if}}
{{#if (and @navManager.prevPageParam (not @currentUserIsReadOnly) @revisionManager.isEditable)}}
{{#if (and @navManager.prevPageParam (not @revisionManager.currentUserIsReadOnly) @revisionManager.isEditable)}}
<OsfLink
data-test-goto-previous-page
data-analytics-name='Go to previous page'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import Store from '@ember-data/store';
import { tagName } from '@ember-decorators/component';
import Component from '@ember/component';
import { assert } from '@ember/debug';
import { action } from '@ember/object';
import { action, computed } from '@ember/object';
import { inject as service } from '@ember/service';
import { waitFor } from '@ember/test-waiters';
import { tracked } from '@glimmer/tracking';
Expand All @@ -25,6 +25,18 @@ export default class SubmitAndDecide extends Component {

@tracked continueEditModalOpen = false;

@computed('revisionManager.{isPendingAdminApproval,currentUserIsAdmin,isPendingModeration}')
get pendingStatusString(): string {
if (this.revisionManager.isPendingAdminApproval) {
return 'registries.edit_revision.review.pending_admin_notice';
}
if (this.revisionManager.isPendingModeration) {
return 'registries.edit_revision.review.pending_moderation_notice';
}
return 'registries.edit_revision.review.decision_recorded_notice';
}


@action
openContinueEditModal() {
this.set('continueEditModalOpen', true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,8 @@
border-radius: 0;
padding: 10px;
}

.pendingLabel {
padding: 10px;
color: $color-text-black;
}
Original file line number Diff line number Diff line change
@@ -1,56 +1,60 @@
{{assert 'EditRevision::-Components::SubmitAndDecide requires a revisionManager' @revisionManager}}
{{#if @revisionManager.currentUserIsAdmin}}
{{#if @revisionManager.isEditable}}
{{#if @revisionManager.isEditable}}
{{#if @revisionManager.currentUserIsAdmin}}
<BsButton
data-test-submit-revision
data-analytics-name='Submit revision'
local-class='registerButton {{if @showMobileView 'mobileReviewButtonItem'}}'
@type='success'
@onClick={{perform this.submitAction 'submit_revision' ''}}
disabled={{@revisionManager.hasInvalidResponses}}
disabled={{or @revisionManager.hasInvalidResponses this.submitAction.isRunning}}
>
{{#if this.submicAction.isRunning}}
{{#if this.submitAction.isRunning}}
<LoadingIndicator @inline={{true}} />
{{else}}
{{t 'registries.edit_revision.review.submit_changes'}}
{{/if}}
</BsButton>
{{#if (and @revisionManager.hasInvalidResponses (not @showMobileView))}}
<div data-test-invalid-responses-text class='text-danger'>
{{t 'registries.drafts.draft.review.invalid_warning'}}
</div>
{{/if}}
{{/if}}
{{#if @revisionManager.isPendingAdminApproval}}
{{#if @revisionManager.revision.isPendingCurrentUserApproval}}
<BsButton
data-test-accept-changes
data-analytics-name='Admin approve revision'
local-class='registerButton {{if @showMobileView 'mobileReviewButtonItem'}}'
@type='success'
@onClick={{perform this.submitAction 'admin_approve_revision' ''}}
>
{{t 'registries.edit_revision.review.accept_changes'}}
</BsButton>
<BsButton
data-test-continue-editing
data-analytics-name='Admin reject revision'
local-class='registerButton {{if @showMobileView 'mobileReviewButtonItem'}}'
@type='primary'
@onClick={{this.openContinueEditModal}}
>
{{t 'registries.edit_revision.review.continue_editing'}}
</BsButton>
<EditRevision::-Components::ContinueEditModal
@isOpen={{this.continueEditModalOpen}}
@onClose={{this.closeContinueEditModal}}
@onSubmit={{this.submitAction}}
/>
{{else}}
<p>{{t 'registries.edit_revision.review.decision_recorded_notice'}}</p>
{{/if}}
{{#if (and (not @revisionManager.currentUserIsAdmin) (not @showMobileView))}}
<div
data-test-nonadmin-warning-text
local-class='WarningMessage'
>
{{t 'registries.drafts.draft.review.non_admin_warning'}}
</div>
{{/if}}
{{#if (and @revisionManager.hasInvalidResponses (not @showMobileView))}}
<div data-test-invalid-responses-text class='text-danger'>
{{t 'registries.edit_revision.review.invalid_warning'}}
</div>
{{/if}}
{{#if @revisionManager.isPendingModeration}}
<p>{{t 'registries.edit_revision.review.pending_moderation_notice'}}</p>
{{else}}
{{#if @revisionManager.revision.isPendingCurrentUserApproval}}
<BsButton
data-test-accept-changes
data-analytics-name='Admin approve revision'
local-class='registerButton {{if @showMobileView 'mobileReviewButtonItem'}}'
@type='success'
@onClick={{perform this.submitAction 'admin_approve_revision' ''}}
>
{{t 'registries.edit_revision.review.accept_changes'}}
</BsButton>
<BsButton
data-test-continue-editing
data-analytics-name='Admin reject revision'
local-class='registerButton {{if @showMobileView 'mobileReviewButtonItem'}}'
@type='primary'
@onClick={{this.openContinueEditModal}}
>
{{t 'registries.edit_revision.review.continue_editing'}}
</BsButton>
<EditRevision::-Components::ContinueEditModal
@isOpen={{this.continueEditModalOpen}}
@onClose={{this.closeContinueEditModal}}
@onSubmit={{this.submitAction}}
/>
{{else}}
<div data-test-pending-status local-class={{if @showMobileView 'pendingLabel'}}>{{t this.pendingStatusString}}</div>
{{/if}}
{{/if}}
{{/if}}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,3 @@
z-index: 1;
border-bottom: 1px solid $color-border-white;
}

.MetadataButton {
padding: 15px;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<Navbar local-class='SideBarToggle' ...attributes as |nav|>
<nav.bordered-section>
{{#unless @currentUserIsReadOnly}}
{{#if (and (not @revisionManager.currentUserIsReadOnly) @revisionManager.isEditable)}}
<nav.buttons.default
data-test-sidenav-toggle
data-analytics-name='Show sidenav'
Expand All @@ -13,10 +13,10 @@
>
<nav.icon @icon={{if @layout.sidenavGutterClosed 'bars' 'times'}} />
</nav.buttons.default>
{{/unless}}
{{/if}}
</nav.bordered-section>
<nav.bordered-section local-class='MobileNavPageLabelSection'>
<div local-class='MobileNavPageLabel' data-test-page-label>
<nav.bordered-section>
<div data-test-page-label>
{{#if @navManager.inReview}}
{{t 'registries.drafts.draft.review.page_label'}}
{{else}}
Expand All @@ -25,10 +25,10 @@
</div>
</nav.bordered-section>
<nav.bordered-section>
{{#if (and @navManager.prevPageParam (not @currentUserIsReadOnly))}}
{{#if (and @navManager.prevPageParam (not @revisionManager.currentUserIsReadOnly) @revisionManager.isEditable)}}
<nav.links.default
data-test-goto-previous-page
data-analytics-name='Sidenav back'
data-analytics-name='Topnav back'
aria-label={{t 'osf-components.registries-top-nav.previousPage'}}
@route='registries.edit-revision.page'
@models={{array @revisionManager.revisionId @navManager.prevPageParam}}
Expand All @@ -39,7 +39,7 @@
{{#if @navManager.nextPageParam}}
<nav.links.default
data-test-goto-next-page
data-analytics-name='Sidenav next'
data-analytics-name='Topnav next'
aria-label={{t 'osf-components.registries-top-nav.nextPage'}}
@route='registries.edit-revision.page'
@models={{array @revisionManager.revisionId @navManager.nextPageParam}}
Expand All @@ -51,7 +51,7 @@
{{#if @navManager.isLastPage}}
<nav.links.default
data-test-goto-review
data-analytics-name='Sidenav review'
data-analytics-name='Topnav review'
aria-label={{t 'osf-components.registries-top-nav.reviewRegistration'}}
@route='registries.edit-revision.review'
@models={{array @revisionManager.revisionId}}
Expand Down
2 changes: 1 addition & 1 deletion lib/registries/addon/edit-revision/nav-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export default class RevisionNavigationManager {
return pageManagers.length - 1;
}

@computed('currentPage', 'pageManagers.[]', 'inMetadata', 'lastPage')
@computed('currentPage', 'pageManagers.[]', 'lastPage')
get nextPageParam() {
const {
pageManagers,
Expand Down
8 changes: 8 additions & 0 deletions lib/registries/addon/edit-revision/review/template.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@
<main
{{did-insert this.markAndValidatedPages}}
>
{{#if (and (not revisionManager.currentUserIsAdmin) this.showMobileView)}}
<div
data-test-nonadmin-warning-text
local-class='WarningMessage'
>
{{t 'registries.edit_revision.review.non_admin_warning'}}
</div>
{{/if}}
{{#if (and (not revisionManager.registrationResponsesIsValid) this.showMobileView)}}
<div
data-test-invalid-responses-text
Expand Down
14 changes: 6 additions & 8 deletions lib/registries/addon/edit-revision/revision-manager.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { action, computed, set } from '@ember/object';
import { alias, filterBy, not, notEmpty, or } from '@ember/object/computed';
import { alias, filterBy, not, notEmpty } from '@ember/object/computed';
import { inject as service } from '@ember/service';
import { waitFor } from '@ember/test-waiters';
import { isEmpty } from '@ember/utils';
import { BufferedChangeset } from 'ember-changeset/types';
import { restartableTask, task, TaskInstance, timeout } from 'ember-concurrency';
import { taskFor } from 'ember-concurrency-ts';
import Intl from 'ember-intl/services/intl';
Expand Down Expand Up @@ -41,13 +40,12 @@ export default class RevisionManager {
revisionResponses!: RegistrationResponse;

pageManagers: PageManager[] = [];
metadataChangeset!: BufferedChangeset;
schemaBlocks!: SchemaBlock[];

@alias('registration.currentUserIsReadOnly') currentUserIsReadOnly!: boolean;
@alias('provider.reviewsWorkflow') reviewsWorkflow?: string;
@or('onPageInput.isRunning', 'onMetadataInput.isRunning') autoSaving!: boolean;
@or('initializePageManagers.isRunning', 'initializeMetadataChangeset.isRunning') initializing!: boolean;
@alias('onPageInput.isRunning') autoSaving!: boolean;
@alias('initializePageManagers.isRunning') initializing!: boolean;
@not('registrationResponsesIsValid') hasInvalidResponses!: boolean;
@filterBy('pageManagers', 'isVisited', true) visitedPages!: PageManager[];
@notEmpty('visitedPages') hasVisitedPages!: boolean;
Expand All @@ -58,12 +56,12 @@ export default class RevisionManager {
node?: NodeModel;
revisionId!: string;

@computed('pageManagers.{[],@each.pageIsValid}', 'metadataIsValid')
@computed('pageManagers.{[],@each.pageIsValid}')
get registrationResponsesIsValid() {
return this.pageManagers.every(pageManager => pageManager.pageIsValid);
}

@computed('onPageInput.lastComplete', 'onMetadataInput.lastComplete')
@computed('onPageInput.lastComplete')
get lastSaveFailed() {
const onPageInputLastComplete = taskFor(this.onPageInput).lastComplete;
const pageInputFailed = onPageInputLastComplete ? onPageInputLastComplete.isError : false;
Expand All @@ -72,7 +70,7 @@ export default class RevisionManager {

@computed('revision.reviewState')
get isEditable() {
return this.revision.reviewState === RevisionReviewStates.RevisionInProgress;
return this.revision?.reviewState === RevisionReviewStates.RevisionInProgress;
}

@computed('revision.reviewState')
Expand Down
5 changes: 5 additions & 0 deletions lib/registries/addon/edit-revision/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { task } from 'ember-concurrency';
import { taskFor } from 'ember-concurrency-ts';

import requireAuth from 'ember-osf-web/decorators/require-auth';
import { RevisionReviewStates } from 'ember-osf-web/models/revision';
import Analytics from 'ember-osf-web/services/analytics';
import RevisionNavigationManager from 'registries/edit-revision/nav-manager';
import RevisionManager from 'registries/edit-revision/revision-manager';
Expand All @@ -29,6 +30,10 @@ export default class EditRevisionRoute extends Route {
const revision = await this.store.findRecord('revision', revisionId);
const registration = await revision.registration;
const provider = await registration.provider;
if ((registration.currentUserIsReadOnly && revision.reviewState !== RevisionReviewStates.Approved) ||
(revision.reviewState !== RevisionReviewStates.RevisionInProgress)) {
this.replaceWith('edit-revision.review', revisionId);
}
return {
revision,
registration,
Expand Down
Loading