Files
CHIEFSOFT\ameye df3a033196 first commit
2024-06-08 17:09:23 -04:00

222 lines
6.5 KiB
PHP

<?php
/**
* @file classes/components/form/submission/StartSubmission.php
*
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2000-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class StartSubmission
*
* @ingroup classes_controllers_form
*
* @brief The form to begin the submission wizard
*/
namespace PKP\components\forms\submission;
use APP\core\Application;
use Illuminate\Support\Enumerable;
use PKP\components\forms\FieldHTML;
use PKP\components\forms\FieldOptions;
use PKP\components\forms\FieldRichText;
use PKP\components\forms\FormComponent;
use PKP\config\Config;
use PKP\context\Context;
use PKP\security\Role;
use PKP\userGroup\UserGroup;
class StartSubmission extends FormComponent
{
/** @var string id for the form's group and page configuration */
public const GROUP = 'default';
public $id = 'startSubmission';
public $method = 'POST';
public Context $context;
public Enumerable $userGroups;
/**
* @param Enumerable<UserGroup> $userGroups The user groups this user can submit as in this context
*/
public function __construct(string $action, Context $context, Enumerable $userGroups)
{
$this->action = $action;
$this->context = $context;
$this->userGroups = $userGroups;
$this->addIntroduction($context);
$this->addLanguage($context);
$this->addTitle();
$this->addSubmissionChecklist($context);
$this->addUserGroups($userGroups);
$this->addPrivacyConsent($context);
}
/**
* Add a custom button to the form and modify all
* fields as required
*/
public function getConfig()
{
$this->addPage([
'id' => self::GROUP,
'submitButton' => [
'label' => __('submission.wizard.start'),
'isPrimary' => true,
]
])
->addGroup([
'id' => self::GROUP,
'pageId' => self::GROUP,
]);
foreach ($this->fields as $field) {
$field->groupId = self::GROUP;
}
return parent::getConfig();
}
protected function addTitle(): void
{
$this->addField(new FieldRichText('title', [
'label' => __('common.title'),
'size' => 'oneline',
'isRequired' => true,
'value' => '',
]));
}
protected function addIntroduction(Context $context): void
{
if (!$context->getLocalizedData('beginSubmissionHelp')) {
return;
}
$this->addField(new FieldHTML('introduction', [
'label' => __('submission.wizard.beforeStart'),
'description' => $context->getLocalizedData('beginSubmissionHelp'),
]));
}
protected function addLanguage(Context $context): void
{
$languages = $context->getSupportedSubmissionLocaleNames();
if (count($languages) < 2) {
return;
}
$options = [];
foreach ($languages as $locale => $name) {
$options[] = [
'value' => $locale,
'label' => $name,
];
}
$this->addField(new FieldOptions('locale', [
'label' => __('submission.submit.submissionLocale'),
'description' => __('submission.submit.submissionLocaleDescription'),
'type' => 'radio',
'options' => $options,
'value' => '',
'isRequired' => true,
]));
}
protected function addSubmissionChecklist(Context $context): void
{
if (!$context->getLocalizedData('submissionChecklist')) {
return;
}
$this->addField(new FieldOptions('submissionRequirements', [
'label' => __('submission.submit.submissionChecklist'),
'description' => $context->getLocalizedData('submissionChecklist'),
'options' => [
[
'value' => true,
'label' => __('submission.submit.submissionChecklistConfirm'),
],
],
'value' => false,
'isRequired' => true,
]));
}
/**
* Allow the user to select which user group to submit as
*
* This field is only shown when the user can submit in more
* than one group.
*/
protected function addUserGroups(Enumerable $userGroups): void
{
if ($userGroups->count() < 2) {
return;
}
$options = $userGroups->map(fn (UserGroup $userGroup) => [
'value' => $userGroup->getId(),
'label' => $userGroup->getLocalizedName(),
]);
$hasEditorialRole = $userGroups->contains(
fn (UserGroup $userGroup) => in_array($userGroup->getRoleId(), [Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN])
);
$description = __('submission.submit.availableUserGroupsDescription');
if ($hasEditorialRole) {
$description .= ' ' . __('submission.submit.managerUserGroupsDescription');
}
$this->addField(new FieldOptions('userGroupId', [
'label' => __('submission.submit.availableUserGroups'),
'description' => $description,
'type' => 'radio',
'options' => $options->values()->toArray(),
'value' => $options->first()['value'],
'isRequired' => true,
]));
}
protected function addPrivacyConsent(Context $context): void
{
$privacyStatement = Config::getVar('general', 'sitewide_privacy_statement')
? Application::get()
->getRequest()
->getSite()
->getData('privacyStatement')
: $context->getData('privacyStatement');
if (!$privacyStatement) {
return;
}
$privacyUrl = Application::get()
->getRequest()
->getDispatcher()
->url(
Application::get()->getRequest(),
Application::ROUTE_PAGE,
null,
'about',
'privacy'
);
$this->addField(new FieldOptions('privacyConsent', [
'label' => __('submission.wizard.privacyConsent'),
'options' => [
[
'value' => true,
'label' => __('user.register.form.privacyConsent', [
'privacyUrl' => $privacyUrl,
]),
],
],
'value' => false,
'isRequired' => true,
]));
}
}