Merge branch 'master' of bitbucket.org:venbainformationtechnology/appointments_frontend

This commit is contained in:
surendar.m@watermelon.us 2023-03-15 10:56:28 +05:30
commit e3c69a630f
31 changed files with 420 additions and 109 deletions

View File

@ -33,7 +33,8 @@
"crossvent",
"calendar-utils/date-adapters/date-fns",
"contra/emitter",
"@mattlewis92/dom-autoscroller"
"@mattlewis92/dom-autoscroller",
"CommonJS"
],
"styles": [
"node_modules/quill/dist/quill.snow.css",

View File

@ -0,0 +1,70 @@
import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateChild } from '@angular/router';
import { Observable , of } from 'rxjs';
// import { CognitoService } from '../AwsService/cognito.service';
@Injectable()
export class AuthGuard implements CanActivate, CanActivateChild {
constructor(private router: Router) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const token = localStorage.getItem('user_token');
if(token != '' && token != undefined && token != null){
return true
}else{
alert("else");
this.router.navigate(['authentication/login']);
return false;
}
// if (this.shared.getToken()) {
// alert("if");
// // this.router.navigate(['']);
// return true
// } else {
// alert("else");
// this.router.navigate(['/login']);
// return false;
// }
}
canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
const token = localStorage.getItem('user_token');
console.log(token)
if(token != '' && token != undefined && token != null){
return true
}else{
setTimeout(() => {
this.router.navigate(['authentication/login']);
return false;
},1000);
}
// if (this.shared.getCurrentUser() != null && this.shared.getToken()) {
// // alert("if");
// return true;
// } else {
// // alert("else");
// setTimeout(() => {
// this.router.navigate(['authentication/login']);
// return false;
// },1000);
// }
}
// public getToken(): string {
// return localStorage.getItem('token');
// }
// public logOut() {
// localStorage.clear();
// if(localStorage.getItem('token') === null){
// this.router.navigate(['/login']);
// }
// }
}

View File

