Commit 57da5b5f by Nattana Chaiyamat

ประเมินผล

parent c8b731f0
# See http://help.github.com/ignore-files/ for more about ignoring files. # See http://help.github.com/ignore-files/ for more about ignoring files.
# Compiled output # Compiled output
/dist # /dist
*.zip *.zip
/tmp /tmp
/out-tsc /out-tsc
...@@ -42,3 +42,4 @@ testem.log ...@@ -42,3 +42,4 @@ testem.log
# System files # System files
.DS_Store .DS_Store
Thumbs.db Thumbs.db
dist/
...@@ -8,16 +8,13 @@ ...@@ -8,16 +8,13 @@
[attr.aria-controls]="'hs-tab-js-vertical-'+i"> [attr.aria-controls]="'hs-tab-js-vertical-'+i">
<div class="w-full flex items-center " style="justify-content :space-between;"> <div class="w-full flex items-center " style="justify-content :space-between;">
{{appraisalCompentency.comType}} {{appraisalCompentency.comType}}
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="formRemain(i)" [class.bg-success]="!formRemain(i)">
<path <ng-container *ngIf="formRemain(i)">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{formRemain(i)}}
fill="currentColor" [class.fill-mute]="!onFormCompleted(i)" [class.fill-success]="onFormCompleted(i)"> </ng-container>
</path> <i *ngIf="!formRemain(i)" class="ti ti-check"></i>
<path </span>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
</div> </div>
</button> </button>
</nav> </nav>
...@@ -62,23 +59,20 @@ ...@@ -62,23 +59,20 @@
<div class="pb-2rem px-2rem"> <div class="pb-2rem px-2rem">
<div *ngIf="appraisalCompentencyFilter().length"> <div *ngIf="appraisalCompentencyFilter().length">
<div class="hs-accordion-group w-full" data-hs-accordion-always-open> <div class="hs-accordion-group w-full" data-hs-accordion-always-open>
<ng-container *ngFor="let item2 of appraisalCompentencyFilter();let i = index"> <ng-container *ngFor="let item2 of appraisalCompentencyFilter();let i = index;let f= first">
<div <div
class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
[id]="'hs-primary-heading-'+i"> [id]="'hs-primary-heading-'+i">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
[attr.aria-controls]="'hs-primary-collapse-'+i" type="button"> [attr.aria-controls]="'hs-primary-collapse-'+i" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
fill="none" xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="inFormRemain(item2)" [class.bg-success]="!inFormRemain(item2)">
<path <ng-container *ngIf="inFormRemain(item2)">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{inFormRemain(item2)}}
fill="currentColor" [class.fill-mute]="!onInFormCompleted(item2)" </ng-container>
[class.fill-success]="onInFormCompleted(item2)"></path> <i *ngIf="!inFormRemain(item2)" class="ti ti-check"></i>
<path </span>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
<span> <span>
{{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.competencyTopic.competencyTopicId}} {{item2.groupAssessment1.competencyIndicatorsCourses1Mini.competencyIndicatorsCourses0.competencyTopic.competencyTopicId}}
: :
...@@ -98,7 +92,7 @@ ...@@ -98,7 +92,7 @@
</svg> </svg>
</button> </button>
<div [id]="'hs-primary-collapse-'+i" <div [id]="'hs-primary-collapse-'+i"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
[attr.aria-labelledby]="'hs-primary-heading-'+i"> [attr.aria-labelledby]="'hs-primary-heading-'+i">
<div class="box-body"> <div class="box-body">
<div class="space-y-4"> <div class="space-y-4">
...@@ -126,7 +120,6 @@ ...@@ -126,7 +120,6 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
...@@ -249,7 +242,7 @@ ...@@ -249,7 +242,7 @@
</table> </table>
</div> </div>
</div> </div>
<div class="py-1rem px-2rem"> <!-- <div class="py-1rem px-2rem">
<div class="py-2 grid grid-cols-7 gap-3"> <div class="py-2 grid grid-cols-7 gap-3">
<div class="col-span-1">ผู้รับการประเมิน</div> <div class="col-span-1">ผู้รับการประเมิน</div>
<div class="col-span-1"> <div class="col-span-1">
...@@ -404,7 +397,7 @@ ...@@ -404,7 +397,7 @@
อนุมัติ อนุมัติ
</ng-container> </ng-container>
</button> </button>
</div> </div> -->
</ng-container> </ng-container>
</div> </div>
</div> </div>
......
...@@ -19,12 +19,13 @@ export class PmsCompetencyComponent { ...@@ -19,12 +19,13 @@ export class PmsCompetencyComponent {
@Input() appraisalCompentencyList: Competency[] = [] @Input() appraisalCompentencyList: Competency[] = []
appraisalCompentencyIndex = 0 appraisalCompentencyIndex = 0
@Output() sendReturnPath: EventEmitter<any> = new EventEmitter<any>(); @Output() sendReturnPath: EventEmitter<any> = new EventEmitter<any>();
@Output() allFormCompleted: EventEmitter<any> = new EventEmitter<any>(); @Output() compentencyFormRemain: EventEmitter<any> = new EventEmitter<any>();
canEdit = false @Output() compentencyForm: EventEmitter<any> = new EventEmitter<any>();
canSave = false @Input() canEdit = false
@Input() currentStep = ""
@Input() dateIso = ""
hoveredCode: string | null = null; hoveredCode: string | null = null;
hoveredCode2: string | null = null; hoveredCode2: string | null = null;
currentDate = new Date()
setting: { loading: boolean, data: SettingAssessmentModel } = { loading: false, data: new MySettingAssessmentModel() } setting: { loading: boolean, data: SettingAssessmentModel } = { loading: false, data: new MySettingAssessmentModel() }
...@@ -85,48 +86,32 @@ export class PmsCompetencyComponent { ...@@ -85,48 +86,32 @@ export class PmsCompetencyComponent {
this.appraisalCompentencyIndex = index this.appraisalCompentencyIndex = index
this.currentTap = this.appraisalCompentencyList[this.appraisalCompentencyIndex].comType this.currentTap = this.appraisalCompentencyList[this.appraisalCompentencyIndex].comType
this.cdr.detectChanges() this.cdr.detectChanges()
if (this.appraisalCompentencyList[this.appraisalCompentencyIndex]?.masfromEvaluationAssessment1lList[0]) { switch (this.currentStep) {
this.canSave = (this.appraisalCompentencyList[this.appraisalCompentencyIndex].currentStep == this.appraisalCompentencyList[this.appraisalCompentencyIndex].checkStep) && this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromStatusType.code != 'Boss_finish' && this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromStatusType.code != 'Not_evaluating_yet' case ("0"): {
this.canEdit = (this.appraisalCompentencyList[this.appraisalCompentencyIndex].currentStep == this.appraisalCompentencyList[this.appraisalCompentencyIndex].checkStep && (+(this.appraisalCompentencyList[this.appraisalCompentencyIndex].checkStep) <= 1)) && this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromStatusType.code != 'Boss_finish' && this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromStatusType.code != 'Not_evaluating_yet' this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsassessyDate = this.dateIso
switch (this.appraisalCompentencyList[this.appraisalCompentencyIndex]?.currentStep) { break
case ("0"): { }
if (this.canSave) { case ("1"): {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsassessyDate = this.currentDate.toISOString().split('T')[0]; this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove1Date = this.dateIso
} break
break
}
case ("1"): {
if (this.canSave) {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove1Date = this.currentDate.toISOString().split('T')[0];
}
break
}
case ("2"): {
if (this.canSave) {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove2Date = this.currentDate.toISOString().split('T')[0];
}
break
}
case ("3"): {
if (this.canSave) {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove3Date = this.currentDate.toISOString().split('T')[0];
}
break
}
case ("4"): {
if (this.canSave) {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove4Date = this.currentDate.toISOString().split('T')[0];
}
break
}
case ("5"): {
if (this.canSave) {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove5Date = this.currentDate.toISOString().split('T')[0];
}
break
}
default: { return }
} }
case ("2"): {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove2Date = this.dateIso
break
}
case ("3"): {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove3Date = this.dateIso
break
}
case ("4"): {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove4Date = this.dateIso
break
}
case ("5"): {
this.appraisalCompentencyList[this.appraisalCompentencyIndex].masfromEvaluationAssessment1lList[0].apsapprove5Date = this.dateIso
break
}
default: { return }
} }
this.calnumberCheck() this.calnumberCheck()
this.cdr.detectChanges() this.cdr.detectChanges()
...@@ -423,23 +408,25 @@ export class PmsCompetencyComponent { ...@@ -423,23 +408,25 @@ export class PmsCompetencyComponent {
// }) // })
} }
onInFormCompleted(data: MasfromEvaluationAssessment2List) { inFormRemain(data: MasfromEvaluationAssessment2List) {
return data.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.every(x => x.competencyBehavioral.scoreTopicExpectation != 0) const remain = data.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.filter(x => x.competencyBehavioral.scoreTopicExpectation == 0).length
return remain
} }
onFormCompleted(index: number) { formRemain(index: number) {
const formCompleted = this.appraisalCompentencyList[index]?.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.every(data => const remain = this.appraisalCompentencyList[index]?.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map(data =>
data.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.every(x => x.competencyBehavioral.scoreTopicExpectation != 0) this.inFormRemain(data)
) ).filter(data => data != 0).length
this.onAllFormCompleted() this.allFormRemain()
return formCompleted return remain
} }
onAllFormCompleted() { allFormRemain() {
const formCompleted = this.appraisalCompentencyList.every(data => { const remain = this.appraisalCompentencyList.map((_, i) =>
data.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.every(data => this.appraisalCompentencyList[i]?.masfromEvaluationAssessment1lList[0].masfromEvaluationAssessment2List.map(data =>
data.groupAssessment1.competencyIndicatorsCourses1Mini.behavioralIndicatorsList.every(x => x.competencyBehavioral.scoreTopicExpectation != 0) this.inFormRemain(data)
) ).filter(data => data != 0).length
}) ).filter(data => data != 0).length
this.allFormCompleted.emit(formCompleted) this.compentencyForm.emit(this.appraisalCompentencyList)
this.compentencyFormRemain.emit(remain)
} }
scrollToTable(event: MouseEvent) { scrollToTable(event: MouseEvent) {
......
...@@ -80,12 +80,8 @@ ...@@ -80,12 +80,8 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- Start::main-content -->
<div class="main-content -mt-28"> <div class="main-content -mt-28">
<!-- Start::row-1 -->
<div class="grid grid-cols-12 gap-x-6"> <div class="grid grid-cols-12 gap-x-6">
<div class="col-span-12 xxl:col-span-3"> <div class="col-span-12 xxl:col-span-3">
<div class="box"> <div class="box">
...@@ -152,156 +148,95 @@ ...@@ -152,156 +148,95 @@
</div> </div>
</div> </div>
<div class="box-body space-y-4 text-center"> <div class="box-body space-y-4 text-center">
<div class="flex flex-row"> <ng-container
<div class="mx-auto relative"> *ngFor="let apsEmp of ['apsassessy','apsapprove1','apsapprove2','apsapprove3','apsapprove4','apsapprove5']; let i=index ; let f=first">
<div class="h-full w-6 flex items-center justify-center pb-4"> <div class="flex flex-row" *ngIf="returnField(item,apsEmp+'.thFullName')">
<div class="h-full w-[3px] bg-gray-100 pointer-events-none"></div> <div class="mx-auto relative">
</div> <div class="h-full flex items-center justify-center pb-4" style="width: 32px;">
<div class="absolute rounded-full text-center align-center" <div class="h-full w-[3px] bg-gray-100 pointer-events-none"></div>
style="justify-items:center;top:-5px"> </div>
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" <div class="absolute rounded-full text-center align-center"
fill="none" xmlns="http://www.w3.org/2000/svg"> style="justify-items:center;top:-5px">
<path <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" [class]="assessmentStatusClass(item.currentStep,i,returnField(item,apsEmp+'.status'))">
fill="currentColor" class="fill-success"></path> <i
<!-- fill-mute --> [class]="assessmentStatusIcon(item.currentStep,i,returnField(item,apsEmp+'.status'))"></i>
<!-- fill-warning --> </span>
<!-- fill-success -->
<!-- fill-danger -->
<path
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
</div>
<!-- <div
class="avatar avatar-xs absolute top-0 rounded-full bg-gray-200 shadow text-center ltr:-left-[4px] rtl:-right-[4px]">
<img src="./assets/img/users/21.jpg" class="rounded-full" alt="timeline-img" />
</div> -->
</div>
<div class="flex w-full pb-4">
<div class="ltr:ml-5 rtl:mr-5 rounded-sm ltr:mr-auto rtl:ml-auto my-auto w-full space-y-3">
<div class="sm:flex">
<h3 class="text-start my-auto text-gray-500 dark:text-white/70" style="line-height: 1.5">
<span class="text-dark dark:text-white">
ผู้รับการประเมิน
</span>
<br>
<span class="text-dark dark:text-white">
วีรพงศ์test_UAT สกุลทดสอบ1
</span>
<br>
<p class="text-xs text-gray-500 dark:text-white/70">
ประเมินแล้ว
</p>
</h3>
</div> </div>
</div> </div>
</div> <div class="flex w-full pb-4">
</div> <div class="ltr:ml-5 rtl:mr-5 rounded-sm ltr:mr-auto rtl:ml-auto my-auto w-full space-y-3">
<div class="flex flex-row"> <div class="sm:flex">
<div class="mx-auto relative"> <h3 class="text-start my-auto text-gray-500 dark:text-white/70" style="line-height: 1.5">
<div class="h-full w-6 flex items-center justify-center pb-4"> <span class="text-dark dark:text-white">
<div class="h-full w-[3px] bg-gray-100 pointer-events-none"></div> <ng-container *ngIf="f">
</div> ผู้รับการประเมิน
<div class="absolute rounded-full text-center align-center" </ng-container>
style="justify-items:center;top:-5px"> <ng-container *ngIf="!f&&returnField(item,'apsassessy'+(i+1)+'.thFullName')">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" ผู้ประเมิน{{i}}
fill="none" xmlns="http://www.w3.org/2000/svg"> </ng-container>
<path <ng-container *ngIf="!f&&!returnField(item,'apsassessy'+(i+1)+'.thFullName')">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" ผู้อนุมัติ
fill="currentColor" class="fill-mute"></path> </ng-container>
<!-- fill-mute --> </span>
<!-- fill-warning --> <br>
<!-- fill-success --> <span class="text-dark dark:text-white">
<!-- fill-danger --> {{returnField(item,apsEmp+'.thFullName')}}
<path </span>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z" <br>
fill="currentColor"></path> <p class="text-xs text-gray-500 dark:text-white/70">
</svg> {{assessmentStatusText(item.currentStep,i,returnField(item,apsEmp+'.status'))}}
</div> </p>
</div> </h3>
<div class="flex w-full pb-4"> </div>
<div class="ltr:ml-5 rtl:mr-5 rounded-sm ltr:mr-auto rtl:ml-auto my-auto w-full space-y-3">
<div class="sm:flex">
<h3 class="text-start my-auto text-gray-500 dark:text-white/70" style="line-height: 1.5">
<span class="text-dark dark:text-white">
ผู้ประเมิน1
</span>
<br>
<span class="text-dark dark:text-white">
วีรพงศ์test_UAT สกุลทดสอบ1
</span>
<br>
<p class="text-xs text-gray-500 dark:text-white/70">
ยังไม่ถึงขั้นตอนดำเนินการ
</p>
</h3>
</div> </div>
</div> </div>
</div> </div>
</div> </ng-container>
</div> </div>
</div> </div>
<div class="box"> <div class="box" *ngIf="commentAllFilter().length">
<div class="box-header"> <div class="box-header">
<div class="flex justify-between"> <div class="flex justify-between">
<h5 class="box-title">Timeline</h5> <h5 class="box-title">Timeline</h5>
</div> </div>
</div> </div>
<div class="box-body space-y-4 text-center"> <div class="box-body space-y-4 text-center">
<div class="flex flex-row" *ngFor="let item of [ <div class="flex flex-row" *ngFor="let item of commentAllFilter(); let i=index">
' ไม่รู้จะพูดยังไงดี นอกจากคำว่าประทับใจมาก ๆ ทุกอย่างลงตัว ทั้งอารมณ์ ความรู้สึก และบรรยากาศขอบคุณที่สร้างสรรค์อะไรดี ๆแบบนี้ออกมาให้ได้เห็น',
'ตอนแรกก็ไม่ได้คาดหวังอะไรขนาดนั้น แต่พอได้สัมผัสจริง ๆ มันเกินคาดมาก มีความสุขแบบที่ไม่ได้รู้สึกมานานแล้ว อยากบอกว่าทำต่อไปนะ เราเชื่อว่ามีอีกหลายคนที่รู้สึกเหมือนกัน',
'นั่งอ่านวนอยู่หลายรอบเลยอะ ทุกคำ ทุกภาพ มันสะกิดใจแบบอธิบายไม่ถูก อยากให้คนที่ยังลังเลได้ลองเปิดใจดูจริง ๆ',
'เอาจริง ๆ ไม่ค่อยเจออะไรที่ทำให้ยิ้มได้แบบนี้บ่อย ๆ นะ มันเป็นความรู้สึกเล็ก ๆ ที่โคตรยิ่งใหญ่สำหรับเรา ขอบคุณที่ทำให้โลกใบนี้ดูน่ารักขึ้นอีกนิดนึง'
]; let i=index">
<div class="mx-auto relative"> <div class="mx-auto relative">
<div class="h-full w-6 flex items-center justify-center pb-4"> <div class="h-full flex items-center justify-center pb-4" style="width: 32px;">
<div class="h-full w-[3px] bg-gray-100 pointer-events-none"></div> <div class="h-full w-[3px] bg-gray-100 pointer-events-none"></div>
</div> </div>
<div class="absolute rounded-full text-center align-center" <div class="absolute rounded-full text-center align-center"
style="justify-items:center;top:-5px"> style="justify-items:center;top:-5px">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
fill="none" xmlns="http://www.w3.org/2000/svg"> [class]="statusCompetencyClass(item.statusType)">
<path <i [class]="statusCompetencyIcon(item.statusType)"></i>
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" </span>
fill="currentColor" class="fill-success"></path>
<!-- fill-mute -->
<!-- fill-warning -->
<!-- fill-success -->
<!-- fill-danger -->
<path
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
</div> </div>
<!-- <div
class="avatar avatar-xs absolute top-0 rounded-full bg-gray-200 shadow text-center ltr:-left-[4px] rtl:-right-[4px]">
<img src="./assets/img/users/21.jpg" class="rounded-full" alt="timeline-img" />
</div> -->
</div> </div>
<div class="flex w-full pb-4"> <div class="flex w-full pb-4">
<div class="ltr:ml-5 rtl:mr-5 rounded-sm ltr:mr-auto rtl:ml-auto my-auto w-full space-y-3"> <div class="ltr:ml-5 rtl:mr-5 rounded-sm ltr:mr-auto rtl:ml-auto my-auto w-full space-y-3">
<div class="sm:flex"> <div class="w-full">
<h3 class="text-start my-auto text-gray-500 dark:text-white/70" style="line-height: 1.5"> <h3 class="text-start my-auto text-gray-500 dark:text-white/70" style="line-height: 1.5">
<span class="text-dark dark:text-white" style="white-space: nowrap;"> <span class="text-dark dark:text-white" style="white-space: nowrap;">
วีรพงศ์test_UAT สกุลทดสอบ1 {{item.thFullName}}
</span> </span>
<br> <br>
<div style="display: flex;justify-content :space-between;"> <div style="display: flex;justify-content :space-between;">
<p class="text-xs text-gray-500 dark:text-white/70"> <p class="text-xs text-gray-500 dark:text-white/70">
ประเมินแล้ว {{statusCompetencyText(item.statusType)}}
</p> </p>
<p class="my-auto ltr:ml-auto rtl:mr-auto text-gray-500 dark:text-white/70 text-xs"> <p class="my-auto ltr:ml-auto rtl:mr-auto text-gray-500 dark:text-white/70 text-xs">
พ. 05:06 pm {{convertDate(item.commentDate)}}
</p> </p>
</div> </div>
</h3> </h3>
</div> </div>
<div <div *ngIf="item.comment"
class="border border-gray-200 bg-gray-50 dark:bg-black/20 dark:border-white/10 p-4 rounded-sm"> class="border border-gray-200 bg-gray-50 dark:bg-black/20 dark:border-white/10 p-4 rounded-sm">
<p class="text-start text-xs text-gray-500 dark:text-white/70" style="line-height: 1.5"> <p class="text-start text-xs text-gray-500 dark:text-white/70" style="line-height: 1.5">
{{item}} {{item.comment}}
</p> </p>
</div> </div>
</div> </div>
...@@ -325,56 +260,30 @@ ...@@ -325,56 +260,30 @@
class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300" class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300"
id="profile-item-2" data-hs-tab="#profile-2" aria-controls="profile-2" role="tab"> id="profile-item-2" data-hs-tab="#profile-2" aria-controls="profile-2" role="tab">
แบบประเมินสมรรถนะ แบบประเมินสมรรถนะ
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
fill="none" xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="compentencyFormRemain" [class.bg-success]="!compentencyFormRemain">
<path <ng-container *ngIf="compentencyFormRemain">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{compentencyFormRemain}}
fill="currentColor" [class.fill-mute]="!compentencyFormCompleted" </ng-container>
[class.fill-success]="compentencyFormCompleted"></path> <i *ngIf="!compentencyFormRemain" class="ti ti-check"></i>
<!-- fill-mute --> </span>
<!-- fill-warning -->
<!-- fill-success -->
<!-- fill-danger -->
<path
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
</button> </button>
<button type="button" [class.active]="currentTap=='pms'" <button type="button" [class.active]="currentTap=='pms'"
class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300" class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300"
id="profile-item-3" data-hs-tab="#profile-3" aria-controls="profile-3" role="tab"> id="profile-item-3" data-hs-tab="#profile-3" aria-controls="profile-3" role="tab">
แบบประเมินประสิทธิภาพ แบบประเมินประสิทธิภาพ
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
fill="none" xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="kpiFormRemain" [class.bg-success]="!kpiFormRemain">
<path <ng-container *ngIf="kpiFormRemain">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{kpiFormRemain}}
fill="currentColor" class="fill-mute"></path> </ng-container>
<!-- fill-mute --> <i *ngIf="!kpiFormRemain" class="ti ti-check"></i>
<!-- fill-warning --> </span>
<!-- fill-success -->
<!-- fill-danger -->
<path
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
</button> </button>
<button *ngIf="evaluationForm=='sup'" type="button" [class.active]="currentTap=='idp'" <button *ngIf="evaluationForm=='sup'" type="button" [class.active]="currentTap=='idp'"
class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300" class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300"
id="profile-item-4" data-hs-tab="#profile-4" aria-controls="profile-4" role="tab"> id="profile-item-4" data-hs-tab="#profile-4" aria-controls="profile-4" role="tab">
แผนพัฒนาบุคคลากร แผนพัฒนาบุคคลากร
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16"
fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z"
fill="currentColor" class="fill-mute"></path>
<!-- fill-mute -->
<!-- fill-warning -->
<!-- fill-success -->
<!-- fill-danger -->
<path
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
</button> </button>
<button type="button" [class.active]="currentTap=='2'" <button type="button" [class.active]="currentTap=='2'"
class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300" class="hs-tab-active:bg-primary hs-tab-active:border-primary hs-tab-active:text-white dark:hs-tab-active:bg-primary dark:hs-tab-active:border-primary dark:hs-tab-active:text-white py-2 px-3 inline-flex items-center w-full justify-center gap-2 text-sm font-medium text-center border text-gray-500 rounded-sm hover:text-gray-700 dark:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-gray-300"
...@@ -392,22 +301,26 @@ ...@@ -392,22 +301,26 @@
<ng-container *ngIf="compentency.data&&evaluaterId&&evaluateeId"> <ng-container *ngIf="compentency.data&&evaluaterId&&evaluateeId">
<app-pms-competency [currentTap]="currentTap" <app-pms-competency [currentTap]="currentTap"
[appraisalCompentencyList]="compentency.data.competency" [evaluaterId]="evaluaterId" [appraisalCompentencyList]="compentency.data.competency" [evaluaterId]="evaluaterId"
[evaluateeId]="evaluateeId" [evaluateeId]="evaluateeId" [canEdit]="canEdit" [currentStep]="compentency.data.currentStep"
(allFormCompleted)="compentencyFormCompleted=$event"></app-pms-competency> [dateIso]="dateIso" (compentencyFormRemain)="compentencyFormRemain=$event"
(compentencyForm)="compentency.data.competency=$event"></app-pms-competency>
</ng-container> </ng-container>
</div> </div>
<div id="profile-3" [class.hidden]="currentTap!='pms'" class="text-center" role="tabpanel" <div id="profile-3" [class.hidden]="currentTap!='pms'" class="text-center" role="tabpanel"
aria-labelledby="profile-item-3"> aria-labelledby="profile-item-3">
<ng-container *ngIf="compentency.data&&evaluateeId&&evaluaterId"> <ng-container *ngIf="compentency.data&&evaluateeId&&evaluaterId">
<app-pms-kpi [appraisalPms]="compentency.data.pms" [evaluaterId]="evaluaterId" <app-pms-kpi [appraisalPms]="compentency.data.pms" [evaluaterId]="evaluaterId"
[evaluateeId]="evaluateeId"></app-pms-kpi> [evaluateeId]="evaluateeId" [canEdit]="canEdit" [currentStep]="compentency.data.currentStep"
[dateIso]="dateIso" (kpiFormRemain)="kpiFormRemain=$event"
(kpiForm)="compentency.data.pms=$event"></app-pms-kpi>
</ng-container> </ng-container>
</div> </div>
<div id="profile-4" [class.hidden]="currentTap!='idp'" class="text-center" role="tabpanel" <div id="profile-4" [class.hidden]="currentTap!='idp'" class="text-center" role="tabpanel"
aria-labelledby="profile-item-4"> aria-labelledby="profile-item-4">
<ng-container *ngIf="compentency.data&&evaluateeId&&evaluaterId"> <ng-container *ngIf="compentency.data&&evaluateeId&&evaluaterId">
<app-pms-idp [appraisalIdp]="compentency.data.idp" [evaluaterId]="evaluaterId" <app-pms-idp [appraisalIdp]="compentency.data.idp" [evaluaterId]="evaluaterId"
[evaluateeId]="evaluateeId"></app-pms-idp> [evaluateeId]="evaluateeId" [canEdit]="canEdit" [currentStep]="compentency.data.currentStep"
[dateIso]="dateIso" (idpForm)="compentency.data.idp=$event"></app-pms-idp>
</ng-container> </ng-container>
</div> </div>
<div id="profile-5" [class.hidden]="currentTap!='2'" class="text-center" role="tabpanel" <div id="profile-5" [class.hidden]="currentTap!='2'" class="text-center" role="tabpanel"
...@@ -415,31 +328,38 @@ ...@@ -415,31 +328,38 @@
<app-pms-summary></app-pms-summary> <app-pms-summary></app-pms-summary>
</div> </div>
</div> </div>
<div class="box-footer text-end space-x-3 rtl:space-x-reverse"> <div *ngIf="compentency.data&&canSave" class="box-footer text-end space-x-3 rtl:space-x-reverse">
<div class="p-4 space-y-3 border-t border-gray-200 dark:border-white/10"> <div class="p-4 space-y-3 border-t border-gray-200 dark:border-white/10">
<!-- <h5 class="text-base font-semibold"> Add New Question</h5> --> <textarea type="text" class="ti-form-input" rows="4" placeholder="ใส่ Comment ที่นี่"
<!-- <img src="./assets/img/png-images/8.png" alt=""> --> [(ngModel)]="comment"></textarea>
<textarea class="ti-form-input" rows="4" placeholder="Drop Your Question Here...."></textarea>
</div> </div>
<a href="javascript:void(0);" class="ti-btn m-0 ti-btn-soft-primary"><i <button (click)="save('approve')" class="ti-btn m-0 ti-btn-soft-secondary"
class="ri ri-refresh-line"></i> [disabled]="compentencyFormRemain||kpiFormRemain"
ยินยัน</a> [class.ti-btn-disabled]="compentencyFormRemain||kpiFormRemain">
<a href="javascript:void(0);" class="ti-btn m-0 ti-btn-soft-success"><i <i class="ri-save-3-fill"></i>
class="ri ri-refresh-line"></i> <ng-container *ngIf="compentency.data.currentStep == '0'">
บันทึกร่าง</a> ยืนยันข้อมูล
<a href="javascript:void(0);" class="ti-btn m-0 ti-btn-soft-secondary"><i </ng-container>
class="ri ri-close-circle-line"></i> <ng-container *ngIf="compentency.data.currentStep != '0'">
ย้อนกลับ</a> อนุมัติ
</ng-container>
</button>
<button (click)="save('draft')" class="ti-btn m-0 ti-btn-soft-success"
*ngIf="compentency.data.currentStep == '0'||compentency.data.currentStep == '1'">
<i class="ri-draft-fill"></i>
บันทึกร่าง
</button>
<button (click)="save('noApprove')" class="ti-btn m-0 ti-btn-soft-danger"
*ngIf="compentency.data.currentStep != '0' && compentency.data.currentStep != '1'">
<i class="ri-reply-fill"></i>
ไม่อนุมัติ
</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- End::row-1 -->
</div> </div>
<!-- Start::main-content -->
</div> </div>
</div> </div>
</div> </div>
</ng-template> </ng-template>
\ No newline at end of file
import { ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core'; import { ChangeDetectorRef, Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { TypeList } from 'src/app/shared/model/appraisal-subordinate.model'; import { th } from 'date-fns/locale';
import { CompetencyModel } from 'src/app/shared/model/competency.model'; import { CompetencyModel } from 'src/app/shared/model/competency.model';
import { EmployeeModel, MyEmployeeModel } from 'src/app/shared/model/employee.model'; import { EmployeeModel, MyEmployeeModel } from 'src/app/shared/model/employee.model';
import { AppraisalService } from 'src/app/shared/services/appraisal.service'; import { AppraisalService } from 'src/app/shared/services/appraisal.service';
import { EmployeeService } from 'src/app/shared/services/employee.service'; import { EmployeeService } from 'src/app/shared/services/employee.service';
import Swal from 'sweetalert2';
@Component({ @Component({
selector: 'app-pms-form-employee', selector: 'app-pms-form-employee',
...@@ -40,8 +41,158 @@ export class PmsFormEmployeeComponent { ...@@ -40,8 +41,158 @@ export class PmsFormEmployeeComponent {
compentency: { loading: boolean, data?: CompetencyModel, dataList: CompetencyModel[] } = { loading: false, data: undefined, dataList: [] } compentency: { loading: boolean, data?: CompetencyModel, dataList: CompetencyModel[] } = { loading: false, data: undefined, dataList: [] }
compentencyFormCompleted = false canSave = false
canEdit = false
canDraft = false
dateIso = ""
compentencyFormRemain: number = 0
kpiFormRemain: number = 0
currentDate = new Date() currentDate = new Date()
comment = ""
statusCompetencyText = (status: string) => {
if (status === "no access") {
return "ยังไม่ถึงขั้นตอนดำเนินการ"
} else if (status === "pending") {
return "รอดำเนินการ"
} else if (status === "evaluating") {
return "อยู่ระหว่างดำเนินการ"
} else if (status === "completed") {
return "ดำเนินการเสร็จสิ้น"
} else if (status === "rejected") {
return "ส่งกลับ"
} else {
return ""
}
}
statusCompetencyClass = (status: string) => {
if (status === "no access") {
return "bg-mute"
} else if (status === "pending") {
return "bg-secondary"
} else if (status === "evaluating") {
return "bg-warning"
} else if (status === "completed") {
return "bg-success"
} else if (status === "rejected") {
return "bg-danger"
} else {
return ""
}
}
statusCompetencyIcon = (status: string) => {
if (status === "no access") {
return "ti ti-dots"
} else if (status === "pending") {
return "ti ti-clock"
} else if (status === "evaluating") {
return "ri-draft-fill"
} else if (status === "completed") {
return "ti ti-check"
} else if (status === "rejected") {
return "ri-reply-fill"
} else {
return ""
}
}
assessmentStatusText = (currentStep: string, step: number, status: string) => {
if (+currentStep < step) {
if (status != '3') {
return this.statusCompetencyText("no access")
} else {
return this.statusCompetencyText("rejected")
}
} else if (+currentStep >= step) {
if (status == '0') {
return this.statusCompetencyText("pending")
} else if (status == '1') {
return this.statusCompetencyText("evaluating")
} else if (status == '2') {
return this.statusCompetencyText("completed")
} else {
return ""
}
} else {
return ""
}
}
assessmentStatusClass = (currentStep: string, step: number, status: string) => {
if (+currentStep < step) {
if (status != '3') {
return this.statusCompetencyClass("no access")
} else {
return this.statusCompetencyClass("rejected")
}
} else if (+currentStep >= step) {
if (status == '0') {
return this.statusCompetencyClass("pending")
} else if (status == '1') {
return this.statusCompetencyClass("evaluating")
} else if (status == '2') {
return this.statusCompetencyClass("completed")
} else {
return ""
}
} else {
return ""
}
}
assessmentStatusIcon = (currentStep: string, step: number, status: string) => {
if (+currentStep < step) {
if (status != '3') {
return this.statusCompetencyIcon("no access")
} else {
return this.statusCompetencyIcon("rejected")
}
} else if (+currentStep >= step) {
if (status == '0') {
return this.statusCompetencyIcon("pending")
} else if (status == '1') {
return this.statusCompetencyIcon("evaluating")
} else if (status == '2') {
return this.statusCompetencyIcon("completed")
} else {
return ""
}
} else {
return ""
}
}
convertDate = (dateInput?: string | Date): string => {
if (!dateInput) return '';
let date: Date;
if (typeof dateInput === 'string') {
// ถ้าเป็น ISO string ที่มี T เช่น "2025-04-30T00:00:00Z"
if (dateInput.includes('T')) {
date = new Date(dateInput);
} else {
// ถ้าเป็น 'YYYY-MM-DD' (ไม่มี T)
const [year, month, day] = dateInput.split('-').map(Number);
date = new Date(year, month - 1, day);
}
} else {
date = dateInput;
}
// ตรวจสอบว่า date ถูกต้อง (valid date)
if (isNaN(date.getTime())) return '';
return date.toLocaleDateString('th-TH', {
weekday: 'short',
day: 'numeric',
month: 'short',
year: 'numeric'
});
};
hasPushedState = false;
handleBack = (event: PopStateEvent) => {
this.returnPath()
this.router.navigate(['/supervisor-evaluation']);
};
constructor( constructor(
private router: Router, private router: Router,
private employeeService: EmployeeService, private employeeService: EmployeeService,
...@@ -49,10 +200,23 @@ export class PmsFormEmployeeComponent { ...@@ -49,10 +200,23 @@ export class PmsFormEmployeeComponent {
private cdr: ChangeDetectorRef private cdr: ChangeDetectorRef
) { } ) { }
ngOnDestroy() {
window.removeEventListener('popstate', this.handleBack);
}
ngOnInit() { ngOnInit() {
this.dateIso = this.currentDate.toISOString();
this.getEvaluatee() this.getEvaluatee()
this.getCompentencyAll() this.getCompentencyAll()
// ดัน state ปลอมเข้าไปใน stack
if (this.evaluationForm == 'sup') {
if (!this.hasPushedState) {
history.pushState(null, '', location.href);
this.hasPushedState = true;
}
window.addEventListener('popstate', this.handleBack);
}
} }
getCompentencyAll() { getCompentencyAll() {
...@@ -75,6 +239,9 @@ export class PmsFormEmployeeComponent { ...@@ -75,6 +239,9 @@ export class PmsFormEmployeeComponent {
selectDataList(data: CompetencyModel) { selectDataList(data: CompetencyModel) {
this.compentency.data = data this.compentency.data = data
this.canSave = this.compentency.data.statusType == "pending" || this.compentency.data.statusType == "evaluating"
this.canDraft = +this.compentency.data.currentStep <= 1 && (this.compentency.data.statusType == "pending" || this.compentency.data.statusType == "evaluating")
this.canEdit = +this.compentency.data.currentStep <= 1 && (this.compentency.data.statusType == "pending" || this.compentency.data.statusType == "evaluating")
} }
getEvaluatee() { getEvaluatee() {
...@@ -100,9 +267,8 @@ export class PmsFormEmployeeComponent { ...@@ -100,9 +267,8 @@ export class PmsFormEmployeeComponent {
onSelectFile1(event: any) { onSelectFile1(event: any) {
if (event.target && event.target.files && event.target.files[0]) { if (event.target && event.target.files && event.target.files[0]) {
const reader = new FileReader(); const reader = new FileReader();
reader.readAsDataURL(event.target.files[0]); // read file as data URL reader.readAsDataURL(event.target.files[0]);
reader.onload = (event: any) => { reader.onload = (event: any) => {
// called once readAsDataURL is completed
this.url1 = event.target.result; this.url1 = event.target.result;
}; };
} }
...@@ -111,9 +277,8 @@ export class PmsFormEmployeeComponent { ...@@ -111,9 +277,8 @@ export class PmsFormEmployeeComponent {
onSelectFile2(event: any) { onSelectFile2(event: any) {
if (event.target && event.target.files && event.target.files[0]) { if (event.target && event.target.files && event.target.files[0]) {
const reader = new FileReader(); const reader = new FileReader();
reader.readAsDataURL(event.target.files[0]); // read file as data URL reader.readAsDataURL(event.target.files[0]);
reader.onload = (event: any) => { reader.onload = (event: any) => {
// called once readAsDataURL is completed
this.url2 = event.target.result; this.url2 = event.target.result;
}; };
} }
...@@ -129,4 +294,162 @@ export class PmsFormEmployeeComponent { ...@@ -129,4 +294,162 @@ export class PmsFormEmployeeComponent {
returnPath() { returnPath() {
this.sendReturnPath.emit() this.sendReturnPath.emit()
} }
commentAllFilter() {
return this.compentency.data?.commentAll.filter(x => x.statusType == 'reject' ? x.createdBy == this.evaluaterId : x) || []
}
returnField(data: any, field: string): any {
return field.split('.').reduce((obj, key) => obj?.[key], data);
}
save(status: 'approve' | 'noApprove' | 'draft') {
if (this.compentency.data) {
let title = ''
let text = ''
let confirmButtonText = ''
let approveStatus = '0'
if (status == 'draft') {
approveStatus = '1'
title = 'บันทึกแบบร่าง'
text = 'คุณต้องการบันทึกแบบร่างของการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการบันทึก'
} else if (status == 'approve') {
approveStatus = '2'
if (this.compentency.data.currentStep == '0') {
title = 'ยืนยันข้อมูล'
text = 'คุณต้องการยืนยันข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการบันทึก'
} else {
title == 'อนุมัติ'
text = 'คุณต้องการอนุมัติข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการอนุมัติ'
}
} else if (status == 'noApprove') {
approveStatus = '3'
title == 'ไม่อนุมัติ'
text = 'คุณต้องการไม่อนุมัติข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการไม่อนุมัติ'
}
Swal.fire({
iconHtml: `
<div class="flex items-center justify-center rounded-full !h-80px !w-80px" style="background-color: #E8F8EE;">
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="39" height="39" fill="#D2D2D2"/>
<g id="Component">
<g id="alert cart">
<g id="mdi:file-export">
<circle cx="22.5" cy="19.5" r="33.5" fill="#E8F8EE"/>
<path d="M9.75 3.25C8.88805 3.25 8.0614 3.59241 7.4519 4.2019C6.84241 4.8114 6.5 5.63805 6.5 6.5V32.5C6.5 33.362 6.84241 34.1886 7.4519 34.7981C8.0614 35.4076 8.88805 35.75 9.75 35.75H29.25C30.112 35.75 30.9386 35.4076 31.5481 34.7981C32.1576 34.1886 32.5 33.362 32.5 32.5V13L22.75 3.25M21.125 5.6875L30.0625 14.625H21.125M14.5113 19.8575H26V31.3463L22.555 27.9013L17.9563 32.5L13.3575 27.9013L17.9563 23.3188"
fill="#1DBE5A"/>
</g>
</g>
</g>
</svg>
</div>
`,
title: title,
text: text,
showCancelButton: true,
confirmButtonText: confirmButtonText,
cancelButtonText: 'ย้อนกลับ',
customClass: {
title: '!swal2-title-mt-20px',
actions: '!swal2-actions-mt-20px',
icon: '!swal2-icon-no-border',
confirmButton: '!swal2-button-bg-green',
cancelButton: '!swal2-button-bg-gray',
},
}).then((result) => {
if (result.isConfirmed) {
this.saveApi(approveStatus)
} else if (result.dismiss === Swal.DismissReason.cancel) {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
})
}
})
}
}
saveApi(approveStatus: string) {
if (this.compentency.data) {
type StepKey = 'apsassessy' | 'apsapprove1' | 'apsapprove2' | 'apsapprove3' | 'apsapprove4' | 'apsapprove5';
const steps: StepKey[] = ['apsassessy', 'apsapprove1', 'apsapprove2', 'apsapprove3', 'apsapprove4', 'apsapprove5'];
const stepIndex = parseInt(this.compentency.data.currentStep, 10);
const updatedData = { ...this.compentency.data };
if (approveStatus === '3' && stepIndex >= 2) {
const prevKey: StepKey = steps[stepIndex - 1];
updatedData[prevKey] = {
...updatedData[prevKey],
status: '0',
};
}
const currentKey: StepKey = steps[stepIndex];
updatedData[currentKey] = {
...updatedData[currentKey],
status: approveStatus,
};
updatedData.commentAll = this.compentency.data.commentAll
let statusType = ""
if (approveStatus === "1") {
statusType = "evaluating"
} else if (approveStatus === "2") {
statusType = "completed"
} else if (approveStatus === "3") {
statusType = "rejected"
}
updatedData.commentAll.push({
commentDate: this.dateIso,
currentStep: this.compentency.data.currentStep,
statusType: statusType,
comment: this.comment,
createdBy: updatedData[currentKey].employeeId,
thFullName: updatedData[currentKey].thFullName,
engFullName: updatedData[currentKey].enFullName,
})
const body = updatedData;
this.appraisalService.postCompentencyAll(body).subscribe({
next: response => {
if (response.success) {
this.getCompentencyAll()
Swal.fire({
title: 'บันทึกสำเร็จ!',
text: 'การประเมินของคุณถูกบันทึกแล้ว',
icon: 'success',
customClass: {
confirmButton: '!swal2-button-bg-green',
}
});
} else {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
});
}
}, error: error => {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
});
}
})
}
}
} }
...@@ -88,6 +88,42 @@ ...@@ -88,6 +88,42 @@
ส่วนที่ 2: แนวทางการพัฒนา ส่วนที่ 2: แนวทางการพัฒนา
</div> </div>
</div> </div>
<div class="py-1rem px-2rem">
<div class="py-2 grid grid-cols-6 gap-3">
<div class="col-span-6">หมายเหตุ : กรณี HR จัดอบรมให้ต้องเป็นไปตามเกณฑ์ที่ส่วนกลางกำหนดขึ้น</div>
<div class="col-span-6 grid grid-cols-6 gap-2">
<div class="grid col-span-1 grid-cols-6 gap-2">
<div class="col-span-1">
<input type="checkbox" class="ti-form-checkbox" id="idpStatus-0" (click)="resetFormIdp()"
style="cursor: pointer;"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='0'||!canEdit ||appraisalIdp.checkStep!='1'"
name="idpStatus" (change)="appraisalIdp.masfromEvaluationIdp.idpStatus='0'"
[checked]="appraisalIdp.masfromEvaluationIdp.idpStatus=='0'">
</div>
<div class="col-span-5">
<label for="idpStatus-0" class="text-sm text-gray-500"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='0'||!canEdit ||appraisalIdp.checkStep!='1'">
IDP มาตรฐาน
</label>
</div>
</div>
<div class="grid col-span-1 grid-cols-6 gap-2">
<div class="col-span-1">
<input type="checkbox" class="ti-form-checkbox" id="idpStatus-1" style="cursor: pointer;"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='1'||!canEdit ||appraisalIdp.checkStep!='1'"
name="idpStatus" (change)="appraisalIdp.masfromEvaluationIdp.idpStatus='1'"
[checked]="appraisalIdp.masfromEvaluationIdp.idpStatus=='1'">
</div>
<div class="col-span-5">
<label for="idpStatus-1" class="text-sm text-gray-500"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='1'||!canEdit ||appraisalIdp.checkStep!='1'">
IDP ปรับแก้ไข
</label>
</div>
</div>
</div>
</div>
</div>
<div class="pb-2rem px-2rem"> <div class="pb-2rem px-2rem">
<div class="overflow-auto rounded-top-0.65rem"> <div class="overflow-auto rounded-top-0.65rem">
<table class="ti-custom-table ti-custom-table-head ti-custom-table-hover2"> <table class="ti-custom-table ti-custom-table-head ti-custom-table-hover2">
...@@ -276,176 +312,6 @@ ...@@ -276,176 +312,6 @@
</table> </table>
</div> </div>
</div> </div>
<div class="py-1rem px-2rem">
<div class="py-2 grid grid-cols-6 gap-3">
<div class="col-span-6">หมายเหตุ : กรณี HR จัดอบรมให้ต้องเป็นไปตามเกณฑ์ที่ส่วนกลางกำหนดขึ้น</div>
<div class="col-span-6 grid grid-cols-6 gap-2">
<div class="grid col-span-1 grid-cols-6 gap-2">
<div class="col-span-1">
<input type="checkbox" class="ti-form-checkbox" id="idpStatus-0" (click)="resetFormIdp()"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='0'||!canEdit ||appraisalIdp.checkStep!='1'"
name="idpStatus" (change)="appraisalIdp.masfromEvaluationIdp.idpStatus='0'"
[checked]="appraisalIdp.masfromEvaluationIdp.idpStatus=='0'">
</div>
<div class="col-span-5">
<label for="idpStatus-0" class="text-sm text-gray-500"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='0'||!canEdit ||appraisalIdp.checkStep!='1'">
IDP มาตรฐาน
</label>
</div>
</div>
<div class="grid col-span-1 grid-cols-6 gap-2">
<div class="col-span-1">
<input type="checkbox" class="ti-form-checkbox" id="idpStatus-1"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='1'||!canEdit ||appraisalIdp.checkStep!='1'"
name="idpStatus" (change)="appraisalIdp.masfromEvaluationIdp.idpStatus='1'"
[checked]="appraisalIdp.masfromEvaluationIdp.idpStatus=='1'">
</div>
<div class="col-span-5">
<label for="idpStatus-1" class="text-sm text-gray-500"
[class.pointer-events-none]="appraisalIdp.masfromEvaluationIdp.idpStatus=='1'||!canEdit ||appraisalIdp.checkStep!='1'">
IDP ปรับแก้ไข
</label>
</div>
</div>
</div>
</div>
</div>
<div class="py-1rem px-2rem">
<div class="py-2 grid grid-cols-7 gap-3">
<div class="col-span-1">
{{appraisalIdp.apsapprove2.employeeId?'ผู้ประเมิน1':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalIdp.apsapprove1.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalIdp.masfromEvaluationIdp.apsapprove1Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalIdp||appraisalIdp.currentStep!='1'||!canSave"
[readonly]="!appraisalIdp||appraisalIdp.currentStep!='1'||!canSave"
[(ngModel)]="appraisalIdp.masfromEvaluationIdp.apsapprove1Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalIdp.masfromEvaluationIdp.apsapprove1Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalIdp.apsapprove2.employeeId">
<div class="col-span-1">
{{appraisalIdp.apsapprove3.employeeId?'ผู้ประเมิน2':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalIdp.apsapprove2.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalIdp.masfromEvaluationIdp.apsapprove2Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalIdp||appraisalIdp.currentStep!='2'||!canSave"
[readonly]="!appraisalIdp||appraisalIdp.currentStep!='2'||!canSave"
[(ngModel)]="appraisalIdp.masfromEvaluationIdp.apsapprove2Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalIdp.masfromEvaluationIdp.apsapprove2Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalIdp.apsapprove3.employeeId">
<div class="col-span-1">
{{appraisalIdp.apsapprove4.employeeId?'ผู้ประเมิน3':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalIdp.apsapprove3.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalIdp.masfromEvaluationIdp.apsapprove3Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalIdp||appraisalIdp.currentStep!='3'||!canSave"
[readonly]="!appraisalIdp||appraisalIdp.currentStep!='3'||!canSave"
[(ngModel)]="appraisalIdp.masfromEvaluationIdp.apsapprove3Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalIdp.masfromEvaluationIdp.apsapprove3Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalIdp.apsapprove4.employeeId">
<div class="col-span-1">
{{appraisalIdp.apsapprove5.employeeId?'ผู้ประเมิน4':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalIdp.apsapprove4.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalIdp.masfromEvaluationIdp.apsapprove4Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalIdp||appraisalIdp.currentStep!='4'||!canSave"
[readonly]="!appraisalIdp||appraisalIdp.currentStep!='4'||!canSave"
[(ngModel)]="appraisalIdp.masfromEvaluationIdp.apsapprove4Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalIdp.masfromEvaluationIdp.apsapprove4Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalIdp.apsapprove5.employeeId">
<div class="col-span-1">
ผู้อนุมัติ
</div>
<div class="col-span-1">
{{appraisalIdp.apsapprove5.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalIdp.masfromEvaluationIdp.apsapprove5Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalIdp||appraisalIdp.currentStep!='5'||!canSave"
[readonly]="!appraisalIdp||appraisalIdp.currentStep!='5'||!canSave"
[(ngModel)]="appraisalIdp.masfromEvaluationIdp.apsapprove5Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalIdp.masfromEvaluationIdp.apsapprove5Date)}}
</span>
</div>
</div>
</div>
<div class="flex justify-center mb-1rem pb-2rem" *ngIf="canSave">
<button *ngIf="appraisalIdp.checkStep!='0'&&appraisalIdp.checkStep!='1'" type="submit"
class="ti-btn ti-btn-danger mx-2rem" (click)="save('noApprove')">
ไม่อนุมัติ
</button>
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="save('draft')">
บันทึกร่าง
</button>
<button type="submit" class="ti-btn ti-btn-secondary mx-2rem" (click)="save('approve')">
<ng-container *ngIf="appraisalIdp.checkStep=='0'">
ยืนยันข้อมูล
</ng-container>
<ng-container *ngIf="appraisalIdp.checkStep!='0'">
อนุมัติ
</ng-container>
</button>
</div>
</ng-container> </ng-container>
</ng-template> </ng-template>
......
...@@ -6,7 +6,6 @@ import { IdpFormModel } from 'src/app/shared/model/idp-form.model'; ...@@ -6,7 +6,6 @@ import { IdpFormModel } from 'src/app/shared/model/idp-form.model';
import { CompetencycourseService } from 'src/app/shared/services/competencycourse.service'; import { CompetencycourseService } from 'src/app/shared/services/competencycourse.service';
import { EmployeeService } from 'src/app/shared/services/employee.service'; import { EmployeeService } from 'src/app/shared/services/employee.service';
import { EvaluationIdpService } from 'src/app/shared/services/evaluation-Idp.service'; import { EvaluationIdpService } from 'src/app/shared/services/evaluation-Idp.service';
import Swal from 'sweetalert2';
interface table { interface table {
currentPage: number, currentPage: number,
...@@ -29,8 +28,10 @@ export class PmsIdpComponent { ...@@ -29,8 +28,10 @@ export class PmsIdpComponent {
hoveredCode: string | null = null; hoveredCode: string | null = null;
@Input() appraisalIdp?: Idp @Input() appraisalIdp?: Idp
originalformIdp?: IdpFormModel originalformIdp?: IdpFormModel
canEdit = false @Input() canEdit = false
canSave = false @Input() dateIso = ""
@Input() currentStep = ""
@Output() idpForm: EventEmitter<any> = new EventEmitter<any>();
competencycourse: { loading: boolean, data: CompetencycourseMiniModel[] } = { loading: false, data: [] } competencycourse: { loading: boolean, data: CompetencycourseMiniModel[] } = { loading: false, data: [] }
competencycourseTable: table = { competencycourseTable: table = {
...@@ -108,50 +109,36 @@ export class PmsIdpComponent { ...@@ -108,50 +109,36 @@ export class PmsIdpComponent {
} }
getFormIdp() { getFormIdp() {
if (this.appraisalIdp) { if (this.appraisalIdp) {
this.canSave = (this.appraisalIdp.currentStep == this.appraisalIdp.checkStep) && (this.appraisalIdp.masfromStatusType.code != 'Boss_finish' && this.appraisalIdp.masfromStatusType.code != 'Not_evaluating_yet') switch (this.currentStep) {
this.canEdit = (this.appraisalIdp.currentStep == this.appraisalIdp.checkStep && (+(this.appraisalIdp.checkStep) <= 1)) && (this.appraisalIdp.masfromStatusType.code != 'Boss_finish' && this.appraisalIdp.masfromStatusType.code != 'Not_evaluating_yet') case ("0"): {
} this.appraisalIdp.masfromEvaluationIdp.apsassessyDate = this.dateIso
switch (this.appraisalIdp?.currentStep) { break
case ("0"): {
if (this.canEdit) {
this.appraisalIdp.masfromEvaluationIdp.apsassessyDate = this.currentDate.toISOString().split('T')[0];
} }
break case ("1"): {
} this.appraisalIdp.masfromEvaluationIdp.apsapprove1Date = this.dateIso
case ("1"): { break
if (this.canEdit) {
this.appraisalIdp.masfromEvaluationIdp.apsapprove1Date = this.currentDate.toISOString().split('T')[0];
} }
break case ("2"): {
} this.appraisalIdp.masfromEvaluationIdp.apsapprove2Date = this.dateIso
case ("2"): { break
if (this.canEdit) {
this.appraisalIdp.masfromEvaluationIdp.apsapprove2Date = this.currentDate.toISOString().split('T')[0];
} }
break case ("3"): {
} this.appraisalIdp.masfromEvaluationIdp.apsapprove3Date = this.dateIso
case ("3"): { break
if (this.canEdit) {
this.appraisalIdp.masfromEvaluationIdp.apsapprove3Date = this.currentDate.toISOString().split('T')[0];
} }
break case ("4"): {
} this.appraisalIdp.masfromEvaluationIdp.apsapprove4Date = this.dateIso
case ("4"): { break
if (this.canEdit) {
this.appraisalIdp.masfromEvaluationIdp.apsapprove4Date = this.currentDate.toISOString().split('T')[0];
} }
break case ("5"): {
} this.appraisalIdp.masfromEvaluationIdp.apsapprove5Date = this.dateIso
case ("5"): { break
if (this.canEdit) {
this.appraisalIdp.masfromEvaluationIdp.apsapprove5Date = this.currentDate.toISOString().split('T')[0];
} }
break default: { return }
} }
default: { return } this.appraisalIdp.masfromEvaluationIdp.idpStatus = this.appraisalIdp.masfromEvaluationIdp.idpStatus ? this.appraisalIdp.masfromEvaluationIdp.idpStatus : '0'
this.cdr.detectChanges()
} }
this.appraisalIdp.masfromEvaluationIdp.idpStatus = this.appraisalIdp.masfromEvaluationIdp.idpStatus ? this.appraisalIdp.masfromEvaluationIdp.idpStatus : '0'
this.cdr.detectChanges()
} }
returnPath() { returnPath() {
this.sendReturnPath.emit() this.sendReturnPath.emit()
...@@ -174,175 +161,8 @@ export class PmsIdpComponent { ...@@ -174,175 +161,8 @@ export class PmsIdpComponent {
} }
save(status: 'approve' | 'noApprove' | 'draft') { sendForm() {
let title = '' this.idpForm.emit(this.appraisalIdp)
let text = ''
let confirmButtonText = ''
let approveStatus = '0'
if (status == 'draft') {
title = 'บันทึกแบบร่าง'
text = 'คุณต้องการบันทึกแบบร่างของการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการบันทึก'
approveStatus = '1'
} else if (status == 'approve') {
approveStatus = '2'
if (this.appraisalIdp?.checkStep == '0') {
title = 'ยืนยันข้อมูล'
text = 'คุณต้องการยืนยันข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการบันทึก'
} else {
title == 'อนุมัติ'
text = 'คุณต้องการอนุมัติข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการอนุมัติ'
}
} else if (status == 'noApprove') {
approveStatus = '0'
title == 'ไม่อนุมัติ'
text = 'คุณต้องการไม่อนุมัติข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการไม่อนุมัติ'
}
Swal.fire({
iconHtml: `
<div class="flex items-center justify-center rounded-full !h-80px !w-80px" style="background-color: #E8F8EE;">
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="39" height="39" fill="#D2D2D2"/>
<g id="Component">
<g id="alert cart">
<g id="mdi:file-export">
<circle cx="22.5" cy="19.5" r="33.5" fill="#E8F8EE"/>
<path d="M9.75 3.25C8.88805 3.25 8.0614 3.59241 7.4519 4.2019C6.84241 4.8114 6.5 5.63805 6.5 6.5V32.5C6.5 33.362 6.84241 34.1886 7.4519 34.7981C8.0614 35.4076 8.88805 35.75 9.75 35.75H29.25C30.112 35.75 30.9386 35.4076 31.5481 34.7981C32.1576 34.1886 32.5 33.362 32.5 32.5V13L22.75 3.25M21.125 5.6875L30.0625 14.625H21.125M14.5113 19.8575H26V31.3463L22.555 27.9013L17.9563 32.5L13.3575 27.9013L17.9563 23.3188"
fill="#1DBE5A"/>
</g>
</g>
</g>
</svg>
</div>
`,
title: title,
text: text,
showCancelButton: true,
confirmButtonText: confirmButtonText,
cancelButtonText: 'ย้อนกลับ',
customClass: {
title: '!swal2-title-mt-20px',
actions: '!swal2-actions-mt-20px',
icon: '!swal2-icon-no-border',
confirmButton: '!swal2-button-bg-green',
cancelButton: '!swal2-button-bg-gray',
},
}).then((result) => {
if (result.isConfirmed && this.appraisalIdp) {
this.saveApi(approveStatus)
} else if (result.dismiss === Swal.DismissReason.cancel) {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
})
}
})
} }
saveApi(approveStatus: string) {
let body = this.appraisalIdp
switch (this.appraisalIdp?.currentStep) {
case ("0"): {
body = {
...this.appraisalIdp, masfromEvaluationIdp: {
...this.appraisalIdp.masfromEvaluationIdp,
apsassessyStatus: approveStatus
}
}
break
}
case ("1"): {
body = {
...this.appraisalIdp, masfromEvaluationIdp: {
...this.appraisalIdp.masfromEvaluationIdp,
apsapprove1Status: approveStatus
}
}
break
}
case ("2"): {
body = {
...this.appraisalIdp, masfromEvaluationIdp: {
...this.appraisalIdp.masfromEvaluationIdp,
apsapprove1Status: approveStatus == '0' ? approveStatus : this.appraisalIdp.masfromEvaluationIdp.apsapprove1Status,
apsapprove2Status: approveStatus
}
}
break
}
case ("3"): {
body = {
...this.appraisalIdp, masfromEvaluationIdp: {
...this.appraisalIdp.masfromEvaluationIdp,
apsapprove2Status: approveStatus == '0' ? approveStatus : this.appraisalIdp.masfromEvaluationIdp.apsapprove2Status,
apsapprove3Status: approveStatus
}
}
break
}
case ("4"): {
body = {
...this.appraisalIdp, masfromEvaluationIdp: {
...this.appraisalIdp.masfromEvaluationIdp,
apsapprove3Status: approveStatus == '0' ? approveStatus : this.appraisalIdp.masfromEvaluationIdp.apsapprove3Status,
apsapprove4Status: approveStatus
}
}
break
}
case ("5"): {
body = {
...this.appraisalIdp, masfromEvaluationIdp: {
...this.appraisalIdp.masfromEvaluationIdp,
apsapprove4Status: approveStatus == '0' ? approveStatus : this.appraisalIdp.masfromEvaluationIdp.apsapprove4Status,
apsapprove5Status: approveStatus
}
}
break
}
default: { return }
}
this.evaluationIdpService.postIdp(body).subscribe({
next: response => {
if (response.success) {
Swal.fire({
title: 'บันทึกสำเร็จ!',
text: 'การประเมินของคุณถูกบันทึกแล้ว',
icon: 'success',
customClass: {
confirmButton: '!swal2-button-bg-green',
}
});
this.getFormIdp()
} else {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
});
}
}, error: error => {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
});
}
})
}
} }
<ng-container *ngTemplateOutlet="pmsEvaluation"></ng-container> <ng-container *ngTemplateOutlet="pmsEvaluation"></ng-container>
<ng-template #pmsEvaluation> <ng-template #pmsEvaluation>
<!-- <div class="pb-2rem px-2rem pt-1.5rem w-full min-height-50px justify-between items-center">
<div class="flex">
<button type="button" class="ti-btn ti-btn-outline ti-btn-outline-light h-20px m-0 shadow-md text-blue-500"
(click)="returnPath()">
<i class="ti ti-chevron-left"></i>
ย้อนกลับ
</button>
<div class="font-size-18px font-weight-700 align-center text-primary pl-1rem">
ประเมินผล
</div>
</div>
</div> -->
<ng-container *ngIf="appraisalPms"> <ng-container *ngIf="appraisalPms">
<div class="pb-2rem px-2rem"> <div class="pb-2rem px-2rem">
<div class="font-size-18px font-weight-700 text-primary"> <div class="font-size-18px font-weight-700 text-primary">
...@@ -103,13 +91,15 @@ ...@@ -103,13 +91,15 @@
<span>ฝ่าย (Department)</span> <span>ฝ่าย (Department)</span>
</div> </div>
<div class="col-span-1 p-2 border pb-4"> <div class="col-span-1 p-2 border pb-4">
<span *ngIf="appraisalPms.apsapprove1.bu1">{{appraisalPms.apsapprove1.bu1.tdesc || ""}}</span> <span *ngIf="appraisalPms.apsapprove1.bu1">{{appraisalPms.apsapprove1.bu1.tdesc ||
""}}</span>
</div> </div>
<div class="col-span-1 p-2 border pb-4"> <div class="col-span-1 p-2 border pb-4">
<span>แผนก (Section)</span> <span>แผนก (Section)</span>
</div> </div>
<div class="col-span-1 p-2 border pb-4"> <div class="col-span-1 p-2 border pb-4">
<span *ngIf="appraisalPms.apsapprove1.bu2">{{appraisalPms.apsapprove1.bu2.tdesc || ""}}</span> <span *ngIf="appraisalPms.apsapprove1.bu2">{{appraisalPms.apsapprove1.bu2.tdesc ||
""}}</span>
</div> </div>
</div> </div>
</div> </div>
...@@ -131,165 +121,6 @@ ...@@ -131,165 +121,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="py-1rem px-2rem">
<div class="py-2 grid grid-cols-7 gap-3">
<div class="col-span-1">ผู้รับการประเมิน</div>
<div class="col-span-1">
{{appraisalPms.apsassessy.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none "
[checked]="appraisalPms.apsassessyStatus=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalPms||appraisalPms.currentStep!='0'||!canSave"
[readonly]="!appraisalPms||appraisalPms.currentStep!='0'||!canSave"
[(ngModel)]="appraisalPms.apsassessyComment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalPms.apsassessyDate)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalPms.apsapprove1.employeeId">
<div class="col-span-1">
{{appraisalPms.apsapprove2.employeeId?'ผู้ประเมิน1':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalPms.apsapprove1.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalPms.apsapprove1Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalPms||appraisalPms.currentStep!='1'||!canSave"
[readonly]="!appraisalPms||appraisalPms.currentStep!='1'||!canSave"
[(ngModel)]="appraisalPms.apsapprove1Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalPms.apsapprove1Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalPms.apsapprove2.employeeId">
<div class="col-span-1">
{{appraisalPms.apsapprove3.employeeId?'ผู้ประเมิน2':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalPms.apsapprove2.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalPms.apsapprove2Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalPms||appraisalPms.currentStep!='2'||!canSave"
[readonly]="!appraisalPms||appraisalPms.currentStep!='2'||!canSave"
[(ngModel)]="appraisalPms.apsapprove2Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalPms.apsapprove2Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalPms.apsapprove3.employeeId">
<div class="col-span-1">
{{appraisalPms.apsapprove4.employeeId?'ผู้ประเมิน3':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalPms.apsapprove3.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalPms.apsapprove3Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalPms||appraisalPms.currentStep!='3'||!canSave"
[readonly]="!appraisalPms||appraisalPms.currentStep!='3'||!canSave"
[(ngModel)]="appraisalPms.apsapprove3Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalPms.apsapprove3Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalPms.apsapprove4.employeeId">
<div class="col-span-1">
{{appraisalPms.apsapprove5.employeeId?'ผู้ประเมิน4':'ผู้อนุมัติ'}}
</div>
<div class="col-span-1">
{{appraisalPms.apsapprove4.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600 checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalPms.apsapprove4Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalPms||appraisalPms.currentStep!='4'||!canSave"
[readonly]="!appraisalPms||appraisalPms.currentStep!='4'||!canSave"
[(ngModel)]="appraisalPms.apsapprove4Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalPms.apsapprove4Date)}}
</span>
</div>
</div>
<div class="py-2 grid grid-cols-7 gap-3" *ngIf="appraisalPms.apsapprove5.employeeId">
<div class="col-span-1">
ผู้อนุมัติ
</div>
<div class="col-span-1">
{{appraisalPms.apsapprove5.thFullName}}</div>
<div class="col-span-1">
<input type="checkbox" id="hs-basic-usage1" class="ti-switch checked:bg-none checked:bg-green-600
checked:hover:bg-green-600 checked:focus:bg-green-600 focus:border-green-600 focus:ring-green-600 dark:checked:bg-green-600
checked:before:bg-green-200 dark:checked:before:bg-green-200 pointer-events-none"
[checked]="appraisalPms.apsapprove5Status=='2'">
<label for="hs-basic-usage1" class="sr-only">ยืนยันผล</label>
</div>
<div class="col-span-2">
<textarea type="text" rows="2" class="ti-form-input mb-2" placeholder="ใส่ Comment ที่นี่"
[class.!bg-input-readonly]="!appraisalPms||appraisalPms.currentStep!='5'||!canSave"
[readonly]="!appraisalPms||appraisalPms.currentStep!='5'||!canSave"
[(ngModel)]="appraisalPms.apsapprove5Comment"></textarea>
<span class="pt-2">
วันที่ :
{{convertDate(appraisalPms.apsapprove5Date)}}
</span>
</div>
</div>
</div>
<div class="flex justify-center mb-1rem pb-2rem" *ngIf="canSave">
<button *ngIf="appraisalPms.checkStep!='0'&&appraisalPms.checkStep!='1'" type="submit"
class="ti-btn ti-btn-danger mx-2rem" (click)="save('noApprove')">
ไม่อนุมัติ
</button>
<button type="submit" class="ti-btn ti-btn-success mx-2rem" (click)="save('draft')">
บันทึกร่าง
</button>
<button type="submit" class="ti-btn ti-btn-secondary mx-2rem" (click)="save('approve')">
<ng-container *ngIf="appraisalPms.checkStep=='0'">
ยืนยันข้อมูล
</ng-container>
<ng-container *ngIf="appraisalPms.checkStep!='0'">
อนุมัติ
</ng-container>
</button>
</div>
</ng-container> </ng-container>
</ng-template> </ng-template>
...@@ -298,20 +129,18 @@ ...@@ -298,20 +129,18 @@
</ng-template> </ng-template>
<ng-template #part1> <ng-template #part1>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="part1Remain()" [class.bg-success]="!part1Remain()">
<path *ngIf="false" <ng-container *ngIf="part1Remain()">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{part1Remain()}}
fill="currentColor" class="fill-green-500"></path> </ng-container>
<path *ngIf="false" <i *ngIf="!part1Remain()" class="ti ti-check"></i>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z" </span>
fill="currentColor"></path>
</svg>
<span> <span>
Part 1 : ประเมินผลการปฏิบัติงานตามนโยบายบริษัท (Corporate KPI) Part 1 : ประเมินผลการปฏิบัติงานตามนโยบายบริษัท (Corporate KPI)
</span> </span>
...@@ -327,7 +156,7 @@ ...@@ -327,7 +156,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -391,7 +220,7 @@ ...@@ -391,7 +220,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioA'+i" [name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioA'+i"
(click)="setScore(item,5)" (click)="setScore(item,5);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br>
{{item.groupAssessment1.pmsTopic.targetAdetail}} {{item.groupAssessment1.pmsTopic.targetAdetail}}
</td> </td>
...@@ -399,7 +228,7 @@ ...@@ -399,7 +228,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioB'+i" [name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioB'+i"
(click)="setScore(item,4)" (click)="setScore(item,4);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br>
{{item.groupAssessment1.pmsTopic.targetBdetail}} {{item.groupAssessment1.pmsTopic.targetBdetail}}
</td> </td>
...@@ -407,7 +236,7 @@ ...@@ -407,7 +236,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioC'+i" [name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioC'+i"
(click)="setScore(item,3)" (click)="setScore(item,3);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br>
{{item.groupAssessment1.pmsTopic.targetCdetail}} {{item.groupAssessment1.pmsTopic.targetCdetail}}
</td> </td>
...@@ -415,7 +244,7 @@ ...@@ -415,7 +244,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioD'+i" [name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioD'+i"
(click)="setScore(item,2)" (click)="setScore(item,2);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br>
{{item.groupAssessment1.pmsTopic.targetDdetail}} {{item.groupAssessment1.pmsTopic.targetDdetail}}
</td> </td>
...@@ -423,7 +252,7 @@ ...@@ -423,7 +252,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioE'+i" [name]="'part1radio'+i" class="ti-form-radio" [id]="'part1radioE'+i"
(click)="setScore(item,1)" (click)="setScore(item,1);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br>
{{item.groupAssessment1.pmsTopic.targetEdetail}} {{item.groupAssessment1.pmsTopic.targetEdetail}}
</td> </td>
...@@ -506,20 +335,18 @@ ...@@ -506,20 +335,18 @@
<ng-template #part2> <ng-template #part2>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="part2Remain()" [class.bg-success]="!part2Remain()">
<path *ngIf="false" <ng-container *ngIf="part2Remain()">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{part2Remain()}}
fill="currentColor" class="fill-green-500"></path> </ng-container>
<path *ngIf="false" <i *ngIf="!part2Remain()" class="ti ti-check"></i>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z" </span>
fill="currentColor"></path>
</svg>
<span> <span>
Part 2 : ประเมินผลการปฏิบัติงานประจำ (Department KPI) Part 2 : ประเมินผลการปฏิบัติงานประจำ (Department KPI)
</span> </span>
...@@ -535,7 +362,7 @@ ...@@ -535,7 +362,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -596,7 +423,7 @@ ...@@ -596,7 +423,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioA'+i" [name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioA'+i"
(click)="setScore(item,5)" (click)="setScore(item,5);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br>
{{item.groupAssessment1.pmsTopic.targetAdetail}} {{item.groupAssessment1.pmsTopic.targetAdetail}}
</td> </td>
...@@ -604,7 +431,7 @@ ...@@ -604,7 +431,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioB'+i" [name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioB'+i"
(click)="setScore(item,4)" (click)="setScore(item,4);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br>
{{item.groupAssessment1.pmsTopic.targetBdetail}} {{item.groupAssessment1.pmsTopic.targetBdetail}}
</td> </td>
...@@ -612,7 +439,7 @@ ...@@ -612,7 +439,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioC'+i" [name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioC'+i"
(click)="setScore(item,3)" (click)="setScore(item,3);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br>
{{item.groupAssessment1.pmsTopic.targetCdetail}} {{item.groupAssessment1.pmsTopic.targetCdetail}}
</td> </td>
...@@ -620,7 +447,7 @@ ...@@ -620,7 +447,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioD'+i" [name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioD'+i"
(click)="setScore(item,2)" (click)="setScore(item,2);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br>
{{item.groupAssessment1.pmsTopic.targetDdetail}} {{item.groupAssessment1.pmsTopic.targetDdetail}}
</td> </td>
...@@ -628,7 +455,7 @@ ...@@ -628,7 +455,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioE'+i" [name]="'part2radio'+i" class="ti-form-radio" [id]="'part2radioE'+i"
(click)="setScore(item,1)" (click)="setScore(item,1);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br>
{{item.groupAssessment1.pmsTopic.targetEdetail}} {{item.groupAssessment1.pmsTopic.targetEdetail}}
</td> </td>
...@@ -704,20 +531,18 @@ ...@@ -704,20 +531,18 @@
</ng-template> </ng-template>
<ng-template #part3> <ng-template #part3>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="part3Remain()" [class.bg-success]="!part3Remain()">
<path *ngIf="false" <ng-container *ngIf="part3Remain()">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{part3Remain()}}
fill="currentColor" class="fill-green-500"></path> </ng-container>
<path *ngIf="false" <i *ngIf="!part3Remain()" class="ti ti-check"></i>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z" </span>
fill="currentColor"></path>
</svg>
<span> <span>
Part 3 : ประเมินผลการปฏิบัติงานประจำ (Individual KPI) Part 3 : ประเมินผลการปฏิบัติงานประจำ (Individual KPI)
</span> </span>
...@@ -733,7 +558,7 @@ ...@@ -733,7 +558,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -794,7 +619,7 @@ ...@@ -794,7 +619,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioA'+i" [name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioA'+i"
(click)="setScore(item,5)" (click)="setScore(item,5);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br>
{{item.groupAssessment1.pmsTopic.targetAdetail}} {{item.groupAssessment1.pmsTopic.targetAdetail}}
</td> </td>
...@@ -802,7 +627,7 @@ ...@@ -802,7 +627,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioB'+i" [name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioB'+i"
(click)="setScore(item,4)" (click)="setScore(item,4);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br>
{{item.groupAssessment1.pmsTopic.targetBdetail}} {{item.groupAssessment1.pmsTopic.targetBdetail}}
</td> </td>
...@@ -810,7 +635,7 @@ ...@@ -810,7 +635,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioC'+i" [name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioC'+i"
(click)="setScore(item,3)" (click)="setScore(item,3);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br>
{{item.groupAssessment1.pmsTopic.targetCdetail}} {{item.groupAssessment1.pmsTopic.targetCdetail}}
</td> </td>
...@@ -818,7 +643,7 @@ ...@@ -818,7 +643,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioD'+i" [name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioD'+i"
(click)="setScore(item,2)" (click)="setScore(item,2);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br>
{{item.groupAssessment1.pmsTopic.targetDdetail}} {{item.groupAssessment1.pmsTopic.targetDdetail}}
</td> </td>
...@@ -826,7 +651,7 @@ ...@@ -826,7 +651,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioE'+i" [name]="'part3radio'+i" class="ti-form-radio" [id]="'part3radioE'+i"
(click)="setScore(item,1)" (click)="setScore(item,1);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br>
{{item.groupAssessment1.pmsTopic.targetEdetail}} {{item.groupAssessment1.pmsTopic.targetEdetail}}
</td> </td>
...@@ -902,20 +727,12 @@ ...@@ -902,20 +727,12 @@
</ng-template> </ng-template>
<ng-template #part4> <ng-template #part4>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <div></div>
xmlns="http://www.w3.org/2000/svg">
<path *ngIf="false"
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z"
fill="currentColor" class="fill-green-500"></path>
<path *ngIf="false"
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
<span> <span>
Part 4 : ประเมินผลสมรรถนะที่สนับสนุนการปฏิบัติงาน (Competency) Part 4 : ประเมินผลสมรรถนะที่สนับสนุนการปฏิบัติงาน (Competency)
</span> </span>
...@@ -931,7 +748,7 @@ ...@@ -931,7 +748,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -1062,20 +879,18 @@ ...@@ -1062,20 +879,18 @@
<ng-template #part5> <ng-template #part5>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="part5Remain()" [class.bg-success]="!part5Remain()">
<path *ngIf="false" <ng-container *ngIf="part5Remain()">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{part5Remain()}}
fill="currentColor" class="fill-green-500"></path> </ng-container>
<path *ngIf="false" <i *ngIf="!part5Remain()" class="ti ti-check"></i>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z" </span>
fill="currentColor"></path>
</svg>
<span> <span>
Part 5 : อัตราการเข้างาน (Time Attendance) Part 5 : อัตราการเข้างาน (Time Attendance)
</span> </span>
...@@ -1091,7 +906,7 @@ ...@@ -1091,7 +906,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -1148,7 +963,7 @@ ...@@ -1148,7 +963,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioA'+i" [name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioA'+i"
(click)="setScorePart5(item,5)" (click)="setScorePart5(item,5);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==5:item.pmsWorkingTimScoreBoss==5"><br> [checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==5:item.pmsWorkingTimScoreBoss==5"><br>
{{item.targetADetail}} {{item.targetADetail}}
</td> </td>
...@@ -1156,7 +971,7 @@ ...@@ -1156,7 +971,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioB'+i" [name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioB'+i"
(click)="setScorePart5(item,4)" (click)="setScorePart5(item,4);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==4:item.pmsWorkingTimScoreBoss==4"><br> [checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==4:item.pmsWorkingTimScoreBoss==4"><br>
{{item.targetBDetail}} {{item.targetBDetail}}
</td> </td>
...@@ -1164,7 +979,7 @@ ...@@ -1164,7 +979,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioC'+i" [name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioC'+i"
(click)="setScorePart5(item,3)" (click)="setScorePart5(item,3);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==3:item.pmsWorkingTimScoreBoss==3"><br> [checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==3:item.pmsWorkingTimScoreBoss==3"><br>
{{item.targetCDetail}} {{item.targetCDetail}}
</td> </td>
...@@ -1172,7 +987,7 @@ ...@@ -1172,7 +987,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioD'+i" [name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioD'+i"
(click)="setScorePart5(item,2)" (click)="setScorePart5(item,2);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==2:item.pmsWorkingTimScoreBoss==2"><br> [checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==2:item.pmsWorkingTimScoreBoss==2"><br>
{{item.targetDDetail}} {{item.targetDDetail}}
</td> </td>
...@@ -1180,7 +995,7 @@ ...@@ -1180,7 +995,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioE'+i" [name]="'part5radio'+i" class="ti-form-radio" [id]="'part5radioE'+i"
(click)="setScorePart5(item,1)" (click)="setScorePart5(item,1);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==1:item.pmsWorkingTimScoreBoss==1"><br> [checked]="evaluaterId==evaluateeId?item.pmsWorkingTimScore==1:item.pmsWorkingTimScoreBoss==1"><br>
{{item.targetEDetail}} {{item.targetEDetail}}
</td> </td>
...@@ -1253,20 +1068,18 @@ ...@@ -1253,20 +1068,18 @@
</ng-template> </ng-template>
<ng-template #part6> <ng-template #part6>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="part6Remain()" [class.bg-success]="!part6Remain()">
<path *ngIf="false" <ng-container *ngIf="part6Remain()">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{part6Remain()}}
fill="currentColor" class="fill-green-500"></path> </ng-container>
<path *ngIf="false" <i *ngIf="!part6Remain()" class="ti ti-check"></i>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z" </span>
fill="currentColor"></path>
</svg>
<span> <span>
Part 6 : งานที่ได้รับมอบหมายเพิ่มเติม (Cross Functional Project Assignment) Part 6 : งานที่ได้รับมอบหมายเพิ่มเติม (Cross Functional Project Assignment)
</span> </span>
...@@ -1282,7 +1095,7 @@ ...@@ -1282,7 +1095,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -1345,7 +1158,7 @@ ...@@ -1345,7 +1158,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioA'+i" [name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioA'+i"
(click)="setScore(item,5)" (click)="setScore(item,5);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br>
{{item.groupAssessment1.pmsTopic.targetAdetail}} {{item.groupAssessment1.pmsTopic.targetAdetail}}
</td> </td>
...@@ -1353,7 +1166,7 @@ ...@@ -1353,7 +1166,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioB'+i" [name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioB'+i"
(click)="setScore(item,4)" (click)="setScore(item,4);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br>
{{item.groupAssessment1.pmsTopic.targetBdetail}} {{item.groupAssessment1.pmsTopic.targetBdetail}}
</td> </td>
...@@ -1361,7 +1174,7 @@ ...@@ -1361,7 +1174,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioC'+i" [name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioC'+i"
(click)="setScore(item,3)" (click)="setScore(item,3);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br>
{{item.groupAssessment1.pmsTopic.targetCdetail}} {{item.groupAssessment1.pmsTopic.targetCdetail}}
</td> </td>
...@@ -1369,7 +1182,7 @@ ...@@ -1369,7 +1182,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioD'+i" [name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioD'+i"
(click)="setScore(item,2)" (click)="setScore(item,2);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br>
{{item.groupAssessment1.pmsTopic.targetDdetail}} {{item.groupAssessment1.pmsTopic.targetDdetail}}
</td> </td>
...@@ -1377,7 +1190,7 @@ ...@@ -1377,7 +1190,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioE'+i" [name]="'part6radio'+i" class="ti-form-radio" [id]="'part6radioE'+i"
(click)="setScore(item,1)" (click)="setScore(item,1);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br>
{{item.groupAssessment1.pmsTopic.targetEdetail}} {{item.groupAssessment1.pmsTopic.targetEdetail}}
</td> </td>
...@@ -1458,20 +1271,18 @@ ...@@ -1458,20 +1271,18 @@
<ng-template #part7> <ng-template #part7>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <span class="d-flex align-items-center justify-content-center rounded-circle text-white"
xmlns="http://www.w3.org/2000/svg"> [class.bg-danger]="part7Remain()" [class.bg-success]="!part7Remain()">
<path *ngIf="false" <ng-container *ngIf="part7Remain()">
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z" {{part7Remain()}}
fill="currentColor" class="fill-green-500"></path> </ng-container>
<path *ngIf="false" <i *ngIf="!part7Remain()" class="ti ti-check"></i>
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z" </span>
fill="currentColor"></path>
</svg>
<span> <span>
Part 7: กิจกรรมพิเศษ (Special Activities) Part 7: กิจกรรมพิเศษ (Special Activities)
</span> </span>
...@@ -1487,7 +1298,7 @@ ...@@ -1487,7 +1298,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -1550,7 +1361,7 @@ ...@@ -1550,7 +1361,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioA'+i" [name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioA'+i"
(click)="setScore(item,5)" (click)="setScore(item,5);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==5:item.scoreTopicExpectationBoss==5"><br>
{{item.groupAssessment1.pmsTopic.targetAdetail}} {{item.groupAssessment1.pmsTopic.targetAdetail}}
</td> </td>
...@@ -1558,7 +1369,7 @@ ...@@ -1558,7 +1369,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioB'+i" [name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioB'+i"
(click)="setScore(item,4)" (click)="setScore(item,4);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==4:item.scoreTopicExpectationBoss==4"><br>
{{item.groupAssessment1.pmsTopic.targetBdetail}} {{item.groupAssessment1.pmsTopic.targetBdetail}}
</td> </td>
...@@ -1566,7 +1377,7 @@ ...@@ -1566,7 +1377,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioC'+i" [name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioC'+i"
(click)="setScore(item,3)" (click)="setScore(item,3);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==3:item.scoreTopicExpectationBoss==3"><br>
{{item.groupAssessment1.pmsTopic.targetCdetail}} {{item.groupAssessment1.pmsTopic.targetCdetail}}
</td> </td>
...@@ -1574,7 +1385,7 @@ ...@@ -1574,7 +1385,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioD'+i" [name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioD'+i"
(click)="setScore(item,2)" (click)="setScore(item,2);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==2:item.scoreTopicExpectationBoss==2"><br>
{{item.groupAssessment1.pmsTopic.targetDdetail}} {{item.groupAssessment1.pmsTopic.targetDdetail}}
</td> </td>
...@@ -1582,7 +1393,7 @@ ...@@ -1582,7 +1393,7 @@
<input [class.cursor-pointer]="canEdit" <input [class.cursor-pointer]="canEdit"
[class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio" [class.cursor-not-allowed]="!canEdit" [disabled]="!canEdit" type="radio"
[name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioE'+i" [name]="'part7radio'+i" class="ti-form-radio" [id]="'part7radioE'+i"
(click)="setScore(item,1)" (click)="setScore(item,1);allFormRemain()"
[checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br> [checked]="evaluaterId==evaluateeId?item.scoreTopicExpectation==1:item.scoreTopicExpectationBoss==1"><br>
{{item.groupAssessment1.pmsTopic.targetEdetail}} {{item.groupAssessment1.pmsTopic.targetEdetail}}
</td> </td>
...@@ -1663,20 +1474,12 @@ ...@@ -1663,20 +1474,12 @@
<ng-template #part8> <ng-template #part8>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <div></div>
xmlns="http://www.w3.org/2000/svg">
<path *ngIf="false"
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z"
fill="currentColor" class="fill-green-500"></path>
<path *ngIf="false"
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
<span> <span>
Part 8 : สรุปผลการปฏิบัติงาน (Summary) Part 8 : สรุปผลการปฏิบัติงาน (Summary)
</span> </span>
...@@ -1692,7 +1495,7 @@ ...@@ -1692,7 +1495,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -1773,20 +1576,12 @@ ...@@ -1773,20 +1576,12 @@
<ng-template #part9> <ng-template #part9>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <div></div>
xmlns="http://www.w3.org/2000/svg">
<path *ngIf="false"
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z"
fill="currentColor" class="fill-green-500"></path>
<path *ngIf="false"
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
<span> <span>
Part 9 : พฤติกรรมบุคคลที่เป็นจุดแข็ง จุดอ่อน และการพัฒนา Part 9 : พฤติกรรมบุคคลที่เป็นจุดแข็ง จุดอ่อน และการพัฒนา
(EMPLOYEE STRENGTHS , WEAKNESSES AND PLAN TO IMPROVED) (EMPLOYEE STRENGTHS , WEAKNESSES AND PLAN TO IMPROVED)
...@@ -1803,7 +1598,7 @@ ...@@ -1803,7 +1598,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
...@@ -1883,20 +1678,12 @@ ...@@ -1883,20 +1678,12 @@
<ng-template #part10> <ng-template #part10>
<div class="hs-accordion active overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10" <div class="hs-accordion overflow-hidden bg-white border -mt-px first:rounded-t-sm last:rounded-b-sm dark:bg-bgdark dark:border-white/10"
id="hs-primary-heading-1"> id="hs-primary-heading-1">
<button (click)="scrollToTable($event)" <button (click)="scrollToTable($event)"
class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80" class="hs-accordion-toggle hs-accordion-active:text-white hs-accordion-active:bg-secondary group py-4 px-5 inline-flex items-center justify-between gap-x-3 w-full font-semibold text-start text-gray-800 transition hover:text-gray-500 dark:hs-accordion-active:text-white dark:text-gray-200 dark:hover:text-white/80"
aria-controls="hs-primary-collapse-1" type="button"> aria-controls="hs-primary-collapse-1" type="button">
<svg class="flex-shrink-0 h-6 w-6 text-white" width="16" height="16" viewBox="0 0 16 16" fill="none" <div></div>
xmlns="http://www.w3.org/2000/svg">
<path *ngIf="false"
d="M15.1965 7.85999C15.1965 3.71785 11.8387 0.359985 7.69653 0.359985C3.5544 0.359985 0.196533 3.71785 0.196533 7.85999C0.196533 12.0021 3.5544 15.36 7.69653 15.36C11.8387 15.36 15.1965 12.0021 15.1965 7.85999Z"
fill="currentColor" class="fill-green-500"></path>
<path *ngIf="false"
d="M10.9295 4.88618C11.1083 4.67577 11.4238 4.65019 11.6343 4.82904C11.8446 5.00788 11.8702 5.32343 11.6914 5.53383L7.44139 10.5338C7.25974 10.7475 6.93787 10.77 6.72825 10.5837L4.47825 8.5837C4.27186 8.40024 4.25327 8.0842 4.43673 7.87781C4.62019 7.67142 4.93622 7.65283 5.14261 7.83629L7.01053 9.49669L10.9295 4.88618Z"
fill="currentColor"></path>
</svg>
<span> <span>
Part 10: คำชมหรือรางวัลที่ได้รับ (Conversation, Feedback, Recognise : CFR) Part 10: คำชมหรือรางวัลที่ได้รับ (Conversation, Feedback, Recognise : CFR)
</span> </span>
...@@ -1912,7 +1699,7 @@ ...@@ -1912,7 +1699,7 @@
</svg> </svg>
</button> </button>
<div id="hs-primary-collapse-1" <div id="hs-primary-collapse-1"
class="hs-accordion-content !w-full overflow-hidden transition-[height] duration-300" class="hs-accordion-content hidden !w-full overflow-hidden transition-[height] duration-300"
aria-labelledby="hs-primary-heading-1"> aria-labelledby="hs-primary-heading-1">
<div class="box-body p-0"> <div class="box-body p-0">
<div class="space-y-4"> <div class="space-y-4">
......
...@@ -5,7 +5,6 @@ import { EmployeeService } from 'src/app/shared/services/employee.service'; ...@@ -5,7 +5,6 @@ import { EmployeeService } from 'src/app/shared/services/employee.service';
import { PmsGroupGradeService } from 'src/app/shared/services/pms-group-grade.service'; import { PmsGroupGradeService } from 'src/app/shared/services/pms-group-grade.service';
import { SettingAssessmentService } from 'src/app/shared/services/setting-assessment.service'; import { SettingAssessmentService } from 'src/app/shared/services/setting-assessment.service';
import { Pms } from 'src/app/shared/model/competency.model'; import { Pms } from 'src/app/shared/model/competency.model';
import Swal from 'sweetalert2';
export interface Part8Model { export interface Part8Model {
id: number id: number
...@@ -88,13 +87,15 @@ export class PmsKpiComponent { ...@@ -88,13 +87,15 @@ export class PmsKpiComponent {
}] }]
part9show = true part9show = true
part10show = true part10show = true
canEdit = false
canSave = false
currentDate = new Date()
@Input() evaluateeId = "" @Input() evaluateeId = ""
@Input() evaluaterId = "" @Input() evaluaterId = ""
@Input() appraisalPms?: Pms @Input() appraisalPms?: Pms
@Input() canEdit = false
@Input() currentStep = ""
@Input() dateIso = ""
@Output() sendReturnPath: EventEmitter<any> = new EventEmitter<any>(); @Output() sendReturnPath: EventEmitter<any> = new EventEmitter<any>();
@Output() kpiFormRemain: EventEmitter<any> = new EventEmitter<any>();
@Output() kpiForm: EventEmitter<any> = new EventEmitter<any>();
groupGrade: { loading: boolean, dataList: CompetencyGradeModel[] } = { loading: false, dataList: [] } groupGrade: { loading: boolean, dataList: CompetencyGradeModel[] } = { loading: false, dataList: [] }
constructor(private appraisalService: AppraisalService, constructor(private appraisalService: AppraisalService,
private pmsGroupGradeService: PmsGroupGradeService, private pmsGroupGradeService: PmsGroupGradeService,
...@@ -103,14 +104,90 @@ export class PmsKpiComponent { ...@@ -103,14 +104,90 @@ export class PmsKpiComponent {
private settingAssessmentService: SettingAssessmentService private settingAssessmentService: SettingAssessmentService
) { ) {
} }
ngOnChanges(changes: SimpleChanges): void { // ngOnChanges(changes: SimpleChanges): void {
if (changes['evaluateeId']?.currentValue || changes['evaluaterId']?.currentValue) { // if (changes['evaluateeId']?.currentValue || changes['evaluaterId']?.currentValue) {
this.toggleAllParts(this.evaluateeId == this.evaluaterId) // this.toggleAllParts(this.evaluateeId == this.evaluaterId)
} // }
} // }
ngOnInit(): void { ngOnInit(): void {
this.getPmsGroupGradeList() this.getPmsGroupGradeList()
this.getAppraisalPmsForm()
this.allFormRemain()
}
getAppraisalPmsForm() {
this.data8List.forEach((x, i) => {
if (x.id == 1 && this.appraisalPms?.part1Percentage) {
x.factors = this.appraisalPms.part1Percentage
} else if (x.id == 2 && this.appraisalPms?.part2Percentage) {
x.factors = this.appraisalPms.part2Percentage
} else if (x.id == 3 && this.appraisalPms?.part3Percentage) {
x.factors = this.appraisalPms.part3Percentage
} else if (x.id == 4 && this.appraisalPms?.part4Percentage) {
x.factors = this.appraisalPms.part4Percentage
} else if (x.id == 5 && this.appraisalPms?.part5Percentage) {
x.factors = this.appraisalPms.part5Percentage
} else if (x.id == 6 && this.appraisalPms?.part6Percentage) {
x.factors = this.appraisalPms.part6Percentage
} else if (x.id == 7 && this.appraisalPms?.part7Percentage) {
x.factors = this.appraisalPms.part7Percentage
}
})
if (!this.appraisalPms?.part1Detail.length) {
this.data8List = this.data8List.filter(item => item.id !== 1)
}
if (!this.appraisalPms?.part2Detail.length) {
this.data8List = this.data8List.filter(item => item.id !== 2)
}
if (!this.appraisalPms?.part3Detail.length) {
this.data8List = this.data8List.filter(item => item.id !== 3)
}
if (!this.appraisalPms?.part4Detail.length) {
this.data8List = this.data8List.filter(item => item.id !== 4)
}
if (!this.appraisalPms?.part5Detail.length) {
this.data8List = this.data8List.filter(item => item.id !== 5)
}
if (!this.appraisalPms?.part6Detail.length) {
this.data8List = this.data8List.filter(item => item.id !== 6)
}
if (!this.appraisalPms?.part7Detail.length) {
this.data8List = this.data8List.filter(item => item.id !== 7)
}
this.changePercentage()
if (this.appraisalPms) {
switch (this.currentStep) {
case ("0"): {
this.appraisalPms.apsassessyDate = this.dateIso
break
}
case ("1"): {
this.appraisalPms.apsapprove1Date = this.dateIso
break
}
case ("2"): {
this.appraisalPms.apsapprove2Date = this.dateIso
break
}
case ("3"): {
this.appraisalPms.apsapprove3Date = this.dateIso
break
}
case ("4"): {
this.appraisalPms.apsapprove4Date = this.dateIso
break
}
case ("5"): {
this.appraisalPms.apsapprove5Date = this.dateIso
break
}
default: { return }
}
}
this.cdr.detectChanges()
} }
getPmsGroupGradeList() { getPmsGroupGradeList() {
this.groupGrade.loading = true this.groupGrade.loading = true
this.pmsGroupGradeService.getGradeList().subscribe({ this.pmsGroupGradeService.getGradeList().subscribe({
...@@ -335,162 +412,7 @@ export class PmsKpiComponent { ...@@ -335,162 +412,7 @@ export class PmsKpiComponent {
return date?.toLocaleDateString('th-TH', { day: 'numeric', month: 'long', year: 'numeric' }) || '' return date?.toLocaleDateString('th-TH', { day: 'numeric', month: 'long', year: 'numeric' }) || ''
} }
save(status: 'approve' | 'noApprove' | 'draft') {
let title = ''
let text = ''
let confirmButtonText = ''
let approveStatus = '0'
if (status == 'draft') {
title = 'บันทึกแบบร่าง'
text = 'คุณต้องการบันทึกแบบร่างของการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการบันทึก'
approveStatus = '1'
} else if (status == 'approve') {
approveStatus = '2'
if (this.appraisalPms?.checkStep == '0') {
title = 'ยืนยันข้อมูล'
text = 'คุณต้องการยืนยันข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการบันทึก'
} else {
title == 'อนุมัติ'
text = 'คุณต้องการอนุมัติข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการอนุมัติ'
}
} else if (status == 'noApprove') {
approveStatus = '0'
title == 'ไม่อนุมัติ'
text = 'คุณต้องการไม่อนุมัติข้อมูลการประเมินนี้ใช่หรือไม่'
confirmButtonText = 'ยืนยันการไม่อนุมัติ'
}
Swal.fire({
iconHtml: `
<div class="flex items-center justify-center rounded-full !h-80px !w-80px" style="background-color: #E8F8EE;">
<svg width="39" height="39" viewBox="0 0 39 39" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="39" height="39" fill="#D2D2D2"/>
<g id="Component">
<g id="alert cart">
<g id="mdi:file-export">
<circle cx="22.5" cy="19.5" r="33.5" fill="#E8F8EE"/>
<path d="M9.75 3.25C8.88805 3.25 8.0614 3.59241 7.4519 4.2019C6.84241 4.8114 6.5 5.63805 6.5 6.5V32.5C6.5 33.362 6.84241 34.1886 7.4519 34.7981C8.0614 35.4076 8.88805 35.75 9.75 35.75H29.25C30.112 35.75 30.9386 35.4076 31.5481 34.7981C32.1576 34.1886 32.5 33.362 32.5 32.5V13L22.75 3.25M21.125 5.6875L30.0625 14.625H21.125M14.5113 19.8575H26V31.3463L22.555 27.9013L17.9563 32.5L13.3575 27.9013L17.9563 23.3188"
fill="#1DBE5A"/>
</g>
</g>
</g>
</svg>
</div>
`,
title: title,
text: text,
showCancelButton: true,
confirmButtonText: confirmButtonText,
cancelButtonText: 'ย้อนกลับ',
customClass: {
title: '!swal2-title-mt-20px',
actions: '!swal2-actions-mt-20px',
icon: '!swal2-icon-no-border',
confirmButton: '!swal2-button-bg-green',
cancelButton: '!swal2-button-bg-gray',
},
}).then((result) => {
if (result.isConfirmed && this.appraisalPms) {
this.saveApi(approveStatus)
} else if (result.dismiss === Swal.DismissReason.cancel) {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
})
}
})
}
saveApi(approveStatus: string) {
let body = this.appraisalPms
switch (this.appraisalPms?.currentStep) {
case ("0"): {
body = {
...this.appraisalPms,
apsassessyStatus: approveStatus
}
break
}
case ("1"): {
body = {
...this.appraisalPms,
apsapprove1Status: approveStatus
}
break
}
case ("2"): {
body = {
...this.appraisalPms,
apsapprove1Status: approveStatus == '0' ? approveStatus : this.appraisalPms.apsapprove1Status,
apsapprove2Status: approveStatus
}
break
}
case ("3"): {
body = {
...this.appraisalPms,
apsapprove2Status: approveStatus == '0' ? approveStatus : this.appraisalPms.apsapprove2Status,
apsapprove3Status: approveStatus
}
break
}
case ("4"): {
body = {
...this.appraisalPms,
apsapprove3Status: approveStatus == '0' ? approveStatus : this.appraisalPms.apsapprove3Status,
apsapprove4Status: approveStatus
}
break
}
case ("5"): {
body = {
...this.appraisalPms,
apsapprove4Status: approveStatus == '0' ? approveStatus : this.appraisalPms.apsapprove4Status,
apsapprove5Status: approveStatus
}
break
}
default: { return }
}
this.appraisalService.postPms(body).subscribe({
next: response => {
if (response.success) {
Swal.fire({
title: 'บันทึกสำเร็จ!',
text: 'การประเมินของคุณถูกบันทึกแล้ว',
icon: 'success',
customClass: {
confirmButton: '!swal2-button-bg-green',
}
});
} else {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
});
}
}, error: error => {
Swal.fire({
title: 'ยกเลิก!',
text: 'การบันทึกถูกยกเลิก',
icon: 'error',
customClass: {
confirmButton: '!swal2-button-bg-danger',
}
});
}
})
}
toggleAllParts(check: boolean) { toggleAllParts(check: boolean) {
this.part1show = check this.part1show = check
...@@ -514,4 +436,70 @@ export class PmsKpiComponent { ...@@ -514,4 +436,70 @@ export class PmsKpiComponent {
}); });
} }
part1Remain() {
if (this.appraisalPms?.part1Detail.length) {
const remain = this.appraisalPms.part1Detail.filter(x =>
x.scoreTopicExpectation == null && x.scoreTopicExpectationBoss == null
).length
return remain
}
return 2
}
part2Remain() {
if (this.appraisalPms?.part2Detail.length) {
const remain = this.appraisalPms.part2Detail.filter(x =>
x.scoreTopicExpectation == null && x.scoreTopicExpectationBoss == null
).length
return remain
}
return 0
}
part3Remain() {
if (this.appraisalPms?.part3Detail.length) {
const remain = this.appraisalPms.part3Detail.filter(x =>
x.scoreTopicExpectation == null && x.scoreTopicExpectationBoss == null
).length
return remain
}
return 0
}
part5Remain() {
if (this.appraisalPms?.part5Detail.length) {
const remain = this.appraisalPms.part5Detail.filter(x =>
x.pmsWorkingTimScore == null && x.pmsWorkingTimScoreBoss == null
).length
return remain
}
return 0
}
part6Remain() {
if (this.appraisalPms?.part6Detail.length) {
const remain = this.appraisalPms.part6Detail.filter(x =>
x.scoreTopicExpectation == null && x.scoreTopicExpectationBoss == null
).length
return remain
}
return 0
}
part7Remain() {
if (this.appraisalPms?.part7Detail.length) {
const remain = this.appraisalPms.part7Detail.filter(x =>
x.scoreTopicExpectation == null && x.scoreTopicExpectationBoss == null
).length
return remain
}
return 0
}
allFormRemain() {
const remain = [this.part1Remain(), this.part2Remain(), this.part3Remain(), this.part5Remain(), this.part6Remain(), this.part7Remain()].filter(data => data != 0).length
this.kpiForm.emit(this.appraisalPms)
this.kpiFormRemain.emit(remain)
}
} }
...@@ -108,10 +108,7 @@ ...@@ -108,10 +108,7 @@
<div class="flex justify-center"> <div class="flex justify-center">
<button type="button" class="ti-btn rounded-sm " <button type="button" class="ti-btn rounded-sm "
*ngFor="let type of item.typeList" *ngFor="let type of item.typeList"
[class.ti-btn-soft-mute]="type.statusType == 'Not_evaluating_yet'" [class]="statusButtonClass(item.statusPms.statusType)"
[class.ti-btn-soft-secondary]="type.statusType == 'Boss'"
[class.ti-btn-soft-warning]="type.statusType == 'BossEvaluating'"
[class.ti-btn-soft-success]="type.statusType == 'Boss_finish'"
style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;" style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;"
(click)="selectSubordinate(item,type.competencyTypeId,subordinate.select?.evaluationRoundId);pageEvalution=type.shortName"> (click)="selectSubordinate(item,type.competencyTypeId,subordinate.select?.evaluationRoundId);pageEvalution=type.shortName">
{{type.shortName}} {{type.shortName}}
...@@ -121,10 +118,7 @@ ...@@ -121,10 +118,7 @@
<td class="text-center"> <td class="text-center">
<div class="flex justify-center"> <div class="flex justify-center">
<button type="button" class="ti-btn rounded-sm" <button type="button" class="ti-btn rounded-sm"
[class.ti-btn-soft-mute]="item.statusIdp.statusType == 'Not_evaluating_yet'" [class]="statusButtonClass(item.statusPms.statusType)"
[class.ti-btn-soft-secondary]="item.statusIdp.statusType == 'Boss'"
[class.ti-btn-soft-warning]="item.statusIdp.statusType == 'BossEvaluating'"
[class.ti-btn-soft-success]="item.statusIdp.statusType == 'Boss_finish'"
style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;" style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;"
(click)="selectSubordinate(item,'',subordinate.select?.evaluationRoundId,item.statusIdp.statusType);pageEvalution='idp'"> (click)="selectSubordinate(item,'',subordinate.select?.evaluationRoundId,item.statusIdp.statusType);pageEvalution='idp'">
IDP IDP
...@@ -133,11 +127,8 @@ ...@@ -133,11 +127,8 @@
</td> </td>
<td class="text-center" *ngIf="subordinate.select?.showPms"> <td class="text-center" *ngIf="subordinate.select?.showPms">
<div class="flex justify-center" *ngIf="item.statusPms"> <div class="flex justify-center" *ngIf="item.statusPms">
<button type="button" class="ti-btn rounded-sm ti-btn-soft-mute" <button type="button" class="ti-btn rounded-sm"
[class.ti-btn-soft-mute]="item.statusPms.statusType == 'Not_evaluating_yet'" [class]="statusButtonClass(item.statusPms.statusType)"
[class.ti-btn-soft-secondary]="item.statusPms.statusType == 'Boss'"
[class.ti-btn-soft-warning]="item.statusPms.statusType == 'BossEvaluating'"
[class.ti-btn-soft-success]="item.statusPms.statusType == 'Boss_finish'"
style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;" style="height: 15px; width: 45px; font-size: 12px; display: flex; align-items: center; justify-content: center;margin-left:4px;"
(click)="selectSubordinate(item,'',subordinate.select?.evaluationRoundId,item.statusPms.statusType);pageEvalution='pms'"> (click)="selectSubordinate(item,'',subordinate.select?.evaluationRoundId,item.statusPms.statusType);pageEvalution='pms'">
PMS PMS
......
...@@ -23,7 +23,21 @@ export class SupervisorEvaluationComponent { ...@@ -23,7 +23,21 @@ export class SupervisorEvaluationComponent {
allCompetencyTypeId: <TypeList[]>[], allCompetencyTypeId: <TypeList[]>[],
masfromStatusType: "" masfromStatusType: ""
} }
statusButtonClass = (status: string) => {
if (status === "no access") {
return "ti-btn-soft-mute"
} else if (status === "pending") {
return "ti-btn-soft-secondary"
} else if (status === "evaluating") {
return "ti-btn-soft-warning"
} else if (status === "completed") {
return "ti-btn-soft-success"
} else if (status === "rejected") {
return "ti-btn-soft-danger"
} else {
return ""
}
}
constructor(private appraisalService: AppraisalService, constructor(private appraisalService: AppraisalService,
private cdr: ChangeDetectorRef) { private cdr: ChangeDetectorRef) {
} }
......
...@@ -3,9 +3,34 @@ export interface CompetencyModel { ...@@ -3,9 +3,34 @@ export interface CompetencyModel {
idp: Idp idp: Idp
pms: Pms pms: Pms
statusAll: StatusAll statusAll: StatusAll
evaluationRoundId: string, evaluationRoundId: string
tdesc: string, tdesc: string
edesc: string, edesc: string
apsassessy: ApsEmp
apsapprove1: ApsEmp
apsapprove2: ApsEmp
apsapprove3: ApsEmp
apsapprove4: ApsEmp
apsapprove5: ApsEmp
currentStep: string
statusType: string
stepReturn: string
commentAll: CommentAll[]
}
export interface ApsEmp {
employeeId: string
status: string
thFullName: string
enFullName: string
}
export interface CommentAll {
commentDate: string
currentStep: string
statusType: string
comment: string
createdBy: string
thFullName: string
engFullName: string
} }
export interface Competency { export interface Competency {
......
...@@ -19,6 +19,9 @@ export class AppraisalService { ...@@ -19,6 +19,9 @@ export class AppraisalService {
getCompentencyAll(apsassessy: string, bossId?: string): Observable<CompetencyModel[]> { getCompentencyAll(apsassessy: string, bossId?: string): Observable<CompetencyModel[]> {
return this.http.get<CompetencyModel[]>(this.urlApi + "/competencyAll/emp?apsassessy=" + apsassessy + (bossId ? "&bossId=" + bossId : '')) return this.http.get<CompetencyModel[]>(this.urlApi + "/competencyAll/emp?apsassessy=" + apsassessy + (bossId ? "&bossId=" + bossId : ''))
} }
postCompentencyAll(body: CompetencyModel): Observable<AlertModel> {
return this.http.post<AlertModel>(this.urlApi + "/appraisalcompetencyAll/emp", body)
}
getFormCompentencyById(evaluationRoundId: string, apsassessy: string, typeId: string): Observable<AppraisalCompentencyModel2> { getFormCompentencyById(evaluationRoundId: string, apsassessy: string, typeId: string): Observable<AppraisalCompentencyModel2> {
return this.http.get<AppraisalCompentencyModel2>(this.urlApi + "/competency/" + evaluationRoundId + "/" + apsassessy + "/" + typeId) return this.http.get<AppraisalCompentencyModel2>(this.urlApi + "/competency/" + evaluationRoundId + "/" + apsassessy + "/" + typeId)
} }
......
...@@ -25046,5 +25046,23 @@ div:where(.swal2-container) div:where(.swal2-validation-message) { ...@@ -25046,5 +25046,23 @@ div:where(.swal2-container) div:where(.swal2-validation-message) {
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
max-width: 100% max-width: 100%;
} }
\ No newline at end of file
.rounded-circle {
border-radius: 50%;
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
overflow: hidden;
}
.bg-mute {
background-color: #cccccc;
}
.\!bg-mute {
background-color: #cccccc !important;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment