Files
shelfmark/src
splitsec2 a1ac017487 feat(requests): let an admin reopen a rejected request (#1491)
Closes #1445, where you said you were open to it.

A rejected request was final. `update_request` won't move a terminal
status and the admin routes only fulfil or reject, so an admin who
changed their mind had to ask the user to request the book again, and
the user kept seeing the old rejected one.

`POST /api/admin/requests/<id>/reopen` moves a rejected request back to
pending and clears the review fields. What the user asked for (request
level, release, note) is kept. It refuses anything that isn't rejected,
and refuses when that user already has a pending request for the same
book.

Admins get a Reopen action on rejected cards in the activity sidebar and
in History. A rejected request has usually been cleared from the list by
the time anyone wants it back, so reopening also clears the dismissal,
the way the failed-download reopen does. Without that the pending
request stays hidden.

Tests cover the service (state change, what is kept, the refusals, a
non-string admin note) and the route, and the card model for the new
action. Ruff, tsc, oxlint, vitest and the backend suite pass. It has
been running on my instance since Oct 8.
2026-10-20 23:20:26 -04:00
..
2026-04-15 18:50:13 +01:00

Source Code Documentation

This directory contains the frontend application for Calibre-Web Automated Book Downloader.

Structure

src/
└── frontend/          # React + TypeScript frontend application
    ├── public/        # Static assets (logo, favicon)
    ├── src/           # Source code
    │   ├── components/    # React components
    │   ├── App.tsx       # Main application component
    │   └── styles.css    # Global styles
    ├── package.json   # Dependencies and scripts
    ├── vite.config.ts # Vite configuration
    └── tsconfig.json  # TypeScript configuration

Frontend Development

Prerequisites

  • Node.js (v16 or higher)
  • npm or yarn

Quick Start

From the project root:

# Install dependencies
make install

# Start development server (http://localhost:5173)
make dev

# Build for production
make build

# Preview production build
make preview

# Run type checking
make frontend-typecheck

Alternatively, from src/frontend:

npm install
npm run dev
npm run build

Technology Stack

  • Framework: React 18 with TypeScript
  • Build Tool: Vite 5
  • Styling: TailwindCSS 3
  • Communication: WebSocket for real-time updates

Key Features

  • Search Interface: Real-time book search with filtering
  • Download Queue: Live status updates via WebSocket
  • Details Modal: Rich book information display
  • Responsive Design: Mobile-first approach

Development Tips

Hot Module Replacement (HMR)

The development server supports HMR for instant feedback during development.

API Integration

The frontend communicates with the Flask backend via:

  • REST API endpoints (/api/*)
  • WebSocket connection (ws://localhost:8084/ws)

Building for Production

The production build is optimized and minified:

make build

Output is generated in src/frontend/dist/

Type Safety

Run TypeScript checks without building:

make frontend-typecheck

Debugging

Development Server Issues

  • Ensure port 5173 is available
  • Check that the backend is running on port 8084
  • Verify WebSocket connection in browser console

Build Issues

  • Clear node_modules and reinstall: make clean && make install
  • Check Node.js version compatibility
  • Verify TypeScript configuration