Skip to content

CRUD Features

Public Summary

Chains, Markets, and Products share a common CRUD UI pattern: paginated list with search, add/edit form with validation, image association, and delete confirmation.

Internal Details

Shared Pattern

Each CRUD feature follows the same structure:

feature/
  ├── {Entity}List.jsx           # Paginated table with search
  ├── {Entity}SearchBar.jsx      # Debounced search input
  ├── AddOrEdit{Entity}Form.jsx  # Create/edit form
  └── use{Entity}Queries.js      # React Query hooks

React Query Conventions

Each use{Entity}Queries.js file exports:

HookQuery KeyPurpose
useEntities()[entity, page, search]Paginated list
useEntity(id)[entity, id]Single entity detail
useCreateEntity()mutationCreate with cache invalidation
useUpdateEntity()mutationUpdate with cache invalidation
useDeleteEntity()mutationDelete with cache invalidation

Mutations invalidate related query keys (e.g., deleting a chain invalidates markets and products).

Chains

  • Associates an image from the shared image library.
  • Cascade-deletes markets and market products on removal.
  • CSV report export endpoint.

Markets

  • Chain dropdown selector (populated from chains API).
  • Longitude/latitude coordinate inputs for geolocation.
  • Products listed inline via shared modal.

Products

  • Rich text editor for descriptions.
  • Multi-market pricing (price range display).
  • Category filtering.
  • Image upload with preview.

Dependencies

DependencyUsage
useDebounceDebounced search across all lists
useAxiosPrivateAuthenticated API calls
Images featureImage gallery selector
Material-UITables, forms, dialogs, pagination

Source Anchors

PathRelevance
apps/client/src/features/chains/Chain list, search, form, query hooks
apps/client/src/features/markets/Market list, search, form, query hooks
apps/client/src/features/products/Product list, search, form, query hooks

Student Obrok engineering documentation.