From ccadab7bc97645e463c8d58dd925ad9d1847da58 Mon Sep 17 00:00:00 2001 From: bitbucket Date: Mon, 27 Mar 2023 16:28:38 +0530 Subject: [PATCH] end user flow and appointment UI chnages --- .../appoinments-list.component.html | 55 +- .../appoinments-list.component.ts | 44 +- .../appointments.service.ts | 9 +- .../consultant.service.spec.ts | 16 + .../consultant-service/consultant.service.ts | 33 + .../consultant-setting.module.ts | 4 +- .../consultant-setting.component.html | 280 ++++-- .../consultant-setting.component.scss | 49 +- .../consultant-setting.component.ts | 96 +- .../edit-working-hours.component.html | 880 +++++++++++++----- .../edit-working-hours.component.scss | 68 +- .../edit-working-hours.component.ts | 114 ++- .../extra-working-hours.component.html | 66 ++ .../extra-working-hours.component.scss | 106 +++ .../extra-working-hours.component.spec.ts | 25 + .../extra-working-hours.component.ts | 31 + .../consultants-list.component.html | 13 +- .../consultants/consultants-list.component.ts | 26 +- .../customer-info/customer-info.component.ts | 3 +- .../app/end-user/end-user-routing.module.ts | 12 +- ng-seed/src/app/end-user/end-user.service.ts | 15 +- .../app/end-user/payment/payment.component.ts | 46 +- .../service-list.component.html | 3 +- .../service-list.component.ts | 1 + .../slot-booking-details.component.html | 2 +- .../slot-booking-details.component.ts | 13 +- .../src/app/session/login/login.component.ts | 1 + ng-seed/src/assets/images/profile.jpg | Bin 0 -> 7525 bytes 28 files changed, 1558 insertions(+), 453 deletions(-) create mode 100644 ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.spec.ts create mode 100644 ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.ts create mode 100644 ng-seed/src/app/appoinment/consultant-setting/extra-working-hours/extra-working-hours.component.html create mode 100644 ng-seed/src/app/appoinment/consultant-setting/extra-working-hours/extra-working-hours.component.scss create mode 100644 ng-seed/src/app/appoinment/consultant-setting/extra-working-hours/extra-working-hours.component.spec.ts create mode 100644 ng-seed/src/app/appoinment/consultant-setting/extra-working-hours/extra-working-hours.component.ts create mode 100644 ng-seed/src/assets/images/profile.jpg diff --git a/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.html b/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.html index 54990b4..9fe4215 100644 --- a/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.html +++ b/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.html @@ -1,7 +1,7 @@

Appointment Details

Filter - +
@@ -16,31 +16,36 @@
- - - + + + + + + + + + + + + + - - + + - - - - - - - - - + + + + + - + @@ -72,11 +77,17 @@
BusId {{element.busId}} Profile
Client Name
{{element.customer[0].cusName || null }}
Appointment Date
{{element.appoinmentDate | date:'dd-MMM-YYYY' }}
+
Time
{{element.appoinmentDate | date:'mediumDate'}}

{{element.appoinmentTime}}
Appointment Time
{{element.appoinmentSlots }}
Slots
{{element.appoinmentSlots}}
Booking ID
{{element.booking}}
Status
{{element.status}}

