@@ -26,20 +26,20 @@ export default defineComponent({
2626 },
2727 inject: [' user' , ' MIQAConfig' ],
2828 setup() {
29+ const { switchReviewMode } = store .commit ;
2930 const loadingProjects = ref (true );
3031 store .dispatch .loadProjects ().then (() => {
3132 loadingProjects .value = false ;
3233 });
34+ const reviewMode = computed (() => store .state .reviewMode );
35+ const complete = window .location .hash .includes (' complete' );
3336 const currentProject = computed (() => store .state .currentProject );
3437 const currentTaskOverview = computed (() => store .state .currentTaskOverview );
3538 const projects = computed (() => store .state .projects );
3639 const isGlobal = computed (() => store .getters .isGlobal );
3740 const selectedProjectIndex = ref (projects .value .findIndex (
3841 (project ) => project .id === currentProject .value ?.id ,
3942 ));
40- const selectProject = (project : Project ) => {
41- store .dispatch .loadProject (project );
42- };
4343 const selectGlobal = () => {
4444 store .dispatch .loadGlobal ();
4545 };
@@ -88,29 +88,51 @@ export default defineComponent({
8888 );
8989 }
9090
91+ async function getProjectFromURL() {
92+ if (complete ) {
93+ const targetProjectIndex = projects .value .findIndex (
94+ (project ) => project .id === window .location .hash .split (' /' )[1 ],
95+ );
96+ const targetProject = projects .value [targetProjectIndex ];
97+ if (targetProject ) store .commit .setCurrentProject (targetProject );
98+ selectedProjectIndex .value = targetProjectIndex ;
99+ }
100+ }
101+
91102 const overviewPoll = setInterval (refreshTaskOverview , 10000 );
92103 watch (currentTaskOverview , setOverviewSections );
93104 watch (currentProject , refreshTaskOverview );
105+ watch (projects , getProjectFromURL );
94106
95107 return {
108+ reviewMode ,
109+ switchReviewMode ,
110+ complete ,
96111 currentProject ,
97112 loadingProjects ,
98113 currentTaskOverview ,
99114 selectedProjectIndex ,
100115 projects ,
101116 isGlobal ,
102117 overviewPoll ,
103- selectProject ,
104118 selectGlobal ,
105119 overviewSections ,
106120 setOverviewSections ,
107121 refreshAllTaskOverviews ,
122+ getProjectFromURL ,
108123 };
109124 },
110125 data : () => ({
111126 creating: false ,
112127 newName: ' ' ,
113128 }),
129+ watch: {
130+ projects() {
131+ this .$nextTick (() => {
132+ if (this .$refs .proceed ) this .$refs .proceed .$el .focus ();
133+ });
134+ },
135+ },
114136 mounted() {
115137 this .setOverviewSections ();
116138 window .addEventListener (' keydown' , (event ) => {
@@ -130,6 +152,12 @@ export default defineComponent({
130152 },
131153 methods: {
132154 ... mapMutations ([' setProjects' , ' setCurrentProject' ]),
155+ selectProject(project : Project ) {
156+ if (this .complete ) {
157+ this .complete = false ;
158+ }
159+ store .dispatch .loadProject (project );
160+ },
133161 async createProject() {
134162 if (this .creating && this .newName .length > 0 ) {
135163 try {
@@ -150,6 +178,26 @@ export default defineComponent({
150178 }
151179 }
152180 },
181+ async proceedToNext() {
182+ const nextProject = this .projects [this .selectedProjectIndex + 1 ];
183+ store .dispatch .loadProject (nextProject );
184+ this .selectedProjectIndex += 1 ;
185+ await djangoRest .projectTaskOverview (nextProject .id ).then (
186+ (taskOverview ) => {
187+ let nextScanIndex = 0 ;
188+ let nextScan;
189+ let nextScanState;
190+ while (
191+ ! nextScan || (nextScanState === ' complete' && this .reviewMode )
192+ ) {
193+ nextScan = nextProject .experiments [0 ].scans [nextScanIndex ];
194+ nextScanState = taskOverview .scan_states [nextScan .id ];
195+ nextScanIndex += 1 ;
196+ }
197+ this .$router .push (` /${nextProject .id }/${nextScan .id } ` || ' ' );
198+ },
199+ );
200+ },
153201 },
154202});
155203 </script >
@@ -240,7 +288,7 @@ export default defineComponent({
240288 </v-navigation-drawer >
241289 </v-card >
242290 <div
243- v-if =" currentProject !== undefined"
291+ v-if =" currentProject !== undefined && !complete "
244292 class =" flex-grow-1 ma-3 pa-5"
245293 >
246294 <v-card-title v-if =" isGlobal" >
@@ -304,7 +352,41 @@ export default defineComponent({
304352 fill-height
305353 >
306354 <div
307- v-if =" projects.length > 0"
355+ v-if =" complete"
356+ class =" title text-center"
357+ >
358+ Viewed all scans in Project {{ currentProject.name }}.
359+ <div
360+ v-if =" selectedProjectIndex + 1 < projects.length"
361+ >
362+ Proceed to next Project, {{ projects[selectedProjectIndex+1].name }}?
363+ <br >
364+ <v-form @submit.prevent =" proceedToNext" >
365+ <v-btn
366+ ref =" proceed"
367+ class =" my-3"
368+ type =" submit"
369+ >
370+ Proceed
371+ </v-btn >
372+ </v-form >
373+ </div >
374+ <v-subheader
375+ class =" mode-toggle"
376+ >
377+ <span >All scans</span >
378+ <v-switch
379+ :input-value =" reviewMode"
380+ dense
381+ style =" display : inline-block ; max-height : 40px ; max-width : 60px ;"
382+ class =" px-3 ma-0"
383+ @change =" switchReviewMode"
384+ />
385+ <span >Scans for my review</span >
386+ </v-subheader >
387+ </div >
388+ <div
389+ v-else-if =" projects.length > 0"
308390 class =" title"
309391 >
310392 Select a project
@@ -348,4 +430,8 @@ export default defineComponent({
348430 width : 100% ;
349431 text-align : center ;
350432}
433+ .mode-toggle {
434+ align-items : baseline ;
435+ display : inline-block ;
436+ }
351437 </style >
0 commit comments