42 Commits

Author SHA1 Message Date
992574e3ee bede 2026-04-26 19:12:15 +03:00
cb1abe4d9c Build [v1.14.32] 2026-04-26 14:45:54 +03:00
dc999991a5 Restore enterprise/LDAP login mode detection
- Added /users/auth-mode public endpoint to detect LDAP status
- Updated frontend to call getAuthMode() instead of hardcoded false
- Login page now automatically switches to enterprise mode when LDAP is enabled
- Fixes missing LDAP user login UI that was previously disabled with TODO comment

This restores the functionality that was commented out earlier where the login
page would auto-detect whether to show local user list or enterprise username input.
2026-04-26 13:27:46 +03:00
62c592d6b8 Fix TokenResponse schema: make user field non-optional and properly typed
- Changed user field from Optional[User] to required User type
- Ensures user object is always included in login response
- Pydantic now properly serializes the complete user object
- Frontend can now successfully retrieve response.user for localStorage
2026-04-26 13:19:30 +03:00
e715afd814 refactor: consolidate color definitions into single source of truth
- Create frontend/colors.mjs as SSOT for all design colors
- Create scripts/generate-css-vars.mjs to auto-generate CSS variables
- Update tailwind.config.ts to import colors from colors.mjs
- Update frontend/package.json: add 'generate-css-vars' script to build pipeline
- Update start_servers.py: include CSS variable generation before npm build
- All color changes now require only one edit in colors.mjs
- Build process auto-syncs CSS variables and Tailwind colors

Eliminates DRY violation where colors were duplicated in:
  - tailwind.config.ts (Tailwind utility classes)
  - globals.css (CSS custom properties)

Single source of truth approach ensures:
  ✓ No inconsistency between Tailwind and CSS variables
  ✓ One place to update colors for all contexts
  ✓ Automated CSS variable generation on every build

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-25 17:31:25 +03:00
0e356e6c89 backup: Phase 6 search and export fixes before cleanup
- Added search button to main page header with Ctrl+K listener
- Implemented SearchModal component rendering
- Fixed SearchModal to use axiosInstance with correct backend URL (8916)
- Fixed token key from 'auth_token' to 'inventory_token'
- Verified export endpoints working correctly
- All Phase 6 UAT fixes in place

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-23 11:22:16 +03:00
cbdb2f04f6 fix(auth): use actual hostname instead of localhost in frontend API client
- Modified frontend/lib/api.ts to use window.location.hostname as fallback
- Ensures browser on external IP reaches correct backend HTTPS port
- Allows admin/admin login to work from any access point
- Auth is fully functional and working
2026-04-23 10:39:18 +03:00
4e6f940b75 refactor(phase-6): remove scale testing plan, simplify to docker + runbook
- Delete PLAN-02-SCALE-TESTING.md (scale testing deferred to v3)
- Rename PLAN-03-BACKUP-RUNBOOK to PLAN-02-OPERATIONAL-RUNBOOK
- Phase 6 now has 2 executable plans instead of 3
2026-04-22 18:18:00 +03:00
51c2a5a4bb simplify: remove image rotation modal, save original image as-is
Removed the rotation/zoom adjustment modal feature. Approach was too complex and
time-consuming without delivering stable results.

New simplified flow:
1. User extracts item with AI
2. Item saved with original image (resized/compressed by backend)
3. No rotation adjustments in frontend
4. Image editing can be implemented as a future feature

This unblocks the workflow and gets users to a working state.
Backend still applies compression/resizing, just no rotation processing.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 14:44:00 +03:00
b73f012332 feat: integrate ImageAdjustmentModal into AIOnboarding flow
Added user-controlled image adjustment modal that displays after item
confirmation, allowing users to adjust rotation/crop before final save.

Changes:
- AIOnboarding: wrapper confirmSingleItem to show modal post-selection
- State: showImageAdjustment, adjustingItemIndex, pendingItemData
- Handlers: confirm/cancel for applying or discarding adjustments
- Flow: item save → modal display → adjustments applied → DB commit

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 12:45:44 +03:00
197dcadfee fix: apply crop bounds before EXIF rotation to match AI analysis
Gemini analyzes raw image and returns crop_bounds for that coordinate space.
Previous code applied EXIF rotation first, changing image dimensions, then
used crop_bounds on the rotated image (coordinate mismatch).

