Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
0df0e45
initializing react
Sep 23, 2025
4b2d779
moving vue to ./vue-app/ while refactor in progress
Sep 23, 2025
e66335a
reusable assets copied over + index.html updated with content from or…
Sep 23, 2025
c2ccb6b
initial dir struct for components
Sep 23, 2025
0eda760
scss block styling, about, home, nav, footer
Sep 23, 2025
72ed53f
enforcing scss across the react app
Sep 23, 2025
1bfe1d6
enforcing scss across react app
Sep 23, 2025
823f277
first pass at browse section and common components
Oct 29, 2025
ea0cd61
entity table and other components
Oct 29, 2025
aa91983
scss imports and chartview/searchresults
Oct 29, 2025
008b124
displaying charts correctly
Oct 29, 2025
b9d9862
chartview and searchresults in correct dir
Oct 29, 2025
d3c074c
charts displaying nicely
Oct 29, 2025
2a57d04
readme note for redis req
Oct 29, 2025
cc0d63a
first pass at reaction card
Oct 29, 2025
db56f79
populating reaction card data
Oct 29, 2025
bb998b0
reaction view
Oct 29, 2025
791ae9b
side nav on reaction view highlights correctly
Oct 29, 2025
e944cb1
floating modal positioned correctly
Oct 29, 2025
71d146d
search components converted to react
Oct 29, 2025
0ce01e3
ketcher modal works
Oct 29, 2025
195ece6
search working in react
Oct 29, 2025
c6e8743
download section implemented
Nov 17, 2025
085bcaa
fixed infinite loading screen on initial search page load if no crite…
Feb 2, 2026
5d52e9d
fixed reaction url path and persistent reload of reaction images
Feb 2, 2026
5b17308
fixed duplication of reactant/products components in search page
Feb 2, 2026
80ffd37
correct favicon
Feb 3, 2026
98d81f2
Merge main into react, resolve conflicts
skearnes May 22, 2026
0fc63ff
Remove vue-app/ now that the React SPA replaces it
skearnes May 22, 2026
5edead1
Attribute prior merge-conflict commits to Claude
skearnes May 22, 2026
a21a874
Drop Vue-era dead code; fix vite proxy and gitignore
skearnes May 22, 2026
eff61f4
Extract task-polling into a react-query hook
skearnes May 22, 2026
28d8769
Type the React migration and run prettier across the tree
skearnes May 22, 2026
0c43151
Add Apache 2.0 license headers missed by the React migration
skearnes May 22, 2026
ac0acd6
Wire /selected-set route to MainSelectedSet
skearnes May 22, 2026
9246a01
Port the section-view stubs from the Vue app
skearnes May 22, 2026
9553df2
Address review findings and unblock CI Docker build
skearnes May 22, 2026
ac96a5a
Address greptile review comments
skearnes May 22, 2026
c751477
Fix useSearchTask 120s-timeout race under StrictMode
skearnes May 22, 2026
a76f4ea
Set MainDatasetView isOverflow from real reaction count
skearnes May 22, 2026
6e61655
Drop redundant SearchResults state, freeze ModalKetcher poll on mount
skearnes May 22, 2026
464340d
Serve Ketcher from public/ so it survives the production build
skearnes May 22, 2026
fccb8c7
Host Ketcher from its own index.html in the iframe
skearnes May 22, 2026
4619259
Don't render 4xx/5xx reaction_summary bodies as HTML
skearnes May 22, 2026
bfa9dc1
Add single-dataset endpoint and surface metadata fetch errors
skearnes May 22, 2026
0e51525
Use YIELD enum reference and hide zero-default precision in setpoints
skearnes May 22, 2026
30c65aa
Type dataset_id on SearchResult, dedup in-flight submit_query
skearnes May 22, 2026
d568ef3
Guard compound_svg fetches and fix Reaction Options auto-open
skearnes May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2026 Open Reaction Database Project Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Keep local dev artifacts out of the image; the Dockerfile installs deps
# itself and a macOS-built node_modules contains the wrong platform's
# rollup binary (see Dockerfile comment about npm cli#4828).
**/node_modules/
**/dist/
**/.venv/
**/__pycache__/
**/.pytest_cache/
**/.ruff_cache/
**/.DS_Store
**/dump.rdb
.git/
.idea/
.vscode/
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ __pycache__/
.venv/

