Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
302 commits
Select commit Hold shift + click to select a range
5ed66fa
refactor(auth-store): remove switchDatabase — no longer needed with p…
aimeritething Mar 26, 2026
4ddc3b5
chore: update gitignore
aimeritething Mar 26, 2026
93eaf13
refactor(sidebar): add TreeNodeData types and node config
aimeritething Mar 26, 2026
0ded215
refactor(sidebar): extract useSidebarTree hook
aimeritething Mar 26, 2026
71d7ed4
refactor(sidebar): extract useSidebarModals hook with unified reducer
aimeritething Mar 26, 2026
895d370
refactor(sidebar): extract context menu item builders
aimeritething Mar 26, 2026
5d66046
refactor(sidebar): add TreeContext and recursive TreeNode component
aimeritething Mar 26, 2026
c86df9d
refactor(sidebar): rewrite Sidebar to compose TreeNode, useSidebarTre…
aimeritething Mar 26, 2026
5fa0028
refactor(sidebar): fix quality issues — standardize modal params, rem…
aimeritething Mar 26, 2026
cd65801
doc: update docs
aimeritething Mar 26, 2026
b9c1bb8
chore: add sql-formatter dependency for SQL editor
aimeritething Mar 26, 2026
f6c3cd7
refactor(sql-editor): remove stop, save, and autocomplete features
aimeritething Mar 26, 2026
5e74e84
feat(sql-editor): replace REST query execution with RawExecute GraphQ…
aimeritething Mar 26, 2026
194745a
feat(sql-editor): replace REST SQL formatting with sql-formatter library
aimeritething Mar 26, 2026
82a5273
refactor(sql-editor): remove unused monacoRef and duplicate comment
aimeritething Mar 26, 2026
f0d0325
chore: update claude md
aimeritething Mar 26, 2026
9254e3f
feat: filter system schemas/databases in sidebar and differentiate views
aimeritething Mar 26, 2026
6c8ea1b
refactor(dataflow): remove new database connection feature
aimeritething Mar 26, 2026
06f3b3a
build: add DataFlow build system alongside original frontend
aimeritething Mar 26, 2026
f924594
chore: update git ignore
aimeritething Mar 26, 2026
de930f4
fix(sql-editor): pass database context to rawExecute and sync SQL cha…
aimeritething Mar 26, 2026
a17ad77
fix(build): fix AES key injection and self-host fonts for Sealos depl…
aimeritething Mar 26, 2026
0c3e0b8
refactor(dataflow): remove dead code, stubs, and unused features
aimeritething Mar 26, 2026
f9e260b
feat(dataflow): wire CollectionDetailView to GraphQL API
aimeritething Mar 26, 2026
849b4e2
fix(dataflow): add JSON.parse error handling and empty-doc guard in C…
aimeritething Mar 26, 2026
30a479d
fix(dataflow): align filter WhereCondition builder with FilterCollect…
aimeritething Mar 26, 2026
f51be24
feat(dataflow): wire MongoDB export/import and disable drop collection
aimeritething Mar 26, 2026
bab9e90
feat(dataflow): wire RedisDetailView to GraphQL API
aimeritething Mar 26, 2026
f21d1d5
feat(dataflow): wire Redis export to /api/export and remove unused Ke…
aimeritething Mar 26, 2026
b7e2fa5
feat(mongodb,redis): implement RawExecute for MongoDB shell syntax an…
aimeritething Mar 27, 2026
f5e01b9
feat(dataflow): add database/schema selector dropdowns to SQL editor …
aimeritething Mar 27, 2026
7c66377
fix(dataflow): quote schema identifier in SET search_path to prevent …
aimeritething Mar 27, 2026
3ba477e
update menu
aimeritething Mar 27, 2026
c4f97a4
refactor(dataflow): organize database components into domain subfolders
aimeritething Mar 27, 2026
aa6e8bf
chore(dataflow): add shadcn components.json for Tailwind v4
aimeritething Mar 27, 2026
b53a04c
chore(dataflow): replace tailwindcss-animate with tw-animate-css
aimeritething Mar 27, 2026
378744e
feat(dataflow): add chart config types and transform utilities
aimeritething Mar 27, 2026
40323db
feat(dataflow): add chart config types, onQueryResults callback, and …
aimeritething Mar 27, 2026
58ecb1c
feat(dataflow): switch to shadcn default theme with OKLCH colors
aimeritething Mar 27, 2026
fbd5531
feat(dataflow): add ChartConfigPanel with chart type, axes, options, …
aimeritething Mar 27, 2026
495e544
feat(dataflow): add ChartCreateModal with chart config and data confi…
aimeritething Mar 27, 2026
46929be
feat(dataflow): wire ChartCreateModal into DashboardEditor, delete Ch…
aimeritething Mar 27, 2026
d8a1cd8
feat(dataflow): replace Button with shadcn new-york TW4 version
aimeritething Mar 27, 2026
9fdbd4a
feat(dataflow): replace Input with shadcn new-york TW4 version
aimeritething Mar 27, 2026
f263937
feat(dataflow): replace Badge with shadcn new-york TW4 version
aimeritething Mar 27, 2026
ba3f319
fix(dataflow): remove broken SET search_path prefix in SQLEditorView
aimeritething Mar 27, 2026
f9e2d31
fix(dataflow): default schema selector to "public" when schemas are l…
aimeritething Mar 27, 2026
d670ba2
refactor(dataflow): unify chart rendering with shared buildWidgetChar…
aimeritething Mar 27, 2026
1577476
feat(dataflow): add ExecuteConfirmedSQL mutation and DDL SQL utility
aimeritething Mar 27, 2026
884a547
feat(dataflow): add rename_table modal type and update context menu l…
aimeritething Mar 27, 2026
daf429f
feat(dataflow): remove unused data import feature
aimeritething Mar 27, 2026
db1fd63
feat(dataflow): implement DDL store methods with ExecuteConfirmedSQL
aimeritething Mar 27, 2026
e52b759
feat(dataflow): wire DeleteTableModal to ExecuteConfirmedSQL
aimeritething Mar 27, 2026
d3f925b
feat(dataflow): wire CreateTableModal to AddStorageUnit mutation
aimeritething Mar 27, 2026
e3164b0
feat(dataflow): wire EditTableModal to RawExecute + ExecuteConfirmedSQL
aimeritething Mar 27, 2026
6353d38
feat(dataflow): wire CopyTableModal to store copyTable method
aimeritething Mar 27, 2026
a6352a2
feat(dataflow): add RenameTableModal
aimeritething Mar 27, 2026
9440090
feat(dataflow): add shadcn new-york TW4 components for P2 migration
aimeritething Mar 27, 2026
2e65a5d
feat(dataflow): wire database DDL modals to ExecuteConfirmedSQL
aimeritething Mar 27, 2026
acaa016
feat(dataflow): integrate new DDL modals into Sidebar and clean up
aimeritething Mar 27, 2026
eda9f55
fix(dataflow): default Postgres schema to "public" in resolveSchemaParam
aimeritething Mar 27, 2026
ea8729f
fix(dataflow): pass database context to AddStorageUnit in createTable
aimeritething Mar 27, 2026
e7bd12f
docs: add data export feature design spec
aimeritething Mar 27, 2026
877fa07
feat(dataflow): refactor modal and context menu internals to shadcn p…
aimeritething Mar 27, 2026
49c4a2c
fix(dataflow): show "New Collection" instead of "New Table" for MongoDB
aimeritething Mar 27, 2026
dd4202a
docs: add data export implementation plan
aimeritething Mar 27, 2026
9442ff2
chore(dataflow): add jszip dependency for database export
aimeritething Mar 27, 2026
d1e62fb
feat(dataflow): add shared export utility for CSV/JSON/SQL/Excel/PNG
aimeritething Mar 27, 2026
1324ec4
feat(dataflow): add ref support to NativeECharts for PNG export
aimeritething Mar 27, 2026
d6ef4d3
feat(dataflow): rewrite ExportDataModal to use RawExecute GraphQL
aimeritething Mar 27, 2026
155a030
feat(dataflow): add chart PNG export to dashboard widget context menu
aimeritething Mar 27, 2026
44abd22
feat(dataflow): rewrite ExportDatabaseModal with multi-table zip export
aimeritething Mar 27, 2026
513e269
fix(dataflow): add horizontal scrollbar to ScrollArea component
aimeritething Mar 27, 2026
5d03ef1
fix(dataflow): pass database context to export RawExecute queries
aimeritething Mar 27, 2026
b680f36
feat(dataflow): migrate TabBar to shadcn ScrollArea
aimeritething Mar 27, 2026
cb4bf15
feat(dataflow): migrate EditTableModal to shadcn Tabs, Select, Checkbox
aimeritething Mar 27, 2026
e676023
chore: update claude md
aimeritething Mar 27, 2026
78d8619
feat(dataflow): migrate CreateTableModal to shadcn Select, Checkbox
aimeritething Mar 27, 2026
440cce1
feat(dataflow): migrate FilterTableModal to shadcn Select, Checkbox, …
aimeritething Mar 27, 2026
a34a77f
feat(dataflow): migrate FilterCollectionModal to shadcn Select
aimeritething Mar 27, 2026
28ab9ec
feat(dataflow): migrate RedisKeyModal to shadcn Select
aimeritething Mar 27, 2026
0446067
feat(dataflow): migrate simple modals to shadcn Button, Input
aimeritething Mar 27, 2026
af6d983
feat(dataflow): migrate detail view pagination to shadcn Select, Sepa…
aimeritething Mar 27, 2026
fb8fcd4
feat(dataflow): migrate analysis panels to shadcn ScrollArea
aimeritething Mar 27, 2026
4fc2b56
feat(dataflow): add ModalForm type definitions for composition pattern
aimeritething Mar 27, 2026
0a846b8
feat(dataflow): add useModalState hook for shared modal state
aimeritething Mar 27, 2026
fe41a36
feat(dataflow): add ModalForm compound component for composition pattern
aimeritething Mar 27, 2026
b892816
fix(dataflow): add role="alert" to ModalFormAlert for screen readers
aimeritething Mar 27, 2026
9fa9226
feat(dataflow): add disabled prop to SubmitButton, destructive stylin…
aimeritething Mar 27, 2026
3ff08b5
feat(dataflow): migrate CreateDatabaseModal to composition pattern
aimeritething Mar 27, 2026
393c51d
feat(dataflow): migrate EditDatabaseModal to composition pattern
aimeritething Mar 27, 2026
a3ed6a4
feat(dataflow): migrate DeleteDatabaseModal to composition pattern
aimeritething Mar 27, 2026
44093b9
feat(dataflow): migrate DeleteTableModal to composition pattern
aimeritething Mar 27, 2026
f3c5be0
feat(dataflow): migrate RenameTableModal to composition pattern
aimeritething Mar 27, 2026
5f66e47
feat(dataflow): migrate CopyTableModal to composition pattern
aimeritething Mar 27, 2026
5b84ad4
feat(dataflow): migrate ClearTableDataModal to composition pattern
aimeritething Mar 27, 2026
f60ae1d
feat(dataflow): migrate CreateTableModal to composition pattern
aimeritething Mar 27, 2026
3c04eed
docs: add Phase 3a EditTableModal decomposition plan
aimeritething Mar 29, 2026
7ec7a2b
feat(dataflow): add reusable MultiSelect component using Radix Popover
aimeritething Mar 29, 2026
bdb734f
feat(dataflow): add EditTable shared types
aimeritething Mar 29, 2026
3e5cb29
feat(dataflow): add EditTableProvider with schema fetch and DDL execu…
aimeritething Mar 29, 2026
2f1ee74
feat(dataflow): add EditTable.ColumnsTab subcomponent
aimeritething Mar 29, 2026
2f486ff
feat(dataflow): add EditTable.IndexesTab subcomponent
aimeritething Mar 29, 2026
96216dc
feat(dataflow): add EditTable.ForeignKeysTab subcomponent
aimeritething Mar 29, 2026
913adf2
feat(dataflow): add EditTableModal dialog wrapper with tab composition
aimeritething Mar 29, 2026
e461d7a
feat(dataflow): migrate EditTableModal to composition pattern
aimeritething Mar 29, 2026
4bb7805
fix(dataflow): fix Close button bypassing onSuccess and FK colSpan
aimeritething Mar 29, 2026
96ceca7
fix(dataflow): replace hardcoded Chinese strings with English in anal…
aimeritething Mar 30, 2026
b43f0ec
feat(dataflow): add shared DataView UI primitives (Pagination, Toolba…
aimeritething Mar 30, 2026
4461008
refactor(dataflow): migrate ComponentSettingsModal to Dialog
aimeritething Mar 30, 2026
0f4e8c2
feat(dataflow): add FormatSelector shared component for export modals
aimeritething Mar 30, 2026
1253df6
feat(dataflow): add triggerTableRefresh Zustand action, replace windo…
aimeritething Mar 30, 2026
ec37334
feat(dataflow): add ExportProgress and ExportFooter shared components
aimeritething Mar 30, 2026
4c61f40
feat(dataflow): migrate ExportDataModal to composition pattern
aimeritething Mar 30, 2026
c0ff3ea
feat(dataflow): migrate ExportDatabaseModal to composition pattern
aimeritething Mar 30, 2026
d91d622
feat(dataflow): migrate ExportCollectionModal to composition pattern
aimeritething Mar 30, 2026
427f8bc
fix(dataflow): update all export modal renders to new prop API
aimeritething Mar 30, 2026
9e6ca8f
feat(dataflow): add TableViewProvider with context and types
aimeritething Mar 30, 2026
688e78b
feat(dataflow): add TableView subcomponents (ColumnHeader, DataGrid, …
aimeritething Mar 30, 2026
ae80da5
fix(dataflow): remove fabricated AI Analysis button from TableView.To…
aimeritething Mar 30, 2026
faeed96
feat(dataflow): recompose TableDetailView as thin shell, migrate Filt…
aimeritething Mar 30, 2026
5b8ecba
chore: ignore local worktree directory
aimeritething Mar 30, 2026
5f4861c
feat(dataflow): add CollectionViewProvider with context and types
aimeritething Mar 30, 2026
70d563e
feat(dataflow): decompose CollectionDetailView into Provider + subcom…
aimeritething Mar 30, 2026
8307915
feat(dataflow): decompose RedisDetailView into Provider + subcomponen…
aimeritething Mar 30, 2026
23b7e86
feat(dataflow): add typed MongoDB collection filter contract
aimeritething Mar 30, 2026
7194c12
refactor(dataflow): migrate MaximizeChartModal to Dialog
aimeritething Mar 30, 2026
5c86881
refactor(dataflow): extract DeleteComponentModal from DashboardEditor
aimeritething Mar 30, 2026
47bc732
feat(dataflow): add typed MongoDB collection filter contract
aimeritething Mar 30, 2026
9e75cfd
refactor(dataflow): extract dashboard modals from DashboardSidebar to…
aimeritething Mar 30, 2026
3ad4984
refactor(dataflow): decompose ChartCreateModal into Provider + Dialog…
aimeritething Mar 30, 2026
bdf3eba
fix(dataflow): remove unused store destructurings from DashboardEditor
aimeritething Mar 30, 2026
696e956
feat(dataflow): migrate create collection modal to composition pattern
aimeritething Mar 30, 2026
f67f31e
chore(dataflow): add return type to create collection provider
aimeritething Mar 30, 2026
9342888
chore(dataflow): harden create collection provider submit
aimeritething Mar 30, 2026
abd7eb6
fix(dataflow): restore enter submit and success handling for collecti…
aimeritething Mar 30, 2026
77733fe
feat(dataflow): implement flat mongodb filter provider/modal composition
aimeritething Mar 30, 2026
55bc336
fix(dataflow): enforce unique field conditions in mongodb filter modal
aimeritething Mar 30, 2026
419f05f
fix(dataflow): reject unsupported preloaded regex filter shapes
aimeritething Mar 30, 2026
8abe35b
fix(dataflow): clear applied filter and tighten preloaded regex parsing
aimeritething Mar 30, 2026
cddd59e
feat(dataflow): add normalized Redis key draft types
aimeritething Mar 30, 2026
2d28642
refactor(dataflow): restructure analysis/ from flat layout to feature…
aimeritething Mar 30, 2026
2675d7d
feat(dataflow): rebuild Redis key modal with explicit create and stri…
aimeritething Mar 30, 2026
14d38d8
fix(dataflow): remove unsupported Redis export filter controls
aimeritething Mar 30, 2026
c624e8f
Merge branch 'phase4-mongodb-redis-modals' into dataflow
aimeritething Mar 30, 2026
10fefc7
feat(dataflow): decouple sidebar modal rendering and implement drop c…
aimeritething Mar 30, 2026
435800d
refactor(dataflow): unify alert types — replace AlertState with Alert…
aimeritething Mar 30, 2026
b62b86b
refactor(dataflow): ModalForm.Provider owns isSubmitting + alert state
aimeritething Mar 30, 2026
86739c8
refactor(dataflow): migrate SQL + database modals to ModalForm.Provid…
aimeritething Mar 30, 2026
5ad028c
refactor(dataflow): migrate MongoDB, Redis, analysis modals to ModalF…
aimeritething Mar 30, 2026
c6e85eb
refactor(dataflow): migrate complex modals (exports, EditTable) to Mo…
aimeritething Mar 30, 2026
6e855b9
refactor(dataflow): DataView providers use Alert | null, delete useMo…
aimeritething Mar 31, 2026
fb3811d
refactor(dataflow): move modal primitives to ui/, exports to shared/,…
aimeritething Mar 31, 2026
5a09b85
refactor(dataflow): extract sidebar from layout/ to components/sideba…
aimeritething Mar 31, 2026
a2390ac
feat(dataflow): add ActionButton and SearchInput shared UI primitives
aimeritething Mar 31, 2026
130a5b5
feat(dataflow): create DataView namespace with shared components, ren…
aimeritething Mar 31, 2026
7359429
refactor(dataflow): extract DocumentEditorDialog shell for MongoDB ad…
aimeritething Mar 31, 2026
5bac737
refactor(dataflow): rewrite detail views with DataView composition, d…
aimeritething Mar 31, 2026
caebd6c
refactor(dataflow): normalize provider naming across all 3 views (Pro…
aimeritething Mar 31, 2026
9ff1711
refactor(dataflow): replace collectionRefreshTrigger prop drilling wi…
aimeritething Mar 31, 2026
40b8cbe
refactor(dataflow): extract useInlineEditing from TableViewProvider
aimeritething Mar 31, 2026
6fcbb86
refactor(dataflow): extract useDataQuery from TableViewProvider
aimeritething Mar 31, 2026
9a8427b
refactor(dataflow): extract useColumnResize from TableViewProvider
aimeritething Mar 31, 2026
70946ee
refactor(dataflow): extract useDocumentEditing from CollectionViewPro…
aimeritething Mar 31, 2026
563980d
docs: add dataflow i18n design spec
aimeritething Mar 31, 2026
20240eb
doc: update docs
aimeritething Mar 31, 2026
cfcbda0
doc: update doc
aimeritething Mar 31, 2026
26f4007
test(dataflow): add vitest harness for i18n work
aimeritething Mar 31, 2026
1796e8b
chore(dataflow): capture pnpm lock for vitest harness
aimeritething Mar 31, 2026
9de5f69
chore(dataflow): type vitest test block
aimeritething Mar 31, 2026
e03678d
chore(dataflow): upgrade vitest to match vite
aimeritething Mar 31, 2026
4dc239e
chore(dataflow): update pnpm lock for vitest
aimeritething Mar 31, 2026
d8aa6b6
feat(dataflow): add locale and url cleanup helpers
aimeritething Mar 31, 2026
e33463e
fix(dataflow): preserve history state in url cleanup
aimeritething Mar 31, 2026
5c48742
feat(dataflow): add i18n runtime and base dictionaries
aimeritething Mar 31, 2026
1759974
feat(dataflow): add chart/sidebar tokens, remove dark theme block
aimeritething Mar 31, 2026
b757838
feat(dataflow): update @theme inline — chart/sidebar colors, radius m…
aimeritething Mar 31, 2026
1f441cf
feat(dataflow): swap Inter font for Geist Sans/Mono
aimeritething Mar 31, 2026
f596617
refactor(dataflow): remove unused Badge success/warning variants
aimeritething Mar 31, 2026
e05d4d3
fix(dataflow): relax i18n locale typing to key-shape parity
aimeritething Mar 31, 2026
9dda11b
feat(dataflow): localize bootstrap and shell
aimeritething Mar 31, 2026
cc0a625
fix(dataflow): close shell i18n review gaps
aimeritething Mar 31, 2026
f926ede
fix(dataflow): tighten sidebar i18n test cleanup
aimeritething Mar 31, 2026
753130e
test(dataflow): isolate sidebar storage in redis i18n test
aimeritething Mar 31, 2026
8a2ecc1
feat(dataflow): localize shared ui components
aimeritething Mar 31, 2026
350c3b5
remove mariaDB
aimeritething Mar 31, 2026
d95cf30
feat(dataflow): finish shadcn control migration
aimeritething Mar 31, 2026
47f9a8e
Merge branch 'shadcn-migration-steps5-7' into dataflow
aimeritething Mar 31, 2026
cff7b47
fix(dataflow): localize dialog close defaults and extend i18n tests
aimeritething Mar 31, 2026
e178993
test(dataflow): cover pagination safe-total fallback
aimeritething Mar 31, 2026
7663868
feat: localize sql editor views and table modals
aimeritething Mar 31, 2026
27779f1
chore: finalize task6 sql i18n verification
aimeritething Mar 31, 2026
b72b650
fix: use provider i18n in sql hooks and add editor smoke test
aimeritething Mar 31, 2026
4722720
feat(i18n): localize mongodb views and document flows
aimeritething Mar 31, 2026
b7729dc
feat(i18n): localize redis views and key flows
aimeritething Mar 31, 2026
a898cd7
feat(i18n): localize analysis views and defaults
aimeritething Mar 31, 2026
761ccbe
fix(i18n): localize database management modals
aimeritething Mar 31, 2026
a06d86c
merge: integrate dataflow-i18n
aimeritething Mar 31, 2026
e723101
chore(dataflow): remove test file
aimeritething Apr 1, 2026
e096fb7
feat(dataflow): restyle ActivityBar to match Figma design
aimeritething Apr 1, 2026
0bc58d5
feat(dataflow): split Postgres sidebar tables and views into folders
aimeritething Apr 1, 2026
7470947
feat(dataflow): remove detail view headers and restyle tab layout
aimeritething Apr 1, 2026
43199f0
fix(dataflow): tweak TabBar and TabContent styling
aimeritething Apr 1, 2026
1d93c7d
feat(dataflow): update tab ui
aimeritething Apr 1, 2026
15251e4
feat(dataflow): unify filter modal styles across SQL, MongoDB, and Redis
aimeritething Apr 1, 2026
2d0486d
feat(dataflow): restyle sidebar to match Figma design
aimeritething Apr 1, 2026
78f48ba
feat(dataflow): add resizable sidebar with drag handle
aimeritething Apr 1, 2026
ebbba0b
feat(dataflow): ui update
aimeritething Apr 1, 2026
64dab4b
feat(dataflow): add find-in-page search bar with keyboard shortcuts
aimeritething Apr 1, 2026
d22c946
feat(dataflow): optimize context menu
aimeritething Apr 1, 2026
2f74772
feat(dataflow): move dashboard sidebar to layout level with resizable…
aimeritething Apr 1, 2026
8f7f700
feat(dataflow): redesign dashboard widget card and remove canvas wrapper
aimeritething Apr 1, 2026
4c459c4
fix(dataflow): clean up editor components — remove unused imports, fi…
aimeritething Apr 1, 2026
775a620
feat(dataflow): support multi-statement SQL execution in editor
aimeritething Apr 1, 2026
9675504
feat(dataflow): add Redis multi-command support and clean up result t…
aimeritething Apr 1, 2026
52cfd55
fix(dataflow): make widget maximize button clickable above RGL resize…
aimeritething Apr 1, 2026
6c984b3
refactor(dataflow): align SQL editor resize with sidebar pattern
aimeritething Apr 1, 2026
44aac9a
update eidtor ui
aimeritething Apr 1, 2026
9b768ae
update ui
aimeritething Apr 1, 2026
d13be73
fix(dataflow): add dashboard refresh locale key
aimeritething Apr 1, 2026
ca6770e
feat(dataflow): add sql multi-row changeset editing
aimeritething Apr 1, 2026
89f23d1
update toolbar
aimeritething Apr 1, 2026
ba99d83
feat(dataflow): update toolbar
aimeritething Apr 2, 2026
441e0bd
feat(dataflow): update ui
aimeritething Apr 2, 2026
320baa9
feat(dataflow): add query button to SQL, MongoDB, and Redis toolbars
aimeritething Apr 2, 2026
faff510
feat(dataflow): add full-column resize handles with DOM-based hover h…
aimeritething Apr 2, 2026
9d434d0
feat(dataflow): add Radix UI tooltips to all icon-only buttons
aimeritething Apr 2, 2026
cdb4da8
feat(dataflow): update ui
aimeritething Apr 2, 2026
5b472c9
feat(dataflow): update dashboard editor toolbar and form modal
aimeritething Apr 2, 2026
cbc3815
feat(dataflow): add chart editing, fix context menu positioning, remo…
aimeritething Apr 2, 2026
ab48ffe
fix(dataflow): harden SQL edit table UI
aimeritething Apr 2, 2026
eb7c921
chore(dataflow): remove SQL hardening tests
aimeritething Apr 2, 2026
0ebf62a
feat: stabilize dataflow database actions
aimeritething Apr 2, 2026
23f01eb
feat: edit charts in create modal
aimeritething Apr 2, 2026
7632ca0
docs: add dashboard chart-first full-stack design
aimeritething Apr 2, 2026
7bbdfad
refactor(dataflow): unify modal headers and footers to use ModalForm
aimeritething Apr 2, 2026
0ede153
refactor(dataflow): add shared Textarea and RadioGroup components
aimeritething Apr 2, 2026
1871a77
refactor(dataflow): unify spacing and label styles across modals
aimeritething Apr 2, 2026
addc2e0
docs: clarify dashboard schema refresh behavior
aimeritething Apr 2, 2026
d7afefc
refactor(dataflow): refactor ui
aimeritething Apr 2, 2026
30a6ae4
feat(core): add dashboard metadata service
aimeritething Apr 2, 2026
d0cec89
feat(graphql): add dashboard and chart widget api
aimeritething Apr 2, 2026
bc0e140
feat(dataflow): persist chart dashboards
aimeritething Apr 2, 2026
e1ef4c0
Merge branch 'dashboard-chart-first-full-stack' into dataflow
aimeritething Apr 2, 2026
b888119
edit table
aimeritething Apr 2, 2026
52ded73
fix(dataflow): show actual column type in edit table dropdown
aimeritething Apr 2, 2026
b713c58
fix(dataflow): show border on column type select in table modals
aimeritething Apr 2, 2026
75c7a7d
fix(redis): align key actions and export flow
aimeritething Apr 3, 2026
97625da
fix(dataflow): add min-h-0 to edit table modal for scroll on long tables
aimeritething Apr 3, 2026
0cddf7d
update
aimeritething Apr 7, 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
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
!cli/
!ee/
!ee-stub/
!dataflow/

# Exclude test/dev artifacts within allowed directories
**/node_modules
Expand Down
15 changes: 14 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,17 @@ tools/docs-agent/.venv
tools/docs-agent/runs/
tools/
.playwright-mcp
dev_docs/
dev_docs/
dataflow/.next
dataflow/build/
*.env.local
docs/superpowers/
dataflow/docs/superpowers/

# DataFlow derived files
dataflow/public/monaco-editor/

dataflow/.env

.agents/
.worktrees/
27 changes: 23 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# WhoDB Development Guide

WhoDB is a database management tool with a Go backend (`/core`) and React frontend (`/frontend`).
WhoDB is a database management tool with a Go backend (`/core`) and two React frontends: the original management UI (`/frontend`) and the DataFlow analysis platform (`/dataflow`).

## Non-Negotiable Rules

Expand Down Expand Up @@ -28,11 +28,17 @@ core/ # CE backend (Go)
graph/schema.graphqls # GraphQL schema
graph/*.resolvers.go # GraphQL resolvers

frontend/ # React/TypeScript
frontend/ # Original management UI (React/TypeScript)
src/index.tsx # Entry point
src/store/ # Redux Toolkit state
src/generated/ # GraphQL codegen output (@graphql alias)

dataflow/ # DataFlow analysis platform (React 19/TypeScript/Vite)
src/main.tsx # Entry point
src/stores/ # Zustand state (auth, connection, tab, analysis)
src/generated/ # GraphQL codegen output (@/* alias)
src/components/ # layout, database views, analysis dashboard, editor, ui

dev/ # Docker compose, test scripts, sample data
docs/ # Integration plan and analysis
```
Expand Down Expand Up @@ -67,14 +73,26 @@ bash dev/run-backend-tests.sh all # Unit + integration
- `env` package is for pure env var declarations only (no `log` import). Functions that parse env vars and need `log` for error reporting go in `envconfig`
- Delete build binaries after testing (`go build` artifacts)

## When Working on Frontend (TypeScript)
## When Working on Frontend — Original UI (`/frontend`)

- Use PNPM, not NPM. Use pnpx, not npx
- Define GraphQL operations in `.graphql` files, then run `pnpm run generate`
- Import generated hooks from `@graphql` alias - never use inline `gql` strings
- CE features in `frontend/src/`
- State management: Redux Toolkit (`frontend/src/store/`)
- **Keyboard shortcuts** are centralized in `frontend/src/utils/shortcuts.ts`. Never hardcode shortcut keys inline — use `SHORTCUTS.*` for definitions, `matchesShortcut()` for event handling, and `SHORTCUTS.*.displayKeys` for UI display. Platform-variant shortcuts (nav numbers) use `resolveShortcut()`

## When Working on Frontend — DataFlow (`/dataflow`)

- Use PNPM, not NPM. Use pnpx, not npx
- Vite SPA with React 19, TypeScript, Tailwind CSS 4
- State management: Zustand (`dataflow/src/stores/`)
- Path alias: `@/*` maps to `src/` (configured in `vite.config.ts` and `tsconfig.json`)
- Styling: `cn()` utility (clsx + tailwind-merge), CSS variables in `src/globals.css`
- GraphQL codegen: define operations in `.graphql` files, run `pnpm run generate`
- Key libraries: Monaco Editor, ECharts, react-grid-layout, xlsx
- See `dataflow/CLAUDE.md` for full architecture details

## When Updating Dependencies

Use `core/go.mod` as the reference point for dependency versions.
Expand All @@ -85,7 +103,8 @@ See `.claude/docs/commands.md` for full reference.

```bash
# Backend: cd core && go run .
# Frontend: cd frontend && pnpm start
# Frontend (Original UI): cd frontend && pnpm start
# Frontend (DataFlow): cd dataflow && pnpm dev
```

## Development Principles
Expand Down
9 changes: 9 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
SERVICE_NAME = whodb
DOCKER_USERNAME ?=
IMAGE_TAG ?= latest
WHODB_AES_KEY ?=
IMG ?= $(DOCKER_USERNAME)/$(SERVICE_NAME):$(IMAGE_TAG)

.PHONY: all
Expand Down Expand Up @@ -35,3 +36,11 @@ docker-push: ## Push docker image.
.PHONY: docker-build-push
docker-build-push: ## Build and push docker image.
docker buildx build -f core/Dockerfile --platform linux/amd64 -t $(IMG) --push .

.PHONY: docker-build-dataflow
docker-build-dataflow: ## Build docker image with DataFlow frontend.
docker buildx build -f core/Dockerfile.dataflow --platform linux/amd64 --build-arg WHODB_AES_KEY=$(WHODB_AES_KEY) -t $(IMG) .

.PHONY: docker-build-push-dataflow
docker-build-push-dataflow: ## Build and push docker image with DataFlow frontend.
docker buildx build -f core/Dockerfile.dataflow --platform linux/amd64 --build-arg WHODB_AES_KEY=$(WHODB_AES_KEY) -t $(IMG) --push .
82 changes: 82 additions & 0 deletions core/Dockerfile.dataflow
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Copyright 2025 Clidey, Inc.
#
# 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.

FROM node:25.6.0-alpine3.23 AS build-stage
RUN npm i -g pnpm@10.29.3
WORKDIR /app
COPY ./dataflow/package.json ./dataflow/pnpm-lock.yaml ./
RUN pnpm install
COPY ./dataflow/ ./

ARG VERSION=dev
ENV VITE_APP_VERSION=${VERSION}
ARG WHODB_AES_KEY
RUN if [ -n "$WHODB_AES_KEY" ]; then echo "VITE_WHODB_AES_KEY=$WHODB_AES_KEY" >> .env; fi && \
pnpm run build
ARG TARGETARCH
ARG PLATFORM=docker

FROM golang:1.26-alpine3.23 AS backend-stage
RUN apk add --no-cache \
gcc \
musl-dev \
git \
ca-certificates \
curl
WORKDIR /app

# Copy core module files
COPY ./core/go.mod ./core/go.sum ./
RUN go mod download
COPY ./core/ ./


COPY --from=build-stage /app/build/ ./build/

# Build backend with version and environment
ARG VERSION
ARG TARGETARCH
ARG PLATFORM
RUN CGO_CFLAGS="-Os -ffunction-sections -fdata-sections -fno-asynchronous-unwind-tables -fno-unwind-tables -flto -fvisibility=hidden" \
CGO_LDFLAGS="-Wl,--gc-sections -Wl,--as-needed -flto" \
CGO_ENABLED=1 GOOS=linux GOARCH=${TARGETARCH} go build -tags prod -trimpath \
-ldflags="-s -w -X github.com/clidey/whodb/core/src/env.ApplicationVersion=${VERSION} -X github.com/clidey/whodb/core/src/env.ApplicationEnvironment=${PLATFORM}-${TARGETARCH}" \
-o /core

# Pre-download BAML native library for the target architecture (musl for Alpine)
# Extract BAML version from go.mod to stay in sync
ARG TARGETARCH
RUN BAML_VERSION=$(grep 'github.com/boundaryml/baml ' go.mod | awk '{print $2}' | sed 's/^v//') && \
if [ "$TARGETARCH" = "amd64" ]; then \
BAML_ARCH="x86_64"; \
elif [ "$TARGETARCH" = "arm64" ]; then \
BAML_ARCH="aarch64"; \
else \
echo "Unsupported architecture: $TARGETARCH" && exit 1; \
fi && \
mkdir -p /baml-lib && \
curl -L -o /baml-lib/libbaml_cffi.so \
https://github.com/boundaryml/baml/releases/download/${BAML_VERSION}/libbaml_cffi-${BAML_ARCH}-unknown-linux-musl.so && \
echo "Downloaded BAML musl library for ${BAML_ARCH}"

FROM alpine:3.23
RUN apk add --no-cache ca-certificates libgcc
WORKDIR /app
COPY --from=backend-stage /core /core
# Copy BAML musl library and set path via env var
# (BAML Go client's isMusl() is not implemented, so we must use BAML_LIBRARY_PATH)
COPY --from=backend-stage /baml-lib/libbaml_cffi.so /usr/local/lib/libbaml_cffi.so
ENV BAML_LIBRARY_PATH=/usr/local/lib/libbaml_cffi.so

CMD ["/core"]
144 changes: 144 additions & 0 deletions core/graph/dashboard_graphql_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package graph

import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"strings"
"testing"

"github.com/99designs/gqlgen/graphql/handler"
"github.com/clidey/whodb/core/src/auth"
"github.com/clidey/whodb/core/src/dashboard"
"github.com/clidey/whodb/core/src/engine"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)

func TestGetDashboardsReturnsScopedDashboards(t *testing.T) {
service := newDashboardServiceForGraphTest(t)
ctx := contextWithScope("primary")

dash, err := service.CreateDashboard(ctx, dashboard.CreateDashboardParams{
Name: "Revenue",
RefreshRule: dashboard.RefreshRuleOnDemand,
})
if err != nil {
t.Fatalf("create dashboard: %v", err)
}
_, err = service.AddWidget(ctx, dash.ID, dashboard.WidgetInput{
Type: dashboard.WidgetTypeChart,
Title: "Monthly revenue",
Layout: `{"i":"widget-1","x":0,"y":0,"w":4,"h":6}`,
})
if err != nil {
t.Fatalf("add widget: %v", err)
}

body, _ := json.Marshal(map[string]any{
"query": `query { GetDashboards { ID Name Widgets { ID Type Layout } } }`,
})
recorder := executeDashboardGraphQL(t, service, ctx, body)

if recorder.Code != http.StatusOK || !strings.Contains(recorder.Body.String(), "Revenue") {
t.Fatalf("unexpected response: %d %s", recorder.Code, recorder.Body.String())
}
}

func TestAddWidgetRejectsCrossScopeMutation(t *testing.T) {
service := newDashboardServiceForGraphTest(t)
ownerCtx := contextWithScope("primary")
otherCtx := contextWithScope("secondary")

dash, err := service.CreateDashboard(ownerCtx, dashboard.CreateDashboardParams{
Name: "Revenue",
RefreshRule: dashboard.RefreshRuleOnDemand,
})
if err != nil {
t.Fatalf("create dashboard: %v", err)
}

mutation := fmt.Sprintf(
`mutation { AddWidget(dashboardId:%q, input:{Type:"chart", Title:"Blocked", Layout:"{\"i\":\"widget-1\",\"x\":0,\"y\":0,\"w\":4,\"h\":6}"}) { ID } }`,
dash.ID,
)
body, _ := json.Marshal(map[string]any{"query": mutation})
recorder := executeDashboardGraphQL(t, service, otherCtx, body)

if recorder.Code != http.StatusOK || !strings.Contains(recorder.Body.String(), dashboard.ErrScopeMismatch.Error()) {
t.Fatalf("expected scope error, got %d %s", recorder.Code, recorder.Body.String())
}
}

func TestUpdateWidgetSnapshotAcceptsSnapshotPayload(t *testing.T) {
service := newDashboardServiceForGraphTest(t)
ctx := contextWithScope("primary")

dash, err := service.CreateDashboard(ctx, dashboard.CreateDashboardParams{
Name: "Revenue",
RefreshRule: dashboard.RefreshRuleOnDemand,
})
if err != nil {
t.Fatalf("create dashboard: %v", err)
}
widget, err := service.AddWidget(ctx, dash.ID, dashboard.WidgetInput{
Type: dashboard.WidgetTypeChart,
Title: "Monthly revenue",
Layout: `{"i":"widget-1","x":0,"y":0,"w":4,"h":6}`,
})
if err != nil {
t.Fatalf("add widget: %v", err)
}

mutation := fmt.Sprintf(
`mutation { UpdateWidgetSnapshot(id:%q, snapshot:{Config:"{\"type\":\"bar\"}", Data:"{}", ExecutedAt:"2026-04-02T00:00:00Z"}) { Status } }`,
widget.ID,
)
body, _ := json.Marshal(map[string]any{"query": mutation})
recorder := executeDashboardGraphQL(t, service, ctx, body)

if recorder.Code != http.StatusOK || !strings.Contains(recorder.Body.String(), `"Status":true`) {
t.Fatalf("expected success, got %d %s", recorder.Code, recorder.Body.String())
}
}

func executeDashboardGraphQL(t *testing.T, service dashboard.ServiceAPI, ctx context.Context, body []byte) *httptest.ResponseRecorder {
t.Helper()

srv := handler.NewDefaultServer(NewExecutableSchema(Config{
Resolvers: &Resolver{DashboardService: service},
}))
req := httptest.NewRequest(http.MethodPost, "/api/query", bytes.NewBuffer(body))
req = req.WithContext(ctx)
req.Header.Set("Content-Type", "application/json")
recorder := httptest.NewRecorder()
srv.ServeHTTP(recorder, req)
return recorder
}

func newDashboardServiceForGraphTest(t *testing.T) *dashboard.Service {
t.Helper()

db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("open sqlite db: %v", err)
}

service, err := dashboard.NewService(db)
if err != nil {
t.Fatalf("new service: %v", err)
}

return service
}

func contextWithScope(database string) context.Context {
return context.WithValue(context.Background(), auth.AuthKey_Credentials, &engine.Credentials{
Type: "Postgres",
Hostname: "db.internal",
Database: database,
})
}
Loading