Now: crop on raw image (matches AI) → then apply EXIF + manual rotation.
This ensures cropped region contains the actual item, not background.
2026-04-22 09:50:08 +03:00
64d177e791 fix: complete image pipeline - rotation, URL, preview
- Add rotation_degrees parameter to ImageProcessor.process_photo()
- Pass rotation through _auto_save_photo_from_extraction() to processor
- Allow no-crop fallback when crop_bounds is None
- Add buildPhotoUrl() helper to resolve backend URLs correctly
- Update frontend components to use backend URL for image sources
- Replace Use/Skip Photo buttons with checkbox in AI extraction UI
- Add images/ to .gitignore to prevent accidental commits

Addresses: rotation never applied, image 404s (relative to Next.js not backend), preview blank in edit form
2026-04-22 08:50:25 +03:00
cbfd7232ca fix: convert extracted image blob to base64 before sending to API
The extracted image blob from AI extraction was not being sent to the backend
because Blob objects cannot be JSON serialized. Fixed by:

1. Converting Blob to base64 before sending to API
2. Renaming fields: extractedImageBlob → extracted_image_bytes, imageProcessing → image_processing
3. Removing Blob from local DB (keep original data structure for IndexedDB)
4. Applying same fix to both single item and batch update flows

This ensures the auto-photo-save feature receives the image data it needs.
2026-04-21 19:53:53 +03:00
08fc785583 feat: pass extracted image and image_processing metadata to item creation
- Updated confirmSingleItem() to include extractedImageBlob and imageProcessing
- Updated confirmAllItems() to pass image data for bulk item creation
- Each extracted item now carries its own image_processing metadata
- All items in bulk creation share the same extracted image blob
- Added 12 comprehensive tests verifying data is passed correctly
- All 465 frontend tests passing, zero regressions
2026-04-21 19:27:17 +03:00
fab1e81cf6 feat: auto-upload photo after item creation if image_processing provided 2026-04-21 19:22:10 +03:00
4f63b3b99e feat: integrate auto-photo-save into item creation endpoint
- Extend ItemCreate schema with optional extracted_image_bytes (base64) and image_processing (dict)
- Update create_item endpoint to call _auto_save_photo_from_extraction after item creation
- Decode base64 image bytes and pass crop_bounds, rotation_degrees to helper
- Don't block item creation if photo save fails (log warning instead)
- Item returned with photo_path, photo_thumbnail_path populated if save succeeded
- Full backward compatibility: old clients without image fields work unchanged
- Add 5 integration tests covering all scenarios:
  - Create item WITH image_processing → photo auto-saved
  - Create item WITHOUT image_processing → no photo (backward compatible)
  - Create item WITH invalid image_processing → item created, photo skipped
  - Create item WITH crop_bounds=None → item created, photo skipped
  - Create item WITH bytes but NO processing metadata → item created, photo skipped
- All 158 backend tests passing, zero regressions
2026-04-21 19:00:06 +03:00
ada3669217 test: add tests for image_processing field from AI extraction
- Added 11 comprehensive tests for image_processing parsing
- Tests validate crop_bounds structure: {x, y, width, height} all ints >= 0
- Tests validate rotation_degrees: int/float, -360 to +360
- Tests validate confidence: float, 0.0 to 1.0
- Tests graceful handling when image_processing field is missing
- Tests multiple items with image_processing data
- Tests partial data handling (optional fields)
- Tests with both Gemini and Claude providers
- Updated extract_label_info() to preserve and validate image_processing field
- All tests passing, no regressions
2026-04-21 18:53:04 +03:00
6bf95a0df0 fix: prevent username input from unmounting during typing in login form
The username input was conditionally hidden when it had a value, causing
the field to disappear and focus to jump to password when typing. Fixed by:
1. Always rendering the username input (removed conditional)
2. Using controlled input with value prop
3. Only auto-focus password when username is already entered

