- - -
- - - Rocket Ship - - - - - - - - - - {{ title }} app is running! - - - Rocket Ship Smoke - - - + +
+
+
+ +
- - -

Resources

-

Here are some links to help you get started:

- - - - -

Next Steps

-

What do you want to do next with your app?

- - - -
- - - - - - - - - - - -
- - -
-
ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
-
ng add _____
-
ng test
-
ng build
-
- - - - - - - - - Gray Clouds Background - - - -
- - - - - - - - - - +
\ No newline at end of file diff --git a/Frontend/src/app/app.module.ts b/Frontend/src/app/app.module.ts index b1c6c96..f8bb714 100644 --- a/Frontend/src/app/app.module.ts +++ b/Frontend/src/app/app.module.ts @@ -3,14 +3,20 @@ import { BrowserModule } from '@angular/platform-browser'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { MainViewComponent } from './main-view/main-view.component'; +import { MaterialModule } from './material.module'; @NgModule({ declarations: [ - AppComponent + AppComponent, + MainViewComponent ], imports: [ BrowserModule, - AppRoutingModule + AppRoutingModule, + BrowserAnimationsModule, + MaterialModule ], providers: [], bootstrap: [AppComponent] diff --git a/Frontend/src/app/main-view/main-view.component.html b/Frontend/src/app/main-view/main-view.component.html new file mode 100644 index 0000000..34c8de1 --- /dev/null +++ b/Frontend/src/app/main-view/main-view.component.html @@ -0,0 +1,51 @@ +
+ +
+
+
+ Obróć telefon.
+ screen_rotation +
+
+
+ + +

Diuna

+ + + + {{_data.currentUser.userName}} + + +
+ + + + + dashboard + Dashboard + + + request_quote + Zbiory danych + + + + refresh + {{appVersion}} + + + + + + + + + +
\ No newline at end of file diff --git a/Frontend/src/app/main-view/main-view.component.scss b/Frontend/src/app/main-view/main-view.component.scss new file mode 100644 index 0000000..b95f92c --- /dev/null +++ b/Frontend/src/app/main-view/main-view.component.scss @@ -0,0 +1,228 @@ +.main-container { + display: flex; + flex-direction: column; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +.sidenav-container { + flex: 1; +} +mat-icon.menu-icon { + margin-right: 3px; + color: gray; +} +mat-nav-list.menu-sublist { + padding-left: 10px; +} +mat-nav-list.menu-sublist > a { + font-size: small; +} +div.footer { + text-align: right; + font-size: smaller; + color: gray; + padding-right: 5px; +} +.fill-to-right { + flex: 1 1 auto; +} +span.topbar-user-name { + font-size: small; +} +h1.topbar-app-name { + margin-left: 8px; +} +mat-sidenav { + width: 200px; +} +mat-card.app-card { + margin: 5px; +} +.list-container { + display: flex; + flex-direction: column; + min-width: 300px; + height: 98%; +} +.top-list-container { + display: flex; + flex-direction: column; + min-width: 30vh; + height: 54vh; +} +.bottom-list-container { + display: flex; + flex-direction: column; + height: 35vh; +} +.table { + overflow: auto; + height: 100%; +} +.list-header { + min-height: 50px; + padding: 4px 12px 0; +} +.mat-form-field { + font-size: 14px; + width: 100%; +} +mat-form-field.detail-input { + width: 90%; + text-align: left; + color: black; +} +mat-form-field.detail-input-full-width { + width: 96%; + text-align: left; + color: black; +} +input[disabled] { + color: black; + -webkit-text-fill-color: black; + opacity: 1; /* required on iOS */ +} +textarea[disabled] { + color: black; + -webkit-text-fill-color: black; + opacity: 1; /* required on iOS */ +} +.loading-container { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: rgba(100, 100, 100, 0.3); + z-index: 1400; +} +.loading-img { + position: absolute; + margin: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.flip-container { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: rgba(100, 100, 100, 0.95); + z-index: 1500; +} +.flip-msg { + margin: auto; + text-align: center; + padding-top: 45vh; + color: rgb(205, 206, 177); + font-size: larger; +} +.errorMsg { + font-size: small; + margin-top: 10px; +} + +/* links */ +a:link, +a:visited { + color: black; +} +.stock-state-error { + color: red; + font-weight: bold; +} +.listContainer { + height: 100%; + width: 100%; + overflow: scroll; +} +.listItem { + height: 40px; + font-size: medium; +} + +.listItem:hover { + width: 100%; + cursor: pointer; + background: rgba(130, 130, 130, 0.2); +} + +/* snack bars */ +.snack-error { + background: #f44336; +} + +.input-right { + display: block; + direction: rtl; +} + +.background-red { + background-color: rgba(255, 0, 0, 0.6); +} + +.background-orange { + background-color: rgba(255, 145, 0, 0.6); +} + +.background-green { + background-color: rgba(0, 255, 0, 0.6); +} + +.background-grey { + background-color: rgba(100, 100, 100, 0.3); +} + +.mat-dialog-container { + padding: 0px !important; +} + +.tab-loader { + width: 25px; + margin-right: 10px; +} + +.cell-border { + border-left: 1px solid #e0e0e0; + padding-left: 4px; +} + +.cell-background { + background-color: #eeeeee; +} + +.breadcrumbs { + width: 100%; + text-align: right; + font-size: small; + color: gray; + margin-top: 0px; + padding-top: 0px; +} + +.breadcrumbs a { + color: gray; + text-decoration: none; +} + +::ng-deep snack-bar-container.custom-snackbar-error { + background: #ff3452; +} + +::ng-deep snack-bar-container.custom-snackbar-success { + background: #9ad284; +} + +::ng-deep .mat-simple-snackbar { + color: #000; +} + +::ng-deep .mat-simple-snackbar-action { + color: #000; +} \ No newline at end of file diff --git a/Frontend/src/app/main-view/main-view.component.spec.ts b/Frontend/src/app/main-view/main-view.component.spec.ts new file mode 100644 index 0000000..74526c7 --- /dev/null +++ b/Frontend/src/app/main-view/main-view.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { MainViewComponent } from './main-view.component'; + +describe('MainViewComponent', () => { + let component: MainViewComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ MainViewComponent ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(MainViewComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/Frontend/src/app/main-view/main-view.component.ts b/Frontend/src/app/main-view/main-view.component.ts new file mode 100644 index 0000000..e317e49 --- /dev/null +++ b/Frontend/src/app/main-view/main-view.component.ts @@ -0,0 +1,35 @@ +import { Component, ViewChild } from '@angular/core'; +import { MatSidenav } from '@angular/material/sidenav'; +import * as moment from 'moment'; +import packageInfo from 'package.json'; +import { DataService } from '../services/data.service'; +import { DeviceService } from '../services/device.service'; + +@Component({ + selector: 'app-main-view', + templateUrl: './main-view.component.html', + styleUrls: ['./main-view.component.scss'] +}) +export class MainViewComponent { + @ViewChild('snav') snav?: MatSidenav; + appVersion = packageInfo.version; + + submenus = { + administration: false, + }; + currentDate = moment().toDate(); + flipPhone: boolean = false; + loading: boolean = false; + + constructor( + public _data: DataService, + public _device: DeviceService + ) {} + + reloadApp() { + document.location.reload(); + } + logout() { + + } +} diff --git a/Frontend/src/app/material.module.ts b/Frontend/src/app/material.module.ts new file mode 100644 index 0000000..0db0386 --- /dev/null +++ b/Frontend/src/app/material.module.ts @@ -0,0 +1,73 @@ +import {NgModule} from '@angular/core'; +import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatButtonModule } from '@angular/material/button'; +import { MatButtonToggleModule } from '@angular/material/button-toggle'; +import { MatCardModule } from '@angular/material/card'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatChipsModule } from '@angular/material/chips'; +import { MatStepperModule } from '@angular/material/stepper'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatDialogModule } from '@angular/material/dialog'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { MatGridListModule } from '@angular/material/grid-list'; +import { MatIconModule } from '@angular/material/icon'; +import { MatInputModule } from '@angular/material/input'; +import { MatListModule } from '@angular/material/list'; +import { MatMenuModule } from '@angular/material/menu'; +import { MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatRadioModule } from '@angular/material/radio'; +import { MatRippleModule } from '@angular/material/core'; +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatSliderModule } from '@angular/material/slider'; +import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatSortModule } from '@angular/material/sort'; +import { MatTableModule } from '@angular/material/table'; +import { MatTabsModule } from '@angular/material/tabs'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatTooltipModule } from '@angular/material/tooltip'; +import {CdkTableModule} from '@angular/cdk/table'; +import {MatBadgeModule} from '@angular/material/badge'; + +@NgModule({ + exports: [ + CdkTableModule, + MatAutocompleteModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatStepperModule, + MatDatepickerModule, + MatDialogModule, + MatExpansionModule, + MatGridListModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatPaginatorModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatRadioModule, + MatRippleModule, + MatSelectModule, + MatSidenavModule, + MatSliderModule, + MatSlideToggleModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTabsModule, + MatToolbarModule, + MatTooltipModule, + MatSidenavModule, + MatBadgeModule + ], + providers: [] +}) +export class MaterialModule {} \ No newline at end of file diff --git a/Frontend/src/app/models/user.ts b/Frontend/src/app/models/user.ts new file mode 100644 index 0000000..2f2ce5f --- /dev/null +++ b/Frontend/src/app/models/user.ts @@ -0,0 +1,10 @@ +export class User { + id!: string; + email!: string; + userName!: string; + googleId!: string; + avatar?: string | ArrayBuffer; + constructor(input: any) { + Object.assign(this, input) + } + } \ No newline at end of file diff --git a/Frontend/src/app/services/data.service.spec.ts b/Frontend/src/app/services/data.service.spec.ts new file mode 100644 index 0000000..38e8d9e --- /dev/null +++ b/Frontend/src/app/services/data.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DataService } from './data.service'; + +describe('DataService', () => { + let service: DataService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DataService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/Frontend/src/app/services/data.service.ts b/Frontend/src/app/services/data.service.ts new file mode 100644 index 0000000..af49fab --- /dev/null +++ b/Frontend/src/app/services/data.service.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { User } from '../models/user'; + +@Injectable({ + providedIn: 'root' +}) +export class DataService { + currentUser?: User; + public showLoader: BehaviorSubject = new BehaviorSubject(false); + + constructor() { } +} diff --git a/Frontend/src/app/services/device.service.spec.ts b/Frontend/src/app/services/device.service.spec.ts new file mode 100644 index 0000000..d55f5fb --- /dev/null +++ b/Frontend/src/app/services/device.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { DeviceService } from './device.service'; + +describe('DeviceService', () => { + let service: DeviceService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(DeviceService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/Frontend/src/app/services/device.service.ts b/Frontend/src/app/services/device.service.ts new file mode 100644 index 0000000..5ed5f11 --- /dev/null +++ b/Frontend/src/app/services/device.service.ts @@ -0,0 +1,50 @@ +import { MediaMatcher } from '@angular/cdk/layout'; +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class DeviceService { + + private TABLET_WIDTH = 1000; + private DESKTOP_WIDTH = 1400; + + public orientation?: "landscape" | "portraid"; + public flipPhone: boolean = false; + public width?: number; + + constructor( + private mediaMacher: MediaMatcher + ) { + this.checkScreen(); + window.addEventListener("resize", () => { + this.checkScreen(); + }); + } + checkScreen() { + const isPortrait = window.outerWidth < window.outerHeight; + if ( + isPortrait && + window.outerWidth this.TABLET_WIDTH && window.outerWidth < this.DESKTOP_WIDTH; + } + isDesktop(): boolean { + return window.outerWidth > this.DESKTOP_WIDTH; + } + toString() { + return `Orientation: ${this.orientation}, Width: ${this.width}, Flip: ${this.flipPhone}, IsMobile: ${this.isMobile()} + IsTablet: ${this.isTablet()}, IsDesktop: ${this.isDesktop()}`; + } +} diff --git a/Frontend/src/assets/loader.gif b/Frontend/src/assets/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6e2ddeea397f4e7271bdfa8be407af21c50c0c2 GIT binary patch literal 64372 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 ZU^E0qLtr!nMnhmU1V%$(Gz3Tv0RTZel&}B* literal 0 HcmV?d00001 diff --git a/Frontend/src/index.html b/Frontend/src/index.html index ae63f56..5895774 100644 --- a/Frontend/src/index.html +++ b/Frontend/src/index.html @@ -6,8 +6,11 @@ + + + - + diff --git a/Frontend/src/styles.scss b/Frontend/src/styles.scss index 90d4ee0..02df3a1 100644 --- a/Frontend/src/styles.scss +++ b/Frontend/src/styles.scss @@ -1 +1,46 @@ -/* You can add global styles to this file, and also import other style files */ +html, body { height: 100%; } +body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; } + +/* default .loading styles, .loading should be invisible, opacity: 0, z-index: -1 */ +.AppLoading { + margin-top: -10px; + margin-left: -10px; + opacity: 0; + transition: opacity .8s ease-in-out; + position: fixed; + height: 105%; + width: 105%; + z-index: -1; + background-color: lightgrey; + background-image: url('./assets/loader.gif'); + background-repeat: no-repeat; + background-position: center; + } + + /* .loading screen is visible when app is not bootstrapped yet, my-app is empty */ + app-root:empty + .AppLoading { + opacity: 1; + z-index: 100; + } + + .snackbar-success { + background: #BEFF33; + } + + .snackbar-error { + background: #e7334b; + } + + :root { + --avatar-size: 30px; + } + + .avatar { + background-color: #ccc; + border-radius: 50%; + height: var(--avatar-size); + text-align: center; + width: var(--avatar-size); + vertical-align: middle; + margin-right: 10px; + } \ No newline at end of file diff --git a/Frontend/src/test.ts b/Frontend/src/test.ts index c04c876..51bb020 100644 --- a/Frontend/src/test.ts +++ b/Frontend/src/test.ts @@ -7,20 +7,8 @@ import { platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; -declare const require: { - context(path: string, deep?: boolean, filter?: RegExp): { - (id: string): T; - keys(): string[]; - }; -}; - // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, platformBrowserDynamicTesting(), ); - -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().forEach(context); diff --git a/Frontend/tsconfig.json b/Frontend/tsconfig.json index ff06eae..cf61615 100644 --- a/Frontend/tsconfig.json +++ b/Frontend/tsconfig.json @@ -16,12 +16,15 @@ "experimentalDecorators": true, "moduleResolution": "node", "importHelpers": true, - "target": "es2020", + "target": "ES2022", "module": "es2020", "lib": [ "es2020", "dom" - ] + ], + "useDefineForClassFields": false, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true }, "angularCompilerOptions": { "enableI18nLegacyMessageIdFormat": false,