dga_feedback-2.0.0/src/Controller/DgaFeedbackAdminController.php
src/Controller/DgaFeedbackAdminController.php
<?php
namespace Drupal\dga_feedback\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Url;
use Drupal\dga_feedback\Service\DgaFeedbackService;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
/**
* Controller for the admin submissions page.
*/
class DgaFeedbackAdminController extends ControllerBase {
/**
* The feedback service.
*
* @var \Drupal\dga_feedback\Service\DgaFeedbackService
*/
protected $feedbackService;
/**
* Constructs a DgaFeedbackAdminController object.
*
* @param \Drupal\dga_feedback\Service\DgaFeedbackService $feedback_service
* The feedback service.
*/
public function __construct(DgaFeedbackService $feedback_service) {
$this->feedbackService = $feedback_service;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('dga_feedback.service')
);
}
/**
* Displays all feedback submissions and statistics.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The HTTP request object.
*
* @return array
* Render array for the admin page.
*/
public function listSubmissions(Request $request) {
// Get pagination parameters.
$page = $request->query->get('page', 0);
$limit = 50;
$offset = $page * $limit;
// Get sort parameters.
$sort_by = $request->query->get('sort', 'created');
$sort_direction = $request->query->get('order', 'DESC');
// Get filter parameters.
$filters = [];
if ($id = $request->query->get('id')) {
$filters['id'] = (int) $id;
}
if ($entity_type = $request->query->get('entity_type')) {
$filters['entity_type'] = $entity_type;
}
if ($entity_id = $request->query->get('entity_id')) {
$filters['entity_id'] = (int) $entity_id;
}
if ($url = $request->query->get('url')) {
$filters['url'] = $url;
}
if ($is_useful = $request->query->get('is_useful')) {
$filters['is_useful'] = $is_useful;
}
if ($feedback = $request->query->get('feedback')) {
$filters['feedback'] = $feedback;
}
if ($user_id = $request->query->get('user_id')) {
$filters['user_id'] = (int) $user_id;
}
if ($ip_address = $request->query->get('ip_address')) {
$filters['ip_address'] = $ip_address;
}
if ($date_from = $request->query->get('date_from')) {
$filters['date_from'] = strtotime($date_from);
}
if ($date_to = $request->query->get('date_to')) {
$filters['date_to'] = strtotime($date_to . ' 23:59:59');
}
// Get URL statistics grouping parameters.
$url_stats_limit = (int) $request->query->get('url_stats_limit', 20);
$url_stats_order_by = $request->query->get('url_stats_order', 'count');
$url_stats_order_direction = $request->query->get('url_stats_order_dir', 'DESC');
// Get all submissions.
$submissions = $this->feedbackService->getAllSubmissions($limit, $offset, $filters, $sort_by, $sort_direction);
$total_count = $this->feedbackService->getSubmissionsCount($filters);
$total_count = (int) ($total_count ?? 0);
// Get overall statistics.
$overall_stats_raw = $this->feedbackService->getOverallStatistics();
$overall_stats = [
'yes_percentage' => $overall_stats_raw['yes_percentage'] ?? 0.0,
'total_count' => $overall_stats_raw['total_count'] ?? 0,
];
$usefulness_distribution = $this->feedbackService->getUsefulnessDistribution();
$usefulness_distribution = [
'yes' => (int) ($usefulness_distribution['yes'] ?? 0),
'no' => (int) ($usefulness_distribution['no'] ?? 0),
];
// Get statistics grouped by URL.
$url_statistics = $this->feedbackService->getStatisticsGroupedByUrl($url_stats_limit, $url_stats_order_by, $url_stats_order_direction);
// Get total count of unique URLs for average calculation.
$unique_url_count = $this->feedbackService->getUniqueUrlCount();
// Get additional statistics for advanced blocks.
$top_feedback_page = $this->feedbackService->getMostUsefulPage();
$most_feedback_page = $this->feedbackService->getMostFeedbackPage();
$recent_activity = $this->feedbackService->getRecentActivity();
$useful_percentage = $this->feedbackService->getUsefulPercentage();
$user_type_stats = $this->feedbackService->getSubmissionsByUserType();
// Process submissions for display.
$processed_submissions = [];
foreach ($submissions as $submission) {
$processed_submissions[] = [
'id' => $submission['id'] ?? 0,
'is_useful' => $submission['is_useful'] ?? '',
'reasons' => $submission['reasons'] ?? [],
'feedback' => $submission['feedback'] ?? '',
'gender' => $submission['gender'] ?? '',
'url' => $submission['url'] ?? '/',
'entity_type' => $submission['entity_type'] ?? '',
'entity_id' => $submission['entity_id'] ?? 0,
'user_id' => $submission['user_id'] ?? NULL,
'ip_address' => $submission['ip_address'] ?? '',
'created' => $submission['created'] ?? time(),
'created_formatted' => isset($submission['created']) ? date('Y-m-d H:i:s', $submission['created']) : date('Y-m-d H:i:s'),
];
}
// Build pagination.
$pager_manager = \Drupal::service('pager.manager');
$pager_manager->createPager($total_count, $limit);
$build = [
'#theme' => 'dga_feedback_admin',
'#overall_stats' => $overall_stats,
'#usefulness_distribution' => $usefulness_distribution,
'#url_statistics' => $url_statistics,
'#unique_url_count' => $unique_url_count,
'#submissions' => $processed_submissions,
'#total_count' => $total_count,
'#current_page' => $page,
'#limit' => $limit,
'#filters' => $filters,
'#sort_by' => $sort_by,
'#sort_direction' => $sort_direction,
'#url_stats_limit' => $url_stats_limit,
'#url_stats_order_by' => $url_stats_order_by,
'#url_stats_order_direction' => $url_stats_order_direction,
'#top_feedback_page' => $top_feedback_page,
'#most_feedback_page' => $most_feedback_page,
'#recent_activity' => $recent_activity,
'#useful_percentage' => $useful_percentage,
'#user_type_stats' => $user_type_stats,
'#attached' => [
'library' => [
'dga_feedback/admin',
],
'drupalSettings' => [
'dgaFeedback' => [
'bulkDeleteUrl' => Url::fromRoute('dga_feedback.admin.bulk_delete')->toString(),
],
],
],
'#cache' => [
'max-age' => 0,
],
];
// Add pager to render array
$build['pager'] = [
'#type' => 'pager',
];
return $build;
}
/**
* Displays edit form for a feedback submission.
*
* @param int $id
* The feedback submission ID.
*
* @return array
* Render array for the edit form.
*/
public function editSubmission($id) {
// Build form using Drupal's form API.
$form = \Drupal::formBuilder()->getForm('\Drupal\dga_feedback\Form\DgaFeedbackEditForm', $id);
return $form;
}
/**
* Handles bulk delete operation.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The HTTP request object.
*
* @return \Symfony\Component\HttpFoundation\RedirectResponse
* Redirect response to the admin page.
*/
public function bulkDelete(Request $request) {
// Get submissions array from request
$ids = [];
$request_data = $request->request->all();
if (isset($request_data['submissions'])) {
$submissions = $request_data['submissions'];
if (is_array($submissions)) {
$ids = $submissions;
} elseif (is_scalar($submissions)) {
$ids = [$submissions];
}
}
if (empty($ids)) {
$this->messenger()->addError($this->t('No submissions selected for deletion.'));
return new RedirectResponse(Url::fromRoute('dga_feedback.admin')->toString());
}
$deleted_count = $this->feedbackService->bulkDeleteSubmissions($ids);
if ($deleted_count > 0) {
$this->messenger()->addMessage($this->formatPlural($deleted_count, 'Deleted @count submission.', 'Deleted @count submissions.', ['@count' => $deleted_count]));
} else {
$this->messenger()->addError($this->t('Failed to delete submissions.'));
}
return new RedirectResponse(Url::fromRoute('dga_feedback.admin')->toString());
}
}