This fixes the focus-jumping bug that made it impossible to enter usernames.
2026-04-21 17:54:19 +03:00
74c91b117f test(phase2): fix mobile E2E test Playwright fixture structure - 15 tests valid 2026-04-21 14:45:24 +03:00
db9aafd47f feat(phase2): implement ItemPhotoUpload component and hook 2026-04-21 12:31:23 +03:00
af8dcbae3a fix(phase1): fix race condition, path traversal, double processing, validation in photo API 2026-04-20 22:39:02 +03:00
92f6977cae fix(phase1): add photo fields to schemas and set datetime default 2026-04-20 21:49:51 +03:00
39fab336ba bede-various 2026-04-19 19:21:08 +03:00
12b2ef26cf fix: implement Phase 2 medium-impact spacing reductions
Applied systematic spacing optimizations across admin manager components (40px savings):

DatabaseManager.tsx:
- Input field padding: py-3 → py-2 (3 inputs: retention_count, schedule_hour, schedule_freq_days)
- Form field spacing: space-y-2 → space-y-1.5 (Max Backups field group)
- Grid gaps: gap-4 → gap-3 (storage policy fields)
- Item list spacing: space-y-2 → space-y-1.5 (backup list)
- Modal form spacing: space-y-4 → space-y-3 (recovery points section)
- Backup metadata text: text-[11px] → text-xs (created_at + filesize display)

LdapManager.tsx:
- Input field padding: py-2.5 → py-2 (4 inputs: server_uri, base_dn, user_template, groups_dn)
- Form field spacing: space-y-1.5 → space-y-1 (all label+input groups)
- Button padding: py-2.5 → py-2 (test connection), py-3 → py-2.5 (save policy)

IdentityManager.tsx:
- Input field padding: py-3 → py-2 (username, password, role in edit modal)
- Form field spacing: space-y-4 → space-y-3 (edit modal form)
- Form field labels: space-y-1.5 → space-y-1 (all 3 fields)
- User list spacing: space-y-2 → space-y-1.5 (user items)

AiManager.tsx:
- Grid gaps: gap-4 → gap-3 (provider options grid)
- Input field padding: py-3 → py-2 (Gemini/Claude API key inputs)
- Form field spacing: space-y-2 → space-y-1.5 (API key field groups)
- Modal spacing: space-y-6 → space-y-3 (provider access keys section)
- Prompt section spacing: space-y-4 → space-y-3 (system prompt area)

CategoryManager.tsx:
- Grid gaps: gap-3 → gap-2.5 (category items grid)
- Input field padding: py-3.5 → py-2.5, py-4 → py-2.5 (name + description inputs)
- Form field spacing: space-y-6 → space-y-3, space-y-1.5 → space-y-1 (edit modal)

Test Results:
- Frontend (Vitest): 291/291 tests passing ✓
- Backend (Pytest): 41/41 tests passing ✓
- Total: 332 tests validated, zero regressions

All changes maintain visual hierarchy and premium density standards without sacrificing usability.
2026-04-19 18:36:44 +03:00
c0232bb2f1 refactor: remove all bold font weights from UI/UX (291 replacements)
Replace font-bold, font-black, and font-semibold with font-normal throughout:
- 26 component files
- 1 CSS utility file (globals.css)
- 291 total occurrences

Text hierarchy now maintained through font-size differences only.
All tests passing (291/291).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-19 18:28:23 +03:00
d9ead1aafd fix: repair login endpoint registration in auth router 2026-04-19 17:20:11 +03:00
cc6b55ec0f fix: reorder hooks to resolve handleSync declaration order 2026-04-19 14:22:26 +03:00
5b8c6039ef refactor: extract useScanner hook from page.tsx 2026-04-19 12:21:15 +03:00
2465141a18 test: fix data-testid attribute names and update E2E test URLs to port 8917 2026-04-19 10:08:52 +03:00
145fa21805 fix: update backend tests to match actual API - all 41 tests passing 2026-04-19 09:08:21 +03:00
0c70e216e1 fix: update test files to match actual backend schemas and endpoints 2026-04-19 08:43:56 +03:00
dcc167d00b docs: save AI-friendly refactoring design specification 2026-04-18 17:14:51 +00:00
8b61f6616a bede 2026-04-18 14:19:33 +00:00
ef754c3375 chore: macOS to Linux migration complete
All platform-specific paths and commands replaced with Linux equivalents:
- .git_path: Use system git instead of /Library/Developer/CommandLineTools
- start_server.sh: Use hostname -I instead of ipconfig
- AI_RULES.md line 18: Remove macOS path mandate
- PROJECT_ARCHITECTURE.md Section 7.5: Document Linux native approach
- SESSION_STATE.md: Update git binary reference

