diff --git a/src/Controller/ActivityController.php b/src/Controller/ActivityController.php index fe4948b6..f50d36be 100644 --- a/src/Controller/ActivityController.php +++ b/src/Controller/ActivityController.php @@ -17,6 +17,7 @@ use App\Entity\ActivityRate; use App\Entity\MetaTableTypeInterface; use App\Entity\Project; use App\Entity\Team; +use App\Event\ActivityDetailControllerEvent; use App\Event\ActivityMetaDefinitionEvent; use App\Event\ActivityMetaDisplayEvent; use App\Export\Spreadsheet\EntityWithMetaFieldsExporter; @@ -140,6 +141,11 @@ final class ActivityController extends AbstractController $teams = $activity->getTeams(); } + // additional boxes by plugins + $event = new ActivityDetailControllerEvent($activity); + $this->dispatcher->dispatch($event); + $boxes = $event->getController(); + return $this->render('activity/details.html.twig', [ 'activity' => $activity, 'stats' => $stats, @@ -147,6 +153,7 @@ final class ActivityController extends AbstractController 'team' => $defaultTeam, 'teams' => $teams, 'now' => $now, + 'boxes' => $boxes ]); } diff --git a/src/Controller/CustomerController.php b/src/Controller/CustomerController.php index faefbeb7..4f33f83a 100644 --- a/src/Controller/CustomerController.php +++ b/src/Controller/CustomerController.php @@ -16,6 +16,7 @@ use App\Entity\CustomerComment; use App\Entity\CustomerRate; use App\Entity\MetaTableTypeInterface; use App\Entity\Team; +use App\Event\CustomerDetailControllerEvent; use App\Event\CustomerMetaDefinitionEvent; use App\Event\CustomerMetaDisplayEvent; use App\Export\Spreadsheet\EntityWithMetaFieldsExporter; @@ -300,7 +301,6 @@ final class CustomerController extends AbstractController $attachments = []; $comments = null; $teams = null; - $projects = null; $rates = []; $now = $this->getDateTimeFactory()->createDateTime(); @@ -331,6 +331,11 @@ final class CustomerController extends AbstractController $teams = $customer->getTeams(); } + // additional boxes by plugins + $event = new CustomerDetailControllerEvent($customer); + $this->dispatcher->dispatch($event); + $boxes = $event->getController(); + return $this->render('customer/details.html.twig', [ 'customer' => $customer, 'comments' => $comments, @@ -342,6 +347,7 @@ final class CustomerController extends AbstractController 'customer_now' => new \DateTime('now', $timezone), 'rates' => $rates, 'now' => $now, + 'boxes' => $boxes ]); } diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php index 75e21560..3902926c 100644 --- a/src/Controller/ProjectController.php +++ b/src/Controller/ProjectController.php @@ -17,6 +17,7 @@ use App\Entity\ProjectComment; use App\Entity\ProjectRate; use App\Entity\Rate; use App\Entity\Team; +use App\Event\ProjectDetailControllerEvent; use App\Event\ProjectMetaDefinitionEvent; use App\Event\ProjectMetaDisplayEvent; use App\Export\Spreadsheet\EntityWithMetaFieldsExporter; @@ -348,6 +349,11 @@ final class ProjectController extends AbstractController $teams = $project->getTeams(); } + // additional boxes by plugins + $event = new ProjectDetailControllerEvent($project); + $this->dispatcher->dispatch($event); + $boxes = $event->getController(); + return $this->render('project/details.html.twig', [ 'project' => $project, 'comments' => $comments, @@ -358,6 +364,7 @@ final class ProjectController extends AbstractController 'teams' => $teams, 'rates' => $rates, 'now' => $now, + 'boxes' => $boxes ]); } diff --git a/src/Event/ActivityDetailControllerEvent.php b/src/Event/ActivityDetailControllerEvent.php new file mode 100644 index 00000000..4d3be7ff --- /dev/null +++ b/src/Event/ActivityDetailControllerEvent.php @@ -0,0 +1,30 @@ +controller[] = $controller; + } + + public function getController(): array + { + return $this->controller; + } +} diff --git a/src/Event/CustomerDetailControllerEvent.php b/src/Event/CustomerDetailControllerEvent.php new file mode 100644 index 00000000..3b2b0f37 --- /dev/null +++ b/src/Event/CustomerDetailControllerEvent.php @@ -0,0 +1,30 @@ +controller[] = $controller; + } + + public function getController(): array + { + return $this->controller; + } +} diff --git a/src/Event/ProjectDetailControllerEvent.php b/src/Event/ProjectDetailControllerEvent.php new file mode 100644 index 00000000..d2aafb32 --- /dev/null +++ b/src/Event/ProjectDetailControllerEvent.php @@ -0,0 +1,30 @@ +controller[] = $controller; + } + + public function getController(): array + { + return $this->controller; + } +} diff --git a/templates/activity/details.html.twig b/templates/activity/details.html.twig index 8e1c56c0..c742cc33 100644 --- a/templates/activity/details.html.twig +++ b/templates/activity/details.html.twig @@ -93,6 +93,10 @@ {{ include('embeds/budgets.html.twig', {'entity': activity, 'stats': stats, 'currency': currency}) }} {% endif %} + {% for controller in boxes %} + {{ render(controller(controller, {'activity': activity, 'page': 1})) }} + {% endfor %} + {% if can_edit %} {{ include('embeds/rates-table.html.twig', {'id': 'activity_rates_box', 'entity': activity, 'create_url': path('admin_activity_rate_add', {'id': activity.id}), 'delete_route': 'delete_activity_rate', 'currency': currency}) }} {% endif %} diff --git a/templates/customer/details.html.twig b/templates/customer/details.html.twig index 653a822d..b007475a 100644 --- a/templates/customer/details.html.twig +++ b/templates/customer/details.html.twig @@ -132,6 +132,10 @@ {{ include('embeds/budgets.html.twig', {'entity': customer, 'stats': stats, 'currency': customer.currency}) }} {% endif %} + {% for controller in boxes %} + {{ render(controller(controller, {'customer': customer, 'page': 1})) }} + {% endfor %} + {% if can_edit %} {{ include('embeds/rates-table.html.twig', {'id': 'customer_rates_box', 'entity': customer, 'create_url': path('admin_customer_rate_add', {'id': customer.id}), 'delete_route': 'delete_customer_rate', 'currency': customer.currency}) }} {% endif %} diff --git a/templates/project/details.html.twig b/templates/project/details.html.twig index efb98712..3ec6543e 100644 --- a/templates/project/details.html.twig +++ b/templates/project/details.html.twig @@ -134,6 +134,10 @@ {{ include('embeds/budgets.html.twig', {'entity': project, 'stats': stats, 'currency': project.customer.currency}) }} {% endif %} + {% for controller in boxes %} + {{ render(controller(controller, {'project': project, 'page': 1})) }} + {% endfor %} + {% if can_edit %} {{ include('embeds/rates-table.html.twig', {'id': 'project_rates_box', 'entity': project, 'create_url': path('admin_project_rate_add', {'id': project.id}), 'delete_route': 'delete_project_rate', 'currency': project.customer.currency}) }} {% endif %} diff --git a/tests/Event/ActivityDetailControllerEventTest.php b/tests/Event/ActivityDetailControllerEventTest.php new file mode 100644 index 00000000..8f6770b7 --- /dev/null +++ b/tests/Event/ActivityDetailControllerEventTest.php @@ -0,0 +1,34 @@ +createActivityEvent(new Activity()); + $event->addController('Foo\\Bar::helloWorld'); + $this->assertEquals(['Foo\\Bar::helloWorld'], $event->getController()); + } +} diff --git a/tests/Event/CustomerDetailControllerEventTest.php b/tests/Event/CustomerDetailControllerEventTest.php new file mode 100644 index 00000000..acdb0412 --- /dev/null +++ b/tests/Event/CustomerDetailControllerEventTest.php @@ -0,0 +1,34 @@ +createCustomerEvent(new Customer()); + $event->addController('Foo\\Bar::helloWorld'); + $this->assertEquals(['Foo\\Bar::helloWorld'], $event->getController()); + } +} diff --git a/tests/Event/ProjectDetailControllerEventTest.php b/tests/Event/ProjectDetailControllerEventTest.php new file mode 100644 index 00000000..dcab2812 --- /dev/null +++ b/tests/Event/ProjectDetailControllerEventTest.php @@ -0,0 +1,34 @@ +createProjectEvent(new Project()); + $event->addController('Foo\\Bar::helloWorld'); + $this->assertEquals(['Foo\\Bar::helloWorld'], $event->getController()); + } +}