Add is_paid, price_member, price_guest to NordaEvent. Add payment_status,
payment_amount, payment_confirmed_by/at to EventAttendee and EventGuest.
Auto-assign amounts on RSVP. Admin panel at /admin/kalendarz/<id>/platnosci
for OFFICE_MANAGER to confirm payments. User sees payment status on event page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PWA smart banner displayed icon at 40x40 but loaded 192x192 PNG (17KB).
Now uses 48x48 WebP (1.9KB) — 89% smaller, with explicit dimensions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Browser starts downloading fonts immediately instead of waiting
for CSS parse. Reduces the window between system font and Poppins,
which should lower CLS from font-display: swap reflow.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
d3.v7.min.js (225KB) and connections_modal.html (~1100 lines) were
loaded on every page but only used by owner-only "Mapa Powiązań" tool.
- Removed d3.js and connections_modal include from base.html
- Added {% block extra_scripts %} for pages that need external JS
- admin/zopk_knowledge_graph.html loads d3 via extra_scripts block
- connections_map.html already had its own d3 import
- "Mapa Powiązań" link now points to /connections page instead of modal
- zopk/index.html d3 code was disabled ({% if false %}) — no change needed
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace external Google Fonts CSS request (780ms render-blocking) with
self-hosted woff2 files served from /static/fonts/ with 30-day cache.
- 8 woff2 files: Poppins 400/500/600/700 × latin/latin-ext (53KB total)
- Inline @font-face declarations in <style> tag (no external request)
- font-display: swap preserved (no FOIT)
- CSP updated: removed fonts.googleapis.com and fonts.gstatic.com
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Missed 2 occurrences of #94a3b8 in previous commit. Now zero instances
of the old color remain in base.html.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previous contrast ratio 3.58:1 (FAIL), now 4.82:1 (PASS).
Affects footer section text, links, footer-bottom, and inline span.
All 18 elements flagged by Lighthouse are resolved.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Fix heading hierarchy: H4→H3 in "Dlaczego warto?" section (6 cards)
to maintain sequential H1→H2→H3 order (accessibility)
- Add explicit width/height to logo images in header/footer (CLS)
- Add Cache-Control: 30 days for /static/ assets (performance)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add defer to d3.v7.min.js in base.html — eliminates ~1.8s render
blocking on every page (d3 only needed on user interaction)
- Shorten landing page title from 71 to 59 chars (SEO optimum: 30-60)
- Add Permissions-Policy security header (camera, microphone, geolocation)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Forum tile: show newest reply (author + date), not newest topic creation
- New members: find newest board meeting that actually has admitted companies
- Fix events-row container for proper filter rendering
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add admitted_at_meeting_id to Company model linking firms to board meetings.
Homepage now shows 2 events (left column) + latest forum topic and new members
admitted at the last board meeting (right column). Responsive single-column on mobile.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Production moved from on-prem VM 249 (10.22.68.249) to OVH VPS
(57.128.200.27, inpi-vps-waw01). Updated ALL documentation, slash
commands, memory files, architecture docs, and deploy procedures.
Added |local_time Jinja filter (UTC→Europe/Warsaw) and converted
155 .strftime() calls across 71 templates so timestamps display
in Polish timezone regardless of server timezone.
Also includes: created_by_id tracking, abort import fix, ICS
calendar fix for missing end times, Pros Poland data cleanup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Self-referential FK with lazy='joined' causes DetachedInstanceError after
db.close(). Build a simple dict lookup in the route instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add created_by_id FK to users table (NULL = self-registration)
- Set created_by_id in admin create, bulk create, and team add routes
- Show "samorejestracja" or "dodał: [name]" in admin users panel
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
localStorage key was global ('audit_open_Strona_WWW') — expanding on one
company expanded on all. Now uses company ID in key and defaults to collapsed.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Modal had overflow:hidden cutting off the footer buttons. Changed to
overflow-y:auto with sticky footer so 'Zapisz wybrane' is always reachable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Auto-strip legal form from name (CONSTELLATION SP. Z O.O. → Constellation)
2. Auto-suggest category from main PKD code (62.02.Z → IT)
3. Clean empty 'https://' from WWW field
4. Rename button to 'Wyszukaj w internecie'
5. Auto-advance to step 4 after logo confirmation
6. Larger logo preview in summary step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Green checkmarks appear next to correctly filled fields in Step 2
- Live validation on input (checkmarks update as user types)
- 'Wyszukaj stronę' recognizes when URL already from KRS
- Backend returns existing website without Brave search if already known
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
KRS for PROS POLAND has no www/email/phone. All Brave results are directory
sites (filtered). Show clear message about what's missing from registry.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add 'Wyszukaj stronę' button in Step 2 next to WWW field (uses WebsiteDiscoveryService/Brave)
- Fix company name: update from legal_name when KRS enrichment provides it
- Add discover-website endpoint
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allows Kierownik Biura to independently add new member companies via NIP lookup,
registry data enrichment (KRS/CEIDG), logo discovery, SEO/GBP/Social audits.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Logo upload in company edit was writing the file path to `logo_dark_bg`
(a Boolean column), causing TypeError and rolling back ALL profile changes.
Now saves to static/img/companies/{slug}.{ext} where company_detail expects it.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Hide "Zapisz zmiany" and preview panel when team tab is active
- Show last login date or "Nie zalogował/a się jeszcze" per member
- Add "Wyślij ponownie zaproszenie" button for inactive accounts
- New endpoint POST /firma/<id>/zespol/<user_id>/zaproszenie
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Permission checkboxes now show descriptive labels with hints explaining
what each permission controls. Role descriptions visible under each member.
Dropdown options in add form also more descriptive.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nordaConfirm(message, callback) signature requires callback as 2nd arg,
not 3rd. The description text is now part of the message HTML.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allow company MANAGERs to add/remove users, change roles,
and manage granular permissions from the company edit page.
New "Zespół" tab with AJAX-based team CRUD.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nordaConfirm now accepts both (form, message, options) for form submission
and (message, callback, options) for AJAX-based confirmations like guest deletion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
nordaConfirm() expects (form, message, options) for form submission,
not a callback. Using native confirm() for AJAX-based guest deletion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Menu was placed outside header (for iOS z-index stacking) but used
position:absolute relative to body, rendering it below viewport.
Changed to position:fixed with dynamic top calculated from trigger
button position via getBoundingClientRect.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds direct shortcut to company edit (MANAGER) or company profile (EMPLOYEE)
in the user avatar dropdown. Addresses feedback that editing company data
required searching for own company in the directory.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Shows: total active, paying members, subsidiaries (fee in parent),
resignations, standard vs premium fee tier counts.
All dynamic from database.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
GBP audit modal displayed raw <span> tags instead of rendered HTML
because updateStep() used textContent instead of innerHTML.
Migration 090: Lord Alkohole NIP update (company transformation).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Root cause of double paste: Quill's internal clipboard handler AND my DOM
handler both processed the image. Fix: override clipboard.onPaste directly
to intercept images before Quill processes them.
- uploadAndInsertImage() extracted as reusable method
- CSS: img.selected gets resize:both for native browser resize handle
- Removed complex DOM resize hack (didn't work with Quill contenteditable)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- 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>