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 + + + {JETBRAINS_OPTIONS.map((app) => ( + handleOpenIn(app.id)} + className="flex items-center justify-between" + > +
+ {app.label} + {app.label} +
+ {showShortcuts && app.id === lastUsedApp && ( + ⌘O + )} +
+ ))} +
+