v0.9.0
Storage & Security
- Private S3 media storage — full support for private S3-compatible storage for media files; all uploaded photos and attachments are stored with server-side encryption for secure, access-controlled delivery
Sales & Payments
- Record payment from sale — new "Record Payment" button in the sale view lets staff process full or partial payments, with running totals of paid and remaining amounts; supports split payments across multiple payment methods
- Gift cards (Certificates) — staff can create gift cards with a specified amount and optional expiration date; each card gets a unique shareable code and can be redeemed as a payment method during checkout, with balance tracking
- Sale status badges — sales grid now shows colored status badges (Draft, Partially Paid, Paid, Refunded) for quick visual reference
- Sold By — each sale now tracks which staff member made the sale
- Payment history in sale modal — sale detail view shows a timeline of all payments made against that sale
- Editable service price in sale — clicking the total for a service in the sale modal lets you set a custom price with inline editing
- Improved sale modal UX — removed unnecessary Quantity column, hide edit/delete actions in view mode, soft-delete with strikethrough and Restore button instead of instant removal
- Fixed: deleting items from a sale now works reliably on every click
- Fixed: removing a service from a sale and saving now correctly persists the change
- Fixed: sale ID copy button no longer accidentally opens the sale modal
Calendar & Events
- Note indicator on calendar events — events with notes now show a small pencil icon on the calendar grid across month, week, and day views
- Improved manual date/time picker — date and time are now separate fields with Today/Tomorrow quick-select buttons; start and end times shown side by side
- Default duration in booking config — widget configuration now includes a default duration field that stays editable regardless of booking mode
- Fixed: event booking no longer fails when available time slots cannot be retrieved — fixed the root cause of inability to generate slots
- Fixed: customer visit history now updates immediately when an event is deleted or its status changes
Customer & Media
- Auto-assign media to customers — photos uploaded to an event are automatically linked to all associated customers; customer profile now shows a thumbnail gallery with fullscreen viewing
- Clickable social media icons — social media fields now have branded clickable icons that open the corresponding profile in a new tab
- Inactive staff visual distinction — inactive staff references now appear faded with a red "inactive" label across the app
- Fixed: birthday datepicker in customer modal no longer gets clipped by the modal boundary
Configuration & Settings
- Shift times in configuration — shift time definitions (morning, full day, afternoon, evening) are now managed through Settings instead of being hardcoded
- Multilingual toggle — new setting to enable/disable multilingual support; when off, the language selector and languages column are hidden throughout the app
- Config grouping from API — configuration sections now use server-provided group definitions, fixing items appearing under wrong tabs
- Conditional config visibility — settings that depend on other toggles now show/hide automatically
- Fixed: payment method type (cash/card) dropdown now saves correctly instead of always reverting to the first option
- Fixed: newly created payment methods now appear immediately without requiring a page refresh
- Fixed: language preference no longer resets to English after returning to the app
Staff & Salary
- Shift-based salary rule — new compensation type that awards a bonus after every N completed shifts
- Service category assignment in modal — category detail modal now shows assigned services with toggle controls for adding/removing services
Bug Fixes
- Fixed sales grid crashing when an event type reference was missing
- Fixed private API endpoints being called before user authentication on the login page
- Fixed unauthenticated bookmark/locale fetch causing 401 errors on login
- Fixed asymmetric text clipping in the service category performance widget
- Fixed demo data creating sales for cancelled events
- Fixed missing Russian translations for inventory milestones menu, important notes block, and service booking module
- Fixed confirmation modal buttons missing background in dark mode
Other
- Security improvements (credential handling, session management)
- Refactored slot picker components
- Modal content-list navigation pattern implemented
- UI polish: cursor-tracking glow effect on modal circle buttons, improved config label/description layout