- Remove currentMapBounds from watch - it changes on every map move
- Watch only filterByBounds and urlBounds (URL-based state)
- Add early return in setBoundsFilter if bounds haven't changed
This fixes the issue where the list was reloading on every map movement
even when the 'filter by bounds' checkbox was OFF.
- Add urlBounds and filterByBounds computed from URL query
- Add setBoundsInUrl and clearBoundsFromUrl actions
- Update index.vue to use URL-based bounds state
- Bounds written to URL as comma-separated values (west,south,east,north)
This enables sharing links with map viewport bounds filter.
- Add west/south/east/north params to HubsList, SuppliersList, ProductsList GraphQL
- Update useCatalogHubs to pass bounds to query
- Update useCatalogSuppliers to pass bounds to query
- Update useCatalogProducts to pass bounds to query
- Add loadRelatedPointIcons to load icons for all entity types
- Change related points layer from circle to symbol with icons
- Each type (hub, supplier, offer) gets its standard color:
- hub: green (#22c55e)
- supplier: blue (#3b82f6)
- offer: orange (#f97316)
- Remove all tabs from InfoPanel, use stacked sections instead
- Load suppliers (for hub) and hubs (for supplier) immediately
- Show entity header as text, not card
- Simplify relatedPoints to show all points on map
- Add translations for new section titles
- onSelectItem now calls selectItem to add filter badge
- Checkbox repositioned to left-[420px] to not hide behind panel
- Hide List button when panel is open
- Add separate loading states for products, hubs, suppliers, offers
- Show spinner on tabs while loading, disable tab during load
- Filter relatedPoints on map by current active tab
- Remove product/hub chips from QuoteForm.vue (duplicate of toggle)
- Add drawer state to useCatalogSearch.ts (isDrawerOpen, selectDrawerItem, applyDrawerFilter)
- Convert SelectionPanel to drawer with header, scrollable content, and footer
- Add "Список" button to CatalogPage.vue to open drawer
- Add "Применить фильтр" button in drawer footer
- Add slide animations for drawer (left on desktop, up on mobile)
- Update translations: catalog.list, catalog.applyFilter
- Replace GetNodesDocument with HubsListDocument in useCatalogHubs.ts
- Replace GetSupplierProfilesDocument with SuppliersListDocument in useCatalogSuppliers.ts
- Replace manual grouping with ProductsListDocument in useCatalogProducts.ts
- Update nearestOffers to pass hubUuid for server-side route calculation
- Remove RouteToCoordinate calls - routes now included in nearestOffers response
- Delete 15 obsolete GraphQL files
- Add 3 new list endpoints: HubsList, SuppliersList, ProductsList
- Fix TypeScript errors in CalcResultContent, LocationsContent, hubs page, location store
Replace OfferCard with OfferResultCard when displaying offers
for a hub after product selection. This shows the route stages
and distance to the hub instead of just offer info.
1. Add latitude/longitude to GetSupplierProfile query
- Without coordinates, supplier merge overwrites geo node data
- Causes "Supplier has no coordinates" warning and no offers loading
- Affects: useCatalogInfo.ts loadSupplierInfo() and useCatalogProducts.ts fetchProducts()
2. Add bounds validation in catalog composables
- Validate bounds coordinates before passing to GraphQL or using in filters
- Prevents 400 errors when bounds contain NaN/undefined/Infinity
- Fixed in: useCatalogHubs.ts and useCatalogSuppliers.ts
Fixes:
- https://optovia.ru/catalog?info=supplier:c7f2e3f1-b16a-423d-a947-359e30858d94
- https://optovia.ru/catalog?select=hub 400 error
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace entity-specific queries (GetProductsNearHub, GetOffersByHub, GetHubsForProduct, GetSuppliersForProduct) with unified coordinate-based endpoints (NearestHubs, NearestOffers, NearestSuppliers, RouteToCoordinate). This simplifies backend architecture from 18 to 8 core endpoints while maintaining identical UI/UX behavior.
All composables and pages now use coordinates + client-side grouping instead of specialized backend queries. For global product filtering, uses center point (0,0) with 20000km radius.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add NearestHubs.graphql - find hubs near coordinates
- Add NearestOffers.graphql - find offers near coordinates
- Add NearestSuppliers.graphql - find suppliers near coordinates
- Add RouteToCoordinate.graphql - route from offer to coordinates
- Regenerate geo-generated.ts with new operations
These operations simplify frontend logic by working with coordinates
instead of requiring entity-specific queries.
- Add i18n translations for entities, tabs, and info sections (EN/RU)
- Refactor offers tab to two-step flow (products → offers) for Hub/Supplier
- Replace entity badge with circular icon in header
- Fix "Add to filter" button with name fallback and proper cleanup
- Update selectItem() to clear info param when adding to filter
Implemented Info mode для детального просмотра объектов каталога (hub/supplier/offer) с навигацией между связанными объектами.
Новые компоненты:
- InfoPanel.vue - панель с детальной информацией и табами для связанных объектов
- useCatalogInfo.ts - composable для управления Info state и загрузки данных
Изменения:
- useCatalogSearch.ts - добавлен infoId state и функции openInfo/closeInfo
- catalog/index.vue - интеграция InfoPanel, обработчики событий, relatedPoints для карты
- CatalogPage.vue - проброс relatedPoints в CatalogMap
- CatalogMap.vue - related points layer (cyan circles) для отображения связанных объектов
Флоу:
1. Клик на чип → Selection → Выбор → Info открывается
2. Клик на карту → Info открывается напрямую
3. В Info показываются табы со связанными объектами (top-12)
4. Клик на связанный объект → навигация к его Info
5. Кнопка "Добавить в фильтр" - добавляет объект в chips
URL sharing: ?info=type:uuid для шаринга ссылок
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Add CatalogSearchBar component with filtering to:
- /catalog/offers - search by product name
- /catalog/offers/[productId] - search by hub name/country
- /catalog/hubs/[id] - search by product name
- /catalog/suppliers/[supplierId] - search by product name
- /catalog/suppliers/[supplierId]/[productId] - search by hub name/country
All catalog pages now use CatalogPage component with map on the right side:
- /catalog/hubs/[id] - shows hub on map
- /catalog/offers - shows empty map (products have no coords)
- /catalog/offers/[productId] - shows hubs where product can be delivered
- /catalog/suppliers/[supplierId] - shows supplier location
- /catalog/suppliers/[supplierId]/[productId] - shows hubs for supplier's product
- /catalog/suppliers/[supplierId]/[productId]/[hubId] - shows source and destination
- /hubs/[id]: use findProductsForHub to show only deliverable products
- /offers/[productId]: use findHubsForProduct to show only reachable hubs
- /suppliers/[id]/[productId]: use findSupplierProductHubs for supplier-specific hubs
- Add new GraphQL operations for geo queries
- /catalog/hubs/[id] — список товаров с графиками
- /catalog/hubs/[id]/[productId] — страница товара с большим графиком и предложениями
- CatalogBreadcrumbs — компонент хлебных крошек
- Remove sourceName, latitude, longitude props from OfferResultCard
- Remove LocationMiniMap component (not needed, main map is on the side)
- Convert RouteStepper to use daisyUI steps-horizontal
- Update hub page and CalcResultContent to remove unused props
- Remove distance from right side (shown in stepper)
- Change price format to symbol + formatted number (e.g. $1,200/тонна)
- Add locationName prop for displaying offer location
- Add LocationMiniMap component for showing point on map
- Update hub page and CalcResultContent to pass coordinates
- Add RouteStepper component with transport icons (🚛🚂🚢)
- Add OfferResultCard with price, distance, route stages
- Update hub page to use OfferResultCard
- Update CalcResultContent to use OfferResultCard
- Add useScrollCollapse composable to track scroll and collapse state
- Update topnav.vue to show collapsed bar with chevron when scrolled
- Add collapse button (chevron up) to SubNavigation
- Make SubNavigation sticky below MainNavigation
- Update CatalogPage map/searchbar positions based on header state
- Remove Offers, Suppliers, Products, NearbyConnections sections
- Add product filter dropdown
- Show sources list with routes from findProductRoutes API
- Display routes on map using RequestRoutesMap component
- Add i18n keys for sources section (en/ru)
- Add missing kycOverview.list translations (en + ru)
- Add AI assistant button to navigation (left of globe)
- Improve AI chat layout: fixed textarea at bottom, full width
- Swap homepage sections: How it works before Who it's for
- Add py-4 to main layout for detail page padding
- Show search widget only on main page (not all catalog pages)
- Add 4 menu items: Search, Catalog, Orders, Seller
- Fix orders page click to navigate to order detail
- Update CatalogPage map positioning for new nav structure
- Add search translation to cabinetNav i18n files
- Add hubCountries query and country filter for hubs page
- Add getAvailableProducts query for offers (only products with active offers)
- Add sourceLatitude/sourceLongitude to orders GraphQL
- Fix ListMapLayout with position fixed for proper map height
- GlobalSearchBar: make fields wider, remove unit selector
- Remove status/isVerified filters from suppliers/offers (backend handles this)
- Remove filter from suppliers page (not needed)
- Offers: show all active offers directly, add product type filter as select
- Hubs: change filter from pills to select dropdown
- Create CatalogFilterSelect component for dropdown filters
- Update useCatalogOffers to always filter active, use product filter
- Homepage roles section now shows 3 columns on medium screens
- SubNavigation catalog offers label changed to "Предложения"
- Removed back button from catalog/offers page
- ListMapLayout: sticky map with full height
- ListMapLayout: hover on card flies to location on map
- Use ListMapLayout for two-column list+map view
- Orders: show source locations on map
- Addresses: show address locations on map
- Remove preview map links (map is now inline)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add layout: 'topnav' to all 27 pages that were using default layout
- Delete app/layouts/default.vue
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- MainNavigation: center tabs on page (absolute positioning)
- SubNavigation: align left instead of center
- Create CatalogPage universal component for list+map pages
- Migrate catalog pages (offers, suppliers, hubs) to CatalogPage
- Remove PageHeader from clientarea pages (redundant with navigation)
- Add topnav layout to supplier detail page
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Reorder topnav components: search bar before submenu
- GlobalSearchBar: use page navigation instead of dropdowns
- Remove icons from MainNavigation and SubNavigation
- Create ListMapLayout universal component for list+map pages
- Migrate catalog pages (offers, suppliers, hubs) to ListMapLayout