This commit updates the documentation for customizing steps, specifically focusing on the new "Require Interaction" feature.
- Adds "Require Interaction" as a new step property.
- Expands on the concept of "Interaction requirements" for bundle steps.
- Renames the "Interactive Elements" section to "Requiring User Interaction" for clarity.
- Provides a detailed explanation of how the interaction requirement works, including enabling the setting and the need for interactive elements.
- Includes an updated example step content snippet that demonstrates multiple interactive buttons and clear instructions for the user.
- Describes the visual feedback mechanisms for the disabled "Next" button.
- Adds best practices for using interaction requirements wisely.
- Updates the troubleshooting section to include a common issue related to the "Next button won't enable."
✅ Replaced manual API documentation with Flask-RESTX OpenAPI generation
✅ All endpoints now auto-generate Swagger UI at /api/docs/
✅ Maintained backward compatibility - all existing API functionality preserved
✅ Added comprehensive OpenAPI models for request/response validation
Changes:
- app/blueprints/api/api_routes.py: Migrated from Flask routes to Flask-RESTX Resource classes
- app/blueprints/api/models.py: Created OpenAPI schema definitions
- app/extensions.py: Added Flask-RESTX configuration with API key security
- pyproject.toml: Added flask-restx>=1.3.0 dependency
- README.md: Updated API documentation to point to interactive Swagger UI
- docs/API.md: Simplified to quick-start guide pointing to automatic docs
- Added routes for resetting and viewing passkeys for admin accounts.
- Integrated passkey checks during login to enforce 2FA when applicable.
- Updated login template to handle passkey authentication and display relevant messages.
- Created a recovery tool for password resets and passkey management in case of lockouts.
- Enhanced admin management UI to include passkey options.
- Documented recovery tool usage and scenarios for admin access recovery.
- Require a specific python version.
Reason: uv will check the python version in pyproject.toml and automatically download a version that fits the requirement.
- Create a virtual environment (especially with `venv`)
Reason: `uv run` and `uv sync` will both always create a virtual environment (unless specified otherwise) before installing dependencies.
- Enter the virtual environment.
Reasom: `uv run` and `uv sync` will both automatically invoke the previously created venv when running their commands.
- Install dependencies with `uv sync --locked`
Reason: `uv sync` will automatically sync to the locked state. Envoking `uv run flask run` will do the same.
So in short: You can save a ton of steps by simply running `uv run flask run`. That's the beauty of uv!