feat: add remaining SEO audit fields - OG preview, meta keywords, diagnostics
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions

Adds: H3 count, hreflang, meta keywords, canonical URL, noindex reason,
Open Graph Facebook preview (image + title + description), portfolio,
live chat detection, Google website URL, Google business categories,
audit diagnostics section (source, version, errors).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-03-11 05:33:10 +01:00
parent 4839ac251a
commit 89cb997487

View File

@ -272,6 +272,18 @@
<span class="detail-label">Naglowki H2</span>
<span class="detail-value">{{ analysis.h2_count if analysis.h2_count is not none else '-' }}</span>
</div>
<div class="detail-item">
<span class="detail-label">Naglowki H3</span>
<span class="detail-value">{{ analysis.h3_count if analysis.h3_count is not none else '-' }}</span>
</div>
{% if analysis.has_hreflang is not none %}
<div class="detail-item">
<span class="detail-label">Hreflang — wersje jezykowe</span>
<span class="detail-value {% if analysis.has_hreflang %}yes{% else %}no{% endif %}">
{% if analysis.has_hreflang %}Jest{% else %}Brak{% endif %}
</span>
</div>
{% endif %}
<div class="detail-item">
<span class="detail-label">Obrazki ogolnie</span>
<span class="detail-value">{{ analysis.total_images if analysis.total_images is not none else '-' }}</span>
@ -304,8 +316,54 @@
<div style="font-size: var(--font-size-sm); color: var(--text-primary);">{{ analysis.meta_description or analysis.seo_description }}</div>
</div>
{% endif %}
{% if analysis.meta_keywords %}
<div style="margin-top: var(--spacing-sm); padding: var(--spacing-md); background: var(--background); border-radius: var(--radius);">
<div class="detail-label" style="margin-bottom: 4px;">Meta keywords (slowa kluczowe w kodzie strony):</div>
<div style="font-size: var(--font-size-sm); color: var(--text-secondary);">{{ analysis.meta_keywords }}</div>
</div>
{% endif %}
{% if analysis.canonical_url %}
<div style="margin-top: var(--spacing-sm); padding: var(--spacing-md); background: var(--background); border-radius: var(--radius);">
<div class="detail-label" style="margin-bottom: 4px;">Canonical URL — adres kanoniczny strony:</div>
<div style="font-size: var(--font-size-sm); color: var(--text-primary); word-break: break-all;">{{ analysis.canonical_url }}</div>
</div>
{% endif %}
{% if analysis.noindex_reason %}
<div style="margin-top: var(--spacing-sm); padding: var(--spacing-md); background: #fef2f2; border-radius: var(--radius); border-left: 3px solid var(--danger);">
<div class="detail-label" style="margin-bottom: 4px; color: var(--danger);">Powod blokady indeksowania:</div>
<div style="font-size: var(--font-size-sm); color: var(--text-primary);">{{ analysis.noindex_reason }}</div>
</div>
{% endif %}
</div>
<!-- Podglad Open Graph — jak strona wyglada na Facebooku -->
{% if analysis.og_title or analysis.og_description or analysis.og_image %}
<div class="section">
<h2>Open Graph — podglad udostepnienia na Facebooku</h2>
<p style="font-size: var(--font-size-xs); color: var(--text-secondary); margin-bottom: var(--spacing-md);">
Tak wyglada link do tej strony udostepniony na Facebooku, LinkedIn czy Messengerze.
</p>
<div style="max-width: 500px; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; background: #f0f2f5;">
{% if analysis.og_image %}
<div style="width: 100%; height: 260px; background: #e4e6eb; display: flex; align-items: center; justify-content: center; overflow: hidden;">
<img src="{{ analysis.og_image }}" alt="OG Image" style="width: 100%; height: 100%; object-fit: cover;" onerror="this.parentElement.innerHTML='<span style=\'color: var(--text-secondary); font-size: var(--font-size-sm);\'>Obrazek niedostepny</span>'">
</div>
{% else %}
<div style="width: 100%; height: 80px; background: #e4e6eb; display: flex; align-items: center; justify-content: center;">
<span style="color: var(--text-secondary); font-size: var(--font-size-sm);">Brak obrazka Open Graph</span>
</div>
{% endif %}
<div style="padding: var(--spacing-md);">
<div style="font-size: 11px; color: #65676b; text-transform: uppercase;">{{ analysis.final_url or analysis.website_url or '' }}</div>
<div style="font-weight: 600; font-size: var(--font-size-base); color: #050505; margin-top: 4px;">{{ analysis.og_title or analysis.meta_title or analysis.seo_title or 'Brak tytulu' }}</div>
{% if analysis.og_description %}
<div style="font-size: var(--font-size-sm); color: #65676b; margin-top: 4px; line-height: 1.3;">{{ analysis.og_description[:150] }}{% if analysis.og_description|length > 150 %}...{% endif %}</div>
{% endif %}
</div>
</div>
</div>
{% endif %}
<!-- Techniczne -->
<div class="section">
<h2>Dane techniczne</h2>
@ -437,6 +495,18 @@
<span class="detail-label">Formularz kontaktowy</span>
<span class="detail-value {% if analysis.has_contact_form %}yes{% else %}no{% endif %}">{% if analysis.has_contact_form %}Jest{% else %}Brak{% endif %}</span>
</div>
{% if analysis.has_portfolio is not none %}
<div class="detail-item">
<span class="detail-label">Portfolio / Realizacje</span>
<span class="detail-value {% if analysis.has_portfolio %}yes{% else %}no{% endif %}">{% if analysis.has_portfolio %}Jest{% else %}Brak{% endif %}</span>
</div>
{% endif %}
{% if analysis.has_live_chat is not none %}
<div class="detail-item">
<span class="detail-label">Live chat na stronie</span>
<span class="detail-value {% if analysis.has_live_chat %}yes{% else %}no{% endif %}">{% if analysis.has_live_chat %}Jest{% else %}Brak{% endif %}</span>
</div>
{% endif %}
{% if analysis.broken_links_count is not none %}
<div class="detail-item">
<span class="detail-label">Zlamane linki</span>
@ -665,12 +735,24 @@
<span class="detail-value">{{ analysis.google_phone }}</span>
</div>
{% endif %}
{% if analysis.google_website %}
<div class="detail-item">
<span class="detail-label">Strona WWW w Google</span>
<span class="detail-value"><a href="{{ analysis.google_website }}" target="_blank" rel="noopener" style="color: var(--primary); font-size: 11px; word-break: break-all;">{{ analysis.google_website }}</a></span>
</div>
{% endif %}
{% if analysis.google_business_status %}
<div class="detail-item">
<span class="detail-label">Status</span>
<span class="detail-value {% if analysis.google_business_status == 'OPERATIONAL' %}yes{% endif %}">{{ analysis.google_business_status }}</span>
</div>
{% endif %}
{% if analysis.google_types %}
<div class="detail-item">
<span class="detail-label">Kategorie w Google</span>
<span class="detail-value" style="font-size: 11px;">{{ analysis.google_types|join(', ') }}</span>
</div>
{% endif %}
{% if analysis.google_photos_count %}
<div class="detail-item">
<span class="detail-label">Zdjecia w Google</span>
@ -916,6 +998,42 @@
</div>
</div>
{% endif %}
<!-- Diagnostyka audytu -->
{% if analysis and (analysis.audit_source or analysis.audit_errors or analysis.analyzed_at) %}
<div class="section" style="opacity: 0.7;">
<h2>Diagnostyka audytu</h2>
<p style="font-size: var(--font-size-xs); color: var(--text-secondary); margin-bottom: var(--spacing-md);">
Informacje techniczne o ostatnim uruchomieniu audytu.
</p>
<div class="detail-grid">
{% if analysis.analyzed_at %}
<div class="detail-item">
<span class="detail-label">Data audytu</span>
<span class="detail-value">{{ analysis.analyzed_at.strftime('%d.%m.%Y %H:%M') }}</span>
</div>
{% endif %}
{% if analysis.audit_source %}
<div class="detail-item">
<span class="detail-label">Zrodlo danych</span>
<span class="detail-value">{{ analysis.audit_source }}</span>
</div>
{% endif %}
{% if analysis.audit_version %}
<div class="detail-item">
<span class="detail-label">Wersja audytu</span>
<span class="detail-value">{{ analysis.audit_version }}</span>
</div>
{% endif %}
</div>
{% if analysis.audit_errors %}
<div style="margin-top: var(--spacing-md); padding: var(--spacing-md); background: #fef2f2; border-radius: var(--radius); border-left: 3px solid var(--danger);">
<div class="detail-label" style="margin-bottom: 4px; color: var(--danger);">Bledy podczas audytu:</div>
<div style="font-size: var(--font-size-sm); color: var(--text-primary); white-space: pre-wrap;">{{ analysis.audit_errors }}</div>
</div>
{% endif %}
</div>
{% endif %}
{% endif %}
{% endblock %}