From 90bfc090bd8a49421f826b3bc7f3d12ea14a388d Mon Sep 17 00:00:00 2001 From: litoral05 Date: Wed, 6 May 2026 10:22:21 +0100 Subject: [PATCH] Implement router provisioning lifecycle and deployment UI --- package-lock.json | 20 + package.json | 2 + src-tauri/Cargo.lock | 145 ++++++- src-tauri/Cargo.toml | 2 + src-tauri/capabilities/default.json | 11 +- src-tauri/src/lib.rs | 6 +- src-tauri/tauri.conf.json | 7 +- src/App.css | 477 ++++++++++++++++++++--- src/App.tsx | 448 ++++++++++++--------- src/api.ts | 17 +- src/assets/lr-logo.png | Bin 0 -> 136314 bytes src/components/ConfirmDialog.tsx | 40 ++ src/components/CreateRouterModal.tsx | 120 ++++++ src/components/DeploymentResultModal.tsx | 58 +++ src/components/Metric.tsx | 8 + src/components/Sidebar.tsx | 59 +++ src/lib/network.ts | 30 ++ src/pages/DashboardPage.tsx | 23 ++ src/pages/RoutersPage.tsx | 138 +++++++ src/types/deployment.ts | 14 + src/types/router.ts | 23 ++ 21 files changed, 1380 insertions(+), 268 deletions(-) create mode 100644 src/assets/lr-logo.png create mode 100644 src/components/ConfirmDialog.tsx create mode 100644 src/components/CreateRouterModal.tsx create mode 100644 src/components/DeploymentResultModal.tsx create mode 100644 src/components/Metric.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/lib/network.ts create mode 100644 src/pages/DashboardPage.tsx create mode 100644 src/pages/RoutersPage.tsx create mode 100644 src/types/deployment.ts create mode 100644 src/types/router.ts diff --git a/package-lock.json b/package-lock.json index a1a8986..081d916 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,8 @@ "version": "0.1.0", "dependencies": { "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "^2.7.1", + "@tauri-apps/plugin-fs": "^2.5.1", "@tauri-apps/plugin-opener": "^2", "lucide-react": "^1.14.0", "react": "^19.1.0", @@ -1435,6 +1437,24 @@ "node": ">= 10" } }, + "node_modules/@tauri-apps/plugin-dialog": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.7.1.tgz", + "integrity": "sha512-OK1UBXYt+ojcmxMktzzuyonYIFta8CmAASpX+CA+DTGK24KlHjhYI6x2iOJ/TjZF4N7/ACK1oFmEOjIY9IhzOQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.11.0" + } + }, + "node_modules/@tauri-apps/plugin-fs": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-fs/-/plugin-fs-2.5.1.tgz", + "integrity": "sha512-9Lz+Jopp6QyeEWhlpkMx4R/+P9HgR+AVAI4vOZhlT8Xaymtz8iVI/Ov984/XTqgJz/5gz5NretqPB/XEMS3NhQ==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.11.0" + } + }, "node_modules/@tauri-apps/plugin-opener": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.4.tgz", diff --git a/package.json b/package.json index eb24023..32dafb3 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ }, "dependencies": { "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "^2.7.1", + "@tauri-apps/plugin-fs": "^2.5.1", "@tauri-apps/plugin-opener": "^2", "lucide-react": "^1.14.0", "react": "^19.1.0", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 654d005..b6c983e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1963,6 +1963,8 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-fs", "tauri-plugin-opener", ] @@ -2230,6 +2232,7 @@ checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ "bitflags 2.11.1", "block2", + "libc", "objc2", "objc2-core-foundation", ] @@ -2820,6 +2823,30 @@ dependencies = [ "web-sys", ] +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -3502,6 +3529,48 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-dialog" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65981abb771e74e571a38196c3baa11c459379164791eba0e67abc1a5fac9884" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.18", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ecc274121aca0c036a2b42d1cbe83d368d348f54e0bb8a735c2b1548e8f371" +dependencies = [ + "anyhow", + "dunce", + "glob", + "log", + "objc2-foundation", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.18", + "toml 1.1.2+spec-1.1.0", + "url", +] + [[package]] name = "tauri-plugin-opener" version = "2.5.4" @@ -4592,6 +4661,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -4625,13 +4703,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows-threading" version = "0.1.0" @@ -4662,6 +4757,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -4674,6 +4775,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4686,12 +4793,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -4704,6 +4823,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -4716,6 +4841,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4728,6 +4859,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -4740,6 +4877,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.5.40" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index dd18217..7e1a7dc 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,4 +22,6 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +tauri-plugin-dialog = "2.7.1" +tauri-plugin-fs = "2.5.1" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 4cdbf49..3b96e47 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -2,9 +2,14 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", - "windows": ["main"], + "windows": [ + "main" + ], "permissions": [ "core:default", - "opener:default" + "opener:default", + "dialog:default", + "fs:default", + "fs:allow-write-file" ] -} +} \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4a277ef..4d0188b 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -7,8 +7,8 @@ fn greet(name: &str) -> String { #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() - .plugin(tauri_plugin_opener::init()) - .invoke_handler(tauri::generate_handler![greet]) + .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_fs::init()) .run(tauri::generate_context!()) .expect("error while running tauri application"); -} +} \ No newline at end of file diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index baa2457..d8dd12f 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -12,9 +12,10 @@ "app": { "windows": [ { - "title": "lr-openvpn-desktop", - "width": 800, - "height": 600 + "title": "LR OpenVPN Tool", + "width": 1440, + "height": 900, + "resizable": true } ], "security": { diff --git a/src/App.css b/src/App.css index df74672..c669a30 100644 --- a/src/App.css +++ b/src/App.css @@ -9,46 +9,75 @@ body { color: #1f2937; } -button { +button, +input, +select { font: inherit; } +button { + cursor: pointer; +} + .app { min-height: 100vh; + min-width: 1280px; display: flex; + background: #f2f2f2; } +/* SIDEBAR */ + .sidebar { - width: 260px; + width: 250px; background: #0d0d0d; color: white; - padding: 24px 16px; + padding: 26px 16px 18px; display: flex; flex-direction: column; + border-right: 1px solid #171717; } .brand { display: flex; + flex-direction: column; align-items: center; - gap: 12px; - margin-bottom: 36px; + gap: 8px; + margin-bottom: 34px; + text-align: center; } .logo { - width: 54px; - height: 54px; - border-radius: 18px; + width: 72px; + height: 72px; + border-radius: 24px; background: linear-gradient(135deg, #5da8ff, #b7e236); display: grid; place-items: center; font-weight: 900; + font-size: 24px; + color: #0d0d0d; +} + +.brand-logo { + width: 115px; + height: auto; + display: block; +} + +.brand strong { + display: block; + font-size: 18px; + letter-spacing: 0.5px; + color: #5da8ff; } .brand span { display: block; - font-size: 12px; - color: #b7e236; - letter-spacing: 2px; + font-size: 13px; + color: white; + letter-spacing: 4px; + margin-top: -2px; } nav { @@ -60,12 +89,13 @@ nav button { background: transparent; border: 0; color: #d1d5db; - padding: 12px; - border-radius: 10px; + padding: 12px 14px; + border-radius: 9px; display: flex; align-items: center; - gap: 10px; - cursor: pointer; + gap: 11px; + font-size: 14px; + font-weight: 700; } nav button.active, @@ -76,12 +106,24 @@ nav button:hover { .status-card { margin-top: auto; - background: #1a1a1a; + background: #181818; + border: 1px solid #262626; border-radius: 14px; padding: 16px; font-size: 14px; } +.status-card strong { + display: block; + margin-bottom: 8px; +} + +.status-card p { + margin: 0; + color: #b7e236; + font-weight: 700; +} + .dot { width: 9px; height: 9px; @@ -91,107 +133,181 @@ nav button:hover { margin-right: 8px; } +/* MAIN */ + .content { flex: 1; - padding: 32px; + padding: 30px; + overflow-x: auto; + overflow-y: auto; } .page-header { display: flex; justify-content: space-between; - align-items: center; + align-items: flex-start; margin-bottom: 24px; } .page-header h1 { margin: 0; - font-size: 30px; + font-size: 26px; + line-height: 1.1; + color: #111827; } .page-header p { - margin: 4px 0 0; + margin: 6px 0 0; color: #6b7280; + font-size: 14px; } .health, -.primary { +.primary, +.secondary { border: 0; - border-radius: 12px; - padding: 12px 18px; - font-weight: 700; + border-radius: 9px; + padding: 11px 18px; + font-weight: 800; + font-size: 14px; } .health { background: white; + color: #111827; + box-shadow: 0 5px 18px rgba(0, 0, 0, 0.06); +} + +.health::before { + content: ""; + width: 8px; + height: 8px; + background: #b7e236; + display: inline-block; + border-radius: 50%; + margin-right: 9px; } .primary { background: #b7e236; color: #0d0d0d; - cursor: pointer; } +.secondary { + background: #f3f4f6; + color: #374151; +} + +.primary:disabled { + opacity: 0.6; + cursor: not-allowed; +} + +/* CARDS */ + .cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; + margin-bottom: 18px; } .metric-card, .panel { background: white; - border-radius: 18px; - padding: 22px; - box-shadow: 0 8px 30px rgba(0, 0, 0, 0.06); + border-radius: 14px; + padding: 20px; + border: 1px solid #eceff3; + box-shadow: 0 8px 28px rgba(15, 23, 42, 0.06); +} + +.metric-card { + min-height: 118px; } .metric-card span { color: #6b7280; - font-size: 14px; + font-size: 13px; + font-weight: 700; } .metric-card strong { display: block; font-size: 34px; - margin-top: 8px; + margin-top: 10px; + color: #111827; +} + +/* TABLE */ + +.panel { + padding: 0; + overflow: hidden; + overflow-x: auto; } table { width: 100%; border-collapse: collapse; + background: white; } th, td { text-align: left; - padding: 14px; - border-bottom: 1px solid #e5e7eb; + padding: 15px 18px; + border-bottom: 1px solid #edf0f3; + font-size: 14px; } th { color: #6b7280; - font-size: 13px; + font-size: 12px; + font-weight: 800; + background: #fbfbfc; +} + +td { + color: #374151; + font-weight: 600; } .badge { padding: 6px 10px; border-radius: 999px; font-size: 12px; - font-weight: 700; + font-weight: 800; background: #e5e7eb; + display: inline-flex; + align-items: center; + gap: 6px; } -.badge.provisioned { +.badge::before { + content: ""; + width: 7px; + height: 7px; + border-radius: 50%; + background: currentColor; +} + +.badge.provisioned, +.badge.active, +.badge.online, +.badge.success { color: #16a34a; background: #dcfce7; } -.badge.pending { +.badge.pending, +.badge.inactive, +.badge.warning { color: #ca8a04; background: #fef9c3; } -.badge.failed { +.badge.failed, +.badge.offline { color: #dc2626; background: #fee2e2; } @@ -201,95 +317,330 @@ th { background: #f3f4f6; } +/* ERROR */ + .error-banner { background: #fee2e2; color: #991b1b; padding: 12px 16px; border-radius: 12px; margin-bottom: 18px; - font-weight: 700; + font-weight: 800; } +/* MODAL */ + .modal-backdrop { position: fixed; inset: 0; - background: rgba(0, 0, 0, 0.45); + background: rgba(0, 0, 0, 0.55); display: grid; place-items: center; z-index: 50; } .modal { - width: 520px; - background: white; - border-radius: 20px; - padding: 24px; - box-shadow: 0 25px 80px rgba(0, 0, 0, 0.25); + width: 760px; + max-width: calc(100vw - 48px); + background: #f7f8fa; + border-radius: 18px; + padding: 22px; + box-shadow: 0 25px 80px rgba(0, 0, 0, 0.35); } .modal-header { display: flex; justify-content: space-between; gap: 16px; - margin-bottom: 22px; + margin-bottom: 18px; } .modal-header h2 { margin: 0; + color: #111827; } .modal-header p { - margin: 4px 0 0; + margin: 5px 0 0; color: #6b7280; + font-size: 14px; } .icon-button { border: 0; - background: #f3f4f6; + background: white; border-radius: 10px; width: 36px; height: 36px; display: grid; place-items: center; - cursor: pointer; } .router-form { display: grid; + grid-template-columns: 1fr 1fr; gap: 16px; } .router-form label { + background: white; + border: 1px solid #eceff3; + border-radius: 14px; + padding: 14px; display: grid; - gap: 7px; - font-size: 14px; - font-weight: 700; + gap: 8px; + font-size: 13px; + font-weight: 800; + color: #374151; } .router-form input { - height: 42px; - border: 1px solid #d1d5db; - border-radius: 10px; + height: 40px; + border: 1px solid #dfe3e8; + border-radius: 8px; padding: 0 12px; - font: inherit; + background: #fbfbfc; + color: #111827; +} + +.router-form input:focus { + outline: 2px solid rgba(93, 168, 255, 0.25); + border-color: #5da8ff; } .modal-actions { + grid-column: 1 / -1; display: flex; justify-content: flex-end; gap: 12px; - margin-top: 8px; + margin-top: 4px; } -.secondary { - border: 0; +/* RESPONSIVE */ + +@media (max-width: 1000px) { + .cards { + grid-template-columns: repeat(2, 1fr); + } + + .router-form { + grid-template-columns: 1fr; + } +} + +.router-form select { + height: 40px; + border: 1px solid #dfe3e8; + border-radius: 8px; + padding: 0 12px; + background: #fbfbfc; + color: #111827; +} + +.router-form select:focus { + outline: 2px solid rgba(93, 168, 255, 0.25); + border-color: #5da8ff; +} + +.custom-select { + position: relative; +} + +.custom-select-button { + width: 100%; + height: 40px; + border: 1px solid #dfe3e8; + border-radius: 8px; + padding: 0 12px; + background: #fbfbfc; + color: #111827; + display: flex; + align-items: center; + justify-content: space-between; + font-weight: 700; +} + +.custom-select-menu { + position: absolute; + z-index: 100; + top: calc(100% + 6px); + left: 0; + right: 0; + max-height: 220px; + overflow-y: auto; + background: white; + border: 1px solid #e5e7eb; border-radius: 12px; - padding: 12px 18px; - background: #f3f4f6; - cursor: pointer; + box-shadow: 0 18px 50px rgba(15, 23, 42, 0.18); + padding: 6px; } -.primary:disabled { - opacity: 0.6; +.custom-select-option { + width: 100%; + border: 0; + background: transparent; + color: #111827; + text-align: left; + padding: 9px 10px; + border-radius: 8px; + font-weight: 700; +} + +.custom-select-option:hover { + background: #eef6ff; +} + +.table-action { + width: 34px; + height: 34px; + border: 0; + border-radius: 10px; + display: grid; + place-items: center; + background: #f3f4f6; + color: #374151; +} + +.table-action.danger { + color: #dc2626; +} + +.table-action.danger:hover { + background: #fee2e2; +} + +.confirm-dialog { + width: 430px; + background: white; + border-radius: 18px; + padding: 24px; + box-shadow: 0 25px 80px rgba(0, 0, 0, 0.28); +} + +.confirm-dialog h2 { + margin: 0; + color: #111827; +} + +.confirm-dialog p { + margin: 10px 0 22px; + color: #6b7280; + line-height: 1.5; +} + +.danger-button { + border: 0; + border-radius: 9px; + padding: 11px 18px; + font-weight: 800; + font-size: 14px; + background: #ef4444; + color: white; +} + +.danger-button:hover { + background: #dc2626; +} + +.panel-empty { + padding: 22px; + margin: 0; + color: #6b7280; + font-weight: 700; +} + +.table-actions { + display: flex; + align-items: center; + gap: 8px; +} + +.small-action { + height: 34px; + border: 0; + border-radius: 10px; + padding: 0 12px; + display: inline-flex; + align-items: center; + gap: 7px; + background: #f3f4f6; + color: #374151; + font-weight: 800; + font-size: 13px; +} + +.primary-action { + background: #b7e236; + color: #0d0d0d; +} + +.table-action.warning { + color: #ca8a04; +} + +.table-action.warning:hover { + background: #fef9c3; +} + +.table-action:disabled, +.small-action:disabled { + opacity: 0.55; cursor: not-allowed; +} + +.warning-action { + color: #ca8a04; + background: #fef9c3; +} + +.table-action:disabled, +.small-action:disabled { + opacity: 0.55; + cursor: not-allowed; +} + +.deployment-modal { + width: 720px; + max-width: calc(100vw - 48px); + background: white; + border-radius: 18px; + padding: 24px; + box-shadow: 0 25px 80px rgba(0, 0, 0, 0.3); +} + +.deployment-summary { + display: flex; + justify-content: space-between; + align-items: center; + background: #f8fafc; + border: 1px solid #e5e7eb; + border-radius: 14px; + padding: 14px; + margin-bottom: 16px; + font-weight: 800; + color: #64748b; +} + +.deployment-status { + display: flex; + align-items: center; + gap: 10px; +} + +.log-box { + background: #050505; + border-radius: 14px; + padding: 16px; + min-height: 220px; + max-height: 360px; + overflow: auto; +} + +.log-box pre { + margin: 0; + color: #b7e236; + font-size: 13px; + line-height: 1.5; + white-space: pre-wrap; + font-family: "JetBrains Mono", Consolas, monospace; } \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 46b509d..3edfe51 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,39 +1,35 @@ import { FormEvent, useEffect, useState } from "react"; -import { apiGet, apiPost } from "./api"; +import { apiDelete, apiGet, apiPost } from "./api"; +import { Sidebar } from "./components/Sidebar"; +import { CreateRouterModal } from "./components/CreateRouterModal"; +import { ConfirmDialog } from "./components/ConfirmDialog"; +import { DashboardPage } from "./pages/DashboardPage"; +import { RoutersPage } from "./pages/RoutersPage"; +import type { CreateRouterRequest, RouterItem } from "./types/router"; +import { save } from "@tauri-apps/plugin-dialog"; +import { writeFile } from "@tauri-apps/plugin-fs"; +import type { DeploymentResponse } from "./types/deployment"; +import { DeploymentResultModal } from "./components/DeploymentResultModal"; + import { - LayoutDashboard, - Router, - Shield, - Activity, - Server, - Settings, - X, -} from "lucide-react"; + availableSubnets, + firstAvailableSubnet, + gatewayFromSubnet, +} from "./lib/network"; + import "./App.css"; -type RouterItem = { - id: string; - name: string; - serialNumber?: string; - lanIp: string; - lanSubnet: string; - status: string; -}; - -type CreateRouterRequest = { - name: string; - serialNumber: string; - lanIp: string; - lanSubnet: string; -}; - function App() { const [page, setPage] = useState("dashboard"); const [routers, setRouters] = useState([]); const [loading, setLoading] = useState(false); const [createOpen, setCreateOpen] = useState(false); const [saving, setSaving] = useState(false); + const [actionLoading, setActionLoading] = useState(null); const [error, setError] = useState(null); + const [routerToDelete, setRouterToDelete] = useState(null); + const [routerToRemove, setRouterToRemove] = useState(null); + const [latestDeployment, setLatestDeployment] = useState(null); const [form, setForm] = useState({ name: "", @@ -56,16 +52,50 @@ function App() { } } + function openCreateRouterModal() { + const nextSubnet = firstAvailableSubnet(routers); + + setForm({ + name: "", + serialNumber: "", + lanSubnet: nextSubnet, + lanIp: gatewayFromSubnet(nextSubnet), + }); + + setCreateOpen(true); + } + async function createRouter(event: FormEvent) { event.preventDefault(); + let createdRouter: RouterItem | null = null; + try { setSaving(true); setError(null); - await apiPost("/api/routers", form); + createdRouter = await apiPost( + "/api/routers", + form + ); + + console.log("Router created:", createdRouter); + + const allocation = await apiPost< + unknown, + { + clientName: string; + allocationMode: "AUTOMATIC"; + } + >(`/api/routers/${createdRouter.id}/ip-allocation`, { + clientName: form.name, + allocationMode: "AUTOMATIC", + }); + + console.log("Allocation created:", allocation); setCreateOpen(false); + setForm({ name: "", serialNumber: "", @@ -76,202 +106,232 @@ function App() { await loadRouters(); setPage("routers"); } catch (err) { + console.error(err); + + if (createdRouter) { + await apiDelete(`/api/routers/${createdRouter.id}`).catch(() => null); + await loadRouters(); + } + setError(err instanceof Error ? err.message : "Failed to create router"); } finally { setSaving(false); } } + async function provisionRouter(router: RouterItem) { + try { + setActionLoading(router.id); + setError(null); + + const deployment = await apiPost>( + `/api/routers/${router.id}/provision`, + {} + ); + + console.log("Provision deployment:", deployment); + + setLatestDeployment(deployment); + + if (deployment.status !== "SUCCESS") { + setError( + deployment.errorMessage || + deployment.stderr || + deployment.logs || + "Provision failed. Check deployment logs." + ); + } + + await loadRouters(); + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to provision router"); + } finally { + setActionLoading(null); + } + } + + async function removeRouter(router: RouterItem) { + try { + setActionLoading(router.id); + setError(null); + + const deployment = await apiPost>( + `/api/routers/${router.id}/remove`, + {} + ); + + console.log("Remove deployment:", deployment); + + setLatestDeployment(deployment); + setRouterToRemove(null); + + if (deployment.status !== "SUCCESS") { + setError( + deployment.errorMessage || + deployment.stderr || + deployment.logs || + "Remove failed. Check deployment logs." + ); + } + + await loadRouters(); + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to remove router"); + } finally { + setActionLoading(null); + } + } + + async function deleteRouter(router: RouterItem) { + try { + setActionLoading(router.id); + setError(null); + + await apiDelete(`/api/routers/${router.id}`); + + setRouterToDelete(null); + await loadRouters(); + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to delete router"); + } finally { + setActionLoading(null); + } + } + + async function downloadBundle(router: RouterItem) { + try { + setActionLoading(router.id); + setError(null); + + const response = await fetch( + `${import.meta.env.VITE_API_BASE}/api/routers/${router.id}/bundle`, + { + headers: { + "X-API-Key": import.meta.env.VITE_API_KEY, + }, + } + ); + + const arrayBuffer = await response.arrayBuffer(); + const bytes = new Uint8Array(arrayBuffer); + + console.log("Bundle response status:", response.status); + console.log("Bundle content-type:", response.headers.get("content-type")); + console.log("Bundle size:", bytes.length); + console.log("Bundle first bytes:", Array.from(bytes.slice(0, 20))); + console.log( + "Bundle preview:", + new TextDecoder().decode(bytes.slice(0, 200)) + ); + + if (!response.ok) { + throw new Error( + new TextDecoder().decode(bytes) || `API error ${response.status}` + ); + } + + const isZip = bytes[0] === 0x50 && bytes[1] === 0x4b; + const isGzip = bytes[0] === 0x1f && bytes[1] === 0x8b; + + if (!isZip && !isGzip) { + throw new Error("Downloaded bundle is not a valid ZIP or GZIP file"); + } + + const defaultFilename = isZip + ? `${router.name}-bundle.zip` + : `${router.name}-bundle.tar.gz`; + + const savePath = await save({ + title: "Save OpenVPN Bundle", + defaultPath: defaultFilename, + filters: [ + { + name: isZip ? "ZIP Archive" : "GZIP Archive", + extensions: isZip ? ["zip"] : ["tar.gz", "gz"], + }, + ], + }); + + if (!savePath) { + return; + } + + await writeFile(savePath, bytes); + } catch (err) { + setError(err instanceof Error ? err.message : "Failed to download bundle"); + } finally { + setActionLoading(null); + } + } + useEffect(() => { loadRouters(); }, []); return (
- +
{error &&
{error}
} - {page === "dashboard" && ( - <> -
-
-

Dashboard

-

Overview of your OpenVPN infrastructure

-
- -
- -
- - - - -
- - )} + {page === "dashboard" && } {page === "routers" && ( - <> -
-
-

Routers

-

Manage routers and OpenVPN provisioning

-
- -
- -
- {loading ? ( -

Loading routers...

- ) : routers.length === 0 ? ( -

No routers found

- ) : ( - - - - - - - - - - - - {routers.map((router) => ( - - - - - - - - ))} - -
NameSerialLAN IPLAN SubnetStatus
{router.name}{router.serialNumber || "-"}{router.lanIp}{router.lanSubnet} - - {router.status} - -
- )} -
- + )}
{createOpen && ( -
-
-
-
-

New Router

-

Create a router before allocating VPN details.

-
- -
+ setCreateOpen(false)} + onSubmit={createRouter} + /> + )} -
- + {routerToDelete && ( + setRouterToDelete(null)} + onConfirm={() => deleteRouter(routerToDelete)} + /> + )} - + {routerToRemove && ( + setRouterToRemove(null)} + onConfirm={() => removeRouter(routerToRemove)} + /> + )} - - - - -
- - -
- -
-
+ {latestDeployment && ( + setLatestDeployment(null)} + /> )}
); } -function Metric({ title, value }: { title: string; value: string | number }) { - return ( -
- {title} - {value} -
- ); -} - export default App; \ No newline at end of file diff --git a/src/api.ts b/src/api.ts index cc1ceba..e2020fd 100644 --- a/src/api.ts +++ b/src/api.ts @@ -37,4 +37,19 @@ export async function apiPost( } return response.json(); -} \ No newline at end of file +} + +export async function apiDelete(path: string): Promise { + const response = await fetch(`${API_BASE}${path}`, { + method: "DELETE", + headers: { + "X-API-Key": API_KEY, + }, + }); + + if (!response.ok) { + const error = await response.json().catch(() => null); + + throw new Error(error?.error || `API error ${response.status}`); + } +} \ No newline at end of file diff --git a/src/assets/lr-logo.png b/src/assets/lr-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..08578035bea5eee35cc0c1fc5df7de2705690a2d GIT binary patch literal 136314 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

