@hienlh/ppm 0.9.84 → 0.9.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/260413-1354-new-file-editor-tab/reports/code-reviewer-260413-1420-new-file-tab-review.md +210 -0
- package/CHANGELOG.md +23 -0
- package/bun.lock +259 -9
- package/dist/web/assets/{_basePickBy-5PGDJbfF.js → _basePickBy-Bj0dI1ei.js} +1 -1
- package/dist/web/assets/{_baseUniq-BT4Ow4Kk.js → _baseUniq-CyzdZeQH.js} +1 -1
- package/dist/web/assets/ai-settings-section-Bo9lCaTd.js +1 -0
- package/dist/web/assets/{api-settings-Bn-bIxD1.js → api-settings-CUxg9RE5.js} +1 -1
- package/dist/web/assets/{arc-BAOivWpI.js → arc-CxgHJ7Z4.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-DDFO_NKq.js +1 -0
- package/dist/web/assets/{architectureDiagram-2XIMDMQ5-Z-4eN4za.js → architectureDiagram-2XIMDMQ5-D16OotsC.js} +1 -1
- package/dist/web/assets/arrow-up-I9-21gkR.js +1 -0
- package/dist/web/assets/{blockDiagram-WCTKOSBZ-BCLqzhuZ.js → blockDiagram-WCTKOSBZ-Ct57Wtfk.js} +1 -1
- package/dist/web/assets/{c4Diagram-IC4MRINW-0Vp0Jeas.js → c4Diagram-IC4MRINW-BIymcNsg.js} +1 -1
- package/dist/web/assets/channel-wumTB1if.js +1 -0
- package/dist/web/assets/chat-tab-BEEd-Km4.js +10 -0
- package/dist/web/assets/chevron-right-DY_wImxB.js +1 -0
- package/dist/web/assets/{chunk-4BX2VUAB-D4tOov49.js → chunk-4BX2VUAB-CENmY7Kw.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-DJ6BynZ4.js → chunk-55IACEB6-DhZGI1l3.js} +1 -1
- package/dist/web/assets/{chunk-7E7YKBS2-CiyUJxNI.js → chunk-7E7YKBS2-DZcnC7Ow.js} +1 -1
- package/dist/web/assets/{chunk-7R4GIKGN-Dv-4cAYn.js → chunk-7R4GIKGN-y8bfHEy-.js} +2 -2
- package/dist/web/assets/{chunk-C72U2L5F-D21mS_6G.js → chunk-C72U2L5F-BHPkfQj2.js} +1 -1
- package/dist/web/assets/{chunk-EGIJ26TM-DzqmU2Z7.js → chunk-EGIJ26TM-nant2LXl.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-DXncblvW.js → chunk-FMBD7UC4-Bog4cpN-.js} +1 -1
- package/dist/web/assets/{chunk-GEFDOKGD-D-pKjlVd.js → chunk-GEFDOKGD-86LFbsAC.js} +1 -1
- package/dist/web/assets/chunk-GLR3WWYH-Re-5eSlQ.js +2 -0
- package/dist/web/assets/chunk-HHEYEP7N-C45i5G_3.js +1 -0
- package/dist/web/assets/{chunk-JSJVCQXG-99JzIdPr.js → chunk-JSJVCQXG-23eG9mgt.js} +1 -1
- package/dist/web/assets/{chunk-KX2RTZJC-CRq1OBZv.js → chunk-KX2RTZJC-CHj8TnTB.js} +1 -1
- package/dist/web/assets/{chunk-KYZI473N-Bb0MCaIO.js → chunk-KYZI473N-gqRLpJ4w.js} +1 -1
- package/dist/web/assets/{chunk-L3YUKLVL-C7qGJrfV.js → chunk-L3YUKLVL-DnSMmNFC.js} +1 -1
- package/dist/web/assets/{chunk-MX3YWQON-BpS_PtKp.js → chunk-MX3YWQON-B6g1ZH9X.js} +1 -1
- package/dist/web/assets/{chunk-NQ4KR5QH-z_blpjxi.js → chunk-NQ4KR5QH-DX32345Y.js} +1 -1
- package/dist/web/assets/{chunk-O4XLMI2P-nDhi_cVu.js → chunk-O4XLMI2P-Vp_V4P-b.js} +1 -1
- package/dist/web/assets/{chunk-OZEHJAEY-BXhYx3nO.js → chunk-OZEHJAEY-lKq2SWjA.js} +1 -1
- package/dist/web/assets/{chunk-PQ6SQG4A-TF58UVMU.js → chunk-PQ6SQG4A-Bik13fTV.js} +1 -1
- package/dist/web/assets/{chunk-PU5JKC2W-ek7k4QVB.js → chunk-PU5JKC2W-DD95Rx35.js} +1 -1
- package/dist/web/assets/chunk-QZHKN3VN-N3VXx1VH.js +1 -0
- package/dist/web/assets/{chunk-R5LLSJPH-CFwSJijQ.js → chunk-R5LLSJPH-dRhXRnrb.js} +1 -1
- package/dist/web/assets/{chunk-WL4C6EOR-ByUrSRin.js → chunk-WL4C6EOR-B1iIvLOG.js} +1 -1
- package/dist/web/assets/{chunk-XIRO2GV7-Djlmrely.js → chunk-XIRO2GV7-DZBoNl1_.js} +1 -1
- package/dist/web/assets/{chunk-XPW4576I-BPQQBakK.js → chunk-XPW4576I-CgLyyW03.js} +1 -1
- package/dist/web/assets/{chunk-XZSTWKYB-DxAOx4hG.js → chunk-XZSTWKYB-DjV8xl5A.js} +1 -1
- package/dist/web/assets/{chunk-YBOYWFTD-rQG3QH5s.js → chunk-YBOYWFTD-D_ILLe6_.js} +1 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-mr-Cb1me.js +1 -0
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-BKe8_uda.js +1 -0
- package/dist/web/assets/clone--z5KLAuR.js +1 -0
- package/dist/web/assets/code-editor-Ij4p30cr.js +8 -0
- package/dist/web/assets/columns-2-IeETSfON.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-B_AWZsOP.js → cose-bilkent-S5V4N54A-BGNPFv3x.js} +1 -1
- package/dist/web/assets/{csv-preview-D2pJJj3K.js → csv-preview-CwQnOa3E.js} +2 -2
- package/dist/web/assets/{dagre-DHq9bhnd.js → dagre-CkhlMHnx.js} +1 -1
- package/dist/web/assets/{dagre-KLK3FWXG-BdJr7Byp.js → dagre-KLK3FWXG-Cnp996VG.js} +1 -1
- package/dist/web/assets/database-CgTomMxt.js +1 -0
- package/dist/web/assets/{database-viewer-Camu01H4.js → database-viewer-C1UHSgft.js} +2 -2
- package/dist/web/assets/{diagram-E7M64L7V-_db4pBVA.js → diagram-E7M64L7V-BZF0tSOr.js} +1 -1
- package/dist/web/assets/{diagram-IFDJBPK2-xKoeuiJx.js → diagram-IFDJBPK2-nUcO8sN8.js} +1 -1
- package/dist/web/assets/{diagram-P4PSJMXO-C8tjJsev.js → diagram-P4PSJMXO-CW0eCkwC.js} +1 -1
- package/dist/web/assets/diff-viewer-CVx5naBA.js +4 -0
- package/dist/web/assets/dist-CM0oD8tQ.js +1 -0
- package/dist/web/assets/{erDiagram-INFDFZHY-BSh2z9Df.js → erDiagram-INFDFZHY-DSkriYZ9.js} +1 -1
- package/dist/web/assets/extension-webview-CHVVpV34.js +3 -0
- package/dist/web/assets/{flowDiagram-PKNHOUZH-oYaovqyp.js → flowDiagram-PKNHOUZH-CFYAfZBx.js} +1 -1
- package/dist/web/assets/{ganttDiagram-A5KZAMGK-DmL26q2P.js → ganttDiagram-A5KZAMGK-KSn4XAU4.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-OkvBPi6H.js +1 -0
- package/dist/web/assets/{gitGraphDiagram-K3NZZRJ6-CMoukSrY.js → gitGraphDiagram-K3NZZRJ6-BMgjjVys.js} +1 -1
- package/dist/web/assets/{graphlib-BcsNnGcW.js → graphlib-BWe1iK_s.js} +1 -1
- package/dist/web/assets/index-OqgGFmh8.js +26 -0
- package/dist/web/assets/index-vA7juDri.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-BDU2_bYD.js +1 -0
- package/dist/web/assets/infoDiagram-LFFYTUFH-Diq4Cyc3.js +2 -0
- package/dist/web/assets/input-BHj0veau.js +45 -0
- package/dist/web/assets/{isEmpty-bnrF3Qbc.js → isEmpty-BfLnxq-B.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-PHBUUO56-D05_LyL7.js → ishikawaDiagram-PHBUUO56-CiVEvp8o.js} +1 -1
- package/dist/web/assets/{journeyDiagram-4ABVD52K-B_L20qMe.js → journeyDiagram-4ABVD52K-CG_v5Aho.js} +1 -1
- package/dist/web/assets/jsx-runtime-BRW_vwa9.js +1 -0
- package/dist/web/assets/{kanban-definition-K7BYSVSG-CZ535BbZ.js → kanban-definition-K7BYSVSG-miB0-_Zq.js} +1 -1
- package/dist/web/assets/keybindings-store-BQxgPV5o.js +1 -0
- package/dist/web/assets/{line-CVvo3dRu.js → line-CSuSrJ9J.js} +1 -1
- package/dist/web/assets/{linear-DP4mkX3m.js → linear-DFN_MPsw.js} +1 -1
- package/dist/web/assets/markdown-renderer-CRy8xw2B.js +306 -0
- package/dist/web/assets/{mermaid-parser.core-C7UwoIh6.js → mermaid-parser.core-CFdP1Z5_.js} +2 -2
- package/dist/web/assets/{mindmap-definition-YRQLILUH-x0MTutJp.js → mindmap-definition-YRQLILUH-pYPWwASE.js} +1 -1
- package/dist/web/assets/{ordinal-_K3x1fkz.js → ordinal-DpFn432U.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-BwpIpYB3.js +1 -0
- package/dist/web/assets/pie-UPGHQEXC-BPgAfmes.js +1 -0
- package/dist/web/assets/{pieDiagram-SKSYHLDU-C1Gjrtzy.js → pieDiagram-SKSYHLDU-Dovdlvhu.js} +1 -1
- package/dist/web/assets/plus-DQGIb4mQ.js +1 -0
- package/dist/web/assets/port-forwarding-tab-Biua8ov5.js +1 -0
- package/dist/web/assets/{postgres-viewer-BQdPMowm.js → postgres-viewer-BcVjCAl4.js} +3 -3
- package/dist/web/assets/{quadrantDiagram-337W2JSQ-C8bzJCjQ.js → quadrantDiagram-337W2JSQ-TXe6cU_F.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-TqxBkWx-.js +1 -0
- package/dist/web/assets/refresh-cw-Clk8fdUD.js +1 -0
- package/dist/web/assets/{requirementDiagram-Z7DCOOCP-pQyah6WB.js → requirementDiagram-Z7DCOOCP-CuiiuGS9.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-WA2Y5GQK-T6RgG-N8.js → sankeyDiagram-WA2Y5GQK-BbRmhv0t.js} +1 -1
- package/dist/web/assets/scroll-area-BpXCNme3.js +1 -0
- package/dist/web/assets/{sequenceDiagram-2WXFIKYE-BQDJ4CVs.js → sequenceDiagram-2WXFIKYE-B2D8IQDb.js} +1 -1
- package/dist/web/assets/settings-tab-C9X-N8hE.js +1 -0
- package/dist/web/assets/{sql-query-editor-CY61vWBg.js → sql-query-editor-BFvRvJn0.js} +1 -1
- package/dist/web/assets/sqlite-viewer-CPfvwFl4.js +1 -0
- package/dist/web/assets/square-vBdqj0bF.js +1 -0
- package/dist/web/assets/{stateDiagram-RAJIS63D-66vhiIuk.js → stateDiagram-RAJIS63D-ylr4HxPu.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-D6zvxf3M.js +1 -0
- package/dist/web/assets/table-Bi27fEaN.js +1 -0
- package/dist/web/assets/{terminal-tab-TIJmxHl6.js → terminal-tab-mWwk_weB.js} +2 -2
- package/dist/web/assets/text-wrap-D_OmSzhp.js +1 -0
- package/dist/web/assets/{timeline-definition-YZTLITO2-DwZqB3nn.js → timeline-definition-YZTLITO2-pMv1grvM.js} +1 -1
- package/dist/web/assets/trash-2-CNuB-htI.js +1 -0
- package/dist/web/assets/treemap-KZPCXAKY-Kck06FKU.js +1 -0
- package/dist/web/assets/{use-monaco-theme-BHn-LEm7.js → use-monaco-theme-CPaeSMAA.js} +1 -1
- package/dist/web/assets/{vennDiagram-LZ73GAT5-s9Z71fz-.js → vennDiagram-LZ73GAT5-C-rkIUbo.js} +1 -1
- package/dist/web/assets/x-Dw3TjeY_.js +1 -0
- package/dist/web/assets/{xychartDiagram-JWTSCODW-DRa_TH4B.js → xychartDiagram-JWTSCODW-CtpjAakO.js} +1 -1
- package/dist/web/index.html +18 -12
- package/dist/web/sw.js +1 -1
- package/docs/codebase-summary.md +134 -11
- package/docs/extension-development-guide.md +98 -1
- package/docs/journals/260414-1400-ext-git-graph-port-complete.md +147 -0
- package/docs/journals/260414-1452-git-graph-faithful-port.md +144 -0
- package/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +261 -0
- package/docs/journals/260414-2001-bundled-extensions.md +219 -0
- package/docs/project-changelog.md +63 -22
- package/docs/project-roadmap.md +1 -0
- package/docs/system-architecture.md +33 -5
- package/package.json +9 -3
- package/packages/ext-git-graph/package.json +30 -0
- package/packages/ext-git-graph/src/extension-integration.test.ts +230 -0
- package/packages/ext-git-graph/src/extension-parsers.test.ts +193 -0
- package/packages/ext-git-graph/src/extension.ts +800 -0
- package/packages/ext-git-graph/src/git-log-parser.test.ts +271 -0
- package/packages/ext-git-graph/src/git-log-parser.ts +38 -0
- package/packages/ext-git-graph/src/types.ts +181 -0
- package/packages/ext-git-graph/src/webview-html.test.ts +142 -0
- package/packages/ext-git-graph/src/webview-html.ts +2199 -0
- package/packages/vscode-compat/src/index.ts +4 -0
- package/packages/vscode-compat/src/process.ts +25 -0
- package/packages/vscode-compat/src/window.ts +10 -0
- package/src/cli/commands/ext-cmd.ts +3 -1
- package/src/server/index.ts +1 -1
- package/src/server/ws/extensions.ts +6 -2
- package/src/services/contribution-registry.ts +14 -1
- package/src/services/extension-host-worker.ts +7 -3
- package/src/services/extension-manifest.ts +18 -1
- package/src/services/extension-rpc-handlers.ts +68 -2
- package/src/services/extension.service.ts +46 -6
- package/src/types/extension-messages.ts +2 -0
- package/src/types/extension.ts +8 -0
- package/src/web/components/editor/code-editor.tsx +83 -8
- package/src/web/components/editor/save-as-dialog.tsx +75 -0
- package/src/web/components/extensions/extension-webview.tsx +111 -12
- package/src/web/components/layout/command-palette.tsx +43 -17
- package/src/web/components/layout/draggable-tab.tsx +120 -67
- package/src/web/components/layout/editor-panel.tsx +15 -4
- package/src/web/components/layout/mobile-nav.tsx +74 -7
- package/src/web/components/layout/tab-bar.tsx +76 -4
- package/src/web/components/layout/tab-content.tsx +12 -5
- package/src/web/components/layout/upgrade-banner.tsx +3 -0
- package/src/web/components/settings/keyboard-shortcuts-section.tsx +46 -1
- package/src/web/components/shared/markdown-code-block.tsx +142 -0
- package/src/web/components/shared/markdown-context.ts +20 -0
- package/src/web/components/shared/markdown-renderer.tsx +113 -288
- package/src/web/hooks/use-extension-ws.ts +22 -4
- package/src/web/hooks/use-global-keybindings.ts +31 -2
- package/src/web/hooks/use-url-sync.ts +8 -3
- package/src/web/main.tsx +1 -0
- package/src/web/stores/keybindings-store.ts +3 -3
- package/src/web/stores/panel-store.ts +2 -2
- package/src/web/stores/panel-utils.ts +17 -2
- package/src/web/stores/tab-store.ts +17 -1
- package/src/web/styles/globals.css +6 -0
- package/.opencode/.env.example +0 -98
- package/.opencode/skills/ads-management/scripts/.env.example +0 -13
- package/.opencode/skills/ai-multimodal/.env.example +0 -230
- package/.opencode/skills/cip-design/.env.example +0 -6
- package/.opencode/skills/devops/.env.example +0 -76
- package/.opencode/skills/docs-seeker/.env.example +0 -15
- package/.opencode/skills/elevenlabs/.env.example +0 -3
- package/.opencode/skills/marketing-dashboard/.env.example +0 -15
- package/.opencode/skills/marketing-dashboard/app/.env.example +0 -2
- package/.opencode/skills/marketing-dashboard/server/.env.example +0 -2
- package/.opencode/skills/mcp-management/scripts/dist/analyze-tools.js +0 -70
- package/.opencode/skills/mcp-management/scripts/dist/cli.js +0 -160
- package/.opencode/skills/mcp-management/scripts/dist/mcp-client.js +0 -183
- package/.opencode/skills/payment-integration/scripts/.env.example +0 -20
- package/.opencode/skills/sequential-thinking/.env.example +0 -8
- package/dist/web/assets/architecture-PBZL5I3N-DEO2f3VD.js +0 -1
- package/dist/web/assets/arrow-up-BYhx9ckd.js +0 -1
- package/dist/web/assets/channel-By7bn0Yq.js +0 -1
- package/dist/web/assets/chat-tab-CT2XUgsc.js +0 -10
- package/dist/web/assets/chevron-right-4zq1jPv6.js +0 -1
- package/dist/web/assets/chunk-GLR3WWYH-DKikpoJM.js +0 -2
- package/dist/web/assets/chunk-HHEYEP7N-C7vxA5i9.js +0 -1
- package/dist/web/assets/chunk-QZHKN3VN-CYaTbeZf.js +0 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-BA8Nj-_C.js +0 -1
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-DjYu-6mn.js +0 -1
- package/dist/web/assets/clone-LRxlvnMj.js +0 -1
- package/dist/web/assets/code-editor-DQiPtcNd.js +0 -8
- package/dist/web/assets/columns-2-BoZAN-iw.js +0 -1
- package/dist/web/assets/createLucideIcon-PuMiQgHl.js +0 -1
- package/dist/web/assets/diff-viewer-CTwcVIP_.js +0 -4
- package/dist/web/assets/dist-DIV6WgAG.js +0 -41
- package/dist/web/assets/extension-webview-pU1xJyoc.js +0 -3
- package/dist/web/assets/git-graph-BnFbmpom.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-Bwna3and.js +0 -1
- package/dist/web/assets/index-CP9KnaGh.js +0 -30
- package/dist/web/assets/index-Cxz7oGXY.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-_vRxVNUm.js +0 -1
- package/dist/web/assets/infoDiagram-LFFYTUFH-DWwumDkq.js +0 -2
- package/dist/web/assets/jsx-runtime-kMwlnEGE.js +0 -1
- package/dist/web/assets/keybindings-store-DdhEeehv.js +0 -1
- package/dist/web/assets/markdown-renderer-BjYurPV4.js +0 -326
- package/dist/web/assets/packet-RMMSAZCW-DY5PNnZU.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-BHncZutv.js +0 -1
- package/dist/web/assets/port-forwarding-tab-Bgr8dmsw.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-DH0AOkUy.js +0 -1
- package/dist/web/assets/settings-tab-BNoboN6E.js +0 -1
- package/dist/web/assets/sqlite-viewer-srSbGg1D.js +0 -1
- package/dist/web/assets/square-oPKIkJiw.js +0 -1
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-BGVqj_g9.js +0 -1
- package/dist/web/assets/table-DFevCOMd.js +0 -1
- package/dist/web/assets/tag-CXMT0QB6.js +0 -1
- package/dist/web/assets/text-wrap-BWNOVswA.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-B2Xkyv-K.js +0 -1
- package/dist/web/assets/x-D2_KzIET.js +0 -1
- package/src/web/components/git/git-graph-branch-label.tsx +0 -124
- package/src/web/components/git/git-graph-constants.ts +0 -185
- package/src/web/components/git/git-graph-detail.tsx +0 -107
- package/src/web/components/git/git-graph-dialog.tsx +0 -72
- package/src/web/components/git/git-graph-row.tsx +0 -167
- package/src/web/components/git/git-graph-settings-dialog.tsx +0 -104
- package/src/web/components/git/git-graph-svg.tsx +0 -54
- package/src/web/components/git/git-graph-toolbar.tsx +0 -195
- package/src/web/components/git/git-graph.tsx +0 -193
- package/src/web/components/git/use-column-resize.ts +0 -33
- package/src/web/components/git/use-git-graph.ts +0 -201
- /package/dist/web/assets/{api-client-BfBM3I7n.js → api-client-BvxmRZUi.js} +0 -0
- /package/dist/web/assets/{array-B9UHiPd-.js → array-BFDiaBgf.js} +0 -0
- /package/dist/web/assets/{csv-parser-CNNw2RVA.js → csv-parser-i7fjqP2H.js} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BW-DbntU.js → cytoscape.esm-C8i2jUzT.js} +0 -0
- /package/dist/web/assets/{defaultLocale-5eAKkKJC.js → defaultLocale-ZeknFqNe.js} +0 -0
- /package/dist/web/assets/{dist-CSJdAyA9.js → dist-DZmJeHOA.js} +0 -0
- /package/dist/web/assets/{init-DlZdxViB.js → init-0VJVrkRJ.js} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-B_v2FtYn.js → isArrayLikeObject-ClzWCpcm.js} +0 -0
- /package/dist/web/assets/{katex-Bqvo_ZG0.js → katex-DR0kdMDv.js} +0 -0
- /package/dist/web/assets/{lib-DurwGtQO.js → lib-CeBVkQ-7.js} +0 -0
- /package/dist/web/assets/{math-069Z4SuC.js → math-CRc16Nj6.js} +0 -0
- /package/dist/web/assets/{path-6uRLdFF7.js → path-INs8XTPH.js} +0 -0
- /package/dist/web/assets/{preload-helper-Bf_JiD2A.js → preload-helper-mr3rCizq.js} +0 -0
- /package/dist/web/assets/{react-SKk5z-bm.js → react-0tkk-ztn.js} +0 -0
- /package/dist/web/assets/{rough.esm-JX0wREDd.js → rough.esm-eLccZ4OJ.js} +0 -0
- /package/dist/web/assets/{sql-completion-provider-DM9Qov6L.js → sql-completion-provider-B8uUWWej.js} +0 -0
- /package/dist/web/assets/{src-BqX54PbV.js → src-CqyWLlNZ.js} +0 -0
- /package/dist/web/assets/{utils-BNytJOb1.js → utils-DX8jb5qv.js} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-C72U2L5F-D21mS_6G.js";export{e as createPacketServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-XIRO2GV7-Djlmrely.js";export{e as createPieServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./chunk-CFjPhJqf.js";import{t}from"./react-nm2Ru1Pt.js";import"./react-dom-Bpkvzu3U.js";import{t as n}from"./createLucideIcon-PuMiQgHl.js";import{t as r}from"./square-oPKIkJiw.js";import{t as i}from"./jsx-runtime-kMwlnEGE.js";import{t as a}from"./api-client-BfBM3I7n.js";import{Dt as o,Pt as s,X as c,ht as l,pt as u,wt as d}from"./index-CP9KnaGh.js";var f=n(`wifi`,[[`path`,{d:`M12 20h.01`,key:`zekei9`}],[`path`,{d:`M2 8.82a15 15 0 0 1 20 0`,key:`dnpr2z`}],[`path`,{d:`M5 12.859a10 10 0 0 1 14 0`,key:`1x1e6c`}],[`path`,{d:`M8.5 16.429a5 5 0 0 1 7 0`,key:`1bycff`}]]),p=e(t(),1),m=i();function h(){let[e,t]=(0,p.useState)(``),[n,i]=(0,p.useState)([]),[h,g]=(0,p.useState)(!1),[_,v]=(0,p.useState)(null),[y,b]=(0,p.useState)(null),x=(0,p.useCallback)(async()=>{try{i(await a.get(`/api/preview/tunnels`))}catch(e){console.warn(`[ports] failed to fetch tunnels`,e)}},[]);(0,p.useEffect)(()=>{x();let e=setInterval(x,1e4);return()=>clearInterval(e)},[x]);let S=async e=>{let r=n.find(t=>t.port===e);if(r){window.open(r.url,`_blank`),t(``);return}g(!0),v(null);try{let n=await a.post(`/api/preview/tunnel`,{port:e});window.open(n.url,`_blank`),t(``),await x()}catch(t){v(t.message||`Failed to start tunnel for port ${e}`)}finally{g(!1)}},C=async e=>{try{await a.del(`/api/preview/tunnel/${e}`),await x()}catch(t){c.error(t.message||`Failed to stop tunnel for port ${e}`)}},w=(e,t)=>{navigator.clipboard.writeText(t).then(()=>{b(e),c.success(`URL copied`),setTimeout(()=>b(null),2e3)}).catch(()=>{c.error(`Failed to copy URL`)})};return(0,m.jsxs)(`div`,{className:`flex flex-col h-full w-full bg-background`,children:[(0,m.jsxs)(`div`,{className:`p-4 md:p-6 border-b border-border bg-surface`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2 mb-3`,children:[(0,m.jsx)(f,{className:`size-5 text-primary`}),(0,m.jsx)(`h2`,{className:`text-base font-medium text-text-primary`,children:`Port Forwarding`})]}),(0,m.jsxs)(`form`,{onSubmit:t=>{t.preventDefault();let n=parseInt(e,10);n>=1&&n<=65535?S(n):v(`Port must be 1-65535`)},className:`flex items-center gap-2`,children:[(0,m.jsxs)(`div`,{className:`flex-1 flex items-center gap-2 px-3 py-2.5 rounded-lg bg-background border border-border focus-within:border-primary/50 transition-colors`,children:[(0,m.jsx)(`span`,{className:`text-sm text-text-subtle shrink-0`,children:`localhost:`}),(0,m.jsx)(`input`,{type:`number`,value:e,onChange:e=>{t(e.target.value),v(null)},placeholder:`3000`,min:1,max:65535,className:`flex-1 bg-transparent text-sm text-text-primary outline-none placeholder:text-text-subtle min-w-0 [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none`})]}),(0,m.jsx)(`button`,{type:`submit`,disabled:h||!e,className:`px-4 py-2.5 rounded-lg bg-primary text-primary-foreground text-sm font-medium hover:bg-primary/90 disabled:opacity-50 transition-colors shrink-0 min-w-[72px] flex items-center justify-center`,children:h?(0,m.jsx)(u,{className:`size-4 animate-spin`}):`Forward`})]}),_&&(0,m.jsx)(`p`,{className:`text-sm text-red-400 mt-2`,children:_}),h&&(0,m.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-text-secondary mt-2`,children:[(0,m.jsx)(u,{className:`size-3.5 animate-spin`}),(0,m.jsx)(`span`,{children:`Starting tunnel...`})]})]}),(0,m.jsx)(`div`,{className:`flex-1 overflow-y-auto p-4 md:p-6`,children:n.length===0?(0,m.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-center`,children:[(0,m.jsx)(l,{className:`size-10 text-text-subtle`}),(0,m.jsx)(`p`,{className:`text-sm text-text-secondary max-w-xs`,children:`No active ports. Forward a port to access your local dev server from anywhere.`})]}):(0,m.jsx)(`div`,{className:`space-y-2`,children:n.map(e=>(0,m.jsxs)(`div`,{className:`flex items-center gap-3 p-3 rounded-lg bg-surface border border-border`,children:[(0,m.jsxs)(`div`,{className:`shrink-0 px-2 py-1 rounded bg-primary/10 text-primary text-xs font-mono font-medium`,children:[`:`,e.port]}),(0,m.jsx)(`span`,{className:`flex-1 text-xs text-text-secondary truncate min-w-0`,children:e.url}),(0,m.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(0,m.jsx)(`button`,{onClick:()=>window.open(e.url,`_blank`),className:`p-2.5 rounded-md hover:bg-surface-elevated transition-colors`,title:`Open in browser`,children:(0,m.jsx)(d,{className:`size-4 text-text-secondary`})}),(0,m.jsx)(`button`,{onClick:()=>w(e.port,e.url),className:`p-2.5 rounded-md hover:bg-surface-elevated transition-colors`,title:`Copy URL`,children:y===e.port?(0,m.jsx)(s,{className:`size-4 text-green-400`}):(0,m.jsx)(o,{className:`size-4 text-text-secondary`})}),(0,m.jsx)(`button`,{onClick:()=>C(e.port),className:`p-2.5 rounded-md hover:bg-red-500/10 transition-colors`,title:`Stop tunnel`,children:(0,m.jsx)(r,{className:`size-4 text-red-400`})})]})]},e.port))})})]})}export{h as PortForwardingTab};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-L3YUKLVL-C7qGJrfV.js";export{e as createRadarServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./react-nm2Ru1Pt.js";import"./react-dom-Bpkvzu3U.js";import"./jsx-runtime-kMwlnEGE.js";import"./dist-DIV6WgAG.js";import"./api-client-BfBM3I7n.js";import"./api-settings-Bn-bIxD1.js";import{o as e}from"./index-CP9KnaGh.js";export{e as SettingsTab};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e}from"./chunk-CFjPhJqf.js";import{t}from"./react-nm2Ru1Pt.js";import{t as n}from"./chevron-right-4zq1jPv6.js";import{t as r}from"./table-DFevCOMd.js";import{t as i}from"./jsx-runtime-kMwlnEGE.js";import{i as a,t as o}from"./api-client-BfBM3I7n.js";import{Et as s,Nt as c,Q as l,jt as u,pt as d,rt as f}from"./index-CP9KnaGh.js";import"./use-monaco-theme-BHn-LEm7.js";import{t as p}from"./sql-query-editor-CY61vWBg.js";import{n as m,r as h,t as g}from"./lib-DurwGtQO.js";var _=e(t(),1);function v(e,t,n){let[r,i]=(0,_.useState)([]),[s,c]=(0,_.useState)(null),[l,u]=(0,_.useState)(null),[d,f]=(0,_.useState)([]),[p,m]=(0,_.useState)(!1),[h,g]=(0,_.useState)(null),[v,y]=(0,_.useState)(1),[b,x]=(0,_.useState)(null),[S,C]=(0,_.useState)(null),[w,T]=(0,_.useState)(!1),E=n?`/api/db/connections/${n}`:null,D=E??`${a(e)}/sqlite`,O=E?``:`path=${encodeURIComponent(t)}`,k=(0,_.useCallback)(async()=>{m(!0),g(null);try{let e=E?`?cached=1`:O?`?${O}`:``,t=await o.get(`${D}/tables${e}`);i(t),!E&&t.length>0&&!s&&c(t[0].name)}catch(e){g(e.message)}finally{m(!1)}},[D,O,E]);(0,_.useEffect)(()=>{k()},[k]);let A=(0,_.useCallback)(async()=>{if(s){m(!0);try{let e=O?`${O}&`:``,[t,n]=await Promise.all([o.get(`${D}/data?${e}table=${encodeURIComponent(s)}&page=${v}&limit=100`),o.get(`${D}/schema?${e}table=${encodeURIComponent(s)}`)]);u(t),f(n)}catch(e){g(e.message)}finally{m(!1)}}},[D,O,s,v]);return(0,_.useEffect)(()=>{A()},[A]),{tables:r,selectedTable:s,selectTable:(0,_.useCallback)(e=>{c(e),y(1),x(null)},[]),tableData:l,schema:d,loading:p,error:h,page:v,setPage:y,queryResult:b,queryError:S,queryLoading:w,executeQuery:(0,_.useCallback)(async e=>{T(!0),C(null);try{let n=E?{sql:e}:{path:t,sql:e},r=await o.post(`${D}/query`,n);x(r),r.changeType===`modify`&&A()}catch(e){C(e.message)}finally{T(!1)}},[D,E,t,A]),updateCell:(0,_.useCallback)(async(e,n,r)=>{if(s)try{E?await o.put(`${D}/cell`,{table:s,pkColumn:`rowid`,pkValue:e,column:n,value:r}):await o.put(`${D}/cell`,{path:t,table:s,rowid:e,column:n,value:r}),A()}catch(e){g(e.message)}},[D,E,t,s,A]),deleteRow:(0,_.useCallback)(async e=>{if(s)try{E?await o.del(`${D}/row`,{table:s,pkColumn:`rowid`,pkValue:e}):await o.del(`${D}/row`,{path:t,table:s,rowid:e}),A(),k()}catch(e){g(e.message)}},[D,E,t,s,A,k]),refreshTables:k,refreshData:A}}var y=i();function b({tables:e,selectedTable:t,onSelect:n,onRefresh:i}){return(0,y.jsxs)(`div`,{className:`w-48 shrink-0 flex flex-col bg-background overflow-hidden`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-2 border-b border-border`,children:[(0,y.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Tables`}),(0,y.jsx)(`button`,{type:`button`,onClick:i,className:`text-muted-foreground hover:text-foreground transition-colors`,title:`Refresh tables`,children:(0,y.jsx)(f,{className:`size-3`})})]}),(0,y.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[e.map(e=>(0,y.jsxs)(`button`,{type:`button`,onClick:()=>n(e.name),className:`w-full flex items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors ${t===e.name?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/50 hover:text-foreground`}`,children:[(0,y.jsx)(r,{className:`size-3 shrink-0`}),(0,y.jsx)(`span`,{className:`truncate flex-1`,children:e.name}),(0,y.jsx)(`span`,{className:`text-[10px] opacity-60`,children:e.rowCount})]},e.name)),e.length===0&&(0,y.jsx)(`p`,{className:`px-3 py-4 text-xs text-muted-foreground text-center`,children:`No tables found`})]})]})}function x({tableData:e,schema:t,loading:r,page:i,onPageChange:a,onCellUpdate:o,onRowDelete:s}){if(!e)return(0,y.jsx)(`div`,{className:`flex items-center justify-center h-full text-xs text-muted-foreground`,children:r?(0,y.jsx)(d,{className:`size-4 animate-spin`}):`Select a table`});let l=Math.ceil(e.total/e.limit)||1;return(0,y.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,y.jsx)(`div`,{className:`flex-1 overflow-auto`,children:(0,y.jsx)(S,{columns:e.columns,rows:e.rows,schema:t,onCellUpdate:o,onRowDelete:s})}),(0,y.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-1.5 border-t border-border bg-background shrink-0 text-xs text-muted-foreground`,children:[(0,y.jsxs)(`span`,{children:[e.total.toLocaleString(),` rows`]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`button`,{type:`button`,disabled:i<=1,onClick:()=>a(i-1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,y.jsx)(c,{className:`size-3.5`})}),(0,y.jsxs)(`span`,{children:[i,` / `,l]}),(0,y.jsx)(`button`,{type:`button`,disabled:i>=l,onClick:()=>a(i+1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,y.jsx)(n,{className:`size-3.5`})})]})]})]})}function S({columns:e,rows:t,schema:n,onCellUpdate:r,onRowDelete:i}){let[a,o]=(0,_.useState)(null),[s,c]=(0,_.useState)(``),[u,d]=(0,_.useState)(null),f=(0,_.useMemo)(()=>new Set(n.filter(e=>e.pk).map(e=>e.name)),[n]),p=(0,_.useCallback)((e,t,n)=>{t!==`rowid`&&(o({rowIdx:e,col:t}),c(n==null?``:String(n)))},[]),v=(0,_.useCallback)(()=>{if(!a)return;let e=t[a.rowIdx];if(!e)return;let n=e.rowid,i=e[a.col];String(i??``)!==s&&r(n,a.col,s===``?null:s),o(null)},[a,s,t,r]),b=(0,_.useCallback)(()=>o(null),[]),x=(0,_.useCallback)(e=>{let n=t[e];!n||!i||(i(n.rowid),d(null))},[t,i]),S=m({data:t,columns:(0,_.useMemo)(()=>{let t=e.map(e=>({id:e,accessorFn:t=>t[e],header:()=>(0,y.jsx)(`span`,{className:`${f.has(e)?`font-bold`:``} ${e===`rowid`?`text-muted-foreground/50`:``}`,children:e}),cell:({row:t,getValue:n})=>{let r=t.index,i=a?.rowIdx===r&&a?.col===e,o=n();return i?(0,y.jsx)(`input`,{autoFocus:!0,className:`w-full bg-transparent border border-primary/50 rounded px-1 py-0 text-xs outline-none`,value:s,onChange:e=>c(e.target.value),onBlur:v,onKeyDown:e=>{e.key===`Enter`&&v(),e.key===`Escape`&&b()}}):(0,y.jsx)(`span`,{className:`cursor-pointer truncate block ${o==null?`text-muted-foreground/40 italic`:``} ${e===`rowid`?`text-muted-foreground/50`:``}`,onDoubleClick:()=>p(r,e,o),title:o==null?`NULL`:String(o),children:o==null?`NULL`:String(o)})}}));return i&&t.push({id:`_actions`,header:()=>null,cell:({row:e})=>{let t=e.index;return u===t?(0,y.jsxs)(`span`,{className:`flex items-center gap-1 whitespace-nowrap`,children:[(0,y.jsx)(`button`,{type:`button`,onClick:()=>x(t),className:`text-destructive text-[10px] font-medium hover:underline`,children:`Confirm`}),(0,y.jsx)(`button`,{type:`button`,onClick:()=>d(null),className:`text-muted-foreground text-[10px] hover:underline`,children:`Cancel`})]}):(0,y.jsx)(`button`,{type:`button`,onClick:()=>d(t),className:`p-0.5 rounded opacity-0 group-hover:opacity-100 hover:bg-destructive/10 hover:text-destructive transition-opacity`,title:`Delete row`,children:(0,y.jsx)(l,{className:`size-3`})})},size:60}),t},[e,f,a,s,v,b,p,i,u,x]),getCoreRowModel:h()});return(0,y.jsxs)(`table`,{className:`w-full text-xs border-collapse`,children:[(0,y.jsx)(`thead`,{className:`sticky top-0 z-10 bg-muted`,children:S.getHeaderGroups().map(e=>(0,y.jsx)(`tr`,{children:e.headers.map(e=>(0,y.jsx)(`th`,{className:`px-2 py-1.5 text-left font-medium text-muted-foreground border-b border-border whitespace-nowrap`,children:g(e.column.columnDef.header,e.getContext())},e.id))},e.id))}),(0,y.jsxs)(`tbody`,{children:[S.getRowModel().rows.map(e=>(0,y.jsx)(`tr`,{className:`group hover:bg-muted/30 border-b border-border/50`,children:e.getVisibleCells().map(e=>(0,y.jsx)(`td`,{className:`px-2 py-1 max-w-[300px]`,children:g(e.column.columnDef.cell,e.getContext())},e.id))},e.id)),t.length===0&&(0,y.jsx)(`tr`,{children:(0,y.jsx)(`td`,{colSpan:e.length,className:`px-2 py-8 text-center text-muted-foreground`,children:`No data`})})]})]})}function C({onExecute:e,loading:t}){return(0,y.jsx)(p,{onExecute:e,loading:t})}function w({metadata:e}){let t=e?.filePath,n=e?.projectName,r=e?.connectionId,i=e?.tableName,[a,o]=(0,_.useState)(!1);return r?(0,y.jsx)(T,{projectName:``,dbPath:``,connectionId:r,connectionName:e?.connectionName,initialTable:i,queryPanelOpen:a,onToggleQueryPanel:()=>o(e=>!e),hideTableList:!0}):!t||!n?(0,y.jsxs)(`div`,{className:`flex items-center justify-center h-full text-text-secondary text-sm`,children:[(0,y.jsx)(s,{className:`size-5 mr-2`}),` No database file selected.`]}):(0,y.jsx)(T,{projectName:n,dbPath:t,queryPanelOpen:a,onToggleQueryPanel:()=>o(e=>!e)})}function T({projectName:e,dbPath:t,connectionId:n,connectionName:r,initialTable:i,queryPanelOpen:a,onToggleQueryPanel:o,hideTableList:c}){let l=v(e,t,n),f=(0,_.useRef)(!1);return(0,_.useEffect)(()=>{i&&!f.current&&l.tables.length>0&&(f.current=!0,l.selectTable(i))},[i,l.tables]),l.error&&l.tables.length===0?(0,y.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,y.jsx)(u,{className:`size-10 text-destructive`}),(0,y.jsx)(`p`,{className:`text-sm`,children:l.error})]}):l.loading&&l.tables.length===0?(0,y.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-text-secondary`,children:[(0,y.jsx)(d,{className:`size-5 animate-spin`}),(0,y.jsx)(`span`,{className:`text-sm`,children:`Loading database...`})]}):(0,y.jsxs)(`div`,{className:`flex h-full w-full overflow-hidden`,children:[!c&&(0,y.jsx)(b,{tables:l.tables,selectedTable:l.selectedTable,onSelect:l.selectTable,onRefresh:l.refreshTables}),(0,y.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden ${c?``:`border-l border-border`}`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,y.jsx)(s,{className:`size-3.5 text-muted-foreground`}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:r??t}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:l.selectedTable&&`/ ${l.selectedTable}`}),(0,y.jsx)(`div`,{className:`ml-auto`,children:(0,y.jsx)(`button`,{type:`button`,onClick:o,className:`px-2 py-1 rounded text-xs transition-colors ${a?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:`SQL`})})]}),(0,y.jsx)(`div`,{className:`flex-1 overflow-hidden ${a?`max-h-[60%]`:``}`,children:(0,y.jsx)(x,{tableData:l.tableData,schema:l.schema,loading:l.loading,page:l.page,onPageChange:l.setPage,onCellUpdate:l.updateCell,onRowDelete:l.deleteRow})}),a&&(0,y.jsx)(`div`,{className:`border-t border-border h-[40%] shrink-0`,children:(0,y.jsx)(C,{onExecute:l.executeQuery,loading:l.queryLoading})})]})]})}export{w as SqliteViewer};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`square`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-GEFDOKGD-D-pKjlVd.js";import{h as e}from"./src-BqX54PbV.js";import"./chunk-7R4GIKGN-Dv-4cAYn.js";import"./dist-CSJdAyA9.js";import"./chunk-PU5JKC2W-ek7k4QVB.js";import"./chunk-MX3YWQON-BpS_PtKp.js";import"./chunk-YBOYWFTD-rQG3QH5s.js";import"./chunk-55IACEB6-DJ6BynZ4.js";import"./chunk-KX2RTZJC-CRq1OBZv.js";import"./chunk-PQ6SQG4A-TF58UVMU.js";import"./chunk-KYZI473N-Bb0MCaIO.js";import"./chunk-O4XLMI2P-nDhi_cVu.js";import"./chunk-GLR3WWYH-DKikpoJM.js";import{i as t,n,r,t as i}from"./chunk-NQ4KR5QH-z_blpjxi.js";var a={parser:n,get db(){return new i(2)},renderer:r,styles:t,init:e(e=>{e.state||={},e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`table`,[[`path`,{d:`M12 3v18`,key:`108xh3`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M3 15h18`,key:`5xshup`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`tag`,[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`,key:`vktsd0`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`kqv944`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`text-wrap`,[[`path`,{d:`m16 16-3 3 3 3`,key:`117b85`}],[`path`,{d:`M3 12h14.5a1 1 0 0 1 0 7H13`,key:`18xa6z`}],[`path`,{d:`M3 19h6`,key:`1ygdsz`}],[`path`,{d:`M3 5h18`,key:`1u36vt`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-OZEHJAEY-BXhYx3nO.js";export{e as createTreemapServices};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),n=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t as n,n as t};
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
GitBranch,
|
|
3
|
-
GitMerge,
|
|
4
|
-
Trash2,
|
|
5
|
-
ArrowUpFromLine,
|
|
6
|
-
ExternalLink,
|
|
7
|
-
Tag,
|
|
8
|
-
} from "lucide-react";
|
|
9
|
-
import {
|
|
10
|
-
ContextMenu,
|
|
11
|
-
ContextMenuContent,
|
|
12
|
-
ContextMenuItem,
|
|
13
|
-
ContextMenuSeparator,
|
|
14
|
-
ContextMenuTrigger,
|
|
15
|
-
} from "@/components/ui/context-menu";
|
|
16
|
-
import type { GitBranch as GitBranchType } from "../../../types/git";
|
|
17
|
-
|
|
18
|
-
interface BranchLabelProps {
|
|
19
|
-
name: string;
|
|
20
|
-
type: "branch" | "tag";
|
|
21
|
-
remotes: string[];
|
|
22
|
-
isCurrent: boolean;
|
|
23
|
-
color: string;
|
|
24
|
-
currentBranch: GitBranchType | undefined;
|
|
25
|
-
onCheckout: (ref: string) => void;
|
|
26
|
-
onMerge: (source: string) => void;
|
|
27
|
-
onPush: (branch: string) => void;
|
|
28
|
-
onCreatePr: (branch: string) => void;
|
|
29
|
-
onDelete: (name: string) => void;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function BranchLabel({
|
|
33
|
-
name,
|
|
34
|
-
type,
|
|
35
|
-
remotes,
|
|
36
|
-
isCurrent,
|
|
37
|
-
color,
|
|
38
|
-
currentBranch,
|
|
39
|
-
onCheckout,
|
|
40
|
-
onMerge,
|
|
41
|
-
onPush,
|
|
42
|
-
onCreatePr,
|
|
43
|
-
onDelete,
|
|
44
|
-
}: BranchLabelProps) {
|
|
45
|
-
if (type === "tag") {
|
|
46
|
-
return (
|
|
47
|
-
<span className="inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-medium shrink-0 bg-amber-500/20 text-amber-500 border border-amber-500/30">
|
|
48
|
-
<Tag className="size-2.5" />
|
|
49
|
-
{name}
|
|
50
|
-
</span>
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return (
|
|
55
|
-
<ContextMenu>
|
|
56
|
-
<ContextMenuTrigger asChild>
|
|
57
|
-
<span
|
|
58
|
-
className="inline-flex items-center rounded text-[10px] font-medium shrink-0 cursor-context-menu overflow-hidden"
|
|
59
|
-
style={{
|
|
60
|
-
border: isCurrent
|
|
61
|
-
? `1.5px solid ${color}`
|
|
62
|
-
: `1px solid ${color}50`,
|
|
63
|
-
}}
|
|
64
|
-
>
|
|
65
|
-
{/* Branch name segment */}
|
|
66
|
-
<span
|
|
67
|
-
className="inline-flex items-center gap-0.5 px-1.5 py-0.5"
|
|
68
|
-
style={{
|
|
69
|
-
backgroundColor: isCurrent ? color : `${color}30`,
|
|
70
|
-
color: isCurrent ? "#fff" : color,
|
|
71
|
-
}}
|
|
72
|
-
>
|
|
73
|
-
<GitBranch className="size-2.5" />
|
|
74
|
-
{name}
|
|
75
|
-
</span>
|
|
76
|
-
{/* Remote indicators (italic, separated by border) */}
|
|
77
|
-
{remotes.map((remote) => (
|
|
78
|
-
<span
|
|
79
|
-
key={remote}
|
|
80
|
-
className="px-1.5 py-0.5 italic opacity-70"
|
|
81
|
-
style={{
|
|
82
|
-
borderLeft: `1px solid ${color}40`,
|
|
83
|
-
color,
|
|
84
|
-
backgroundColor: `${color}15`,
|
|
85
|
-
}}
|
|
86
|
-
>
|
|
87
|
-
{remote}
|
|
88
|
-
</span>
|
|
89
|
-
))}
|
|
90
|
-
</span>
|
|
91
|
-
</ContextMenuTrigger>
|
|
92
|
-
<ContextMenuContent>
|
|
93
|
-
<ContextMenuItem onClick={() => onCheckout(name)}>
|
|
94
|
-
Checkout
|
|
95
|
-
</ContextMenuItem>
|
|
96
|
-
<ContextMenuItem
|
|
97
|
-
onClick={() => onMerge(name)}
|
|
98
|
-
disabled={name === currentBranch?.name}
|
|
99
|
-
>
|
|
100
|
-
<GitMerge className="size-3" />
|
|
101
|
-
Merge into current
|
|
102
|
-
</ContextMenuItem>
|
|
103
|
-
<ContextMenuSeparator />
|
|
104
|
-
<ContextMenuItem onClick={() => onPush(name)}>
|
|
105
|
-
<ArrowUpFromLine className="size-3" />
|
|
106
|
-
Push
|
|
107
|
-
</ContextMenuItem>
|
|
108
|
-
<ContextMenuItem onClick={() => onCreatePr(name)}>
|
|
109
|
-
<ExternalLink className="size-3" />
|
|
110
|
-
Create PR
|
|
111
|
-
</ContextMenuItem>
|
|
112
|
-
<ContextMenuSeparator />
|
|
113
|
-
<ContextMenuItem
|
|
114
|
-
variant="destructive"
|
|
115
|
-
onClick={() => onDelete(name)}
|
|
116
|
-
disabled={name === currentBranch?.name}
|
|
117
|
-
>
|
|
118
|
-
<Trash2 className="size-3" />
|
|
119
|
-
Delete
|
|
120
|
-
</ContextMenuItem>
|
|
121
|
-
</ContextMenuContent>
|
|
122
|
-
</ContextMenu>
|
|
123
|
-
);
|
|
124
|
-
}
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import type { GitGraphData } from "../../../types/git";
|
|
2
|
-
|
|
3
|
-
export const LANE_COLORS = [
|
|
4
|
-
"#0085d9", "#d73a49", "#6f42c1", "#2cbe4e", "#e36209",
|
|
5
|
-
"#005cc5", "#b31d28", "#5a32a3", "#22863a", "#cb2431",
|
|
6
|
-
];
|
|
7
|
-
|
|
8
|
-
export const ROW_HEIGHT = 24;
|
|
9
|
-
export const LANE_WIDTH = 16;
|
|
10
|
-
export const NODE_RADIUS = 4;
|
|
11
|
-
|
|
12
|
-
/** Build commit → branch/tag label map (shows local + remote-only branches) */
|
|
13
|
-
export function buildCommitLabels(data: GitGraphData | null) {
|
|
14
|
-
const labels = new Map<string, Array<{ name: string; type: "branch" | "tag"; remotes: string[]; current: boolean }>>();
|
|
15
|
-
if (!data) return labels;
|
|
16
|
-
|
|
17
|
-
// Collect which remote branches are already covered by a local branch
|
|
18
|
-
const coveredRemotes = new Set<string>();
|
|
19
|
-
for (const branch of data.branches) {
|
|
20
|
-
if (!branch.remote) {
|
|
21
|
-
for (const remote of branch.remotes) {
|
|
22
|
-
coveredRemotes.add(`remotes/${remote}/${branch.name}`);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
for (const branch of data.branches) {
|
|
28
|
-
if (branch.remote) {
|
|
29
|
-
// Show remote-only branches (not covered by a local branch)
|
|
30
|
-
if (coveredRemotes.has(branch.name)) continue;
|
|
31
|
-
const arr = labels.get(branch.commitHash) ?? [];
|
|
32
|
-
// Display as "remote/branch" (strip "remotes/" prefix)
|
|
33
|
-
const displayName = branch.name.replace(/^remotes\//, "");
|
|
34
|
-
arr.push({ name: displayName, type: "branch", remotes: [], current: false });
|
|
35
|
-
labels.set(branch.commitHash, arr);
|
|
36
|
-
} else {
|
|
37
|
-
const arr = labels.get(branch.commitHash) ?? [];
|
|
38
|
-
arr.push({ name: branch.name, type: "branch", remotes: branch.remotes, current: branch.current });
|
|
39
|
-
labels.set(branch.commitHash, arr);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
for (const commit of data.commits) {
|
|
44
|
-
for (const ref of commit.refs) {
|
|
45
|
-
if (ref.startsWith("tag: ")) {
|
|
46
|
-
const tagName = ref.replace("tag: ", "");
|
|
47
|
-
const arr = labels.get(commit.hash) ?? [];
|
|
48
|
-
arr.push({ name: tagName, type: "tag", remotes: [], current: false });
|
|
49
|
-
labels.set(commit.hash, arr);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return labels;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** Lane assignment algorithm — recycles freed lanes to keep graph compact */
|
|
57
|
-
export function computeLanes(data: GitGraphData | null) {
|
|
58
|
-
const map = new Map<string, number>();
|
|
59
|
-
if (!data) return { laneMap: map, maxLane: 0, unloadedParentLanes: new Map<string, number>() };
|
|
60
|
-
|
|
61
|
-
let nextLane = 0;
|
|
62
|
-
let maxLaneUsed = 0;
|
|
63
|
-
const activeLanes = new Map<string, number>();
|
|
64
|
-
const commitSet = new Set(data.commits.map((c) => c.hash));
|
|
65
|
-
const freeLanes: number[] = [];
|
|
66
|
-
|
|
67
|
-
const allocLane = () => {
|
|
68
|
-
if (freeLanes.length > 0) {
|
|
69
|
-
freeLanes.sort((a, b) => a - b);
|
|
70
|
-
return freeLanes.shift()!;
|
|
71
|
-
}
|
|
72
|
-
return nextLane++;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
for (const commit of data.commits) {
|
|
76
|
-
let lane = activeLanes.get(commit.hash);
|
|
77
|
-
if (lane === undefined) lane = allocLane();
|
|
78
|
-
map.set(commit.hash, lane);
|
|
79
|
-
if (lane > maxLaneUsed) maxLaneUsed = lane;
|
|
80
|
-
activeLanes.delete(commit.hash);
|
|
81
|
-
|
|
82
|
-
let laneReused = false;
|
|
83
|
-
for (let i = 0; i < commit.parents.length; i++) {
|
|
84
|
-
const parent = commit.parents[i]!;
|
|
85
|
-
if (!activeLanes.has(parent)) {
|
|
86
|
-
if (i === 0) {
|
|
87
|
-
activeLanes.set(parent, lane);
|
|
88
|
-
laneReused = true;
|
|
89
|
-
} else {
|
|
90
|
-
const newLane = allocLane();
|
|
91
|
-
activeLanes.set(parent, newLane);
|
|
92
|
-
if (newLane > maxLaneUsed) maxLaneUsed = newLane;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (!laneReused) freeLanes.push(lane);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const unloadedParentLanes = new Map<string, number>();
|
|
100
|
-
for (const [hash, lane] of activeLanes) {
|
|
101
|
-
if (!commitSet.has(hash)) unloadedParentLanes.set(hash, lane);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return { laneMap: map, maxLane: maxLaneUsed, unloadedParentLanes };
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/** Build SVG paths for connections (including unloaded parent extension) */
|
|
108
|
-
export function computeSvgPaths(
|
|
109
|
-
data: GitGraphData | null,
|
|
110
|
-
laneMap: Map<string, number>,
|
|
111
|
-
unloadedParentLanes: Map<string, number>,
|
|
112
|
-
totalHeight: number,
|
|
113
|
-
) {
|
|
114
|
-
if (!data) return [];
|
|
115
|
-
const paths: Array<{ d: string; color: string }> = [];
|
|
116
|
-
const commitSet = new Set(data.commits.map((c) => c.hash));
|
|
117
|
-
|
|
118
|
-
for (let idx = 0; idx < data.commits.length; idx++) {
|
|
119
|
-
const commit = data.commits[idx]!;
|
|
120
|
-
const lane = laneMap.get(commit.hash) ?? 0;
|
|
121
|
-
const color = LANE_COLORS[lane % LANE_COLORS.length]!;
|
|
122
|
-
|
|
123
|
-
for (const parentHash of commit.parents) {
|
|
124
|
-
const parentIdx = data.commits.findIndex((c) => c.hash === parentHash);
|
|
125
|
-
|
|
126
|
-
if (parentIdx >= 0) {
|
|
127
|
-
// Parent is loaded — draw connection
|
|
128
|
-
const parentLane = laneMap.get(parentHash) ?? 0;
|
|
129
|
-
const parentColor = LANE_COLORS[parentLane % LANE_COLORS.length]!;
|
|
130
|
-
const x1 = lane * LANE_WIDTH + LANE_WIDTH / 2;
|
|
131
|
-
const y1 = idx * ROW_HEIGHT + ROW_HEIGHT / 2;
|
|
132
|
-
const x2 = parentLane * LANE_WIDTH + LANE_WIDTH / 2;
|
|
133
|
-
const y2 = parentIdx * ROW_HEIGHT + ROW_HEIGHT / 2;
|
|
134
|
-
|
|
135
|
-
let d: string;
|
|
136
|
-
const isMerge = commit.parents.indexOf(parentHash) > 0;
|
|
137
|
-
if (x1 === x2) {
|
|
138
|
-
d = `M ${x1} ${y1} L ${x2} ${y2}`;
|
|
139
|
-
} else if (isMerge) {
|
|
140
|
-
const curveEnd = y1 + ROW_HEIGHT;
|
|
141
|
-
d = `M ${x1} ${y1} C ${x1} ${curveEnd} ${x2} ${y1} ${x2} ${curveEnd} L ${x2} ${y2}`;
|
|
142
|
-
} else {
|
|
143
|
-
const curveStart = y2 - ROW_HEIGHT;
|
|
144
|
-
d = `M ${x1} ${y1} L ${x1} ${curveStart} C ${x1} ${y2} ${x2} ${curveStart} ${x2} ${y2}`;
|
|
145
|
-
}
|
|
146
|
-
const lineColor = commit.parents.indexOf(parentHash) === 0 ? color : parentColor;
|
|
147
|
-
paths.push({ d, color: lineColor });
|
|
148
|
-
} else if (!commitSet.has(parentHash)) {
|
|
149
|
-
// Parent NOT loaded — use the parent's assigned lane for the extension line
|
|
150
|
-
const parentLane = unloadedParentLanes.get(parentHash) ?? lane;
|
|
151
|
-
const parentColor = LANE_COLORS[parentLane % LANE_COLORS.length]!;
|
|
152
|
-
const x1 = lane * LANE_WIDTH + LANE_WIDTH / 2;
|
|
153
|
-
const y1 = idx * ROW_HEIGHT + ROW_HEIGHT / 2;
|
|
154
|
-
const x2 = parentLane * LANE_WIDTH + LANE_WIDTH / 2;
|
|
155
|
-
|
|
156
|
-
if (x1 === x2) {
|
|
157
|
-
// Same lane — straight down
|
|
158
|
-
paths.push({ d: `M ${x1} ${y1} L ${x1} ${totalHeight}`, color });
|
|
159
|
-
} else {
|
|
160
|
-
// Different lane — curve then straight down
|
|
161
|
-
const curveEnd = y1 + ROW_HEIGHT;
|
|
162
|
-
const d = `M ${x1} ${y1} C ${x1} ${curveEnd} ${x2} ${y1} ${x2} ${curveEnd} L ${x2} ${totalHeight}`;
|
|
163
|
-
paths.push({ d, color: parentColor });
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return paths;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
export function relativeDate(dateStr: string): string {
|
|
172
|
-
const date = new Date(dateStr);
|
|
173
|
-
const now = new Date();
|
|
174
|
-
const diffMs = now.getTime() - date.getTime();
|
|
175
|
-
const diffMins = Math.floor(diffMs / 60000);
|
|
176
|
-
if (diffMins < 1) return "just now";
|
|
177
|
-
if (diffMins < 60) return `${diffMins}m ago`;
|
|
178
|
-
const diffHours = Math.floor(diffMins / 60);
|
|
179
|
-
if (diffHours < 24) return `${diffHours}h ago`;
|
|
180
|
-
const diffDays = Math.floor(diffHours / 24);
|
|
181
|
-
if (diffDays < 30) return `${diffDays}d ago`;
|
|
182
|
-
const diffMonths = Math.floor(diffDays / 30);
|
|
183
|
-
if (diffMonths < 12) return `${diffMonths}mo ago`;
|
|
184
|
-
return `${Math.floor(diffMonths / 12)}y ago`;
|
|
185
|
-
}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { Button } from "@/components/ui/button";
|
|
2
|
-
import { useTabStore } from "@/stores/tab-store";
|
|
3
|
-
import { basename } from "@/lib/utils";
|
|
4
|
-
import type { GitCommit } from "../../../types/git";
|
|
5
|
-
|
|
6
|
-
interface GitGraphDetailProps {
|
|
7
|
-
commit: GitCommit;
|
|
8
|
-
files: Array<{ path: string; additions: number; deletions: number }>;
|
|
9
|
-
loadingDetail: boolean;
|
|
10
|
-
projectName: string;
|
|
11
|
-
onClose: () => void;
|
|
12
|
-
copyHash: (hash: string) => void;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function GitGraphDetail({
|
|
16
|
-
commit,
|
|
17
|
-
files,
|
|
18
|
-
loadingDetail,
|
|
19
|
-
projectName,
|
|
20
|
-
onClose,
|
|
21
|
-
copyHash,
|
|
22
|
-
}: GitGraphDetailProps) {
|
|
23
|
-
const { openTab } = useTabStore();
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<div className="border-t bg-muted/30 max-h-[40%] overflow-auto">
|
|
27
|
-
<div className="px-3 py-2 border-b flex items-center justify-between">
|
|
28
|
-
<span className="text-sm font-medium truncate">
|
|
29
|
-
{commit.abbreviatedHash} — {commit.subject}
|
|
30
|
-
</span>
|
|
31
|
-
<Button variant="ghost" size="icon-xs" onClick={onClose}>
|
|
32
|
-
✕
|
|
33
|
-
</Button>
|
|
34
|
-
</div>
|
|
35
|
-
<div className="px-3 py-2 text-xs space-y-1">
|
|
36
|
-
<div className="flex gap-4">
|
|
37
|
-
<span className="text-muted-foreground w-12 shrink-0">Author</span>
|
|
38
|
-
<span>
|
|
39
|
-
{commit.authorName} <{commit.authorEmail}>
|
|
40
|
-
</span>
|
|
41
|
-
</div>
|
|
42
|
-
<div className="flex gap-4">
|
|
43
|
-
<span className="text-muted-foreground w-12 shrink-0">Date</span>
|
|
44
|
-
<span>{new Date(commit.authorDate).toLocaleString()}</span>
|
|
45
|
-
</div>
|
|
46
|
-
<div className="flex gap-4">
|
|
47
|
-
<span className="text-muted-foreground w-12 shrink-0">Hash</span>
|
|
48
|
-
<span
|
|
49
|
-
className="font-mono cursor-pointer hover:text-primary"
|
|
50
|
-
onClick={() => copyHash(commit.hash)}
|
|
51
|
-
>
|
|
52
|
-
{commit.hash}
|
|
53
|
-
</span>
|
|
54
|
-
</div>
|
|
55
|
-
{commit.parents.length > 0 && (
|
|
56
|
-
<div className="flex gap-4">
|
|
57
|
-
<span className="text-muted-foreground w-12 shrink-0">Parents</span>
|
|
58
|
-
<span className="font-mono">
|
|
59
|
-
{commit.parents.map((p) => p.slice(0, 7)).join(", ")}
|
|
60
|
-
</span>
|
|
61
|
-
</div>
|
|
62
|
-
)}
|
|
63
|
-
{commit.body && (
|
|
64
|
-
<div className="mt-2 p-2 bg-background rounded text-xs whitespace-pre-wrap">
|
|
65
|
-
{commit.body}
|
|
66
|
-
</div>
|
|
67
|
-
)}
|
|
68
|
-
</div>
|
|
69
|
-
{/* Changed files */}
|
|
70
|
-
<div className="px-3 py-1 border-t">
|
|
71
|
-
<div className="text-xs text-muted-foreground py-1">
|
|
72
|
-
{loadingDetail
|
|
73
|
-
? "Loading files..."
|
|
74
|
-
: `${files.length} file${files.length !== 1 ? "s" : ""} changed`}
|
|
75
|
-
</div>
|
|
76
|
-
{files.map((file) => (
|
|
77
|
-
<div
|
|
78
|
-
key={file.path}
|
|
79
|
-
className="flex items-center gap-2 py-0.5 text-xs hover:bg-muted/50 rounded px-1 cursor-pointer"
|
|
80
|
-
onClick={() =>
|
|
81
|
-
openTab({
|
|
82
|
-
type: "git-diff",
|
|
83
|
-
title: `Diff ${basename(file.path)}`,
|
|
84
|
-
closable: true,
|
|
85
|
-
metadata: {
|
|
86
|
-
projectName,
|
|
87
|
-
ref1: commit.parents[0] ?? undefined,
|
|
88
|
-
ref2: commit.hash,
|
|
89
|
-
filePath: file.path,
|
|
90
|
-
},
|
|
91
|
-
projectId: projectName,
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
>
|
|
95
|
-
<span className="flex-1 truncate font-mono">{file.path}</span>
|
|
96
|
-
{file.additions > 0 && (
|
|
97
|
-
<span className="text-green-500">+{file.additions}</span>
|
|
98
|
-
)}
|
|
99
|
-
{file.deletions > 0 && (
|
|
100
|
-
<span className="text-red-500">-{file.deletions}</span>
|
|
101
|
-
)}
|
|
102
|
-
</div>
|
|
103
|
-
))}
|
|
104
|
-
</div>
|
|
105
|
-
</div>
|
|
106
|
-
);
|
|
107
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import {
|
|
3
|
-
Dialog,
|
|
4
|
-
DialogContent,
|
|
5
|
-
DialogHeader,
|
|
6
|
-
DialogTitle,
|
|
7
|
-
DialogFooter,
|
|
8
|
-
} from "@/components/ui/dialog";
|
|
9
|
-
import { Input } from "@/components/ui/input";
|
|
10
|
-
import { Button } from "@/components/ui/button";
|
|
11
|
-
|
|
12
|
-
interface GitGraphDialogProps {
|
|
13
|
-
type: "branch" | "tag" | null;
|
|
14
|
-
hash?: string;
|
|
15
|
-
onClose: () => void;
|
|
16
|
-
onCreateBranch: (name: string, from: string) => void;
|
|
17
|
-
onCreateTag: (name: string, hash?: string) => void;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function GitGraphDialog({
|
|
21
|
-
type,
|
|
22
|
-
hash,
|
|
23
|
-
onClose,
|
|
24
|
-
onCreateBranch,
|
|
25
|
-
onCreateTag,
|
|
26
|
-
}: GitGraphDialogProps) {
|
|
27
|
-
const [inputValue, setInputValue] = useState("");
|
|
28
|
-
|
|
29
|
-
const handleSubmit = () => {
|
|
30
|
-
if (!inputValue.trim()) return;
|
|
31
|
-
if (type === "branch") {
|
|
32
|
-
onCreateBranch(inputValue.trim(), hash!);
|
|
33
|
-
} else {
|
|
34
|
-
onCreateTag(inputValue.trim(), hash);
|
|
35
|
-
}
|
|
36
|
-
onClose();
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<Dialog
|
|
41
|
-
open={type !== null}
|
|
42
|
-
onOpenChange={(open) => {
|
|
43
|
-
if (!open) onClose();
|
|
44
|
-
}}
|
|
45
|
-
>
|
|
46
|
-
<DialogContent>
|
|
47
|
-
<DialogHeader>
|
|
48
|
-
<DialogTitle>
|
|
49
|
-
{type === "branch" ? "Create Branch" : "Create Tag"}
|
|
50
|
-
</DialogTitle>
|
|
51
|
-
</DialogHeader>
|
|
52
|
-
<Input
|
|
53
|
-
placeholder={type === "branch" ? "Branch name" : "Tag name"}
|
|
54
|
-
value={inputValue}
|
|
55
|
-
onChange={(e) => setInputValue(e.target.value)}
|
|
56
|
-
onKeyDown={(e) => {
|
|
57
|
-
if (e.key === "Enter") handleSubmit();
|
|
58
|
-
}}
|
|
59
|
-
autoFocus
|
|
60
|
-
/>
|
|
61
|
-
<DialogFooter>
|
|
62
|
-
<Button variant="outline" onClick={onClose}>
|
|
63
|
-
Cancel
|
|
64
|
-
</Button>
|
|
65
|
-
<Button disabled={!inputValue.trim()} onClick={handleSubmit}>
|
|
66
|
-
Create
|
|
67
|
-
</Button>
|
|
68
|
-
</DialogFooter>
|
|
69
|
-
</DialogContent>
|
|
70
|
-
</Dialog>
|
|
71
|
-
);
|
|
72
|
-
}
|