Skip to content

Commit

Permalink
Merge pull request #569 from jyhein/f5000_7431
Browse files Browse the repository at this point in the history
Submission and metadata languages separated from UI and form languages
  • Loading branch information
bozana committed Mar 21, 2024
2 parents e92830c + e17faf6 commit 64fc4ad
Show file tree
Hide file tree
Showing 15 changed files with 85 additions and 43 deletions.
6 changes: 3 additions & 3 deletions classes/migration/install/OPSMigration.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public function up(): void
$table->foreign('section_id')->references('section_id')->on('sections')->onDelete('cascade');
$table->index(['section_id'], 'section_settings_section_id');

$table->string('locale', 14)->default('');
$table->string('locale', 28)->default('');
$table->string('setting_name', 255);
$table->text('setting_value')->nullable();

Expand Down Expand Up @@ -110,7 +110,7 @@ public function up(): void
Schema::create('publication_galleys', function (Blueprint $table) {
$table->comment('Publication galleys are representations of publications in a particular format, such as a PDF file.');
$table->bigInteger('galley_id')->autoIncrement();
$table->string('locale', 14)->nullable();
$table->string('locale', 28)->nullable();

$table->bigInteger('publication_id');
$table->foreign('publication_id', 'publication_galleys_publication_id')->references('publication_id')->on('publications')->onDelete('cascade');
Expand Down Expand Up @@ -143,7 +143,7 @@ public function up(): void
$table->foreign('galley_id')->references('galley_id')->on('publication_galleys');
$table->index(['galley_id'], 'publication_galley_settings_galley_id');

$table->string('locale', 14)->default('');
$table->string('locale', 28)->default('');
$table->string('setting_name', 255);
$table->text('setting_value')->nullable();

Expand Down
4 changes: 2 additions & 2 deletions classes/migration/install/ServersMigration.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public function up(): void
$table->bigInteger('server_id')->autoIncrement();
$table->string('path', 32);
$table->float('seq', 8, 2)->default(0)->comment('Used to order lists of servers');
$table->string('primary_locale', 14);
$table->string('primary_locale', 28);
$table->tinyInteger('enabled')->default(1)->comment('Controls whether or not the server is considered "live" and will appear on the website. (Note that disabled servers may still be accessible, but only if the user knows the URL.)');
$table->unique(['path'], 'servers_path');
});
Expand All @@ -44,7 +44,7 @@ public function up(): void
$table->foreign('server_id', 'server_settings_server_id')->references('server_id')->on('servers')->onDelete('cascade');
$table->index(['server_id'], 'server_settings_server_id');

$table->string('locale', 14)->default('');
$table->string('locale', 28)->default('');
$table->string('setting_name', 255);
$table->text('setting_value')->nullable();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

/**
* @file classes/migration/upgrade/v3_5_0/I9425_SeparateUIAndSubmissionLocales.php
*
* Copyright (c) 2024 Simon Fraser University
* Copyright (c) 2024 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class I9425_SeparateUIAndSubmissionLocales
*
* @brief pkp/pkp-lib#9425 Make submission language selection and metadata forms independent from website language settings
*/

namespace APP\migration\upgrade\v3_5_0;

