mirror of
https://github.com/Mueller-Patrick/Betterzon.git
synced 2024-12-23 20:15:13 +00:00
Compare commits
No commits in common. "8d2ba797f94e1535787381cc85d3bff997b91436" and "712f6c9034dc2fb245ea9c3645ecea4fced16b31" have entirely different histories.
8d2ba797f9
...
712f6c9034
|
@ -4,24 +4,7 @@ export interface Price {
|
||||||
vendor_id: number;
|
vendor_id: number;
|
||||||
price_in_cents: number;
|
price_in_cents: number;
|
||||||
timestamp: Date;
|
timestamp: Date;
|
||||||
}
|
// Only for deals
|
||||||
|
amazonDifference?: number;
|
||||||
export class Deal implements Price {
|
amazonDifferencePercent?: number;
|
||||||
price_id: number;
|
|
||||||
product_id: number;
|
|
||||||
vendor_id: number;
|
|
||||||
price_in_cents: number;
|
|
||||||
timestamp: Date;
|
|
||||||
amazonDifference: number;
|
|
||||||
amazonDifferencePercent: number;
|
|
||||||
|
|
||||||
constructor(price_id: number, product_id: number, vendor_id: number, price_in_cents: number, timestamp: Date, amazonDifference: number, amazonDifferencePercent: number) {
|
|
||||||
this.price_id = price_id;
|
|
||||||
this.product_id = product_id;
|
|
||||||
this.vendor_id = vendor_id;
|
|
||||||
this.price_in_cents = price_in_cents;
|
|
||||||
this.timestamp = timestamp;
|
|
||||||
this.amazonDifference = amazonDifference;
|
|
||||||
this.amazonDifferencePercent = amazonDifferencePercent;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,7 @@ const pool = mariadb.createPool({
|
||||||
* Data Model Interfaces
|
* Data Model Interfaces
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {Deal, Price} from './price.interface';
|
import {Price} from './price.interface';
|
||||||
import {Prices} from './prices.interface';
|
import {Prices} from './prices.interface';
|
||||||
|
|
||||||
|
|
||||||
|
@ -255,7 +255,7 @@ export const getBestDeals = async (amount: number): Promise<Prices> => {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate over all prices to find the products with the biggest difference between amazon and other vendor
|
// Iterate over all prices to find the products with the biggest difference between amazon and other vendor
|
||||||
let deals: Deal[] = [];
|
let deals: Price[] = [];
|
||||||
|
|
||||||
Object.keys(allPrices).forEach(productId => {
|
Object.keys(allPrices).forEach(productId => {
|
||||||
if (allPrices[parseInt(productId)]) {
|
if (allPrices[parseInt(productId)]) {
|
||||||
|
@ -287,7 +287,7 @@ export const getBestDeals = async (amount: number): Promise<Prices> => {
|
||||||
|
|
||||||
// Push only deals were the amazon price is actually higher
|
// Push only deals were the amazon price is actually higher
|
||||||
if (deal.amazonDifferencePercent > 0) {
|
if (deal.amazonDifferencePercent > 0) {
|
||||||
deals.push(deal as Deal);
|
deals.push(deal as Price);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -9,5 +9,6 @@
|
||||||
<exclude-output />
|
<exclude-output />
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="library" name="Python 3.9 (venv) interpreter library" level="application" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
|
@ -24,9 +24,6 @@
|
||||||
"src/assets"
|
"src/assets"
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
{
|
|
||||||
"input": "src/themes.scss"
|
|
||||||
},
|
|
||||||
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
|
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
|
||||||
"src/styles.css",
|
"src/styles.css",
|
||||||
"./node_modules/cookieconsent/build/cookieconsent.min.css"
|
"./node_modules/cookieconsent/build/cookieconsent.min.css"
|
||||||
|
@ -91,18 +88,13 @@
|
||||||
"tsConfig": "tsconfig.spec.json",
|
"tsConfig": "tsconfig.spec.json",
|
||||||
"karmaConfig": "karma.conf.js",
|
"karmaConfig": "karma.conf.js",
|
||||||
"codeCoverage": true,
|
"codeCoverage": true,
|
||||||
"codeCoverageExclude": [
|
"codeCoverageExclude": ["src/app/mocks/mock.service.ts"],
|
||||||
"src/app/mocks/mock.service.ts"
|
|
||||||
],
|
|
||||||
"assets": [
|
"assets": [
|
||||||
"src/favicon.ico",
|
"src/favicon.ico",
|
||||||
"src/assets"
|
"src/assets"
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
|
"./node_modules/@angular/material/prebuilt-themes/deeppurple-amber.css",
|
||||||
{
|
|
||||||
"input": "src/themes.scss"
|
|
||||||
},
|
|
||||||
"src/styles.css",
|
"src/styles.css",
|
||||||
"./node_modules/cookieconsent/build/cookieconsent.min.css"
|
"./node_modules/cookieconsent/build/cookieconsent.min.css"
|
||||||
],
|
],
|
||||||
|
|
17128
Frontend/package-lock.json
generated
17128
Frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
|
@ -18,19 +18,15 @@
|
||||||
"@angular/compiler": "^10.2.3",
|
"@angular/compiler": "^10.2.3",
|
||||||
"@angular/core": "^10.2.3",
|
"@angular/core": "^10.2.3",
|
||||||
"@angular/forms": "^10.2.3",
|
"@angular/forms": "^10.2.3",
|
||||||
"@angular/localize": "^10.2.3",
|
|
||||||
"@angular/material": "~10.2.7",
|
"@angular/material": "~10.2.7",
|
||||||
"@angular/platform-browser": "^10.2.3",
|
"@angular/platform-browser": "^10.2.3",
|
||||||
"@angular/platform-browser-dynamic": "^10.2.3",
|
"@angular/platform-browser-dynamic": "^10.2.3",
|
||||||
"@angular/router": "^10.2.3",
|
"@angular/router": "^10.2.3",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^8.0.4",
|
|
||||||
"apexcharts": "^3.22.3",
|
"apexcharts": "^3.22.3",
|
||||||
"bootstrap": "^4.5.0",
|
|
||||||
"cookieconsent": "^3.1.1",
|
"cookieconsent": "^3.1.1",
|
||||||
"karma-firefox-launcher": "^2.1.0",
|
"karma-firefox-launcher": "^2.1.0",
|
||||||
"ng": "0.0.0",
|
"ng": "0.0.0",
|
||||||
"ng-apexcharts": "^1.5.6",
|
"ng-apexcharts": "^1.5.6",
|
||||||
"ngx-bootstrap": "^6.2.0",
|
|
||||||
"ngx-cookieconsent": "^2.2.3",
|
"ngx-cookieconsent": "^2.2.3",
|
||||||
"rxjs": "~6.6.0",
|
"rxjs": "~6.6.0",
|
||||||
"tslib": "^2.0.3",
|
"tslib": "^2.0.3",
|
||||||
|
@ -46,7 +42,7 @@
|
||||||
"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": "^6.3.2",
|
"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",
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1,13 +1 @@
|
||||||
<div class="container">
|
|
||||||
<div class="header">
|
|
||||||
<app-top-bar></app-top-bar>
|
|
||||||
</div>
|
|
||||||
<div class="page-content">
|
|
||||||
<router-outlet></router-outlet>
|
<router-outlet></router-outlet>
|
||||||
</div>
|
|
||||||
<div class="footer">
|
|
||||||
<app-bottom-bar></app-bottom-bar>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,18 +20,6 @@ import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
|
||||||
import {ImprintComponent} from './pages/imprint/imprint.component';
|
import {ImprintComponent} from './pages/imprint/imprint.component';
|
||||||
import {PrivacyComponent} from './pages/privacy/privacy.component';
|
import {PrivacyComponent} from './pages/privacy/privacy.component';
|
||||||
import {NgcCookieConsentModule, NgcCookieConsentConfig} from 'ngx-cookieconsent';
|
import {NgcCookieConsentModule, NgcCookieConsentConfig} from 'ngx-cookieconsent';
|
||||||
import {MatSlideToggleModule} from '@angular/material/slide-toggle';
|
|
||||||
import {TopBarComponent} from './components/top-bar/top-bar.component';
|
|
||||||
import {RouterModule} from '@angular/router';
|
|
||||||
import {MatButtonModule} from "@angular/material/button";
|
|
||||||
import {MatToolbarModule} from '@angular/material/toolbar';
|
|
||||||
import {MatIconModule} from '@angular/material/icon';
|
|
||||||
import {MatSidenavModule} from '@angular/material/sidenav';
|
|
||||||
import {MatListModule} from "@angular/material/list";
|
|
||||||
import {BottomBarComponent} from './components/bottom-bar/bottom-bar.component';
|
|
||||||
import { HotDealsWidgetComponent } from './components/hot-deals-widget/hot-deals-widget.component';
|
|
||||||
import { SliderForProductsComponent } from './components/slider-for-products/slider-for-products.component';
|
|
||||||
|
|
||||||
|
|
||||||
// For cookie popup
|
// For cookie popup
|
||||||
const cookieConfig: NgcCookieConsentConfig = {
|
const cookieConfig: NgcCookieConsentConfig = {
|
||||||
|
@ -85,11 +73,7 @@ const cookieConfig: NgcCookieConsentConfig = {
|
||||||
NewestPricesListComponent,
|
NewestPricesListComponent,
|
||||||
PageNotFoundPageComponent,
|
PageNotFoundPageComponent,
|
||||||
ImprintComponent,
|
ImprintComponent,
|
||||||
PrivacyComponent,
|
PrivacyComponent
|
||||||
TopBarComponent,
|
|
||||||
BottomBarComponent,
|
|
||||||
HotDealsWidgetComponent,
|
|
||||||
SliderForProductsComponent
|
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
|
@ -99,17 +83,7 @@ const cookieConfig: NgcCookieConsentConfig = {
|
||||||
FormsModule,
|
FormsModule,
|
||||||
MatMenuModule,
|
MatMenuModule,
|
||||||
BrowserAnimationsModule,
|
BrowserAnimationsModule,
|
||||||
NgcCookieConsentModule.forRoot(cookieConfig),
|
NgcCookieConsentModule.forRoot(cookieConfig)
|
||||||
MatSlideToggleModule,
|
|
||||||
MatButtonModule,
|
|
||||||
MatToolbarModule,
|
|
||||||
MatSidenavModule,
|
|
||||||
MatListModule,
|
|
||||||
MatButtonModule,
|
|
||||||
MatIconModule,
|
|
||||||
RouterModule.forRoot([
|
|
||||||
{path: '', component: LandingpageComponent},
|
|
||||||
]),
|
|
||||||
],
|
],
|
||||||
providers: [],
|
providers: [],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
|
|
|
@ -1,63 +0,0 @@
|
||||||
.bottom-bar-wrapper {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 546px 546px 546px;
|
|
||||||
grid-template-rows: 70px 70px 70px;
|
|
||||||
grid-column-gap: 0px;
|
|
||||||
grid-row-gap: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.folge-uns-item {
|
|
||||||
grid-column: 2; grid-row: 1;
|
|
||||||
justify-self: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-items {
|
|
||||||
grid-column: 2; grid-row: 2;
|
|
||||||
justify-self: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-links li {
|
|
||||||
display: inline;
|
|
||||||
margin-right: 60px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#footer-line {
|
|
||||||
grid-area: 3/1/3/4;
|
|
||||||
width: 100%;
|
|
||||||
background-color: #000000;
|
|
||||||
height: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottom-logo {
|
|
||||||
grid-column: 1; grid-row: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bottom-info {
|
|
||||||
grid-column: 3; grid-row: 3;
|
|
||||||
justify-self: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
#folge {
|
|
||||||
font-size: 46px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #E53167;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#uns {
|
|
||||||
font-size: 32px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#better {
|
|
||||||
font-size: 28px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #3480E3;
|
|
||||||
}
|
|
||||||
|
|
||||||
#zon {
|
|
||||||
font-size: 28px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #E53167;
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
<div class="bottom-bar-wrapper">
|
|
||||||
<div class="folge-uns-item">
|
|
||||||
<p><span id="folge">FOLGE</span><span id="uns">UNS</span></p>
|
|
||||||
</div>
|
|
||||||
<div class="link-items">
|
|
||||||
<ul style="list-style-type:none" class="footer-links">
|
|
||||||
<li><a href="https://github.com/Mueller-Patrick/Betterzon">GiT</a></li>
|
|
||||||
<li><a href="https://blog.betterzon.xyz/">BLOG</a></li>
|
|
||||||
<li><a href="https://github.com/Mueller-Patrick/Betterzon/wiki">Wiki</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="footer-line">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="bottom-logo">
|
|
||||||
<p><span id="better">BETTER</span><span id="zon">ZON</span></p>
|
|
||||||
</div>
|
|
||||||
<div class="bottom-info">
|
|
||||||
<ul style="list-style-type:none" class="footer-links">
|
|
||||||
<li><a>DATENSCHUTZERKLÄRUNG</a></li>
|
|
||||||
<li><a>IMPRESSUM</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { BottomBarComponent } from "./bottom-bar.component";
|
|
||||||
|
|
||||||
describe("BottomBarComponent", () => {
|
|
||||||
let component: BottomBarComponent;
|
|
||||||
let fixture: ComponentFixture<BottomBarComponent>;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
declarations: [ BottomBarComponent ]
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(BottomBarComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,15 +0,0 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-bottom-bar',
|
|
||||||
templateUrl: "./bottom-bar.component.html",
|
|
||||||
styleUrls: ["./bottom-bar.component.css"]
|
|
||||||
})
|
|
||||||
export class BottomBarComponent implements OnInit {
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -3,7 +3,7 @@
|
||||||
left: 0;
|
left: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: #1976d2;
|
background-color: dimgrey;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,3 +30,5 @@
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,8 +48,3 @@
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.slider {
|
|
||||||
position: relative;
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,9 +7,6 @@
|
||||||
<div class="searchBox">
|
<div class="searchBox">
|
||||||
<input *ngIf="showSearch===true" type="text" [(ngModel)]="searchInput" placeholder="Search" (keyup.enter)="startedSearch()">
|
<input *ngIf="showSearch===true" type="text" [(ngModel)]="searchInput" placeholder="Search" (keyup.enter)="startedSearch()">
|
||||||
</div>
|
</div>
|
||||||
<div class="slider">
|
|
||||||
<mat-slide-toggle color="primary">dark me</mat-slide-toggle>
|
|
||||||
</div>
|
|
||||||
<div class="profileIcon">
|
<div class="profileIcon">
|
||||||
<button mat-button [matMenuTriggerFor]="menu">Menu</button>
|
<button mat-button [matMenuTriggerFor]="menu">Menu</button>
|
||||||
<mat-menu #menu="matMenu">
|
<mat-menu #menu="matMenu">
|
||||||
|
|
|
@ -1,72 +0,0 @@
|
||||||
.hot-deal-widget-wrapper{
|
|
||||||
width: 1640px;
|
|
||||||
height: 820px;
|
|
||||||
background-color: #f8f9fa;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(2, 1fr);
|
|
||||||
grid-column-gap: 0px;
|
|
||||||
grid-row-gap: 0px;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-description {
|
|
||||||
/*background-color: #3480E3;*/
|
|
||||||
height: 100%;
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 15% 16px 15% 16px 15% 16px 15% 16px 15% 16px 15% 8px;
|
|
||||||
grid-template-rows: repeat(5, 1fr);
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-image {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#hot-deals{
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
justify-self: center;
|
|
||||||
align-self: center;
|
|
||||||
grid-column: 3/10;
|
|
||||||
grid-row: 1/2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#product-name {
|
|
||||||
justify-self: center;
|
|
||||||
align-self: center;
|
|
||||||
grid-column: 3/10;
|
|
||||||
grid-row: 2/3;
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#product-name > p {
|
|
||||||
font-size: 65px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#sales {
|
|
||||||
justify-self: center;
|
|
||||||
align-self: center;
|
|
||||||
grid-column: 3/10;
|
|
||||||
grid-row: 3/4;
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#futher-informations {
|
|
||||||
justify-self: center;
|
|
||||||
align-self: center;
|
|
||||||
grid-column: 3/10;
|
|
||||||
grid-row: 4/5;
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#points {
|
|
||||||
justify-self: center;
|
|
||||||
align-self: start;
|
|
||||||
grid-column: 3/10;
|
|
||||||
grid-row: 5/6;
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-image {
|
|
||||||
display: grid;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
<div class="hot-deal-widget-wrapper">
|
|
||||||
<div class="product-description">
|
|
||||||
<div id="hot-deals">
|
|
||||||
<h1>HOT DEALS</h1>
|
|
||||||
</div>
|
|
||||||
<div id="product-name">
|
|
||||||
<h1>Neues Apple iPhone 12 Pro <br> (512 GB) - Graphit</h1>
|
|
||||||
</div>
|
|
||||||
<div id="sales">
|
|
||||||
SPARE BIS ZU 7%!
|
|
||||||
</div>
|
|
||||||
<div id="futher-informations">
|
|
||||||
Weitere Informationen
|
|
||||||
</div>
|
|
||||||
<div id="points">
|
|
||||||
points
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="product-image">
|
|
||||||
<img src="assets/images/iphone-12-pro-silver-hero.png" height="771">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { HotDealsWidgetComponent } from './hot-deals-widget.component';
|
|
||||||
|
|
||||||
describe('HotDealsWidgetComponent', () => {
|
|
||||||
let component: HotDealsWidgetComponent;
|
|
||||||
let fixture: ComponentFixture<HotDealsWidgetComponent>;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
declarations: [ HotDealsWidgetComponent ]
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(HotDealsWidgetComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,15 +0,0 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-hot-deals-widget',
|
|
||||||
templateUrl: './hot-deals-widget.component.html',
|
|
||||||
styleUrls: ['./hot-deals-widget.component.css']
|
|
||||||
})
|
|
||||||
export class HotDealsWidgetComponent implements OnInit {
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
<p>slider-for-products works!</p>
|
|
|
@ -1,25 +0,0 @@
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { SliderForProductsComponent } from './slider-for-products.component';
|
|
||||||
|
|
||||||
describe('SliderForProductsComponent', () => {
|
|
||||||
let component: SliderForProductsComponent;
|
|
||||||
let fixture: ComponentFixture<SliderForProductsComponent>;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
declarations: [ SliderForProductsComponent ]
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(SliderForProductsComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,15 +0,0 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-slider-for-products',
|
|
||||||
templateUrl: './slider-for-products.component.html',
|
|
||||||
styleUrls: ['./slider-for-products.component.css']
|
|
||||||
})
|
|
||||||
export class SliderForProductsComponent implements OnInit {
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
.top-bar-wrapper {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 200px 360px 820px 20px 250px;
|
|
||||||
grid-template-rows: 40px;
|
|
||||||
grid-column-gap: 0px;
|
|
||||||
grid-row-gap: 0px;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-logo {
|
|
||||||
grid-area: 1/1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#better {
|
|
||||||
font-size: 28px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #3480E3;
|
|
||||||
}
|
|
||||||
|
|
||||||
#zon {
|
|
||||||
font-size: 28px;
|
|
||||||
font-weight: bold;
|
|
||||||
color: #E53167;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-button {
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
}
|
|
||||||
|
|
||||||
.sign-up {
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
margin-left: 50px;
|
|
||||||
margin-right: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.login {
|
|
||||||
margin-right: 25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#signin {
|
|
||||||
border-radius: 25px;
|
|
||||||
background-color: #E53167;
|
|
||||||
}
|
|
||||||
|
|
||||||
._links > a {
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
margin-left: 10px;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
._signing_links > a {
|
|
||||||
/*background-color: #E53167;*/
|
|
||||||
margin-left: 50px;
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
<div class="top-bar-wrapper">
|
|
||||||
<div class="<top-logo>">
|
|
||||||
<a><span id="better">BETTER</span><span id="zon">ZON</span></a>
|
|
||||||
</div>
|
|
||||||
<div class="links">
|
|
||||||
<nav class="_links">
|
|
||||||
<a>KONTAKTIERE UNS</a>
|
|
||||||
<a>KUNDEN</a>
|
|
||||||
<a>FAQ</a>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
<div class="footer_space">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="search-button">
|
|
||||||
<a>
|
|
||||||
<img src="assets/images/search_black_24dp.svg" alt="Sarch button">
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="links">
|
|
||||||
<nav class="_signing_links">
|
|
||||||
<a>SIGN UP</a>
|
|
||||||
<a><span id="signin">SIGN IN</span></a>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,25 +0,0 @@
|
||||||
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { TopBarComponent } from './top-bar.component';
|
|
||||||
|
|
||||||
describe('TopBarComponent', () => {
|
|
||||||
let component: TopBarComponent;
|
|
||||||
let fixture: ComponentFixture<TopBarComponent>;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
await TestBed.configureTestingModule({
|
|
||||||
declarations: [ TopBarComponent ]
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
});
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(TopBarComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,17 +0,0 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-top-bar',
|
|
||||||
templateUrl: './top-bar.component.html',
|
|
||||||
styleUrls: ['./top-bar.component.css']
|
|
||||||
})
|
|
||||||
export class TopBarComponent implements OnInit {
|
|
||||||
|
|
||||||
sidenav: any;
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,6 +1,5 @@
|
||||||
<app-hot-deals-widget></app-hot-deals-widget>
|
<app-header [showSearch]="false"></app-header>
|
||||||
|
<div id="mainComponents">
|
||||||
<!--<div id="mainComponents">
|
|
||||||
<div id="searchContainer">
|
<div id="searchContainer">
|
||||||
<input type="text" [(ngModel)]="searchInput" placeholder="Search" (keyup.enter)="startedSearch()">
|
<input type="text" [(ngModel)]="searchInput" placeholder="Search" (keyup.enter)="startedSearch()">
|
||||||
</div>
|
</div>
|
||||||
|
@ -16,4 +15,4 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
-->
|
<app-footer></app-footer>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
<app-header [showSearch]="true"></app-header>
|
||||||
<div id="mainComponents">
|
<div id="mainComponents">
|
||||||
<app-product-details [productId]="productId"></app-product-details>
|
<app-product-details [productId]="productId"></app-product-details>
|
||||||
<app-newest-prices-list [productId]="productId"></app-newest-prices-list>
|
<app-newest-prices-list [productId]="productId"></app-newest-prices-list>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
<app-header [showSearch]="true"></app-header>
|
||||||
<div id="mainComponents">
|
<div id="mainComponents">
|
||||||
<app-product-list numberOfProducts="20" [showProductPicture]="true" searchQuery="{{searchTerm}}"
|
<app-product-list numberOfProducts="20" [showProductPicture]="true" searchQuery="{{searchTerm}}"
|
||||||
type="search"></app-product-list>
|
type="search"></app-product-list>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<app-footer></app-footer>
|
<app-footer></app-footer>
|
||||||
|
|
|
@ -18,191 +18,116 @@ export class ApiService {
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ____ __ __
|
|
||||||
/ __ \_________ ____/ /_ _______/ /______
|
|
||||||
/ /_/ / ___/ __ \/ __ / / / / ___/ __/ ___/
|
|
||||||
/ ____/ / / /_/ / /_/ / /_/ / /__/ /_(__ )
|
|
||||||
/_/ /_/ \____/\__,_/\__,_/\___/\__/____/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the specified product from the API
|
|
||||||
* @param id The id of the product to get
|
|
||||||
* @return Observable<Product> An observable containing a single product
|
|
||||||
*/
|
|
||||||
getProduct(id): Observable<Product> {
|
getProduct(id): Observable<Product> {
|
||||||
try {
|
try {
|
||||||
return this.http.get<Product>((this.apiUrl + '/products/' + id));
|
const prod = this.http.get<Product>((this.apiUrl + '/products/' + id));
|
||||||
|
return prod;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a list of products that match the given search term
|
|
||||||
* @param query The search term to match
|
|
||||||
* @return Observable<Product[]> An observable list of products
|
|
||||||
*/
|
|
||||||
getProductsByQuery(query): Observable<Product[]> {
|
getProductsByQuery(query): Observable<Product[]> {
|
||||||
try {
|
try {
|
||||||
return this.http.get<Product[]>((this.apiUrl + '/products/search/' + query));
|
const prods = this.http.get<Product[]>((this.apiUrl + '/products/search/' + query));
|
||||||
|
return prods;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a list of all products
|
|
||||||
* @return Observable<Product[]> An observable list of products
|
|
||||||
*/
|
|
||||||
getProducts(): Observable<Product[]> {
|
getProducts(): Observable<Product[]> {
|
||||||
try {
|
try {
|
||||||
return this.http.get<Product[]>((this.apiUrl + '/products'));
|
const prods = this.http.get<Product[]>((this.apiUrl + '/products'));
|
||||||
|
return prods;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ____ _
|
|
||||||
/ __ \_____(_)_______ _____
|
|
||||||
/ /_/ / ___/ / ___/ _ \/ ___/
|
|
||||||
/ ____/ / / / /__/ __(__ )
|
|
||||||
/_/ /_/ /_/\___/\___/____/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a list of all prices
|
|
||||||
* @return Observable<Price[]> An observable list of prices
|
|
||||||
*/
|
|
||||||
getPrices(): Observable<Price[]> {
|
getPrices(): Observable<Price[]> {
|
||||||
try {
|
try {
|
||||||
return this.http.get<Price[]>((this.apiUrl + '/prices'));
|
const prices = this.http.get<Price[]>((this.apiUrl + '/prices'));
|
||||||
|
return prices;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the lowest prices of every vendor for the given product
|
|
||||||
* @param productId The product id of the product to fetch the prices for
|
|
||||||
* @return Observable<Price[]> An observable list of prices
|
|
||||||
*/
|
|
||||||
getLowestPrices(productId): Observable<Price[]> {
|
getLowestPrices(productId): Observable<Price[]> {
|
||||||
try {
|
try {
|
||||||
let params = new HttpParams();
|
let params = new HttpParams();
|
||||||
params = params.append('product', productId);
|
params = params.append('product', productId);
|
||||||
params = params.append('type', 'lowest');
|
params = params.append('type', 'lowest');
|
||||||
return this.http.get<Price[]>((this.apiUrl + '/prices'), {params});
|
const prices = this.http.get<Price[]>((this.apiUrl + '/prices'), {params});
|
||||||
|
return prices;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the latest amazon price for the given product
|
|
||||||
* @param productId The product id of the product to get the price for
|
|
||||||
* @return Observable<Price> An observable containing a single price
|
|
||||||
*/
|
|
||||||
getAmazonPrice(productId): Observable<Price> {
|
getAmazonPrice(productId): Observable<Price> {
|
||||||
try {
|
try {
|
||||||
let params = new HttpParams();
|
let params = new HttpParams();
|
||||||
params = params.append('product', productId);
|
params = params.append('product', productId);
|
||||||
params = params.append('vendor', '1');
|
params = params.append('vendor', '1');
|
||||||
params = params.append('type', 'newest');
|
params = params.append('type', 'newest');
|
||||||
return this.http.get<Price>((this.apiUrl + '/prices'), {params});
|
const price = this.http.get<Price>((this.apiUrl + '/prices'), {params});
|
||||||
|
return price;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the newest prices of every vendor for the given product
|
|
||||||
* @param productId The product id of the product to fetch the prices for
|
|
||||||
* @return Observable<Price[]> An observable list of prices
|
|
||||||
*/
|
|
||||||
getCurrentPricePerVendor(productId): Observable<Price[]> {
|
getCurrentPricePerVendor(productId): Observable<Price[]> {
|
||||||
try {
|
try {
|
||||||
let params = new HttpParams();
|
let params = new HttpParams();
|
||||||
params = params.append('product', productId);
|
params = params.append('product', productId);
|
||||||
params = params.append('type', 'newest');
|
params = params.append('type', 'newest');
|
||||||
return this.http.get<Price[]>((this.apiUrl + '/prices'), {params});
|
const prices = this.http.get<Price[]>((this.apiUrl + '/prices'), {params});
|
||||||
|
return prices;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* _ __ __
|
|
||||||
| | / /__ ____ ____/ /___ __________
|
|
||||||
| | / / _ \/ __ \/ __ / __ \/ ___/ ___/
|
|
||||||
| |/ / __/ / / / /_/ / /_/ / / (__ )
|
|
||||||
|___/\___/_/ /_/\__,_/\____/_/ /____/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a list of all vendors
|
|
||||||
* @return Observable<Vendor[]> An observable list of vendors
|
|
||||||
*/
|
|
||||||
getVendors(): Observable<Vendor[]> {
|
getVendors(): Observable<Vendor[]> {
|
||||||
try {
|
try {
|
||||||
return this.http.get<Vendor[]>((this.apiUrl + '/vendors'));
|
const vendors = this.http.get<Vendor[]>((this.apiUrl + '/vendors'));
|
||||||
|
return vendors;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ____ _ ___ __
|
|
||||||
/ __ \_____(_)_______ / | / /___ __________ ___ _____
|
|
||||||
/ /_/ / ___/ / ___/ _ \ / /| | / / __ `/ ___/ __ `__ \/ ___/
|
|
||||||
/ ____/ / / / /__/ __/ / ___ |/ / /_/ / / / / / / / (__ )
|
|
||||||
/_/ /_/ /_/\___/\___/ /_/ |_/_/\__,_/_/ /_/ /_/ /_/____/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a list of all price alarms
|
|
||||||
* @return Observable<PriceAlarm[]> An observable list of price alarms
|
|
||||||
*/
|
|
||||||
getPriceAlarms(): Observable<PriceAlarm[]> {
|
getPriceAlarms(): Observable<PriceAlarm[]> {
|
||||||
try {
|
try {
|
||||||
return this.http.get<PriceAlarm[]>((this.apiUrl + '/pricealarms'));
|
const alarms = this.http.get<PriceAlarm[]>((this.apiUrl + '/pricealarms'));
|
||||||
|
return alarms;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new price alarm
|
|
||||||
* @param productId The product id of the product to create the alarm for
|
|
||||||
* @param definedPrice The defined target price
|
|
||||||
* @return Observable<any> The observable response of the api
|
|
||||||
*/
|
|
||||||
createPriceAlarms(productId: number, definedPrice: number): Observable<any> {
|
createPriceAlarms(productId: number, definedPrice: number): Observable<any> {
|
||||||
try {
|
try {
|
||||||
return this.http.post((this.apiUrl + '/pricealarms'), JSON.stringify({
|
const res = this.http.post((this.apiUrl + '/pricealarms'), JSON.stringify({
|
||||||
product_id: productId,
|
product_id: productId,
|
||||||
defined_price: definedPrice
|
defined_price: definedPrice
|
||||||
}));
|
}));
|
||||||
|
return res;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates the given price alarm
|
|
||||||
* @param alarmId The alarm id of the alarm to update
|
|
||||||
* @param definedPrice The defined target price
|
|
||||||
* @return Observable<any> The observable response of the api
|
|
||||||
*/
|
|
||||||
updatePriceAlarms(alarmId: number, definedPrice: number): Observable<any> {
|
updatePriceAlarms(alarmId: number, definedPrice: number): Observable<any> {
|
||||||
try {
|
try {
|
||||||
return this.http.put((this.apiUrl + '/pricealarms'), JSON.stringify({
|
const res = this.http.put((this.apiUrl + '/pricealarms'), JSON.stringify({
|
||||||
alarm_id: alarmId,
|
alarm_id: alarmId,
|
||||||
defined_price: definedPrice
|
defined_price: definedPrice
|
||||||
}));
|
}));
|
||||||
|
return res;
|
||||||
} catch (exception) {
|
} catch (exception) {
|
||||||
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
process.stderr.write(`ERROR received from ${this.apiUrl}: ${exception}\n`);
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 425 KiB |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="18px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg>
|
|
Before Width: | Height: | Size: 392 B |
|
@ -1,169 +1,9 @@
|
||||||
/* general settings */
|
/* You can add global styles to this file, and also import other style files */
|
||||||
|
body {
|
||||||
* {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
html, body {
|
|
||||||
height: 100%;
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
background-color: #FFFFFF;
|
font-family: sans-serif;
|
||||||
|
margin-bottom: 10em;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Text */
|
html, body { height: 100%; }
|
||||||
|
body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }
|
||||||
h1 {
|
|
||||||
font-size: 32px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2 {
|
|
||||||
font-weight: lighter;
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hyperlink */
|
|
||||||
|
|
||||||
a {
|
|
||||||
cursor: pointer;
|
|
||||||
color: #000000;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
opacity: 0.8;
|
|
||||||
color: #3480E3;
|
|
||||||
}
|
|
||||||
|
|
||||||
a, p{
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* links */
|
|
||||||
|
|
||||||
/* Input */
|
|
||||||
|
|
||||||
input {
|
|
||||||
font-size: 14px;
|
|
||||||
border-radius: 2px;
|
|
||||||
padding: 8px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
border: 1px solid #BDBDBD;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: bold;
|
|
||||||
margin-bottom: 4px;
|
|
||||||
display: block;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Button */
|
|
||||||
.button, button {
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: center;
|
|
||||||
padding: 8px 16px;
|
|
||||||
border-radius: 2px;
|
|
||||||
font-size: 14px;
|
|
||||||
cursor: pointer;
|
|
||||||
background-color: #1976d2;
|
|
||||||
color: white;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button:hover, button:hover {
|
|
||||||
opacity: 0.8;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
.button:disabled, button:disabled {
|
|
||||||
opacity: 0.5;
|
|
||||||
cursor: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fancy Button */
|
|
||||||
|
|
||||||
.fancy-button {
|
|
||||||
background-color: white;
|
|
||||||
color: #1976d2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fancy-button i.material-icons {
|
|
||||||
color: #1976d2;
|
|
||||||
padding-right: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Main Container */
|
|
||||||
|
|
||||||
.container {
|
|
||||||
position: fixed;
|
|
||||||
left: 50%;
|
|
||||||
margin-left: -820px;
|
|
||||||
width: 1640px;
|
|
||||||
height: auto;
|
|
||||||
display: grid;
|
|
||||||
grid-template-rows: 70px auto 210px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
grid-row: 1/2;
|
|
||||||
}
|
|
||||||
|
|
||||||
.page-content {
|
|
||||||
grid-row: 2/3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer {
|
|
||||||
grid-row: 3/4;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of Main Container */
|
|
||||||
|
|
||||||
/* Top Bar */
|
|
||||||
|
|
||||||
app-top-bar {
|
|
||||||
width: 1640px;
|
|
||||||
height: 70px;
|
|
||||||
background-color: #ffffff;
|
|
||||||
padding: 16px;
|
|
||||||
position: fixed;
|
|
||||||
left: 50%;
|
|
||||||
top:0;
|
|
||||||
margin-left: -820px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
/*box-shadow: 0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)*/
|
|
||||||
}
|
|
||||||
|
|
||||||
app-top-bar h1 {
|
|
||||||
color: white;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Bottom Bar */
|
|
||||||
app-bottom-bar{
|
|
||||||
background-color: #F8F8F8;
|
|
||||||
width: 1640px;
|
|
||||||
height: 210px;
|
|
||||||
position: fixed;
|
|
||||||
margin-top: 90px;
|
|
||||||
bottom: 0;
|
|
||||||
flex-direction: row;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
@import '~@angular/material/theming';
|
|
||||||
|
|
||||||
@include mat-core();
|
|
||||||
|
|
||||||
$themes_primary: mat-palette($mat-green);
|
|
||||||
$themes_accent: mat-palette($mat-pink, A200, A100, A400);
|
|
||||||
|
|
||||||
$themes_theme: mat-light-theme((
|
|
||||||
color: (
|
|
||||||
primary: $themes_primary,
|
|
||||||
accent: $themes_accent,
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
@include angular-material-theme($themes_theme);
|
|
Loading…
Reference in New Issue
Block a user