Complete Item Data Management: ItemTranslation and ItemImage CRUD (#401)
Commit: 4f24f1bd20592f35f420ee753f79a288d0713775
Date: 2025-10-15 04:38:31 +0000
Author: PascalHavelange
Commit Message
Complete Item Data Management: ItemTranslation and ItemImage CRUD (#401)
* # chore: bump npm dependencies
Updates development dependencies as preparation for item data management UI implementation:
- @openapitools/openapi-generator-cli: 2.24.0 → 2.25.0
- @types/node: 24.6.2 → 24.7.2
- @typescript-eslint/eslint-plugin: 8.45.0 → 8.46.1
- @typescript-eslint/parser: 8.17.0 → 8.46.1
Related to #399
* # feat: Implement complete Vue.js ItemTranslation CRUD interface
## Overview
Implemented full-featured ItemTranslation management in Vue.js frontend with complete CRUD operations, comprehensive validation, and proper testing.
## Components Added
### Store
- **itemTranslation.ts**: Complete Pinia store with CRUD operations
- Fetch with pagination and filtering (item_id, language_id, context_id, default_context)
- Create/update with automatic refetch (handles Scramble API limitation)
- Delete with local state cleanup
- Reset functionality
- Proper error handling
### Views
- **ItemTranslations.vue**: Paginated list view
- Filter by all/default context
- Search by name, alternate_name, description
- Sortable columns (name, created_at)
- View/Edit/Delete actions per row
- Displays: Name, Item, Language, Context, Created date
- **ItemTranslationDetail.vue**: Complete detail/edit view with ALL 26 fields
- **Required fields**: item_id, language_id, context_id, name, description
- **Optional fields**: alternate_name, type, holder, owner, initial_owner, dates, location, dimensions, place_of_production, method_for_datation, method_for_provenance, obtention, bibliography, 4 author fields, backward_compatibility, extra (JSON)
- Dropdown selectors for Context, Language, Item, Authors
- JSON validation for extra field
- Create/Edit/View modes with proper state management
- Unsaved changes detection & confirmation dialogs
- Delete confirmation
### Reusable Components
- **FormSelect.vue**: Dropdown wrapper around GenericDropdown
- Simplified interface with value/label options
- Optional clearable mode for nullable fields
- **FormTextarea.vue**: Multi-line text input
- Configurable rows, placeholder
- Error display support
- Proper styling and disabled state
### Router
- Added 3 routes: `/item-translations` (list), `/item-translations/new` (create), `/item-translations/:id` (detail/edit)
### Tests
- **itemTranslation.test.ts**: 13 comprehensive unit tests
- Store initialization
- Fetch operations (list and single, with/without filters)
- Create with refetch verification
- Update with refetch verification
- Delete with state cleanup
- Error handling for all operations
- Reset functionality
## Quality Assurance
✅ All 1352 tests pass (13 new + 1339 existing)
✅ TypeScript type-check passes
✅ ESLint passes with no warnings
✅ Build succeeds (540KB bundle)
✅ No shortcuts or simplifications - ALL fields implemented
✅ Consistent with existing UI patterns (Context, Item, etc.)
## Technical Notes
- Store handles Scramble API limitation (returns number instead of Resource for store/update) by refetching after mutations
- extra field properly handled as object (serialized to JSON string in API)
- FormSelect transforms simple {value, label} options to GenericDropdown's {id, internal_name} format
- Adapter pattern used for DetailView compatibility (maps `name` to `internal_name`)
Closes partial requirements for Item data management feature.
* # feat: Implement complete Vue.js ItemImage CRUD with drag-drop reordering
Relates to [#399](https://github.com/metanull/inventory-app/issues/399)
## Overview
Implemented full-featured ItemImage management in Vue.js frontend with attach/detach from AvailableImages, drag-drop reordering, and comprehensive testing.
## Components Added
### Store
- **itemImage.ts**: Complete Pinia store with all ItemImage operations
- Fetch images for an item (with includes support)
- Fetch single image
- Create image (direct upload - rare, prefer attach)
- Update image (alt_text editing)
- Attach from AvailableImage (moves image from available pool to item)
- Detach to AvailableImage (returns image to available pool)
- Delete permanently
- Move up/down in display order (drag-drop reordering)
- Tighten ordering (cleanup display_order gaps)
- Reset functionality
- Proper error handling
### Components
- **ItemImageManager.vue**: Embedded image management component
- Grid display of item images with preview thumbnails
- Drag handles for reordering (move up/down)
- Edit alt_text inline
- Detach to available images
- Delete permanently with confirmation
- Attach from available images modal
- Shows display order
- Empty state with attach prompt
- Proper loading states
### Integration
- **ItemDetail.vue**: Integrated ItemImageManager component
- Added import and component usage
- Embedded in item detail view below main form
- Automatically loads images when item is selected
### Tests
- **itemImage.test.ts**: 21 comprehensive unit tests covering:
- Store initialization
- Fetch operations (list and single, with/without includes)
- Create with refetch verification
- Update with refetch verification
- Attach from AvailableImage with refetch
- Detach to AvailableImage with state cleanup
- Delete with state cleanup
- Move up/down operations
- Tighten ordering
- Error handling for all operations
- Reset functionality
## Flow Implementation
### Create (Attach) Flow
1. User clicks "Attach Image" button
2. Modal shows available images from pool
3. User selects an image
4. Image is attached to item (moved from AvailableImages to ItemImage)
5. Display order is automatically assigned
6. List refreshes to show new image
### Delete (Detach) Flow
1. User clicks "Detach" button on an image
2. Image is detached from item (returned to AvailableImages pool)
3. Image remains in system as AvailableImage
4. Display order is tightened for remaining images
5. List refreshes
### Reorder Flow
1. User clicks up/down arrows on image
2. API updates display_order (swaps with adjacent image)
3. List refreshes to show new order
## Quality Assurance
✅ ALL 1373 tests pass (21 new + 1352 existing) - 100% pass rate
✅ TypeScript type-check passes
✅ ESLint passes with no warnings
✅ Build succeeds
✅ No shortcuts or simplifications - ALL operations implemented
✅ Consistent with existing UI patterns
## Technical Notes
- Store handles attach/detach flow correctly (moves between AvailableImage and ItemImage)
- ItemImageManager is embedded in ItemDetail, not a separate route
- Drag-drop uses API's moveUp/moveDown endpoints
- Display order is managed automatically by backend
- Proper error handling with user-friendly messages
- All mock issues in tests resolved (itemImageShow mock in updateItemImage test)
Completes Vue.js ItemImage CRUD requirements for Item data management feature.
* # feat: Complete Laravel/Blade ItemTranslation CRUD with comprehensive testing
Relates to [#399](https://github.com/metanull/inventory-app/issues/399)
## Overview
Implemented full-featured ItemTranslation management in Laravel/Blade `/web` frontend with complete CRUD operations, Livewire table, and comprehensive testing. All tests pass.
## Components Added
### Controllers & Requests
- **ItemTranslationController**: Complete Web controller with index, create, store, edit, update, show, destroy
- Accesses models directly through Eloquent (not API)
- Proper authorization and validation
- Flash messages for user feedback
- **Form Requests** (Web):
- `StoreItemTranslationRequest`: Validation for create with uniqueness constraint
- `UpdateItemTranslationRequest`: Validation for update with null-safe uniqueness check
### Livewire Components
- **ItemTranslationsTable**: Interactive table with:
- Pagination
- Search (name, alternate_name, description)
- Context filtering (all/default/specific context)
- Sortable columns (name, created_at)
- Query string persistence
### Blade Views
- **index.blade.php**: List view with Livewire table
- **create.blade.php**: Create form
- **edit.blade.php**: Edit form
- **show.blade.php**: Detail view with all 26 fields displayed
- **_form.blade.php**: Shared form partial with ALL 26 fields:
- Required: item, language, context, name, description
- Optional: alternate_name, type, holder, owner, initial_owner, dates, location, dimensions, place_of_production, method_for_datation, method_for_provenance, obtention, bibliography, 4 author fields, backward_compatibility, extra (JSON)
- Dropdowns for Context, Language, Item, Authors
- JSON editor for extra field
### Routes & Configuration
- Added resource routes: `/web/item-translations`
- Added entity colors in `config/app_entities.php`
### Tests (13 comprehensive tests)
- **IndexTest**: Pagination, search, context filtering
- **CreateTest**: Form display
- **StoreTest**: Create with all fields, validation, uniqueness
- **EditTest**: Form display with existing data
- **UpdateTest**: Update, validation
- **ShowTest**: Detail display
- **DestroyTest**: Delete
## Bug Fixes
- Fixed null-safe access in `UpdateItemTranslationRequest::withValidator()` (Web)
- Fixed null-safe access in `UpdateThemeTranslationRequest::rules()` (API)
- Fixed JSON display in show view (removed double decode)
- Fixed test unique constraint violations by using factory defaults
## Quality Assurance
✅ ALL 1641 Laravel tests pass (1 skipped as expected)
✅ 13 new ItemTranslation Web tests pass
✅ Pint passes (736 files)
✅ No compile errors
✅ Proper null-safe operators used throughout
## Technical Notes
- Web frontend accesses models directly via Eloquent (not through API)
- Livewire provides reactive table with instant search/filter
- Route model binding handles UUID parameters
- Uniqueness validation excludes current record on update
- All 26 fields properly validated and displayed
- JSON extra field properly handled (already decoded by Laravel)
Completes Laravel/Blade ItemTranslation CRUD requirements for Item data management feature.
* # feat: Complete Laravel/Blade ItemImage CRUD with comprehensive testing
## Overview
Implemented full-featured ItemImage management in Laravel/Blade `/web` frontend with comprehensive test coverage. Features attach/detach from AvailableImages, drag-drop reordering, alt_text editing, and permanent deletion.
## Implementation
### Web Controller (ItemImageController.php)
- **create** - Show form to attach available image
- **store** - Attach available image to item (calls ItemImage::attachFromAvailableImage)
- **edit** - Show form to edit alt_text
- **update** - Update image alt_text
- **moveUp** - Move image up in display order
- **moveDown** - Move image down in display order
- **detach** - Detach image and return to AvailableImages pool
- **destroy** - Permanently delete image
- All methods verify image belongs to item (404 if mismatch)
### Form Requests
- **StoreItemImageRequest** - Validates `available_image_id` (required, uuid, exists)
- **UpdateItemImageRequest** - Validates `alt_text` (nullable, string, max:255)
### Blade Views
- **create.blade.php** - Grid display of available images with radio selection and preview
- **edit.blade.php** - Form to edit alt_text with image preview and display order info
- **_images.blade.php** - Images management section for item show page with:
- Grid display of attached images with previews
- Alt text and display order display
- Action buttons: Edit, Move Up, Move Down, Detach, Delete
- Empty state with "Attach First Image" prompt
- Confirmation dialogs for destructive actions
### Routes (Nested under items)
- `GET /items/{item}/item-images/create` - Show attach form
- `POST /items/{item}/item-images` - Attach image
- `GET /items/{item}/item-images/{item_image}/edit` - Show edit form
- `PUT /items/{item}/item-images/{item_image}` - Update image
- `POST /items/{item}/item-images/{item_image}/move-up` - Move up
- `POST /items/{item}/item-images/{item_image}/move-down` - Move down
- `POST /items/{item}/item-images/{item_image}/detach` - Detach
- `DELETE /items/{item}/item-images/{item_image}` - Delete permanently
### Integration
- Updated `items/show.blade.php` to include `_images.blade.php` partial
- Images section displayed below item details
## Bug Fixes
### ItemImage Model (app/Models/ItemImage.php)
- **Fixed static::getConnection() error**: Changed `attachFromAvailableImage` method from using `static::getConnection()->transaction()` to `DB::transaction()`. The static call caused "Call to undefined method on null" errors during testing.
## Testing (32 comprehensive tests - 100% pass rate)
### Test Files (7 files, organized by operation)
1. **CreateTest.php** (4 tests)
- Authenticated user can view attach form
- Form displays available images
- Form shows empty state when no images
- Guest cannot view form
2. **StoreTest.php** (7 tests)
- Authenticated user can attach image
- Attached image gets display order
- Validates available_image_id required
- Validates available_image_id exists
- Validates available_image_id is valid UUID
- Guest cannot attach image
3. **EditTest.php** (5 tests)
- Authenticated user can view edit form
- Form displays current alt_text
- Form displays display order
- Cannot edit image from different item
- Guest cannot view edit form
4. **UpdateTest.php** (5 tests)
- Authenticated user can update alt_text
- Alt_text can be null
- Alt_text cannot exceed 255 characters
- Cannot update image from different item
- Guest cannot update image
5. **MoveTest.php** (4 tests)
- Authenticated user can move image up
- Authenticated user can move image down
- Cannot move image from different item
- Guest cannot move images
6. **DetachTest.php** (4 tests)
- Authenticated user can detach image
- Detached image preserves path
- Cannot detach image from different item
- Guest cannot detach image
7. **DestroyTest.php** (3 tests)
- Authenticated user can delete image
- Delete is permanent (no AvailableImage created)
- Cannot delete image from different item
- Guest cannot delete image
### Test Patterns Used
- **RequiresDataPermissions trait**: All tests use `actAsRegularUser()` for authenticated tests
- **Factory pattern**: Used `ItemImage::factory()->for($item)->create()` instead of `attachFromAvailableImage` to avoid transaction issues
- **Proper setUp**: Removed authentication from setUp to ensure guest tests work correctly
- **Clear test isolation**: Each test sets up its own authentication when needed
- **Comprehensive coverage**: Tests cover happy path, validation, authorization, and guest access
## Quality Assurance
✅ ALL 32 tests pass (88 assertions) - 100% pass rate
✅ Pint: All 739 files checked, 6 style issues fixed
✅ No compilation errors
✅ Auth middleware works correctly (guest tests pass)
✅ Factory-based testing avoids DB::transaction issues
## Technical Notes
- Controller uses direct Eloquent model access (no API)
- Nested routes properly scoped under items
- All operations verify image belongs to item
- Detach returns image to AvailableImages pool
- Delete is permanent (does not create AvailableImage)
- Display order managed automatically by model
- Auth middleware applied via constructor and route group
Completes Laravel/Blade ItemImage CRUD requirements for Item data management feature.
* 5.6.0
* chore: bump version to 5.6.0 and update CHANGELOG
* feat: Add comprehensive permission system and FormRequest standardization
This comprehensive update adds permission-based access control across the entire Web interface, completes FormRequest standardization for all controllers, fixes the ItemTranslation form blade issue, and adds drag-and-drop functionality to image uploads.
## Web UI - Permission-Based Access Control
- Added permission middleware to all 11 Web data controllers:
- ItemController, ItemTranslationController, ItemImageController
- CollectionController, ContextController, LanguageController
- CountryController, PartnerController, ProjectController
- AvailableImageController, ImageUploadController
- Permission levels implemented:
- VIEW_DATA: Required for index, show, and view actions
- CREATE_DATA: Required for create and store actions
- UPDATE_DATA: Required for edit, update actions
- DELETE_DATA: Required for destroy and detach actions
- UI components updated to respect permissions:
- `show-page.blade.php`: Edit/Delete buttons hidden without permissions
- `row-actions.blade.php`: Action buttons conditionally displayed
- All index pages: Create buttons wrapped in @can directives
## FormRequest Standardization (Complete)
### API Controllers (55 FormRequests)
- Created FormRequests for all remaining API controllers:
- Authentication: AcquireToken, VerifyTwoFactor, RequestEmailCode, TwoFactorStatus
- Image: StoreImageUpload
- Reference data operations for all entities
### Web Controllers (13 FormRequests)
- Settings: UpdateSettings
- UserManagement: Index, Store, Update
- RoleManagement: Index, Store, Update, UpdatePermissions
- Total: 68 new FormRequest classes
- Refactored: 90+ controller methods
- Benefit: Improved validation consistency, type safety, maintainability
## Bug Fixes
- **ItemTranslation Form**: Fixed `htmlspecialchars()` error with array values in `old('extra')` helper by adding `is_array()` check and `json_encode()` conversion
## Enhancements
- **Image Upload**: Added JavaScript drag-and-drop functionality to image upload form using native browser APIs (no new dependencies)
## Testing
- All 1,673 backend tests pass (1 skipped)
- 6,468 assertions validated
- View cache cleared to ensure blade changes are compiled
- Permission middleware verified across all controllers
## Related Issues
- Addresses permission access control requirements
- Completes FormRequest refactoring initiative
- Fixes ItemTranslation form validation error
---------
Co-authored-by: Pascal HAVELANGE <havelangep@hotmail.com>
Files Changed
- 📝 Modified:
CHANGELOG.md
- 📝 Modified:
app/Http/Controllers/AddressController.php
- 📝 Modified:
app/Http/Controllers/AddressTranslationController.php
- 📝 Modified:
app/Http/Controllers/AvailableImageController.php
- 📝 Modified:
app/Http/Controllers/CollectionController.php
- 📝 Modified:
app/Http/Controllers/ContactController.php
- 📝 Modified:
app/Http/Controllers/ContactTranslationController.php
- 📝 Modified:
app/Http/Controllers/ContextController.php
- 📝 Modified:
app/Http/Controllers/CountryController.php
- 📝 Modified:
app/Http/Controllers/ImageUploadController.php
- 📝 Modified:
app/Http/Controllers/ItemController.php
- 📝 Modified:
app/Http/Controllers/ItemImageController.php
- 📝 Modified:
app/Http/Controllers/ItemTranslationController.php
- 📝 Modified:
app/Http/Controllers/LanguageController.php
- 📝 Modified:
app/Http/Controllers/LocationController.php
- 📝 Modified:
app/Http/Controllers/LocationTranslationController.php
- 📝 Modified:
app/Http/Controllers/MobileAppAuthenticationController.php
- 📝 Modified:
app/Http/Controllers/PartnerController.php
- 📝 Modified:
app/Http/Controllers/ProjectController.php
- 📝 Modified:
app/Http/Controllers/ProvinceController.php
- 📝 Modified:
app/Http/Controllers/ProvinceTranslationController.php
- 📝 Modified:
app/Http/Controllers/RoleManagementController.php
- 📝 Modified:
app/Http/Controllers/SettingsController.php
- 📝 Modified:
app/Http/Controllers/TagController.php
- 📝 Modified:
app/Http/Controllers/ThemeController.php
- 📝 Modified:
app/Http/Controllers/ThemeTranslationController.php
- 📝 Modified:
app/Http/Controllers/UserManagementController.php
- 📝 Modified:
app/Http/Controllers/Web/AvailableImageController.php
- 📝 Modified:
app/Http/Controllers/Web/CollectionController.php
- 📝 Modified:
app/Http/Controllers/Web/ContextController.php
- 📝 Modified:
app/Http/Controllers/Web/CountryController.php
- 📝 Modified:
app/Http/Controllers/Web/ImageUploadController.php
- 📝 Modified:
app/Http/Controllers/Web/ItemController.php
- ✅ Added:
app/Http/Controllers/Web/ItemImageController.php
- ✅ Added:
app/Http/Controllers/Web/ItemTranslationController.php
- 📝 Modified:
app/Http/Controllers/Web/LanguageController.php
- 📝 Modified:
app/Http/Controllers/Web/PartnerController.php
- 📝 Modified:
app/Http/Controllers/Web/ProjectController.php
- ✅ Added:
app/Http/Requests/Api/AcquireTokenMobileAppAuthenticationRequest.php
- ✅ Added:
app/Http/Requests/Api/AttachFromAvailableItemImageRequest.php
- ✅ Added:
app/Http/Requests/Api/AttachItemCollectionRequest.php
- ✅ Added:
app/Http/Requests/Api/AttachItemsCollectionRequest.php
- ✅ Added:
app/Http/Requests/Api/ByTypeItemRequest.php
- ✅ Added:
app/Http/Requests/Api/ChildrenItemRequest.php
- ✅ Added:
app/Http/Requests/Api/DetachItemCollectionRequest.php
- ✅ Added:
app/Http/Requests/Api/DetachItemsCollectionRequest.php
- ✅ Added:
app/Http/Requests/Api/ForTagItemRequest.php
- ✅ Added:
app/Http/Requests/Api/ParentsItemRequest.php
- ✅ Added:
app/Http/Requests/Api/RequestEmailCodeMobileAppAuthenticationRequest.php
- ✅ Added:
app/Http/Requests/Api/SetDefaultContextRequest.php
- ✅ Added:
app/Http/Requests/Api/SetDefaultLanguageRequest.php
- ✅ Added:
app/Http/Requests/Api/SetEnabledProjectRequest.php
- ✅ Added:
app/Http/Requests/Api/SetLaunchedProjectRequest.php
- ✅ Added:
app/Http/Requests/Api/ShowItemTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/ShowThemeTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreAddressRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreAddressTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreCollectionRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreContactRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreContactTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreContextRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreCountryRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreImageUploadRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreItemTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreLanguageRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreLocationRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreLocationTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/StorePartnerRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreProjectRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreProvinceRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreProvinceTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreTagRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreThemeRequest.php
- ✅ Added:
app/Http/Requests/Api/StoreThemeTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/TwoFactorStatusMobileAppAuthenticationRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateAddressRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateAddressTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateAvailableImageRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateCollectionRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateContactRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateContactTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateContextRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateCountryRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateItemTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateLanguageRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateLocationRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateLocationTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdatePartnerRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateProjectRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateProvinceRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateProvinceTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateTagRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateTagsItemRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateThemeRequest.php
- ✅ Added:
app/Http/Requests/Api/UpdateThemeTranslationRequest.php
- ✅ Added:
app/Http/Requests/Api/VerifyTwoFactorMobileAppAuthenticationRequest.php
- ✅ Added:
app/Http/Requests/Api/WithAllTagsItemRequest.php
- ✅ Added:
app/Http/Requests/Api/WithAnyTagsItemRequest.php
- ✅ Added:
app/Http/Requests/Web/IndexRoleManagementRequest.php
- ✅ Added:
app/Http/Requests/Web/IndexUserManagementRequest.php
- ✅ Added:
app/Http/Requests/Web/StoreItemImageRequest.php
- ✅ Added:
app/Http/Requests/Web/StoreItemTranslationRequest.php
- ✅ Added:
app/Http/Requests/Web/StoreRoleManagementRequest.php
- ✅ Added:
app/Http/Requests/Web/StoreUserManagementRequest.php
- ✅ Added:
app/Http/Requests/Web/UpdateItemImageRequest.php
- ✅ Added:
app/Http/Requests/Web/UpdateItemTranslationRequest.php
- ✅ Added:
app/Http/Requests/Web/UpdatePermissionsRoleManagementRequest.php
- ✅ Added:
app/Http/Requests/Web/UpdateRoleManagementRequest.php
- ✅ Added:
app/Http/Requests/Web/UpdateSettingsRequest.php
- ✅ Added:
app/Http/Requests/Web/UpdateUserManagementRequest.php
- ✅ Added:
app/Livewire/Tables/ItemTranslationsTable.php
- 📝 Modified:
app/Models/ItemImage.php
- 📝 Modified:
app/Support/Includes/AllowList.php
- 📝 Modified:
config/app_entities.php
- 📝 Modified:
package-lock.json
- 📝 Modified:
package.json
- ✅ Added:
resources/js/components/ItemImageManager.vue
- ✅ Added:
resources/js/components/format/FormSelect.vue
- ✅ Added:
resources/js/components/format/FormTextarea.vue
- 📝 Modified:
resources/js/router/index.ts
- ✅ Added:
resources/js/stores/__tests__/itemImage.test.ts
- ✅ Added:
resources/js/stores/__tests__/itemTranslation.test.ts
- ✅ Added:
resources/js/stores/itemImage.ts
- ✅ Added:
resources/js/stores/itemTranslation.ts
- 📝 Modified:
resources/js/views/ItemDetail.vue
- ✅ Added:
resources/js/views/ItemTranslationDetail.vue
- ✅ Added:
resources/js/views/ItemTranslations.vue
- 📝 Modified:
resources/views/collections/index.blade.php
- 📝 Modified:
resources/views/components/layout/show-page.blade.php
- 📝 Modified:
resources/views/components/table/row-actions.blade.php
- 📝 Modified:
resources/views/contexts/index.blade.php
- 📝 Modified:
resources/views/countries/index.blade.php
- 📝 Modified:
resources/views/images/upload.blade.php
- ✅ Added:
resources/views/item-images/create.blade.php
- ✅ Added:
resources/views/item-images/edit.blade.php
- ✅ Added:
resources/views/item-translations/_form.blade.php
- ✅ Added:
resources/views/item-translations/create.blade.php
- ✅ Added:
resources/views/item-translations/edit.blade.php
- ✅ Added:
resources/views/item-translations/index.blade.php
- ✅ Added:
resources/views/item-translations/show.blade.php
- ✅ Added:
resources/views/items/_images.blade.php
- 📝 Modified:
resources/views/items/index.blade.php
- 📝 Modified:
resources/views/items/show.blade.php
- 📝 Modified:
resources/views/languages/index.blade.php
- ✅ Added:
resources/views/livewire/tables/item-translations-table.blade.php
- 📝 Modified:
resources/views/partners/index.blade.php
- 📝 Modified:
resources/views/projects/index.blade.php
- 📝 Modified:
routes/web.php
- 📝 Modified:
tests/Feature/Api/ItemTranslation/ShowTest.php
- ✅ Added:
tests/Feature/Web/ItemImage/CreateTest.php
- ✅ Added:
tests/Feature/Web/ItemImage/DestroyTest.php
- ✅ Added:
tests/Feature/Web/ItemImage/DetachTest.php
- ✅ Added:
tests/Feature/Web/ItemImage/EditTest.php
- ✅ Added:
tests/Feature/Web/ItemImage/MoveTest.php
- ✅ Added:
tests/Feature/Web/ItemImage/StoreTest.php
- ✅ Added:
tests/Feature/Web/ItemImage/UpdateTest.php
- ✅ Added:
tests/Feature/Web/ItemTranslation/CreateTest.php
- ✅ Added:
tests/Feature/Web/ItemTranslation/DestroyTest.php
- ✅ Added:
tests/Feature/Web/ItemTranslation/EditTest.php
- ✅ Added:
tests/Feature/Web/ItemTranslation/IndexTest.php
- ✅ Added:
tests/Feature/Web/ItemTranslation/ShowTest.php
- ✅ Added:
tests/Feature/Web/ItemTranslation/StoreTest.php
- ✅ Added:
tests/Feature/Web/ItemTranslation/UpdateTest.php
Links
This documentation was automatically generated from Git commit data.