wip
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 909 KiB After Width: | Height: | Size: 909 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 260 KiB After Width: | Height: | Size: 260 KiB |
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 92 KiB |
Before Width: | Height: | Size: 314 KiB After Width: | Height: | Size: 314 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 383 KiB After Width: | Height: | Size: 383 KiB |
Before Width: | Height: | Size: 390 KiB After Width: | Height: | Size: 390 KiB |
Before Width: | Height: | Size: 614 KiB After Width: | Height: | Size: 614 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
7
frontend/src/app.component.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { Component } from '@angular/core'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app',
|
||||||
|
template: '<router-outlet></router-outlet>',
|
||||||
|
})
|
||||||
|
export class AppComponent { }
|
@@ -5,20 +5,13 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
|
|||||||
import { CommonModule } from '@angular/common'
|
import { CommonModule } from '@angular/common'
|
||||||
import { FormsModule } from '@angular/forms'
|
import { FormsModule } from '@angular/forms'
|
||||||
import { RouterModule } from '@angular/router'
|
import { RouterModule } from '@angular/router'
|
||||||
import { HttpClientModule, HttpClientXsrfModule, HTTP_INTERCEPTORS } from '@angular/common/http'
|
|
||||||
import { ClipboardModule } from '@angular/cdk/clipboard'
|
import { ClipboardModule } from '@angular/cdk/clipboard'
|
||||||
import { TransferHttpCacheModule } from '@nguniversal/common'
|
import { TransferHttpCacheModule } from '@nguniversal/common'
|
||||||
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'
|
||||||
|
import { HttpClientModule } from '@angular/common/http'
|
||||||
|
|
||||||
import { BackendXsrfInterceptor, UniversalInterceptor } from './interceptor'
|
import { AppComponent } from './app.component'
|
||||||
import { AppComponent } from './components/app.component'
|
import { CommonAppModule } from 'src/common'
|
||||||
import { MainComponent } from './components/main.component'
|
|
||||||
import { ConfigModalComponent } from './components/configModal.component'
|
|
||||||
import { SettingsModalComponent } from './components/settingsModal.component'
|
|
||||||
import { LoginComponent } from './components/login.component'
|
|
||||||
import { ConnectionListComponent } from './components/connectionList.component'
|
|
||||||
import { UpgradeModalComponent } from './components/upgradeModal.component'
|
|
||||||
import { InstanceInfoResolver } from './api'
|
|
||||||
|
|
||||||
import '@fortawesome/fontawesome-svg-core/styles.css'
|
import '@fortawesome/fontawesome-svg-core/styles.css'
|
||||||
|
|
||||||
@@ -29,17 +22,11 @@ const ROUTES = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'app',
|
path: 'app',
|
||||||
component: MainComponent,
|
loadChildren: () => import(/* webpackChunkName: "app" */'./app').then(m => m.ApplicationModule),
|
||||||
resolve: {
|
|
||||||
instanceInfo: InstanceInfoResolver,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'login',
|
path: 'login',
|
||||||
component: LoginComponent,
|
loadChildren: () => import(/* webpackChunkName: "login" */'./login').then(m => m.LoginModule),
|
||||||
resolve: {
|
|
||||||
instanceInfo: InstanceInfoResolver,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -48,30 +35,20 @@ const ROUTES = [
|
|||||||
BrowserModule.withServerTransition({
|
BrowserModule.withServerTransition({
|
||||||
appId: 'tabby',
|
appId: 'tabby',
|
||||||
}),
|
}),
|
||||||
|
CommonAppModule.forRoot(),
|
||||||
TransferHttpCacheModule,
|
TransferHttpCacheModule,
|
||||||
BrowserAnimationsModule,
|
BrowserAnimationsModule,
|
||||||
CommonModule,
|
CommonModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
HttpClientModule,
|
|
||||||
HttpClientXsrfModule,
|
|
||||||
NgbDropdownModule,
|
NgbDropdownModule,
|
||||||
NgbModalModule,
|
NgbModalModule,
|
||||||
FontAwesomeModule,
|
FontAwesomeModule,
|
||||||
ClipboardModule,
|
ClipboardModule,
|
||||||
|
HttpClientModule,
|
||||||
RouterModule.forRoot(ROUTES),
|
RouterModule.forRoot(ROUTES),
|
||||||
],
|
],
|
||||||
providers: [
|
|
||||||
{ provide: HTTP_INTERCEPTORS, useClass: UniversalInterceptor, multi: true },
|
|
||||||
{ provide: HTTP_INTERCEPTORS, useClass: BackendXsrfInterceptor, multi: true },
|
|
||||||
],
|
|
||||||
declarations: [
|
declarations: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
MainComponent,
|
|
||||||
LoginComponent,
|
|
||||||
ConfigModalComponent,
|
|
||||||
SettingsModalComponent,
|
|
||||||
ConnectionListComponent,
|
|
||||||
UpgradeModalComponent,
|
|
||||||
],
|
],
|
||||||
bootstrap: [AppComponent],
|
bootstrap: [AppComponent],
|
||||||
})
|
})
|
||||||
|
@@ -1,18 +1,14 @@
|
|||||||
import { NgModule } from '@angular/core'
|
import { NgModule } from '@angular/core'
|
||||||
import { ServerModule, ServerTransferStateModule } from '@angular/platform-server'
|
import { ServerModule, ServerTransferStateModule } from '@angular/platform-server'
|
||||||
import { AppModule } from './app.module'
|
import { AppModule } from './app.module'
|
||||||
import { AppComponent } from './components/app.component'
|
import { AppComponent } from './app.component'
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
// The AppServerModule should import your AppModule followed
|
|
||||||
// by the ServerModule from @angular/platform-server.
|
|
||||||
AppModule,
|
AppModule,
|
||||||
ServerModule,
|
ServerModule,
|
||||||
ServerTransferStateModule,
|
ServerTransferStateModule,
|
||||||
],
|
],
|
||||||
// Since the bootstrapped component is not inherited from your
|
|
||||||
// imported AppModule, it needs to be repeated here.
|
|
||||||
bootstrap: [AppComponent],
|
bootstrap: [AppComponent],
|
||||||
})
|
})
|
||||||
export class AppServerModule {}
|
export class AppServerModule {}
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
import { Component } from '@angular/core'
|
import { Component } from '@angular/core'
|
||||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
||||||
import { AppConnectorService } from '../services/appConnector.service'
|
import { AppConnectorService } from '../services/appConnector.service'
|
||||||
import { ConfigService } from '../services/config.service'
|
import { ConfigService } from 'src/common'
|
||||||
import { faCopy, faFile, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons'
|
import { faCopy, faFile, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { Config, Version } from '../api'
|
import { Config, Version } from 'src/api'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'config-modal',
|
selector: 'config-modal',
|
@@ -1,4 +1,4 @@
|
|||||||
@import "../theme/vars";
|
@import "theme/vars";
|
||||||
|
|
||||||
:host {
|
:host {
|
||||||
position: absolute;
|
position: absolute;
|
@@ -4,13 +4,12 @@ import { Title } from '@angular/platform-browser'
|
|||||||
import { AppConnectorService } from '../services/appConnector.service'
|
import { AppConnectorService } from '../services/appConnector.service'
|
||||||
|
|
||||||
import { faCog, faFile, faPlus, faSignOutAlt } from '@fortawesome/free-solid-svg-icons'
|
import { faCog, faFile, faPlus, faSignOutAlt } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { LoginService } from '../services/login.service'
|
|
||||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||||
import { SettingsModalComponent } from './settingsModal.component'
|
import { SettingsModalComponent } from './settingsModal.component'
|
||||||
import { ConfigModalComponent } from './configModal.component'
|
import { ConfigModalComponent } from './configModal.component'
|
||||||
import { ConfigService } from '../services/config.service'
|
import { ConfigService, LoginService } from 'src/common'
|
||||||
import { combineLatest } from 'rxjs'
|
import { combineLatest } from 'rxjs'
|
||||||
import { Config, Version } from '../api'
|
import { Config, Version } from 'src/api'
|
||||||
import { Router } from '@angular/router'
|
import { Router } from '@angular/router'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -19,7 +18,7 @@ import { Router } from '@angular/router'
|
|||||||
styleUrls: ['./main.component.scss'],
|
styleUrls: ['./main.component.scss'],
|
||||||
})
|
})
|
||||||
export class MainComponent {
|
export class MainComponent {
|
||||||
_logo = require('../assets/logo.svg')
|
_logo = require('assets/logo.svg')
|
||||||
_settingsIcon = faCog
|
_settingsIcon = faCog
|
||||||
_logoutIcon = faSignOutAlt
|
_logoutIcon = faSignOutAlt
|
||||||
_addIcon = faPlus
|
_addIcon = faPlus
|
@@ -1,17 +1,14 @@
|
|||||||
import { Component } from '@angular/core'
|
import { Component } from '@angular/core'
|
||||||
import { LoginService } from '../services/login.service'
|
|
||||||
|
|
||||||
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
||||||
import { User } from '../api'
|
import { User } from 'src/api'
|
||||||
|
import { CommonService, LoginService } from 'src/common'
|
||||||
import { AppConnectorService } from '../services/appConnector.service'
|
import { AppConnectorService } from '../services/appConnector.service'
|
||||||
import { CommonService } from '../services/common.service'
|
|
||||||
import { faGithub } from '@fortawesome/free-brands-svg-icons'
|
import { faGithub } from '@fortawesome/free-brands-svg-icons'
|
||||||
import { faCheck, faCopy } from '@fortawesome/free-solid-svg-icons'
|
import { faCheck, faCopy } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'settings-modal',
|
selector: 'settings-modal',
|
||||||
templateUrl: './settingsModal.component.pug',
|
templateUrl: './settingsModal.component.pug',
|
||||||
// styleUrls: ['./settingsModal.component.scss'],
|
|
||||||
})
|
})
|
||||||
export class SettingsModalComponent {
|
export class SettingsModalComponent {
|
||||||
user: User
|
user: User
|
@@ -3,10 +3,9 @@ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
|
|||||||
import { faGithub } from '@fortawesome/free-brands-svg-icons'
|
import { faGithub } from '@fortawesome/free-brands-svg-icons'
|
||||||
import { faGift, faHeart } from '@fortawesome/free-solid-svg-icons'
|
import { faGift, faHeart } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
import { LoginService } from '../services/login.service'
|
|
||||||
import { AppConnectorService } from '../services/appConnector.service'
|
import { AppConnectorService } from '../services/appConnector.service'
|
||||||
import { CommonService } from '../services/common.service'
|
import { CommonService, LoginService } from 'src/common'
|
||||||
import { User } from '../api'
|
import { User } from 'src/api'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'upgrade-modal',
|
selector: 'upgrade-modal',
|
46
frontend/src/app/index.ts
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import { NgModule } from '@angular/core'
|
||||||
|
import { NgbDropdownModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'
|
||||||
|
import { CommonModule } from '@angular/common'
|
||||||
|
import { FormsModule } from '@angular/forms'
|
||||||
|
import { RouterModule } from '@angular/router'
|
||||||
|
import { ClipboardModule } from '@angular/cdk/clipboard'
|
||||||
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'
|
||||||
|
|
||||||
|
import { MainComponent } from './components/main.component'
|
||||||
|
import { ConfigModalComponent } from './components/configModal.component'
|
||||||
|
import { SettingsModalComponent } from './components/settingsModal.component'
|
||||||
|
import { ConnectionListComponent } from './components/connectionList.component'
|
||||||
|
import { UpgradeModalComponent } from './components/upgradeModal.component'
|
||||||
|
import { InstanceInfoResolver } from 'src/api'
|
||||||
|
import { CommonAppModule } from 'src/common'
|
||||||
|
|
||||||
|
const ROUTES = [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: MainComponent,
|
||||||
|
resolve: {
|
||||||
|
instanceInfo: InstanceInfoResolver,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
CommonAppModule,
|
||||||
|
CommonModule,
|
||||||
|
FormsModule,
|
||||||
|
NgbDropdownModule,
|
||||||
|
NgbModalModule,
|
||||||
|
ClipboardModule,
|
||||||
|
FontAwesomeModule,
|
||||||
|
RouterModule.forChild(ROUTES),
|
||||||
|
],
|
||||||
|
declarations: [
|
||||||
|
MainComponent,
|
||||||
|
ConfigModalComponent,
|
||||||
|
SettingsModalComponent,
|
||||||
|
ConnectionListComponent,
|
||||||
|
UpgradeModalComponent,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class ApplicationModule { }
|
@@ -5,9 +5,8 @@ import { HttpClient } from '@angular/common/http'
|
|||||||
import { Injectable, Injector, NgZone } from '@angular/core'
|
import { Injectable, Injector, NgZone } from '@angular/core'
|
||||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||||
import { UpgradeModalComponent } from '../components/upgradeModal.component'
|
import { UpgradeModalComponent } from '../components/upgradeModal.component'
|
||||||
import { Config, Gateway, Version } from '../api'
|
import { Config, Gateway, Version } from 'src/api'
|
||||||
import { LoginService } from './login.service'
|
import { LoginService, CommonService } from 'src/common'
|
||||||
import { CommonService } from './common.service'
|
|
||||||
|
|
||||||
export class SocketProxy {
|
export class SocketProxy {
|
||||||
connect$ = new Subject<void>()
|
connect$ = new Subject<void>()
|
24
frontend/src/common/index.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { ModuleWithProviders, NgModule } from '@angular/core'
|
||||||
|
import { HttpClientXsrfModule, HTTP_INTERCEPTORS } from '@angular/common/http'
|
||||||
|
import { BackendXsrfInterceptor, UniversalInterceptor } from './interceptor'
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
HttpClientXsrfModule,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class CommonAppModule {
|
||||||
|
static forRoot (): ModuleWithProviders<CommonAppModule> {
|
||||||
|
return {
|
||||||
|
ngModule: CommonAppModule,
|
||||||
|
providers: [
|
||||||
|
{ provide: HTTP_INTERCEPTORS, useClass: UniversalInterceptor, multi: true },
|
||||||
|
{ provide: HTTP_INTERCEPTORS, useClass: BackendXsrfInterceptor, multi: true },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { LoginService } from './services/login.service'
|
||||||
|
export { ConfigService } from './services/config.service'
|
||||||
|
export { CommonService } from './services/common.service'
|
@@ -3,7 +3,7 @@ import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpXsrfTokenExtr
|
|||||||
import { Observable } from 'rxjs'
|
import { Observable } from 'rxjs'
|
||||||
import { CommonService } from './services/common.service'
|
import { CommonService } from './services/common.service'
|
||||||
|
|
||||||
@Injectable()
|
@Injectable({ providedIn: 'root' })
|
||||||
export class UniversalInterceptor implements HttpInterceptor {
|
export class UniversalInterceptor implements HttpInterceptor {
|
||||||
constructor (private commonService: CommonService) { }
|
constructor (private commonService: CommonService) { }
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ export class UniversalInterceptor implements HttpInterceptor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable({ providedIn: 'root' })
|
||||||
export class BackendXsrfInterceptor implements HttpInterceptor {
|
export class BackendXsrfInterceptor implements HttpInterceptor {
|
||||||
constructor (
|
constructor (
|
||||||
private commonService: CommonService,
|
private commonService: CommonService,
|
@@ -2,7 +2,7 @@ import * as semverCompare from 'semver/functions/compare-loose'
|
|||||||
import { AsyncSubject, Subject } from 'rxjs'
|
import { AsyncSubject, Subject } from 'rxjs'
|
||||||
import { HttpClient } from '@angular/common/http'
|
import { HttpClient } from '@angular/common/http'
|
||||||
import { Injectable } from '@angular/core'
|
import { Injectable } from '@angular/core'
|
||||||
import { Config, User, Version } from '../api'
|
import { Config, User, Version } from '../../api'
|
||||||
import { LoginService } from './login.service'
|
import { LoginService } from './login.service'
|
||||||
|
|
||||||
|
|
@@ -1,7 +1,7 @@
|
|||||||
import { AsyncSubject } from 'rxjs'
|
import { AsyncSubject } from 'rxjs'
|
||||||
import { HttpClient } from '@angular/common/http'
|
import { HttpClient } from '@angular/common/http'
|
||||||
import { Injectable } from '@angular/core'
|
import { Injectable } from '@angular/core'
|
||||||
import { User } from '../api'
|
import { User } from '../../api'
|
||||||
|
|
||||||
|
|
||||||
@Injectable({ providedIn: 'root' })
|
@Injectable({ providedIn: 'root' })
|
@@ -1 +0,0 @@
|
|||||||
router-outlet
|
|
@@ -1,9 +0,0 @@
|
|||||||
import { Component } from '@angular/core'
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app',
|
|
||||||
templateUrl: './app.component.pug',
|
|
||||||
// styleUrls: ['./app.component.scss'],
|
|
||||||
})
|
|
||||||
export class AppComponent {
|
|
||||||
}
|
|
@@ -1,4 +1,4 @@
|
|||||||
@import "../../theme/vars.scss";
|
@import "theme/vars";
|
||||||
|
|
||||||
:host {
|
:host {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@@ -2,8 +2,8 @@ import { Subject } from 'rxjs'
|
|||||||
import * as semverCompare from 'semver/functions/compare-loose'
|
import * as semverCompare from 'semver/functions/compare-loose'
|
||||||
import { HttpClient } from '@angular/common/http'
|
import { HttpClient } from '@angular/common/http'
|
||||||
import { Component, ElementRef, ViewChild } from '@angular/core'
|
import { Component, ElementRef, ViewChild } from '@angular/core'
|
||||||
import { Version } from '../../api'
|
import { Version } from 'src/api'
|
||||||
import { CommonService } from '../../services/common.service'
|
import { CommonService } from 'src/common'
|
||||||
|
|
||||||
class DemoConnector {
|
class DemoConnector {
|
||||||
constructor (
|
constructor (
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@import "../../theme/vars.scss";
|
@import "theme/vars";
|
||||||
@import "~@fontsource/fira-code/latin.css";
|
@import "~@fontsource/fira-code/latin.css";
|
||||||
|
|
||||||
:host {
|
:host {
|
||||||
|
@@ -2,7 +2,7 @@ import { Component } from '@angular/core'
|
|||||||
import { ActivatedRoute, Router } from '@angular/router'
|
import { ActivatedRoute, Router } from '@angular/router'
|
||||||
import { faCoffee, faDownload, faSignInAlt } from '@fortawesome/free-solid-svg-icons'
|
import { faCoffee, faDownload, faSignInAlt } from '@fortawesome/free-solid-svg-icons'
|
||||||
import { Waves } from '../vanta/vanta.waves.js'
|
import { Waves } from '../vanta/vanta.waves.js'
|
||||||
import { InstanceInfo } from '../../api'
|
import { InstanceInfo } from 'src/api'
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@@ -15,7 +15,7 @@ export class HomeComponent {
|
|||||||
releaseURL = `${this.githubURL}/releases/latest`
|
releaseURL = `${this.githubURL}/releases/latest`
|
||||||
donationURL = 'https://ko-fi.com/eugeny'
|
donationURL = 'https://ko-fi.com/eugeny'
|
||||||
|
|
||||||
_logo = require('../../assets/logo.svg')
|
_logo = require('assets/logo.svg')
|
||||||
_downloadIcon = faDownload
|
_downloadIcon = faDownload
|
||||||
_loginIcon = faSignInAlt
|
_loginIcon = faSignInAlt
|
||||||
_donateIcon = faCoffee
|
_donateIcon = faCoffee
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
.container.mt-5.mb-5
|
.container.mt-5.mb-5
|
||||||
h1 Features
|
h1 Features
|
||||||
|
|
||||||
.row.mb-5
|
.row
|
||||||
.col-12.col-md-4
|
.col-12.col-md-4
|
||||||
.card.bg-dark
|
.card.bg-dark
|
||||||
img.card-img-top([src]='screenshots.progress')
|
img.card-img-top([src]='screenshots.progress')
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
h5.card-title Customizable hotkeys
|
h5.card-title Customizable hotkeys
|
||||||
.card-text Freely customizable single and multi-chord shortcuts.
|
.card-text Freely customizable single and multi-chord shortcuts.
|
||||||
|
|
||||||
.row.mb-5
|
.row
|
||||||
.col-12.col-md-4
|
.col-12.col-md-4
|
||||||
.card.bg-dark
|
.card.bg-dark
|
||||||
img.card-img-top([src]='screenshots.ssh2')
|
img.card-img-top([src]='screenshots.ssh2')
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
h5.card-title Zmodem transfers
|
h5.card-title Zmodem transfers
|
||||||
.card-text Send and receive files directly form the prompt in SSH, telnet and serial session.
|
.card-text Send and receive files directly form the prompt in SSH, telnet and serial session.
|
||||||
|
|
||||||
.row.mb-5
|
.row
|
||||||
.col-12.col-md-4
|
.col-12.col-md-4
|
||||||
.card.bg-dark
|
.card.bg-dark
|
||||||
img.card-img-top([src]='screenshots.quake')
|
img.card-img-top([src]='screenshots.quake')
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
h5.card-title Profile manager
|
h5.card-title Profile manager
|
||||||
.card-text Every option configurable combined in a profile startable a hotkey.
|
.card-text Every option configurable combined in a profile startable a hotkey.
|
||||||
|
|
||||||
.row.mb-5
|
.row
|
||||||
.col-12.col-md-4
|
.col-12.col-md-4
|
||||||
.card.bg-dark
|
.card.bg-dark
|
||||||
img.card-img-top([src]='screenshots.fonts')
|
img.card-img-top([src]='screenshots.fonts')
|
||||||
|
@@ -6,3 +6,7 @@
|
|||||||
aspect-ratio: 2;
|
aspect-ratio: 2;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
@@ -7,17 +7,17 @@ import { Component } from '@angular/core'
|
|||||||
})
|
})
|
||||||
export class HomeFeaturesComponent {
|
export class HomeFeaturesComponent {
|
||||||
screenshots = {
|
screenshots = {
|
||||||
progress: require('../../assets/screenshots/progress.png'),
|
progress: require('assets/screenshots/progress.png'),
|
||||||
zmodem: require('../../assets/screenshots/zmodem.png'),
|
zmodem: require('assets/screenshots/zmodem.png'),
|
||||||
colors: require('../../assets/screenshots/colors.png'),
|
colors: require('assets/screenshots/colors.png'),
|
||||||
hotkeys: require('../../assets/screenshots/hotkeys.png'),
|
hotkeys: require('assets/screenshots/hotkeys.png'),
|
||||||
ports: require('../../assets/screenshots/ports.png'),
|
ports: require('assets/screenshots/ports.png'),
|
||||||
ssh2: require('../../assets/screenshots/ssh2.png'),
|
ssh2: require('assets/screenshots/ssh2.png'),
|
||||||
fonts: require('../../assets/screenshots/fonts.png'),
|
fonts: require('assets/screenshots/fonts.png'),
|
||||||
history: require('../../assets/screenshots/history.png'),
|
history: require('assets/screenshots/history.png'),
|
||||||
paste: require('../../assets/screenshots/paste.png'),
|
paste: require('assets/screenshots/paste.png'),
|
||||||
quake: require('../../assets/screenshots/quake.png'),
|
quake: require('assets/screenshots/quake.png'),
|
||||||
split: require('../../assets/screenshots/split.png'),
|
split: require('assets/screenshots/split.png'),
|
||||||
profiles: require('../../assets/screenshots/profiles.png'),
|
profiles: require('assets/screenshots/profiles.png'),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@import "../../theme/vars.scss";
|
@import "theme/vars";
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-family: $font-family-monospace;
|
font-family: $font-family-monospace;
|
||||||
|
@@ -15,10 +15,10 @@ export class HomeIndexComponent {
|
|||||||
_githubIcon = faGithub
|
_githubIcon = faGithub
|
||||||
|
|
||||||
screenshots = {
|
screenshots = {
|
||||||
window: require('../../assets/screenshots/window.png'),
|
window: require('assets/screenshots/window.png'),
|
||||||
tabs: require('../../assets/screenshots/tabs.png'),
|
tabs: require('assets/screenshots/tabs.png'),
|
||||||
ssh: require('../../assets/screenshots/ssh.png'),
|
ssh: require('assets/screenshots/ssh.png'),
|
||||||
serial: require('../../assets/screenshots/serial.png'),
|
serial: require('assets/screenshots/serial.png'),
|
||||||
win: require('../../assets/screenshots/win.png'),
|
win: require('assets/screenshots/win.png'),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,6 @@ import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'
|
|||||||
import { CommonModule } from '@angular/common'
|
import { CommonModule } from '@angular/common'
|
||||||
import { FormsModule } from '@angular/forms'
|
import { FormsModule } from '@angular/forms'
|
||||||
import { RouterModule } from '@angular/router'
|
import { RouterModule } from '@angular/router'
|
||||||
import { HttpClientModule } from '@angular/common/http'
|
|
||||||
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'
|
||||||
import { NgxImageZoomModule } from 'ngx-image-zoom'
|
import { NgxImageZoomModule } from 'ngx-image-zoom'
|
||||||
|
|
||||||
@@ -11,9 +10,8 @@ import { HomeComponent } from './components/home.component'
|
|||||||
import { HomeIndexComponent } from './components/homeIndex.component'
|
import { HomeIndexComponent } from './components/homeIndex.component'
|
||||||
import { DemoTerminalComponent } from './components/demoTerminal.component'
|
import { DemoTerminalComponent } from './components/demoTerminal.component'
|
||||||
import { HomeFeaturesComponent } from './components/homeFeatures.component'
|
import { HomeFeaturesComponent } from './components/homeFeatures.component'
|
||||||
import { InstanceInfoResolver } from '../api'
|
import { InstanceInfoResolver } from 'src/api'
|
||||||
|
import { CommonAppModule } from 'src/common'
|
||||||
import '@fortawesome/fontawesome-svg-core/styles.css'
|
|
||||||
|
|
||||||
const ROUTES = [
|
const ROUTES = [
|
||||||
{
|
{
|
||||||
@@ -37,9 +35,9 @@ const ROUTES = [
|
|||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
|
CommonAppModule,
|
||||||
CommonModule,
|
CommonModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
HttpClientModule,
|
|
||||||
NgbNavModule,
|
NgbNavModule,
|
||||||
FontAwesomeModule,
|
FontAwesomeModule,
|
||||||
NgxImageZoomModule,
|
NgxImageZoomModule,
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<meta name="viewport" content="initial-scale=1, minimal-ui, shrink-to-fit=no">
|
<meta name="viewport" content="initial-scale=1, minimal-ui, shrink-to-fit=no">
|
||||||
<link rel="icon" type="image/png">
|
<link rel="icon" type="image/png">
|
||||||
<link rel="shortcut icon" type="image/png" href="./assets/favicon.png">
|
<link rel="shortcut icon" type="image/png" href="../assets/favicon.png">
|
||||||
<title>Tabby - a terminal for a more modern age</title>
|
<title>Tabby - a terminal for a more modern age</title>
|
||||||
<meta name="title" content="Tabby - a terminal for a more modern age">
|
<meta name="title" content="Tabby - a terminal for a more modern age">
|
||||||
<meta name="description" content="Tabby is a free and open source SSH, local and Telnet terminal with everything you'll ever need.">
|
<meta name="description" content="Tabby is a free and open source SSH, local and Telnet terminal with everything you'll ever need.">
|
||||||
|
@@ -1,6 +1,5 @@
|
|||||||
import { Component } from '@angular/core'
|
import { Component } from '@angular/core'
|
||||||
import { LoginService } from '../services/login.service'
|
import { LoginService, CommonService } from 'src/common'
|
||||||
import { CommonService } from '../services/common.service'
|
|
||||||
|
|
||||||
import { faGithub, faGitlab, faGoogle, faMicrosoft } from '@fortawesome/free-brands-svg-icons'
|
import { faGithub, faGitlab, faGoogle, faMicrosoft } from '@fortawesome/free-brands-svg-icons'
|
||||||
|
|
37
frontend/src/login/index.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import { NgModule } from '@angular/core'
|
||||||
|
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'
|
||||||
|
import { CommonModule } from '@angular/common'
|
||||||
|
import { FormsModule } from '@angular/forms'
|
||||||
|
import { RouterModule } from '@angular/router'
|
||||||
|
import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'
|
||||||
|
import { NgxImageZoomModule } from 'ngx-image-zoom'
|
||||||
|
|
||||||
|
import { LoginComponent } from './components/login.component'
|
||||||
|
import { InstanceInfoResolver } from 'src/api'
|
||||||
|
import { CommonAppModule } from 'src/common'
|
||||||
|
|
||||||
|
const ROUTES = [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: LoginComponent,
|
||||||
|
resolve: {
|
||||||
|
instanceInfo: InstanceInfoResolver,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
CommonAppModule,
|
||||||
|
CommonModule,
|
||||||
|
FormsModule,
|
||||||
|
NgbNavModule,
|
||||||
|
FontAwesomeModule,
|
||||||
|
NgxImageZoomModule,
|
||||||
|
RouterModule.forChild(ROUTES),
|
||||||
|
],
|
||||||
|
declarations: [
|
||||||
|
LoginComponent,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
export class LoginModule { }
|
@@ -9,4 +9,4 @@ body {
|
|||||||
@import "~source-code-pro/source-code-pro.css";
|
@import "~source-code-pro/source-code-pro.css";
|
||||||
@import "~source-sans-pro/source-sans-pro.css";
|
@import "~source-sans-pro/source-sans-pro.css";
|
||||||
|
|
||||||
@import "./theme/index.scss"
|
@import "theme/index"
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
"es7"
|
"es7"
|
||||||
],
|
],
|
||||||
"paths": {
|
"paths": {
|
||||||
"src/*": ["./src/*"]
|
"src/*": ["./*"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["src"]
|
"include": ["src"]
|
||||||
|
@@ -18,7 +18,9 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
extensions: ['.ts', '.js'],
|
extensions: ['.ts', '.js'],
|
||||||
alias: {
|
alias: {
|
||||||
|
assets: path.resolve(__dirname, 'assets'),
|
||||||
src: path.resolve(__dirname, 'src'),
|
src: path.resolve(__dirname, 'src'),
|
||||||
|
theme: path.resolve(__dirname, 'theme'),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
module: {
|
module: {
|
||||||
|