diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 81162af35..491a6e8dc 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -13,6 +13,11 @@ const routes: Routes = [ path: 'iptv', component: VideoPlayerComponent, }, + { + path: 'settings', + loadChildren: () => + import('./settings/settings.module').then((m) => m.SettingsModule), + }, { path: '**', component: PageNotFoundComponent, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d7ab0f492..d27e41d63 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -3,7 +3,6 @@ import '../polyfills'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; import { HttpClientModule, HttpClient } from '@angular/common/http'; import { SharedModule } from './shared/shared.module'; @@ -22,7 +21,6 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RecentPlaylistsComponent } from './recent-playlists/recent-playlists.component'; import { ChannelListContainerComponent } from './channel-list-container/channel-list-container.component'; import { FilterPipeModule } from 'ngx-filter-pipe'; -import { HeaderComponent } from './playlist-uploader/header/header.component'; // AoT requires an exported function for factories export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { @@ -33,7 +31,6 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { declarations: [ AppComponent, ChannelListContainerComponent, - HeaderComponent, PlaylistUploaderComponent, VideoPlayerComponent, RecentPlaylistsComponent, @@ -42,7 +39,6 @@ export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader { CommonModule, BrowserAnimationsModule, BrowserModule, - FormsModule, HttpClientModule, SharedModule, AppRoutingModule, diff --git a/src/app/material.module.ts b/src/app/material.module.ts index b2db6847b..83fc50b03 100644 --- a/src/app/material.module.ts +++ b/src/app/material.module.ts @@ -6,11 +6,13 @@ import { MatIconModule } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { MatListModule } from '@angular/material/list'; import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatSelectModule } from '@angular/material/select'; import { MatSidenavModule } from '@angular/material/sidenav'; import { MatTabsModule } from '@angular/material/tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; import { MatSnackBarModule } from '@angular/material/snack-bar'; import { ScrollingModule } from '@angular/cdk/scrolling'; +import { MatGridListModule } from '@angular/material/grid-list'; @NgModule({ exports: [ @@ -21,11 +23,13 @@ import { ScrollingModule } from '@angular/cdk/scrolling'; MatInputModule, MatListModule, MatProgressBarModule, + MatSelectModule, MatSidenavModule, MatSnackBarModule, MatTabsModule, MatToolbarModule, ScrollingModule, + MatGridListModule, ], }) export class MaterialModule {} diff --git a/src/app/playlist-uploader/header/header.component.html b/src/app/playlist-uploader/header/header.component.html deleted file mode 100644 index 5957190a2..000000000 --- a/src/app/playlist-uploader/header/header.component.html +++ /dev/null @@ -1,9 +0,0 @@ -
- -
-
-
-
IPTVnator
-
Please select a playlist from the list or add a new playlist via file upload or via url
-
-
\ No newline at end of file diff --git a/src/app/playlist-uploader/header/header.component.ts b/src/app/playlist-uploader/header/header.component.ts deleted file mode 100644 index c699c3ec0..000000000 --- a/src/app/playlist-uploader/header/header.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-header', - templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'], -}) -export class HeaderComponent {} diff --git a/src/app/playlist-uploader/playlist-uploader.component.html b/src/app/playlist-uploader/playlist-uploader.component.html index c4891148d..f32a5e409 100644 --- a/src/app/playlist-uploader/playlist-uploader.component.html +++ b/src/app/playlist-uploader/playlist-uploader.component.html @@ -1,4 +1,4 @@ - +
diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html new file mode 100644 index 000000000..9b35289a6 --- /dev/null +++ b/src/app/settings/settings.component.html @@ -0,0 +1,35 @@ + +
+ + +
Please adapt the options from the list below and confirm with a save button
+
+ + + +
+

Video player

+

+ + Select an option + + {{player.label}} + + + +