{{element.status == 0 ? 'Booked':'Cancelled'}}
Action
+
+
- +
diff --git a/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.ts b/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.ts index efc1481..2c87f65 100644 --- a/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.ts +++ b/ng-seed/src/app/appoinment/appoinments/appoinments-list/appoinments-list.component.ts @@ -41,16 +41,17 @@ const ELEMENT_DATA: UsersData[] = [ export class AppoinmentsListComponent implements OnInit { push: any; - displayedColumns: string[] = ['busId', 'time', 'slots', 'action']; + displayedColumns: string[] = ['Profile', 'ClientName','date','time','status', 'action']; // dataSource: any; public appoinmentsList:any = new MatTableDataSource(); // dataSource: any = new MatTableDataSource(ELEMENT_DATA); @ViewChild(MatTable,{static:true}) table: MatTable; - @ViewChild(MatPaginator) paginator: MatPaginator; + // @ViewChild(MatPaginator) paginator: MatPaginator; recordStatus: boolean; addFormData: any; - - + @ViewChild('paginator') paginator: MatPaginator; + @ViewChild('paginatorPageSize') paginatorPageSize: MatPaginator; + pageSizes = [3, 5, 7]; constructor(public dialog: MatDialog, public _app:AppointmentsService) { } ngOnInit(): void { @@ -62,28 +63,33 @@ export class AppoinmentsListComponent implements OnInit { this._app.getAppoinmentsListDetails().subscribe(res => { if (res.status == 200) { this.appoinmentsList = res.data; - // console.log(this.appoinmentsList) - // this.dataSource = res.data.length; - // console.log(this.dataSource) - // this.dataSource.data = this.appoinmentsList; - // console.log(this.dataSource.data) - // this.recordStatus=false; + console.log(this.appoinmentsList) + } else{ - // this.appoinmentsList=[]; - // this.dataSource = null; - // this.recordStatus=true; + } - } - ,error => { - // this.errorMessage.push(error); - // this.notifier.notify('error', 'Something Went Wrong Try Again.! \t\"' + (error.error_type == 2 ? error.error_status + ' ( ' + error.error_text + ' ) ' : ' ( ' + error.error_text + ' ) ') +'\" Error Occur.!'); - // alert(error.html_format); - }); + }) + // let param ={'userId':"5" + // } + // this._app.getServicesMapDetails(param).subscribe(res => { + // if (res.status == 200) { + // console.log(res) + // this.appoinmentsList = res.data; + // console.log(this.appoinmentsList) + + // } + // else{ + + // } + // }) + } ngAfterViewInit() { this.appoinmentsList.paginator = this.paginator; + this.appoinmentsList.paginator = this.paginatorPageSize; + } applyFilter(event: Event) { const filterValue = (event.target as HTMLInputElement).value; diff --git a/ng-seed/src/app/appoinment/appoinments/appointments-service/appointments.service.ts b/ng-seed/src/app/appoinment/appoinments/appointments-service/appointments.service.ts index a05dcb4..f947001 100644 --- a/ng-seed/src/app/appoinment/appoinments/appointments-service/appointments.service.ts +++ b/ng-seed/src/app/appoinment/appoinments/appointments-service/appointments.service.ts @@ -26,7 +26,14 @@ export class AppointmentsService { // catchError(this.handleError('role', [])) // ) } - + + getServicesMapDetails(addParams): Observable { + return this._http.post(this.apiUrl + 'getServicesMapDetails', addParams) + // .pipe( + // catchError(this.handleError('role', [])) + // ) + } + handleError(arg0: string, arg1: undefined[]): (err: any, caught: Observable) => import("rxjs").ObservableInput { throw new Error('Method not implemented.'); diff --git a/ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.spec.ts b/ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.spec.ts new file mode 100644 index 0000000..1f4a0ea --- /dev/null +++ b/ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ConsultantService } from './consultant.service'; + +describe('ConsultantService', () => { + let service: ConsultantService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ConsultantService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.ts b/ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.ts new file mode 100644 index 0000000..d14ce17 --- /dev/null +++ b/ng-seed/src/app/appoinment/consultant-setting/consultant-service/consultant.service.ts @@ -0,0 +1,33 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { environment } from 'environments/environment'; +import { Observable } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class ConsultantService { + + private apiUrl = environment.apiEndpoint; + constructor(private _http: HttpClient) { } + + getUsersListDetails(id): Observable { + console.log('IN') + return this._http.post(this.apiUrl + 'getPractitionerInfo', {id:id}) + // .pipe( + // catchError(this.handleError('role', [])) + // ) + } + getServicesListDetails(userId,busId): Observable { + console.log('IN') + return this._http.post(this.apiUrl + 'getServicesMapDetails', {busId:busId, userId:userId}) + // .pipe( + // catchError(this.handleError('role', [])) + // ) + } + + handleError(arg0: string, arg1: undefined[]): (err: any, caught: Observable) => import("rxjs").ObservableInput { + throw new Error('Method not implemented.'); + } +} diff --git a/ng-seed/src/app/appoinment/consultant-setting/consultant-setting.module.ts b/ng-seed/src/app/appoinment/consultant-setting/consultant-setting.module.ts index 35c105d..66e4dd7 100644 --- a/ng-seed/src/app/appoinment/consultant-setting/consultant-setting.module.ts +++ b/ng-seed/src/app/appoinment/consultant-setting/consultant-setting.module.ts @@ -6,12 +6,14 @@ import { ConsultantSettingComponent } from './consultant-setting/consultant-sett import { DemoMaterialModule } from 'app/shared/demo.module'; import { NgScrollbarModule } from 'ngx-scrollbar'; import { EditWorkingHoursComponent } from './edit-working-hours/edit-working-hours.component'; +import { ExtraWorkingHoursComponent } from './extra-working-hours/extra-working-hours.component'; @NgModule({ declarations: [ ConsultantSettingComponent, - EditWorkingHoursComponent + EditWorkingHoursComponent, + ExtraWorkingHoursComponent ], imports: [ CommonModule, diff --git a/ng-seed/src/app/appoinment/consultant-setting/consultant-setting/consultant-setting.component.html b/ng-seed/src/app/appoinment/consultant-setting/consultant-setting/consultant-setting.component.html index 9066ae0..b1472d9 100644 --- a/ng-seed/src/app/appoinment/consultant-setting/consultant-setting/consultant-setting.component.html +++ b/ng-seed/src/app/appoinment/consultant-setting/consultant-setting/consultant-setting.component.html @@ -12,12 +12,12 @@ - - Staff Information + + My Profile
- Set Up Staff Profile + Profile
@@ -25,75 +25,81 @@
- -
-
Name is required
-
+ {{usersList.userName}}
- -
-
Email is required
-
Email must be a valid email address
-
+ {{usersList.email}}
+ + {{usersList.role}} +
+
+ + {{usersList.password}} +
+ +
+ + {{practitionerdetails.dob}} +
+ + + +
+ + {{practitionerdetails.exp}} +
+ + + + + + + @@ -104,7 +110,7 @@ - + Working Hours
@@ -118,11 +124,12 @@
- Working Hours + + Working Hours
-
+
@@ -130,32 +137,112 @@
-
- 10:00 am +
+ 09:00am
- -
- 01:00 pm +
+ 06:00pm
-
+
Monday
-
- 10:00 am -
- - -
- 01:00 pm -
-
-
+
+ 09:00am +
+ - +
+ 06:00pm +
+
+
+
+ + Tuesday + +
+
+
+ 09:00am +
+ - +
+ 06:00pm +
+
+
+
+
+ + Wednesday + +
+
+
+ 09:00am +
+ - +
+ 06:00pm +
+
+
+
+
+ + Thursday + +
+
+
+ 09:00am +
+ - +
+ 06:00pm +
+
+
+
+
+ + Friday + +
+
+
+ 09:00am +
+ - +
+ 06:00pm +
+
+
+
+
+ + Saturday + +
+
+
+ 09:00am +
+ - +
+ 06:00pm +
+
+
+
Special Working Hours - +

Workings on weekends or compensating for time off? Add them here to let customers know when you're available.

Unavailability - +

Workings on weekends or compensating for time off? Add them here to let customers know when you're available.

@@ -187,43 +274,35 @@ - Assigned Services + Assigned Services
Define Your Services - - - - None - Option 1 - Option 2 - Option 3 - - -
-
- - - -

{{message.name}}

-

{{message.time}} | ₹ {{message.amount}}

-

+ Customize the price of a service.

-
-
-
- {{message.username}} -
-
- {{message.status}} -
+
+ + + + {{details.servicesName}} + {{details.duration}} Minutes + +
- Staff Booking URL + Staff Booking URL
@@ -239,7 +318,7 @@
transcribe - {{consultant.language || "English"}} + {{consultant.practitionerInfos[0].languages || ""}} location_on @@ -55,7 +56,7 @@ -
diff --git a/ng-seed/src/app/end-user/consultants/consultants-list.component.ts b/ng-seed/src/app/end-user/consultants/consultants-list.component.ts index 31f33e8..4d1e038 100644 --- a/ng-seed/src/app/end-user/consultants/consultants-list.component.ts +++ b/ng-seed/src/app/end-user/consultants/consultants-list.component.ts @@ -27,10 +27,21 @@ export class ConsultantsListComponent implements OnInit { }); }); - - let filter = arr_val.filter(arr=>{return arr.role == "PRACTITIONER" && arr.busId =="abc123"}) + let service = localStorage.getItem("servicedetails") + let serviceDetails = JSON.parse(service) + console.log(serviceDetails) + let filter = arr_val.filter(arr=>{return arr.role == "PRACTITIONER" && arr.busId ==serviceDetails.busId}) console.log(arr_val,filter) - this.consultants = filter; + + + let result = filter.filter((obj, index, self) => + index === self.findIndex((t) => ( + t.id === obj.id + + + )) + ); + this.consultants = result; // this.consultants = [{ // name: 'Dr. Suganya', // specialist: 'ENT', @@ -103,9 +114,14 @@ export class ConsultantsListComponent implements OnInit { } - goToSlotBooking(){ + goToSlotBooking(param){ let URL = this.router.url; - console.log(URL) + console.log(URL,param) + let service = localStorage.getItem("servicedetails") + let serviceDetails = JSON.parse(service) + serviceDetails.userId = ""+param.id+"" + + localStorage.setItem("servicedetails",JSON.stringify(serviceDetails)) // console.log(URL+"/"+data.randStr+"/practitioner") this.router.navigate([URL+"/slot"]) diff --git a/ng-seed/src/app/end-user/customer-info/customer-info.component.ts b/ng-seed/src/app/end-user/customer-info/customer-info.component.ts index 0eab10c..2feb9d0 100644 --- a/ng-seed/src/app/end-user/customer-info/customer-info.component.ts +++ b/ng-seed/src/app/end-user/customer-info/customer-info.component.ts @@ -53,9 +53,10 @@ export class CustomerInfoComponent implements OnInit { this._cus.addCusDetails(addFormData).subscribe(res => { if (res.status == 200) { console.log(res) + let URL = this.router.url; console.log(URL) - this.router.navigate([URL+"/pt"]) + this.router.navigate([URL+"/"+res['data'].id+"/pt"]) } }); diff --git a/ng-seed/src/app/end-user/end-user-routing.module.ts b/ng-seed/src/app/end-user/end-user-routing.module.ts index 3b17276..13eb8e3 100644 --- a/ng-seed/src/app/end-user/end-user-routing.module.ts +++ b/ng-seed/src/app/end-user/end-user-routing.module.ts @@ -40,27 +40,27 @@ const routes: Routes = [ component: ConsultantsListComponent }, { - path: 'busniness/:randstr', + path: 'business/:randstr', component: ServiceListComponent }, { - path: 'busniness/:randstr/:randstrs/practitioner', + path: 'business/:randstr/:randstrs/practitioner', component: ConsultantsListComponent }, { - path: 'busniness/:randstr/:randstrs/practitioner/slot', + path: 'business/:randstr/:randstrs/practitioner/slot', component: SlotBookingDetailsComponent }, { - path: 'busniness/:randstr/:randstrs/practitioner/slot/cus', + path: 'business/:randstr/:randstrs/practitioner/slot/cus', component: CustomerInfoComponent }, { - path: 'busniness/:randstr/:randstrs/practitioner/slot/cus/pt', + path: 'business/:randstr/:randstrs/practitioner/slot/cus/:cusId/pt', component: PaymentComponent }, { - path: 'busniness/:randstr/:randstrs/practitioner/slot/cus/pt/bts', + path: 'business/:randstr/:randstrs/practitioner/slot/cus/pt/bts', component: BookingSummaryComponent }, diff --git a/ng-seed/src/app/end-user/end-user.service.ts b/ng-seed/src/app/end-user/end-user.service.ts index 4785160..770cb59 100644 --- a/ng-seed/src/app/end-user/end-user.service.ts +++ b/ng-seed/src/app/end-user/end-user.service.ts @@ -50,7 +50,20 @@ private apiUrl = environment.apiEndpoint; // catchError(this.handleError('role', [])) // ) } - + CreateAppoinmentsCus(addParams): Observable { + return this._http.post(this.apiUrl + 'CreateAppoinmentsCus', addParams) + // .pipe( + // catchError(this.handleError('role', [])) + // ) + } + CreatecusServicesMapDetails(addParams): Observable { + return this._http.post(this.apiUrl + 'CreatecusServicesMapDetails', addParams) + // .pipe( + // catchError(this.handleError('role', [])) + // ) + } + + handleError(arg0: string, arg1: undefined[]): (err: any, caught: Observable) => import("rxjs").ObservableInput { throw new Error('Method not implemented.'); } diff --git a/ng-seed/src/app/end-user/payment/payment.component.ts b/ng-seed/src/app/end-user/payment/payment.component.ts index 4497246..f172c2a 100644 --- a/ng-seed/src/app/end-user/payment/payment.component.ts +++ b/ng-seed/src/app/end-user/payment/payment.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators } from '@angular/forms'; import { Router } from '@angular/router'; +import { EndUserService } from '../end-user.service'; @Component({ selector: 'app-payment', @@ -9,7 +10,7 @@ import { Router } from '@angular/router'; }) export class PaymentComponent implements OnInit { form: FormGroup; - constructor(private router:Router) { } + constructor(private router:Router,public enduser:EndUserService, ) { } ngOnInit(): void { this.form = new FormGroup({ @@ -26,10 +27,49 @@ export class PaymentComponent implements OnInit { submit(){ console.log(this.form.value) + let slot_array = JSON.parse(localStorage.getItem("slotData")) + let service = localStorage.getItem("servicedetails") + let serviceDetails = JSON.parse(service) + console.log(serviceDetails) + let URL = this.router.url; - console.log(URL) - this.router.navigate([URL+"/bts"]) + console.log(URL,slot_array) + let URL_AS_LIST = URL.split('/'); + console.log(URL_AS_LIST); + let paramsmap= { + "serviceId": ""+serviceDetails.serviceId+"", + "userId": serviceDetails.userId, + "busId": serviceDetails.busId +} + this.enduser.CreatecusServicesMapDetails(paramsmap).subscribe(res => { + if (res.status == 200) { + console.log(res) + let serviceMap = res['data'].id + let time = new Date().toLocaleTimeString() + let params= { + "busId": serviceDetails.busId, + "cusId": URL_AS_LIST[8], + "appoinmentDate": slot_array[0].date, + "appoinmentTime": time, + "serviceMap": serviceMap, + "appoinmentSlots": slot_array[0].slots, + } + console.log(params) + this.enduser.CreateAppoinmentsCus(params).subscribe(res => { + if (res.status == 200) { + console.log(res) + this.router.navigate([URL+"/bts"]) + } + }) + + + + } + }) + + + } } diff --git a/ng-seed/src/app/end-user/service-list-details/service-list.component.html b/ng-seed/src/app/end-user/service-list-details/service-list.component.html index 0c037c3..df5d186 100644 --- a/ng-seed/src/app/end-user/service-list-details/service-list.component.html +++ b/ng-seed/src/app/end-user/service-list-details/service-list.component.html @@ -41,10 +41,11 @@
+

- © 2021 Venba Information Technology Pvt Ltd. All Rights Reserved + © 2023 Venba Information Technology Pvt Ltd. All Rights Reserved

diff --git a/ng-seed/src/app/end-user/service-list-details/service-list.component.ts b/ng-seed/src/app/end-user/service-list-details/service-list.component.ts index ebfe868..9e45d1f 100644 --- a/ng-seed/src/app/end-user/service-list-details/service-list.component.ts +++ b/ng-seed/src/app/end-user/service-list-details/service-list.component.ts @@ -212,6 +212,7 @@ let updatevalue = { serviceId: row_obj.serviceId, goto(data){ let URL = this.router.url; console.log(URL,data) + localStorage.setItem("servicedetails",JSON.stringify(data)) console.log(URL+"/"+data.randStr+"/practitioner") this.router.navigate([URL+"/"+data.randStr+"/practitioner"]) diff --git a/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.html b/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.html index 00db1e7..e582b71 100644 --- a/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.html +++ b/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.html @@ -16,7 +16,7 @@
- +
diff --git a/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.ts b/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.ts index 1494404..12310c4 100644 --- a/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.ts +++ b/ng-seed/src/app/end-user/slot-booking/slot-booking-details.component.ts @@ -36,7 +36,13 @@ export class SlotBookingDetailsComponent implements OnInit { workspace: new FormControl('', [Validators.required]), }); -console.log(this.local_data, this.selects) + + + let service = localStorage.getItem("servicedetails") + let serviceDetails = JSON.parse(service) + console.log(serviceDetails) + + // this.form.controls['note'].setValue('Sample') this.form.patchValue(this.local_data) } @@ -54,13 +60,14 @@ console.log(this.local_data, this.selects) } var target = event.currentTarget; target.style.backgroundColor = "#0c8f00"; - console.log(param) - this.slot_array.push(param) + console.log(this.date,param) + this.slot_array.push({date:this.date,slots:param}) } submit(){ console.log( this.slot_array) + localStorage.setItem("slotData",JSON.stringify(this.slot_array)) let URL = this.router.url; console.log(URL) this.router.navigate([URL+"/cus"]) diff --git a/ng-seed/src/app/session/login/login.component.ts b/ng-seed/src/app/session/login/login.component.ts index 0575d29..85f3bb9 100644 --- a/ng-seed/src/app/session/login/login.component.ts +++ b/ng-seed/src/app/session/login/login.component.ts @@ -47,6 +47,7 @@ export class LoginComponent { localStorage.setItem('user_token',res.token); localStorage.setItem('user_role',res.role); localStorage.setItem('email',JSON.stringify(auth)) + localStorage.setItem('user_id',res.roleId) this.router.navigate(['/home']) } } diff --git a/ng-seed/src/assets/images/profile.jpg b/ng-seed/src/assets/images/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38f833a3fd29532eecfe351a3ed53f5196ad4d45 GIT binary patch literal 7525 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 literal 0 HcmV?d00001