34
34
use PKP \API \v1 \reviewers \suggestions \resources \ReviewerSuggestionResource ;
35
35
use PKP \submission \reviewRound \ReviewRound ;
36
36
use PKP \submission \reviewRound \ReviewRoundDAO ;
37
+ use PKP \submissionFile \SubmissionFile ;
37
38
use PKP \user \User ;
38
39
use PKP \userGroup \relationships \UserGroupStage ;
39
40
use PKP \userGroup \relationships \UserUserGroup ;
@@ -65,10 +66,12 @@ class Schema extends \PKP\core\maps\Schema
65
66
66
67
/** @var Enumerable Decisions associated with submissions. */
67
68
public Enumerable $ decisions ;
68
-
69
+
69
70
/** @var Enumerable Reviewer Suggestions associated with submissions. */
70
71
public Enumerable $ reviewerSuggestions ;
71
72
73
+ /** Workflow stage files associated with submissions. */
74
+ public Enumerable $ submissionStageFiles ;
72
75
/**
73
76
* Get extra property names used in the submissions list
74
77
*
@@ -137,7 +140,8 @@ public function map(
137
140
?Enumerable $ stageAssignments = null ,
138
141
?Enumerable $ decisions = null ,
139
142
bool |Collection $ anonymizeReviews = false ,
140
- ?Enumerable $ reviewerSuggestions = null
143
+ ?Enumerable $ reviewerSuggestions = null ,
144
+ ?Enumerable $ stageFiles = null
141
145
): array {
142
146
$ this ->userGroups = $ userGroups ;
143
147
$ this ->genres = $ genres ;
@@ -146,6 +150,7 @@ public function map(
146
150
$ this ->stageAssignments = $ stageAssignments ?? $ this ->getStageAssignmentsBySubmissions (collect ([$ item ]));
147
151
$ this ->decisions = $ decisions ?? Repo::decision ()->getCollector ()->filterBySubmissionIds ([$ item ->getId ()])->getMany ()->remember ();
148
152
$ this ->reviewerSuggestions = $ reviewerSuggestions ?? ReviewerSuggestion::withSubmissionIds ($ item ->getId ())->get ();
153
+ $ this ->submissionStageFiles = $ stageFiles ?? $ this ->getStageFilesBySubmissions (collect ([$ item ]), [SubmissionFile::SUBMISSION_FILE_COPYEDIT ]);
149
154
150
155
return $ this ->mapByProperties ($ this ->getProps (), $ item , $ anonymizeReviews );
151
156
}
@@ -169,14 +174,15 @@ public function summarize(
169
174
?Enumerable $ reviewAssignments = null ,
170
175
?Enumerable $ stageAssignments = null ,
171
176
bool |Collection $ anonymizeReviews = false ,
172
- ?Enumerable $ reviewerSuggestions = null
177
+ ?Enumerable $ reviewerSuggestions = null ,
178
+ ?Enumerable $ stageFiles = null
173
179
): array {
174
180
$ this ->userGroups = $ userGroups ;
175
181
$ this ->genres = $ genres ;
176
182
$ this ->reviewAssignments = $ reviewAssignments ?? Repo::reviewAssignment ()->getCollector ()->filterBySubmissionIds ([$ item ->getId ()])->getMany ()->remember ();
177
183
$ this ->stageAssignments = $ stageAssignments ?? $ this ->getStageAssignmentsBySubmissions (collect ([$ item ]));
178
184
$ this ->reviewerSuggestions = $ reviewerSuggestions ?? ReviewerSuggestion::withSubmissionIds ($ item ->getId ())->get ();
179
-
185
+ $ this -> submissionStageFiles = $ stageFiles ?? $ this -> getStageFilesBySubmissions ( collect ([ $ item ]), [SubmissionFile:: SUBMISSION_FILE_COPYEDIT ]);
180
186
return $ this ->mapByProperties ($ this ->getSummaryProps (), $ item , $ anonymizeReviews );
181
187
}
182
188
@@ -206,6 +212,7 @@ public function mapMany(
206
212
$ this ->reviewAssignments = Repo::reviewAssignment ()->getCollector ()->filterBySubmissionIds ($ submissionIds )->getMany ()->remember ();
207
213
$ this ->stageAssignments = $ this ->getStageAssignmentsBySubmissions ($ collection );
208
214
$ this ->decisions = Repo::decision ()->getCollector ()->filterBySubmissionIds ($ submissionIds )->getMany ()->remember ();
215
+ $ this ->submissionStageFiles = $ this ->getStageFilesBySubmissions ($ collection , [SubmissionFile::SUBMISSION_FILE_COPYEDIT ]);
209
216
210
217
$ associatedReviewAssignments = $ this ->reviewAssignments ->groupBy (fn (ReviewAssignment $ reviewAssignment , int $ key ) =>
211
218
$ reviewAssignment ->getData ('submissionId ' ));
@@ -216,17 +223,16 @@ public function mapMany(
216
223
$ decision ->getData ('submissionId ' )
217
224
);
218
225
219
- $ associatedStageAssignments = $ this ->stageAssignments
220
- ->groupBy (
221
- fn (StageAssignment $ stageAssignment , int $ key ) => $ stageAssignment ->submissionId
222
- );
223
-
224
226
/** @var \Illuminate\Support\LazyCollection $associatedReviewerSuggestions */
225
227
$ associatedReviewerSuggestions = ReviewerSuggestion::query ()
226
228
->withSubmissionIds ($ collection ->keys ()->toArray ())
227
229
->cursor ()
228
230
->groupBy ('submissionId ' );
229
231
232
+ $ associatedSubmissionStageFiles = $ this ->submissionStageFiles ->groupBy (
233
+ fn (SubmissionFile $ submissionFile , int $ key ) => $ submissionFile ->getData ('submissionId ' )
234
+ );
235
+
230
236
return $ collection ->map (
231
237
fn ($ item ) =>
232
238
$ this ->map (
@@ -238,7 +244,8 @@ public function mapMany(
238
244
$ associatedStageAssignments ->get ($ item ->getId ()),
239
245
$ associatedDecisions ->get ($ item ->getId ()),
240
246
$ anonymizeReviews ,
241
- $ associatedReviewerSuggestions ->get ($ item ->getId ())
247
+ $ associatedReviewerSuggestions ->get ($ item ->getId ()),
248
+ $ associatedSubmissionStageFiles ->get ($ item ->getId ())
242
249
)
243
250
);
244
251
}
@@ -259,6 +266,7 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
259
266
$ this ->genres = $ genres ;
260
267
$ this ->reviewAssignments = Repo::reviewAssignment ()->getCollector ()->filterBySubmissionIds ($ collection ->keys ()->toArray ())->getMany ()->remember ();
261
268
$ this ->stageAssignments = $ this ->getStageAssignmentsBySubmissions ($ collection );
269
+ $ this ->submissionStageFiles = $ this ->getStageFilesBySubmissions ($ collection , [SubmissionFile::SUBMISSION_FILE_COPYEDIT ]);
262
270
263
271
$ associatedReviewAssignments = $ this ->reviewAssignments ->groupBy (
264
272
fn (ReviewAssignment $ reviewAssignment , int $ key ) =>
@@ -276,6 +284,10 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
276
284
->cursor ()
277
285
->groupBy ('submissionId ' );
278
286
287
+ $ associatedSubmissionStageFiles = $ this ->submissionStageFiles ->groupBy (
288
+ fn (SubmissionFile $ submissionFile , int $ key ) => $ submissionFile ->getData ('submissionId ' )
289
+ );
290
+
279
291
return $ collection ->map (
280
292
fn ($ item ) =>
281
293
$ this ->summarize (
@@ -285,7 +297,8 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
285
297
$ associatedReviewAssignments ->get ($ item ->getId ()),
286
298
$ associatedStageAssignment ->get ($ item ->getId ()),
287
299
$ anonymizeReviews ,
288
- $ associatedReviewerSuggestions ->get ($ item ->getId ())
300
+ $ associatedReviewerSuggestions ->get ($ item ->getId ()),
301
+ $ associatedSubmissionStageFiles ->get ($ item ->getId ())
289
302
)
290
303
);
291
304
}
@@ -298,6 +311,7 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
298
311
* @param ?Enumerable $reviewAssignments review assignments associated with a submission
299
312
* @param ?Enumerable $stageAssignments stage assignments associated with a submission
300
313
* @param bool|Collection<int> $anonymizeReviews List of review assignment IDs to anonymize
314
+ * @param ?Enumerable<int, SubmissionFile> $stageFiles List of stage files associated with a submission
301
315
*/
302
316
public function mapToSubmissionsList (
303
317
Submission $ item ,
@@ -306,15 +320,16 @@ public function mapToSubmissionsList(
306
320
?Enumerable $ reviewAssignments = null ,
307
321
?Enumerable $ stageAssignments = null ,
308
322
?Enumerable $ decisions = null ,
309
- bool |Collection $ anonymizeReviews = false
323
+ bool |Collection $ anonymizeReviews = false ,
324
+ ?Enumerable $ stageFiles = null
310
325
): array {
311
326
$ this ->userGroups = $ userGroups ;
312
327
$ this ->genres = $ genres ;
313
328
$ this ->reviewAssignments = $ reviewAssignments ?? Repo::reviewAssignment ()->getCollector ()->filterBySubmissionIds ([$ item ->getId ()])->getMany ()->remember ();
314
329
$ this ->stageAssignments = $ stageAssignments ?? $ this ->getStageAssignmentsBySubmissions (collect ([$ item ]));
315
330
$ this ->decisions = $ decisions ?? Repo::decision ()->getCollector ()->filterBySubmissionIds ([$ item ->getId ()])->getMany ()->remember ();
316
331
$ this ->reviewerSuggestions = $ reviewerSuggestions ?? ReviewerSuggestion::withSubmissionIds ($ item ->getId ())->get ();
317
-
332
+ $ this -> submissionStageFiles = $ stageFiles ?? $ this -> getStageFilesBySubmissions ( collect ([ $ item ]), [SubmissionFile:: SUBMISSION_FILE_COPYEDIT ]);
318
333
return $ this ->mapByProperties ($ this ->getSubmissionsListProps (), $ item , $ anonymizeReviews );
319
334
}
320
335
@@ -345,7 +360,7 @@ public function mapManyToSubmissionsList(
345
360
$ this ->reviewAssignments = Repo::reviewAssignment ()->getCollector ()->filterBySubmissionIds ($ submissionIds )->getMany ()->remember ();
346
361
$ this ->stageAssignments = $ this ->getStageAssignmentsBySubmissions ($ collection );
347
362
$ this ->decisions = Repo::decision ()->getCollector ()->filterBySubmissionIds ($ submissionIds )->getMany ()->remember ();
348
-
363
+ $ this -> submissionStageFiles = $ this -> getStageFilesBySubmissions ( $ collection , [SubmissionFile:: SUBMISSION_FILE_COPYEDIT ]);
349
364
$ associatedReviewAssignments = $ this ->reviewAssignments ->groupBy (
350
365
fn (ReviewAssignment $ reviewAssignment , int $ key ) =>
351
366
$ reviewAssignment ->getData ('submissionId ' )
@@ -365,6 +380,10 @@ public function mapManyToSubmissionsList(
365
380
->cursor ()
366
381
->groupBy ('submissionId ' );
367
382
383
+ $ associatedSubmissionStageFiles = $ this ->submissionStageFiles ->groupBy (
384
+ fn (SubmissionFile $ submissionFile , int $ key ) => $ submissionFile ->getData ('submissionId ' )
385
+ );
386
+
368
387
return $ collection ->map (
369
388
fn ($ item ) =>
370
389
$ this ->mapToSubmissionsList (
@@ -375,7 +394,7 @@ public function mapManyToSubmissionsList(
375
394
$ associatedStageAssignments ->get ($ item ->getId ()),
376
395
$ associatedDecisions ->get ($ item ->getId ()),
377
396
$ anonymizeReviews ,
378
- $ associatedReviewerSuggestions ->get ($ item ->getId ())
397
+ $ associatedSubmissionStageFiles ->get ($ item ->getId ())
379
398
)
380
399
);
381
400
}
@@ -439,7 +458,7 @@ protected function mapByProperties(array $props, Submission $submission, bool|Co
439
458
$ reviewRounds = $ this ->getReviewRoundsFromSubmission ($ submission );
440
459
$ currentReviewRound = $ reviewRounds ->sortKeys ()->last (); /** @var ReviewRound|null $currentReviewRound */
441
460
$ stages = in_array ('stages ' , $ props ) ?
442
- $ this ->getPropertyStages ($ this ->stageAssignments , $ this ->reviewAssignments , $ submission , $ this ->decisions ?? null , $ currentReviewRound ) :
461
+ $ this ->getPropertyStages ($ this ->stageAssignments , $ this ->reviewAssignments , $ submission , $ this ->submissionStageFiles , $ this -> decisions ?? null , $ currentReviewRound ) :
443
462
[];
444
463
445
464
foreach ($ props as $ prop ) {
@@ -518,7 +537,7 @@ protected function mapByProperties(array $props, Submission $submission, bool|Co
518
537
case 'urlWorkflow ' :
519
538
$ output [$ prop ] = Repo::submission ()->getWorkflowUrlByUserRoles ($ submission );
520
539
break ;
521
- case 'reviewerSuggestions ' :
540
+ case 'reviewerSuggestions ' :
522
541
$ output [$ prop ] = $ this ->getPropertyReviewerSuggestions ($ this ->reviewerSuggestions );
523
542
break ;
524
543
default :
@@ -566,7 +585,7 @@ protected function canChangeMetadata(Enumerable $stageAssignments, Submission $s
566
585
567
586
return false ;
568
587
}
569
-
588
+
570
589
/**
571
590
* Get details about the reviewer suggestions for a submission
572
591
*/
@@ -588,11 +607,11 @@ protected function getPropertyReviewerSuggestions(Enumerable $reviewerSuggestion
588
607
)
589
608
)->map (
590
609
fn (array $ suggestion ): array => array_intersect_key (
591
- $ suggestion ,
610
+ $ suggestion ,
592
611
array_flip ($ reviewerSuggestionProps )
593
612
)
594
613
)->toArray ();
595
-
614
+
596
615
return $ reviewerSuggestions ;
597
616
}
598
617
@@ -783,6 +802,7 @@ protected function getPropertyParticipants(Submission $submission): array
783
802
* `currentUserAssignedRoles` array the roles of the current user in the submission per stage, user may be unassigned but have global manager role
784
803
* `currentUserCanRecommendOnly` whether the current user is an editor with the recommend only flag
785
804
* `currentUserRecommendation` object includes the recommendation decision of the current user
805
+ * `uploadedFilesCount` int || null the count of files upload to the stage. A null value indicates that the count was not included
786
806
* {
787
807
* `decision` => recommendation decision,
788
808
* `label` => decision label
@@ -798,7 +818,7 @@ protected function getPropertyParticipants(Submission $submission): array
798
818
* }
799
819
* ]
800
820
*/
801
- protected function getPropertyStages (Enumerable $ stageAssignments , Enumerable $ reviewAssignments , Submission $ submission , ?Enumerable $ decisions , ?ReviewRound $ currentReviewRound ): array
821
+ protected function getPropertyStages (Enumerable $ stageAssignments , Enumerable $ reviewAssignments , Submission $ submission , Enumerable $ stageFiles , ?Enumerable $ decisions , ?ReviewRound $ currentReviewRound ): array
802
822
{
803
823
$ request = Application::get ()->getRequest ();
804
824
$ currentUser = $ request ->getUser ();
@@ -817,6 +837,14 @@ protected function getPropertyStages(Enumerable $stageAssignments, Enumerable $r
817
837
'editorAssigned ' => false ,
818
838
'currentUserAssignedRoles ' => [],
819
839
];
840
+
841
+ if ($ stageId === WORKFLOW_STAGE_ID_EDITING ) {
842
+ $ stages [$ stageId ]['uploadedFilesCount ' ] = $ stageFiles ->filter (fn (SubmissionFile $ file ) => $ file ->getData ('fileStage ' ) == SubmissionFile::SUBMISSION_FILE_COPYEDIT )->count ();
843
+ } else {
844
+ // A `null` value is used to indicate that no count data is available.
845
+ // This is also done to ensure that all stage objects has the same properties
846
+ $ stages [$ stageId ]['uploadedFilesCount ' ] = null ;
847
+ }
820
848
}
821
849
822
850
$ isAssignedInAnyRole = false ; // Determine if the current user is assigned to the submission in any role
@@ -892,7 +920,7 @@ protected function getPropertyStages(Enumerable $stageAssignments, Enumerable $r
892
920
// if the current user is not assigned in any non-revoked role but has a global role as a manager or admin, consider it in the submission
893
921
if (!$ isAssignedInAnyRole ) {
894
922
$ hasCurrentUserReviewAssignment = $ this ->reviewAssignments ->contains (
895
- fn (ReviewAssignment $ reviewAssignment ) =>
923
+ fn (ReviewAssignment $ reviewAssignment ) =>
896
924
$ reviewAssignment ->getReviewerId () === $ currentUser ->getId () &&
897
925
!$ reviewAssignment ->getDeclined () &&
898
926
!$ reviewAssignment ->getCancelled ()
@@ -1143,4 +1171,25 @@ protected function checkDecisionPermissions(int $stageId, Submission $submission
1143
1171
'isOnlyRecommending ' => $ isOnlyRecommending
1144
1172
];
1145
1173
}
1174
+
1175
+ /**
1176
+ *
1177
+ * @param Enumerable<Submission> $submissions
1178
+ * @param array $stageIds The IDs of the stages to limit results to
1179
+ *
1180
+ * @return LazyCollection<SubmissionFile> The collection of files associated with submissions
1181
+ */
1182
+ protected function getStageFilesBySubmissions (Enumerable $ submissions , array $ stageIds ): LazyCollection
1183
+ {
1184
+ $ submissionIds = [];
1185
+ $ submissions ->each (function (Submission $ submission ) use (&$ submissionIds ) {
1186
+ $ submissionIds [] = $ submission ->getId ();
1187
+ });
1188
+
1189
+ return Repo::submissionFile ()
1190
+ ->getCollector ()
1191
+ ->filterBySubmissionIds ($ submissionIds )
1192
+ ->filterByFileStages ($ stageIds )
1193
+ ->getMany ();
1194
+ }
1146
1195
}
0 commit comments