class I9425_SeparateUIAndSubmissionLocales extends \PKP\migration\upgrade\v3_5_0\I9425_SeparateUIAndSubmissionLocales
{
protected function getContextTable(): string
{
return 'servers';
}
protected function getContextSettingsTable(): string
{
return 'server_settings';
}
protected function getContextIdColumn(): string
{
return 'server_id';
}
}
11 changes: 5 additions & 6 deletions classes/publication/Repository.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,7 @@ public function getCollector(): Collector
public function validate($publication, array $props, Submission $submission, Context $context): array
{
$errors = parent::validate($publication, $props, $submission, $context);

$allowedLocales = $context->getSupportedSubmissionLocales();
$primaryLocale = $submission->getData('locale');
$submissionLocale = $submission->getData('locale');

// Ensure that the specified section exists
$section = null;
Expand All @@ -63,21 +61,22 @@ public function validate($publication, array $props, Submission $submission, Con
if ($section && !$submission->getData('submissionProgress')) {
// Require abstracts if the section requires them
if (is_null($publication) && !$section->getData('abstractsNotRequired') && empty($props['abstract'])) {
$errors['abstract'][$primaryLocale] = [__('author.submit.form.abstractRequired')];
$errors['abstract'][$submissionLocale] = [__('author.submit.form.abstractRequired')];
}

if (isset($props['abstract']) && empty($errors['abstract'])) {
// Require abstracts in the primary language if the section requires them
if (!$section->getData('abstractsNotRequired')) {
if (empty($props['abstract'][$primaryLocale])) {
if (empty($props['abstract'][$submissionLocale])) {
if (!isset($errors['abstract'])) {
$errors['abstract'] = [];
};
$errors['abstract'][$primaryLocale] = [__('author.submit.form.abstractRequired')];
$errors['abstract'][$submissionLocale] = [__('author.submit.form.abstractRequired')];
}
}

// Check the word count on abstracts
$allowedLocales = $submission->getPublicationLanguages($context->getSupportedSubmissionMetadataLocales());
foreach ($allowedLocales as $localeKey) {
if (empty($props['abstract'][$localeKey])) {
continue;
Expand Down
4 changes: 3 additions & 1 deletion classes/publication/maps/Schema.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ protected function mapByProperties(array $props, Publication $publication, bool
);
}

$output = $this->schemaService->addMissingMultilingualValues(PKPSchemaService::SCHEMA_PUBLICATION, $output, $this->context->getSupportedSubmissionLocales());
$locales = $this->submission->getPublicationLanguages($this->context->getSupportedSubmissionMetadataLocales());

$output = $this->schemaService->addMissingMultilingualValues(PKPSchemaService::SCHEMA_PUBLICATION, $output, $locales);

ksort($output);

Expand Down
3 changes: 2 additions & 1 deletion classes/submission/Repository.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ public function validateSubmit(Submission $submission, Context $context): array
$abstracts = $publication->getData('abstract');
if ($abstracts) {
$abstractErrors = [];
foreach ($context->getSupportedSubmissionLocales() as $localeKey) {
$allowedLocales = $submission->getPublicationLanguages($context->getSupportedSubmissionMetadataLocales());
foreach ($allowedLocales as $localeKey) {
$abstract = $publication->getData('abstract', $localeKey);
$wordCount = $abstract ? PKPString::getWordCount($abstract) : 0;
if ($wordCount > $section->getAbstractWordCount()) {
Expand Down
8 changes: 7 additions & 1 deletion classes/submission/maps/Schema.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ protected function mapByProperties(array $props, Submission $submission): array
);
}

$output = $this->schemaService->addMissingMultilingualValues($this->schemaService::SCHEMA_SUBMISSION, $output, $this->context->getSupportedSubmissionLocales());
$locales = $this->context->getSupportedSubmissionMetaDataLocales();

if (!in_array($submissionLocale = $submission->getData('locale'), $locales)) {
$locales[] = $submissionLocale;
}

$output = $this->schemaService->addMissingMultilingualValues($this->schemaService::SCHEMA_SUBMISSION, $output, $locales);

ksort($output);

Expand Down
23 changes: 8 additions & 15 deletions controllers/grid/preprintGalleys/form/PreprintGalleyForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
use APP\core\Request;
use APP\facades\Repo;
use APP\publication\Publication;
use APP\server\Server;
use APP\submission\Submission;
use APP\template\TemplateManager;
use PKP\form\Form;
Expand Down Expand Up @@ -65,23 +64,14 @@ public function __construct($request, $submission, $publication, $preprintGalley
$this->addCheck(new \PKP\form\validation\FormValidatorCSRF($this));

// Ensure a locale is provided and valid
$server = $request->getServer();
$locales = $submission->getPublicationLanguages($request->getServer()->getSupportedSubmissionMetadataLocales(), $preprintGalley?->getLanguages());
$this->addCheck(
new \PKP\form\validation\FormValidator(
new \PKP\form\validation\FormValidatorCustom(
$this,
'locale',
'required',
'validator.required',
new class ($server) extends Validator {
public function __construct(private Server $server)
{
}

public function isValid($locale): bool
{
return in_array($locale, $this->server->getSupportedSubmissionLocales());
}
}
fn ($locale) => in_array($locale, $locales)
)
);
}
Expand All @@ -104,9 +94,12 @@ public function fetch($request, $template = null, $display = false)
'supportsDependentFiles' => $preprintGalleyFile ? Repo::submissionFile()->supportsDependentFiles($preprintGalleyFile) : null,
]);
}
$context = $request->getContext();

$supportedLocales = $request->getContext()->getSupportedSubmissionMetadataLocaleNames() + $this->_submission->getPublicationLanguageNames() + ($this->_preprintGalley?->getLanguageNames() ?? []);
ksort($supportedLocales);

$templateMgr->assign([
'supportedLocales' => $context->getSupportedSubmissionLocaleNames(),
'supportedLocales' => $supportedLocales,
'submissionId' => $this->_submission->getId(),
'publicationId' => $this->_publication->getId(),
'formDisabled' => !$this->_isEditable
Expand Down
9 changes: 7 additions & 2 deletions cypress/tests/data/10-ApplicationSetup/20-CreateContext.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,13 @@ describe('Data suite tests', function() {
cy.get('#appearance [role="status"]').contains('Saved');

cy.get('button[id="languages-button"]').click();
cy.get('input[id^=select-cell-fr_CA-submissionLocale]').click();
cy.contains('Locale settings saved.');
cy.get('input[id^="select-cell-fr_CA-formLocale"]').click();
cy.get('a[id^=component-grid-settings-languages-submissionlanguagegrid-addLanguageModal-button]').click();
cy.get('#locale-fr_CA').should('exist').click();
cy.get('#addLanguageForm button[name="submitFormButton"]').click();
cy.contains('Submission locales updated.').should('exist');
cy.get('input[id^="select-cell-fr_CA-submissionLocale"]').click();
cy.get('input[id^="select-cell-fr_CA-submissionMetadataLocale"]').should('be.checked');

cy.get('button[id="indexing-button"]').click();
cy.get('input[name="searchDescription-en"]').type(Cypress.env('contextDescriptions')['en'], {delay: 0});
Expand Down
4 changes: 2 additions & 2 deletions cypress/tests/data/60-content/CkwantesSubmission.cy.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,15 +194,15 @@ describe('Data suite: Ckwantes', function() {
.find('h4').contains('Keywords').siblings('.submissionWizard__reviewPanel__item__value').contains('employees, survey')
.parents('.submissionWizard__reviewPanel')
.find('h4').contains('Abstract').siblings('.submissionWizard__reviewPanel__item__value').contains(submission.abstract);
cy.get('h3').contains('Details (French)')
cy.get('h3').contains('Details (French (Canada))')
.parents('.submissionWizard__reviewPanel')
.find('h4').contains('Title').siblings('.submissionWizard__reviewPanel__item__value').contains('None provided')
.parents('.submissionWizard__reviewPanel')
.find('h4').contains('Keywords').siblings('.submissionWizard__reviewPanel__item__value').contains('None provided')
.parents('.submissionWizard__reviewPanel')
.find('h4').contains('Abstract').siblings('.submissionWizard__reviewPanel__item__value').contains('None provided');
cy.get('h3').contains('For Readers (English)')
cy.get('h3').contains('For Readers (French)')
cy.get('h3').contains('For Readers (French (Canada))')

// Save for later
cy.get('button').contains('Save for Later').click();
Expand Down
1 change: 1 addition & 0 deletions dbscripts/xml/upgrade.xml
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
<migration class="PKP\migration\upgrade\v3_5_0\I9262_Highlights"/>
<migration class="PKP\migration\upgrade\v3_5_0\I9462_UserUserGroups"/>
<migration class="PKP\migration\upgrade\v3_5_0\I9552_UserGroupsMasthead"/>
<migration class="APP\migration\upgrade\v3_5_0\I9425_SeparateUIAndSubmissionLocales"/>
</upgrade>

<!-- update plugin configuration - should be done as the final upgrade task -->
Expand Down
2 changes: 1 addition & 1 deletion lib/pkp
Submodule pkp updated 60 files
+8 −8 api/v1/submissions/PKPSubmissionFileController.php
+3 −1 api/v1/vocabs/PKPVocabController.php
+1 −1 classes/author/Repository.php
+3 −1 classes/author/maps/Schema.php
+8 −6 classes/components/listPanels/ContributorsListPanel.php
+28 −0 classes/config/Config.php
+51 −6 classes/context/Context.php
+14 −0 classes/core/DataObject.php
+40 −0 classes/dev/ComposerScript.php
+29 −2 classes/galley/Galley.php
+3 −1 classes/galley/maps/Schema.php
+71 −0 classes/i18n/Locale.php
+6 −0 classes/i18n/interfaces/LocaleInterface.php
+2 −2 classes/migration/install/AnnouncementsMigration.php
+1 −1 classes/migration/install/CategoriesMigration.php
+6 −6 classes/migration/install/CommonMigration.php
+1 −1 classes/migration/install/ControlledVocabMigration.php
+1 −1 classes/migration/install/DoiMigration.php
+1 −1 classes/migration/install/GenresMigration.php
+1 −1 classes/migration/install/HighlightsMigration.php
+1 −1 classes/migration/install/InstitutionsMigration.php
+1 −1 classes/migration/install/LibraryFilesMigration.php
+1 −1 classes/migration/install/LogMigration.php
+2 −2 classes/migration/install/MetadataMigration.php
+2 −2 classes/migration/install/NavigationMenusMigration.php
+2 −2 classes/migration/install/ReviewFormsMigration.php
+1 −1 classes/migration/install/RolesAndUserGroupsMigration.php
+1 −1 classes/migration/install/SubmissionFilesMigration.php
+4 −4 classes/migration/install/SubmissionsMigration.php
+1 −1 classes/migration/install/TombstoneMigration.php
+131 −0 classes/migration/upgrade/v3_5_0/I9425_SeparateUIAndSubmissionLocales.php
+8 −0 classes/observers/listeners/SendSubmissionAcknowledgement.php
+40 −0 classes/publication/PKPPublication.php
+4 −4 classes/publication/Repository.php
+12 −1 classes/services/PKPContextService.php
+27 −0 classes/submission/PKPSubmission.php
+7 −3 classes/submission/Repository.php
+5 −5 classes/submissionFile/Repository.php
+28 −0 classes/submissionFile/SubmissionFile.php
+3 −1 classes/submissionFile/maps/Schema.php
+8 −8 classes/template/PKPTemplateManager.php
+6 −2 composer.json
+3 −2 controllers/grid/admin/languages/AdminLanguageGridHandler.php
+21 −0 controllers/grid/languages/LanguageGridCellProvider.php
+90 −48 controllers/grid/languages/LanguageGridHandler.php
+131 −0 controllers/grid/languages/form/AddLanguageForm.php
+4 −1 controllers/grid/settings/languages/ManageLanguageGridHandler.php
+152 −0 controllers/grid/settings/languages/SubmissionLanguageGridHandler.php
+2 −1 controllers/wizard/fileUpload/FileUploadWizardHandler.php
+9 −2 controllers/wizard/fileUpload/form/SubmissionFilesMetadataForm.php
+24 −0 locale/en/manager.po
+36 −8 pages/authorDashboard/PKPAuthorDashboardHandler.php
+24 −28 pages/submission/PKPSubmissionHandler.php
+38 −9 pages/workflow/PKPWorkflowHandler.php
+25 −1 schemas/context.json
+1 −1 schemas/submission.json
+2 −0 templates/admin/contextSettings.tpl
+1 −1 templates/admin/systemInfo.tpl
+35 −0 templates/controllers/grid/languages/addLanguageForm.tpl
+2 −0 templates/management/website.tpl
8 changes: 4 additions & 4 deletions pages/submission/SubmissionHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ protected function getSubmittingTo(Context $context, Submission $submission, arr
'submission.wizard.submittingToSectionInLanguage',
[
'section' => $section->getLocalizedTitle(),
'language' => Locale::getMetadata($submission->getData('locale'))->getDisplayName(),
'language' => Locale::getSubmissionLocaleDisplayNames([$submission->getData('locale')])[$submission->getData('locale')],
]
);
} elseif ($sectionCount) {
Expand All @@ -122,7 +122,7 @@ protected function getSubmittingTo(Context $context, Submission $submission, arr
return __(
'submission.wizard.submittingInLanguage',
[
'language' => Locale::getMetadata($submission->getData('locale'))->getDisplayName(),
'language' => Locale::getSubmissionLocaleDisplayNames([$submission->getData('locale')])[$submission->getData('locale')],
]
);
}
Expand Down Expand Up @@ -176,7 +176,7 @@ protected function getFilesStep(Request $request, Submission $submission, Public

Hook::add('Template::SubmissionWizard::Section', function (string $hookName, array $params) {
$templateMgr = $params[1]; /** @var TemplateManager $templateMgr */
$output = & $params[2]; /** @var string $step */
$output = &$params[2]; /** @var string $step */

$output .= sprintf(
'<template v-else-if="section.id === \'' . self::GALLEYS_SECTION_ID . '\'">%s</template>',
Expand Down Expand Up @@ -246,7 +246,7 @@ protected function getEditorsStep(Request $request, Submission $submission, Publ
Hook::add('Template::SubmissionWizard::Section::Review', function (string $hookName, array $params) {
$step = $params[0]['step']; /** @var string $step */
$templateMgr = $params[1]; /** @var TemplateManager $templateMgr */
$output = & $params[2]; /** @var string $output */
$output = &$params[2]; /** @var string $output */

if ($step === 'editors') {
$output .= $templateMgr->fetch('submission/review-license.tpl');
Expand Down
12 changes: 8 additions & 4 deletions pages/workflow/WorkflowHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,15 @@ public function setupIndex($request)
$submissionContext = Services::get('context')->get($submission->getData('contextId'));
}

$locales = $submissionContext->getSupportedSubmissionLocaleNames();
$locales = array_map(fn (string $locale, string $name) => ['key' => $locale, 'label' => $name], array_keys($locales), $locales);

$latestPublication = $submission->getLatestPublication();

$submissionLocale = $submission->getData('locale');
$locales = collect($submissionContext->getSupportedSubmissionMetadataLocaleNames() + $submission->getPublicationLanguageNames())
->map(fn (string $name, string $locale) => ['key' => $locale, 'label' => $name])
->sortBy('key')
->values()
->toArray();

$latestPublicationApiUrl = $request->getDispatcher()->url($request, Application::ROUTE_API, $submissionContext->getPath(), 'submissions/' . $submission->getId() . '/publications/' . $latestPublication->getId());
$temporaryFileApiUrl = $request->getDispatcher()->url($request, Application::ROUTE_API, $submissionContext->getPath(), 'temporaryFiles');
$relatePublicationApiUrl = $request->getDispatcher()->url($request, Application::ROUTE_API, $submissionContext->getPath(), 'submissions/' . $submission->getId() . '/publications/' . $latestPublication->getId()) . '/relate';
Expand Down Expand Up @@ -117,7 +121,7 @@ public function setupIndex($request)
}
}
}
$components[FORM_ISSUE_ENTRY] = $issueEntryForm->getConfig();
$components[FORM_ISSUE_ENTRY] = $this->getLocalizedForm($issueEntryForm, $submissionLocale, $locales);
$components[FORM_ID_RELATION] = $relationForm->getConfig();

$publicationFormIds = $templateMgr->getState('publicationFormIds');
Expand Down
2 changes: 1 addition & 1 deletion schemas/galley.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
"description": "The primary locale of this galley.",
"apiSummary": true,
"validation": [
"regex:/^([a-z]{2})((_[A-Z]{2})?)(@[a-z]{0,})?$/"
"regex:/^([A-Za-z]{2,4})(?<sc>[_-]([A-Za-z]{4,5}|[0-9]{4}))?([_-]([A-Za-z]{2}|[0-9]{3}))?(@[a-z]{2,30}(?&sc)?)?$/"
]
},
"label": {
Expand Down

0 comments on commit 64fc4ad

Please sign in to comment.