From 08207dd2dfcb1494219a0100944d0aaf04924d4c Mon Sep 17 00:00:00 2001
From: Owen Bush <ojb@ukhhf.co.uk>
Date: Thu, 28 Mar 2019 17:33:10 -0600
Subject: [PATCH] Added cloning

---
 recurring_events.module                   | 17 +++++++++++++++++
 recurring_events.permissions.yml          | 21 +++++++++++++++++++++
 recurring_events.routing.yml              | 16 +++++++++++++++-
 src/Entity/EventInstance.php              |  2 --
 src/EventInstanceAccessControlHandler.php |  3 ---
 5 files changed, 53 insertions(+), 6 deletions(-)

diff --git a/recurring_events.module b/recurring_events.module
index e2704dbd..31285b70 100644
--- a/recurring_events.module
+++ b/recurring_events.module
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Entity\EntityInterface;
 
 /**
  * Implements hook_help().
@@ -22,3 +23,19 @@ function recurring_events_help($route_name, RouteMatchInterface $route_match) {
     default:
   }
 }
+
+/**
+ * Implements hook_entity_operation().
+ */
+function recurring_events_entity_operation(EntityInterface $entity) {
+  $operations = [];
+  if ($entity->getEntityTypeId() == 'eventseries' || $entity->getEntityTypeId() == 'eventinstance') {
+    $operations['clone'] = [
+      'title' => t('Clone'),
+      'weight' => 50,
+      'url' => $entity->toUrl('clone-form'),
+    ];
+  }
+
+  return $operations;
+}
diff --git a/recurring_events.permissions.yml b/recurring_events.permissions.yml
index 28af1d21..fa37cd70 100644
--- a/recurring_events.permissions.yml
+++ b/recurring_events.permissions.yml
@@ -19,6 +19,27 @@ administer eventseries entity:
   description: 'Make changes to the event series entity type.'
   restrict access: true
 
+# Event Instance Entities.
+view eventinstance entity:
+  title: 'View eventinstance entity'
+  description: 'View existing event instance entities'
+view unpublished eventinstance entity:
+  title: 'View unpublished eventinstance entity'
+  description: 'View exisiting unpublished event instance entities'
+edit eventinstance entity:
+  title: 'Edit eventinstance entity'
+  description: 'Modify existing event instance entities'
+delete eventinstance entity:
+  title: 'Delete eventinstance entity'
+  description: 'Delete existing event instance entities'
+clone eventinstance entity:
+  title: 'Clone eventinstance entity'
+  description: 'Clone existing event instance entities'
+administer eventinstance entity:
+  title: 'Administer eventinstance entity'
+  description: 'Make changes to the event instance entity type.'
+  restrict access: true
+
 # Event Series Administration.
 administer eventseries:
   title: 'Administer eventseries'
diff --git a/recurring_events.routing.yml b/recurring_events.routing.yml
index 185ce19f..e6920792 100644
--- a/recurring_events.routing.yml
+++ b/recurring_events.routing.yml
@@ -54,7 +54,7 @@ entity.eventseries.clone_form:
   path: '/events/series/{eventseries}/clone'
   defaults:
     _entity_form: eventseries.clone
-    _title_callback: '\Drupal\recurring_events\Controller\EventSeriesController::getCloneTitle'
+    _title: 'Clone Event Series'
   requirements:
     _entity_access: 'eventseries.clone'
     eventseries: \d+
@@ -116,6 +116,20 @@ entity.eventinstance.delete_form:
       eventinstance:
         type: entity:eventinstance
 
+# Clone an EventInstance.
+entity.eventinstance.clone_form:
+  path: '/events/{eventinstance}/clone'
+  defaults:
+    # Calls the form.clone controller, defined in the Event Instance entity.
+    _entity_form: eventinstance.clone
+    _title: Clone Event Instance
+  requirements:
+    _entity_access: 'eventinstance.clone'
+  options:
+    parameters:
+      eventinstance:
+        type: entity:eventinstance
+
 # Event Instance table list route.
 entity.eventinstance.collection:
   path: '/events'
diff --git a/src/Entity/EventInstance.php b/src/Entity/EventInstance.php
index 90b37361..3b249165 100644
--- a/src/Entity/EventInstance.php
+++ b/src/Entity/EventInstance.php
@@ -81,7 +81,6 @@ use Drupal\user\UserInterface;
  *       "delete" = "Drupal\recurring_events\Form\EventInstanceDeleteForm",
  *       "default" = "Drupal\recurring_events\Form\EventInstanceForm",
  *       "clone" = "Drupal\recurring_events\Form\EventInstanceCloneForm",
- *       "contact" = "Drupal\recurring_events\Form\EventInstanceContactRegistrationsForm",
  *     },
  *     "access" = "Drupal\recurring_events\EventInstanceAccessControlHandler",
  *   },
@@ -113,7 +112,6 @@ use Drupal\user\UserInterface;
  *     "version-history" = "/events/{eventinstance}/revisions",
  *     "revision" = "/events/{eventinstance}/revisions/{eventinstance_revision}/view",
  *     "clone-form" = "/events/{eventinstance}/clone",
- *     "contact-form" = "/events/{eventinstance}/registration/contact",
  *   },
  *   field_ui_base_route = "eventinstance.settings",
  * )
diff --git a/src/EventInstanceAccessControlHandler.php b/src/EventInstanceAccessControlHandler.php
index 23f21b56..9a8ecabb 100644
--- a/src/EventInstanceAccessControlHandler.php
+++ b/src/EventInstanceAccessControlHandler.php
@@ -37,9 +37,6 @@ class EventInstanceAccessControlHandler extends EntityAccessControlHandler {
 
       case 'clone':
         return AccessResult::allowedIfHasPermission($account, 'clone eventinstance entity');
-
-      case 'contact':
-        return AccessResult::allowedIfHasPermission($account, 'contact eventinstance registration entities');
     }
     return AccessResult::allowed();
   }
-- 
GitLab