Vorbereitung Release 0.2.0 #83

Merged
tpeetz merged 178 commits from develop/0.2.0 into main 2026-01-29 22:50:42 +00:00
164 changed files with 1045 additions and 597 deletions
Showing only changes of commit 9ee1a04a5c - Show all commits
-1
View File
@@ -15,7 +15,6 @@
"options": {
"browser": "src/main.ts",
"polyfills": [
"zone.js"
],
"tsConfig": "tsconfig.app.json",
"assets": [
@@ -1,5 +1,6 @@
<div class="app">
<kontor-header />
<app-kontor-navigation />
<main>
<router-outlet />
</main>
+2 -1
View File
@@ -2,10 +2,11 @@ import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { KontorHeaderComponent } from "./kontor/header/header.component";
import { KontorFooterComponent } from './kontor/footer/footer.component';
import { KontorNavigationComponent } from "./kontor/navigation/kontor-navigation/kontor-navigation.component";
@Component({
selector: 'app-root',
imports: [RouterOutlet, KontorHeaderComponent, KontorFooterComponent],
imports: [RouterOutlet, KontorHeaderComponent, KontorFooterComponent, KontorNavigationComponent],
templateUrl: './app.component.html',
styleUrl: './app.component.css'
})
+3 -2
View File
@@ -1,4 +1,4 @@
import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection } from '@angular/core';
import { ApplicationConfig, provideBrowserGlobalErrorListeners, provideZoneChangeDetection, provideZonelessChangeDetection } from '@angular/core';
import { provideRouter, withComponentInputBinding } from '@angular/router';
import { routes } from './app.routes';
@@ -7,7 +7,8 @@ import { provideHttpClient } from '@angular/common/http';
export const appConfig: ApplicationConfig = {
providers: [
provideBrowserGlobalErrorListeners(),
provideZoneChangeDetection({ eventCoalescing: true }),
provideZonelessChangeDetection(),
// provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(routes, withComponentInputBinding()),
provideHttpClient(),
]
+17 -42
View File
@@ -1,52 +1,27 @@
import { Routes } from '@angular/router';
import { KontorComponent } from './kontor/kontor.component';
import { Login } from './common/login/login';
import { ComicOverviewComponent } from './comic/comic-overview/comic-overview.component';
import { MediaOverviewComponent } from './media/media-overview/media-overview.component';
import { ArtistListComponent } from './comic/artist/artist-list/artist-list.component';
import { ComicListComponent } from './comic/comic/comic-list/comic-list.component';
import { MediaFileListComponent } from './media/media-file/media-file-list/media-file-list.component';
import { MediaActorListComponent } from './media/media-actor/media-actor-list/media-actor-list.component';
import { MediaVideoListComponent } from './media/media-video/media-video-list/media-video-list.component';
import { PublisherListComponent } from './comic/publisher/publisher-list/publisher-list.component';
import { TyscMenuComponent } from './tysc/tysc-menu/tysc-menu.component';
import { TeamListComponent } from './tysc/team/team-list/team-list.component';
import { VendorListComponent } from './tysc/vendor/vendor-list/vendor-list.component';
import { CardsetListComponent } from './tysc/cardset/cardset-list/cardset-list.component';
import { PositionListComponent } from './tysc/position/position-list/position-list.component';
import { PlayerListComponent } from './tysc/player/player-list/player-list.component';
import { SportListComponent } from './tysc/sport/sport-list/sport-list.component';
import { routes as comicRoutes } from './kontor/comic/comic.routes';
import { routes as tyscRoutes } from './kontor/tysc/tysc.routes';
import { routes as mediaRoutes } from './kontor/media/media.routes';
import { TyscSectionComponent } from './kontor/tysc/tysc-section.component';
import { ComicSectionComponent } from './kontor/comic/comic-section.component';
import { MediaComponent } from './kontor/media/media.component';
import { KontorHomeComponent } from './kontor/home/kontor-home/kontor-home.component';
export const routes: Routes = [
{ path: '', component: KontorComponent, },
{ path: 'login', component: Login, },
{
path: 'comic', component: ComicOverviewComponent,
children: [
{ path: '', component: ComicListComponent},
{ path: 'comics', component: ComicListComponent},
{ path: 'publisher', component: PublisherListComponent},
{ path: 'artist', component: ArtistListComponent},
],
path: '',
component: KontorHomeComponent,
},
{
path: 'tysc', component: TyscMenuComponent,
children: [
{ path: '', component: SportListComponent},
{ path: 'team', component: TeamListComponent},
{ path: 'player', component: PlayerListComponent},
{ path: 'position', component: PositionListComponent},
{ path: 'cardset', component: CardsetListComponent},
{ path: 'vendor', component: VendorListComponent},
],
path: 'comic', component: ComicSectionComponent,
children: comicRoutes,
},
{
path: 'media', component: MediaOverviewComponent,
children: [
{ path: '', component: MediaFileListComponent},
{ path: 'mediafiles', component: MediaFileListComponent},
{ path: 'mediaactors', component: MediaActorListComponent},
{ path: 'mediavideos', component: MediaVideoListComponent},
],
path: 'tysc', component: TyscSectionComponent,
children: tyscRoutes,
},
{
path: 'media', component: MediaComponent,
children: mediaRoutes,
},
];
@@ -1,5 +0,0 @@
div {
border-radius: 6px;
box-shadow: 0 1px 6px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
@@ -1,5 +0,0 @@
<div>
<a [routerLink]="[artist().id]" routerLinkActive="active">
<span>{{ artist().name }}</span>
</a>
</div>
@@ -1,14 +0,0 @@
import { Component, input, signal } from '@angular/core';
import { Artist } from '../artist.model';
import { RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'app-artist-detail',
imports: [RouterLink, RouterLinkActive],
templateUrl: './artist-detail.component.html',
styleUrl: './artist-detail.component.css'
})
export class ArtistDetailComponent {
artist = input.required<Artist>();
}
@@ -1,16 +0,0 @@
<!-- <p>comic-overview works!</p>
<div class="subnav">
<ul>
<li><a routerLink="/comic/comics" routerLinkActive>Comics</a></li>
<li><a routerLink="/comic/publisher">Publisher</a></li>
<li><a routerLink="/comic/artist">Artists</a></li>
</ul>
<h4>Child Routes Result</h4>
<router-outlet></router-outlet>
</div> -->
<div class="subnav">
<a routerLink="/comic/comics" routerLinkActive="active">Comics</a>
<a routerLink="/comic/publisher" routerLinkActive="active">Publisher</a>
<a routerLink="/comic/artist" routerLinkActive="active">Artists</a>
</div>
<router-outlet></router-outlet>
@@ -1,12 +0,0 @@
import { Component } from '@angular/core';
import { RouterLink, RouterOutlet, RouterLinkActive } from '@angular/router';
@Component({
selector: 'app-comic-overview',
imports: [RouterLink, RouterOutlet, RouterLinkActive],
templateUrl: './comic-overview.component.html',
styleUrl: './comic-overview.component.css'
})
export class ComicOverviewComponent {
}
@@ -1 +0,0 @@
<p>comic-list works!</p>
@@ -1,11 +0,0 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-comic-list',
imports: [],
templateUrl: './comic-list.component.html',
styleUrl: './comic-list.component.css'
})
export class ComicListComponent {
}
@@ -1 +0,0 @@
<p>publisher-list works!</p>
@@ -1,23 +0,0 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PublisherListComponent } from './publisher-list.component';
describe('PublisherListComponent', () => {
let component: PublisherListComponent;
let fixture: ComponentFixture<PublisherListComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [PublisherListComponent]
})
.compileComponents();
fixture = TestBed.createComponent(PublisherListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -1,11 +0,0 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-publisher-list',
imports: [],
templateUrl: './publisher-list.component.html',
styleUrl: './publisher-list.component.css'
})
export class PublisherListComponent {
}
@@ -1,7 +1,7 @@
<ul>
@for (artist of artists(); track artist.id) {
<li>
<app-artist-detail [artist]="artist"/>
<app-artist [artist]="artist"/>
</li>
}
</ul>
@@ -1,11 +1,11 @@
import { ArtistComponent } from './../artist/artist.component';
import { Component, DestroyRef, inject, OnInit, signal } from '@angular/core';
import { Artist } from '../artist.model';
import { ArtistService } from '../artist.service';
import { ArtistDetailComponent } from "../artist-detail/artist-detail.component";
import { ArtistsService } from '../artists.service';
@Component({
selector: 'app-artist-list',
imports: [ArtistDetailComponent],
imports: [ArtistComponent],
templateUrl: './artist-list.component.html',
styleUrl: './artist-list.component.css'
})
@@ -13,12 +13,12 @@ export class ArtistListComponent implements OnInit {
artists = signal<Artist[] | undefined>(undefined);
isFetching = signal(false);
error = signal('');
private artistService = inject(ArtistService);
private artistsService = inject(ArtistsService);
private destroyRef = inject(DestroyRef);
ngOnInit() {
this.isFetching.set(true);
const subscription = this.artistService.loadArtists().subscribe({
const subscription = this.artistsService.loadArtists().subscribe({
next: (artists) => {
this.artists.set(artists);
},
@@ -27,12 +27,11 @@ export class ArtistListComponent implements OnInit {
},
complete: () => {
this.isFetching.set(false);
},
}
});
this.destroyRef.onDestroy(() => {
subscription.unsubscribe();
});
})
}
}
@@ -0,0 +1,5 @@
<div>
<a [routerLink]="['/', 'comic', 'artists', artist().id]" routerLinkActive="active">
<span>{{ artist().name }}</span>
</a>
</div>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { TyscMenuComponent } from './tysc-menu.component';
import { ArtistComponent } from './artist.component';
describe('TyscMenuComponent', () => {
let component: TyscMenuComponent;
let fixture: ComponentFixture<TyscMenuComponent>;
describe('ArtistComponent', () => {
let component: ArtistComponent;
let fixture: ComponentFixture<ArtistComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [TyscMenuComponent]
imports: [ArtistComponent]
})
.compileComponents();
fixture = TestBed.createComponent(TyscMenuComponent);
fixture = TestBed.createComponent(ArtistComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,13 @@
import { Component, input } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';
import { Artist } from '../artist.model';
@Component({
selector: 'app-artist',
imports: [RouterLink, RouterLinkActive],
templateUrl: './artist.component.html',
styleUrl: './artist.component.css'
})
export class ArtistComponent {
artist = input.required<Artist>();
}
@@ -0,0 +1,7 @@
<p>artists works!</p>
<div>
<app-artist-list />
</div>
<div>
<h2>Artist Details</h2>
</div>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { TeamListComponent } from './team-list.component';
import { ArtistsComponent } from './artists.component';
describe('TeamListComponent', () => {
let component: TeamListComponent;
let fixture: ComponentFixture<TeamListComponent>;
describe('ArtistsComponent', () => {
let component: ArtistsComponent;
let fixture: ComponentFixture<ArtistsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [TeamListComponent]
imports: [ArtistsComponent]
})
.compileComponents();
fixture = TestBed.createComponent(TeamListComponent);
fixture = TestBed.createComponent(ArtistsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,12 @@
import { Component } from '@angular/core';
import { ArtistListComponent } from "./artist-list/artist-list.component";
@Component({
selector: 'app-artists',
imports: [ArtistListComponent],
templateUrl: './artists.component.html',
styleUrl: './artists.component.css'
})
export class ArtistsComponent {
}
@@ -1,21 +1,19 @@
import { inject, Injectable, signal } from "@angular/core";
import { ErrorService } from "../../shared/error.service";
import { HttpClient } from "@angular/common/http";
import { inject, Injectable, signal } from "@angular/core";
import { Artist } from "./artist.model";
import { catchError, map, throwError } from "rxjs";
@Injectable({
providedIn: 'root',
providedIn: 'root'
})
export class ArtistService {
private errorService = inject(ErrorService);
export class ArtistsService {
private httpClient = inject(HttpClient);
private artists = signal<Artist[]>([]);
loadedArtists = this.artists.asReadonly();
loadArtists() {
return this.fetchArtists('http://127.0.0.1:8800/api/comics/artists', 'Someting went wrong fetching artists. Please try again later-');
return this.fetchArtists('http://127.0.0.1:8800/api/comics/artists', 'Someting went wrong fetching artists. Please try again later.');
}
private fetchArtists(url: string, errorMessage: string) {
@@ -0,0 +1,5 @@
<div class="subnav">
<a routerLink="/comic/comics" routerLinkActive="active">Comics</a>
<a routerLink="/comic/publishers" routerLinkActive="active">Publisher</a>
<a routerLink="/comic/artists" routerLinkActive="active">Artists</a>
</div>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ComicNavigationComponent } from './comic-navigation.component';
describe('ComicNavigationComponent', () => {
let component: ComicNavigationComponent;
let fixture: ComponentFixture<ComicNavigationComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ComicNavigationComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ComicNavigationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,12 @@
import { Component } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'app-comic-navigation',
imports: [RouterLink, RouterLinkActive],
templateUrl: './comic-navigation.component.html',
styleUrl: './comic-navigation.component.css'
})
export class ComicNavigationComponent {
}
@@ -0,0 +1,2 @@
<app-comic-navigation />
<router-outlet></router-outlet>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ComicSectionComponent } from './comic-section.component';
describe('ComicComponent', () => {
let component: ComicSectionComponent;
let fixture: ComponentFixture<ComicSectionComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ComicSectionComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ComicSectionComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,13 @@
import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { ComicNavigationComponent } from "./comic-navigation/comic-navigation.component";
@Component({
selector: 'app-comic-section',
imports: [RouterOutlet, ComicNavigationComponent],
templateUrl: './comic-section.component.html',
styleUrl: './comic-section.component.css'
})
export class ComicSectionComponent {
}
@@ -0,0 +1,39 @@
import { Routes } from "@angular/router";
import { ArtistsComponent } from "./artists/artists.component";
import { PublishersComponent } from "./publishers/publishers.component";
import { ComicDetailsComponent } from "./comics/comic-details/comic-details.component";
import { ComicSectionComponent } from "./comic-section.component";
import { ComicsComponent } from "./comics/comics.component";
export const routes: Routes = [
{
path: '',
component: ComicSectionComponent,
children: [
{
path: 'comics',
component: ComicsComponent,
},
{
path: 'comics/:comicId',
component: ComicDetailsComponent,
},
{
path: 'artists',
component: ArtistsComponent,
},
{
path: 'artists/:artistId',
component: ArtistsComponent,
},
{
path: 'publishers',
component: PublishersComponent,
},
{
path: 'publishers/:publisherId',
component: PublishersComponent,
},
],
},
];
@@ -0,0 +1,7 @@
<p>comic-details works!</p>
<div>
<app-comic-list />
</div>
<div>
<h2>Comic Title</h2>
</div>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PositionListComponent } from './position-list.component';
import { ComicDetailsComponent } from './comic-details.component';
describe('PositionListComponent', () => {
let component: PositionListComponent;
let fixture: ComponentFixture<PositionListComponent>;
describe('ComicDetailsComponent', () => {
let component: ComicDetailsComponent;
let fixture: ComponentFixture<ComicDetailsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [PositionListComponent]
imports: [ComicDetailsComponent]
})
.compileComponents();
fixture = TestBed.createComponent(PositionListComponent);
fixture = TestBed.createComponent(ComicDetailsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,13 @@
import { Component, input } from '@angular/core';
import { ComicListComponent } from "../comic-list/comic-list.component";
import { Comic } from '../comic.model';
@Component({
selector: 'app-comic-details',
imports: [ComicListComponent],
templateUrl: './comic-details.component.html',
styleUrl: './comic-details.component.css'
})
export class ComicDetailsComponent {
comic = input.required<Comic>();
}
@@ -0,0 +1,8 @@
<p>comic-list works!</p>
<ul>
@for (comic of comics(); track comic.id) {
<li>
<app-comic [comic]="comic"/>
</li>
}
</ul>
@@ -0,0 +1,38 @@
import { Component, DestroyRef, inject, OnInit, signal } from '@angular/core';
import { Comic } from '../comic.model';
import { ComicComponent } from "../comic/comic.component";
import { ComicsService } from '../comics.service';
@Component({
selector: 'app-comic-list',
imports: [ComicComponent],
templateUrl: './comic-list.component.html',
styleUrl: './comic-list.component.css'
})
export class ComicListComponent implements OnInit {
comics = signal<Comic[] | undefined>(undefined);
isFetching = signal(false);
error = signal('');
private comicsService = inject(ComicsService);
private destroyRef = inject(DestroyRef);
ngOnInit() {
this.isFetching.set(true);
const subscription = this.comicsService.loadComics().subscribe({
next: (comics) => {
this.comics.set(comics);
},
error: (error: Error) => {
this.error.set(error.message);
},
complete: () => {
this.isFetching.set(false);
}
});
this.destroyRef.onDestroy(() => {
subscription.unsubscribe();
})
}
}
@@ -0,0 +1,5 @@
export interface Comic {
id: string;
title: string;
completed: boolean;
}
@@ -0,0 +1,6 @@
<p>comic works!</p>
<div>
<a [routerLink]="['/', 'comic', 'comics', comic().id]" routerLinkActive="active">
<span>{{ comic().title }}</span>
</a>
</div>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ComicOverview } from './comic-overview.component';
import { ComicComponent } from './comic.component';
describe('ComicOverview', () => {
let component: ComicOverview;
let fixture: ComponentFixture<ComicOverview>;
describe('ComicComponent', () => {
let component: ComicComponent;
let fixture: ComponentFixture<ComicComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ComicOverview]
imports: [ComicComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ComicOverview);
fixture = TestBed.createComponent(ComicComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,13 @@
import { Component, input } from '@angular/core';
import { Comic } from '../comic.model';
import { RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'app-comic',
imports: [RouterLink, RouterLinkActive],
templateUrl: './comic.component.html',
styleUrl: './comic.component.css'
})
export class ComicComponent {
comic = input.required<Comic>();
}
@@ -0,0 +1,4 @@
<p>comics works!</p>
<div>
<app-comic-list />
</div>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ComicsComponent } from './comics.component';
describe('ComicsComponent', () => {
let component: ComicsComponent;
let fixture: ComponentFixture<ComicsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ComicsComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ComicsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,12 @@
import { Component, signal } from '@angular/core';
import { ComicListComponent } from "./comic-list/comic-list.component";
import { ComicDetailsComponent } from './comic-details/comic-details.component';
@Component({
selector: 'app-comics',
imports: [ComicListComponent],
templateUrl: './comics.component.html',
styleUrl: './comics.component.css'
})
export class ComicsComponent {
}
@@ -0,0 +1,29 @@
import { HttpClient } from "@angular/common/http";
import { inject, Injectable, signal } from "@angular/core";
import { Comic } from "./comic.model";
import { catchError, map, throwError } from "rxjs";
@Injectable({
providedIn: 'root'
})
export class ComicsService {
private httpClient = inject(HttpClient);
private comics = signal<Comic[]>([]);
loadedComics = this.comics.asReadonly();
loadComics() {
return this.fetchComics('http://127.0.0.1:8800/api/comics/comics', 'Someting went wrong fetching comics. Please try again later.');
}
private fetchComics(url: string, errorMessage: string) {
return this.httpClient.get<Comic[]>(url).pipe(
map((resData) => resData),
catchError((error) => {
console.log(error);
return throwError(() => new Error(errorMessage));
})
);
}
}
@@ -0,0 +1 @@
<p>publishers works!</p>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { SportListComponent } from './sport-list.component';
import { PublishersComponent } from './publishers.component';
describe('SportListComponent', () => {
let component: SportListComponent;
let fixture: ComponentFixture<SportListComponent>;
describe('PublishersComponent', () => {
let component: PublishersComponent;
let fixture: ComponentFixture<PublishersComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [SportListComponent]
imports: [PublishersComponent]
})
.compileComponents();
fixture = TestBed.createComponent(SportListComponent);
fixture = TestBed.createComponent(PublishersComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-publishers',
imports: [],
templateUrl: './publishers.component.html',
styleUrl: './publishers.component.css'
})
export class PublishersComponent {
}
@@ -0,0 +1,9 @@
footer {
padding: 30px;
text-align: center;
background-color: lightblue;
}
footer div {
font-size: 20px;
}
@@ -0,0 +1,3 @@
<footer>
<div>Kontor Footer</div>
</footer>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ArtistDetailComponent } from './artist-detail.component';
import { KontorFooterComponent } from './kontor-footer.component';
describe('ArtistDetailComponent', () => {
let component: ArtistDetailComponent;
let fixture: ComponentFixture<ArtistDetailComponent>;
describe('KontorFooterComponent', () => {
let component: KontorFooterComponent;
let fixture: ComponentFixture<KontorFooterComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ArtistDetailComponent]
imports: [KontorFooterComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ArtistDetailComponent);
fixture = TestBed.createComponent(KontorFooterComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-kontor-footer',
imports: [],
templateUrl: './kontor-footer.component.html',
styleUrl: './kontor-footer.component.css'
})
export class KontorFooterComponent {
}
@@ -2,18 +2,4 @@
<section>
<h1>{{ title() }}</h1>
</section>
<!-- <nav>
<ul>
<li><a routerLink="/">Kontor</a></li>
<li><a routerLink="/comic">Comics</a></li>
<li><a routerLink="/tysc">TradeYourSportsCards</a></li>
<li><a routerLink="/media">Media</a></li>
</ul>
</nav> -->
</header>
<div class="topnav">
<a routerLink="/" routerLinkActive="active">Kontor</a>
<a routerLink="/comic" routerLinkActive="active">Comics</a>
<a routerLink="/tysc" routerLinkActive="active">TradeYourSportsCards</a>
<a routerLink="/media" routerLinkActive="active">Media</a>
</div>
@@ -3,7 +3,7 @@ import { RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'kontor-header',
imports: [RouterLink, RouterLinkActive],
imports: [],
templateUrl: './header.component.html',
styleUrl: './header.component.css'
})
@@ -0,0 +1,9 @@
.header {
padding: 30px;
text-align: center;
background-color: lightblue;
}
.header h1 {
font-size: 50px;
}
@@ -0,0 +1,5 @@
<header class="header">
<section>
<h1>{{ title() }}</h1>
</section>
</header>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { KontorHeaderComponent } from './kontor-header.component';
describe('KontorHeaderComponent', () => {
let component: KontorHeaderComponent;
let fixture: ComponentFixture<KontorHeaderComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [KontorHeaderComponent]
})
.compileComponents();
fixture = TestBed.createComponent(KontorHeaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,11 @@
import { Component, signal } from '@angular/core';
@Component({
selector: 'app-kontor-header',
imports: [],
templateUrl: './kontor-header.component.html',
styleUrl: './kontor-header.component.css'
})
export class KontorHeaderComponent {
protected readonly title = signal('Kontor');
}
@@ -0,0 +1 @@
<p>kontor-home works!</p>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { PlayerListComponent } from './player-list.component';
import { KontorHomeComponent } from './kontor-home.component';
describe('PlayerListComponent', () => {
let component: PlayerListComponent;
let fixture: ComponentFixture<PlayerListComponent>;
describe('KontorHomeComponent', () => {
let component: KontorHomeComponent;
let fixture: ComponentFixture<KontorHomeComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [PlayerListComponent]
imports: [KontorHomeComponent]
})
.compileComponents();
fixture = TestBed.createComponent(PlayerListComponent);
fixture = TestBed.createComponent(KontorHomeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-kontor-home',
imports: [],
templateUrl: './kontor-home.component.html',
styleUrl: './kontor-home.component.css'
})
export class KontorHomeComponent {
}
@@ -0,0 +1 @@
<p>media-actors works!</p>
@@ -1,18 +1,18 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CardsetListComponent } from './cardset-list.component';
import { MediaActorsComponent } from './media-actors.component';
describe('CardsetListComponent', () => {
let component: CardsetListComponent;
let fixture: ComponentFixture<CardsetListComponent>;
describe('MediaActorsComponent', () => {
let component: MediaActorsComponent;
let fixture: ComponentFixture<MediaActorsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CardsetListComponent]
imports: [MediaActorsComponent]
})
.compileComponents();
fixture = TestBed.createComponent(CardsetListComponent);
fixture = TestBed.createComponent(MediaActorsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
@@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-media-actors',
imports: [],
templateUrl: './media-actors.component.html',
styleUrl: './media-actors.component.css'
})
export class MediaActorsComponent {
}
@@ -0,0 +1 @@
<p>media-files works!</p>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MediaFilesComponent } from './media-files.component';
describe('MediaFilesComponent', () => {
let component: MediaFilesComponent;
let fixture: ComponentFixture<MediaFilesComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [MediaFilesComponent]
})
.compileComponents();
fixture = TestBed.createComponent(MediaFilesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-media-files',
imports: [],
templateUrl: './media-files.component.html',
styleUrl: './media-files.component.css'
})
export class MediaFilesComponent {
}
@@ -0,0 +1,5 @@
<div class="subnav">
<a routerLink="/media/mediafiles" routerLinkActive="active">MediaFiles</a>
<a routerLink="/media/mediaactors" routerLinkActive="active">MediaActors</a>
<a routerLink="/media/mediavideos" routerLinkActive="active">MediaVideos</a>
</div>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MediaNavigationComponent } from './media-navigation.component';
describe('MediaNavigationComponent', () => {
let component: MediaNavigationComponent;
let fixture: ComponentFixture<MediaNavigationComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [MediaNavigationComponent]
})
.compileComponents();
fixture = TestBed.createComponent(MediaNavigationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,12 @@
import { Component } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'app-media-navigation',
imports: [RouterLink, RouterLinkActive],
templateUrl: './media-navigation.component.html',
styleUrl: './media-navigation.component.css'
})
export class MediaNavigationComponent {
}
@@ -0,0 +1 @@
<p>media-videos works!</p>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MediaVideosComponent } from './media-videos.component';
describe('MediaVideosComponent', () => {
let component: MediaVideosComponent;
let fixture: ComponentFixture<MediaVideosComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [MediaVideosComponent]
})
.compileComponents();
fixture = TestBed.createComponent(MediaVideosComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,11 @@
import { Component } from '@angular/core';
@Component({
selector: 'app-media-videos',
imports: [],
templateUrl: './media-videos.component.html',
styleUrl: './media-videos.component.css'
})
export class MediaVideosComponent {
}
@@ -0,0 +1,2 @@
<app-media-navigation />
<router-outlet></router-outlet>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MediaComponent } from './media.component';
describe('MediaComponent', () => {
let component: MediaComponent;
let fixture: ComponentFixture<MediaComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [MediaComponent]
})
.compileComponents();
fixture = TestBed.createComponent(MediaComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,13 @@
import { Component } from '@angular/core';
import { MediaNavigationComponent } from "./media-navigation/media-navigation.component";
import { RouterOutlet } from '@angular/router';
@Component({
selector: 'app-media',
imports: [MediaNavigationComponent, RouterOutlet],
templateUrl: './media.component.html',
styleUrl: './media.component.css'
})
export class MediaComponent {
}
@@ -0,0 +1,26 @@
import { Routes } from "@angular/router";
import { MediaComponent } from "./media.component";
import { MediaFilesComponent } from "./media-files/media-files.component";
import { MediaActorsComponent } from "./media-actors/media-actors.component";
import { MediaVideosComponent } from "./media-videos/media-videos.component";
export const routes: Routes = [
{
path: '',
component: MediaComponent,
children: [
{
path: 'mediafiles',
component: MediaFilesComponent,
},
{
path: 'mediaactors',
component: MediaActorsComponent,
},
{
path: 'mediavideos',
component: MediaVideosComponent,
},
],
},
];
@@ -0,0 +1 @@
/* Style the top navigation bar */
@@ -0,0 +1,6 @@
<div class="topnav">
<a routerLink="/">Kontor</a>
<a routerLink="/comic" routerLinkActive="active">Comic</a>
<a routerLink="/tysc" routerLinkActive="active">TradeYourSportsCard</a>
<a routerLink="/media" routerLinkActive="active">Media</a>
</div>
@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { KontorNavigationComponent } from './kontor-navigation.component';
describe('KontorNavigationComponent', () => {
let component: KontorNavigationComponent;
let fixture: ComponentFixture<KontorNavigationComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [KontorNavigationComponent]
})
.compileComponents();
fixture = TestBed.createComponent(KontorNavigationComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
@@ -0,0 +1,12 @@
import { Component } from '@angular/core';
import { RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'app-kontor-navigation',
imports: [RouterLink, RouterLinkActive],
templateUrl: './kontor-navigation.component.html',
styleUrl: './kontor-navigation.component.css'
})
export class KontorNavigationComponent {
}

Some files were not shown because too many files have changed in this diff Show More