@ -38,6 +38,7 @@ import { TokenInterceptor } from './_guard/token.interceptor';
import { SessionService } from './session-services/session.service';
import { AppointmentService } from './appoinment/appointment.service';
import { RoleMenuItemsPipe } from './layouts/role-menu-items.pipe';
import { AuthGuard } from './_guard/auth.guard';
export function HttpLoaderFactory(http: HttpClient) {
@ -91,7 +92,7 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
],
providers: [
TranslateService,
SessionService,
SessionService,AuthGuard,
AppointmentService,
{
provide: PERFECT_SCROLLBAR_CONFIG,

View File

@ -2,6 +2,7 @@ import { Routes } from '@angular/router';
import { AdminLayoutComponent } from './layouts/admin/admin-layout.component';
import { AuthLayoutComponent } from './layouts/auth/auth-layout.component';
import { AuthGuard } from './_guard/auth.guard';
export const AppRoutes: Routes = [{
path: '',
@ -10,34 +11,38 @@ export const AppRoutes: Routes = [{
}, {
path: '',
component: AdminLayoutComponent,
canActivateChild:[AuthGuard],
children: [{
path: 'home',
loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule)
},
{
path: 'business',
loadChildren: () => import('./appoinment/business/business.module').then(m => m.BusinessModule)
},
{
path: 'appoinments',
loadChildren: () => import('./appoinment/appoinments/appoinments.module').then(m => m.AppoinmentsModule)
},
{
path: 'service',
loadChildren: () => import('./appoinment/service-list-details/service-list.module').then(m => m.ServiceListModule)
},
{
path: 'users',
loadChildren: () => import('./appoinment/user/user.module').then(m => m.UserModule)
},
{
path: 'consultants',
loadChildren: () => import('./appoinment/consultants/consultants.module').then(m => m.ConsultantsModule)
},
{
path: 'customers',
loadChildren: () => import('./appoinment/customers/customers.module').then(m => m.CustomersModule)
},
{
path: 'business',
loadChildren: () => import('./appoinment/business/business.module').then(m => m.BusinessModule)
path: 'consultants',
loadChildren: () => import('./appoinment/consultants/consultants.module').then(m => m.ConsultantsModule)
}, {
path: 'users',
loadChildren: () => import('./appoinment/user/user.module').then(m => m.UserModule)
},
{
path: 'services',
loadChildren: () => import('./appoinment/service-list-details/service-list.module').then(m => m.ServiceListModule)
}
]
}, {
path: '',

View File

@ -12,23 +12,15 @@ import { } from './service-list-details/service-list/service-list.component'
import { ConsultantsListComponent } from './consultants/consultants-list/consultants-list.component';
const routes: Routes = [
// {
// path:'',
// redirectTo:'',
// pathMatch:'full'
// },{
// path: 'add-business-list',
// component: AddBusinessListComponent
// },
// {
// path: 'business-list',
// component: BusinessListComponent
// },
// {
// path: 'add-user-list',
// component: AddUserListComponent
// },
const routes: Routes = [ {
path: 'add-business-list',
component: AddBusinessListComponent
},
{
path: 'add-user-list',
component: AddUserListComponent
},
// {
// path: 'user-list',
// component: UserListComponent
@ -41,10 +33,10 @@ const routes: Routes = [
// path: 'customers-list',
// component: CustomersListComponent
// },
// // {
// // path: 'calendar-list',
// // component: CalendarListComponent
// // },
// {
// path: 'calendar-list',
// component: CalendarListComponent
// },
// {
// path: 'calendar-list',
// component: CalendarListComponent

View File

@ -19,13 +19,13 @@ import { ConsultantsModule } from './consultants/consultants.module';
DemoMaterialModule,
CommonModule,
AppoinmentRoutingModule,
BusinessModule,
UserModule,
AppoinmentsModule,
CustomersModule,
CalendarsModule,
ServiceListModule,
ConsultantsModule
// UserModule,
// AppoinmentsModule,
// CustomersModule,
// CalendarsModule,
// ServiceListModule,
// ConsultantsModule
],
providers:[

View File

@ -4,14 +4,11 @@ import { AppoinmentsListComponent } from './appoinments-list/appoinments-list.co
const routes: Routes = [
{
path:'',
redirectTo:'appoinment/appoinments',
pathMatch:'full'
},
{
path:'appoinment/appoinments',
component:AppoinmentsListComponent
},
path: '',
component: AppoinmentsListComponent
}
];
@NgModule({

View File

@ -117,7 +117,7 @@ export class DialogBoxComponent implements OnInit {
console.log(this.local_data, this.selects)
// this.form.controls['note'].setValue('Sample')
this.form.patchValue(this.local_data)
}
}
public myError = (controlName: string, errorName: string) =>{
return this.form.controls[controlName].hasError(errorName);
}

View File

@ -4,14 +4,9 @@ import { BusinessListComponent } from './business-list/business-list.component';
const routes: Routes = [
{
path:'',
redirectTo:'appoinment/business',
pathMatch:'full'
},
{
path:'appoinment/business',
component:BusinessListComponent
},
path: '',
component: BusinessListComponent
}
];
@NgModule({

View File

@ -0,0 +1,107 @@
<h4>
<button mat-icon-button type="button" matTooltip="Close" class="button" matTooltipPosition="above" (click)="close()"
>
<mat-icon>close</mat-icon>
</button>
</h4>
<h6 class="mb-1">Date & Time: </h6>
<p>{{selected | date:'mediumDate'}}</p>
<div class="d-flex calender-time">
<div class="calender">
<mat-card class="demo-inline-calendar-card">
<mat-calendar [(selected)]="selected"></mat-calendar>
</mat-card>
</div>
<!-- <h5>Slot Availability</h5> -->
<div class="time">
<mat-tab-group class="">
<mat-tab>
<ng-template mat-tab-label>
<a class="toolbar-avatar">
<img src="assets/images/morning.png" class="img">
</a>
</ng-template>
<mat-card-content>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 mt-1 primary">9:00AM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">9:30AM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">10:00AM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">10:30AM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">11:00AM</button><br>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">11:30AM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">12:00AM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">12:30AM</button>
</mat-card-content>
</mat-tab>
<mat-tab>
<ng-template mat-tab-label>
<a class="toolbar-avatar">
<img src="assets/images/sun.png" style="width: 33px;">
</a>
</ng-template>
<mat-card-content>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 mt-1 primary">01:00PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">01:30PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">02:00PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">02:30PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">03:00PM</button><br>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">03:30PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">04:00PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">04:30PM</button>
</mat-card-content>
</mat-tab>
<mat-tab>
<ng-template mat-tab-label>
<a class="toolbar-avatar">
<img src="assets/images/sunset.png" style="width: 40px;">
</a>
</ng-template>
<mat-card-content>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 mt-1 primary">05:00PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">05:50PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">06:00PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">06:30PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary ">07:00PM</button><br>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">07:30PM</button>
</mat-card-content>
</mat-tab>
<mat-tab>
<ng-template mat-tab-label>
<a class="toolbar-avatar">
<img src="assets/images/moon.png" style="width: 30px;">
</a>
</ng-template>
<mat-card-content>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 mt-1 primary">08:00PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">08:30PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">09:00PM</button>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 primary">09:30PM</button>
</mat-card-content>
</mat-tab>
</mat-tab-group>
<div mat-dialog-content class="my-table">
<form [formGroup]="form" (ngSubmit)="submit()">
<div class="field">
<mat-form-field class="mat-pane">
<mat-select placeholder="Select Workspace" formControlName="workspace" required>
<mat-option>--</mat-option>
<mat-option *ngFor="let business of selects" [value]="business.workspace">
{{business.workspace}}
</mat-option>
</mat-select>
<mat-error *ngIf="workspace.hasError('required')">Please choose an Workspace</mat-error>
<mat-error *ngIf="workspace.hasError('invalidValue')">Please choose any other</mat-error>
</mat-form-field>
</div>
</form>
</div>
</div>
</div>
<div class="success">
<p>I have read and un derstood the Terms & Conditions of usage of 24x7,
Privacy policy, Refund Policy and consent to the same.</p>
</div>
<button mat-raised-button mat-button-sm class="mr-1 mb-1 mt-1 btn-red" >PROCEED</button>

View File

@ -0,0 +1,49 @@
$color_red_orange_approx: #4caf50;
$white: #fff;
.button{
margin-bottom: 1rem;
background-color: #ffff !important;
margin-top: -3rem;
float: right;
}
.calender{
margin-left: -1rem;
padding-right: 6rem;
}
mat-card{
width: 140%;
}
::ng-deep .mat-tab-label {
margin-left: -3rem!important;
}
.img{
width: 50px;
}
.btn-red {
background-color: $color_red_orange_approx;
color: $white;
border: 1px solid $color_red_orange_approx;
float: right;
}
h6{
color: #0087ba;
font-weight: 600;
}
.primary{
background-color: #658F9B;
color: white;
}
::ng-deep .mat-tab-group.mat-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary .mat-ink-bar {
background-color: #658F9B!important;
}
::ng-deep .mat-form-field-appearance-legacy .mat-form-field-wrapper {
width: 250%;
}
.success {
background: #fff;
box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2);
padding: 5px;
color: #0087ba;
font-weight: 600;
border-radius: 10px;
}

View File

@ -0,0 +1,25 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ConsultantsDetailsComponent } from './consultants-details.component';
describe('ConsultantsDetailsComponent', () => {
let component: ConsultantsDetailsComponent;
let fixture: ComponentFixture<ConsultantsDetailsComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ ConsultantsDetailsComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(ConsultantsDetailsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,59 @@
import { Component, Inject, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
export interface DialogData {
animal: string;
name: string;
}
export interface UsersData {
workspace: string;
}
@Component({
selector: 'app-consultants-details',
templateUrl: './consultants-details.component.html',
styleUrls: ['./consultants-details.component.scss']
})
export class ConsultantsDetailsComponent implements OnInit {
form: FormGroup;
local_data:any;
selected: Date | null;
name = 'Angular';
date = new Date();
control = new FormControl(
{
from: this.date,
// to: new Date(this.date.getTime() + 1 * 24 * 60 * 60 * 1000),
},
Validators.required
);
workspace = new FormControl('', [Validators.required]);
selects = [
{workspace: 'test 1'},
{workspace: 'test 2'},
{workspace: 'test 3'},
];
constructor(
public dialogRef: MatDialogRef<ConsultantsDetailsComponent>,
@Inject(MAT_DIALOG_DATA) public data: DialogData) {}
onNoClick(): void {
this.dialogRef.close();
}
close() {
// console.log(this.form.value);
this.dialogRef.close();
}
ngOnInit(): void {
this.form = new FormGroup({
workspace: new FormControl('', [Validators.required]),
});
console.log(this.local_data, this.selects)
// this.form.controls['note'].setValue('Sample')
this.form.patchValue(this.local_data)
}
submit(){
console.log(this.form.value);
}
}

View File

@ -39,8 +39,8 @@
<!-- <button type="button" class="UserActions-editButton edit-button EdgeButton EdgeButton--tertiary" data-scribe-element="profile_edit_button">
<span class="button-text">Accept</span>
</button> -->
<button type="button" class="UserActions-editButton edit-button EdgeButton EdgeButton--tertiary btn-red" data-scribe-element="profile_edit_button">
<span class="button-text">Book Appoinment</span>
<button type="button" (click)="openDialog()" class="UserActions-editButton edit-button EdgeButton EdgeButton--tertiary btn-red" data-scribe-element="profile_edit_button">
<span class="material-icons"> bookmark_add </span><span class="button-text">Book Appoinment</span>
</button>
</div>
</div>

View File

@ -18,6 +18,8 @@ $black_60: rgba(0, 0, 0, 0.6);
transition: all 0.3s ease-in-out 0s;
&:hover {
box-shadow: 0 0 21px $black_30;
cursor: pointer;
transform: scale(1.04);
}
}
.consultant-span{

View File

@ -1,4 +1,6 @@
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ConsultantsDetailsComponent } from '../consultants-details/consultants-details.component';
@Component({
selector: 'app-consultants-list',
@ -6,8 +8,22 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core';
styleUrls: ['./consultants-list.component.scss']
})
export class ConsultantsListComponent implements OnInit {
animal: string;
name: string;
constructor() { }
constructor(public dialog: MatDialog) {}
openDialog(): void {
const dialogRef = this.dialog.open(ConsultantsDetailsComponent, {
width: '60%',
data: {name: this.name, animal: this.animal}
});
dialogRef.afterClosed().subscribe(result => {
console.log('The dialog was closed');
this.animal = result;
});
}
ngOnInit(): void {
}

View File

@ -4,14 +4,9 @@ import { ConsultantsListComponent } from './consultants-list/consultants-list.co
const routes: Routes = [
{
path:'',
redirectTo:'appoinment/consultants',
pathMatch:'full'
},
{
path:'appoinment/consultants',
component:ConsultantsListComponent
},
path: '',
component: ConsultantsListComponent
}
];
@NgModule({

View File

@ -4,11 +4,13 @@ import { CommonModule } from '@angular/common';
import { ConsultantsRoutingModule } from './consultants-routing.module';
import { ConsultantsListComponent } from './consultants-list/consultants-list.component';
import { DemoMaterialModule } from 'app/shared/demo.module';
import { NgScrollbarModule } from 'ngx-scrollbar'
import { NgScrollbarModule } from 'ngx-scrollbar';
import { ConsultantsDetailsComponent } from './consultants-details/consultants-details.component';
@NgModule({
declarations: [
ConsultantsListComponent
ConsultantsListComponent,
ConsultantsDetailsComponent,
],
imports: [
DemoMaterialModule,

View File

@ -4,14 +4,9 @@ import { CustomersListComponent } from './customers-list/customers-list.componen
const routes: Routes = [
{
path:'',
redirectTo:'appoinment/customers',
pathMatch:'full'
},
{
path:'appoinment/customers',
component:CustomersListComponent
},
path: '',
component: CustomersListComponent
}
];
@NgModule({

View File

@ -2,15 +2,10 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ServiceListComponent } from './service-list/service-list.component';
const routes: Routes = [
const routes: Routes = [
{
path:'',
redirectTo:'appoinment/service',
pathMatch:'full'
},
{
path:'appoinment/service',
component:ServiceListComponent
path: '',
component: ServiceListComponent
},
];

View File

@ -1,4 +1,4 @@
<button mat-button (click)="openDialog('Add',{})" class="button">Add Services</button><br>
<button mat-button (click)="openDialog('Add',{})" class="buttons">Add Services</button><br>
<div fxLayout="row wrap" >
<div fxFlex.xs="100" fxFlex.sm="50" fxFlex.md="50" class="m-gap p-gap flx" *ngFor="let serviceListDetails of servicesList">
<div class="Specialties-list-card">

View File

@ -1,12 +1,17 @@
$white: #fff;
$black_10: rgba(0, 0, 0, 0.1);
$black_30: rgba(0, 0, 0, 0.3);
$icon-size: 3rem;
$icon-color: #D8D8D8;
$main-color: #f44336;
.Specialties-list-card {
background: $white;
box-shadow: 0 2px 6px $black_10;
transition: all 0.3s ease-in-out 0s;
&:hover {
box-shadow: 0 0 21px $black_30;
cursor: pointer;
transform: scale(1.04);
}
}
.consultant-card-cover {
@ -63,7 +68,8 @@ $black_30: rgba(0, 0, 0, 0.3);
width: 100%;
padding: 0 10px 0 0;
position: relative;
min-height: 80px;
// min-height: 60px;
height: 65px;
}
.mb{
margin-bottom: 0.60rem;
@ -74,13 +80,13 @@ $black_30: rgba(0, 0, 0, 0.3);
::ng-deep body .mat-card .mat-card-subtitle {
padding-left: 0rem!important;
}
.button{
.buttons{
float: right;
background-color: #4caf50;
color: #ffff;
}
.edit-color{
color: rgba(0, 0, 0, 0.54);
color: white;
}
.edit-color:hover {
color: #4caf50;

View File

@ -5,14 +5,9 @@ import { UserModule } from './user.module';
const routes: Routes = [
{
path:'',
redirectTo:'appoinment/users',
pathMatch:'full'
},
{
path:'appoinment/users',
component:UserListComponent
},
path: '',
component: UserListComponent
}
];
@NgModule({

View File

@ -0,0 +1 @@
<h1>welcome</h1>

View File

@ -29,7 +29,7 @@ const HORIZONTALMENUITEMS = [
icon: 'explore'
},
{
state: 'appoinments',
state: 'appoinment',
name: 'Appoinments',
type: 'link',
icon: 'security',
@ -38,7 +38,7 @@ const HORIZONTALMENUITEMS = [
// ]
},
{
state: 'business',
state: 'appoinment',
name: 'Business',
type: 'link',
icon: 'security',
@ -57,7 +57,7 @@ const HORIZONTALMENUITEMS = [
// ]
// },
{
state: 'customers',
state: 'appoinment',
name: 'Customers',
type: 'link',
icon: 'security',
@ -66,7 +66,7 @@ const HORIZONTALMENUITEMS = [
// ]
},
{
state: 'consultants',
state: 'appoinment',
name: 'Consultants',
type: 'link',
icon: 'security',
@ -75,7 +75,7 @@ const HORIZONTALMENUITEMS = [
// ]
},
{
state: 'users',
state: 'appoinment',
name: 'Users',
type: 'link',
icon: 'security',
@ -85,7 +85,7 @@ const HORIZONTALMENUITEMS = [
// ]
},
{
state: 'service',
state: 'appoinment',
name: 'Services List',
type: 'link',
icon: 'security',

View File

@ -84,7 +84,7 @@ const MENUITEMS : Menu[] = [
// ]
},
{
state: 'service',
state: 'services',
name: 'Services List',
type: 'link',
icon: 'security',

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

3
package-lock.json generated Normal file
View File

@ -0,0 +1,3 @@
{
"lockfileVersion": 1
}