feat: UI/UX improvements and unified schema selector#55
Conversation
- Make entire project card clickable (header + body), with stopPropagation on action buttons - Redesign Model Configuration modal: Hierarchy on top, Source/Destination below, full width dropdowns - Increase project_schema max_length from 20 to 1024 - Fix table pagination wrapping to new line instead of horizontal overflow - Add distinct background color to toolbar (Filter, Sort, etc.) with light/dark theme support - Replace AI chat schema tooltip with interactive dropdown selector - Sync schema selection bidirectionally across AI Chat, Explorer, and Seeds via shared store
- Make entire project card clickable (header + body), with stopPropagation on action buttons - Redesign Model Configuration modal: Hierarchy on top, Source/Destination below, full width dropdowns - Increase project_schema max_length from 20 to 1024 - Fix table pagination wrapping to new line instead of horizontal overflow - Add distinct background color to toolbar (Filter, Sort, etc.) with light/dark theme support - Replace AI chat schema tooltip with interactive dropdown selector - Sync schema selection bidirectionally across AI Chat, Explorer, and Seeds via shared store - Move inline styles to CSS classes, lint cleanup
|
| Filename | Overview |
|---|---|
| frontend/src/base/components/project-list/ProjectListCard.jsx | Moves onClick/onKeyDown from inner body div to outer wrapper; action buttons correctly use stopPropagation. Missing Spacebar activation on the new role=button wrapper. |
| frontend/src/ide/chat-ai/PromptActions.jsx | Replaces static InfoChip with interactive Select dropdown backed by shared schemaList store; useCallback memoization is broken because expService (recreated each render) is listed as a dependency. |
| frontend/src/ide/editor/no-code-configuration/configure-source-destination.jsx | Refactors layout to two stacked cards; migrates deprecated bodyStyle to v5 styles prop and adds popupMatchSelectWidth to all selects. No functional logic changed. |
| frontend/src/ide/explorer/explorer-component.jsx | Stores fetched schema list in shared project-store; unmount cleanup only resets currentSchema, leaving schemaList stale across project navigations. |
| frontend/src/store/project-store.js | Adds schemaList state and setSchemaList action; correctly excluded from persisted partialize so it resets on page reload. |
Prompt To Fix All With AI
This is a comment left during a code review.
Path: frontend/src/ide/explorer/explorer-component.jsx
Line: 88-92
Comment:
**`schemaList` not cleared on Explorer unmount**
The cleanup effect resets `currentSchema` but leaves `schemaList` populated. When a user navigates from Project A's IDE to Project B's IDE in the same session, AI Chat will briefly display Project A's schema options (with no selection) until `getSchemas()` completes for Project B.
```suggestion
useEffect(() => {
return () => {
setCurrentSchema("");
setSchemaList([]);
};
}, [setCurrentSchema, setSchemaList]);
```
How can I resolve this? If you propose a fix, please make it concise.
---
This is a comment left during a code review.
Path: frontend/src/ide/chat-ai/PromptActions.jsx
Line: 61-83
Comment:
**`useCallback` memoization broken by unstable `expService` reference**
`explorerService()` returns a new object on every render (because it calls `useAxiosPrivate()` internally), so `expService` changes identity each render. Including it in `handleSchemaChange`'s dependency array means the callback is also recreated every render, making `useCallback` a no-op here.
Alternatively, simply omit `useCallback` here since `handleSchemaChange` is only passed to an Ant Design `Select` that isn't memoised itself.
How can I resolve this? If you propose a fix, please make it concise.
---
This is a comment left during a code review.
Path: frontend/src/base/components/project-list/ProjectListCard.jsx
Line: 92-95
Comment:
**`role="button"` missing Spacebar activation**
WAI-ARIA requires `role="button"` elements to respond to both Enter and the Spacebar key. The current `onKeyDown` only checks for `"Enter"`, leaving keyboard-only users unable to activate the card via the Spacebar.
Consider adding `e.key === " "` to the key check so both keys trigger `handleCardClick`.
How can I resolve this? If you propose a fix, please make it concise.Reviews (3): Last reviewed commit: "fix: address PR #55 review feedback" | Re-trigger Greptile
… deprecated bodyStyle
- Add e.stopPropagation() to shared-user avatar onKeyDown handler to prevent card navigation on Enter
- Replace deprecated bodyStyle prop with styles={{ body: {...} }} for Ant Design v5 compatibility
tahierhussain
left a comment
There was a problem hiding this comment.
@wicky-zipstack Can you please add screenshots for the UI changes addressed in this PR?
- Remove unused .project-list-card-clickable-content CSS class - Reduce !important usage in schema select styles, increase specificity instead - Replace duplicate API call with explorerService.setProjectSchema - Replace message.success/error with useNotificationService for consistency - Show error InfoChip when schema list is empty instead of hiding dropdown - Revert project_schema max_length change (will be added to PR #54 with migration)
|
@tahierhussain All review comments addressed in commit 917ed8a. Summary:
Will add screenshots shortly. |
Requested by @tahierhussain in PR #55 review — the project_schema field was too short for schemas with long names or multiple schemas. Bundled into migration 0003 alongside the model run-status fields since both target the core app and depend on 0002_seed_data. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: track model execution status and show failure icon in explorer Implement model-level execution status tracking (NOT_STARTED, RUNNING, SUCCESS, FAILED) at DAG node level with visual indicators in the file explorer. Status is tracked per individual DAG node, ensuring accurate status for each model even when downstream dependencies fail. Backend changes: - Add RunStatus enum and 4 new fields to ConfigModels (run_status, failure_reason, last_run_at, run_duration) - Migration 0003_add_model_run_status - Update file_explorer.load_models to return status fields - Add _update_model_status to DAG executor — called before execution (RUNNING), after success (SUCCESS), and on exception (FAILED with reason) - Update execute/views.py to return 400 on DAG execution failures - Fix clear_cache decorator to re-raise exceptions instead of swallowing them silently Frontend changes: - Add getModelRunStatus helper to render colored dot badges next to model names in the explorer tree - Running: blue, Success: green, Failed: red - Show Popover on hover over failed status with full error message and last run timestamp - Trigger explorer refresh via setRefreshModels after runTransformation succeeds or fails Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address PR review feedback on model run status tracking - Drop optional ConfigModels import; it's always present in the OSS build - Track run_duration via time.monotonic() and persist on SUCCESS/FAILED - Skip RUNNING update for non-executable parent nodes so they don't get stuck with a permanent blue badge in selective execution - Raise explicit errors when session/project_id missing instead of silent no-op - Stop returning raw exception strings from execute_run_command (CodeQL) - Refresh explorer tree on context-menu run failure so FAILED badge appears - Move getModelRunStatus to module scope and use antd theme tokens instead of hardcoded hex colors Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: satisfy prettier multiline formatting for status dot style spans Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat: increase project_schema max_length from 20 to 1024 Requested by @tahierhussain in PR #55 review — the project_schema field was too short for schemas with long names or multiple schemas. Bundled into migration 0003 alongside the model run-status fields since both target the core app and depend on 0002_seed_data. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix: address Greptile P1s — CLI-safe timezone import + DB connection leak P1: `from django.utils import timezone` at module level crashes when visitran is used as a standalone CLI without Django installed. Wrapped in try/except with a minimal fallback that provides timezone.now() via stdlib datetime. P1: close_db_connection() was only called in the success path of execute_run_command. On exception the connection leaked. Moved to a finally block so it always runs regardless of outcome. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
What
Why
How
Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)
Database Migrations
Env Config
Relevant Docs
Related Issues or PRs
Dependencies Versions
Notes on Testing
Screenshots
Checklist