mirror of
https://github.com/Mueller-Patrick/Betterzon.git
synced 2024-12-24 12:35:12 +00:00
Merge remote-tracking branch 'origin/develop' into doku
This commit is contained in:
commit
91af436019
|
@ -4,7 +4,7 @@ root = true
|
||||||
[*]
|
[*]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 4
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
|
6702
Frontend/package-lock.json
generated
6702
Frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
|
@ -1,48 +1,48 @@
|
||||||
{
|
{
|
||||||
"name": "betterzon",
|
"name": "betterzon",
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve",
|
"start": "ng serve",
|
||||||
"build": "ng build",
|
"build": "ng build",
|
||||||
"test": "ng test",
|
"test": "ng test",
|
||||||
"lint": "ng lint",
|
"lint": "ng lint",
|
||||||
"e2e": "ng e2e"
|
"e2e": "ng e2e"
|
||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "^10.2.3",
|
"@angular/animations": "^10.2.3",
|
||||||
"@angular/common": "^10.2.3",
|
"@angular/cli": "^10.2.0",
|
||||||
"@angular/compiler": "^10.2.3",
|
"@angular/common": "^10.2.3",
|
||||||
"@angular/core": "^10.2.3",
|
"@angular/compiler": "^10.2.3",
|
||||||
"@angular/forms": "^10.2.3",
|
"@angular/core": "^10.2.3",
|
||||||
"@angular/platform-browser": "^10.2.3",
|
"@angular/forms": "^10.2.3",
|
||||||
"@angular/platform-browser-dynamic": "^10.2.3",
|
"@angular/platform-browser": "^10.2.3",
|
||||||
"@angular/router": "^10.2.3",
|
"@angular/platform-browser-dynamic": "^10.2.3",
|
||||||
"angular-cli": "^1.0.0-beta.28.3",
|
"@angular/router": "^10.2.3",
|
||||||
"ng": "0.0.0",
|
"ng": "0.0.0",
|
||||||
"rxjs": "~6.6.0",
|
"rxjs": "~6.6.0",
|
||||||
"tslib": "^2.0.3",
|
"tslib": "^2.0.3",
|
||||||
"zone.js": "~0.10.2"
|
"zone.js": "~0.10.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "^0.1100.1",
|
"@angular-devkit/build-angular": "^0.1100.2",
|
||||||
"@angular/cli": "^10.2.0",
|
"@angular/cli": "^10.2.0",
|
||||||
"@angular/compiler-cli": "^10.2.3",
|
"@angular/compiler-cli": "^10.2.3",
|
||||||
"@types/jasmine": "~3.5.0",
|
"@types/jasmine": "~3.5.0",
|
||||||
"@types/jasminewd2": "~2.0.3",
|
"@types/jasminewd2": "~2.0.3",
|
||||||
"@types/node": "^12.19.4",
|
"@types/node": "^12.19.8",
|
||||||
"codelyzer": "^6.0.0",
|
"codelyzer": "^6.0.0",
|
||||||
"jasmine-core": "~3.6.0",
|
"jasmine-core": "~3.6.0",
|
||||||
"jasmine-spec-reporter": "~5.0.0",
|
"jasmine-spec-reporter": "~5.0.0",
|
||||||
"karma": "~5.0.0",
|
"karma": "~5.0.0",
|
||||||
"karma-chrome-launcher": "~3.1.0",
|
"karma-chrome-launcher": "~3.1.0",
|
||||||
"karma-coverage-istanbul-reporter": "~3.0.2",
|
"karma-coverage-istanbul-reporter": "~3.0.2",
|
||||||
"karma-jasmine": "~4.0.0",
|
"karma-jasmine": "~4.0.0",
|
||||||
"karma-jasmine-html-reporter": "^1.5.0",
|
"karma-jasmine-html-reporter": "^1.5.0",
|
||||||
"protractor": "~7.0.0",
|
"protractor": "~7.0.0",
|
||||||
"ts-node": "~8.3.0",
|
"ts-node": "~8.3.0",
|
||||||
"tslint": "~6.1.0",
|
"tslint": "~6.1.0",
|
||||||
"typescript": "^4.0.5"
|
"typescript": "<4.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
16
Frontend/src/app/api.service.spec.ts
Normal file
16
Frontend/src/app/api.service.spec.ts
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
import { TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ApiService } from './api.service';
|
||||||
|
|
||||||
|
describe('ApiService', () => {
|
||||||
|
let service: ApiService;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
TestBed.configureTestingModule({});
|
||||||
|
service = TestBed.inject(ApiService);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be created', () => {
|
||||||
|
expect(service).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
27
Frontend/src/app/api.service.ts
Normal file
27
Frontend/src/app/api.service.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import {Injectable} from '@angular/core';
|
||||||
|
import {HttpClient, HttpHeaders} from '@angular/common/http';
|
||||||
|
import process from 'process';
|
||||||
|
import {Product} from './models/product';
|
||||||
|
import {Observable, of} from 'rxjs';
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class ApiService {
|
||||||
|
apiUrl = 'https://backend.betterzon.xyz';
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private http: HttpClient
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
getProducts(): Observable<Product[]> {
|
||||||
|
try {
|
||||||
|
const prods = this.http.get<Product[]>((this.apiUrl + '/products'));
|
||||||
|
console.log(prods);
|
||||||
|
return prods;
|
||||||
|
} catch (exception) {
|
||||||
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1 +1 @@
|
||||||
<app-hello-world></app-hello-world>
|
<router-outlet></router-outlet>
|
||||||
|
|
|
@ -1,18 +1,29 @@
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import {BrowserModule} from '@angular/platform-browser';
|
||||||
import { NgModule } from '@angular/core';
|
import {HttpClientModule} from '@angular/common/http';
|
||||||
|
import {NgModule} from '@angular/core';
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
import {AppComponent} from './app.component';
|
||||||
import { HelloWorldComponent } from './hello-world/hello-world.component';
|
import {AppRouting} from './app.routing';
|
||||||
|
import {ProductListComponent} from './product-list/product-list.component';
|
||||||
|
import { LandingpageComponent } from './landingpage/landingpage.component';
|
||||||
|
import { ProductDetailPageComponent } from './product-detail-page/product-detail-page.component';
|
||||||
|
import { FooterComponent } from './footer/footer.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
HelloWorldComponent
|
ProductListComponent,
|
||||||
],
|
LandingpageComponent,
|
||||||
imports: [
|
ProductDetailPageComponent,
|
||||||
BrowserModule
|
FooterComponent
|
||||||
],
|
],
|
||||||
providers: [],
|
imports: [
|
||||||
bootstrap: [AppComponent]
|
BrowserModule,
|
||||||
|
AppRouting,
|
||||||
|
HttpClientModule
|
||||||
|
],
|
||||||
|
providers: [],
|
||||||
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
export class AppModule { }
|
export class AppModule {
|
||||||
|
}
|
||||||
|
|
24
Frontend/src/app/app.routing.ts
Normal file
24
Frontend/src/app/app.routing.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import {NgModule} from '@angular/core';
|
||||||
|
import {CommonModule} from '@angular/common';
|
||||||
|
import {RouterModule, Routes} from '@angular/router';
|
||||||
|
import {AppComponent} from './app.component';
|
||||||
|
import {ProductListComponent} from './product-list/product-list.component';
|
||||||
|
import {LandingpageComponent} from './landingpage/landingpage.component';
|
||||||
|
import {ProductDetailPageComponent} from './product-detail-page/product-detail-page.component';
|
||||||
|
|
||||||
|
const routes: Routes = [
|
||||||
|
{path: '', component: LandingpageComponent},
|
||||||
|
{path: 'product', component: ProductDetailPageComponent}
|
||||||
|
];
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
declarations: [],
|
||||||
|
imports: [
|
||||||
|
RouterModule.forRoot(routes)
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
RouterModule
|
||||||
|
]
|
||||||
|
})
|
||||||
|
export class AppRouting {
|
||||||
|
}
|
17
Frontend/src/app/footer/footer.component.css
Normal file
17
Frontend/src/app/footer/footer.component.css
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
.footer {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
width: 100%;
|
||||||
|
background-color: dimgrey;
|
||||||
|
color: white;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-3d {
|
||||||
|
padding: 10px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
14
Frontend/src/app/footer/footer.component.html
Normal file
14
Frontend/src/app/footer/footer.component.html
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<!--- footer --->
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<div class='wrap'>
|
||||||
|
<div class="icons">
|
||||||
|
<a href="https://github.com/Mueller-Patrick/Betterzon" class="fa fa-github fa-4x icon-3d"></a>
|
||||||
|
<a href="https://twitter.com/elonmusk" class="fa fa-twitter fa-4x icon-3d"></a>
|
||||||
|
<a href="https://www.facebook.com/TheElonmusk/" class="fa fa-facebook fa-4x icon-3d"></a>
|
||||||
|
</div>
|
||||||
|
<div class = "blocks" id="copyright">© COPYRIGHT 2020 </div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
|
@ -1,20 +1,20 @@
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { HelloWorldComponent } from './hello-world.component';
|
import { FooterComponent } from './footer.component';
|
||||||
|
|
||||||
describe('HelloWorldComponent', () => {
|
describe('FooterComponent', () => {
|
||||||
let component: HelloWorldComponent;
|
let component: FooterComponent;
|
||||||
let fixture: ComponentFixture<HelloWorldComponent>;
|
let fixture: ComponentFixture<FooterComponent>;
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await TestBed.configureTestingModule({
|
await TestBed.configureTestingModule({
|
||||||
declarations: [ HelloWorldComponent ]
|
declarations: [ FooterComponent ]
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fixture = TestBed.createComponent(HelloWorldComponent);
|
fixture = TestBed.createComponent(FooterComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
15
Frontend/src/app/footer/footer.component.ts
Normal file
15
Frontend/src/app/footer/footer.component.ts
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-footer',
|
||||||
|
templateUrl: './footer.component.html',
|
||||||
|
styleUrls: ['./footer.component.css']
|
||||||
|
})
|
||||||
|
export class FooterComponent implements OnInit {
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,2 +0,0 @@
|
||||||
<p>hello-world works! Title: </p>
|
|
||||||
<a href="https://blog.betterzon.xyz">Blog</a>
|
|
|
@ -1,15 +0,0 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-hello-world',
|
|
||||||
templateUrl: './hello-world.component.html',
|
|
||||||
styleUrls: ['./hello-world.component.css']
|
|
||||||
})
|
|
||||||
export class HelloWorldComponent implements OnInit {
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
2
Frontend/src/app/landingpage/landingpage.component.html
Normal file
2
Frontend/src/app/landingpage/landingpage.component.html
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
<app-product-list numberOfProducts="20" showProductPicture="true"></app-product-list>
|
||||||
|
<app-footer></app-footer>
|
25
Frontend/src/app/landingpage/landingpage.component.spec.ts
Normal file
25
Frontend/src/app/landingpage/landingpage.component.spec.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { LandingpageComponent } from './landingpage.component';
|
||||||
|
|
||||||
|
describe('LandingpageComponent', () => {
|
||||||
|
let component: LandingpageComponent;
|
||||||
|
let fixture: ComponentFixture<LandingpageComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ LandingpageComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(LandingpageComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
15
Frontend/src/app/landingpage/landingpage.component.ts
Normal file
15
Frontend/src/app/landingpage/landingpage.component.ts
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-landingpage',
|
||||||
|
templateUrl: './landingpage.component.html',
|
||||||
|
styleUrls: ['./landingpage.component.css']
|
||||||
|
})
|
||||||
|
export class LandingpageComponent implements OnInit {
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
14
Frontend/src/app/models/product.ts
Normal file
14
Frontend/src/app/models/product.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
export interface Product {
|
||||||
|
product_id: number;
|
||||||
|
asin: string;
|
||||||
|
is_active: boolean;
|
||||||
|
name: string;
|
||||||
|
short_description: string;
|
||||||
|
long_description: string;
|
||||||
|
image_guid: string;
|
||||||
|
date_added: Date;
|
||||||
|
last_modified: Date;
|
||||||
|
manufacturer_id: number;
|
||||||
|
selling_rank: string;
|
||||||
|
category_id: number;
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
<p>product-detail-page works!</p>
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ProductDetailPageComponent } from './product-detail-page.component';
|
||||||
|
|
||||||
|
describe('ProductDetailPageComponent', () => {
|
||||||
|
let component: ProductDetailPageComponent;
|
||||||
|
let fixture: ComponentFixture<ProductDetailPageComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ ProductDetailPageComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ProductDetailPageComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-product-detail-page',
|
||||||
|
templateUrl: './product-detail-page.component.html',
|
||||||
|
styleUrls: ['./product-detail-page.component.css']
|
||||||
|
})
|
||||||
|
export class ProductDetailPageComponent implements OnInit {
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
6
Frontend/src/app/product-list/product-list.component.css
Normal file
6
Frontend/src/app/product-list/product-list.component.css
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
.productItem {
|
||||||
|
border-style: solid;
|
||||||
|
border-color: dimgrey;
|
||||||
|
border-radius: .5em;
|
||||||
|
padding: .25em;
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<p class="productItem" *ngFor="let product of products" (click)="clickedProduct(product)">
|
||||||
|
{{product.name}}
|
||||||
|
</p>
|
||||||
|
<div *ngIf="showProductPicture">
|
||||||
|
Test
|
||||||
|
</div>
|
25
Frontend/src/app/product-list/product-list.component.spec.ts
Normal file
25
Frontend/src/app/product-list/product-list.component.spec.ts
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { ProductListComponent } from './product-list.component';
|
||||||
|
|
||||||
|
describe('ProductListComponent', () => {
|
||||||
|
let component: ProductListComponent;
|
||||||
|
let fixture: ComponentFixture<ProductListComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ ProductListComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(ProductListComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
41
Frontend/src/app/product-list/product-list.component.ts
Normal file
41
Frontend/src/app/product-list/product-list.component.ts
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
import {Component, Input, OnInit} from '@angular/core';
|
||||||
|
import {ApiService} from '../api.service';
|
||||||
|
import {Product} from '../models/product';
|
||||||
|
import {Router} from '@angular/router';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-product-list',
|
||||||
|
templateUrl: './product-list.component.html',
|
||||||
|
styleUrls: ['./product-list.component.css']
|
||||||
|
})
|
||||||
|
export class ProductListComponent implements OnInit {
|
||||||
|
products: Product[];
|
||||||
|
@Input() numberOfProducts: number;
|
||||||
|
@Input() showProductPicture: boolean;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private apiService: ApiService,
|
||||||
|
private router: Router
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.getProducts();
|
||||||
|
|
||||||
|
if (!this.numberOfProducts) {
|
||||||
|
this.numberOfProducts = 10;
|
||||||
|
}
|
||||||
|
if (!this.showProductPicture) {
|
||||||
|
this.showProductPicture = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getProducts(): void {
|
||||||
|
this.apiService.getProducts().subscribe(products => this.products = products);
|
||||||
|
}
|
||||||
|
|
||||||
|
clickedProduct(product: Product): void {
|
||||||
|
this.router.navigate([('/helloworld/' + product.product_id)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
# Betterzon
|
# Betterzon
|
||||||
Website: https://betterzon.xyz<br>
|
Website: https://www.betterzon.xyz<br>
|
||||||
Blog: https://blog.betterzon.xyz<br>
|
Blog: https://blog.betterzon.xyz<br>
|
||||||
Wiki: https://github.com/Mueller-Patrick/Betterzon/wiki
|
Wiki: https://github.com/Mueller-Patrick/Betterzon/wiki
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user