Skip to content

Commit a5fdf5c

Browse files
committed
only allow editing on UI if status is inprogress or updates required, add banner informing submitter, change button to indicate read only, no extra pop ups, if status updatesrequired and edits made on UI make status inprogress
1 parent 5dadbe2 commit a5fdf5c

File tree

7 files changed

+116
-42
lines changed

7 files changed

+116
-42
lines changed

nmdc_server/api.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1242,8 +1242,15 @@ async def update_submission(
12421242
crud.update_submission_contributor_roles(db, submission, new_permissions)
12431243

12441244
if body_dict.get("status", None):
1245+
new_status = body_dict["status"]
1246+
allowed_transitions = {
1247+
SubmissionStatusEnum.UpdatesRequired.text: SubmissionStatusEnum.InProgress.text,
1248+
SubmissionStatusEnum.InProgress.text: SubmissionStatusEnum.SubmittedPendingReview.text
1249+
}
1250+
current_status = submission.status
12451251
if (
1246-
body_dict.get("status", None) == SubmissionStatusEnum.SubmittedPendingReview.text
1252+
current_status in allowed_transitions
1253+
and new_status in allowed_transitions[current_status]
12471254
and submission.is_test_submission is False
12481255
):
12491256
submission.status = body_dict["status"]

web/src/views/SubmissionPortal/Components/MultiOmicsDataForm.vue

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Definitions from '@/definitions';
1212
import doiProviderValues from '@/schema';
1313
import {
1414
multiOmicsForm, multiOmicsFormValid, multiOmicsAssociations, checkJGITemplates, canEditSubmissionMetadata, addAwardDoi, removeAwardDoi,
15-
templateHasData, checkDoiFormat,
15+
templateHasData, checkDoiFormat, canEditSubmissionByStatus, submissionStatus, status,
1616
} from '../store';
1717
import { AwardTypes, HARMONIZER_TEMPLATES } from '@/views/SubmissionPortal/types';
1818
@@ -160,6 +160,9 @@ export default defineComponent({
160160
canEditSubmissionMetadata,
161161
checkJGITemplates,
162162
templateHasData,
163+
canEditSubmissionByStatus,
164+
submissionStatus,
165+
status,
163166
};
164167
},
165168
});
@@ -175,8 +178,15 @@ export default defineComponent({
175178
Information about the type of samples being submitted.
176179
</div>
177180
<submission-permission-banner
178-
v-if="!canEditSubmissionMetadata()"
181+
v-if="canEditSubmissionByStatus() && !canEditSubmissionMetadata()"
179182
/>
183+
<v-alert
184+
v-if="!canEditSubmissionByStatus()"
185+
type="info"
186+
class="ma-2"
187+
>
188+
This submission has status "{{ submissionStatus[status] }}" and cannot be edited.
189+
</v-alert>
180190
<v-form
181191
ref="formRef"
182192
v-model="multiOmicsFormValid"

web/src/views/SubmissionPortal/Components/StudyForm.vue

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ import {
1818
isOwner,
1919
canEditSubmissionMetadata,
2020
checkDoiFormat,
21+
canEditSubmissionByStatus,
22+
submissionStatus,
23+
status,
2124
} from '../store';
2225
import { PermissionTitle } from '@/views/SubmissionPortal/types';
2326
import { stateRefs } from '@/store';
@@ -129,6 +132,9 @@ export default defineComponent({
129132
currentUserOrcid,
130133
permissionHelpText,
131134
checkDoiFormat,
135+
canEditSubmissionByStatus,
136+
submissionStatus,
137+
status,
132138
};
133139
},
134140
});
@@ -144,8 +150,15 @@ export default defineComponent({
144150
{{ NmdcSchema.classes.Study.description }}
145151
</div>
146152
<submission-permission-banner
147-
v-if="!canEditSubmissionMetadata()"
153+
v-if="canEditSubmissionByStatus() && !canEditSubmissionMetadata()"
148154
/>
155+
<v-alert
156+
v-if="!canEditSubmissionByStatus()"
157+
type="info"
158+
class="ma-2"
159+
>
160+
This submission has status "{{ submissionStatus[status] }}" and cannot be edited.
161+
</v-alert>
149162
<v-form
150163
ref="formRef"
151164
v-model="studyFormValid"

web/src/views/SubmissionPortal/Components/SubmissionList.vue

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ export default defineComponent({
8989
};
9090
}
9191
92+
function editablebyStatus(item: MetadataSubmissionRecord) {
93+
const editableStatuses = ['InProgress', 'UpdatesRequired'];
94+
return editableStatuses.includes(item.status);
95+
}
96+
9297
async function resume(item: MetadataSubmissionRecord) {
9398
router?.push({ name: 'Study Form', params: { id: item.id } });
9499
}
@@ -145,6 +150,7 @@ export default defineComponent({
145150
options,
146151
submission,
147152
testFilterValues,
153+
editablebyStatus,
148154
};
149155
},
150156
});
@@ -300,10 +306,14 @@ export default defineComponent({
300306
color="primary"
301307
@click="() => resume(item)"
302308
>
303-
Resume
304-
<v-icon class="pl-1">
305-
mdi-arrow-right-circle
306-
</v-icon>
309+
<span v-if="editablebyStatus(item)">
310+
<v-icon class="pl-1">mdi-arrow-right-circle</v-icon>
311+
Resume
312+
</span>
313+
<span v-else>
314+
<v-icon class="pl-1">mdi-eye</v-icon>
315+
View
316+
</span>
307317
</v-btn>
308318
<v-menu
309319
offset-x

web/src/views/SubmissionPortal/Components/TemplateChooser.vue

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import {
55
packageName,
66
canEditSubmissionMetadata,
77
templateHasData,
8+
canEditSubmissionByStatus,
9+
submissionStatus,
10+
status,
811
} from '../store';
912
import SubmissionDocsLink from './SubmissionDocsLink.vue';
1013
import SubmissionPermissionBanner from './SubmissionPermissionBanner.vue';
@@ -24,6 +27,9 @@ export default defineComponent({
2427
templateListDisplayNames,
2528
canEditSubmissionMetadata,
2629
templateHasData,
30+
canEditSubmissionByStatus,
31+
submissionStatus,
32+
status,
2733
};
2834
},
2935
});
@@ -45,9 +51,15 @@ export default defineComponent({
4551
for your samples.
4652
</div>
4753
<submission-permission-banner
48-
v-if="!canEditSubmissionMetadata()"
54+
v-if="canEditSubmissionByStatus() && !canEditSubmissionMetadata()"
4955
/>
50-
56+
<v-alert
57+
v-if="!canEditSubmissionByStatus()"
58+
type="info"
59+
class="ma-2"
60+
>
61+
This submission has status "{{ submissionStatus[status] }}" and cannot be edited.
62+
</v-alert>
5163
<v-checkbox
5264
v-for="option in templates.filter((v) => v[1].status === 'published')"
5365
:key="option[0]"
@@ -72,35 +84,47 @@ export default defineComponent({
7284
:label="HARMONIZER_TEMPLATES[option[0]].displayName"
7385
:value="option[0]"
7486
/>
75-
<v-alert
76-
v-if="!templateHasData('all')"
77-
color="grey lighten-2"
78-
class="mt-3"
79-
>
80-
<p class="text-h5">
81-
DataHarmonizer Template Choice
82-
</p>
83-
<template
84-
v-if="packageName.length!=0"
87+
<template v-if="canEditSubmissionByStatus()">
88+
<v-alert
89+
v-if="!templateHasData('all')"
90+
color="grey lighten-2"
91+
class="mt-3"
8592
>
86-
Your DataHarmonizer template is "{{ templateListDisplayNames }}".
87-
</template>
88-
<template
93+
<p class="text-h5">
94+
DataHarmonizer Template Choice
95+
</p>
96+
<template
97+
v-if="packageName.length!=0"
98+
>
99+
Your DataHarmonizer template is "{{ templateListDisplayNames }}".
100+
</template>
101+
<template
102+
v-else
103+
>
104+
Please Select One or More Options for Your Template.
105+
</template>
106+
</v-alert>
107+
<v-alert
89108
v-else
109+
type="warning"
90110
>
91-
Please Select One or More Options for Your Template.
92-
</template>
93-
</v-alert>
111+
<p class="text-h5">
112+
Template choice disabled
113+
</p>
114+
Your DataHarmonizer template is "{{ templateListDisplayNames }}".
115+
Template choices cannot be disabled while the matching tab in step 5 has data present.
116+
To disable the template, return to step 5 and remove all data from that tab. You may add new templates at any time.
117+
</v-alert>
118+
</template>
94119
<v-alert
95-
v-else
96-
type="warning"
120+
v-if="!canEditSubmissionByStatus() && packageName.length > 0"
121+
color="grey lighten-2"
122+
class="mt-3"
97123
>
98124
<p class="text-h5">
99-
Template choice disabled
125+
DataHarmonizer Template
100126
</p>
101-
Your DataHarmonizer template is "{{ templateListDisplayNames }}".
102-
Template choices cannot be disabled while the matching tab in step 5 has data present.
103-
To disable the template, return to step 5 and remove all data from that tab. You may add new templates at any time.
127+
This submission uses the "{{ templateListDisplayNames }}" template.
104128
</v-alert>
105129
<div class="d-flex">
106130
<v-btn

web/src/views/SubmissionPortal/HarmonizerView.vue

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ export default defineComponent({
455455
const data = await harmonizerApi.exportJson();
456456
mergeSampleData(activeTemplate.value.sampleDataSlot, data);
457457
await submit(root.$route.params.id, 'SubmittedPendingReview');
458+
status.value = 'SubmittedPendingReview';
458459
submitDialog.value = false;
459460
});
460461
@@ -580,6 +581,14 @@ export default defineComponent({
580581
addHooks();
581582
}
582583
584+
watch(() => canEditSampleMetadata(), (canEdit) => {
585+
if (harmonizerApi.ready.value) {
586+
if (!canEdit) {
587+
harmonizerApi.setTableReadOnly();
588+
}
589+
}
590+
});
591+
583592
onMounted(async () => {
584593
const [schema, goldEcosystemTree] = await schemaRequest(() => Promise.all([
585594
api.getSubmissionSchema(),
@@ -662,11 +671,12 @@ export default defineComponent({
662671
>
663672
<SubmissionStepper />
664673
<submission-permission-banner
665-
v-if="!canEditSampleMetadata() && canEditSubmissionByStatus()"
674+
v-if="canEditSubmissionByStatus() && !canEditSampleMetadata()"
666675
/>
667676
<v-alert
668677
v-if="!canEditSubmissionByStatus()"
669678
type="info"
679+
class="ma-2"
670680
>
671681
This submission has status "{{ submissionStatus[status] }}" and cannot be edited.
672682
</v-alert>
@@ -1017,7 +1027,9 @@ export default defineComponent({
10171027
</v-chip>
10181028
</div>
10191029
<v-spacer />
1020-
<v-tooltip top>
1030+
<v-tooltip
1031+
top
1032+
>
10211033
<template #activator="{ on, attrs }">
10221034
<div
10231035
v-bind="attrs"
@@ -1028,7 +1040,7 @@ export default defineComponent({
10281040
depressed
10291041
:disabled="!canSubmit || status !== 'InProgress' || submitCount > 0"
10301042
:loading="submitLoading"
1031-
@click="submitDialog = true"
1043+
@click="canEditSubmissionByStatus() ? submitDialog = true: null"
10321044
>
10331045
<span v-if="status === 'SubmittedPendingReview' || submitCount">
10341046
<v-icon>mdi-check-circle</v-icon>
@@ -1082,10 +1094,10 @@ export default defineComponent({
10821094
</v-btn>
10831095
</div>
10841096
</template>
1085-
<span v-if="!canSubmit">
1097+
<span v-if="!canSubmit && canEditSubmissionByStatus()">
10861098
You must validate all tabs before submitting your study and metadata.
10871099
</span>
1088-
<span v-else>
1100+
<span v-if="canSubmit && canEditSubmissionByStatus()">
10891101
Submit for NMDC review.
10901102
</span>
10911103
</v-tooltip>

web/src/views/SubmissionPortal/store/index.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -405,15 +405,13 @@ function reset() {
405405
}
406406

407407
async function incrementalSaveRecord(id: string): Promise<number | void> {
408-
if (!['InProgress', 'UpdatesRequired'].includes(status.value)) {
409-
throw new Error(`Cannot edit while status is ${submissionStatus[status.value]}`);
410-
}
411408
if (!canEditSampleMetadata()) {
412409
return Promise.resolve();
413410
}
414411
if (!canEditSubmissionByStatus()) {
415412
return Promise.resolve();
416413
}
414+
417415
let payload: Partial<MetadataSubmission> = {};
418416
let permissions: Record<string, PermissionLevelValues> | undefined;
419417
if (isOwner()) {
@@ -428,8 +426,8 @@ async function incrementalSaveRecord(id: string): Promise<number | void> {
428426
}
429427

430428
if (hasChanged.value) {
431-
status.value = 'InProgress';
432-
const response = await api.updateRecord(id, payload, status.value, permissions);
429+
const updatedStatus = 'InProgress';
430+
const response = await api.updateRecord(id, payload, updatedStatus, permissions);
433431
hasChanged.value = 0;
434432
return response.httpStatus;
435433
}

0 commit comments

Comments
 (0)