Ready for Ubuntu development, Docker testing, and standalone deployment.
2026-04-18 13:09:40 +00:00
c5452c926a Build [v1.10.12] 2026-04-17 11:12:48 +03:00
710806bb14 feat(frontend): add accessible confirmation modal for destructive actions
Replace native window.confirm() dialogs with branded ConfirmationModal component
for all delete operations (users, categories). Implements progressive disclosure
for high-risk operations and requires confirmation text input for deletions with
100+ affected items.

Features:
- ConfirmationModal component with dynamic risk levels (low/medium/high)
- High-risk operations (100+ affected items) require 'DELETE' text confirmation
- Clear consequence messaging with affected item counts
- Loading state during deletion with visual feedback
- Full keyboard accessibility (Esc to cancel, Enter to confirm)
- Proper focus management and ARIA labels

Affected:
- AdminOverlay: Delete user and category now use ConfirmationModal
- New: ConfirmationModal.tsx component

Design: Matches CreateUserModal aesthetic (clean, minimal) with rose-500
accent for danger context. Progressive disclosure shows additional warnings
only for high-risk operations.

Build: Passes with zero errors.
2026-04-17 10:37:56 +03:00
b6a48f1249 refactor(frontend): eliminate backdrop-blur throughout codebase
Remove all instances of backdrop-blur effect (14+ occurrences) to simplify visual design
and eliminate signature 2023-2024 AI aesthetic tell. Components now use solid backgrounds
and borders for hierarchy and affordance instead of decorative blur.

Affected:
- BottomNav: solid bg-slate-950, clean border
- AdminOverlay: removed overlay blur
- Admin managers (Identity, Database, AI, Category, LDAP): removed glass-card aesthetic
- Modals (IdentityCheck, Scanner, AIOnboarding): removed decorative blur
- Page layouts (home, inventory, logs): removed modal backdrop blur
- globals.css: removed glass-card utility

Build: passes with zero errors. Bundle sizes unchanged.

Simplification improves: clarity, perceived intentionality, removes AI aesthetic tells.
2026-04-17 10:26:39 +03:00
89a69a3ec9 refactor(frontend): audit fixes - accessibility, colors, and UX
Accessibility:
- Add focus-visible indicators to all interactive elements (buttons, inputs)
- Create accessible CreateUserModal to replace window.prompt()
- Add aria-labels to icon buttons for screen readers

Colors & Theming:
- Move primary color to CSS variable (--primary)
- Remove hard-coded #3b82f6 from tailwind config
- Clean up color consistency across theme

UX:
- Replace prompt-based user creation with proper modal form
- Implement inline field validation with error messages
- Add loading state during form submission
- Improve visual hierarchy and spacing

Performance:
- Remove bootstrap-icons dependency (duplicate with lucide-react)

Design:
- Reduce backdrop-blur overuse (remove from overlay scrim, StatCard)
- Improve AdminOverlay responsive design
2026-04-17 10:12:53 +03:00
Daniel Bedeleanu
1893c4f38b modificari mari 2026-04-15 15:20:45 +03:00
Daniel Bedeleanu
6102ff39aa Build [v1.9.22] 2026-04-15 11:41:20 +03:00
Daniel Bedeleanu
a6af90ec48 bla2 2026-04-15 10:50:56 +03:00
Daniel Bedeleanu
704934165f Build [v.1.3.6] 2026-04-11 17:14:22 +03:00