1
1
mirror of https://github.com/Eugeny/tabby.git synced 2024-11-26 03:27:23 +03:00

added generic hotkeys for profile selectors by type

This commit is contained in:
Eugene Pankov 2021-08-22 20:59:50 +02:00
parent 7120e32c91
commit 59101cfcb3
No known key found for this signature in database
GPG Key ID: 5896FCBBDD1CF4F4
9 changed files with 48 additions and 104 deletions

View File

@ -20,6 +20,8 @@ terminal:
hotkeys:
profile:
__nonStructural: true
profile-selectors:
__nonStructural: true
profiles: []
profileDefaults:
__nonStructural: true

View File

@ -197,6 +197,10 @@ export class AppHotkeyProvider extends HotkeyProvider {
id: `profile.${AppHotkeyProvider.getProfileHotkeyName(profile)}`,
name: `New tab: ${profile.name}`,
})),
...this.profilesService.getProviders().map(provider => ({
id: `profile-selectors.${provider.id}`,
name: `Show ${provider.name} profile selector`,
})),
]
}

View File

@ -34,7 +34,7 @@ import { FastHtmlBindDirective } from './directives/fastHtmlBind.directive'
import { DropZoneDirective } from './directives/dropZone.directive'
import { CdkAutoDropGroup } from './directives/cdkAutoDropGroup.directive'
import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ToolbarButtonProvider, ProfilesService, ProfileProvider } from './api'
import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ToolbarButtonProvider, ProfilesService, ProfileProvider, SelectorOption, Profile, SelectorService } from './api'
import { AppService } from './services/app.service'
import { ConfigService } from './services/config.service'
@ -135,7 +135,8 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
config: ConfigService,
platform: PlatformService,
hotkeys: HotkeysService,
profilesService: ProfilesService,
private profilesService: ProfilesService,
private selector: SelectorService,
) {
app.ready$.subscribe(() => {
config.ready$.toPromise().then(() => {
@ -158,9 +159,44 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
profilesService.openNewTabForProfile(profile)
}
}
if (hotkey.startsWith('profile-selectors.')) {
const id = hotkey.substring(hotkey.indexOf('.') + 1)
const provider = profilesService.getProviders().find(x => x.id === id)
if (!provider) {
return
}
this.showSelector(provider)
}
})
}
async showSelector (provider: ProfileProvider<Profile>): Promise<void> {
let profiles = await this.profilesService.getProfiles()
profiles = profiles.filter(x => !x.isTemplate && x.type === provider.id)
const options: SelectorOption<void>[] = profiles.map(p => ({
...this.profilesService.selectorOptionForProfile(p),
callback: () => this.profilesService.openNewTabForProfile(p),
}))
if (provider.supportsQuickConnect) {
options.push({
name: 'Quick connect',
freeInputPattern: 'Connect to "%s"...',
icon: 'fas fa-arrow-right',
callback: query => {
const p = provider.quickConnect(query)
if (p) {
this.profilesService.openNewTabForProfile(p)
}
},
})
}
await this.selector.show('Select profile', options)
}
static forRoot (): ModuleWithProviders<AppModule> {
return {
ngModule: AppModule,

View File

@ -10,7 +10,6 @@ export class SSHConfigProvider extends ConfigProvider {
agentPath: null,
},
hotkeys: {
'ssh-profile-selector': [],
'restart-ssh-session': [],
'launch-winscp': [],
},

View File

@ -5,10 +5,6 @@ import { HotkeyDescription, HotkeyProvider } from 'tabby-core'
@Injectable()
export class SSHHotkeyProvider extends HotkeyProvider {
hotkeys: HotkeyDescription[] = [
{
id: 'ssh-profile-selector',
name: 'Show SSH profile selector',
},
{
id: 'restart-ssh-session',
name: 'Restart current SSH session',

View File

@ -62,52 +62,8 @@ import { CommonSFTPContextMenu } from './sftpContextMenu'
SFTPPanelComponent,
],
})
export default class SSHModule {
constructor (
hotkeys: HotkeysService,
private app: AppService,
private selector: SelectorService,
private profilesService: ProfilesService,
private sshProfiles: SSHProfilesService,
) {
hotkeys.hotkey$.subscribe(hotkey => {
if (hotkey === 'ssh-profile-selector') {
this.showSelector()
}
})
}
async showSelector (): Promise<void> {
let profiles = await this.profilesService.getProfiles()
profiles = profiles.filter(x => !x.isTemplate && x.type === 'ssh')
const options: SelectorOption<void>[] = profiles.map(p => ({
...this.profilesService.selectorOptionForProfile(p),
callback: () => this.profilesService.openNewTabForProfile(p),
}))
options.push({
name: 'Manage profiles',
icon: 'fas fa-window-restore',
callback: () => this.app.openNewTabRaw({
type: SettingsTabComponent,
inputs: { activeTab: 'profiles' },
}),
})
options.push({
name: 'Quick connect',
freeInputPattern: 'Connect to "%s"...',
icon: 'fas fa-arrow-right',
callback: query => this.profilesService.openNewTabForProfile(
this.sshProfiles.quickConnect(query)
),
})
await this.selector.show('Select an SSH profile', options)
}
}
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
export default class SSHModule { }
export * from './api'
export { SFTPFile, SFTPSession } from './session/sftp'

View File

@ -4,7 +4,6 @@ import { ConfigProvider } from 'tabby-core'
export class TelnetConfigProvider extends ConfigProvider {
defaults = {
hotkeys: {
'telnet-profile-selector': [],
'restart-telnet-session': [],
},
}

View File

@ -5,10 +5,6 @@ import { HotkeyDescription, HotkeyProvider } from 'tabby-core'
@Injectable()
export class TelnetHotkeyProvider extends HotkeyProvider {
hotkeys: HotkeyDescription[] = [
{
id: 'telnet-profile-selector',
name: 'Show Telnet profile selector',
},
{
id: 'restart-telnet-session',
name: 'Restart current Telnet session',

View File

@ -42,49 +42,5 @@ import { TelnetProfilesService } from './profiles'
TelnetTabComponent,
],
})
export default class TelnetModule {
constructor (
hotkeys: HotkeysService,
private app: AppService,
private selector: SelectorService,
private profilesService: ProfilesService,
private telnetProfiles: TelnetProfilesService,
) {
hotkeys.hotkey$.subscribe(hotkey => {
if (hotkey === 'telnet-profile-selector') {
this.showSelector()
}
})
}
async showSelector (): Promise<void> {
let profiles = await this.profilesService.getProfiles()
profiles = profiles.filter(x => !x.isTemplate && x.type === 'telnet')
const options: SelectorOption<void>[] = profiles.map(p => ({
...this.profilesService.selectorOptionForProfile(p),
callback: () => this.profilesService.openNewTabForProfile(p),
}))
options.push({
name: 'Manage profiles',
icon: 'fas fa-window-restore',
callback: () => this.app.openNewTabRaw({
type: SettingsTabComponent,
inputs: { activeTab: 'profiles' },
}),
})
options.push({
name: 'Quick connect',
freeInputPattern: 'Connect to "%s"...',
icon: 'fas fa-arrow-right',
callback: query => this.profilesService.openNewTabForProfile(
this.telnetProfiles.quickConnect(query)
),
})
await this.selector.show('Select an Telnet profile', options)
}
}
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
export default class TelnetModule { }