@@ -196,20 +203,60 @@ function ServiceEntry({
{reasons.map((reason) =>
{reason})}
}
+ {entry.entry_binding && entry.state !== "available" &&
+
+ }
- {entry.entry_binding && entry.state === "available" ?
-
);
}
+function serviceBlocker(codes: string[], reasons: string[]) {
+ const reasonCode = codes.find((code) => !code.startsWith("service.explanation:")) ?? "";
+ if (reasonCode === "service.publication.suspended") {
+ return {
+ summary: reasons[0] ?? "This service is temporarily suspended.",
+ requiredAction: "Resume the published service revision.",
+ actor: "Service owner",
+ target: "Service administration"
+ };
+ }
+ if (reasonCode.includes("required_module.missing") || reasonCode.includes("required_capability.missing")) {
+ return {
+ summary: reasons[0] ?? "A required system component is unavailable.",
+ requiredAction: "Install, enable, configure, or restore the required component.",
+ actor: "System or module administrator",
+ target: "Module administration"
+ };
+ }
+ if (reasonCode.includes("evaluator_failed") || reasonCode.includes("requirement.unknown")) {
+ return {
+ summary: reasons[0] ?? "Availability could not be confirmed.",
+ requiredAction: "Restore the availability evaluator and check the service again.",
+ actor: "System operator",
+ target: "Operations and service diagnostics"
+ };
+ }
+ return {
+ summary: reasons[0] ?? "This service is currently unavailable.",
+ requiredAction: "Review and fulfil the service availability requirements.",
+ actor: "Service owner or responsible authority",
+ target: "Service details"
+ };
+}
+
function userFacingReasons(codes: string[]): string[] {
const values = codes.
filter((code) => !code.startsWith("service.explanation:")).
diff --git a/webui/src/styles/portal.css b/webui/src/styles/portal.css
index dd1a96a..92c111c 100644
--- a/webui/src/styles/portal.css
+++ b/webui/src/styles/portal.css
@@ -113,6 +113,10 @@
font-size: 0.86rem;
}
+.portal-service-entry .action-blocker-hint {
+ margin-top: 12px;
+}
+
.portal-service-actions {
display: flex;
align-items: center;