index.ts 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import { NgModule, ModuleWithProviders, LOCALE_ID } from '@angular/core'
  2. import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
  3. import { CommonModule } from '@angular/common'
  4. import { FormsModule } from '@angular/forms'
  5. import { NgbModule } from '@ng-bootstrap/ng-bootstrap'
  6. import { NgxFilesizeModule } from 'ngx-filesize'
  7. import { DragDropModule } from '@angular/cdk/drag-drop'
  8. import { TranslateModule, TranslateCompiler, TranslateService } from '@ngx-translate/core'
  9. import { TranslateMessageFormatCompiler, MESSAGE_FORMAT_CONFIG } from 'ngx-translate-messageformat-compiler'
  10. import { AppRootComponent } from './components/appRoot.component'
  11. import { CheckboxComponent } from './components/checkbox.component'
  12. import { TabBodyComponent } from './components/tabBody.component'
  13. import { PromptModalComponent } from './components/promptModal.component'
  14. import { SafeModeModalComponent } from './components/safeModeModal.component'
  15. import { StartPageComponent } from './components/startPage.component'
  16. import { TabHeaderComponent } from './components/tabHeader.component'
  17. import { TitleBarComponent } from './components/titleBar.component'
  18. import { ToggleComponent } from './components/toggle.component'
  19. import { WindowControlsComponent } from './components/windowControls.component'
  20. import { RenameTabModalComponent } from './components/renameTabModal.component'
  21. import { SelectorModalComponent } from './components/selectorModal.component'
  22. import { SplitTabComponent, SplitTabRecoveryProvider } from './components/splitTab.component'
  23. import { SplitTabSpannerComponent } from './components/splitTabSpanner.component'
  24. import { SplitTabDropZoneComponent } from './components/splitTabDropZone.component'
  25. import { SplitTabPaneLabelComponent } from './components/splitTabPaneLabel.component'
  26. import { UnlockVaultModalComponent } from './components/unlockVaultModal.component'
  27. import { WelcomeTabComponent } from './components/welcomeTab.component'
  28. import { TransfersMenuComponent } from './components/transfersMenu.component'
  29. import { ProfileIconComponent } from './components/profileIcon.component'
  30. import { AutofocusDirective } from './directives/autofocus.directive'
  31. import { AlwaysVisibleTypeaheadDirective } from './directives/alwaysVisibleTypeahead.directive'
  32. import { FastHtmlBindDirective } from './directives/fastHtmlBind.directive'
  33. import { DropZoneDirective } from './directives/dropZone.directive'
  34. import { CdkAutoDropGroup } from './directives/cdkAutoDropGroup.directive'
  35. import { Theme, CLIHandler, TabContextMenuItemProvider, TabRecoveryProvider, HotkeyProvider, ConfigProvider, PlatformService, FileProvider, ProfilesService, ProfileProvider, SelectorOption, Profile, SelectorService, CommandProvider } from './api'
  36. import { AppService } from './services/app.service'
  37. import { ConfigService } from './services/config.service'
  38. import { VaultFileProvider } from './services/vault.service'
  39. import { HotkeysService } from './services/hotkeys.service'
  40. import { LocaleService } from './services/locale.service'
  41. import { CommandService } from './services/commands.service'
  42. import { StandardTheme, StandardCompactTheme, PaperTheme, NewTheme } from './theme'
  43. import { CoreConfigProvider } from './config'
  44. import { AppHotkeyProvider } from './hotkeys'
  45. import { TaskCompletionContextMenu, CommonOptionsContextMenu, TabManagementContextMenu, ProfilesContextMenu } from './tabContextMenu'
  46. import { LastCLIHandler, ProfileCLIHandler } from './cli'
  47. import { SplitLayoutProfilesService } from './profiles'
  48. import { CoreCommandProvider } from './commands'
  49. export function TranslateMessageFormatCompilerFactory (): TranslateMessageFormatCompiler {
  50. return new TranslateMessageFormatCompiler()
  51. }
  52. const PROVIDERS = [
  53. { provide: HotkeyProvider, useClass: AppHotkeyProvider, multi: true },
  54. { provide: Theme, useClass: StandardTheme, multi: true },
  55. { provide: Theme, useClass: StandardCompactTheme, multi: true },
  56. { provide: Theme, useClass: PaperTheme, multi: true },
  57. { provide: Theme, useClass: NewTheme, multi: true },
  58. { provide: ConfigProvider, useClass: CoreConfigProvider, multi: true },
  59. { provide: TabContextMenuItemProvider, useClass: CommonOptionsContextMenu, multi: true },
  60. { provide: TabContextMenuItemProvider, useClass: TabManagementContextMenu, multi: true },
  61. { provide: TabContextMenuItemProvider, useClass: TaskCompletionContextMenu, multi: true },
  62. { provide: TabContextMenuItemProvider, useClass: ProfilesContextMenu, multi: true },
  63. { provide: TabRecoveryProvider, useExisting: SplitTabRecoveryProvider, multi: true },
  64. { provide: CLIHandler, useClass: ProfileCLIHandler, multi: true },
  65. { provide: CLIHandler, useClass: LastCLIHandler, multi: true },
  66. { provide: FileProvider, useClass: VaultFileProvider, multi: true },
  67. { provide: ProfileProvider, useExisting: SplitLayoutProfilesService, multi: true },
  68. { provide: CommandProvider, useExisting: CoreCommandProvider, multi: true },
  69. {
  70. provide: LOCALE_ID,
  71. deps: [LocaleService],
  72. useFactory: locale => locale.getLocale(),
  73. },
  74. {
  75. provide: MESSAGE_FORMAT_CONFIG,
  76. useValue: LocaleService.allLanguages.map(x => x.code),
  77. },
  78. ]
  79. /** @hidden */
  80. @NgModule({
  81. imports: [
  82. BrowserAnimationsModule,
  83. CommonModule,
  84. FormsModule,
  85. NgbModule,
  86. NgxFilesizeModule,
  87. DragDropModule,
  88. TranslateModule.forRoot({
  89. defaultLanguage: 'en',
  90. compiler: {
  91. provide: TranslateCompiler,
  92. useFactory: TranslateMessageFormatCompilerFactory,
  93. },
  94. }),
  95. ],
  96. declarations: [
  97. AppRootComponent,
  98. CheckboxComponent,
  99. PromptModalComponent,
  100. StartPageComponent,
  101. TabBodyComponent,
  102. TabHeaderComponent,
  103. TitleBarComponent,
  104. ToggleComponent,
  105. WindowControlsComponent,
  106. RenameTabModalComponent,
  107. SafeModeModalComponent,
  108. AutofocusDirective,
  109. FastHtmlBindDirective,
  110. AlwaysVisibleTypeaheadDirective,
  111. SelectorModalComponent,
  112. SplitTabComponent,
  113. SplitTabSpannerComponent,
  114. SplitTabDropZoneComponent,
  115. SplitTabPaneLabelComponent,
  116. UnlockVaultModalComponent,
  117. WelcomeTabComponent,
  118. TransfersMenuComponent,
  119. DropZoneDirective,
  120. CdkAutoDropGroup,
  121. ProfileIconComponent,
  122. ],
  123. exports: [
  124. AppRootComponent,
  125. CheckboxComponent,
  126. ToggleComponent,
  127. PromptModalComponent,
  128. AutofocusDirective,
  129. DropZoneDirective,
  130. FastHtmlBindDirective,
  131. AlwaysVisibleTypeaheadDirective,
  132. DragDropModule,
  133. TranslateModule,
  134. CdkAutoDropGroup,
  135. ProfileIconComponent,
  136. ],
  137. })
  138. export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class
  139. constructor (
  140. app: AppService,
  141. config: ConfigService,
  142. platform: PlatformService,
  143. hotkeys: HotkeysService,
  144. commands: CommandService,
  145. public locale: LocaleService,
  146. private translate: TranslateService,
  147. private profilesService: ProfilesService,
  148. private selector: SelectorService,
  149. ) {
  150. app.ready$.subscribe(() => {
  151. config.ready$.toPromise().then(() => {
  152. if (config.store.enableWelcomeTab) {
  153. app.openNewTabRaw({ type: WelcomeTabComponent })
  154. }
  155. })
  156. })
  157. platform.setErrorHandler(err => {
  158. console.error('Unhandled exception:', err)
  159. })
  160. hotkeys.hotkey$.subscribe(async hotkey => {
  161. if (hotkey.startsWith('profile.')) {
  162. const id = hotkey.substring(hotkey.indexOf('.') + 1)
  163. const profiles = await profilesService.getProfiles()
  164. const profile = profiles.find(x => AppHotkeyProvider.getProfileHotkeyName(x) === id)
  165. if (profile) {
  166. profilesService.openNewTabForProfile(profile)
  167. }
  168. }
  169. if (hotkey.startsWith('profile-selectors.')) {
  170. const id = hotkey.substring(hotkey.indexOf('.') + 1)
  171. const provider = profilesService.getProviders().find(x => x.id === id)
  172. if (!provider) {
  173. return
  174. }
  175. this.showSelector(provider)
  176. }
  177. if (hotkey === 'command-selector') {
  178. commands.showSelector()
  179. }
  180. if (hotkey === 'profile-selector') {
  181. commands.run('profile-selector', {})
  182. }
  183. })
  184. }
  185. async showSelector (provider: ProfileProvider<Profile>): Promise<void> {
  186. if (this.selector.active) {
  187. return
  188. }
  189. let profiles = await this.profilesService.getProfiles()
  190. profiles = profiles.filter(x => !x.isTemplate && x.type === provider.id)
  191. const options: SelectorOption<void>[] = profiles.map(p => ({
  192. ...this.profilesService.selectorOptionForProfile(p),
  193. callback: () => this.profilesService.openNewTabForProfile(p),
  194. }))
  195. if (provider.supportsQuickConnect) {
  196. options.push({
  197. name: this.translate.instant('Quick connect'),
  198. freeInputPattern: this.translate.instant('Connect to "%s"...'),
  199. icon: 'fas fa-arrow-right',
  200. callback: query => {
  201. const p = provider.quickConnect(query)
  202. if (p) {
  203. this.profilesService.openNewTabForProfile(p)
  204. }
  205. },
  206. })
  207. }
  208. await this.selector.show(this.translate.instant('Select profile'), options)
  209. }
  210. static forRoot (): ModuleWithProviders<AppModule> {
  211. return {
  212. ngModule: AppModule,
  213. providers: [
  214. ...PROVIDERS,
  215. ],
  216. }
  217. }
  218. }
  219. export { AppRootComponent as bootstrap }
  220. export * from './api'
  221. export { AppHotkeyProvider }
  222. // Deprecations
  223. export { ToolbarButton as IToolbarButton } from './api'
  224. export { HotkeyDescription as IHotkeyDescription } from './api'