mirror of
https://github.com/Eugeny/tabby.git
synced 2025-06-15 17:09:59 +00:00
137 lines
5.0 KiB
TypeScript
137 lines
5.0 KiB
TypeScript
import { Injectable } from '@angular/core'
|
|
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
|
import { ConfigService, BaseTabComponent, TabContextMenuItemProvider, NotificationsService, MenuItemOptions, ProfilesService, PromptModalComponent, TranslateService } from 'tabby-core'
|
|
import { TerminalTabComponent } from './components/terminalTab.component'
|
|
import { UACService } from './services/uac.service'
|
|
import { TerminalService } from './services/terminal.service'
|
|
import { LocalProfile } from './api'
|
|
|
|
/** @hidden */
|
|
@Injectable()
|
|
export class SaveAsProfileContextMenu extends TabContextMenuItemProvider {
|
|
constructor (
|
|
private config: ConfigService,
|
|
private ngbModal: NgbModal,
|
|
private notifications: NotificationsService,
|
|
private translate: TranslateService,
|
|
) {
|
|
super()
|
|
}
|
|
|
|
async getItems (tab: BaseTabComponent): Promise<MenuItemOptions[]> {
|
|
if (!(tab instanceof TerminalTabComponent)) {
|
|
return []
|
|
}
|
|
const items: MenuItemOptions[] = [
|
|
{
|
|
label: this.translate.instant('Save as profile'),
|
|
click: async () => {
|
|
const modal = this.ngbModal.open(PromptModalComponent)
|
|
modal.componentInstance.prompt = this.translate.instant('New profile name')
|
|
const name = (await modal.result)?.value
|
|
if (!name) {
|
|
return
|
|
}
|
|
const profile = {
|
|
options: {
|
|
...tab.profile.options,
|
|
cwd: await tab.session?.getWorkingDirectory() ?? tab.profile.options.cwd,
|
|
},
|
|
name,
|
|
type: 'local',
|
|
}
|
|
this.config.store.profiles = [
|
|
...this.config.store.profiles,
|
|
profile,
|
|
]
|
|
this.config.save()
|
|
this.notifications.info(this.translate.instant('Saved'))
|
|
},
|
|
},
|
|
]
|
|
|
|
return items
|
|
}
|
|
}
|
|
|
|
/** @hidden */
|
|
@Injectable()
|
|
export class NewTabContextMenu extends TabContextMenuItemProvider {
|
|
weight = 10
|
|
|
|
constructor (
|
|
public config: ConfigService,
|
|
private profilesService: ProfilesService,
|
|
private terminalService: TerminalService,
|
|
private uac: UACService,
|
|
private translate: TranslateService,
|
|
) {
|
|
super()
|
|
}
|
|
|
|
async getItems (tab: BaseTabComponent, tabHeader?: boolean): Promise<MenuItemOptions[]> {
|
|
const profiles = (await this.profilesService.getProfiles()).filter(x => x.type === 'local') as LocalProfile[]
|
|
|
|
const items: MenuItemOptions[] = [
|
|
{
|
|
label: this.translate.instant('New terminal'),
|
|
click: () => {
|
|
if (tab instanceof TerminalTabComponent) {
|
|
this.profilesService.openNewTabForProfile(tab.profile)
|
|
} else {
|
|
this.terminalService.openTab()
|
|
}
|
|
},
|
|
},
|
|
{
|
|
label: this.translate.instant('New with profile'),
|
|
submenu: profiles.map(profile => ({
|
|
label: profile.name,
|
|
click: async () => {
|
|
let workingDirectory = profile.options.cwd
|
|
if (!workingDirectory && tab instanceof TerminalTabComponent) {
|
|
workingDirectory = await tab.session?.getWorkingDirectory() ?? undefined
|
|
}
|
|
await this.terminalService.openTab(profile, workingDirectory)
|
|
},
|
|
})),
|
|
},
|
|
]
|
|
|
|
if (this.uac.isAvailable) {
|
|
items.push({
|
|
label: this.translate.instant('New admin tab'),
|
|
submenu: profiles.map(profile => ({
|
|
label: profile.name,
|
|
click: () => {
|
|
this.profilesService.openNewTabForProfile({
|
|
...profile,
|
|
options: {
|
|
...profile.options,
|
|
runAsAdministrator: true,
|
|
},
|
|
})
|
|
},
|
|
})),
|
|
})
|
|
}
|
|
|
|
if (tab instanceof TerminalTabComponent && tabHeader && this.uac.isAvailable) {
|
|
items.push({
|
|
label: this.translate.instant('Duplicate as administrator'),
|
|
click: () => {
|
|
this.profilesService.openNewTabForProfile({
|
|
...tab.profile,
|
|
options: {
|
|
...tab.profile.options,
|
|
runAsAdministrator: true,
|
|
},
|
|
})
|
|
},
|
|
})
|
|
}
|
|
|
|
return items
|
|
}
|
|
}
|