Skip to content

Commit

Permalink
#6057 Fix OMP compatibility in submission file refactor
Browse files Browse the repository at this point in the history
- Fix invalid database value for empty published date
- Fix author access to internal revision files
- Fix submission file grids to support internal review files
- Fix submission file metadata tab
- Fix remaining references to old submission file table column names
- Fix missing locale key when logged in as
- Fix embedded CSS files in HTML galleys
- Fix tests to support multiple submission files and genres
- Move app-specific migration code to apps
  • Loading branch information
NateWr committed Oct 27, 2020
1 parent 31b98d3 commit 8c87989
Show file tree
Hide file tree
Showing 21 changed files with 108 additions and 48 deletions.
2 changes: 1 addition & 1 deletion classes/controllers/grid/CategoryGridHandler.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ function hasGridDataElementsInCategory($categoryElement, $request) {
* Get the number of elements inside the passed category element.
* @param $categoryElement mixed
* @param $request PKPRequest
* @return int
* @return int
*/
function getCategoryItemsCount($categoryElement, $request) {
$data = $this->getGridCategoryDataElements($request, $categoryElement);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,16 @@ function _initiateReviewRound($submission, $stageId, $request, $status = null) {

// Add the selected files to the new round.
$submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
$fileStage = $stageId == WORKFLOW_STAGE_ID_INTERNAL_REVIEW
? SUBMISSION_FILE_INTERNAL_REVIEW_FILE
: SUBMISSION_FILE_REVIEW_FILE;

foreach (array('selectedFiles', 'selectedAttachments') as $userVar) {
$selectedFiles = $this->getData($userVar);
if(is_array($selectedFiles)) {
foreach ($selectedFiles as $fileId) {
$newSubmissionFile = Services::get('submissionFile')->get($fileId);
$newSubmissionFile->setData('fileStage', SUBMISSION_FILE_REVIEW_FILE);
$newSubmissionFile->setData('fileStage', $fileStage);
$newSubmissionFile->setData('sourceSubmissionFileId', $fileId);
$newSubmissionFile->setData('assocType', null);
$newSubmissionFile->setData('assocId', null);
Expand Down
16 changes: 0 additions & 16 deletions classes/migration/upgrade/PKPv3_3_0UpgradeMigration.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -330,18 +330,6 @@ private function _migrateSubmissionFiles() {
]);
}

// Update file stage for all internal review files
Capsule::table('submission_files as sf')
->leftJoin('review_round_files as rrf', 'sf.file_id', '=', 'rrf.file_id')
->where('sf.file_stage', '=', SUBMISSION_FILE_REVIEW_FILE)
->where('rrf.stage_id', '=', WORKFLOW_STAGE_ID_INTERNAL_REVIEW)
->update(['sf.file_stage' => SUBMISSION_FILE_INTERNAL_REVIEW_FILE]);
Capsule::table('submission_files as sf')
->leftJoin('review_round_files as rrf', 'sf.file_id', '=', 'rrf.file_id')
->where('sf.file_stage', '=', SUBMISSION_FILE_REVIEW_REVISION)
->where('rrf.stage_id', '=', WORKFLOW_STAGE_ID_INTERNAL_REVIEW)
->update(['sf.file_stage' => SUBMISSION_FILE_INTERNAL_REVIEW_REVISION]);

// Update name of event log params to reflect new file structure
Capsule::table('event_log_settings')
->where('setting_name', 'fileId')
Expand Down Expand Up @@ -380,10 +368,6 @@ private function _migrateSubmissionFiles() {
$table->renameColumn('file_id', 'submission_file_id');
$table->foreign('submission_file_id')->references('submission_file_id')->on('submission_files');
});
Capsule::schema()->table('publication_galleys', function (Blueprint $table) {
$table->renameColumn('file_id', 'submission_file_id');
$table->foreign('submission_file_id')->references('submission_file_id')->on('submission_files');
});
Capsule::schema()->table('submission_file_revisions', function (Blueprint $table) {
$table->foreign('submission_file_id')->references('submission_file_id')->on('submission_files');
$table->foreign('file_id')->references('file_id')->on('files');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ function buildFileAccessPolicy($request, $args, $roleAssignments, $mode, $submis
// 3f) ...or the file is at revision stage...
$authorFileAccessOptionsPolicy->addPolicy(new SubmissionFileStageRequiredPolicy($request, $submissionFileId, SUBMISSION_FILE_REVIEW_REVISION));

// 3f) ...or the file is at revision stage...
$authorFileAccessOptionsPolicy->addPolicy(new SubmissionFileStageRequiredPolicy($request, $submissionFileId, SUBMISSION_FILE_INTERNAL_REVIEW_REVISION));

// 3g) ...or the file is a copyedited file...
$authorFileAccessOptionsPolicy->addPolicy(new SubmissionFileStageRequiredPolicy($request, $submissionFileId, SUBMISSION_FILE_COPYEDIT));

Expand Down
2 changes: 1 addition & 1 deletion classes/services/PKPPublicationService.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ public function add($publication, $request) {
public function version($publication, $request) {
$newPublication = clone $publication;
$newPublication->setData('id', null);
$newPublication->setData('datePublished', '');
$newPublication->setData('datePublished', null);
$newPublication->setData('status', STATUS_QUEUED);
$newPublication->setData('version', $publication->getData('version') + 1);
$newPublication->stampModified();
Expand Down
2 changes: 2 additions & 0 deletions classes/services/PKPSubmissionFileService.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -776,8 +776,10 @@ public function getWorkflowStageId($submissionFile) {
$parentFile = Services::get('submissionFile')->get($submissionFile->getData('assocId'));
return $this->getWorkflowStageId($parentFile);
case SUBMISSION_FILE_REVIEW_FILE:
case SUBMISSION_FILE_INTERNAL_REVIEW_FILE:
case SUBMISSION_FILE_REVIEW_ATTACHMENT:
case SUBMISSION_FILE_REVIEW_REVISION:
case SUBMISSION_FILE_INTERNAL_REVIEW_REVISION:
$reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
$reviewRound = $reviewRoundDao->getBySubmissionFileId($submissionFile->getId());
return $reviewRound->getStageId();
Expand Down
10 changes: 5 additions & 5 deletions classes/submission/PKPSubmissionFileDAO.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -262,9 +262,9 @@ function pubIdExists($pubIdType, $pubId, $excludePubObjectId, $contextId) {
$result = $this->retrieve(
'SELECT COUNT(*)
FROM submission_file_settings sfs
INNER JOIN submission_files sf ON sfs.file_id = sf.file_id
INNER JOIN submission_files sf ON sfs.submission_file_id = sf.submission_file_id
INNER JOIN submissions s ON sf.submission_id = s.submission_id
WHERE sfs.setting_name = ? AND sfs.setting_value = ? AND sfs.file_id <> ? AND s.context_id = ?',
WHERE sfs.setting_name = ? AND sfs.setting_value = ? AND sfs.submission_file_id <> ? AND s.context_id = ?',
array(
'pub-id::'.$pubIdType,
$pubId,
Expand All @@ -282,10 +282,10 @@ function pubIdExists($pubIdType, $pubId, $excludePubObjectId, $contextId) {
*/
function changePubId($pubObjectId, $pubIdType, $pubId) {
$idFields = array(
'file_id', 'locale', 'setting_name'
'submission_file_id', 'locale', 'setting_name'
);
$updateArray = array(
'file_id' => (int) $pubObjectId,
'submission_file_id' => (int) $pubObjectId,
'locale' => '',
'setting_name' => 'pub-id::'.$pubIdType,
'setting_type' => 'string',
Expand All @@ -301,7 +301,7 @@ function changePubId($pubObjectId, $pubIdType, $pubId) {
function deletePubId($pubObjectId, $pubIdType) {
$settingName = 'pub-id::'.$pubIdType;
$this->update(
'DELETE FROM submission_file_settings WHERE setting_name = ? AND file_id = ?',
'DELETE FROM submission_file_settings WHERE setting_name = ? AND submission_file_id = ?',
array(
$settingName,
(int)$pubObjectId
Expand Down
9 changes: 8 additions & 1 deletion classes/template/PKPTemplateManager.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -1041,6 +1041,11 @@ function setupBackendPage() {
}
}

// Load the manager.people.signedInAs locale key
if (Validation::isLoggedInAs()) {
AppLocale::requireComponents([LOCALE_COMPONENT_PKP_MANAGER, LOCALE_COMPONENT_APP_MANAGER]);
}

$this->setState([
'menu' => $menu,
'tasksUrl' => $tasksUrl,
Expand Down Expand Up @@ -1938,7 +1943,9 @@ function loadHtmlGalleyStyles($htmlContent, $embeddedFiles) {

$hasEmbeddedStyle = false;
foreach ($embeddedFiles as $embeddedFile) {
if ($embeddedFile->getFileType() === 'text/css') {
$path = Services::get('file')->getPath($embeddedFile->getData('fileId'));
$mimetype = Services::get('file')->fs->getMimetype($path);
if ($mimetype === 'text/css') {
$hasEmbeddedStyle = true;
break;
}
Expand Down
10 changes: 9 additions & 1 deletion controllers/api/file/linkAction/AddFileLinkAction.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ function __construct($request, $submissionId, $stageId, $uploaderRoles,
* SUBMISSION_FILE_* constants.
* @return array
*/
function _getTextLabels($fileStage) {
static function _getTextLabels($fileStage) {
static $textLabels = array(
SUBMISSION_FILE_SUBMISSION => array(
'wizardTitle' => 'submission.submit.uploadSubmissionFile',
Expand All @@ -91,6 +91,10 @@ function _getTextLabels($fileStage) {
'wizardTitle' => 'editor.submissionReview.uploadFile',
'buttonLabel' => 'editor.submissionReview.uploadFile'
),
SUBMISSION_FILE_INTERNAL_REVIEW_FILE => array(
'wizardTitle' => 'editor.submissionReview.uploadFile',
'buttonLabel' => 'editor.submissionReview.uploadFile'
),
SUBMISSION_FILE_REVIEW_ATTACHMENT => array(
'wizardTitle' => 'editor.submissionReview.uploadAttachment',
'buttonLabel' => 'editor.submissionReview.uploadAttachment'
Expand All @@ -103,6 +107,10 @@ function _getTextLabels($fileStage) {
'wizardTitle' => 'editor.submissionReview.uploadFile',
'buttonLabel' => 'submission.addFile'
),
SUBMISSION_FILE_INTERNAL_REVIEW_REVISION => array(
'wizardTitle' => 'editor.submissionReview.uploadFile',
'buttonLabel' => 'submission.addFile'
),
SUBMISSION_FILE_FINAL => array(
'wizardTitle' => 'submission.upload.finalDraft',
'buttonLabel' => 'submission.addFile'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,16 @@ function loadCategoryData($request, $categoryDataElement, $filter = null, $revie
$reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); /* @var $reviewRoundDao ReviewRoundDAO */
$reviewRound = $reviewRoundDao->getLastReviewRoundBySubmissionId($submission->getId(), $stageId);
}
$submissionFilesIterator = Services::get('submissionFile')->getMany([
'submissionIds' => [$submission->getId()],
'reviewRoundIds' => [$reviewRound->getId()],
'fileStages' => (array) $fileStage,
]);
$stageSubmissionFiles = iterator_to_array($submissionFilesIterator);
if ($reviewRound) {
$submissionFilesIterator = Services::get('submissionFile')->getMany([
'submissionIds' => [$submission->getId()],
'reviewRoundIds' => [$reviewRound->getId()],
'fileStages' => (array) $fileStage,
]);
$stageSubmissionFiles = iterator_to_array($submissionFilesIterator);
} else {
$stageSubmissionFiles = [];
}
} else {
// Filter the passed workflow stage files.
if (!$this->_submissionFiles) {
Expand Down Expand Up @@ -195,6 +199,8 @@ function _getFileStageByStageId($stageId) {
return SUBMISSION_FILE_SUBMISSION;
break;
case WORKFLOW_STAGE_ID_INTERNAL_REVIEW:
return SUBMISSION_FILE_INTERNAL_REVIEW_FILE;
break;
case WORKFLOW_STAGE_ID_EXTERNAL_REVIEW:
return SUBMISSION_FILE_REVIEW_FILE;
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ class AuthorReviewRevisionsGridHandler extends FileListGridHandler {
* Constructor
*/
function __construct() {
$stageId = (int) Application::get()->getRequest()->getUserVar('stageId');
$fileStage = $stageId === WORKFLOW_STAGE_ID_INTERNAL_REVIEW ? SUBMISSION_FILE_INTERNAL_REVIEW_REVISION : SUBMISSION_FILE_REVIEW_REVISION;
import('lib.pkp.controllers.grid.files.review.ReviewGridDataProvider');
parent::__construct(
new ReviewGridDataProvider(SUBMISSION_FILE_REVIEW_REVISION),
new ReviewGridDataProvider($fileStage),
null,
FILE_GRID_ADD|FILE_GRID_EDIT|FILE_GRID_DELETE
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@ class EditorReviewFilesGridHandler extends FileListGridHandler {
* Constructor
*/
function __construct() {
$stageId = (int) Application::get()->getRequest()->getUserVar('stageId');
$fileStage = $stageId === WORKFLOW_STAGE_ID_INTERNAL_REVIEW ? SUBMISSION_FILE_INTERNAL_REVIEW_FILE : SUBMISSION_FILE_REVIEW_FILE;
import('lib.pkp.controllers.grid.files.review.ReviewGridDataProvider');
parent::__construct(
new ReviewGridDataProvider(SUBMISSION_FILE_REVIEW_FILE),
new ReviewGridDataProvider($fileStage),
null,
FILE_GRID_EDIT|FILE_GRID_MANAGE|FILE_GRID_VIEW_NOTES|FILE_GRID_DELETE
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ class LimitReviewFilesGridHandler extends SelectableFileListGridHandler {
* Constructor
*/
function __construct() {
$stageId = (int) Application::get()->getRequest()->getUserVar('stageId');
$fileStage = $stageId === WORKFLOW_STAGE_ID_INTERNAL_REVIEW ? SUBMISSION_FILE_INTERNAL_REVIEW_FILE : SUBMISSION_FILE_REVIEW_FILE;
import('lib.pkp.controllers.grid.files.review.ReviewGridDataProvider');
// Pass in null stageId to be set in initialize from request var.
parent::__construct(
new ReviewGridDataProvider(SUBMISSION_FILE_REVIEW_FILE),
new ReviewGridDataProvider($fileStage),
null,
FILE_GRID_VIEW_NOTES
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@ class ManageReviewFilesGridHandler extends SelectableSubmissionFileListCategoryG
* Constructor
*/
function __construct() {
$stageId = (int) Application::get()->getRequest()->getUserVar('stageId');
$fileStage = $stageId === WORKFLOW_STAGE_ID_INTERNAL_REVIEW ? SUBMISSION_FILE_INTERNAL_REVIEW_FILE : SUBMISSION_FILE_REVIEW_FILE;
import('lib.pkp.controllers.grid.files.review.ReviewCategoryGridDataProvider');
// Pass in null stageId to be set in initialize from request var.
parent::__construct(
new ReviewCategoryGridDataProvider(SUBMISSION_FILE_REVIEW_FILE),
new ReviewCategoryGridDataProvider($fileStage),
null,
FILE_GRID_ADD|FILE_GRID_VIEW_NOTES
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ class ReviewRevisionsGridDataProvider extends ReviewGridDataProvider {
* Constructor
*/
function __construct() {
parent::__construct(SUBMISSION_FILE_REVIEW_REVISION);
$stageId = (int) Application::get()->getRequest()->getUserVar('stageId');
$fileStage = $stageId === WORKFLOW_STAGE_ID_INTERNAL_REVIEW ? SUBMISSION_FILE_INTERNAL_REVIEW_REVISION : SUBMISSION_FILE_REVIEW_REVISION;
parent::__construct($fileStage);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ class ReviewerReviewFilesGridDataProvider extends ReviewGridDataProvider {
* Constructor
*/
function __construct() {
parent::__construct(SUBMISSION_FILE_REVIEW_FILE);
$stageId = (int) Application::get()->getRequest()->getUserVar('stageId');
$fileStage = $stageId === WORKFLOW_STAGE_ID_INTERNAL_REVIEW ? SUBMISSION_FILE_INTERNAL_REVIEW_FILE : SUBMISSION_FILE_REVIEW_FILE;
parent::__construct($fileStage);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ class WorkflowReviewRevisionsGridHandler extends FileListGridHandler {
* Constructor
*/
function __construct() {
$stageId = (int) Application::get()->getRequest()->getUserVar('stageId');
$fileStage = $stageId === WORKFLOW_STAGE_ID_INTERNAL_REVIEW ? SUBMISSION_FILE_INTERNAL_REVIEW_REVISION : SUBMISSION_FILE_REVIEW_REVISION;
import('lib.pkp.controllers.grid.files.review.ReviewGridDataProvider');
parent::__construct(
new ReviewGridDataProvider(SUBMISSION_FILE_REVIEW_REVISION),
new ReviewGridDataProvider($fileStage),
null,
FILE_GRID_ADD|FILE_GRID_EDIT|FILE_GRID_VIEW_NOTES|FILE_GRID_DELETE
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
// Import JSON class for use with all AJAX requests.
import('lib.pkp.classes.core.JSONMessage');

class PKPFileUploadWizardHandler extends Handler {
class FileUploadWizardHandler extends Handler {
/** @var integer */
var $_fileStage;

Expand Down Expand Up @@ -73,6 +73,7 @@ function authorize($request, &$args, $roleAssignments) {
if ($fileStage) {
$fileStages = Services::get('submissionFile')->getFileStages();
if (!in_array($fileStage, $fileStages)) {
eval(\Psy\sh());
return false;
}
}
Expand Down Expand Up @@ -156,7 +157,7 @@ function authorize($request, &$args, $roleAssignments) {
$this->addPolicy(new SubmissionFileStageAccessPolicy($fileStage, SUBMISSION_FILE_ACCESS_MODIFY, 'api.submissionFiles.403.unauthorizedFileStageIdWrite'));

// Additional checks before uploading to a review file stage
if (in_array($fileStage, [SUBMISSION_FILE_REVIEW_REVISION, SUBMISSION_FILE_REVIEW_FILE])
if (in_array($fileStage, [SUBMISSION_FILE_REVIEW_REVISION, SUBMISSION_FILE_REVIEW_FILE, SUBMISSION_FILE_INTERNAL_REVIEW_REVISION, SUBMISSION_FILE_INTERNAL_REVIEW_FILE])
|| $assocType === ASSOC_TYPE_REVIEW_ROUND) {
import('lib.pkp.classes.security.authorization.internal.ReviewRoundRequiredPolicy');
$this->addPolicy(new ReviewRoundRequiredPolicy($request, $args));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,10 @@ function getSubmissionFiles() {
if ($this->getStageId() == WORKFLOW_STAGE_ID_INTERNAL_REVIEW || $this->getStageId() == WORKFLOW_STAGE_ID_EXTERNAL_REVIEW) {
// If we have a review stage id then we also expect a review round.
if (!$this->getData('fileStage') == SUBMISSION_FILE_QUERY && !is_a($this->getReviewRound(), 'ReviewRound')) {
throw new Exception('Can not get request submission files for a review stage without specifying a review round.');
throw new Exception('Can not request submission files for a review stage without specifying a review round.');
}
// Can only upload submission files, review files, review attachments, dependent files, or query attachments.
if (!in_array($this->getData('fileStage'), array(SUBMISSION_FILE_SUBMISSION, SUBMISSION_FILE_REVIEW_FILE, SUBMISSION_FILE_REVIEW_ATTACHMENT, SUBMISSION_FILE_REVIEW_REVISION, SUBMISSION_FILE_QUERY, SUBMISSION_FILE_DEPENDENT, SUBMISSION_FILE_ATTACHMENT))) {
if (!in_array($this->getData('fileStage'), array(SUBMISSION_FILE_SUBMISSION, SUBMISSION_FILE_REVIEW_FILE, SUBMISSION_FILE_INTERNAL_REVIEW_FILE, SUBMISSION_FILE_REVIEW_ATTACHMENT, SUBMISSION_FILE_REVIEW_REVISION, SUBMISSION_FILE_INTERNAL_REVIEW_REVISION, SUBMISSION_FILE_QUERY, SUBMISSION_FILE_DEPENDENT, SUBMISSION_FILE_ATTACHMENT))) {
throw new Exception('The file stage is not valid for the review stage.');
}

Expand Down
38 changes: 35 additions & 3 deletions cypress/support/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,17 +133,49 @@ Cypress.Commands.add('createSubmission', (data, context) => {

// === Submission Step 2 ===
cy.get('button:contains("Add File")');

// A callback function used to prevent Cypress from failing
// when an uncaught exception occurs in the code. This is a
// workaround for an exception that is thrown when a file's
// genre is selected in the modal form. This exception happens
// because the submission step 2 form handler attaches a
// validator to the modal form.
//
// It should be possible to remove this workaround once the
// submission process has been fully ported to Vue.
const allowException = function(error, runnable) {
return false;
}
cy.on('uncaught:exception', allowException);

// File uploads
const primaryFileGenres = ['Article Text', 'Book Manuscript', 'Chapter Manuscript'];
data.files.forEach(file => {
cy.fixture(file.file, 'base64').then(fileContent => {
cy.get('input[type=file]').upload(
{fileContent, 'fileName': file.fileName, 'mimeType': 'application/pdf', 'encoding': 'base64'}
);
cy.get('button:contains("Article Text")').click();
cy.get('span:contains("Article Text")');
var $row = cy.get('a:contains("' + file.fileName + '")').parents('.listPanel__item');
if (primaryFileGenres.includes(file.genre)) {
// For some reason this is locating two references to the button,
// so just click the last one, which should be the most recently
// uploaded file.
$row.get('button:contains("' + file.genre + '")').last().click();
$row.get('span:contains("' + file.genre + '")');
} else {
$row.get('button:contains("Other")').last().click();
cy.get('#submission-files-container .modal label:contains("' + file.genre + '")').click();
cy.get('#submission-files-container .modal button:contains("Save")').click();
}
// Make sure the genre selection is complete before moving to the
// next file.
$row.get('button:contains("What kind of file is this?")').should('not.exist');
});
});

// See description of allowException above
// cy.removeListener('uncaught:exception', allowException);

// Save the ID to the data object
cy.location('search')
.then(search => {
Expand Down Expand Up @@ -212,7 +244,7 @@ Cypress.Commands.add('createSubmission', (data, context) => {
cy.get('div:contains("Your changes have been saved.")');
}

cy.get('div[id^="component-grid-users-chapter-chaptergrid-"] a[title="Edit this chapter"]:contains("' + Cypress.$.escapeSelector(chapter.title) + '")');
cy.get('div[id^="component-grid-users-chapter-chaptergrid-"] a.pkp_linkaction_editChapter:contains("' + Cypress.$.escapeSelector(chapter.title) + '")');
});
cy.waitJQuery();
cy.get('form[id=submitStep3Form]').find('button').contains('Save and continue').click();
Expand Down
Loading

0 comments on commit 8c87989

Please sign in to comment.