Heartbeat telemetry (домен, имя бота, версии PHP/модуля/OpenCart) больше не
отправляется скрытно. Добавлен отдельный флаг pulse.heartbeat_enabled
(по умолчанию выключен, opt-in), независимый от pulse.api_key:
- ранний return в handleHeartbeat() при выключенном флаге (не трогает кэш/getMe);
- провайдер читает флаг и инжектит в сервис;
- в админке — переключатель с честным раскрытием состава данных;
- debug-лог факта отправки в pushHeartbeat().
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Introduce docs/features/ with an index (conventions + feature registry),
a per-feature template, and a filled cart example. Reference the structure
from the root CLAUDE.md so context can be restored per feature on demand.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Migrate project guidance from .cursor/ to a single CLAUDE.md covering
architecture, backend/frontend conventions, commands and PHP 7.4 constraint.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(spa): prevent more-link button from wrapping in block header
Long block titles squeezed the "Смотреть всё" link in BaseBlock,
causing its text to wrap onto two lines. Allow the title column to
shrink and keep the link in a single line.
* fix(spa): enable typography styles for product description
Add @tailwindcss/typography plugin so the `prose` classes used in the
product description actually apply: paragraph spacing, headings, hr,
links and tables. Also make wide tables inside `.prose` horizontally
scrollable instead of overflowing the viewport.
* fix(spa): open description links via Telegram WebApp API
Links inside the v-html product description used to navigate the
Mini App's WebView away from the app on Telegram mobile. Intercept
clicks on anchors in the description and route them through
Telegram.WebApp.openTelegramLink for t.me/tg:// targets and
Telegram.WebApp.openLink for everything else, falling back to
window.open when running outside Telegram.
* fix(spa): refine categories list layout
Tighten category item typography (text-base, leading-snug) and slightly
enlarge the icon for a better balance with long titles. Drop the
duplicate "Назад к ..." link and replace the parent-category CTA with
a daisyUI soft block button "Показать все товары категории" so the
primary action is visually distinct from the list.
Render the products carousel block gracefully when category_id is
missing or when the selected category has no products, instead of
throwing Vue Router's "Missing required param 'category_id'" error.
- Add telecart.ocmod.xml: inject TeleCart menu item (with Settings child) after Marketing
- Add scripts/apply_ocmod.sh to symlink ocmod file in Docker container
- Add make ocmod target
- In CI: set version in telecart.ocmod.xml from version_meta; use docs.telecart.pro link
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: normalize cart json utf8 and add tests
Ensure cart and checkout responses are cleaned to valid UTF-8 before JSON encoding and cover Utf8Cleaner with unit tests.
Made-with: Cursor
* fix: normalize order response to valid UTF-8 before JSON encoding
- Add Utf8Cleaner::clean() for successful order creation response (data)
- Add Utf8Cleaner::clean() for validation error response (ErrorBag)
- Prevents Malformed UTF-8 characters error when creating order with
non-UTF-8 data from OpenCart/DB (same approach as cart endpoints)
Made-with: Cursor
- Add haptic_enabled field to AppDTO with default value true
- Update SettingsSerializerService to deserialize haptic_enabled
- Add haptic_enabled setting in admin panel (GeneralView) with toggle
- Update admin settings store to include haptic_enabled default value
- Update SPA SettingsStore to load haptic_enabled from API
- Refactor useHapticFeedback composable to return safe wrapper object
- Replace all direct window.Telegram.WebApp.HapticFeedback usage with composable
- Update useHapticScroll to use useHapticFeedback composable
- Add getHapticFeedback helper function in CheckoutStore for store usage
- Add haptic_enabled default value to app.php configuration
- All haptic feedback methods now check settings internally
- Remove redundant if checks from components (handled in composable)
- Increase icon sizes from 1.2em to 1.5em for home, search, and cart icons
- Increase catalog icon from size-6 to size-7
- Increase profile avatar and icon from w-6 h-6 to w-7 h-7
- Add dock-icon class to all icons for consistent styling
- Implement bounce animation on icon click with scale effect (1.15x)
- Animation duration set to 200ms for subtle feedback
- Update onDockItemClick handler to trigger animation on click
- Create Account.vue page component with user profile display
- Add account route to router.js
- Update Navbar.vue to remove avatar button (moved to Dock)
- Add avatar icon to Dock.vue for account page navigation
- Implement 'Contact us' action that opens manager chat via Telegram
- Implement 'Add to home screen' feature using Telegram Web App API 8.0+
- Add home screen status checking with checkHomeScreenStatus API
- Display customer registration date and days with us counter
- Add Russian language declension for days word (день/дня/дней)
- Update TelegramCustomerHandler to return created_at in saveOrUpdate response
- Add getByTelegramUserId method to TelecartCustomerService
- Store customer_created_at in Pulse store during app initialization
- Update App.vue to show Dock on account page
- Remove unused getCurrentCustomer API endpoint and function
- Add text_manager_button field to TextsDTO with getter method
- Update SettingsSerializerService to validate and deserialize new field
- Add text_manager_button field to admin settings store
- Add input field in admin TextsView for configuring button text
- Update SPA SettingsStore with default value including emoji
- Replace hardcoded button text in Product.vue with configurable text
- Remove SVG icon from manager button to allow emoji usage
- Add default value with emoji to app.php configuration
- Button text now customizable via admin panel Texts tab
- Add BETA badge to TeleCart Pulse tab in navigation
- Implement pulsing heartbeat animation for pulse icon
- Add dynamic color change for icon (light red when inactive, bright red when active)
- Add dynamic color change for BETA label (light orange when inactive, bright orange when active)
- Add informational block about TeleCart Pulse in TeleCartPulseView component
- Update App.vue with pulse icon animation and styling
- Update TeleCartPulseView.vue with info block and styling
- Change sortField from datetime to datetime_raw for proper chronological sorting
- Add sortField attribute to 'Date and time' column to show sort indicator
- Remove sorting from 'Level' and 'Channel' columns
- Add information about displaying last 100 events
- Add icons to all navigation tabs in admin panel
- Rename 'Telegram Покупатели' tab to 'Покупатели'
- Move logs view from navigation tab to Drawer component
- Add logs button in TopLead component next to cache reset button
- Group logs and cache reset buttons in ButtonGroup
- Remove logs route from router