IQr#HUMu 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

Vu`_4xq~+9_5%PO9)x`Q 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 literal 0 HcmV?d00001 diff --git a/src/components/ConfirmDialog.tsx b/src/components/ConfirmDialog.tsx new file mode 100644 index 0000000..005ba17 --- /dev/null +++ b/src/components/ConfirmDialog.tsx @@ -0,0 +1,40 @@ +type Props = { + title: string; + message: string; + confirmLabel?: string; + danger?: boolean; + onCancel: () => void; + onConfirm: () => void; +}; + +export function ConfirmDialog({ + title, + message, + confirmLabel = "Confirm", + danger = false, + onCancel, + onConfirm, +}: Props) { + return ( +

+ ); +} \ No newline at end of file diff --git a/src/components/CreateRouterModal.tsx b/src/components/CreateRouterModal.tsx new file mode 100644 index 0000000..f983ef5 --- /dev/null +++ b/src/components/CreateRouterModal.tsx @@ -0,0 +1,120 @@ +import { FormEvent, useState } from "react"; +import type { CreateRouterRequest } from "../types/router"; +import { gatewayFromSubnet } from "../lib/network"; +import { ChevronDown, X } from "lucide-react"; + +type Props = { + form: CreateRouterRequest; + saving: boolean; + onChange: (form: CreateRouterRequest) => void; + onClose: () => void; + onSubmit: (event: FormEvent) => void; + availableLanSubnets: string[]; +}; + +export function CreateRouterModal({ + form, + saving, + availableLanSubnets, + onChange, + onClose, + onSubmit, +}: Props) { + const [subnetOpen, setSubnetOpen] = useState(false); + + return ( +
+
+
+
+

New Router

+

Create a router before allocating VPN details.

+
+ + +
+ +
+ + + + + + + + +
+ + + +
+
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/DeploymentResultModal.tsx b/src/components/DeploymentResultModal.tsx new file mode 100644 index 0000000..2c60b46 --- /dev/null +++ b/src/components/DeploymentResultModal.tsx @@ -0,0 +1,58 @@ +import { CheckCircle2, X, XCircle } from "lucide-react"; +import type { DeploymentResponse } from "../types/deployment"; + +type Props = { + deployment: DeploymentResponse; + onClose: () => void; +}; + +export function DeploymentResultModal({ deployment, onClose }: Props) { + const successful = deployment.status === "SUCCESS"; + + const logs = + deployment.stdout || + deployment.stderr || + deployment.logs || + deployment.errorMessage || + "No logs returned."; + + return ( +
+
+
+
+

Deployment Result

+

+ {deployment.action} ยท {deployment.routerName || "Router"} +

+
+ + +
+ +
+
+ {successful ? : } + + {deployment.status} + +
+ + {deployment.finishedAt || deployment.createdAt || "-"} +
+ +
+
{logs}
+
+ +
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/src/components/Metric.tsx b/src/components/Metric.tsx new file mode 100644 index 0000000..e3fb098 --- /dev/null +++ b/src/components/Metric.tsx @@ -0,0 +1,8 @@ +export function Metric({ title, value }: { title: string; value: string | number }) { + return ( +
+ {title} + {value} +
+ ); +} \ No newline at end of file diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..0c47020 --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,59 @@ +import { + Activity, + LayoutDashboard, + Router, + Server, + Settings, + Shield, +} from "lucide-react"; + +type Props = { + page: string; + onPageChange: (page: string) => void; +}; + +export function Sidebar({ page, onPageChange }: Props) { + return ( + + ); +} \ No newline at end of file diff --git a/src/lib/network.ts b/src/lib/network.ts new file mode 100644 index 0000000..e75ac04 --- /dev/null +++ b/src/lib/network.ts @@ -0,0 +1,30 @@ +import type { RouterItem } from "../types/router"; + +export const LAN_SUBNET_PRESETS = Array.from( + { length: 200 }, + (_, index) => `192.168.${index + 10}.0/24` +); + +export function gatewayFromSubnet(subnet: string): string { + const [network] = subnet.split("/"); + const parts = network.split("."); + + if (parts.length !== 4) return ""; + + return `${parts[0]}.${parts[1]}.${parts[2]}.1`; +} + +export function firstAvailableSubnet(routers: RouterItem[]): string { + const usedSubnets = new Set(routers.map((router) => router.lanSubnet)); + + return ( + LAN_SUBNET_PRESETS.find((subnet) => !usedSubnets.has(subnet)) || + "" + ); +} + +export function availableSubnets(routers: RouterItem[]): string[] { + const usedSubnets = new Set(routers.map((router) => router.lanSubnet)); + + return LAN_SUBNET_PRESETS.filter((subnet) => !usedSubnets.has(subnet)); +} \ No newline at end of file diff --git a/src/pages/DashboardPage.tsx b/src/pages/DashboardPage.tsx new file mode 100644 index 0000000..0acb5b4 --- /dev/null +++ b/src/pages/DashboardPage.tsx @@ -0,0 +1,23 @@ +import { Metric } from "../components/Metric"; +import type { RouterItem } from "../types/router"; + +export function DashboardPage({ routers }: { routers: RouterItem[] }) { + return ( + <> +
+
+

Dashboard

+

Overview of your OpenVPN infrastructure

+
+ +
+ +
+ + + + +
+ + ); +} \ No newline at end of file diff --git a/src/pages/RoutersPage.tsx b/src/pages/RoutersPage.tsx new file mode 100644 index 0000000..f8f351f --- /dev/null +++ b/src/pages/RoutersPage.tsx @@ -0,0 +1,138 @@ +import type { RouterItem } from "../types/router"; +import { Download, Play, RotateCcw, Trash2 } from "lucide-react"; + +type Props = { + routers: RouterItem[]; + loading: boolean; + actionLoading: string | null; + onCreateClick: () => void; + onDelete: (router: RouterItem) => void; + onProvision: (router: RouterItem) => void; + onRemove: (router: RouterItem) => void; + onDownloadBundle: (router: RouterItem) => void; +}; + +export function RoutersPage({ + routers, + loading, + actionLoading, + onCreateClick, + onDelete, + onProvision, + onRemove, + onDownloadBundle, +}: Props) { + + return ( + <> +
+
+

Routers

+

Manage routers and OpenVPN provisioning

+
+ + +
+ +
+ {loading ? ( +

Loading routers...

+ ) : routers.length === 0 ? ( +

No routers found

+ ) : ( + + + + + + + + + + + + + + + {routers.map((router) => { + const canProvision = + router.status === "PENDING" || router.status === "FAILED"; + + const isProvisioned = router.status === "PROVISIONED"; + const isBusy = actionLoading === router.id; + const canDelete = + router.status === "PENDING" || + router.status === "FAILED" || + router.status === "REMOVED"; + return ( + + + + + + + + + + + ); + })} + +
NameSerialLAN IPLAN SubnetVPN IPStatusActions
{router.name}{router.serialNumber || "-"}{router.lanIp}{router.lanSubnet}{router.vpnIp || "-"} + + {isBusy ? "WORKING" : router.status} + + +
+ {canProvision && ( + + )} + + {isProvisioned && ( + <> + + + + + )} + + {canDelete && ( + + )} +
+
+ )} +
+ + ); +} \ No newline at end of file diff --git a/src/types/deployment.ts b/src/types/deployment.ts new file mode 100644 index 0000000..032e623 --- /dev/null +++ b/src/types/deployment.ts @@ -0,0 +1,14 @@ +export type DeploymentResponse = { + id: string; + routerId?: string; + routerName?: string; + action: string; + status: string; + stdout?: string | null; + stderr?: string | null; + logs?: string | null; + errorMessage?: string | null; + createdAt?: string; + startedAt?: string; + finishedAt?: string; +}; \ No newline at end of file diff --git a/src/types/router.ts b/src/types/router.ts new file mode 100644 index 0000000..5150a8c --- /dev/null +++ b/src/types/router.ts @@ -0,0 +1,23 @@ +export type RouterItem = { + id: string; + name: string; + serialNumber?: string; + lanIp: string; + lanSubnet: string; + status: string; + + vpnIp?: string; + clientName?: string; +}; + +export type CreateRouterRequest = { + name: string; + serialNumber: string; + lanIp: string; + lanSubnet: string; +}; + +export type IpAllocationRequest = { + clientName: string; + allocationMode: "AUTOMATIC" | "MANUAL"; +}; \ No newline at end of file