Redesigned AI enrichment flow:
1. Button renamed to "Zbierz informacje o firmie" with tooltip explaining
what will happen (search web, show results for approval)
2. After AI analysis: show clean review panel with checkboxes for each
field (description, services, USPs, tags, etc.) instead of tech log
3. User selects which fields to keep, clicks "Zapisz wybrane (N)"
4. Only checked fields are sent to /approve endpoint
5. Progress messages simplified to non-technical Polish
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Event text was removed when switching to div+modal. Added it back as
<span class="calendar-event-text"> visible on desktop, hidden on mobile.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove .ics download option. Show clear 5-step instructions for
subscribing via calendar.google.com on computer, with copy button.
Explain that phone syncs automatically after computer setup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Google Calendar Android app has no "add by URL" option.
Primary: download .ics file → opens in Google Calendar (one-time import)
Secondary: instructions + copy link for computer subscription (auto-sync)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
One tap does two things:
1. Copies iCal URL to clipboard automatically
2. Opens Google Calendar "Add by URL" settings page
User just needs to paste and click "Add calendar".
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
webcal:// in cid= caused garbled calendar name on Android.
Use properly URL-encoded https:// URL instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Auto-subscribe link often fails on Android. Now shows both:
- Direct Google Calendar link (try first)
- Copy button + step-by-step Polish instructions for manual add
via calendar.google.com → "Z adresu URL"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Instead of downloading .ics (one-time import), Android users get a link
to Google Calendar subscription page. This creates a live subscription
that auto-syncs new events to their phone. iOS keeps webcal:// link.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Android PWA doesn't handle webcal:// protocol. Now detects platform:
- iOS/Mac: webcal:// link (opens Apple Calendar)
- Android/other: direct .ics download (opens system picker → Google Calendar)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
One "Dodaj do kalendarza" button with webcal:// protocol works on:
- iPhone/Mac: opens Apple Calendar
- Android: opens app picker (Google Calendar, Samsung Calendar, etc.)
- Desktop: opens default calendar app
Manual URL copy kept as fallback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previous /render?cid=webcal:// format didn't add the calendar.
New format /r?cid=https:// is the correct way to subscribe.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Apple Calendar: webcal:// link opens native iOS/macOS calendar directly
- Google Calendar: direct link to calendar.google.com/render?cid=
- Outlook: direct link to outlook.live.com/addfromweb
- Manual copy-paste link kept as fallback at bottom
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Featured events (is_featured=true) now display in red (#fee2e2)
instead of inheriting their type color. Applies to grid cells,
list view (red left border), bottom sheet modal dots, and legend.
Currently featured: portal presentation (Apr 9), nuclear meeting
with Governor (Apr 7), conference (Apr 9), gala (Nov 21).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Gray blended with empty cells. New color: orange (#fff7ed bg, #fb923c
accent) — visible but understated compared to blue (meetings).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Instead of direct links on colored cells, tapping a day with events
opens a bottom sheet modal showing all events for that day with:
- Event type color dot, title, time, location
- Tap event row to navigate to details
- Polish month names in modal title ("25 marca 2026")
- Smooth slide-up animation, overlay tap to close
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On mobile, events now fill entire day cells as colored blocks:
- 1 event: full cell background in event type color
- 2+ events: cell split into colored horizontal strips
- Each strip is clickable (links to event details)
- Day number overlaid on top with z-index
- Desktop unchanged (text labels in cells)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On narrow screens (≤768px), calendar grid events become small colored
dots (8x8px circles) instead of text labels that overflow cells.
Day cells reduced to min-height 60px, day headers to 9px font.
Grid stays 7-column but compact enough for mobile screens.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add flex-wrap to event cards so actions wrap below on narrow screens
- Add overflow-x:hidden to html,body to prevent horizontal scroll
- Smaller h1 on mobile calendar header
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On iOS, elements inside a stacking context (nav-menu z-index:99) cannot
escape above it regardless of their own z-index. Move overlay and
bottom sheet to body level (after </header>) so they render on top of
everything. Close hamburger menu before opening bottom sheet on mobile.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
iOS Safari doesn't recalculate height properly with display:none→block.
Switch to display:block!important + visibility:hidden + translateY(100%)
+ pointer-events:none for hidden state. This ensures iOS renders the
full sheet height before showing it. Also remove overflow:hidden from
base .user-menu that was clipping content.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On mobile (≤768px), user menu now slides up from bottom as a sheet:
- Full name displayed in header with avatar
- Larger touch targets (14px padding)
- Dark overlay behind (tap to close)
- Smooth slide-up animation (translateY)
- Safe area inset for iPhone notch/home indicator
- Handle bar at top (standard bottom sheet pattern)
Desktop behavior unchanged (absolute dropdown).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New endpoint /kalendarz/ical returns .ics file with all upcoming events.
Compatible with Google Calendar, iOS Calendar, and Outlook subscription.
- Auto-refreshes every 6 hours (REFRESH-INTERVAL)
- Includes event time, location, description, organizer
- Handles all-day events (no time_start) and timed events
- "Subscribe" button on calendar page with copy-to-clipboard modal
- Instructions for iPhone, Google Calendar, and Outlook
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Show users what they can edit (description, services, contacts, social,
logo) and what is auto-populated from registries (NIP, REGON, KRS,
address). Addresses user confusion reported at March 23 meeting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Companies with large websites (e.g. Waterm: 94 badges, Chopin TV: 172)
now show max 25 badges by default with a "+ jeszcze N" button to expand.
Data in database unchanged — only display limit in template.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace position:absolute (unreliable inside sticky header on iOS Safari)
with position:fixed + dynamic top calculated from header bottom edge.
Add -webkit-overflow-scrolling:touch for smooth scrolling on iOS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display relationship labels on company cards in the directory:
- Child companies show "marka [Parent Name]" (e.g. "marka Forte Media")
- Parent companies show comma-separated list of child brands
- Handles inactive parents (e.g. Forte Media → Scantric, You're Welcome)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace technical jargon (tokens, thinking mode, benchmarks) with
user-friendly language: number of questions per day/week/month,
page equivalents (~160 pages per query), how to write questions,
costs explanation, and future billing notice. Update dropdown
descriptions and limit exceeded messages.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace old Pro-only cost limits with unified system for all models:
- Per-user limits: $0.15/day, $0.50/week, $1.00/month (degressive)
- Global portal budget: $25/month (~100 PLN) tracked and displayed
- Two progress bars in chat header: personal daily + global portal usage
- Color-coded bars (green→yellow→red at 60%/90%)
- Limit exceeded banner with "request higher limits" button
- Backend endpoint logs requests for admin review
- Flash model recommended as default (economical)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Hide quality badges (basic/enhanced/complete) from admin company list,
company detail, and navigation menu. Remove dead CSS from public
company detail template. Backend scoring remains for internal use.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Przeniesiono info o blokadzie do kolumny Status — nie rozjeżdża tabeli.
Badge "Zablokowane (X min)" klikalny → odblokuj. Badge "Xx błędne hasło" żółty.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dodano kolumnę "Blokada" w /admin/users pokazującą:
- status blokady z pozostałym czasem w minutach
- liczbę nieudanych prób logowania
- przycisk "Odblokuj" do natychmiastowego odblokowania konta
- filtr "Zablokowane" w zakładkach
Nowy endpoint POST /admin/users/<id>/unlock dla adminów.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Menu otwiera się tuż pod przyciskiem za pomocą getBoundingClientRect()
i position:fixed, niezależnie od scrolla strony.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dropdown rozwija się pod admin barem na pełną szerokość. Kliknięcie
innego dropdown zamyka poprzedni (tylko jeden otwarty naraz).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
overflow-x:auto na admin-bar obcinał absolutnie pozycjonowane dropdown menu.
Zmieniono na flex-wrap + bottom-sheet pattern (position:fixed, bottom:0)
na mobilce, identyczny jak w notyfikacjach.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Event delegation nie działało na PWA. Inline onclick bezpośrednio
na buttonach jest bardziej niezawodne.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Admin bar był ukryty na mobile (display:none). Teraz jest widoczny
ze scroll horyzontalnym i dropdowny otwierają się na tap zamiast hover.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Zakładki z border-bottom indicator, przycisk "Nowe posiedzenie" przeniesiony
na prawą stronę paska zakładek.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Nowy route /rada/skladki dostępny dla członków Rady Izby (chamber_role).
Pokazuje te same dane co panel admin, ale bez edycji — tylko podgląd
statusów płatności, filtrowanie i zaległości z lat poprzednich.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tabela mieści się na ekranie: table-layout fixed, mniejsze month-cell (26px),
cyfry rzymskie zamiast 3-literowych skrótów, przypomnienie jako ikona z tooltip,
skrócony przycisk. Kolumna zaległości 70px.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Nagłówek dwuliniowy: "Zaległości / z lat poprz."
- Placeholder "+ wpisz" z ramką dashed zamiast kreski
- Po zapisie tylko czysta kwota w kolorze czerwonym
- Zaktualizowana legenda
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dodano pole previous_years_debt w modelu Company. Kolumna widoczna w widoku
rocznym składek — kliknięcie kwoty otwiera pole edycji. Legenda zaktualizowana.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Zamiast mylących "mają nieopłacone" vs "częściowo opłacone":
- Opłacone za cały rok
- Częściowo opłacone (mix opłaconych/nieopłaconych + niepełne wpłaty)
- Brak wpłat (żaden miesiąc nie opłacony)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dodano brakujące polskie znaki diakrytyczne (ł, ś, ź, ć, ó, ń) w całym
szablonie składek członkowskich. Ulepszono opisy w dropdownie filtrów
i dodano kontekst do kart statystyk.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
KRS data has RODO-masked names (L***** G****). Use portal_user.name
when available for display.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Search by name now finds registered portal users with avatar, company,
and chamber role badge. Deduplicates with KRS person results.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Prezes/Wiceprezes get their role badge + green Rada Izby badge.
Regular Rada members get only Rada Izby badge.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Added chamber_role column to User model (prezes, wiceprezes, czlonek_rady, komisja_rewizyjna, sad_kolezenski)
- Migration 089 sets roles for all known members from norda-biznes.info/wladze-izby
- Role badges on user profile, person detail, and company contact persons
- New page /izba/wladze showing all chamber authorities grouped by organ
- Color-coded badges: gold (prezes), blue (wiceprezes), green (rada), purple (komisja), gray (sąd)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sections start collapsed, click title to expand. State remembered in
localStorage. Also removed duplicate CSS for audit-collapsed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Address displayed prominently below description with 'Pokaż na mapie' link.
Location pill in contact bar also links to Google Maps.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New API endpoint /api/upcoming-events?filter=norda|external|all.
Filter buttons fetch from server instead of hiding DOM elements.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Trash icon in message detail header. Deletes message with all replies
and attachments. Uses nordaConfirm() styled modal.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Added nordaConfirm() to base.html - styled modal with icon, title,
message and colored buttons. Replaces native confirm() in group
message/member deletion and group deletion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Group owner can delete entire group (danger zone in manage panel)
- Message author or group owner can delete individual messages (trash icon on hover)
- CASCADE deletes attachments from disk
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New API endpoint /api/grupa/<id>/nowe returns messages after given ID.
Group view polls every 5 seconds and appends new messages without reload.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Show small avatars under each message indicating who has read up to that point
- Fix BuildError: group_update → group_edit in group_manage template
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Name and company in one line separated by | pipe, smaller avatars,
tighter padding for more compact member selection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix avatar_path already contains 'uploads/' prefix, don't double it
- Use url_for('static') for all avatar img src attributes
- Strip HTML tags from message preview in inbox with |striptags
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Set cursor to end of input after page reload (setSelectionRange)
- Member picker list collapses by default, toggle button to open/close
- Clicking outside picker auto-closes the list
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Search bar in inbox/sent: filters by subject, content, sender/recipient
- Group chats: create named or ad-hoc groups with Norda members
- Group roles: owner, moderator, member with permission hierarchy
- Group management: add/remove members, change roles
- Photo avatars in message list (fallback to initials)
- Unread count API extended to include group messages
- Migration 088: message_group, message_group_member, group_message tables
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display 6 events instead of 4 on homepage. Add filter buttons (All/Norda/External)
and green gradient for external events with source badge.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Dynamic report at /raporty/skladki showing:
- Yearly execution bar (% collected)
- Company breakdown: fully paid / partial / no payments / wrong amounts
- Monthly execution bars per month
- Summary totals (collected / outstanding / plan)
Access: Rada Izby + OFFICE_MANAGER+. Numbers only, no company names.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New "Przypomnienie" column in yearly fee view shows:
- Empty: no reminder sent yet → button "Przypomnij"
- "✉ Wysłano 20.03": sent but not read → button "Ponów"
- "✓ Odczytano 20.03": sent and read → button "Ponów"
Status derived from last PrivateMessage with "przypomnienie o składce".
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Checkboxes for each available email (company, contacts, users)
- Multiple emails can be selected simultaneously
- Additional manual email input field
- Backend sends to all selected addresses in one email
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Portal recipient: dropdown with all users linked to company + role
- Email: dropdown with company email, contacts, user emails
- Editable email field for manual override
- Roles shown: Właściciel, Zarządzający, Pracownik
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Admin can click "Przypomnij" next to any company with unpaid fees.
Opens modal with full message preview including:
- Amount due and period
- Bank account details (KBS Wejherowo)
- Auto-generated transfer title
Admin reviews the message before sending. Sends as portal private
message + optional email to company contact.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Companies with fee records shown first, then a separator row
"Firmy bez danych o składkach", then companies without data
shown in muted style.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows actual paid amount as a small red rotated badge in top-right
corner of partial payment cells (e.g. "180" when 180/200 paid).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Piotrex paid 180 PLN instead of 200 PLN — status "partial" now shows
as blue instead of unstyled black text.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Companies with monthly rate above standard 200 PLN get a small blue
badge next to their name showing the actual rate (e.g. "300 zł").
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Stat cards: smaller font and padding
- Amounts displayed as whole PLN (no decimals)
- Status filter works in yearly view: "Uregulowane cały rok",
"Oczekujące", "Częściowo opłacone"
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Filter selects now auto-submit on change (no "Filtruj" button needed).
Year range extended from 2022 to current+1.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Person profiles (/osoba/, /profil/) now require membership
- Company detail shows limited "business card" for guests: name, logo,
category, short description — full content hidden behind membership CTA
- Banner "Złóż deklarację członkowską" for guests on company page
- Edit/AI buttons hidden for guests
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
URLs in messages are now automatically converted to clickable links
opening in a new tab. Works for both old plain-text and new Quill
HTML messages. Uses linkify Jinja2 filter that only processes text
nodes outside existing <a>/<img> tags.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use stopImmediatePropagation + capture phase to prevent Quill's
built-in clipboard handler from also inserting the image as base64.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace plain textarea with Quill editor in compose and reply forms
- Support Ctrl+V paste of screenshots directly into message body
- Image toolbar button for file picker upload
- New endpoint POST /api/messages/upload-image for inline images
- Content sanitized via sanitize_html (bleach) with img tag support
- Messages rendered as HTML (|safe) instead of plain text
- Links clickable, images displayed inline in message body
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ICS export, RSS feed, and admin creation now correctly use
external_source (e.g. "Agencja Rozwoju Pomorza") as the organizer
instead of defaulting to "Norda Biznes" for external events.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Filter label hidden when no external events exist. Shows count
like "Pokaż zewnętrzne (3)" when they do.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
External events from partner organizations (ARP, KIG, etc.) can now
be added to the calendar with distinct visual treatment:
- Grey badge "ZEWNĘTRZNE" and muted date box in list view
- Grey color in grid view with border accent
- "Jestem zainteresowany" instead of "Zapisz się" (no commitment)
- Prominent "Przejdź do rejestracji" button linking to external organizer
- "Zainteresowani" section instead of "Uczestnicy"
- Toggle filter "Pokaż zewnętrzne" with localStorage persistence
- Admin form checkbox to mark events as external
New fields: is_external, external_url, external_source on NordaEvent.
Migration: 086_external_events.sql
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Three public feeds: /feed/events.xml (upcoming events),
/feed/news.xml (announcements), /feed/pej.xml (nuclear news).
RSS 2.0 format with KIG custom fields (thumbnail, datawydarzenia).
RSS discovery links added to base.html head.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Added description_full, core_values, services_offered, and
technologies_used to the AI context builder. Previously only
description_short and founding_history were used by NordaGPT.
Added "Wykorzystywany przez NordaGPT" hints to all relevant fields
in the company edit form so users know their content feeds the AI.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CDN (cdn.jsdelivr.net) was being blocked, causing all WYSIWYG editors
to fail silently — description, history, values, and services fields
were not editable. Now served from static/js/vendor/ like D3 and Chart.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allows company managers to set or correct the founding year. Field is
read-only when the year comes from KRS/CEIDG registry data.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ICS format requires plain text (not HTML) in DESCRIPTION field and
lines must not exceed 75 octets per RFC 5545. This fixes "preview
unavailable" when importing ICS into Outlook/macOS Calendar.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds organizer_name and organizer_email columns to NordaEvent with
defaults (Norda Biznes). ICS calendar exports now use per-event
organizer instead of hardcoded value.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds file attachment capability to NordaEvent model (attachment_filename,
attachment_path columns). Admin can upload PDF/DOCX when creating events.
Users see a download link on the event detail page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows detected display-mode, navigator.standalone, and PWA cookies
as a small green text at bottom of screen. Only visible for admin users.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Frontend now sends pwa_display cookie with the actual detected mode
(standalone/minimal-ui/fullscreen/browser/unknown/ios-standalone).
Backend logs this to diagnose why WebAPK detection fails.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Chrome WebAPK may not report display-mode: standalone. Added fallback
checks: minimal-ui, android-app:// referrer, and inverse browser mode
detection (if browser mode is supported but not matched, we're in PWA).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Purple "PWA" badge next to browser name when session was from installed
PWA app. Also reflected in browser grouping as "Chrome Mobile (PWA)" etc.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. PWA: frontend sets pwa_mode=1 cookie when in standalone mode,
backend reads it and stores is_pwa=True in user_sessions.
Migration 063 adds is_pwa column.
2. Bot filter: added 13 new patterns (GoogleAssociationService,
Censys, Palo Alto, Netcraft, fasthttp, Apple WebKit prefetch,
etc.) + flag empty/bare "Mozilla/5.0" UA as bot. This eliminates
~800 false sessions from analytics.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The sort direction check was done AFTER clearing all sort classes,
so it always read false and defaulted to descending. Now reads the
current state before clearing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
All 6 columns clickable: # and numeric columns default desc,
name defaults asc, last login sorts by date value.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Events shown as red 📅(N) above bars with attendee count
- Monday bars have dashed left border as week separator
- Weekend bars (Sat/Sun) in gray to distinguish from weekdays
- Hover tooltip shows event title and attendee count
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Each group-by view now has clickable column headers with sort arrows,
allowing sorting by name, sessions, total duration, and total pageviews.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Clickable column headers with sort arrows (▲▼) for all 6 columns.
Group tabs: "Wg użytkownika", "Wg urządzenia", "Wg przeglądarki" show
summary with session count, total duration and total pageviews per group.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bar area now has fixed 160px height with a wrapper div, so bars are clearly
visible even at low values. Added gradient fill and minimum 5% height for
non-zero days. Value labels are bolder.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
"Zapisano ✓" (green) for events user is attending, with hover changing to
"Wypisz się" (red). "Zapisz się" (blue) for events not yet joined.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Name linking now handles Polish declensions (Iwonę/Iwoną/Iwony → Iwona)
using stem-based regex matching. ICS and Google Calendar exports now include
full event description, speaker name, and properly formatted newlines.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Changed person linking to use User.id → /profil/<user_id> instead of
requiring Person record (person_id). This makes 57 additional users
linkable as green pill badges in event details and descriptions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fix 500 error: company_detail → company_detail_by_slug (slug-based endpoint).
Add ORGANIZER field to ICS so calendar apps show "Norda Biznes" instead of
the importing user. Include speaker name in ICS description.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Match NordaGPT chat visual style — person names show as green pill badges,
company names as orange pill badges. Enriches event description with
auto-linked companies (not just persons). Speaker name also uses pill badges.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Parses emoji-sectioned text (ZARZĄD, WSPÓLNICY, DANE REJESTROWE,
DANE FINANSOWE, PROFIL) into card-based layout with icons, lists,
and highlighted key-value pairs. Plain text gets newline conversion.
HTML from Quill editor passes through unchanged.
Affects 45 companies with emoji format, 63 with plain text.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pinned conversations show red pushpin. On hover, pin button fades
to gray to indicate "unpin" action. Unpinned items show red on
hover to indicate "pin" action.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The generic .conversation-item svg rule was overriding the pin icon
color with gray. Added specific selector with !important to ensure
the pushpin displays in dark navy (#1e3050).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Pin icon changed to classic pushpin in navy blue (matching theme)
- Conversation titles now show up to 2 lines instead of truncating
- Sidebar is resizable via drag handle (200-500px range)
- Sidebar is collapsible with toggle button (state persisted)
- Width preference saved to localStorage
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Users can now pin favorite conversations (shown at top with section header)
and rename them with inline editing. Adds is_pinned, pinned_at, custom_name
columns to ai_chat_conversations table.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Panel ZOPK accessible via admin bar. Stats (0 Projekty, 7
Interesariusze, 203 Aktualności, 0 Materiały) removed — raw
numbers without context confuse users. News stats bar also hidden.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Hide: knowledge stats (facts/entities/chunks), fact types chart,
top entities, key investments, knowledge timeline, knowledge graph.
These are dev/admin tools available in /admin/zopk.
Also hide empty "Projekty strategiczne" section when no projects.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Purple -> navy blue (#1a365d) for professional look.
Source links have hover states. Contact cards show LinkedIn
profiles and PEJ office phone/email.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
YouTube iframes blocked by CSP, pej.pl blocks hotlinking.
Videos now show as clickable thumbnail cards with play button.
Infographics downloaded to static/images/pej/.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Two YouTube videos (virtual tour, project overview) and two
infographics from pej.pl (reactor components, construction timeline).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
localStorage-based tracking. Clicked articles get dimmed with
green left border and "przeczytane" badge. Counter shows how
many articles on current page have been read.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Supplier registration (dostawcy@pej.pl, pz.pej.pl, PPJ),
PEJ leadership contacts, official project websites,
social media links, and news portals.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Main NAV: replace Kaszubia/Więcej with "Projekty" dropdown (Kaszubia, PEJ).
Remove Social (beta) and Korzyści from main NAV (already in admin bar).
Add "Narzędzia" dropdown to admin bar (Kontakty, Raporty, Mapa Powiązań).
Admin nav reduced from 13 to 10 items.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Keep AI-generated descriptions visible but remove clickability until
project detail pages have real content (news tagged to projects).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Companies matched to ZOPK projects (score >= 40) now see a green
"Zielony Okrąg Przemysłowy Kaszubia" section on their profile with:
- Project name, type icon, and link type badge
- AI-generated collaboration description explaining relevance
- Relevance score percentage
- Links to project detail pages
- Hover effects for interactivity
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add /api/zopk-facts endpoint returning paginated facts from distinct
source articles, ordered by recency
- Add "Pokaż więcej" button with AJAX loading and fade-in animation
- New cards are clickable with same hover effect as initial ones
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Cards now link to source article, show hover highlight and
"Czytaj →" indicator. Cursor changes to pointer on hover.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Change from random() to published_at DESC — show newest, most
relevant facts instead of random old ones
- Translate fact type labels to Polish (investment→inwestycja,
decision→decyzja, event→wydarzenie, etc.)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Enable "Czy wiesz, że..." ZOPK facts widget on homepage for all
logged-in users (was admin-only and disabled with {% if False %})
- Add "Oś czasu" button to ZOPK admin dashboard navigation (was
only accessible from public /zopk page edit links)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add referrerpolicy="no-referrer" to img tags to bypass hotlink
protection on source servers
- Replace Google Favicons fallback (blocked) with inline domain
initial letter in green placeholder
- Consistent styling across index and news_list templates
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix broken news thumbnails by adding og:image extraction during content
scraping (replaces Brave proxy URLs that block hotlinking)
- Add image onerror fallback in templates showing domain favicon when
original image fails to load
- Decode Brave proxy image URLs to original source URLs before saving
- Enforce English-only entity types in AI extraction prompt to prevent
mixed Polish/English type names
- Add migration 083 to normalize 14 existing Polish entity types and
clean up 5 stale fetch jobs stuck in 'running' status
- Add backfill script for existing articles with broken image URLs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
External monitoring via UptimeRobot (free tier) with internal health
logger to differentiate ISP outages from server issues. Includes:
- 4 new DB models (UptimeMonitor, UptimeCheck, UptimeIncident, InternalHealthLog)
- Migration 082 with tables, indexes, and permissions
- Internal health logger script (cron */5 min)
- UptimeRobot sync script (cron hourly) with automatic cause correlation
- Admin dashboard /admin/uptime with uptime %, response time charts,
incident log with editable notes/causes, pattern analysis, monthly report
- SLA comparison table (99.9%/99.5%/99%)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The periods data from Google Places API (New) uses {hour, minute} instead
of {time}. The JS check now handles both formats so business hours status
displays correctly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New page /admin/gbp-audit/match-places shows companies without
google_place_id. Admin searches Google Maps, reviews results, and
confirms the correct match. Adds search_places_raw() to return all
results without name filtering.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Batch audit now collects changes without saving to DB. Admin must
review before/after differences and approve or discard. Mirrors the
existing social audit enrichment review pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run audit for all active companies with background thread, live progress
panel, and optional Google Places API data refresh. Pattern mirrors
existing social audit batch implementation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Personalized guide with GBP links (write review, view profile, photos)
for each member's company. Includes tips on collecting reviews,
responding to feedback, Local Guides program, and Google policies.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The admin reset-password endpoint used datetime.utcnow() while the
validation used datetime.now(), causing tokens to appear expired
immediately on CET servers. Changed to datetime.now() and extended
admin-initiated resets to 24 hours validity.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Admin can now send a password reset email directly from /admin/users
instead of manually copying and sharing the reset link.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Split monolithic "Zarządzanie" dropdown (17 items) into 5 thematic groups:
Audyty, Izba, Social media, System, Treści — sorted alphabetically
left-to-right with items within each dropdown also alphabetized.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove unused social-media analytics panel (replaced by social-audit).
Rename admin menu items for clarity:
- Forum → Moderacja forum
- Ogłoszenia → Moderacja ogłoszeń
- Rekomendacje → Moderacja rekomendacji
- Deklaracje → Zarządzanie deklaracjami
- Składki → Zarządzanie składkami
- Korzyści → Zarządzanie korzyściami
- Social Media → Audyt social media
- Social Dashboard → Publikacja social media
- Kalendarz → Zarządzanie kalendarzem
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace generic "OAuth API niedostępne" with platform-specific
instructions explaining what's needed to fetch data:
- Instagram: 3-step guide (Business account, FB link, OAuth)
- Twitter/YouTube: note that data is fetched automatically
- Facebook: prompt to connect OAuth
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add twitter_service.py using Twitter's internal GraphQL API with
guest token authentication (free, no API key needed). Fetches
followers, tweets, bio, location, media count, and more.
Integrated into social audit enrichment with _twitter_extra data
stored in content_types JSONB, displayed on audit detail cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- YouTubeService now fetches: subscribers, views, video count, description,
avatar, banner, country, creation date, recent 5 videos
- Enricher uses API first, falls back to scraping
- Extra YouTube data stored in content_types JSONB
- Audit detail shows view count, country, creation date, recent videos
- Requires enabling YouTube Data API v3 in Google Cloud Console
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users can now select which platforms to scan (Facebook, Instagram,
LinkedIn, YouTube, Twitter/X, TikTok) via checkboxes in the
confirmation dialog. Backend filters both company list and profiles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added: talking_about_count, username, verification_status, price_range,
category_list, page_posts_impressions, video_views, daily_follows/unfollows.
Updated audit detail UI with new data sections.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of checking profile.source (which was never 'facebook_api'),
now checks SocialMediaConfig for companies with OAuth page_id.
Added progress indicator with spinner and percentage during scan.
After API sync, page auto-refreshes to show new data.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of skipping OAuth-connected Facebook profiles, the enrichment
scan now calls sync_facebook_to_social_media() to fetch fresh data
via Graph API.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix checkmarks showing as ✓ by using Unicode ✓/✗ directly
- Decode HTML entities (' &) from og:meta in enricher results
- Replace native confirm()/alert() with styled modal dialogs and toasts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
If location_url is set, use it. Otherwise auto-generate Google Maps
search link from location name. Skip "do ustalenia" and "Online".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Month names: sty, lut, mar... instead of Jan, Feb, Mar
- Event types: Spotkanie, Networking, Webinar, Inne
- RSVP "Wezmę udział" button directly on event list cards
- Grid legend labels also in Polish
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- /profil/<user_id>: simple profile for users without person_id,
redirects to /osoba/ if person_id exists
- event.html: all attendees are now clickable links (green)
- Auto-link User→Person by name match on every login (no manual scripts)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Member names in event description link to person profiles
- URLs auto-linked (nordabiznes.pl, https://... etc)
- Calendar add section: blue gradient card with Google/Outlook buttons
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- POST /konto/avatar: upload, center-crop to square, resize 300x300
- POST /konto/avatar/delete: remove file and clear DB
- dane.html: interactive avatar editor with hover overlay
- person_detail.html: show photo if available, fallback to initials
- Migration 070: avatar_path column on users table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rada Izby badge next to name
- Last active label (e.g. "Aktywny 2 dni temu")
- Forum stats (topics + replies count)
- Recent events attended (up to 5, linked)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Norda Biznes logo on featured events
- Speaker name links to person profile
- Google Calendar and ICS/Outlook export buttons
- Update dev banner: official launch April 9, 2026
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Facebook, Instagram, LinkedIn block public access - messages now explain
this and suggest OAuth API connection instead of generic "no data".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Custom modal with icon, safety info bullets, and styled buttons
- Error feedback shows in live panel instead of alert()
- Clean UX consistent with rest of admin panel
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Live panel with spinner, progress bar, company counter
- Each company appears as a row with platform badges showing status
(changes/no_changes/skipped/error/no_data)
- Incremental polling (since= param) for efficient updates
- After completion: link to review page if changes found
- Blue highlighted rows for companies with new data
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Scraper now collects data to staging area (in-memory), NOT to database
- New review page (/admin/social-audit/enrichment-review) with:
- Summary stats (scanned, changes, skipped, errors)
- Per-company expandable sections with before→after diff per field
- Pending approval banner with change count
- Sticky bottom bar with Approve/Discard buttons
- Approve endpoint writes staged data to DB
- Discard endpoint clears staging without touching DB
- After scan completes, auto-redirect to review page
- Companies without changes shown in collapsed list
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Scraper no longer overwrites API data (source priority hierarchy)
- Per-platform data provenance badges (API OAuth/Scraping/Manual/Unknown)
- Expandable field-level source breakdown (which fields from API vs scraping)
- OAuth status per platform with connect/renew/sync links
- "Run audit" button on dashboard (background enrichment for all companies)
- "Run audit" button on detail view (single company enrichment)
- Enrichment progress polling with real-time status updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Platform icons now display in 3x2 grid instead of 6 in a row. Removed
redundant "Liczba" column. Merged "Kompletność" and "Zdrowie SM" into
single "Ocena" column. Shortened recommendations to icon+count with
tooltip. Reduced cell padding and font size. Min-width 900px (was 1100px).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add Social Health Score (0-100) composite: activity 30%, engagement 25%,
completeness 20%, growth 15%, cross-platform 10%. Add followers growth
rate from JSONB history, activity status classification (active/moderate/
slow/dormant/abandoned). Display health score in dashboard table and
detail view with color-coded ring, growth indicators per platform,
and cross-platform coverage score.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows latest version, date, one highlight feature, and count of other
changes. Links to /release-notes. Extracted _get_releases() helper
for reuse between index and release_notes routes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New route /admin/social-audit/<company_id> showing detailed social media
audit per company: platform cards with metrics, profile checklist,
completeness bar, recommendations, invalid profiles section.
Added audit detail icon in dashboard table alongside profile link.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Blue "Nowa" pill for unread messages, green "Przeczytana" for read.
Consistent with sent folder status pill design.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Green pill for read messages, yellow/amber for unread/waiting,
blue for received. Applied consistently across sent list, message
view, and thread view.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows full conversation thread when replies exist, with per-message
status (sent/read with timestamps), sender→recipient flow, and
current message highlighted. Single messages show status bar at bottom.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Polish diacritics in UI text, unified topbar with tabs and button,
cleaner card layout with subject/date on top row and preview/recipient
on bottom row, mobile responsive, better empty states.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add attachment display section in view.html with inline image thumbnails and document download links
- Add eager loading of attachments in inbox, sent, and view queries
- Add paperclip emoji indicator in inbox and sent message lists
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace plain <select> dropdown with typeahead autocomplete that filters
users from first character typed. Supports Polish diacritics (NFD
normalization), keyboard navigation, and visual selected-recipient chip.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Required for Google OAuth verification to remove "unverified app" warning.
Adds /polityka-prywatnosci and /regulamin routes with Polish legal content,
footer links, and sitemap entries.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After token exchange, fetches Google userinfo to save the email and
name of the Google account used for authorization. Displays this info
on the GBP audit page so users know which account to reconnect with.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Moved the OAuth connection status banner from the middle of the page
to directly below the header for immediate visibility. Added direct
link buttons to /konto/integracje for each state: "Zarządzaj" (active),
"Połącz ponownie" (expired), "Połącz konto" (not connected).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows whether the company has an active Google Business Profile
console connection, with clear status indicators (connected/expired/
not connected) and guidance on how to reconnect via Konto → Integracje.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Translate English day names to Polish abbreviations (Mon→Pon, etc.)
- Show all 7 days in grid layout instead of 5 + "..."
- Remove technical scoring breakdown formula from reviews card
- Add "zdjęć w profilu" suffix to photos count
- Show categories as styled badges
- Truncate long descriptions at 120 chars
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JSONB stores dict keys as strings ("5") but template looked up integer keys (5).
Now checks both int and string key variants.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix google_reviews_data bug: data is dict with 'reviews' key, not a list
(was always hidden by 'is not mapping' guard)
- Add rating distribution bar chart from Places API review data
- Display google_photos_metadata table (author, dimensions, owner photos)
- Add audit diagnostics footer (source, version, errors)
- Show owner_response_time and keywords on individual GBP reviews
- Add Polish translations for Google Places business types (40+ types)
- Use primary_type_display for human-readable category names
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add opening hours, business status, Google types, website URL, Place ID,
rating/reviews/photos summary, website tracking indicators, Google attributes,
Places API reviews, smart recommendations engine, and benchmarks comparison
with other Norda Biznes members.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Speed Index, Time to Interactive, Total Blocking Time from PageSpeed
- Benchmark table: company vs category avg vs all-members avg with arrows
- WHOIS via RDAP: domain registration, expiry, last change, registrar
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When OG image fails to load (hotlink protection, CORS), shows
clickable URL instead of just "Obrazek niedostepny". Adds
referrerpolicy=no-referrer to bypass referer-based hotlink blocking.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds 'is not mapping' checks for gsc_top_queries, gsc_top_pages,
and gbp_search_keywords to prevent KeyError on slicing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>