Add profile links to usernames and avatars across forum, classifieds,
announcements, company recommendations, board members, and group messages.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Logo images were cached for 30 days by nginx. After selecting a new logo
from the gallery, the browser still showed the old/placeholder image.
- Add cache-bust query param (?v=timestamp) to logo <img> src
- Update company.last_updated when logo is confirmed
- Use Date.now() redirect instead of reload() after confirm
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>
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. 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>
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>
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>
- 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>
- 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>
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>
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>
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>
Instead of using stale open_now flag from audit time, opening hours
status is now computed client-side using JavaScript Date and the
periods data from Google Business Profile. Updates every 60 seconds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Email button as full-width card showing address + "Wyślij e-mail"
- Private message button with subtitle "na portalu Norda Biznes"
- Phone shown as plain text above action buttons
- Contact preferences moved to bottom as subtle footer
- Both actions clearly distinguishable with different styling
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Email/phone are already clickable links (mailto:/tel:), no need for
separate button. Renamed "Napisz" to "Wiadomość prywatna" with chat
icon to clearly distinguish from email contact.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- "Powrót do firmy" link when composing from company profile
- "Wyślij e-mail" button opens default mail client (mailto:)
- "E-mail" button on company contact cards for direct mailto
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows portal users linked to a company with their contact details,
role badges, Norda membership status, and direct messaging link.
Respects individual privacy settings (show_phone, show_email).
Addresses forum feedback from Jakub Bornowski (topic #18).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Migration 064 fixes 12 records in company_websites table missing https://
- Added ensure_url filter to w.url in contact bar template as safety net
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract 12-field completeness scoring to utils/data_quality.py service
- Auto-update data_quality_score and data_quality label on company data changes
- Add /admin/data-quality dashboard with field coverage stats, quality distribution, and sortable company table
- Add bulk enrichment with background processing, step selection, and progress tracking
- Flow GBP phone/website to Company record when company fields are empty
- Display Google opening hours on public company profile
- Add BulkEnrichmentJob model and migration 075
- Refactor arm_company.py to support selective steps and progress callbacks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the dark/light background toggle from logo selection modal,
company detail pages (admin and public), and the toggle-logo-bg API
endpoint. The feature didn't meet UX requirements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add explicit white background to gallery cards so only the inner
image container changes to dark, keeping card borders, text and
badges on their original light backgrounds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When choosing a logo, admins can now switch between light and dark
backgrounds to see which works better for transparent logos. The
selected background preference is automatically saved when confirming.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The toggle was only on the admin panel - added it next to
"Pobierz logo" on the public company detail page too.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a per-company setting to display logos on dark background,
useful for logos with white text or light-colored elements.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Store extra Graph API fields in content_types JSONB. Show category tag,
contact pills with icons, and description in styled quote block.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Don't overwrite vanity URL with numeric page_id fallback
- Display profile description and completeness bar on Facebook card
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
After connecting a FB page via OAuth, automatically fetch page stats
(followers, engagement, bio) from Graph API and persist to
CompanySocialMedia table. Adds manual refresh endpoint and UI badge.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Quill.js outputs HTML with <p> tags. Without | safe filter, Jinja2
escapes the tags and they display as literal text. Backend sanitize_html()
already strips unsafe tags via bleach.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Score candidates based on format (SVG > raster), source reliability
(img_scan > apple-touch-icon > og:image > favicon), aspect ratio
(square-ish preferred), and size. Recommended candidate gets amber
border with "rekomendowane" badge in gallery UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of auto-selecting one logo candidate, the service now downloads
up to 6 candidates and displays them in a gallery. User sees all options
(including their current logo if exists) and picks the best one.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a company already has a logo, the fetch shows both old and new
logos side-by-side so the user can choose to keep or replace. Uses
preview file mechanism (slug_preview.webp) with confirm/cancel actions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New "Pobierz logo" button on company detail page that automatically
downloads and converts company logos from their websites. Uses 4-strategy
approach (DOM scan, meta tags, favicon, Google API fallback) with
animated progress overlay showing 6 steps.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Displays badge indicating whether detected LinkedIn is a company page
or personal profile. Shows recommendation to create a Company Page
when only a personal profile is found. Visible only to company
owners/managers and admins.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
19 sub-sections (7 CEIDG + 12 KRS) can now be individually hidden
within the Official Registry Data section. Sub-section toggles use
indented styling with lighter colors in the edit UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allow company owners, managers, and admins to hide specific profile
sections from visitors. Hidden sections remain visible to authorized
users with a "Ukryta" badge. Includes migration, API endpoint,
edit UI tab, and conditional rendering for all 15 profile sections.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add company_website_id FK to CompanyWebsiteAnalysis, extract audit cards
to Jinja macro, render per-website under each banner with fallback for
sites without audit data. Google Rating stays at company level.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Six types: website (blue), store (green), booking (purple), blog (orange),
portfolio (pink), other (gray). Each type has unique icon, color in contact
bar and banner section, and tooltip with site description.
Form edit adds type selector dropdown per website row.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migration 067 copied comma-separated URLs as single records.
067b splits them into individual rows and syncs companies.website.
Banner now uses primary from relationship instead of company.website.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add CompanyWebsite model with label, is_primary flag, and backward
compatibility sync to company.website. Dynamic form in company edit,
separate buttons in contact bar, additional banners in detail view.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Child companies (with parent_company_id) now show parent's NIP and can
fetch data from KRS/CEIDG using inherited NIP. Fixes Alter Energy showing
no NIP despite sharing one with Fiume Studio.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Employees clicking "Edytuj profil" now see a modal with their company's
management team contacts instead of being sent to an edit form they can't use.
Managers and admins continue to access the edit form directly. Direct URL
access to /firma/edytuj is also guarded with redirect + flash message.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>