- Removed IP address from declaration box
- Merged address + contact into one section (less sections = cleaner)
- Removed duplicate company name (already in header)
- Added workflow history section (review stages)
- Wider spacing between sections (14pt), fields with subtle bottom border
- Consent as grid with colored check icons
- Description truncated to 800 chars
- Larger, more readable header with company name prominent
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- New route: /admin/membership/<id>/print → generates PDF
- Professional A4 layout with chamber header, data sections, signatures
- Button changed from window.print() to PDF link (opens in new tab)
- No browser headers/footers — clean PDF output
- Signature lines for applicant and reviewer
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- "Dane kontaktowe" chip now says "TYLKO do firm które polecileś powyżej"
- Added prompt rule: follow-up contact requests = only previously recommended firms
- Each contact entry must include short reason WHY the firm was recommended
- Prevents AI from dumping all 15 matcher results when user asks for contacts
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. When company_matcher returns [], keep full company list as fallback instead of leaving AI with zero data
2. Add explicit "no results" instruction in prompt to prevent hallucinated company names
3. Hide cost badge chip from non-admin users (IS_ADMIN gate)
4. Add 60s AbortController timeout on streaming fetch to prevent hung connections
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Badge now uses pill-shaped colored chips instead of tiny gray text:
- Blue chip: model name (Flash/Lite/Pro)
- Yellow chip: thinking level (szybki/analiza/głęboka analiza)
- Green chip: response time
- Green chip: cost
Much more readable than the previous 11px gray text.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove CSS filter on AI avatar — show NordaGPT robot icon as-is
- Strategic keywords (partner, inwestow, PEJ, serwerowni) → complex
- Complex queries get thinking=high for deeper analysis and less hallucination
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- NordaGPT icon (nordagpt-icon.svg) as AI avatar instead of "AI" text
- User profile photo as avatar (falls back to initial letter)
- CRITICAL: added strict rule to never hallucinate company names
- Only mention companies that exist in the provided database
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On narrow screens the link was competing for horizontal space, splitting
the widget into two columns. Now it wraps to a full-width row below.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
microsoft-fluent.css is not loaded as a stylesheet — all styles are inline
in base.html. Moved the widget CSS to index.html's extra_css block where
it will actually be applied.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
On mobile screens the "Co nowego na platformie" section took up excessive
vertical space by showing full descriptions of all starred items. Now on
<768px: descriptions hidden, only 2 items shown, reduced padding.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Root cause: data.messages is sorted newest-first (DESC), but code took last element (oldest). Now properly filters for new messages only and updates with the newest.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move legacy inbox to /wiadomosci/stare, promote /wiadomosci-v2 to /wiadomosci,
and update nav links in base.html to point to conversations_page.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Jinja2 template for the conversation-based messaging UI with:
- Two-panel layout (conversation list + chat view)
- Quill rich text editor for message composition
- Context menu with reply/react/forward/pin/edit/delete actions
- Emoji picker, typing indicator, pinned messages bar
- New message modal with recipient search
- Reply preview in input area
- File attachment support
- SVG icons (Heroicons-style, stroke-based)
- Dynamic JS loading to ensure data variables are set before conversations.js
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Completeness bar above buttons: "Profil 65%" with missing field list
2. Two buttons:
- "Uzupełnij brakujące" (fill mode) — only fills empty fields,
skips existing data, all results pre-checked
- "Sprawdź aktualizacje" (full mode) — shows all changes including
updates to existing fields, changes unchecked by default
3. "Uzupełnij" button hidden when profile is 100% complete
4. Backend provides profile_filled, profile_total, profile_missing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Review panel now shows side-by-side comparison for each field:
- Red block "Obecne:" shows current value (what will be replaced)
- Green block "Propozycja:" shows AI suggestion
- Badge: NOWE (green) for empty fields, ZMIANA (yellow) for updates
- New fields are pre-checked, changes are unchecked (safer default)
- Unchanged fields are hidden (no noise)
- Backend now returns current_data alongside proposed_data
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
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>