Skip to content
Snippets Groups Projects
Commit a9e12460 authored by Owen Bush's avatar Owen Bush Committed by Owen Bush
Browse files

Issue #3173249 by owenbush, MrPaulDriver: Allow Registrants to be Versionable and Add Status

parent 3ec01188
No related branches found
No related tags found
No related merge requests found
Showing
with 515 additions and 15 deletions
......@@ -189,4 +189,73 @@ function recurring_events_registration_update_8004() {
->set('already_registered', 'ser already registered for this event.')
->set('registration_closed', 'Unfortunately, registration is not available at this time.')
->save(TRUE);
}
\ No newline at end of file
}
/**
* Install the new status field.
*/
function recurring_events_registration_update_8005() {
$definition_update_manager = \Drupal::entityDefinitionUpdateManager();
// Add the status field.
$status = BaseFieldDefinition::create('boolean')
->setLabel(t('Status'))
->setDescription(t('Is this registration complete?'))
->setDefaultValue(FALSE)
->setInitialValue(FALSE)
->setSetting('on_label', 'Complete')
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
'settings' => [
'display_label' => FALSE,
],
'weight' => 100,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayOptions('view', [
'type' => 'boolean',
'label' => 'above',
'weight' => 0,
'settings' => [
'format' => 'enabled-disabled',
],
])
->setDisplayConfigurable('view', FALSE);
$definition_update_manager->installFieldStorageDefinition('status', 'registrant', 'registrant', $status);
}
/**
* Update existing registrants to be marked as completed.
*/
function recurring_events_registration_update_8006(&$sandbox) {
// This is a multipass update.
// Grab all the registrants.
if (empty($sandbox['registrants'])) {
$registrants = \Drupal::entityTypeManager()
->getStorage('registrant')
->getQuery()
->execute();
$sandbox['registrants'] = $registrants;
$sandbox['max'] = count($registrants);
$sandbox['limit'] = 20;
$sandbox['progress'] = 0;
}
if (count($sandbox['registrants']) > 0) {
// Loop through chunks of 20 registrants at a time.
$registrant_ids = array_splice($sandbox['registrants'], 0, $sandbox['limit'], []);
if (!empty($registrant_ids)) {
$registrants = \Drupal::entityTypeManager()->getStorage('registrant')->loadMultiple($registrant_ids);
foreach ($registrants as $registrant) {
$registrant->status = 1;
$registrant->save();
$sandbox['progress']++;
}
$sandbox['#finished'] = ($sandbox['progress'] / $sandbox['max']);
}
}
else {
$sandbox['#finished'] = 1;
}
}
......@@ -10,11 +10,13 @@ use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Render\Element;
use Drupal\Core\Entity\EntityInterface;
use Drupal\recurring_events_registration\Entity\Registrant;
use Drupal\recurring_events\Entity\EventSeries;
use Drupal\recurring_events\Entity\EventInstance;
use Drupal\Core\Url;
use Drupal\Component\Utility\Html;
use Drupal\Core\Form\FormStateInterface;
use Drupal\recurring_events_registration\Entity\RegistrantInterface;
use Drupal\recurring_events_registration\Form\RegistrantForm;
/**
* Implements hook_help().
......@@ -254,10 +256,10 @@ function recurring_events_registration_recurring_events_pre_delete_instances(Eve
*
* @param string $key
* The mail key used to determine the message and subject.
* @param \Drupal\recurring_events_registration\Entity\Registrant $registrant
* @param \Drupal\recurring_events_registration\Entity\RegistrantInterface $registrant
* The registrant this email relates to.
*/
function recurring_events_registration_send_notification($key, Registrant $registrant) {
function recurring_events_registration_send_notification($key, RegistrantInterface $registrant) {
$config = \Drupal::config('recurring_events_registration.registrant.config');
$send_email = $config->get('email_notifications');
if ($send_email) {
......@@ -364,3 +366,41 @@ function recurring_events_registration_registrant_insert(EntityInterface $entity
$state->set($state_key, $state_values);
}
}
/**
* Implements hook_form_alter().
*
* @TODO: Remove when https://www.drupal.org/node/3173241 drops.
*/
function recurring_events_registration_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
/* @var \Drupal\recurring_events_registration\Form\RegistrantForm $form_object */
$form_object = $form_state->getFormObject();
if ($form_object instanceof RegistrantForm)
/* @var \Drupal\recurring_events_registration\Entity\RegistrantInterface $entity */
$entity = $form_object->getEntity();
if (!empty($entity) && $entity instanceof RegistrantInterface && $entity->getEntityTypeId() === 'registrant') {
foreach ($form['actions']['submit']['#submit'] as $key => $submit) {
if (is_array($submit) && $submit[0] === 'Drupal\content_moderation\EntityTypeInfo') {
unset($form['actions']['submit']['#submit'][$key]);
}
}
}
}
/**
* Implements hook_module_implements_alter().
*
* @TODO: Remove when https://www.drupal.org/node/3173241 drops.
*/
function recurring_events_registration_module_implements_alter(&$implementations, $hook) {
if ($hook == 'form_alter') {
// Move recurring_events_registration_form_alter() to the end of the
// list because we need to make sure we override the content moderation
// latest-version link template to also pass through the eventinstance ID to
// the URL.
// @see recurring_events_registration_form_alter().
$group = $implementations['recurring_events_registration'];
unset($implementations['recurring_events_registration']);
$implementations['recurring_events_registration'] = $group;
}
}
<?php
/**
* @file
* Post update hooks for the recurring_events_registration module.
*/
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\StringTranslation\TranslatableMarkup;
/**
* Update registrant to be revisionable.
*/
function recurring_events_registration_post_update_make_registrant_revisionable(&$sandbox) {
$definition_update_manager = \Drupal::entityDefinitionUpdateManager();
/** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */
$last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');
$entity_type = $definition_update_manager->getEntityType('registrant');
$field_storage_definitions = $last_installed_schema_repository->getLastInstalledFieldStorageDefinitions('registrant');
// Update the entity type definition.
$entity_keys = $entity_type->getKeys();
$entity_keys['revision'] = 'revision_id';
$entity_keys['published'] = 'status';
$entity_type->set('entity_keys', $entity_keys);
$entity_type->set('revision_table', 'registrant_revision');
$revision_metadata_keys = [
'revision_default' => 'revision_default',
'revision_user' => 'revision_user',
'revision_created' => 'revision_created',
'revision_log_message' => 'revision_log_message',
];
$entity_type->set('revision_metadata_keys', $revision_metadata_keys);
// Update the field storage definitions and add the new ones required by a
// revisionable entity type.
$field_storage_definitions['user_id']->setRevisionable(TRUE);
$field_storage_definitions['email']->setRevisionable(TRUE);
$field_storage_definitions['waitlist']->setRevisionable(TRUE);
$field_storage_definitions['changed']->setRevisionable(TRUE);
$field_storage_definitions['status']->setRevisionable(TRUE);
$field_storage_definitions['revision_id'] = BaseFieldDefinition::create('integer')
->setName('revision_id')
->setTargetEntityTypeId('registrant')
->setTargetBundle(NULL)
->setLabel(new TranslatableMarkup('Revision ID'))
->setReadOnly(TRUE)
->setSetting('unsigned', TRUE);
$field_storage_definitions['revision_default'] = BaseFieldDefinition::create('boolean')
->setName('revision_default')
->setTargetEntityTypeId('registrant')
->setTargetBundle(NULL)
->setLabel(new TranslatableMarkup('Default revision'))
->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.'))
->setStorageRequired(TRUE)
->setInternal(TRUE)
->setTranslatable(FALSE)
->setRevisionable(TRUE);
$field_storage_definitions['revision_created'] = BaseFieldDefinition::create('created')
->setName('revision_created')
->setTargetEntityTypeId('registrant')
->setTargetBundle(NULL)
->setLabel(new TranslatableMarkup('Revision create time'))
->setDescription(new TranslatableMarkup('The time that the current revision was created.'))
->setRevisionable(TRUE);
$field_storage_definitions['revision_user'] = BaseFieldDefinition::create('entity_reference')
->setName('revision_user')
->setTargetEntityTypeId('registrant')
->setTargetBundle(NULL)
->setLabel(new TranslatableMarkup('Revision user'))
->setDescription(new TranslatableMarkup('The user ID of the author of the current revision.'))
->setSetting('target_type', 'user')
->setRevisionable(TRUE);
$field_storage_definitions['revision_log_message'] = BaseFieldDefinition::create('string_long')
->setName('revision_log_message')
->setTargetEntityTypeId('registrant')
->setTargetBundle(NULL)
->setLabel(new TranslatableMarkup('Revision log message'))
->setDescription(new TranslatableMarkup('Briefly describe the changes you have made.'))
->setRevisionable(TRUE)
->setDefaultValue('');
$definition_update_manager->updateFieldableEntityType($entity_type, $field_storage_definitions, $sandbox);
return t('Registrants have been converted to be revisionable.');
}
......@@ -8,3 +8,7 @@ services:
recurring_events_registration.access_handler:
class: Drupal\recurring_events_registration\AccessHandler
arguments: ['@string_translation', '@recurring_events_registration.creation_service', '@current_route_match', '@entity_type.manager']
recurring_events_registration.route_subscriber:
class: Drupal\recurring_events_registration\Routing\RouteSubscriber
tags:
- { name: event_subscriber }
......@@ -4,7 +4,7 @@ namespace Drupal\recurring_events_registration\Entity;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EditorialContentEntityBase;
use Drupal\Core\Entity\EntityChangedTrait;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\user\UserInterface;
......@@ -37,19 +37,29 @@ use Drupal\recurring_events_registration\Plugin\Field\ComputedRegistrantTitleFie
* "access" = "Drupal\recurring_events_registration\RegistrantAccessControlHandler",
* },
* base_table = "registrant",
* revision_table = "registrant_revision",
* show_revision_ui = TRUE,
* translatable = FALSE,
* fieldable = TRUE,
* admin_permission = "administer registrant entities",
* entity_keys = {
* "id" = "id",
* "revision" = "revision_id",
* "uuid" = "uuid",
* "uid" = "user_id",
* "label" = "title",
* "bundle" = "bundle",
* "status" = "status",
* "published" = "status",
* },
* revision_metadata_keys = {
* "revision_user" = "revision_user",
* "revision_created" = "revision_created",
* "revision_log_message" = "revision_log_message"
* },
* links = {
* "canonical" = "/events/{eventinstance}/registrations//{registrant}",
* "edit-form" = "/events/{eventinstance}/registrations//{registrant}/edit",
* "canonical" = "/events/{eventinstance}/registrations/{registrant}",
* "edit-form" = "/events/{eventinstance}/registrations/{registrant}/edit",
* "delete-form" = "/events/{eventinstance}/registrations/{registrant}/delete",
* "anon-edit-form" = "/events/{eventinstance}/registrations/{registrant}/{uuid}/edit",
* "anon-delete-form" = "/events/{eventinstance}/registrations/{registrant}/{uuid}/delete"
......@@ -58,7 +68,7 @@ use Drupal\recurring_events_registration\Plugin\Field\ComputedRegistrantTitleFie
* field_ui_base_route = "entity.registrant_type.edit_form"
* )
*/
class Registrant extends ContentEntityBase implements RegistrantInterface {
class Registrant extends EditorialContentEntityBase implements RegistrantInterface {
use EntityChangedTrait;
......@@ -109,6 +119,14 @@ class Registrant extends ContentEntityBase implements RegistrantInterface {
return $this;
}
/**
* {@inheritdoc}
*/
public function setStatus($status) {
$this->set('status', $status);
return $this;
}
/**
* {@inheritdoc}
*/
......@@ -147,6 +165,7 @@ class Registrant extends ContentEntityBase implements RegistrantInterface {
$fields['user_id'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Authored by'))
->setRevisionable(TRUE)
->setDescription(t('The user ID of author of the Registrant entity.'))
->setSetting('target_type', 'user')
->setSetting('handler', 'default')
......@@ -171,6 +190,7 @@ class Registrant extends ContentEntityBase implements RegistrantInterface {
$fields['email'] = BaseFieldDefinition::create('email')
->setLabel(t('Email Address'))
->setRevisionable(TRUE)
->setDescription(t('The email address of the registrant'))
->setDisplayOptions('form', [
'type' => 'email_default',
......@@ -205,6 +225,7 @@ class Registrant extends ContentEntityBase implements RegistrantInterface {
->setSetting('target_type', 'eventinstance');
$fields['waitlist'] = BaseFieldDefinition::create('boolean')
->setRevisionable(TRUE)
->setLabel(t('Waitlist'))
->setDescription(t('Whether this registrant is waitlisted.'));
......@@ -221,6 +242,7 @@ class Registrant extends ContentEntityBase implements RegistrantInterface {
->setDescription(t('The time that the entity was created.'));
$fields['changed'] = BaseFieldDefinition::create('changed')
->setRevisionable(TRUE)
->setLabel(t('Changed'))
->setDescription(t('The time that the entity was last edited.'));
......@@ -230,6 +252,18 @@ class Registrant extends ContentEntityBase implements RegistrantInterface {
->setComputed(TRUE)
->setClass(ComputedRegistrantTitleFieldItemList::class);
$fields['status']
->setLabel(t('Status'))
->setDescription(t('Is this registration complete?'))
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
'settings' => [
'display_label' => TRUE,
],
'weight' => 120,
])
->setDisplayConfigurable('form', TRUE);
return $fields;
}
......
......@@ -189,7 +189,7 @@ class RegistrantDeleteForm extends ContentEntityDeleteForm {
* {@inheritdoc}
*/
protected function getDeletionMessage() {
/** @var \Drupal\omega_events\EventInterface $entity */
/** @var \Drupal\recurring_events\EventInterface $entity */
$entity = $this->getEntity();
return $this->t('Your registration for %email for %event has been cancelled.', [
......
......@@ -17,6 +17,7 @@ use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\content_moderation\ModerationInformation;
/**
* Form controller for Registrant edit forms.
......@@ -81,6 +82,13 @@ class RegistrantForm extends ContentEntityForm {
*/
protected $cacheTagsInvalidator;
/**
* The moderation information service.
*
* @var \Drupal\content_moderation\ModerationInformation
*/
protected $moderationInformation;
/**
* {@inheritdoc}
*/
......@@ -96,7 +104,8 @@ class RegistrantForm extends ContentEntityForm {
$container->get('entity_field.manager'),
$container->get('current_route_match'),
$container->get('entity_type.manager'),
$container->get('cache_tags.invalidator')
$container->get('cache_tags.invalidator'),
$container->has('content_moderation.moderation_information') ? $container->get('content_moderation.moderation_information') : NULL,
);
}
......@@ -125,6 +134,8 @@ class RegistrantForm extends ContentEntityForm {
* The entity type manager service.
* @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_invalidator
* The cache tags invalidator.
* @param \Drupal\content_moderation\ModerationInformation $moderation_information
* The moderation information service.
*/
public function __construct(
EntityRepositoryInterface $entity_repository,
......@@ -137,7 +148,8 @@ class RegistrantForm extends ContentEntityForm {
EntityFieldManager $field_manager,
RouteMatchInterface $route_match,
EntityTypeManagerInterface $entity_type_manager,
CacheTagsInvalidatorInterface $cache_tags_invalidator) {
CacheTagsInvalidatorInterface $cache_tags_invalidator,
ModerationInformation $moderation_information = NULL) {
$this->messenger = $messenger;
$this->creationService = $creation_service;
$this->currentUser = $current_user;
......@@ -146,6 +158,7 @@ class RegistrantForm extends ContentEntityForm {
$this->routeMatch = $route_match;
$this->entityTypeManager = $entity_type_manager;
$this->cacheTagsInvalidator = $cache_tags_invalidator;
$this->moderationInformation = $moderation_information;
parent::__construct($entity_repository, $entity_type_bundle_info, $time);
}
......@@ -323,7 +336,7 @@ class RegistrantForm extends ContentEntityForm {
// Prevent the form being displayed if registration is closed, or there are
// no spaces left, and no waitlist.
if (($availability === 0 && !$waitlist) || !$registration_open) {
if ((($availability === 0 && !$waitlist) || !$registration_open) && $new) {
foreach ($form_fields as $field_name => $field) {
if (isset($form[$field_name]) && $new) {
$form[$field_name]['#printed'] = TRUE;
......@@ -341,6 +354,11 @@ class RegistrantForm extends ContentEntityForm {
if (!$this->currentUser->hasPermission('modify registrant author')) {
$form['user_id']['#access'] = FALSE;
}
if (!$this->currentUser->hasPermission('administer registrant entity')) {
$form['revision_information']['#access'] = FALSE;
$form['status']['#access'] = FALSE;
}
}
/**
......@@ -349,7 +367,7 @@ class RegistrantForm extends ContentEntityForm {
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
/* @var $entity \Drupal\omega_events\Entity\Registrant */
/* @var $entity \Drupal\recurring_events\Entity\Registrant */
$entity = $this->entity;
// Only perform the checks if the entity is new.
......@@ -398,6 +416,9 @@ class RegistrantForm extends ContentEntityForm {
$event_instance = $this->routeMatch->getParameter('eventinstance');
$event_series = $event_instance->getEventSeries();
/* @var $entity \Drupal\recurring_events\Entity\RegistrantInterface */
$entity = $this->entity;
// Use the registration creation service to grab relevant data.
$this->creationService->setEventInstance($event_instance);
// Just to be sure we have a fresh copy of the event series.
......@@ -409,8 +430,6 @@ class RegistrantForm extends ContentEntityForm {
$reg_type = $this->creationService->getRegistrationType();
$registration = $this->creationService->hasRegistration();
$form_state->setRedirect('entity.registrant.add_form', ['eventinstance' => $event_instance->id()]);
if ($registration && $registration_open && ($availability > 0 || $availability == -1 || $waitlist)) {
$add_to_waitlist = (int) $form_state->getValue('add_to_waitlist');
$this->entity->setEventSeries($event_series);
......@@ -455,6 +474,17 @@ class RegistrantForm extends ContentEntityForm {
$this->messenger->addMessage($this->t($this->config('recurring_events_registration.registrant.config')->get('registration_closed')));
}
$form_state->setRedirect('entity.registrant.add_form', ['eventinstance' => $event_instance->id()]);
// @TODO: Remove when https://www.drupal.org/node/3173241 drops.
if ($this->moderationInformation) {
if ($this->moderationInformation->hasPendingRevision($entity) && $entity->hasLinkTemplate('latest-version')) {
$form_state->setRedirect('entity.registrant.latest_version', [
'eventinstance' => $entity->getEventInstance()->id(),
'registrant' => $entity->id(),
]);
}
}
}
}
......@@ -100,6 +100,7 @@ class RegistrantListBuilder extends EntityListBuilder {
}
$header['email'] = $this->t('Email');
$header['waitlist'] = $this->t('Waitlist');
$header['status'] = $this->t('Status');
return $header + parent::buildHeader();
}
......@@ -123,6 +124,7 @@ class RegistrantListBuilder extends EntityListBuilder {
}
$row['email'] = $entity->get('email')->value;
$row['waitlist'] = $entity->get('waitlist')->value ? $this->t('Yes') : $this->t('No');
$row['status'] = $entity->get('status')->value ? $this->t('Complete') : $this->t('Pending');
return $row + parent::buildRow($entity);
}
......
<?php
namespace Drupal\recurring_events_registration\Routing;
use Drupal\Core\Routing\RouteSubscriberBase;
use Symfony\Component\Routing\RouteCollection;
/**
* Listens to the dynamic route events.
*/
class RouteSubscriber extends RouteSubscriberBase {
/**
* {@inheritdoc}
*/
protected function alterRoutes(RouteCollection $collection) {
// Change path '/user/login' to '/login'.
if ($route = $collection->get('entity.registrant.latest_version')) {
$route->setRequirement('eventinstance', '\d+');
$option = $route->getOption('parameters');
$option['eventinstance'] = [
'type' => 'entity:eventinstance',
'load_latest_revision' => TRUE,
];
$route->setOption('parameters', $option);
}
}
}
......@@ -704,6 +704,73 @@ display:
entity_type: registrant
entity_field: user_id
plugin_id: field
status:
id: status
table: registrant
field: status
relationship: none
group_type: group
admin_label: ''
label: Status
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: boolean
settings:
format: custom
format_custom_true: Complete
format_custom_false: Pending
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
entity_type: registrant
entity_field: status
plugin_id: field
operations:
id: operations
table: registrant
......@@ -1555,6 +1622,73 @@ display:
entity_type: registrant
entity_field: user_id
plugin_id: field
status:
id: status
table: registrant
field: status
relationship: none
group_type: group
admin_label: ''
label: Status
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: boolean
settings:
format: custom
format_custom_true: Complete
format_custom_false: Pending
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
entity_type: registrant
entity_field: status
plugin_id: field
operations:
id: operations
table: registrant
......@@ -2428,6 +2562,73 @@ display:
entity_type: registrant
entity_field: type
plugin_id: field
status:
id: status
table: registrant
field: status
relationship: none
group_type: group
admin_label: ''
label: Status
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: boolean
settings:
format: custom
format_custom_true: Complete
format_custom_false: Pending
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
entity_type: registrant
entity_field: status
plugin_id: field
operations:
id: operations
table: registrant
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment