Commit Graph

280 Commits

Author SHA1 Message Date
c85a7b78a6 Build [v1.14.14] 2026-04-23 15:08:46 +03:00
6f9716c32b fix(09): resolve export data quality and integrate UI 2026-04-23 15:08:46 +03:00
96f4a5d228 Build [v1.14.13] 2026-04-23 14:51:52 +03:00
9afe335384 Build [v1.14.12] 2026-04-23 14:45:07 +03:00
568bccb37e Build [v1.14.11] 2026-04-23 14:04:08 +03:00
6f34fdc782 Build [v1.14.10] 2026-04-23 13:58:33 +03:00
5978917494 Build [v1.14.9] 2026-04-23 12:58:31 +03:00
6be7318205 Build [v1.14.8] 2026-04-23 12:58:15 +03:00
88e5d66f36 chore(07): integrate LDAP config into YAML and remove JSON files 2026-04-23 12:58:15 +03:00
7d492764d2 Build [v1.13.1] 2026-04-23 12:56:30 +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
dc6970700b fix(export): use axiosInstance to ensure correct backend URL and auth
- Changed useExport.ts to import and use axiosInstance from api.ts
- This ensures requests go to port 8918 (backend) not 8919 (frontend)
- Removed manual token handling (axiosInstance interceptor handles it)
- Removed /api prefix from paths (axiosInstance baseURL has the full URL)
- Exported axiosInstance from api.ts for reuse in other modules
- Fixes 404 errors caused by requests routing to frontend instead of backend
2026-04-23 11:04:11 +03:00
1ed2cb6c07 fix(export): update frontend to call new /admin/db/export endpoint
- Changed exportSnapshot to call GET /api/admin/db/export?type=inventory
- Changed exportAuditTrail to call GET /api/admin/db/export?type=audit
- Fixed token key: auth_token → inventory_token
- Changed HTTP method from POST to GET
- Fixes 404 errors when exporting from admin page
2026-04-23 10:59:59 +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
725a6cad85 fix(6): revert Item.id to optional to fix delete function
Made id required (breaking change) - reverted back to optional
This allows items without id to exist during lifecycle
Fixes 'Failed to delete item' error

The delete function was broken by forcing id to be required
2026-04-22 19:38:45 +03:00
b1a63e98ab fix(6): fix TypeScript type consistency issues
- Make Item.id required (items from DB always have id)
- Use shared Item type from db.ts in QuantityAdjustmentModal
- Show full npm build output instead of silencing errors
- Ensures all modals use consistent type definitions
2026-04-22 18:50:06 +03:00
3be455de72 fix(6): use shared Item type from db.ts in SearchModal
- Remove duplicate Item interface from SearchModal
- Import Item from @/lib/db to ensure type consistency
- Fixes TypeScript error with missing category/min_quantity fields
2026-04-22 18:47:21 +03:00
37b6d295ff fix(6): add missing Toast component and fix backend startup
- Create Toast component for success/error messages
- Fix uvicorn invocation: use backend.main:app from project root
- Ensures relative imports work correctly in backend modules
2026-04-22 18:46:32 +03:00
fc149184e9 feat(6): phase 6 plan 02 - operational runbook and documentation
- Created OPERATIONAL_RUNBOOK.md: comprehensive step-by-step procedures for both Docker and Standalone deployment modes covering deployment, daily ops, troubleshooting, backup/restore, disaster recovery, scaling, and updates
- Created HEALTH_MONITORING_CHECKLIST.md: daily/weekly/monthly health check procedures with alert thresholds and quick troubleshooting reference
- Created DISASTER_RECOVERY_PLAN.md: detailed procedures for 6 failure scenarios (database corruption, hardware failure, data center failure, app crash, disk full, network isolation) with RTO/RPO targets
- Created CONFIGURATION_REFERENCE.md: complete documentation of all inventory.env parameters for both deployment modes with common scenarios and troubleshooting
- Created EMERGENCY_PROCEDURES.md: quick-reference incident response playbook with 7 critical scenarios, decision tree, escalation path, and printable cheat sheet
- Created scripts/backup.sh: automated backup script supporting both Docker and Standalone with integrity verification and retention management
- Created scripts/restore.sh: restore script with triple confirmation, safety backups, and validation tests for both deployment modes
- Created config/backup-cron.sh: installer for daily/weekly automated backup cron jobs (2 AM daily, 3 AM Sunday)

All documentation covers dual-deployment modes with shared configuration files.
Documentation is operator-ready with copy-paste commands and clear expected outputs.
2026-04-22 18:25:32 +03:00
4ead83cfad fix(5): validate part_number is non-empty before transformation 2026-04-22 18:04:54 +03:00
0c0c519274 fix(5): add authorization headers to search API calls 2026-04-22 18:04:47 +03:00
7bb92d3bd9 fix(5): add authorization headers to export API calls 2026-04-22 18:04:36 +03:00
96befa3571 test(5-plan-02-t6): add comprehensive frontend tests for search functionality and hooks 2026-04-22 17:44:13 +03:00
b28eb49fe7 feat(5-plan-02-t3,t4): create useItemSearch hook and integrate search button into inventory page 2026-04-22 17:44:11 +03:00
0138f04f6e feat(5-plan-02-t2,t5): create SearchModal and QuantityAdjustmentModal components for inventory search 2026-04-22 17:44:03 +03:00
fd13f63c28 test(5-03-07): add comprehensive export tests for CSV/Excel generation and endpoint authorization 2026-04-22 17:43:23 +03:00
a9a64b8d0c feat(5-03-05): integrate ExportPanel into admin dashboard 2026-04-22 17:43:18 +03:00
767a7657b1 feat(5-03-04): create useExport hook for managing export API calls and file downloads 2026-04-22 17:43:16 +03:00
274e6f58e5 feat(5-03-03): create admin ExportPanel UI component with CSV and Excel buttons for both reports 2026-04-22 17:43:12 +03:00
a7746a14ea test(5.1): add integration and unit tests for quick quantity adjustment
- Vitest hook tests for useQuantityAdjustment (optimistic updates, debouncing)
- Pytest backend tests for PATCH /items/{itemId} endpoint
- Tests cover success, failure, validation, and audit logging scenarios
2026-04-22 17:42:08 +03:00
9fd20fff7c feat(5.1): implement quantity display component and adjustment hook
- Create QuantityDisplay component with tap-to-edit UI + +/- buttons
- Implement useQuantityAdjustment hook with optimistic updates, debouncing
- Add PATCH /items/{itemId} backend endpoint with audit logging
- Components support inline quantity adjustment without modal friction
2026-04-22 17:42:04 +03:00
2647f0428c feat(4.1-05-07): create frontend components for spare-parts search integration - useItemSearch hook, LoadingModal, ErrorModal with tests 2026-04-22 16:46:50 +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
285c3f17d4 fix: CRITICAL - remove double rotation (frontend + backend)
Root cause: Image was being rotated TWICE:
1. Frontend rotated it in the modal and sent processed blob
2. Backend rotated it AGAIN based on rotation_degrees

This double rotation made the image appear unrotated or distorted.

Solution: Remove frontend image processing entirely.
- Modal now sends ONLY the rotation value
- No imageBlob from modal (uses original)
- Backend receives original image + rotation value
- Backend applies rotation ONCE

Now image is rotated correctly by backend without duplication.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 14:23:20 +03:00
743f377357 fix: CRITICAL - prevent image clipping when rotating
When rotating images, the rotated corners extend beyond the original canvas
bounds, causing the image to be clipped and appear skewed.

Fixed by:
1. Calculate canvas size needed to fit rotated image
2. Use formula: newSize = sqrt((w*cos)^2 + (h*sin)^2)
3. Center image and rotate around center of new canvas
4. Update cropBounds to new canvas dimensions

Now when user rotates an image, the full rotated result is saved without
any clipping or skewing. The saved image dimensions will be larger than
the original to accommodate the rotation.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 14:19:20 +03:00
533d6ddf1b fix: disable cropping, keep rotation only
Cropping UI was a placeholder and never fully implemented. Users couldn't
actually select a crop region - it always used full image bounds.

Simplified modal to focus on what works:
- Rotation adjustment  (fully working)
- Zoom/pan for preview  (fully working)
- Removed aspect ratio controls (crop not functional)
- Changed header to "Rotate Image"

Image processing now:
1. Takes user's rotation adjustment
2. Applies rotation to full image
3. No cropping (uses full bounds)
4. Saves rotated image

This ensures saved image matches the rotation user selected in modal.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 14:11:02 +03:00
e032d3a308 fix: CRITICAL - call onComplete synchronously with adjusted values
Root cause found: setState is async, so hookConfirmSingleItem was called
before extractedItems updated, causing it to use OLD image_processing values.

Fixed by:
1. Building the final newItem directly in handleImageAdjustmentConfirm
2. Using the UPDATED image_processing values (with user adjustments)
3. Calling onComplete synchronously with correct values
4. Not relying on async setState ordering

This ensures backend receives the user-adjusted crop_bounds and rotation_degrees,
not the original AI-detected values.

Backend logs will now show user adjustments, not original AI values.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 13:56:48 +03:00
8d47732de4 debug: add comprehensive logging for image adjustment flow
Added detailed console logging across entire image adjustment pipeline:

1. ImageAdjustmentModal.handleConfirm():
   - Original image dimensions
   - User inputs (rotation, zoom, pan, crop)
   - Canvas processing steps
   - Final blob size

2. AIOnboarding.handleImageAdjustmentConfirm():
   - Adjustments received from modal
   - Item being updated
   - extractedImageBlob status before/after

3. useAIExtraction.confirmSingleItem():
   - newItem being built
   - extractedImageBlob attached
   - imageProcessing attached

This will help identify where values are lost or incorrect in the flow.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 13:53:05 +03:00
8ed8265a7a fix: use processed image blob from modal for backend submission
Critical fix: modal processes image and returns blob, but AIOnboarding
was not actually using that blob. Now properly calls setExtractedImageBlob()
so confirmSingleItem sends the processed image to backend.

Before: Backend received original image, applied original AI crop/rotation
After: Backend receives processed image (already cropped/rotated by user)

Now the saved image matches exactly what user sees after adjusting.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 13:46:11 +03:00
7f6d121d4a fix: modal actually processes image with rotation/crop and fixes zoom
Critical fixes:
1. Modal now applies rotation and crop to image, returns processed blob
2. Frontend sends processed image to backend (not original)
3. Zoom slider min/max now calculated based on image size
4. Initial zoom shows entire image in canvas
5. Zoom constraints prevent over-zooming or under-zooming

User experience improved:
- Sees full item at start (auto-fit zoom)
- Can adjust rotation/crop smoothly
- Adjusted image is what gets saved (not original)
- Zoom slider works correctly for any image size

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 13:05:19 +03:00
97629decb1 fix: canvas displays full image by default with auto-fit zoom
Fixes issue where image was too small to see full item in modal canvas.

Changes:
- Calculate initial zoom to fit entire image in 800x600 canvas
- Don't zoom in (only zoom out to fit), preserving image clarity
- Reset button also resets to fit zoom instead of always 1.0

This ensures users can see the full item from the start and understand
what they're adjusting.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 12:57:19 +03:00
e6a64bb407 fix: properly apply image adjustment overrides to AI-detected values
Fixed two critical issues:
1. Adjustments now properly override image_processing values
2. State updates explicitly ensure extractedItems are modified before confirm

Changes:
- handleImageAdjustmentConfirm now updates extractedItems state
- Adjustments properly stored in image_processing (rotation_degrees, crop_bounds)
- user_adjusted flag added to mark user-modified values
- Backend will use adjusted values instead of AI detection

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-22 12:55:30 +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
da8b2ed07b build: update service worker 2026-04-22 12:40:57 +03:00
6a69adbc28 feat: create ImageAdjustmentModal for post-save image adjustment
- Shows original image after item save
- Rotation slider + gesture rotation
- Zoom control (scroll/pinch)
- Pan support (drag on desktop/mobile)
- Preset aspect ratios for crop
- Touch support for mobile (pinch zoom, drag pan)
- Checkbox to confirm/reject image use (default ON)
- Compresses image if adjusted before saving
2026-04-22 12:38:51 +03:00
37b3ae7ae8 feat: add crop box edge labels (T/B/L/R) for orientation
- Shows which edge is Top, Bottom, Left, Right on crop rectangle
- Removes ambiguity about crop box orientation
- Green labels on all four edges for clear visual reference
2026-04-22 12:13:18 +03:00
dba47aa656 feat: make crop box interactive in debug panel
- Add drag-to-move functionality for entire crop box
- Add resize handles at corners (drag to resize)
- Show adjusted bounds separately from AI bounds in log
- Add Reset button to revert to original crop bounds
- Allows visual verification of AI crop detection accuracy
2026-04-22 11:47:13 +03:00
11f0634721 fix: add rotation direction indicators and fix CORS for dev origins
- Add TOP/BTM labels to rotated box showing which edge is which after rotation
- Allows user to visually see rotation direction without calculating degrees
- Fix allowedDevOrigins to include common private IP ranges (192.168.*, 10.*, 172.16.*)
- Resolves CORS warning when accessing from local network IPs
2026-04-22 11:38:32 +03:00
1fca9b5ff7 feat: add orientation indicators to debug panel
- Display UP/DOWN/LEFT/RIGHT labels at canvas edges
- Shows which direction is which in the original image
- Helps verify rotation correctness visually
2026-04-22 11:33:37 +03:00
7c493c656a fix: remove dark overlay from debug panel crop visualization
- Removed black overlay that was hiding the image
- Draw crop box directly on full-brightness image with drop shadow
- Item under crop area now fully visible
- Improved visibility of both crop bounds (green) and rotation (orange)
2026-04-22 11:27:16 +03:00