diff --git a/apps/desktop/src/lib/trpc/routers/external/index.ts b/apps/desktop/src/lib/trpc/routers/external/index.ts
index ecf47977f01..80c2afca7a4 100644
--- a/apps/desktop/src/lib/trpc/routers/external/index.ts
+++ b/apps/desktop/src/lib/trpc/routers/external/index.ts
@@ -36,6 +36,31 @@ const getAppCommand = (
return { command: "open", args: ["-a", "Terminal", targetPath] };
case "sublime":
return { command: "open", args: ["-a", "Sublime Text", targetPath] };
+ // JetBrains IDEs
+ case "intellij":
+ return { command: "open", args: ["-a", "IntelliJ IDEA", targetPath] };
+ case "webstorm":
+ return { command: "open", args: ["-a", "WebStorm", targetPath] };
+ case "pycharm":
+ return { command: "open", args: ["-a", "PyCharm", targetPath] };
+ case "phpstorm":
+ return { command: "open", args: ["-a", "PhpStorm", targetPath] };
+ case "rubymine":
+ return { command: "open", args: ["-a", "RubyMine", targetPath] };
+ case "goland":
+ return { command: "open", args: ["-a", "GoLand", targetPath] };
+ case "clion":
+ return { command: "open", args: ["-a", "CLion", targetPath] };
+ case "rider":
+ return { command: "open", args: ["-a", "Rider", targetPath] };
+ case "datagrip":
+ return { command: "open", args: ["-a", "DataGrip", targetPath] };
+ case "appcode":
+ return { command: "open", args: ["-a", "AppCode", targetPath] };
+ case "fleet":
+ return { command: "open", args: ["-a", "Fleet", targetPath] };
+ case "rustrover":
+ return { command: "open", args: ["-a", "RustRover", targetPath] };
default:
return null;
}
diff --git a/apps/desktop/src/main/lib/db/schemas.ts b/apps/desktop/src/main/lib/db/schemas.ts
index e319ee7fff3..aaa0c533e83 100644
--- a/apps/desktop/src/main/lib/db/schemas.ts
+++ b/apps/desktop/src/main/lib/db/schemas.ts
@@ -78,6 +78,19 @@ export const EXTERNAL_APPS = [
"iterm",
"warp",
"terminal",
+ // JetBrains IDEs
+ "intellij",
+ "webstorm",
+ "pycharm",
+ "phpstorm",
+ "rubymine",
+ "goland",
+ "clion",
+ "rider",
+ "datagrip",
+ "appcode",
+ "fleet",
+ "rustrover",
] as const;
export type ExternalApp = (typeof EXTERNAL_APPS)[number];
diff --git a/apps/desktop/src/renderer/assets/app-icons/appcode.svg b/apps/desktop/src/renderer/assets/app-icons/appcode.svg
new file mode 100644
index 00000000000..adc28914165
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/appcode.svg
@@ -0,0 +1,32 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/clion.svg b/apps/desktop/src/renderer/assets/app-icons/clion.svg
new file mode 100644
index 00000000000..c14657bcb0d
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/clion.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/datagrip.svg b/apps/desktop/src/renderer/assets/app-icons/datagrip.svg
new file mode 100644
index 00000000000..4af9320a049
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/datagrip.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/fleet.svg b/apps/desktop/src/renderer/assets/app-icons/fleet.svg
new file mode 100644
index 00000000000..3ab51b6e702
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/fleet.svg
@@ -0,0 +1,50 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/goland.svg b/apps/desktop/src/renderer/assets/app-icons/goland.svg
new file mode 100644
index 00000000000..c3ef8653919
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/goland.svg
@@ -0,0 +1,20 @@
+
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/intellij.svg b/apps/desktop/src/renderer/assets/app-icons/intellij.svg
new file mode 100644
index 00000000000..46cc4abefa6
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/intellij.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/jetbrains.svg b/apps/desktop/src/renderer/assets/app-icons/jetbrains.svg
new file mode 100644
index 00000000000..367c4ffadf4
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/jetbrains.svg
@@ -0,0 +1,12 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/phpstorm.svg b/apps/desktop/src/renderer/assets/app-icons/phpstorm.svg
new file mode 100644
index 00000000000..9b1e48d82b8
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/phpstorm.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/pycharm.svg b/apps/desktop/src/renderer/assets/app-icons/pycharm.svg
new file mode 100644
index 00000000000..0092bf3c257
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/pycharm.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/rider.svg b/apps/desktop/src/renderer/assets/app-icons/rider.svg
new file mode 100644
index 00000000000..97060ecb18a
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/rider.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/rubymine.svg b/apps/desktop/src/renderer/assets/app-icons/rubymine.svg
new file mode 100644
index 00000000000..dcd769ecdce
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/rubymine.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/rustrover.svg b/apps/desktop/src/renderer/assets/app-icons/rustrover.svg
new file mode 100644
index 00000000000..301a1ee6533
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/rustrover.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/assets/app-icons/webstorm.svg b/apps/desktop/src/renderer/assets/app-icons/webstorm.svg
new file mode 100644
index 00000000000..4c0c80441d4
--- /dev/null
+++ b/apps/desktop/src/renderer/assets/app-icons/webstorm.svg
@@ -0,0 +1,19 @@
+
diff --git a/apps/desktop/src/renderer/components/OpenInButton/OpenInButton.tsx b/apps/desktop/src/renderer/components/OpenInButton/OpenInButton.tsx
index 3ddc3317857..a6d1fdbbb3d 100644
--- a/apps/desktop/src/renderer/components/OpenInButton/OpenInButton.tsx
+++ b/apps/desktop/src/renderer/components/OpenInButton/OpenInButton.tsx
@@ -5,6 +5,9 @@ import {
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "@superset/ui/dropdown-menu";
import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip";
@@ -12,13 +15,26 @@ import type { ExternalApp } from "main/lib/db/schemas";
import { useState } from "react";
import { HiChevronDown } from "react-icons/hi2";
import { LuCopy } from "react-icons/lu";
+import appcodeIcon from "renderer/assets/app-icons/appcode.svg";
+import clionIcon from "renderer/assets/app-icons/clion.svg";
import cursorIcon from "renderer/assets/app-icons/cursor.svg";
+import datagripIcon from "renderer/assets/app-icons/datagrip.svg";
import finderIcon from "renderer/assets/app-icons/finder.png";
+import fleetIcon from "renderer/assets/app-icons/fleet.svg";
+import golandIcon from "renderer/assets/app-icons/goland.svg";
+import intellijIcon from "renderer/assets/app-icons/intellij.svg";
import itermIcon from "renderer/assets/app-icons/iterm.png";
+import jetbrainsIcon from "renderer/assets/app-icons/jetbrains.svg";
+import phpstormIcon from "renderer/assets/app-icons/phpstorm.svg";
+import pycharmIcon from "renderer/assets/app-icons/pycharm.svg";
+import riderIcon from "renderer/assets/app-icons/rider.svg";
+import rubymineIcon from "renderer/assets/app-icons/rubymine.svg";
+import rustroverIcon from "renderer/assets/app-icons/rustrover.svg";
import sublimeIcon from "renderer/assets/app-icons/sublime.svg";
import terminalIcon from "renderer/assets/app-icons/terminal.png";
import vscodeIcon from "renderer/assets/app-icons/vscode.svg";
import warpIcon from "renderer/assets/app-icons/warp.png";
+import webstormIcon from "renderer/assets/app-icons/webstorm.svg";
import xcodeIcon from "renderer/assets/app-icons/xcode.svg";
import { trpc } from "renderer/lib/trpc";
@@ -39,8 +55,25 @@ const APP_OPTIONS: AppOption[] = [
{ id: "terminal", label: "Terminal", icon: terminalIcon },
];
+const JETBRAINS_OPTIONS: AppOption[] = [
+ { id: "intellij", label: "IntelliJ IDEA", icon: intellijIcon },
+ { id: "webstorm", label: "WebStorm", icon: webstormIcon },
+ { id: "pycharm", label: "PyCharm", icon: pycharmIcon },
+ { id: "phpstorm", label: "PhpStorm", icon: phpstormIcon },
+ { id: "rubymine", label: "RubyMine", icon: rubymineIcon },
+ { id: "goland", label: "GoLand", icon: golandIcon },
+ { id: "clion", label: "CLion", icon: clionIcon },
+ { id: "rider", label: "Rider", icon: riderIcon },
+ { id: "datagrip", label: "DataGrip", icon: datagripIcon },
+ { id: "appcode", label: "AppCode", icon: appcodeIcon },
+ { id: "fleet", label: "Fleet", icon: fleetIcon },
+ { id: "rustrover", label: "RustRover", icon: rustroverIcon },
+];
+
+const ALL_APP_OPTIONS = [...APP_OPTIONS, ...JETBRAINS_OPTIONS];
+
const getAppOption = (id: ExternalApp) =>
- APP_OPTIONS.find((app) => app.id === id) ?? APP_OPTIONS[1];
+ ALL_APP_OPTIONS.find((app) => app.id === id) ?? APP_OPTIONS[1];
export interface OpenInButtonProps {
path: string | undefined;
@@ -142,6 +175,37 @@ export function OpenInButton({
)}
))}
+
+
+
+ JetBrains
+
+
+ {JETBRAINS_OPTIONS.map((app) => (
+ handleOpenIn(app.id)}
+ className="flex items-center justify-between"
+ >
+
+

+
{app.label}
+
+ {showShortcuts && app.id === lastUsedApp && (
+ ⌘O
+ )}
+
+ ))}
+
+