Enhance email rendering and Jira widget functionality

- Implemented a secure rendering method for email content using a sandboxed iframe to prevent XSS attacks.
- Added thorough HTML sanitization for incoming emails to mitigate potential exploits.
- Refactored email body rendering logic to utilize a dedicated function for better readability and maintainability.
- Updated Jira widget to fetch and display dashboard data, including assigned issues and team issues, with improved filtering options.
- Enhanced the user interface of the Jira widget with a standardized control toolbar for resizing and collapsing widgets.
- Introduced inline search functionality within the Jira widget for quick ticket filtering.
- Improved error handling and logging for Jira data fetching.
This commit is contained in:
2026-09-10 15:44:37 +02:00
parent 72ad1fb70e
commit e161c72fc4
6 changed files with 867 additions and 100 deletions
+50 -9
View File
@@ -221,6 +221,7 @@ function jira_fetch_issues(string $domain, string $email, string $apiToken, stri
$authHeader = jira_get_auth_header($email, $apiToken);
$fieldsList = [
'*navigable',
'summary',
'status',
'priority',
@@ -233,6 +234,8 @@ function jira_fetch_issues(string $domain, string $email, string $apiToken, stri
'updated',
'created',
'description',
'labels',
'components',
];
// 1. Moderne Atlassian Jira Cloud endpoint (/rest/api/3/search/jql) conform CHANGE-2046 via POST
@@ -325,29 +328,67 @@ function jira_fetch_issues(string $domain, string $email, string $apiToken, stri
$descriptionText = jira_adf_to_text($fields['description'] ?? '');
// Detectie van custom field "Onderwerp logging"
// Detectie van custom field "Onderwerp logging" of routeringsveld
$onderwerpLogging = '';
$knownTopics = ['koppelingen', 'sso-koppeling', 'rest-endpoints', 'datadump', 'uwv-koppeling', 'migratie', 'incident', 'vraag', 'algemeen'];
foreach ($fields as $fKey => $fVal) {
if (str_starts_with($fKey, 'customfield_')) {
if (is_array($fVal) && isset($fVal['value']) && is_string($fVal['value'])) {
$valStr = trim($fVal['value']);
$known = ['koppelingen', 'sso-koppeling', 'rest-endpoints', 'datadump', 'uwv-koppeling', 'migratie', 'incident', 'vraag', 'algemeen'];
if (in_array(strtolower($valStr), $known)) {
$onderwerpLogging = $valStr;
if (is_array($fVal)) {
if (isset($fVal['value']) && is_string($fVal['value'])) {
$valStr = trim($fVal['value']);
if (!empty($valStr)) {
foreach ($knownTopics as $kt) {
if (str_contains(strtolower($valStr), $kt)) {
$onderwerpLogging = $valStr;
break 2;
}
}
if (empty($onderwerpLogging) && (stripos($fKey, 'onderwerp') !== false || stripos($fKey, 'logging') !== false)) {
$onderwerpLogging = $valStr;
}
}
}
} elseif (is_string($fVal) && !empty($fVal)) {
$valStr = trim($fVal);
$known = ['koppelingen', 'sso-koppeling', 'rest-endpoints', 'datadump', 'uwv-koppeling', 'migratie'];
if (in_array(strtolower($valStr), $known)) {
$onderwerpLogging = $valStr;
foreach ($knownTopics as $kt) {
if (str_contains(strtolower($valStr), $kt)) {
$onderwerpLogging = $valStr;
break 2;
}
}
}
}
}
if (empty($onderwerpLogging) && !empty($fields['onderwerp_logging'])) {
$onderwerpLogging = is_string($fields['onderwerp_logging']) ? $fields['onderwerp_logging'] : ($fields['onderwerp_logging']['value'] ?? '');
}
// Fallback: kijk naar labels & componenten
if (empty($onderwerpLogging) && !empty($fields['labels']) && is_array($fields['labels'])) {
foreach ($fields['labels'] as $lbl) {
$lblLower = strtolower(trim($lbl));
foreach ($knownTopics as $kt) {
if (str_contains($lblLower, $kt)) {
$onderwerpLogging = ucfirst($kt);
break 2;
}
}
}
}
// Fallback: detecteer onderwerp op basis van steekwoorden in summary
if (empty($onderwerpLogging)) {
$sumLower = strtolower($summary);
if (str_contains($sumLower, 'sso')) $onderwerpLogging = 'SSO-koppeling';
elseif (str_contains($sumLower, 'endpoint') || str_contains($sumLower, 'rest') || str_contains($sumLower, 'api')) $onderwerpLogging = 'Rest-endpoints';
elseif (str_contains($sumLower, 'uwv')) $onderwerpLogging = 'UWV-koppeling';
elseif (str_contains($sumLower, 'datadump') || str_contains($sumLower, 'dump')) $onderwerpLogging = 'Datadump';
elseif (str_contains($sumLower, 'migratie')) $onderwerpLogging = 'Migratie';
elseif (str_contains($sumLower, 'koppeling')) $onderwerpLogging = 'Koppelingen';
}
$issues[] = [
'key' => $key,
'summary' => $summary,