diff --git a/classes/components/forms/publication/CatalogEntryForm.php b/classes/components/forms/publication/CatalogEntryForm.php index 04207be11e9..c785a22a700 100644 --- a/classes/components/forms/publication/CatalogEntryForm.php +++ b/classes/components/forms/publication/CatalogEntryForm.php @@ -21,14 +21,23 @@ use APP\publication\Publication; use APP\submission\Submission; use PKP\components\forms\FieldAutosuggestPreset; +use PKP\components\forms\FieldRichTextarea; use PKP\components\forms\FieldSelect; use PKP\components\forms\FieldText; use PKP\components\forms\FieldUploadImage; use PKP\components\forms\FormComponent; +use PKP\publication\enums\UpdateType; class CatalogEntryForm extends FormComponent { public const FORM_CATALOG_ENTRY = 'catalogEntry'; + + public const GROUP_PLACEMENT = 'placement'; + public const GROUP_PUBLICATION_TIMING = 'publicationTiming'; + public const GROUP_VERSION_AND_UPDATES = 'versionAndUpdates'; + public const GROUP_DISPLAY = 'display'; + public const GROUP_ACCESS = 'access'; + public $id = self::FORM_CATALOG_ENTRY; public $method = 'PUT'; @@ -51,6 +60,13 @@ public function __construct($action, $locales, $publication, $submission, $baseU $this->successMessage = __('publication.catalogEntry.success'); $this->locales = $locales; + $this + ->addGroup(['id' => self::GROUP_PLACEMENT, 'label' => __('publication.placement')]) + ->addGroup(['id' => self::GROUP_PUBLICATION_TIMING, 'label' => __('publication.publicationTiming')]) + ->addGroup(['id' => self::GROUP_VERSION_AND_UPDATES, 'label' => __('publication.versionAndUpdates')]) + ->addGroup(['id' => self::GROUP_DISPLAY, 'label' => __('publication.display')]) + ->addGroup(['id' => self::GROUP_ACCESS, 'label' => __('publication.access')]); + // Series options $seriesOptions = [['value' => '', 'label' => '']]; $result = Repo::section() @@ -64,16 +80,16 @@ public function __construct($action, $locales, $publication, $submission, $baseU ]; } - $this->addField(new FieldText('datePublished', [ - 'label' => __('publication.datePublished'), - 'value' => $publication->getData('datePublished'), - ])) + $this ->addField(new FieldSelect('seriesId', [ + 'groupId' => self::GROUP_PLACEMENT, 'label' => __('series.series'), + 'description' => __('publication.series.description'), 'value' => $publication->getData('seriesId'), 'options' => $seriesOptions, ])) ->addField(new FieldText('seriesPosition', [ + 'groupId' => self::GROUP_PLACEMENT, 'label' => __('submission.submit.seriesPosition'), 'description' => __('submission.submit.seriesPosition.description'), 'value' => $publication->getData('seriesPosition'), @@ -99,9 +115,10 @@ public function __construct($action, $locales, $publication, $submission, $baseU $vocabulary = Repo::category()->getCategoryVocabularyStructure($categories); $this->addField(new FieldAutosuggestPreset('categoryIds', [ + 'groupId' => self::GROUP_PLACEMENT, 'label' => __('submission.submit.placement.categories'), 'value' => (array) $publication->getData('categoryIds'), - 'description' => $hasAllBreadcrumbs ? '' : __('submission.categories.circularReferenceWarning'), + 'description' => __('publication.categories.description') . ($hasAllBreadcrumbs ? '' : ' ' . __('submission.categories.circularReferenceWarning')), 'options' => $categoryOptions, 'vocabularies' => [ [ @@ -113,19 +130,47 @@ public function __construct($action, $locales, $publication, $submission, $baseU ])); } - $this->addField(new FieldText('urlPath', [ - 'label' => __('publication.urlPath'), - 'description' => __('publication.urlPath.description'), - 'value' => $publication->getData('urlPath'), - ])) + $this + ->addField(new FieldText('datePublished', [ + 'groupId' => self::GROUP_PUBLICATION_TIMING, + 'label' => __('publication.datePublished'), + 'description' => __('publication.datePublished.description'), + 'value' => $publication->getData('datePublished'), + ])) + ->addField(new FieldSelect('updateType', [ + 'groupId' => self::GROUP_VERSION_AND_UPDATES, + 'label' => __('publication.updateType.label'), + 'description' => __('publication.updateType.description'), + 'options' => array_map( + fn (UpdateType $case) => ['value' => $case->value, 'label' => $case->label()], + UpdateType::cases() + ), + 'value' => $publication->getData('updateType') ?? UpdateType::NEW_VERSION->value, + 'size' => 'large', + ])) + ->addField(new FieldRichTextarea('summaryOfChanges', [ + 'groupId' => self::GROUP_VERSION_AND_UPDATES, + 'label' => __('submission.form.summaryOfChanges'), + 'description' => __('publication.summaryOfChanges.description'), + 'isMultilingual' => true, + 'value' => $publication->getData('summaryOfChanges'), + ])) ->addField(new FieldUploadImage('coverImage', [ + 'groupId' => self::GROUP_DISPLAY, 'label' => __('monograph.coverImage'), + 'description' => __('publication.coverImage.description'), 'value' => $publication->getData('coverImage'), 'isMultilingual' => true, 'baseUrl' => $baseUrl, 'options' => [ 'url' => $temporaryFileApiUrl, ], + ])) + ->addField(new FieldText('urlPath', [ + 'groupId' => self::GROUP_ACCESS, + 'label' => __('publication.urlPath'), + 'description' => __('publication.urlPath.description'), + 'value' => $publication->getData('urlPath'), ])); } } diff --git a/classes/migration/install/OMPMigration.php b/classes/migration/install/OMPMigration.php index 0c64458a66b..595724e0ae4 100644 --- a/classes/migration/install/OMPMigration.php +++ b/classes/migration/install/OMPMigration.php @@ -17,6 +17,7 @@ use APP\publication\enums\VersionStage; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use PKP\publication\enums\UpdateType; class OMPMigration extends \PKP\migration\Migration { @@ -61,6 +62,7 @@ public function up(): void $table->enum('version_stage', array_column(VersionStage::cases(), 'value'))->nullable(); $table->integer('version_minor')->nullable(); $table->integer('version_major')->nullable(); + $table->enum('update_type', array_column(UpdateType::cases(), 'value'))->default(UpdateType::NEW_VERSION->value); $table->datetime('created_at')->useCurrent(); $table->bigInteger('source_publication_id')->nullable(); diff --git a/classes/publication/DAO.php b/classes/publication/DAO.php index b5f6929763a..bb65a27ac15 100644 --- a/classes/publication/DAO.php +++ b/classes/publication/DAO.php @@ -38,6 +38,7 @@ class DAO extends \PKP\publication\DAO 'versionStage' => 'version_stage', 'versionMinor' => 'version_minor', 'versionMajor' => 'version_major', + 'updateType' => 'update_type', 'createdAt' => 'created_at', 'sourcePublicationId' => 'source_publication_id' ]; diff --git a/dbscripts/xml/upgrade.xml b/dbscripts/xml/upgrade.xml index 9d4d82337f7..baa471caf35 100644 --- a/dbscripts/xml/upgrade.xml +++ b/dbscripts/xml/upgrade.xml @@ -209,6 +209,7 @@ + diff --git a/js/load.js b/js/load.js index 4fd384ba18e..e41d19d94bc 100644 --- a/js/load.js +++ b/js/load.js @@ -35,6 +35,7 @@ import StatsPublicationsPage from '@/components/Container/StatsPublicationsPage. import StatsContextPage from '@/components/Container/StatsContextPage.vue'; import StatsUsersPage from '@/components/Container/StatsUsersPage.vue'; import SubmissionWizardPage from '@/components/Container/SubmissionWizardPageOMP.vue'; +import FileMetadataForm from '@/managers/FileManager/modals/FileMetadataForm.vue'; import ManageCatalogPage from '@/components/Container/ManageCatalogPage.vue'; // Helper for initializing and tracking Vue controllers @@ -64,5 +65,6 @@ window.pkp = Object.assign(PkpLoad, window.pkp || {}, { StatsContextPage, StatsUsersPage, SubmissionWizardPage, + FileMetadataForm, }, }); diff --git a/lib/pkp b/lib/pkp index 8bf6a6f06b1..e96710a4d7e 160000 --- a/lib/pkp +++ b/lib/pkp @@ -1 +1 @@ -Subproject commit 8bf6a6f06b1626fdb3d1612e17a6acab6ad8ffab +Subproject commit e96710a4d7e75e75b9741fe1a23bee397e707fa9 diff --git a/lib/ui-library b/lib/ui-library index 8e19a90b337..1649e48ef88 160000 --- a/lib/ui-library +++ b/lib/ui-library @@ -1 +1 @@ -Subproject commit 8e19a90b337946a273d3d94116beb1f2d96d5331 +Subproject commit 1649e48ef88f7ff1ec00a3c2bc30e842c427732f diff --git a/locale/en/submission.po b/locale/en/submission.po index 677f07610da..e55eb940226 100644 --- a/locale/en/submission.po +++ b/locale/en/submission.po @@ -387,6 +387,15 @@ msgstr "" msgid "publication.datePublished" msgstr "Date Published" +msgid "publication.datePublished.description" +msgstr "" +"The publication date will be set automatically when the catalog entry is " +"published. Do not enter a publication date unless this work was previously " +"published elsewhere and you need to backdate it." + +msgid "publication.series.description" +msgstr "Choose the series where this publication will appear." + msgid "publication.editDisabled" msgstr "This version has been published and can not be edited." diff --git a/pages/dashboard/DashboardHandler.php b/pages/dashboard/DashboardHandler.php index 9d932f525eb..47aa016e6ea 100644 --- a/pages/dashboard/DashboardHandler.php +++ b/pages/dashboard/DashboardHandler.php @@ -23,6 +23,7 @@ use APP\template\TemplateManager; use PKP\decision\Decision; use PKP\pages\dashboard\PKPDashboardHandler; +use PKP\publication\enums\UpdateType; use PKP\submissionFile\SubmissionFile; class DashboardHandler extends PKPDashboardHandler @@ -42,6 +43,18 @@ public function setupIndex($request) 'pageComponent' => 'Page', ]); + $updateTypeOptions = []; + foreach (UpdateType::cases() as $updateType) { + $updateTypeOptions[] = [ + 'label' => $updateType->label(), + 'value' => $updateType->value, + ]; + } + $pageInitConfig = $templateMgr->getState('pageInitConfig'); + $pageInitConfig['componentForms']['updateTypeOptions'] = $updateTypeOptions; + $pageInitConfig['componentForms']['defaultUpdateType'] = UpdateType::NEW_VERSION->value; + $templateMgr->setState(['pageInitConfig' => $pageInitConfig]); + $templateMgr->setConstants([ 'DECISION_INTERNAL_REVIEW' => Decision::INTERNAL_REVIEW, 'DECISION_RECOMMEND_EXTERNAL_REVIEW' => Decision::RECOMMEND_EXTERNAL_REVIEW,