Enhanced abuse reporting interface

This commit is contained in:
Pinga 2025-07-04 17:11:39 +03:00
parent d3b3ebb6ed
commit a15904897c
3 changed files with 95 additions and 7 deletions

View file

@ -27,6 +27,12 @@ class SupportController extends Controller
$subject = htmlspecialchars($data['subject'], ENT_QUOTES, 'UTF-8') ?? null; $subject = htmlspecialchars($data['subject'], ENT_QUOTES, 'UTF-8') ?? null;
$message = $data['message'] ?? null; $message = $data['message'] ?? null;
$reportedDomain = $data['reported_domain'] ?? null;
$natureOfAbuse = $data['nature_of_abuse'] ?? null;
$evidence = $data['evidence'] ?? null;
$relevantUrls = $data['relevant_urls'] ?? null;
$dateOfIncident = $data['date_of_incident'] ?? null;
if (!$subject) { if (!$subject) {
$this->container->get('flash')->addMessage('error', 'Please enter a subject'); $this->container->get('flash')->addMessage('error', 'Please enter a subject');
return $response->withHeader('Location', '/support/new')->withStatus(302); return $response->withHeader('Location', '/support/new')->withStatus(302);
@ -42,6 +48,19 @@ class SupportController extends Controller
return $response->withHeader('Location', '/support/new')->withStatus(302); return $response->withHeader('Location', '/support/new')->withStatus(302);
} }
if ($category == 8) {
if (
empty($reportedDomain) ||
empty($natureOfAbuse) ||
empty($evidence) ||
empty($relevantUrls) ||
empty($dateOfIncident)
) {
$this->container->get('flash')->addMessage('error', 'All abuse-related fields are required for Abuse Notifications.');
return $response->withHeader('Location', '/support/new')->withStatus(302);
}
}
try { try {
$db->beginTransaction(); $db->beginTransaction();
$currentDateTime = new \DateTime(); $currentDateTime = new \DateTime();
@ -55,11 +74,11 @@ class SupportController extends Controller
'message' => $message, 'message' => $message,
'status' => 'Open', 'status' => 'Open',
'priority' => 'Medium', 'priority' => 'Medium',
'reported_domain' => null, 'reported_domain' => $reportedDomain,
'nature_of_abuse' => null, 'nature_of_abuse' => $natureOfAbuse,
'evidence' => null, 'evidence' => $evidence,
'relevant_urls' => null, 'relevant_urls' => $relevantUrls,
'date_of_incident' => null, 'date_of_incident' => $dateOfIncident ?: null,
'date_created' => $crdate, 'date_created' => $crdate,
'last_updated' => null, 'last_updated' => null,
] ]

View file

@ -55,6 +55,28 @@
<label for="message" class="form-label required">{{ __('Message') }}</label> <label for="message" class="form-label required">{{ __('Message') }}</label>
<textarea class="form-control" id="message" name="message" rows="5" required></textarea> <textarea class="form-control" id="message" name="message" rows="5" required></textarea>
</div> </div>
<div id="abuse-fields" style="display: none;">
<div class="mb-3">
<label for="reported_domain" class="form-label">Reported Domain</label>
<input type="text" class="form-control" id="reported_domain" name="reported_domain">
</div>
<div class="mb-3">
<label for="nature_of_abuse" class="form-label">Nature of Abuse</label>
<textarea class="form-control" id="nature_of_abuse" name="nature_of_abuse" rows="2"></textarea>
</div>
<div class="mb-3">
<label for="evidence" class="form-label">Evidence</label>
<textarea class="form-control" id="evidence" name="evidence" rows="2"></textarea>
</div>
<div class="mb-3">
<label for="relevant_urls" class="form-label">Relevant URLs</label>
<textarea class="form-control" id="relevant_urls" name="relevant_urls" rows="2"></textarea>
</div>
<div class="mb-3">
<label for="date_of_incident" class="form-label">Date of Incident</label>
<input type="date" class="form-control" id="date_of_incident" name="date_of_incident">
</div>
</div>
</div> </div>
<div class="card-footer text-end"> <div class="card-footer text-end">
<div class="d-flex"> <div class="d-flex">
@ -68,4 +90,27 @@
</div> </div>
{% include 'partials/footer.twig' %} {% include 'partials/footer.twig' %}
</div> </div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const categorySelect = document.getElementById('category');
const abuseFields = document.getElementById('abuse-fields');
const requiredInputs = abuseFields.querySelectorAll('input, textarea');
const requiredLabels = abuseFields.querySelectorAll('label');
categorySelect.addEventListener('change', function () {
if (this.value === '8') {
abuseFields.style.display = 'block';
requiredInputs.forEach(el => el.setAttribute('required', 'required'));
requiredLabels.forEach(label => label.classList.add('required'));
} else {
abuseFields.style.display = 'none';
requiredInputs.forEach(el => {
el.removeAttribute('required');
el.value = '';
});
requiredLabels.forEach(label => label.classList.remove('required'));
}
});
});
</script>
{% endblock %} {% endblock %}

View file

@ -72,6 +72,16 @@
<div class="datagrid-title">{{ __('Created On') }}</div> <div class="datagrid-title">{{ __('Created On') }}</div>
<div class="datagrid-content"><strong>{{ ticket.date_created }}</strong></div> <div class="datagrid-content"><strong>{{ ticket.date_created }}</strong></div>
</div> </div>
{% if ticket.category_id == 8 %}
<div class="datagrid-item">
<div class="datagrid-title">{{ __('Date of Incident') }}</div>
<div class="datagrid-content"><strong>{{ ticket.date_of_incident }}</strong></div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">{{ __('Last Updated') }}</div>
<div class="datagrid-content"><strong>{{ ticket.last_updated }}</strong></div>
</div>
{% endif %}
<div class="datagrid-item"> <div class="datagrid-item">
<div class="datagrid-title">{{ __('Category') }}</div> <div class="datagrid-title">{{ __('Category') }}</div>
<div class="datagrid-content"><span class="status status-indigo">{{ category }}</span></div> <div class="datagrid-content"><span class="status status-indigo">{{ category }}</span></div>
@ -108,6 +118,20 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% if ticket.category_id == 8 %}
<div class="datagrid-item">
<div class="datagrid-title">{{ __('Nature of Abuse') }}</div>
<div class="datagrid-content"><span class="status status-red">{{ ticket.nature_of_abuse|capitalize }}</span></div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">{{ __('Evidence') }}</div>
<div class="datagrid-content"><span class="status status-green">{{ ticket.evidence }}</span></div>
</div>
<div class="datagrid-item">
<div class="datagrid-title">{{ __('Relevant URLs') }}</div>
<div class="datagrid-content"><span class="status status-blue">{{ ticket.relevant_urls }}</span></div>
</div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>