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>
Cookie pwa_mode=1 is set by JS after page load, so it's not available
on the first request that creates the session. Now also check on
subsequent requests and update is_pwa=True retroactively.
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>
Company names like "Portal", "Joker", "Wakat" are also common Polish words
and cause false positive matches in event descriptions.
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>