Commit Graph

215 Commits

Author SHA1 Message Date
Ruslan Bakiev
19aca61845 fix(catalog): prevent unnecessary list reloads on map movement
All checks were successful
Build Docker Image / build (push) Successful in 4m14s
- 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.
2026-01-26 22:24:47 +07:00
Ruslan Bakiev
6545eeabea feat(catalog): persist bounds filter state in URL
All checks were successful
Build Docker Image / build (push) Successful in 4m14s
- 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.
2026-01-26 21:40:44 +07:00
Ruslan Bakiev
f9eb027ebd chore: regenerate geo GraphQL types with bounds params
Some checks failed
Build Docker Image / build (push) Has been cancelled
2026-01-26 21:38:44 +07:00
Ruslan Bakiev
b02e3882cc feat(catalog): add bounds filtering to list queries
Some checks failed
Build Docker Image / build (push) Has been cancelled
- 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
2026-01-26 21:37:23 +07:00
Ruslan Bakiev
c56bb57fbf fix(CatalogMap): use proper icons with colors for related points
- 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)
2026-01-26 21:34:07 +07:00
Ruslan Bakiev
c6abf8ad4a fix(catalog): hide filter checkbox in info mode + color related points by type
All checks were successful
Build Docker Image / build (push) Successful in 3m48s
2026-01-26 21:21:19 +07:00
Ruslan Bakiev
33c1559ab7 fix(catalog): hide clusters when InfoPanel is open, show only related points
All checks were successful
Build Docker Image / build (push) Successful in 3m51s
2026-01-26 20:47:05 +07:00
Ruslan Bakiev
e905098cb5 refactor(catalog): replace InfoPanel tabs with vertical sections
All checks were successful
Build Docker Image / build (push) Successful in 3m57s
- 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
2026-01-26 19:34:04 +07:00
Ruslan Bakiev
69bb978526 fix(catalog): add badge when selecting from list + fix checkbox position
All checks were successful
Build Docker Image / build (push) Successful in 3m51s
- 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
2026-01-26 18:15:26 +07:00
Ruslan Bakiev
263e60e003 feat: simplify hero to single tagline
All checks were successful
Build Docker Image / build (push) Successful in 3m36s
2026-01-26 18:06:07 +07:00
Ruslan Bakiev
eb2266d66f feat: hero effect with dynamic navbar height and inline title
All checks were successful
Build Docker Image / build (push) Successful in 3m41s
2026-01-26 17:56:24 +07:00
Ruslan Bakiev
3f56a2f117 feat(catalog): add loading states for InfoPanel tabs and filter map by active tab
All checks were successful
Build Docker Image / build (push) Successful in 3m35s
- 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
2026-01-26 17:49:59 +07:00
Ruslan Bakiev
f680740f52 Center MainNav vertically on home hero, add fading title
All checks were successful
Build Docker Image / build (push) Successful in 3m47s
2026-01-26 17:24:08 +07:00
Ruslan Bakiev
53a51ed80c Simplify: use same MainNavigation everywhere, just taller container on home
All checks were successful
Build Docker Image / build (push) Successful in 3m56s
2026-01-26 17:14:40 +07:00
Ruslan Bakiev
d4b4f7011f Fix hero scroll - use fixed padding so content stays in place
All checks were successful
Build Docker Image / build (push) Successful in 3m58s
2026-01-26 16:59:19 +07:00
Ruslan Bakiev
11a52003e7 Make hero scroll linear - direct 1:1 scroll to height/opacity
All checks were successful
Build Docker Image / build (push) Successful in 3m55s
2026-01-26 16:29:20 +07:00
Ruslan Bakiev
80a587c74f Fix langDir path - remove duplicate i18n prefix
All checks were successful
Build Docker Image / build (push) Successful in 3m54s
2026-01-26 16:15:36 +07:00
Ruslan Bakiev
cecbed99b5 Add hero section to home page with scroll collapse
Some checks failed
Build Docker Image / build (push) Failing after 50s
- Full-screen dark gradient hero on home page
- Search input centered vertically
- Smooth collapse to fixed header on scroll
- Added hero translations (ru/en)
2026-01-26 16:12:00 +07:00
Ruslan Bakiev
f973784257 Add URL params for InfoPanel tab and product (infoTab, infoProduct)
All checks were successful
Build Docker Image / build (push) Successful in 3m39s
2026-01-26 15:55:25 +07:00
Ruslan Bakiev
8354102895 Restyle InfoPanel to match SelectionPanel (dark glass styling)
Some checks failed
Build Docker Image / build (push) Has been cancelled
2026-01-26 15:52:16 +07:00
Ruslan Bakiev
a569942e24 Show mode toggle on home page without active state
Some checks failed
Build Docker Image / build (push) Has been cancelled
2026-01-26 15:48:55 +07:00
Ruslan Bakiev
2275f956ae Fix: hide mode toggle on home page, store mapViewMode in URL
All checks were successful
Build Docker Image / build (push) Successful in 3m56s
2026-01-26 15:44:44 +07:00
Ruslan Bakiev
6b359b177c Fix: trigger reactivity when setting filter labels
All checks were successful
Build Docker Image / build (push) Successful in 3m44s
2026-01-26 15:35:05 +07:00
Ruslan Bakiev
1c298951b1 Fix: entity type detection in selectProduct, handle offer in add-to-filter
All checks were successful
Build Docker Image / build (push) Successful in 3m47s
2026-01-26 15:29:17 +07:00
Ruslan Bakiev
c76750a738 Fix: InfoPanel not showing - use showPanel prop
All checks were successful
Build Docker Image / build (push) Successful in 3m48s
2026-01-26 15:13:06 +07:00
Ruslan Bakiev
2d83110ef1 Move filterByBounds to map, show only when panel is open
All checks were successful
Build Docker Image / build (push) Successful in 3m46s
2026-01-26 15:00:30 +07:00
Ruslan Bakiev
5ca995ebcc Move filterByBounds checkbox into SelectionPanel
Some checks failed
Build Docker Image / build (push) Has been cancelled
2026-01-26 14:56:40 +07:00
Ruslan Bakiev
3211c5a881 Rename drawer to panel, use selectMode for visibility
All checks were successful
Build Docker Image / build (push) Successful in 3m44s
2026-01-26 14:52:19 +07:00
Ruslan Bakiev
911de423f6 Fix SelectionPanel - click applies immediately, opens Info
Some checks failed
Build Docker Image / build (push) Has been cancelled
2026-01-26 14:49:55 +07:00
Ruslan Bakiev
a48dcf24ee Remove explore mode chips from MainNavigation
All checks were successful
Build Docker Image / build (push) Successful in 3m37s
2026-01-26 14:46:05 +07:00
Ruslan Bakiev
0efc4eddfd Simplify catalog UI - remove chips, add drawer for list
All checks were successful
Build Docker Image / build (push) Successful in 3m59s
- 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
2026-01-26 14:36:42 +07:00
Ruslan Bakiev
65b07271d9 Simplify GEO API - use new list endpoints and routes in nearestOffers
All checks were successful
Build Docker Image / build (push) Successful in 4m11s
- 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
2026-01-26 14:08:21 +07:00
Ruslan Bakiev
6d916d65a0 Show routes in hub info panel offers
All checks were successful
Build Docker Image / build (push) Successful in 3m47s
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.
2026-01-26 08:36:14 +07:00
Ruslan Bakiev
2b6cccdead Fix all TypeScript errors and remove Storybook
All checks were successful
Build Docker Image / build (push) Successful in 5m8s
- Remove all Storybook files and configuration
- Add type declarations for @vueuse/core, @formkit/core, vue3-apexcharts
- Fix TypeScript configuration (typeRoots, include paths)
- Fix Sentry config - move settings to plugin
- Fix nullable prop assignments with ?? operator
- Fix type narrowing issues with explicit type assertions
- Fix Card component linkable computed properties
- Update codegen with operationResultSuffix
- Fix GraphQL operation type definitions
2026-01-26 00:32:36 +07:00
Ruslan Bakiev
b326d8cd76 Fix supplierUuid -> uuid parameter in GetSupplierProfile call
All checks were successful
Build Docker Image / build (push) Successful in 3m32s
2026-01-25 22:38:59 +07:00
Ruslan Bakiev
ed7dec304f Update geo GraphQL types after backend fixes
All checks were successful
Build Docker Image / build (push) Successful in 3m25s
2026-01-25 22:20:47 +07:00
Ruslan Bakiev
cc52aa6179 Fix supplier info and catalog filtering bugs
All checks were successful
Build Docker Image / build (push) Successful in 3m22s
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>
2026-01-25 21:01:23 +07:00
Ruslan Bakiev
50375f2a74 Refactor catalog to use coordinate-based GraphQL endpoints
All checks were successful
Build Docker Image / build (push) Successful in 3m33s
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>
2026-01-25 17:39:33 +07:00
Ruslan Bakiev
7403d4f063 Add coordinate-based GraphQL operations for geo API
All checks were successful
Build Docker Image / build (push) Successful in 3m31s
- 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.
2026-01-25 17:28:40 +07:00
Ruslan Bakiev
39c3d24b3a Fix Info panel - translations, two-step offers flow, icon, add to filter
All checks were successful
Build Docker Image / build (push) Successful in 3m36s
- 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
2026-01-25 16:44:00 +07:00
Ruslan Bakiev
908d63062c Merge branch 'info-panel'
All checks were successful
Build Docker Image / build (push) Successful in 4m22s
2026-01-25 15:38:31 +07:00
Ruslan Bakiev
2ce3bd0bd2 Add Info panel for catalog with tabbed interface
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>
2026-01-25 14:17:47 +07:00
Ruslan Bakiev
9b99d8981c Optimize catalog loading: backend bounds filtering + early returns
All checks were successful
Build Docker Image / build (push) Successful in 4m12s
- Add bounds (west/south/east/north) parameters to GetNodes query
- Add setBoundsFilter to useCatalogHubs, useCatalogSuppliers, useCatalogProducts
- Replace client-side bounds filtering with backend query
- Add early return to setProductFilter to avoid redundant fetches
- Watch filterByBounds to trigger backend refetch when checkbox changes
2026-01-24 12:19:00 +07:00
Ruslan Bakiev
8c753edb28 Add cascading filters for Explore mode
All checks were successful
Build Docker Image / build (push) Successful in 3m34s
When a product is selected, hubs and suppliers are filtered
to show only those that are relevant to that product.
2026-01-24 11:58:56 +07:00
Ruslan Bakiev
726c63efb7 Add GraphQL documents for cascading filters 2026-01-24 11:54:37 +07:00
Ruslan Bakiev
4d018323e7 Fix catalog issues: quantity input, checkbox position, glass header
All checks were successful
Build Docker Image / build (push) Successful in 3m21s
1. Quantity input in Quote mode: replaced button with inline number input
2. Checkbox position: moved to left side (next to panel) instead of right
3. MapPanel glass header: fixed sticky positioning by moving negative margins to children
2026-01-24 11:40:33 +07:00
Ruslan Bakiev
690c76ac79 Fix product selection from map offer click
All checks were successful
Build Docker Image / build (push) Successful in 3m22s
- Use GetOffer to fetch productUuid (not in cluster data)
- Handle both uuid and id properties from clusters
- Skip cluster items (id starts with 'cluster-')
2026-01-24 11:31:05 +07:00
Ruslan Bakiev
467f099130 Add unified MapPanel component for left map panels
All checks were successful
Build Docker Image / build (push) Successful in 3m25s
- Create MapPanel with white glass header, dark content
- Refactor SelectionPanel to use MapPanel
- Refactor QuotePanel to use MapPanel
- Single source of truth for panel styling
2026-01-24 11:20:32 +07:00
Ruslan Bakiev
7c566aeafc Fix SelectionPanel styling + add product filtering by supplier/hub
All checks were successful
Build Docker Image / build (push) Successful in 4m3s
- SelectionPanel header: dark glass style instead of white
- useCatalogProducts: filter by supplierId or hubId using dedicated queries
- catalog/index: connect filters from query params to composable
2026-01-24 11:13:22 +07:00
Ruslan Bakiev
2fc4dfb834 Add Airbnb-style "search as I move" checkbox + hover highlight
All checks were successful
Build Docker Image / build (push) Successful in 3m33s
- Move filter checkbox to right side, same line as view toggle
- Add hover events on selection cards to highlight map points
- Update translations: "Искать при перемещении" / "Search as I move the map"
2026-01-24 11:07:31 +07:00