b29a268b1d
- Move completed plan files to .plans/done/ - Move 18 open plan files to .plans/open/ - Update .gitignore to exclude .verified_plans temp file - Verified all 18 open plans still describe unimplemented issues
1.9 KiB
1.9 KiB
Implementation Plan: Issue #53 - Visual Query Builder
Summary
Implement a full-stack visual query builder with a JSON AST-to-SQL translation backend (QueryService), saved query CRUD (SavedQueryController), and a Vue 3 visual filter builder component with AND/OR nesting, live preview, saved queries sidebar, and export.
Files to Create/Modify
New Files
lib/Migration/Version000013Date20260407000012.php- DB migration for oc_mv_saved_queries tablelib/Db/SavedQuery.php- Entity classlib/Db/SavedQueryMapper.php- Mapper classlib/Service/QueryService.php- JSON AST to SQL translation + executionlib/Controller/QueryController.php- REST controller for saved queries + executionsrc/stores/queries.js- Pinia store for query builder statesrc/components/QueryBuilder.vue- Visual query builder componentsrc/views/QueryBuilder.vue- View wrapping the query builder with saved queries sidebartests/Unit/QueryServiceTest.php- Unit tests for AST translation
Modified Files
appinfo/routes.php- Add query-related routessrc/router.js- Add query builder route
Acceptance Criteria Checklist
- DB migration creates oc_mv_saved_queries with id, name, query_json, sort_json, created_by, created_at
- QueryService translates JSON AST with AND/OR nesting to Doctrine DBAL conditions
- Field whitelist validation prevents SQL injection
- Supported operators: =, !=, <, >, <=, >=, contains, starts_with, is_empty, is_not_empty
- SavedQueryController with list, create, update, delete, execute endpoints
- Ad-hoc query execution endpoint (POST /api/v1/queries/execute)
- QueryBuilder.vue with field/operator/value condition rows
- AND/OR toggle and nested sub-groups
- Save, load, delete saved queries
- Live preview of results
- Router entry for /queries view
- Unit tests for QueryService AST translation