+
+
+
+
+ + +
+ +
+
+
\ No newline at end of file diff --git a/src/app/settings/settings.component.scss b/src/app/settings/settings.component.scss new file mode 100644 index 000000000..d63390285 --- /dev/null +++ b/src/app/settings/settings.component.scss @@ -0,0 +1,12 @@ +.card-header { + margin-bottom: 15px; +} + +button { + cursor: pointer !important; + text-transform: uppercase; +} + +::ng-deep .mat-card { + border-radius: 0 !important; +} diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts new file mode 100644 index 000000000..257d1320a --- /dev/null +++ b/src/app/settings/settings.component.ts @@ -0,0 +1,80 @@ +import { Component, OnInit } from '@angular/core'; +import { + FormGroup, + FormControl, + FormBuilder, + Validators, +} from '@angular/forms'; +import { StorageMap } from '@ngx-pwa/local-storage'; +import { Router } from '@angular/router'; +import { MatSnackBar } from '@angular/material/snack-bar'; + +@Component({ + selector: 'app-settings', + templateUrl: './settings.component.html', + styleUrls: ['./settings.component.scss'], +}) +export class SettingsComponent implements OnInit { + /** Player options */ + players = [ + { + id: 'html5', + label: ' HTML5 Video Player', + }, + { + id: 'videojs', + label: ' VideoJs Player', + }, + ]; + + /** Settings form object */ + settingsForm: FormGroup; + + /** + * Creates an instance of SettingsComponent and injects some dependencies into the component + * @param formBuilder + * @param router + * @param snackBar + * @param storage + */ + constructor( + private formBuilder: FormBuilder, + private router: Router, + private snackBar: MatSnackBar, + private storage: StorageMap + ) { + this.settingsForm = this.formBuilder.group({ + player: ['html5'], // default value + }); + } + + /** + * Reads the config object from the browsers storage (indexed db) + */ + ngOnInit(): void { + this.storage.get('settings').subscribe((settings) => { + if (settings) { + this.settingsForm.setValue(settings); + } + }); + } + + /** + * Triggers on form submit and saves the config object to the indexed db store + */ + onSubmit(): void { + this.storage.set('settings', this.settingsForm.value).subscribe(() => { + this.settingsForm.markAsPristine(); + this.snackBar.open('Success! Configuration was saved.', null, { + duration: 2000, + }); + }); + } + + /** + * Navigates back to the applications homepage + */ + backToHome(): void { + this.router.navigateByUrl('/', { skipLocationChange: true }); + } +} diff --git a/src/app/settings/settings.module.ts b/src/app/settings/settings.module.ts new file mode 100644 index 000000000..f2eb22359 --- /dev/null +++ b/src/app/settings/settings.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { SettingsComponent } from './settings.component'; +import { SettingsRoutingModule } from './settings.routing'; +import { SharedModule } from 'app/shared/shared.module'; + +@NgModule({ + imports: [CommonModule, SettingsRoutingModule, SharedModule], + declarations: [SettingsComponent], +}) +export class SettingsModule {} diff --git a/src/app/settings/settings.routing.ts b/src/app/settings/settings.routing.ts new file mode 100644 index 000000000..7ae98bd51 --- /dev/null +++ b/src/app/settings/settings.routing.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; +import { SettingsComponent } from './settings.component'; + +const routes: Routes = [ + { + path: '', + component: SettingsComponent, + }, +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class SettingsRoutingModule {} diff --git a/src/app/shared/components/header/header.component.html b/src/app/shared/components/header/header.component.html new file mode 100644 index 000000000..b5f7877a4 --- /dev/null +++ b/src/app/shared/components/header/header.component.html @@ -0,0 +1,14 @@ +
+ +
+
+
+
{{title}}
+
{{subtitle}}
+
+
+
+ +
\ No newline at end of file diff --git a/src/app/playlist-uploader/header/header.component.scss b/src/app/shared/components/header/header.component.scss similarity index 100% rename from src/app/playlist-uploader/header/header.component.scss rename to src/app/shared/components/header/header.component.scss diff --git a/src/app/shared/components/header/header.component.ts b/src/app/shared/components/header/header.component.ts new file mode 100644 index 000000000..31eabcec9 --- /dev/null +++ b/src/app/shared/components/header/header.component.ts @@ -0,0 +1,26 @@ +import { Component, Input } from '@angular/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.scss'], +}) +export class HeaderComponent { + /** Title of the header */ + @Input() title: string; + /** Subtitle of the header */ + @Input() subtitle: string; + + /** Creates an instance of SettingsComponent and injects angulars router module + * @param router angulars router + */ + constructor(private router: Router) {} + + /** + * Navigates to the settings page + */ + openSettings(): void { + this.router.navigate(['/settings']); + } +} diff --git a/src/app/shared/components/index.ts b/src/app/shared/components/index.ts index 88746a9f8..0e5ff575a 100644 --- a/src/app/shared/components/index.ts +++ b/src/app/shared/components/index.ts @@ -1 +1,2 @@ export * from './page-not-found/page-not-found.component'; +export * from './header/header.component'; diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 8002a5902..c632afa66 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -3,19 +3,20 @@ import { CommonModule } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; import { FlexLayoutModule } from '@angular/flex-layout'; -import { PageNotFoundComponent } from './components/'; +import { PageNotFoundComponent, HeaderComponent } from './components/'; import { WebviewDirective } from './directives/'; -import { FormsModule } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MaterialModule } from 'app/material.module'; @NgModule({ - declarations: [PageNotFoundComponent, WebviewDirective], + declarations: [PageNotFoundComponent, HeaderComponent, WebviewDirective], imports: [ CommonModule, TranslateModule, FormsModule, MaterialModule, FlexLayoutModule, + ReactiveFormsModule, ], exports: [ TranslateModule, @@ -23,6 +24,8 @@ import { MaterialModule } from 'app/material.module'; FormsModule, MaterialModule, FlexLayoutModule, + HeaderComponent, + ReactiveFormsModule, ], }) export class SharedModule {}