{/* Header gradient */}
{application.name}
{application.hostingType && (
{application.hostingType.name}
{application.hostingType.objectId && jiraHost && (
e.stopPropagation()}
>
)}
)}
{/* Quick action buttons */}
{application.technischeArchitectuur && application.technischeArchitectuur.trim() !== '' && (
)}
{application.confluenceSpace && application.confluenceSpace.trim() !== '' && (
)}
{jiraHost && application.key && (
)}
{/* Status badge on the right */}
{/* Refresh message */}
{refreshMessage && (
{refreshMessage.includes('succesvol') || refreshMessage.includes('gesynchroniseerd') ? (
) : (
)}
{refreshMessage}
)}
{/* Reference warning - only show if reference is truly empty */}
{(() => {
const refValue = application.reference;
// Helper function to check if a string is truly empty (handles all edge cases)
const isStringEmpty = (str: unknown): boolean => {
if (str === null || str === undefined) {
return true;
}
if (typeof str !== 'string') {
// If it's not a string, we can't determine if it's empty, so assume it's not empty
return false;
}
// Check for empty string
if (str === '') {
return true;
}
// Trim and check - this handles spaces, tabs, newlines, etc.
const trimmed = str.trim();
if (trimmed === '') {
return true;
}
// Check for whitespace-only strings using regex (handles Unicode whitespace too)
if (/^\s*$/.test(str)) {
return true;
}
// Check for strings that only contain zero-width characters
if (trimmed.replace(/[\u200B-\u200D\uFEFF]/g, '') === '') {
return true;
}
// Has meaningful content
return false;
};
const isEmpty = isStringEmpty(refValue);
return isEmpty;
})() && (
Deze Application Component is (nog) niet toegevoegd in Enterprise Architect
)}
{/* Description */}
{application.description && (
{application.description}
)}
{/* Application Functions pills/tags below description */}
{application.applicationFunctions && application.applicationFunctions.length > 0 && (
{application.applicationFunctions.map((func, index) => (
))}
)}
{/* Basis informatie and Governance & Management side by side */}
{/* Basis informatie */}
{basisInfoExpanded && (
{application.businessImpactAnalyse?.name ? (
<>
{application.businessImpactAnalyse.name}
{/* Info icon with description tooltip - shown when description exists */}
{(application.businessImpactAnalyse?.description || application.businessImpactAnalyse?.indicators) && (
)}
{/* External link to Jira Assets - shown when objectId exists */}
{application.businessImpactAnalyse.objectId && jiraHost && (
e.stopPropagation()}
>
)}
>
) : (
<>
Niet ingevuld
{/* Info icon with description tooltip - shown when description exists */}
{(application.businessImpactAnalyse?.description || application.businessImpactAnalyse?.indicators) && (
)}
>
)}
{application.businessImpactAnalyse?.indicators && (
{application.businessImpactAnalyse.indicators}
)}
{application.dataCompletenessPercentage !== undefined && (
= 80
? 'bg-gradient-to-r from-green-500 to-green-600'
: application.dataCompletenessPercentage >= 60
? 'bg-gradient-to-r from-yellow-500 to-yellow-600'
: 'bg-gradient-to-r from-red-500 to-red-600'
}`}
style={{ width: `${application.dataCompletenessPercentage}%` }}
/>
= 80
? 'text-green-700'
: application.dataCompletenessPercentage >= 60
? 'text-yellow-700'
: 'text-red-700'
}`}>
{application.dataCompletenessPercentage.toFixed(1)}%
)}
)}
{/* Governance & Management */}
{governanceExpanded && (
{
const teamName = application.applicationTeam?.name;
const subteamName = application.applicationSubteam?.name;
if (teamName) {
return subteamName ? `${teamName} (${subteamName})` : teamName;
}
return subteamName || undefined;
})()}
referenceValue={application.applicationTeam || application.applicationSubteam}
jiraHost={jiraHost}
/>
)}
{/* Contacts & Leverancier(s) blocks side by side */}
{/* Contacts */}
{contactsExpanded && (
{
const mainValue = application.technicalApplicationManagement;
const primary = application.technicalApplicationManagementPrimary?.trim();
const secondary = application.technicalApplicationManagementSecondary?.trim();
const parts = [];
if (primary) parts.push(primary);
if (secondary) parts.push(secondary);
if (mainValue) {
return parts.length > 0 ? `${mainValue} (${parts.join(', ')})` : mainValue;
}
return parts.length > 0 ? `(${parts.join(', ')})` : undefined;
})()}
/>
)}
{/* Leverancier(s) block */}
{supplierExpanded && (
)}
{/* Classification section */}
{classificationExpanded && (
{/* FTE - Benodigde inspanning applicatiemanagement */}
Automatisch berekend op basis van Regiemodel, Application Type, Business Impact Analyse en Hosting (v25)
)}
{/* Related Objects Sections */}
{RELATED_OBJECTS_CONFIG.map((config) => {
const data = relatedObjects.get(config.objectType);
const isExpanded = expandedSections.has(config.objectType);
const colors = COLOR_SCHEMES[config.colorScheme];
const objects = data?.objects || [];
const count = objects.length;
const isLoading = data?.loading ?? true;
return (
{/* Header - clickable to expand/collapse */}
{/* Content */}
{isExpanded && (
{isLoading ? (
) : data?.error ? (
) : count === 0 ? (
Geen {config.title.toLowerCase()} gevonden
Er zijn geen gerelateerde {config.title.toLowerCase()} gekoppeld aan deze applicatie
) : (
{config.columns.map((col) => (
|
{col.label}
|
))}
{objects.map((obj) => (
{config.columns.map((col) => (
|
{col.isName && jiraHost ? (
{obj.attributes[col.key] || obj.name || '-'}
) : (
{obj.attributes[col.key] || -}
)}
|
))}
))}
)}
)}
);
})}
{/* Call to action */}
Classificatie aanpassen?
Bewerk applicatiefuncties, classificatie en regiemodel met AI-ondersteuning.
Bewerken