# Redis dumps.
dump.rdb
**/dump.rdb
# vim swap files
*.sw[a-z]
# build output
Expand Down
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
20.19.4
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Web interface and FastAPI server for the [Open Reaction Database](https://open-r

## Project layout

- **`app/`** — Vue single-page application (frontend), built with Vite
- `src/components/` — reusable Vue components
- **`app/`** — React single-page application (frontend), built with Vite
- `src/components/` — reusable React components
- `src/views/` — routed pages (browse, search, dataset/reaction views)
- `src/router/`, `src/styles/`, `src/utils/`, `src/assets/`
- **`ord_interface/`** — Python backend
Expand All @@ -14,7 +14,7 @@ Web interface and FastAPI server for the [Open Reaction Database](https://open-r
- `visualization/` — Jinja filters and helpers for rendering reactions and molecules
- `editor/` — legacy reaction-submission UI (being removed)

The Vue frontend talks to the FastAPI server, so both processes need to be running for the UI to work. On Windows, use WSL.
The React frontend talks to the FastAPI server, so both processes need to be running for the UI to work. On Windows, use WSL.

## Local development

Expand Down Expand Up @@ -57,6 +57,7 @@ docker compose up

#### Option B: Local (in-process testing database)

In your local conda environment
```shell
# Redis (the API uses it for search-task state); leaves it daemonized.
redis-server --daemonize yes
Expand All @@ -73,9 +74,9 @@ ORD_INTERFACE_TESTING=TRUE uv run uvicorn ord_interface.api.main:app --port 5000
> proxy target in `app/vite.config.js`. Uvicorn binds `127.0.0.1` only, so
> `http://127.0.0.1:5000/...` will reach uvicorn regardless.

### 3. Run the Vue SPA
### 3. Run the React SPA

Download [Ketcher v2.5.1](https://github.com/epam/ketcher/releases/download/v2.5.1/ketcher-standalone-2.5.1.zip), extract it, and place the `standalone/` directory's contents inside `./app/src/ketcher/` (so that `app/src/ketcher/static/` and `app/src/ketcher/templates/` exist). Then:
Download [Ketcher v2.5.1](https://github.com/epam/ketcher/releases/download/v2.5.1/ketcher-standalone-2.5.1.zip), extract it, and place the `standalone/` directory's contents inside `./app/public/ketcher/` (so that `app/public/ketcher/static/` and `app/public/ketcher/asset-manifest.json` exist). Then:

```shell
cd app
Expand All @@ -99,4 +100,4 @@ Production deployment is managed via Pulumi/ECS in the [`ord-infrastructure`](ht

### Major changes (new message types, etc.)

The Vue app needs to be updated to surface new fields. Please discuss any such proposals with the ORD team before opening a PR.
The React app needs to be updated to surface new fields. Please discuss any such proposals with the ORD team before opening a PR.
4 changes: 0 additions & 4 deletions app/.browserslistrc

This file was deleted.

23 changes: 12 additions & 11 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
.DS_Store
node_modules
/dist


# local env files
.env.local
.env.*.local

# Log files
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.vscode
.DS_Store
*.suo
*.ntvs*
*.njsproj
Expand Down
1 change: 0 additions & 1 deletion app/.prettierignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
dist/
node_modules/
public/
src/ketcher/
package-lock.json
80 changes: 62 additions & 18 deletions app/README.md
Original file line number Diff line number Diff line change
@@ -1,29 +1,73 @@
# app
# React + TypeScript + Vite

## Project setup
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

```
npm install
```
Currently, two official plugins are available:

### Compiles and hot-reloads for development
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh

```
npm run serve
```
## React Compiler

### Compiles and minifies for production
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).

```
npm run build
```
## Expanding the ESLint configuration

### Lints and fixes files
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```
npm run lint
```js
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...

// Remove tseslint.configs.recommended and replace with this
tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
tseslint.configs.stylisticTypeChecked,

// Other configs...
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
]);
```

### Customize configuration
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

See [Configuration Reference](https://cli.vuejs.org/config/).
```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x';
import reactDom from 'eslint-plugin-react-dom';

export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...
// Enable lint rules for React
reactX.configs['recommended-typescript'],
// Enable lint rules for React DOM
reactDom.configs.recommended,
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
]);
```
31 changes: 16 additions & 15 deletions app/eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,31 +15,32 @@
*/

import js from '@eslint/js';
import vue from 'eslint-plugin-vue';
import globals from 'globals';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
import tseslint from 'typescript-eslint';
import { defineConfig, globalIgnores } from 'eslint/config';

export default [
{
ignores: ['dist/', 'node_modules/', 'src/ketcher/'],
},
js.configs.recommended,
...vue.configs['flat/essential'],
export default defineConfig([
globalIgnores(['dist/', 'node_modules/', 'public/ketcher/']),
{
files: ['**/*.{ts,tsx}'],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs['recommended-latest'],
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2022,
sourceType: 'module',
globals: {
...globals.browser,
...globals.node,
},
ecmaVersion: 2020,
globals: globals.browser,
},
rules: {
// GitHub Actions sets CI=true; ESLint itself never sets NODE_ENV, so the
// CI variable is the reliable way to make these noisy in CI and quiet
// during local iteration.
'no-console': process.env.CI ? 'warn' : 'off',
'no-debugger': process.env.CI ? 'warn' : 'off',
'no-unused-vars': 'warn',
},
},
];
]);
13 changes: 6 additions & 7 deletions app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,20 @@
limitations under the License.
-->

<html lang="">
<html lang="en">
<head>
<meta charset="utf-8" />
<meta charset="UTF-8" />
<meta
http-equiv="X-UA-Compatible"
content="IE=edge"
/>
<meta
name="viewport"
content="width=device-width,initial-scale=1.0"
content="width=device-width, initial-scale=1.0"
/>
<!-- <link rel="icon" href="<%= BASE_URL %>favicon.ico"> -->
<link
rel="icon"
href="https://avatars2.githubusercontent.com/u/60754754?s=200&v=4"
href="/favicon.ico"
/>
<title>Open Reaction Database</title>
<meta
Expand Down Expand Up @@ -86,10 +85,10 @@
to continue.</strong
>
</noscript>
<div id="app"></div>
<div id="root"></div>
<script
type="module"
src="/src/main.js"
src="/src/main.tsx"
></script>
</body>
</html>
12 changes: 0 additions & 12 deletions app/jsconfig.json

This file was deleted.

Loading
Loading