Add UI for creating instances of quick forms #785
This commit is contained in:
commit
1410fa5ea7
|
@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
- [Announce new releases on farmOS.discourse.group #780](https://github.com/farmOS/farmOS/pull/780)
|
||||
- [Add a Product asset type and Product type taxonomy #787](https://github.com/farmOS/farmOS/pull/787)
|
||||
- [Inventory quick form #766](https://github.com/farmOS/farmOS/pull/766)
|
||||
- [Add UI for creating instances of quick forms #785](https://github.com/farmOS/farmOS/pull/785)
|
||||
|
||||
### Changed
|
||||
|
||||
|
|
|
@ -8,5 +8,6 @@ dependencies:
|
|||
- drupal:taxonomy
|
||||
- farm:asset
|
||||
- farm:farm_log_quantity
|
||||
- farm:farm_setup
|
||||
- farm:quantity
|
||||
- log:log
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
farm_quick.add_page:
|
||||
title: 'Add quick form'
|
||||
route_name: farm_quick.add_page
|
||||
appears_on:
|
||||
- entity.quick_form.collection
|
|
@ -1,3 +1,8 @@
|
|||
farm.quick:
|
||||
class: Drupal\Core\Menu\MenuLinkDefault
|
||||
deriver: Drupal\farm_quick\Plugin\Derivative\QuickFormMenuLink
|
||||
farm.quick_setup:
|
||||
title: Quick Forms
|
||||
description: Quick forms make it easy to record common activities.
|
||||
parent: farm.setup
|
||||
route_name: entity.quick_form.collection
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
farm_quick:
|
||||
config_permissions:
|
||||
- update quick_form
|
||||
- administer quick_form
|
||||
default_permissions:
|
||||
- view quick_form
|
||||
|
|
|
@ -5,7 +5,9 @@
|
|||
* The farmOS Quick Form module.
|
||||
*/
|
||||
|
||||
use Drupal\Component\Utility\Html;
|
||||
use Drupal\Core\Entity\EntityTypeInterface;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\Core\Routing\RouteMatchInterface;
|
||||
|
||||
/**
|
||||
|
@ -23,11 +25,16 @@ function farm_quick_help($route_name, RouteMatchInterface $route_match) {
|
|||
if (strpos($route_name, 'farm.quick.') === 0) {
|
||||
$quick_form_id = $route_match->getParameter('id');
|
||||
if ($route_name == 'farm.quick.' . $quick_form_id) {
|
||||
/** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface $quick_form */
|
||||
$quick_form = \Drupal::service('quick_form.instance_manager')->getInstance($quick_form_id);
|
||||
$help_text = $quick_form->getHelpText();
|
||||
if (!empty($help_text)) {
|
||||
$output .= '<p>' . $help_text . '</p>';
|
||||
}
|
||||
$output = [
|
||||
'#type' => 'html_tag',
|
||||
'#tag' => 'p',
|
||||
'#value' => Html::escape($quick_form->getHelpText()),
|
||||
'#cache' => [
|
||||
'tags' => $quick_form->getCacheTags(),
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -57,3 +64,42 @@ function farm_quick_farm_entity_bundle_field_info(EntityTypeInterface $entity_ty
|
|||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_form_alter().
|
||||
*/
|
||||
function farm_quick_form_alter(&$form, FormStateInterface $form_state, $form_id) {
|
||||
|
||||
// Only alter views_form_ forms.
|
||||
if (!str_starts_with($form_id, 'views_form_')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$target = NULL;
|
||||
if (isset($form['header']['asset_bulk_form']['action'])) {
|
||||
$target = 'asset_bulk_form';
|
||||
}
|
||||
if (isset($form['header']['log_bulk_form']['action'])) {
|
||||
$target = 'log_bulk_form';
|
||||
}
|
||||
|
||||
// Alter action options for the target entity type bulk form.
|
||||
if ($target) {
|
||||
|
||||
// Check for disabled quick forms.
|
||||
$disabled_quick_forms = \Drupal::entityTypeManager()->getStorage('quick_form')->getQuery()
|
||||
->accessCheck(TRUE)
|
||||
->condition('status', FALSE)
|
||||
->execute();
|
||||
if (empty($disabled_quick_forms)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove system actions that end with quick_* for a disabled quick form.
|
||||
foreach (array_keys($form['header'][$target]['action']['#options']) as $option_id) {
|
||||
if ((preg_match("/quick_(.*)/", $option_id, $matches)) && in_array($matches[1], $disabled_quick_forms)) {
|
||||
unset($form['header'][$target]['action']['#options'][$option_id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,16 +6,23 @@ farm.quick:
|
|||
requirements:
|
||||
_permission: 'view quick_form'
|
||||
|
||||
farm_quick.configure:
|
||||
path: /quick/{quick_form}/configure
|
||||
farm_quick.add_page:
|
||||
path: 'setup/quick/add'
|
||||
defaults:
|
||||
_entity_form: quick_form.configure
|
||||
_title_callback: \Drupal\farm_quick\Form\ConfigureQuickForm::getTitle
|
||||
_controller: \Drupal\farm_quick\Controller\QuickFormAddPage::addPage
|
||||
_title: 'Add quick form'
|
||||
requirements:
|
||||
_custom_access: \Drupal\farm_quick\Form\ConfigureQuickForm::access
|
||||
_permission: 'create quick_form'
|
||||
|
||||
farm_quick.add_form:
|
||||
path: '/setup/quick/add/{plugin}'
|
||||
defaults:
|
||||
_entity_form: quick_form.add
|
||||
requirements:
|
||||
_permission: 'create quick_form'
|
||||
options:
|
||||
parameters:
|
||||
quick_form:
|
||||
plugin:
|
||||
type: string
|
||||
|
||||
route_callbacks:
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\farm_quick\Controller;
|
||||
|
||||
use Drupal\Component\Utility\Html;
|
||||
use Drupal\Core\Controller\ControllerBase;
|
||||
use Drupal\Core\Link;
|
||||
use Drupal\farm_quick\QuickFormPluginManager;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Page that renders links to create instances of quick form plugins.
|
||||
*/
|
||||
class QuickFormAddPage extends ControllerBase {
|
||||
|
||||
/**
|
||||
* The quick form plugin manager.
|
||||
*
|
||||
* @var \Drupal\farm_quick\QuickFormPluginManager
|
||||
*/
|
||||
protected $quickFormPluginManager;
|
||||
|
||||
/**
|
||||
* Constructs a new QuickFormAddPage object.
|
||||
*/
|
||||
public function __construct(QuickFormPluginManager $quick_form_plugin_manager) {
|
||||
$this->quickFormPluginManager = $quick_form_plugin_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container) {
|
||||
return new static(
|
||||
$container->get('plugin.manager.quick_form'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add quick form page callback.
|
||||
*
|
||||
* @return array
|
||||
* Render array.
|
||||
*/
|
||||
public function addPage(): array {
|
||||
|
||||
$render = [
|
||||
'#theme' => 'entity_add_list',
|
||||
'#bundles' => [],
|
||||
'#cache' => [
|
||||
'tags' => $this->quickFormPluginManager->getCacheTags(),
|
||||
],
|
||||
];
|
||||
|
||||
// Filter to configurable quick form plugins.
|
||||
$plugins = array_filter($this->quickFormPluginManager->getDefinitions(), function (array $plugin) {
|
||||
if (($instance = $this->quickFormPluginManager->createInstance($plugin['id'])) && $instance->isConfigurable()) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
});
|
||||
|
||||
if (empty($plugins)) {
|
||||
$render['#add_bundle_message'] = $this->t('No quick forms are available. Enable a module that provides quick forms.');
|
||||
}
|
||||
|
||||
// Add link for each configurable plugin.
|
||||
foreach ($plugins as $plugin_id => $plugin) {
|
||||
$render['#bundles'][$plugin_id] = [
|
||||
'label' => Html::escape($plugin['label']),
|
||||
'description' => Html::escape($plugin['description']) ?? '',
|
||||
'add_link' => Link::createFromRoute($plugin['label'], 'farm_quick.add_form', ['plugin' => $plugin_id]),
|
||||
];
|
||||
}
|
||||
|
||||
return $render;
|
||||
}
|
||||
|
||||
}
|
|
@ -2,8 +2,10 @@
|
|||
|
||||
namespace Drupal\farm_quick\Controller;
|
||||
|
||||
use Drupal\Component\Utility\Html;
|
||||
use Drupal\Core\Cache\CacheableMetadata;
|
||||
use Drupal\Core\Controller\ControllerBase;
|
||||
use Drupal\Core\Render\Markup;
|
||||
use Drupal\Core\StringTranslation\StringTranslationTrait;
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\farm_quick\QuickFormInstanceManagerInterface;
|
||||
|
@ -63,8 +65,15 @@ class QuickFormController extends ControllerBase {
|
|||
$url = Url::fromRoute('farm.quick.' . $id);
|
||||
if ($url->access()) {
|
||||
$items[] = [
|
||||
'title' => $quick_form->getLabel(),
|
||||
'description' => $quick_form->getDescription(),
|
||||
// Wrap the title in Markup::create() because the template preprocess
|
||||
// function for admin_block_content uses Link::fromTextAndUrl(), which
|
||||
// sanitizes strings automatically. This avoids double-sanitization,
|
||||
// but also ensures we are sanitizing consistently in this code, in
|
||||
// case anything changes later.
|
||||
// @see template_preprocess_admin_block_content()
|
||||
// @see \Drupal\Core\Link::fromTextAndUrl()
|
||||
'title' => Markup::create(Html::escape($quick_form->getLabel())),
|
||||
'description' => Html::escape($quick_form->getDescription()),
|
||||
'url' => $url,
|
||||
];
|
||||
}
|
||||
|
|
|
@ -23,13 +23,27 @@ use Drupal\farm_quick\QuickFormPluginCollection;
|
|||
* handlers = {
|
||||
* "access" = "\Drupal\entity\EntityAccessControlHandler",
|
||||
* "permission_provider" = "\Drupal\entity\EntityPermissionProvider",
|
||||
* "list_builder" = "Drupal\farm_quick\QuickFormListBuilder",
|
||||
* "form" = {
|
||||
* "add" = "Drupal\farm_quick\Form\QuickFormEntityForm",
|
||||
* "edit" = "Drupal\farm_quick\Form\QuickFormEntityForm",
|
||||
* "configure" = "Drupal\farm_quick\Form\ConfigureQuickForm",
|
||||
* "delete" = "\Drupal\Core\Entity\EntityDeleteForm",
|
||||
* },
|
||||
* "route_provider" = {
|
||||
* "default" = "Drupal\entity\Routing\DefaultHtmlRouteProvider",
|
||||
* },
|
||||
* },
|
||||
* admin_permission = "administer quick_form",
|
||||
* entity_keys = {
|
||||
* "id" = "id",
|
||||
* "status" = "status"
|
||||
* "status" = "status",
|
||||
* "label" = "label",
|
||||
* },
|
||||
* links = {
|
||||
* "edit-form" = "/setup/quick/{quick_form}/edit",
|
||||
* "delete-form" = "/setup/quick/{quick_form}/delete",
|
||||
* "collection" = "/setup/quick"
|
||||
* },
|
||||
* config_export = {
|
||||
* "id",
|
||||
|
|
|
@ -1,159 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\farm_quick\Form;
|
||||
|
||||
use Drupal\Core\Access\AccessResult;
|
||||
use Drupal\Core\Entity\EntityForm;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\Core\Form\SubformState;
|
||||
use Drupal\Core\Routing\RouteMatchInterface;
|
||||
use Drupal\Core\Session\AccountInterface;
|
||||
use Drupal\farm_quick\Plugin\QuickForm\ConfigurableQuickFormInterface;
|
||||
use Drupal\farm_quick\QuickFormInstanceManagerInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
|
||||
|
||||
/**
|
||||
* Form that renders quick form configuration forms.
|
||||
*
|
||||
* @ingroup farm
|
||||
*/
|
||||
class ConfigureQuickForm extends EntityForm {
|
||||
|
||||
/**
|
||||
* The entity being used by this form.
|
||||
*
|
||||
* @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface
|
||||
*/
|
||||
protected $entity;
|
||||
|
||||
/**
|
||||
* The quick form instance manager.
|
||||
*
|
||||
* @var \Drupal\farm_quick\QuickFormInstanceManagerInterface
|
||||
*/
|
||||
protected $quickFormInstanceManager;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param \Drupal\farm_quick\QuickFormInstanceManagerInterface $quick_form_instance_manager
|
||||
* The quick form instance manager.
|
||||
*/
|
||||
public function __construct(QuickFormInstanceManagerInterface $quick_form_instance_manager) {
|
||||
$this->quickFormInstanceManager = $quick_form_instance_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container) {
|
||||
return new static(
|
||||
$container->get('quick_form.instance_manager'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the title of the quick form.
|
||||
*
|
||||
* @param string $quick_form
|
||||
* The quick form ID.
|
||||
*
|
||||
* @return \Drupal\Core\StringTranslation\TranslatableMarkup
|
||||
* Quick form title.
|
||||
*/
|
||||
public function getTitle(string $quick_form) {
|
||||
$quick_form_title = NULL;
|
||||
if ($quick_form = $this->getQuickFormInstance($quick_form)) {
|
||||
$quick_form_title = $quick_form->getLabel();
|
||||
}
|
||||
return $this->t('Configure @quick_form', ['@quick_form' => $quick_form_title]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks access for configuration of a specific quick form.
|
||||
*
|
||||
* @param \Drupal\Core\Session\AccountInterface $account
|
||||
* Run access checks for this account.
|
||||
* @param string|null $quick_form
|
||||
* The quick form ID.
|
||||
*
|
||||
* @return \Drupal\Core\Access\AccessResultInterface
|
||||
* The access result.
|
||||
*/
|
||||
public function access(AccountInterface $account, string $quick_form = NULL) {
|
||||
|
||||
// Get a quick form config entity.
|
||||
if ($quick_form !== NULL) {
|
||||
$quick_form = $this->getQuickFormInstance($quick_form);
|
||||
}
|
||||
|
||||
// Raise 404 if no quick form exists. This is the case with a quick form
|
||||
// ID that is not a valid quick form plugin ID.
|
||||
if ($quick_form === NULL) {
|
||||
throw new ResourceNotFoundException();
|
||||
}
|
||||
|
||||
// Deny access if the quick form plugin is not configurable.
|
||||
if (!$quick_form->getPlugin() instanceof ConfigurableQuickFormInterface) {
|
||||
return AccessResult::forbidden();
|
||||
}
|
||||
|
||||
// Check the update quick_form permission.
|
||||
$configure_form_access = AccessResult::allowedIfHasPermissions($account, ['update quick_form']);
|
||||
return $quick_form->getPlugin()->access($account)->andIf($configure_form_access);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function form(array $form, FormStateInterface $form_state) {
|
||||
$form = parent::form($form, $form_state);
|
||||
$form['settings'] = [
|
||||
'#tree' => TRUE,
|
||||
];
|
||||
$form['settings'] = $this->entity->getPlugin()->buildConfigurationForm($form['settings'], SubformState::createForSubform($form['settings'], $form, $form_state));
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function validateForm(array &$form, FormStateInterface $form_state) {
|
||||
parent::validateForm($form, $form_state);
|
||||
$this->entity->getPlugin()->validateConfigurationForm($form['settings'], SubformState::createForSubform($form['settings'], $form, $form_state));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function submitForm(array &$form, FormStateInterface $form_state) {
|
||||
parent::submitForm($form, $form_state);
|
||||
$this->entity->getPlugin()->submitConfigurationForm($form['settings'], SubformState::createForSubform($form['settings'], $form, $form_state));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getEntityFromRouteMatch(RouteMatchInterface $route_match, $entity_type_id) {
|
||||
$entity = NULL;
|
||||
if ($route_match->getRawParameter($entity_type_id) !== NULL) {
|
||||
$entity = $this->getQuickFormInstance($route_match->getParameter($entity_type_id));
|
||||
}
|
||||
return $entity;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to get a quick form instance.
|
||||
*
|
||||
* @param string $quick_form_id
|
||||
* The quick form ID.
|
||||
*
|
||||
* @return \Drupal\farm_quick\Entity\QuickFormInstanceInterface|null
|
||||
* The quick form instance or NULL if does not exist.
|
||||
*/
|
||||
protected function getQuickFormInstance(string $quick_form_id) {
|
||||
return $this->quickFormInstanceManager->getInstance($quick_form_id);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,210 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\farm_quick\Form;
|
||||
|
||||
use Drupal\Component\Utility\Html;
|
||||
use Drupal\Core\Entity\EntityForm;
|
||||
use Drupal\Core\Form\FormStateInterface;
|
||||
use Drupal\Core\Form\SubformState;
|
||||
use Drupal\Core\Routing\RouteMatchInterface;
|
||||
use Drupal\farm_quick\Entity\QuickFormInstance;
|
||||
use Drupal\farm_quick\QuickFormPluginManager;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
|
||||
/**
|
||||
* Form that renders quick form configuration forms.
|
||||
*/
|
||||
class QuickFormEntityForm extends EntityForm {
|
||||
|
||||
/**
|
||||
* The entity being used by this form.
|
||||
*
|
||||
* @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface
|
||||
*/
|
||||
protected $entity;
|
||||
|
||||
/**
|
||||
* The quick form plugin manager.
|
||||
*
|
||||
* @var \Drupal\farm_quick\QuickFormPluginManager
|
||||
*/
|
||||
protected $quickFormPluginManager;
|
||||
|
||||
/**
|
||||
* Constructs a new QuickFormEntityForm object.
|
||||
*
|
||||
* @param \Drupal\farm_quick\QuickFormPluginManager $quick_form_plugin_manager
|
||||
* The quick form plugin manager.
|
||||
*/
|
||||
public function __construct(QuickFormPluginManager $quick_form_plugin_manager) {
|
||||
$this->quickFormPluginManager = $quick_form_plugin_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container) {
|
||||
return new static(
|
||||
$container->get('plugin.manager.quick_form'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function form(array $form, FormStateInterface $form_state, string $plugin = NULL) {
|
||||
$form = parent::form($form, $form_state);
|
||||
|
||||
// Add tabs if the quick form plugin is configurable.
|
||||
$tab_group = NULL;
|
||||
if ($this->entity->getPlugin()->isConfigurable()) {
|
||||
$form['tabs'] = [
|
||||
'#type' => 'vertical_tabs',
|
||||
];
|
||||
$form['quick_form'] = [
|
||||
'#type' => 'details',
|
||||
'#title' => $this->t('Quick form'),
|
||||
'#group' => 'tabs',
|
||||
];
|
||||
$tab_group = 'quick_form';
|
||||
|
||||
// Render the plugin form in settings tab.
|
||||
$form['settings_tab'] = [
|
||||
'#type' => 'details',
|
||||
'#title' => Html::escape($this->entity->getPlugin()->getLabel()),
|
||||
'#group' => 'tabs',
|
||||
'#weight' => 50,
|
||||
];
|
||||
$form['settings'] = [
|
||||
'#tree' => TRUE,
|
||||
'#type' => 'container',
|
||||
'#group' => 'settings_tab',
|
||||
];
|
||||
$form['settings'] = $this->entity->getPlugin()->buildConfigurationForm($form['settings'], SubformState::createForSubform($form['settings'], $form, $form_state));
|
||||
}
|
||||
|
||||
$form['label'] = [
|
||||
'#type' => 'textfield',
|
||||
'#title' => $this->t('Label'),
|
||||
'#maxlength' => 255,
|
||||
'#required' => TRUE,
|
||||
'#group' => $tab_group,
|
||||
];
|
||||
|
||||
$form['id'] = [
|
||||
'#type' => 'machine_name',
|
||||
'#machine_name' => [
|
||||
'exists' => '\Drupal\farm_quick\Entity\QuickFormInstance::load',
|
||||
],
|
||||
'#disabled' => !$this->entity->isNew() || $this->getRequest()->get('override'),
|
||||
'#group' => $tab_group,
|
||||
];
|
||||
|
||||
// Provide default label and ID for existing config entities
|
||||
// or if the override parameter is set.
|
||||
if (!$this->entity->isNew() || $this->getRequest()->get('override')) {
|
||||
$form['label']['#default_value'] = $this->entity->label();
|
||||
$form['id']['#default_value'] = $this->entity->id();
|
||||
}
|
||||
|
||||
// Adjust form title.
|
||||
if ($this->entity->isNew()) {
|
||||
$form['#title'] = $this->t('Add quick form: @label', ['@label' => $this->entity->getPlugin()->getLabel()]);
|
||||
if ($this->getRequest()->get('override')) {
|
||||
$form['#title'] = $this->t('Override quick form: @label', ['@label' => $this->entity->getPlugin()->getLabel()]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$form['#title'] = $this->t('Edit quick form: @label', ['@label' => $this->entity->label()]);
|
||||
}
|
||||
|
||||
$form['description'] = [
|
||||
'#type' => 'textfield',
|
||||
'#title' => $this->t('Description'),
|
||||
'#description' => $this->t('A brief description of this quick form.'),
|
||||
'#default_value' => $this->entity->getDescription(),
|
||||
'#group' => $tab_group,
|
||||
];
|
||||
|
||||
$form['status'] = [
|
||||
'#type' => 'checkbox',
|
||||
'#title' => $this->t('Enabled'),
|
||||
'#description' => $this->t('Enable the quick form.'),
|
||||
'#default_value' => $this->entity->status(),
|
||||
'#group' => $tab_group,
|
||||
];
|
||||
|
||||
$form['helpText'] = [
|
||||
'#type' => 'textarea',
|
||||
'#title' => $this->t('Help Text'),
|
||||
'#description' => $this->t('Help text to display for the quick form.'),
|
||||
'#default_value' => $this->entity->getHelpText(),
|
||||
'#group' => $tab_group,
|
||||
];
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function validateForm(array &$form, FormStateInterface $form_state) {
|
||||
parent::validateForm($form, $form_state);
|
||||
|
||||
// Validate plugin form.
|
||||
if ($this->entity->getPlugin()->isConfigurable()) {
|
||||
$this->entity->getPlugin()->validateConfigurationForm($form['settings'], SubformState::createForSubform($form['settings'], $form, $form_state));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function submitForm(array &$form, FormStateInterface $form_state) {
|
||||
parent::submitForm($form, $form_state);
|
||||
|
||||
// Submit plugin form.
|
||||
if ($this->entity->getPlugin()->isConfigurable()) {
|
||||
$this->entity->getPlugin()->submitConfigurationForm($form['settings'], SubformState::createForSubform($form['settings'], $form, $form_state));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function save(array $form, FormStateInterface $form_state) {
|
||||
$status = parent::save($form, $form_state);
|
||||
$entity_type_label = $this->entity->getEntityType()->getSingularLabel();
|
||||
$this->messenger()->addMessage($this->t('Saved @entity_type_label: %label', ['@entity_type_label' => $entity_type_label, '%label' => $this->entity->label()]));
|
||||
$form_state->setRedirect('entity.quick_form.collection');
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getEntityFromRouteMatch(RouteMatchInterface $route_match, $entity_type_id) {
|
||||
|
||||
// Get existing quick form entity from route parameter.
|
||||
if ($route_match->getRawParameter($entity_type_id) !== NULL) {
|
||||
$entity = $route_match->getParameter($entity_type_id);
|
||||
}
|
||||
// Else create a new quick form entity, the plugin must be specified.
|
||||
else {
|
||||
if (($plugin = $route_match->getRawParameter('plugin')) && $this->quickFormPluginManager->hasDefinition($plugin)) {
|
||||
$entity = QuickFormInstance::create(['plugin' => $plugin]);
|
||||
if ($this->getRequest()->get('override')) {
|
||||
$entity->set('id', $plugin);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($entity)) {
|
||||
throw new NotFoundHttpException();
|
||||
}
|
||||
|
||||
return $entity;
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,7 @@
|
|||
namespace Drupal\farm_quick\Plugin\Derivative;
|
||||
|
||||
use Drupal\Component\Plugin\Derivative\DeriverBase;
|
||||
use Drupal\Component\Utility\Html;
|
||||
use Drupal\Core\Plugin\Discovery\ContainerDeriverInterface;
|
||||
use Drupal\farm_quick\QuickFormInstanceManagerInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
@ -59,9 +60,16 @@ class QuickFormMenuLink extends DeriverBase implements ContainerDeriverInterface
|
|||
|
||||
// Add a link for each quick form.
|
||||
foreach ($quick_forms as $id => $quick_form) {
|
||||
|
||||
// Skip disabled quick forms.
|
||||
if (!$quick_form->status()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create link.
|
||||
$route_id = 'farm.quick.' . $id;
|
||||
$links[$route_id] = [
|
||||
'title' => $quick_form->getLabel(),
|
||||
'title' => Html::escape($quick_form->getLabel()),
|
||||
'parent' => 'farm.quick:farm.quick',
|
||||
'route_name' => $route_id,
|
||||
] + $base_plugin_definition;
|
||||
|
|
|
@ -59,19 +59,6 @@ class QuickFormTaskLink extends DeriverBase implements ContainerDeriverInterface
|
|||
'base_route' => $route_name,
|
||||
'weight' => 0,
|
||||
] + $base_plugin_definition;
|
||||
|
||||
// If the quick form is configurable, add a link to the config form.
|
||||
if ($quick_form->getPlugin()->isConfigurable()) {
|
||||
$links["farm.quick.$id.configure"] = [
|
||||
'title' => $this->t('Configure'),
|
||||
'route_name' => 'farm_quick.configure',
|
||||
'route_parameters' => [
|
||||
'quick_form' => $id,
|
||||
],
|
||||
'base_route' => $route_name,
|
||||
'weight' => 100,
|
||||
] + $base_plugin_definition;
|
||||
}
|
||||
}
|
||||
|
||||
return $links;
|
||||
|
|
|
@ -60,7 +60,7 @@ class QuickFormInstanceManager implements QuickFormInstanceManagerInterface {
|
|||
// Load quick form instance configuration entities for this plugin.
|
||||
// Exclude disabled quick forms.
|
||||
/** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface[] $entities */
|
||||
$entities = $this->entityTypeManager->getStorage('quick_form')->loadByProperties(['plugin' => $plugin['id'], 'status' => TRUE]);
|
||||
$entities = $this->entityTypeManager->getStorage('quick_form')->loadByProperties(['plugin' => $plugin['id']]);
|
||||
foreach ($entities as $entity) {
|
||||
$entity->getPlugin()->setQuickId($entity->id());
|
||||
$instances[$entity->id()] = $entity;
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\farm_quick;
|
||||
|
||||
use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
use Drupal\Core\Entity\EntityStorageInterface;
|
||||
use Drupal\Core\Entity\EntityTypeInterface;
|
||||
use Drupal\Core\Url;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
|
||||
/**
|
||||
* Provides a listing of template entities.
|
||||
*/
|
||||
class QuickFormListBuilder extends ConfigEntityListBuilder {
|
||||
|
||||
/**
|
||||
* The quick form instance manager.
|
||||
*
|
||||
* @var \Drupal\farm_quick\QuickFormInstanceManagerInterface
|
||||
*/
|
||||
protected $quickFormInstanceManager;
|
||||
|
||||
/**
|
||||
* Constructs a new QuickFormListBuilder object.
|
||||
*
|
||||
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
|
||||
* The entity type definition.
|
||||
* @param \Drupal\Core\Entity\EntityStorageInterface $storage
|
||||
* The entity storage class.
|
||||
* @param \Drupal\farm_quick\QuickFormInstanceManagerInterface $quick_form_instance_manager
|
||||
* The quick form instance manager.
|
||||
*/
|
||||
public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, QuickFormInstanceManagerInterface $quick_form_instance_manager) {
|
||||
parent::__construct($entity_type, $storage);
|
||||
$this->quickFormInstanceManager = $quick_form_instance_manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
|
||||
return new static(
|
||||
$entity_type,
|
||||
$container->get('entity_type.manager')->getStorage($entity_type->id()),
|
||||
$container->get('quick_form.instance_manager'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function load() {
|
||||
return $this->quickFormInstanceManager->getInstances();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function render() {
|
||||
|
||||
$render['table'] = [
|
||||
'#type' => 'table',
|
||||
'#header' => $this->buildHeader(),
|
||||
'#caption' => $this->t('Configured quick forms'),
|
||||
'#rows' => [],
|
||||
'#empty' => $this->t('There are no configured @label.', ['@label' => $this->entityType->getPluralLabel()]),
|
||||
'#cache' => [
|
||||
'contexts' => $this->entityType->getListCacheContexts(),
|
||||
'tags' => $this->entityType->getListCacheTags(),
|
||||
],
|
||||
];
|
||||
|
||||
$render['default'] = [
|
||||
'#type' => 'table',
|
||||
'#header' => $this->buildHeader(),
|
||||
'#caption' => $this->t('Default quick forms'),
|
||||
'#rows' => [],
|
||||
'#empty' => $this->t('There are no default @label.', ['@label' => $this->entityType->getPluralLabel()]),
|
||||
];
|
||||
|
||||
// Load all quick form instances into proper table.
|
||||
$quick_form_instances = $this->load();
|
||||
foreach ($quick_form_instances as $entity) {
|
||||
$target = $entity->isNew() ? 'default' : 'table';
|
||||
if ($row = $this->buildRow($entity)) {
|
||||
$render[$target][$entity->id()] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
return $render;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildHeader() {
|
||||
$header['enabled'] = $this->t('Enabled');
|
||||
$header['type'] = $this->t('Plugin');
|
||||
$header['label'] = $this->t('Label');
|
||||
$header['id'] = $this->t('ID');
|
||||
$header['description'] = $this->t('Description');
|
||||
return $header + parent::buildHeader();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function buildRow(EntityInterface $entity) {
|
||||
/** @var \Drupal\farm_quick\Entity\QuickFormInstanceInterface $quick_form */
|
||||
$quick_form = $entity;
|
||||
$row['enabled'] = [
|
||||
'#type' => 'checkbox',
|
||||
'#checked' => $quick_form->status(),
|
||||
'#attributes' => [
|
||||
'disabled' => 'disabled',
|
||||
],
|
||||
];
|
||||
$row['type'] = [
|
||||
'#plain_text' => $quick_form->getPlugin()->getLabel(),
|
||||
];
|
||||
$row['label'] = [
|
||||
'#plain_text' => $quick_form->getLabel(),
|
||||
];
|
||||
$row['id'] = [
|
||||
'#plain_text' => $quick_form->id(),
|
||||
];
|
||||
$row['description'] = [
|
||||
'#plain_text' => $quick_form->getDescription(),
|
||||
];
|
||||
return $row + parent::buildRow($entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDefaultOperations(EntityInterface $entity) {
|
||||
$operations = parent::getDefaultOperations($entity);
|
||||
|
||||
// Override operations for default quick form instances.
|
||||
if ($entity->isNew()) {
|
||||
|
||||
// Remove edit operation.
|
||||
unset($operations['edit']);
|
||||
|
||||
// Add override operation.
|
||||
$operations['override'] = [
|
||||
'title' => $this->t('Override'),
|
||||
'weight' => 0,
|
||||
'url' => $this->ensureDestination(Url::fromRoute('farm_quick.add_form', ['plugin' => $entity->getPluginId()], ['query' => ['override' => TRUE]])),
|
||||
];
|
||||
}
|
||||
|
||||
return $operations;
|
||||
}
|
||||
|
||||
}
|
|
@ -52,6 +52,11 @@ class QuickFormRoutes implements ContainerInjectionInterface {
|
|||
$quick_forms = $this->quickFormInstanceManager->getInstances();
|
||||
foreach ($quick_forms as $id => $quick_form) {
|
||||
|
||||
// Skip quick forms that are disabled.
|
||||
if (!$quick_form->status()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Build a route for the quick form.
|
||||
$route = new Route(
|
||||
"/quick/$id",
|
||||
|
|
|
@ -91,21 +91,10 @@ class QuickFormTest extends FarmBrowserTestBase {
|
|||
$this->assertSession()->statusCodeEquals(200);
|
||||
$this->assertSession()->responseContains('value="100"');
|
||||
|
||||
// Go to the test configuration form and confirm that access is denied.
|
||||
$this->drupalGet('quick/configurable_test/configure');
|
||||
$this->assertSession()->statusCodeEquals(403);
|
||||
|
||||
// Create and login a test user with permission to create test logs and
|
||||
// permission to update quick forms.
|
||||
$user = $this->createUser(['view quick_form', 'create test log', 'update quick_form']);
|
||||
$this->drupalLogin($user);
|
||||
|
||||
// Go to the default configurable_test quick form and confirm that the
|
||||
// default value field is visible and the default value is 100.
|
||||
$this->drupalGet('quick/configurable_test/configure');
|
||||
$this->assertSession()->statusCodeEquals(200);
|
||||
$this->assertSession()->pageTextContains($this->t('Default value'));
|
||||
$this->assertSession()->responseContains('value="100"');
|
||||
// Attempt to load the edit form for the unsaved configurable_test quick
|
||||
// form and confirm 404 not found.
|
||||
$this->drupalGet('setup/quick/foo/configurable_test');
|
||||
$this->assertSession()->statusCodeEquals(404);
|
||||
|
||||
// Go to the configurable_test2 quick form and confirm access is granted and
|
||||
// the default value is 500.
|
||||
|
@ -113,9 +102,19 @@ class QuickFormTest extends FarmBrowserTestBase {
|
|||
$this->assertSession()->statusCodeEquals(200);
|
||||
$this->assertSession()->responseContains('value="500"');
|
||||
|
||||
// Attempt to load the edit form for saved configurable_test2 quick
|
||||
// form and confirm 403.
|
||||
$this->drupalGet('setup/quick/configurable_test2/edit');
|
||||
$this->assertSession()->statusCodeEquals(403);
|
||||
|
||||
// Create and login a test user with permission to create test logs and
|
||||
// permission to update quick forms.
|
||||
$user = $this->createUser(['view quick_form', 'create test log', 'update quick_form']);
|
||||
$this->drupalLogin($user);
|
||||
|
||||
// Go to the configurable_test2 quick form and confirm that the default
|
||||
// value field is visible and the default value is 500.
|
||||
$this->drupalGet('quick/configurable_test2/configure');
|
||||
$this->drupalGet('setup/quick/configurable_test2/edit');
|
||||
$this->assertSession()->statusCodeEquals(200);
|
||||
$this->assertSession()->pageTextContains($this->t('Default value'));
|
||||
$this->assertSession()->responseContains('value="500"');
|
||||
|
@ -127,12 +126,12 @@ class QuickFormTest extends FarmBrowserTestBase {
|
|||
$config_entity->save();
|
||||
$this->drupalGet('quick/configurable_test2');
|
||||
$this->assertSession()->responseContains('value="600"');
|
||||
$this->drupalGet('quick/configurable_test2/configure');
|
||||
$this->drupalGet('setup/quick/configurable_test2/edit');
|
||||
$this->assertSession()->responseContains('value="600"');
|
||||
|
||||
// Attempt to load a configuration form for a non-existent quick form and
|
||||
// Attempt to load an edit form for a non-existent quick form and
|
||||
// confirm 404 not found.
|
||||
$this->drupalGet('quick/foo/configure');
|
||||
$this->drupalGet('setup/quick/foo/edit');
|
||||
$this->assertSession()->statusCodeEquals(404);
|
||||
|
||||
// Go to the requires_entity_test quick form and confirm 404 not found.
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
namespace Drupal\Tests\farm_quick\Kernel;
|
||||
|
||||
use Drupal\Core\Form\FormState;
|
||||
use Drupal\farm_quick\Form\ConfigureQuickForm;
|
||||
use Drupal\farm_quick\Form\QuickFormEntityForm;
|
||||
use Drupal\KernelTests\KernelTestBase;
|
||||
|
||||
/**
|
||||
|
@ -152,11 +152,15 @@ class QuickFormTest extends KernelTestBase {
|
|||
// Confirm that the config entity for this quick form has not been saved.
|
||||
$this->assertTrue($quick_form->isNew());
|
||||
|
||||
// Programmatically submit the configurable_test config form.
|
||||
$form = ConfigureQuickForm::create(\Drupal::getContainer());
|
||||
// Programmatically submit the quick form entity form.
|
||||
$form = QuickFormEntityForm::create(\Drupal::getContainer());
|
||||
$form->setModuleHandler(\Drupal::moduleHandler());
|
||||
$form->setEntity($quick_form);
|
||||
$form_state = (new FormState())->setValues([
|
||||
// Set the ID and label because no default value is provided for these
|
||||
// in the form unless the override query param is set.
|
||||
'id' => $quick_form->id(),
|
||||
'label' => (string) $quick_form->label(),
|
||||
'settings' => [
|
||||
'test_default' => '101',
|
||||
],
|
||||
|
|
Loading…
Reference in New Issue