Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
myAppraisal
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
angular
myAppraisal
Commits
f7c9eb37
Commit
f7c9eb37
authored
Mar 10, 2025
by
Nattana Chaiyamat
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
การจัดการหัวข้อการประเมินเวลาทำงาน
parent
56fbcd85
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
499 additions
and
91 deletions
+499
-91
dashboard.module.ts
src/app/components/dashboard/dashboard.module.ts
+2
-0
time-attendance.component.html
...evaluation/time-attendance/time-attendance.component.html
+114
-50
time-attendance.component.ts
...t-evaluation/time-attendance/time-attendance.component.ts
+110
-41
emeventgrp.model.ts
src/app/shared/model/emeventgrp.model.ts
+156
-0
pms-working-time.model.ts
src/app/shared/model/pms-working-time.model.ts
+82
-0
pms-working-time.service.ts
src/app/shared/services/pms-working-time.service.ts
+35
-0
No files found.
src/app/components/dashboard/dashboard.module.ts
View file @
f7c9eb37
...
...
@@ -156,6 +156,7 @@ import { EventgrpService } from 'src/app/shared/services/eventgrp.service';
import
{
PmsEvaluationCycleService
}
from
'src/app/shared/services/pms-evaluation-cycle.service'
;
import
{
PmsEvaluationAssessmentService
}
from
'src/app/shared/services/pms-evaluation-assessment.service'
;
import
{
TimeAttendanceComponent
}
from
'../performance-management-evaluation/time-attendance/time-attendance.component'
;
import
{
PmsWorkingTimeService
}
from
'src/app/shared/services/pms-working-time.service'
;
export
const
MY_DATE_FORMATS
=
{
parse
:
{
...
...
@@ -342,6 +343,7 @@ export class CustomDateAdapter extends NativeDateAdapter {
EventgrpService
,
PmsEvaluationCycleService
,
PmsEvaluationAssessmentService
,
PmsWorkingTimeService
,
{
provide
:
HTTP_INTERCEPTORS
,
useClass
:
HttpRequestInterceptor
,
...
...
src/app/components/performance-management-evaluation/time-attendance/time-attendance.component.html
View file @
f7c9eb37
...
...
@@ -95,29 +95,45 @@
</ng-container>
</tr>
</thead>
<tbody
*
ngIf=
"!dataListFilter().length"
>
<tbody
*
ngIf=
"pmsWorkingTime.loading"
>
<tr>
<td
class=
"text-center"
colspan=
"100%"
>
<div
*
ngFor=
"let item of [1,2,3]"
class=
"ti-spinner w-8 h-8 text-secondary mx-1"
role=
"status"
aria-label=
"loading"
>
<span
class=
"sr-only"
>
Loading...
</span>
</div>
</td>
</tr>
</tbody>
<tbody
*
ngIf=
"!pmsWorkingTime.loading&&!pmsWorkingTimeFilter().length"
>
<tr>
<td
class=
"text-center"
colspan=
"100%"
>
ไม่พบข้อมูล
</td>
</tr>
</tbody>
<tbody
*
ngIf=
"
dataList
Filter().length"
>
<tbody
*
ngIf=
"
!pmsWorkingTime.loading&&pmsWorkingTime
Filter().length"
>
<tr
*
ngFor=
"let item of
dataList
Filter() | slice:((currentPage-1) * 10) : (((currentPage-1) * 10) + 10);let i = index"
>
<
!-- <
td class="text-center">
*
ngFor=
"let item of
pmsWorkingTime
Filter() | slice:((currentPage-1) * 10) : (((currentPage-1) * 10) + 10);let i = index"
>
<td
class=
"text-center"
>
<input
type=
"checkbox"
class=
"ti-form-checkbox cursor-pointer"
[(
ngModel
)]="
item
.
check
"
(ngModelChange)="dataListCheck()" id="checkbox-{{item.
code
}}">
(
ngModelChange
)="
dataListCheck
()"
id=
"checkbox-{{item.
data.pmsWorkingTimeId
}}"
>
</td>
<td
class=
"text-center"
>
<label for="checkbox-{{item.code}}"> {{item.code}}</label>
<label
for=
"checkbox-{{item.data.pmsWorkingTimeId}}"
>
{{item.data.pmsWorkingTimeId}}
</label>
</td>
<td>{{item.tdesc}}</td>
<td>{{item.edesc}}</td>
<td>
{{item.data.tdesc}}
</td>
<td>
{{item.data.detailUnit}}
</td>
<td>
{{item.data.weight}}
</td>
<td
class=
"flex justify-center"
>
<i class="ti ti-edit cursor-pointer i-gray fs-l px-1" (click)="modalStatus='edit';selectData(item)"></i>
<i class="ti ti-trash cursor-pointer i-gray fs-l px-1" (click)="modalStatus='delete';selectData(item)"></i>
</td> -->
<i
class=
"ti ti-edit cursor-pointer i-gray fs-l px-1"
data-hs-overlay=
"#time-attendance-modal"
(
click
)="
modalStatus=
'edit'
;
selectData
(
item
.
data
)"
></i>
<i
class=
"ti ti-trash cursor-pointer i-gray fs-l px-1"
data-hs-overlay=
"#time-attendance-alert-modal"
(
click
)="
modalStatus=
'delete'
;
selectData
(
item
.
data
)"
></i>
</td>
</tr>
</tbody>
</table>
...
...
@@ -154,9 +170,10 @@
</li>
</ul>
<ul
class=
"nav-tabs mt-3"
>
<span>
Show {{((currentPage-1) * 10)+1}} to {{dataListFilter().length
<10
?
dataListFilter
().
length:
(
currentPage=
=page.length
?
((
currentPage
*
10
)
-
((
currentPage
*
10
)
-
dataListFilter
().
length
)
)
:
(
currentPage
*
10
)
)
}}
of
{{
dataListFilter
().
length
}}
items
</
span
>
<span>
Show {{((currentPage-1) * 10)+1}} to {{pmsWorkingTimeFilter().length
<10
?
pmsWorkingTimeFilter
().
length:
(
currentPage=
=page.length
?
((
currentPage
*
10
)
-
((
currentPage
*
10
)
-
pmsWorkingTimeFilter
().
length
)
)
:
(
currentPage
*
10
)
)
}}
of
{{
pmsWorkingTimeFilter
().
length
}}
items
</
span
>
</ul>
</nav>
</div>
...
...
@@ -209,97 +226,143 @@
<div
class=
"ti-modal-body padding-16px pt-0 overflow-y-0"
>
<label
class=
"ti-form-label mt-2rem"
>
รหัสประเภทวัน
<span
class=
"text-danger"
>
*
</span></label>
<input
type=
"text"
class=
"ti-form-input w-1/2"
[
ngClass
]="{'
bg-input-readonly
'
:modalStatus=
='edit'}"
[
readonly
]="
modalStatus=
='edit'"
>
[
readonly
]="
modalStatus=
='edit'"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
pmsWorkingTimeId
"
>
<label
class=
"ti-form-label mt-2rem"
>
รหัสประเภทวัน
<span
class=
"text-danger"
>
*
</span></label>
<div
*
ngFor=
"let item of eventgrp.selectList; let i=index;let f=first"
[
class
.
mt-2
]="!
f
"
class=
"col-span-6 sm:col-span-6 "
>
<div
class=
"flex"
>
<div
class=
"relative flex rounded-sm w-2/3"
>
<input
type=
"text"
name=
"hs-leading-button-add-on-with-icon-and-button"
class=
"ti-form-input rounded-sm ltr:rounded-r-sm rtl:rounded-l-sm focus:z-10"
readonly
style=
"padding-right: 2.5rem;"
[(
ngModel
)]="
item
.
tdesc
"
>
<div
*
ngFor=
"let item of pmsWorkingTime.select.emeventgrp;let i = index;let f=first;let l = last"
class=
"grid grid-cols-2"
>
<div
class=
"col-span-1"
>
<div
class=
"flex relative"
>
<input
type=
"text"
class=
"ti-form-input pointer-events-none"
readonly
[
ngClass
]="{'
input-list-f1
'
:
f
&&!
l
,
'
input-list-c1
'
:
!
f
&&!
l
,
'
input-list-l1
'
:
!
f
&&
l
,
'
input-list-fl1
'
:
f
&&
l
}"
[(
ngModel
)]="
item
.
eventgrpId
"
>
<div
[
ngClass
]="{'
input-list-line-f
'
:
f
&&!
l
,
'
input-list-line-c
'
:
!
f
&&!
l
,
'
input-list-line-l
'
:
!
f
&&
l
,
'
input-list-line-fl
'
:
f
&&
l
}"
>
<div
class=
"input-list-line"
></div>
</div>
<input
type=
"text"
class=
"ti-form-input pointer-events-none"
readonly
[
ngClass
]="{'
input-list-f2
'
:
f
&&!
l
,
'
input-list-c2
'
:
!
f
&&!
l
,
'
input-list-l2
'
:
!
f
&&
l
,
'
input-list-fl2
'
:
f
&&
l
}"
[(
ngModel
)]="
item
.
tdesc
"
>
<div
class=
"absolute inset-y-0 ltr:right-0 rtl:left-0 flex items-center z-20 ltr:pr-4 rtl:pl-4 space-x-2"
>
<button
type=
"button"
class=
"flex items-center text-red-500"
<button
*
ngIf=
"item.eventgrpId"
type=
"button"
class=
"flex items-center text-red-500"
(
click
)="
eventgrp
.
selectIndex=
i;selectEventgrp()"
>
<i
class=
"ti ti-circle-x cursor-pointer"
></i>
</button>
<button
type=
"button"
class=
"flex items-center text-gray-500 dark:text-white/70"
data-hs-overlay=
"#time-attendance-eventgrp-table-modal"
(
click
)="
eventgrp
.
selectIndex=
i"
>
<i
class=
"ri-search-line cursor-pointer text-gray"
></i>
</button>
</div>
</div>
</div>
<div
class=
"col-span-1 ml-1"
*
ngIf=
"f"
>
<ng-component
*
ngTemplateOutlet=
"emeventgrpSearchButton"
></ng-component>
</div>
</div>
<div
class=
"grid grid-cols-2"
*
ngIf=
"!pmsWorkingTime.select.emeventgrp.length"
>
<div
class=
"col-span-1"
>
<div
class=
"flex relative"
>
<input
type=
"text"
class=
"ti-form-input input-list-fl1 pointer-events-none"
readonly
>
<div
class=
"input-list-line-fl"
>
<div
class=
"input-list-line"
></div>
</div>
<input
type=
"text"
class=
"ti-form-input input-list-fl2 pointer-events-none"
readonly
>
</div>
</div>
<div
class=
"col-span-1 ml-1"
>
<ng-component
*
ngTemplateOutlet=
"emeventgrpSearchButton"
></ng-component>
</div>
</div>
<ng-template
#
emeventgrpSearchButton
>
<button
type=
"button"
class=
"hs-dropdown-toggle ti-btn ti-border font-medium bg-white text-gray-700 shadow-sm align-middle hover:bg-gray-50 focus:ring-offset-white focus:ring-primary !m-0 h-full"
style=
"height: 44.8px !important;"
(
click
)="
modal
.
search=
''
;
modalSearchChange
(
eventgrpListFilter
())"
data-hs-overlay=
"#time-attendance-eventgrp-table-modal"
>
<i
class=
"ri-search-line cursor-pointer text-gray"
></i>
</button>
</ng-template>
<label
class=
"ti-form-label mt-2rem"
>
ชื่อหัวข้อ (ไทย)
<span
class=
"text-danger"
>
*
</span></label>
<input
type=
"text"
class=
"ti-form-input"
>
<input
type=
"text"
class=
"ti-form-input"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
tdesc
"
>
<label
class=
"ti-form-label mt-2rem"
>
ชื่อหัวข้อ (อังกฤษ)
</label>
<input
type=
"text"
class=
"ti-form-input"
>
<input
type=
"text"
class=
"ti-form-input"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
edesc
"
>
<label
class=
"ti-form-label mt-2rem"
>
เป้าหมายผลงาน
</label>
<input
type=
"text"
class=
"ti-form-input"
>
<input
type=
"text"
class=
"ti-form-input"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
weight
"
>
<label
class=
"ti-form-label mt-2rem"
>
น้ำหนัก
</label>
<input
type=
"text"
class=
"ti-form-input"
>
<input
type=
"text"
class=
"ti-form-input"
oninput=
"this.value = this.value.replace(/[^\d.]/g, '').replace(/(\..*?)\..*/g, '$1').replace(/(\..*?)(\d{2})./g, '$1$2');"
onchange=
"this.value = this.value.replace('', '0');this.value = parseFloat(this.value).toFixed(2)"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
weight
"
>
<label
class=
"ti-form-label mt-2rem"
>
ค่าเป้าหมาย
</label>
<div
class=
"grid grid-cols-1 gap-y-2"
>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
A (5 คะแนน) ชื่อ
</label>
<input
type=
"text"
class=
"ti-form-input col-span-10"
>
<input
type=
"text"
class=
"ti-form-input col-span-10"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
targetADetail
"
>
</div>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
เงื่อนไข ช่วงระหว่าง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionAMin
"
>
<label
class=
"ti-form-label col-span-1 align-center text-center m-0"
>
ถึง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionAMax
"
>
</div>
</div>
<div
class=
"grid grid-cols-1 gap-y-2 mt-2rem"
>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
B (4 คะแนน) ชื่อ
</label>
<input
type=
"text"
class=
"ti-form-input col-span-10"
>
<input
type=
"text"
class=
"ti-form-input col-span-10"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
targetBDetail
"
>
</div>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
เงื่อนไข ช่วงระหว่าง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionBMin
"
>
<label
class=
"ti-form-label col-span-1 align-center text-center m-0"
>
ถึง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionBMax
"
>
</div>
</div>
<div
class=
"grid grid-cols-1 gap-y-2 mt-2rem"
>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
C (3 คะแนน) ชื่อ
</label>
<input
type=
"text"
class=
"ti-form-input col-span-10"
>
<input
type=
"text"
class=
"ti-form-input col-span-10"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
targetCDetail
"
>
</div>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
เงื่อนไข ช่วงระหว่าง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionCMin
"
>
<label
class=
"ti-form-label col-span-1 align-center text-center m-0"
>
ถึง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionCMax
"
>
</div>
</div>
<div
class=
"grid grid-cols-1 gap-y-2 mt-2rem"
>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
D (2 คะแนน) ชื่อ
</label>
<input
type=
"text"
class=
"ti-form-input col-span-10"
>
<input
type=
"text"
class=
"ti-form-input col-span-10"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
targetDDetail
"
>
</div>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
เงื่อนไข ช่วงระหว่าง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionDMin
"
>
<label
class=
"ti-form-label col-span-1 align-center text-center m-0"
>
ถึง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionDMax
"
>
</div>
</div>
<div
class=
"grid grid-cols-1 gap-y-2 mt-2rem"
>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
E (1 คะแนน) ชื่อ
</label>
<input
type=
"text"
class=
"ti-form-input col-span-10"
>
<input
type=
"text"
class=
"ti-form-input col-span-10"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
targetEDetail
"
>
</div>
<div
class=
"col-span-1 grid grid-cols-12 gap-x-2"
>
<label
class=
"ti-form-label col-span-2 align-center m-0"
>
เงื่อนไข ช่วงระหว่าง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionEMin
"
>
<label
class=
"ti-form-label col-span-1 align-center text-center m-0"
>
ถึง
</label>
<input
type=
"text"
class=
"ti-form-input col-span-2"
>
<input
type=
"text"
class=
"ti-form-input col-span-2"
[(
ngModel
)]="
pmsWorkingTime
.
select
.
conditionEMax
"
>
</div>
</div>
<div
class=
"flex justify-end mt-2rem mb-1rem"
>
...
...
@@ -309,7 +372,8 @@
ย้อนกลับ
</button>
<button
type=
"button"
class=
"ti-btn ti-btn-success"
data-hs-overlay=
"#time-attendance-alert-modal"
[
class
.
ti-btn-disabled
]="
false
"
[
disabled
]="
false
"
>
[
class
.
ti-btn-disabled
]="!
pmsWorkingTime
.
select
.
pmsWorkingTimeId
||!
pmsWorkingTime
.
select
.
emeventgrp
.
length
||!
pmsWorkingTime
.
select
.
tdesc
"
[
disabled
]="!
pmsWorkingTime
.
select
.
pmsWorkingTimeId
||!
pmsWorkingTime
.
select
.
emeventgrp
.
length
||!
pmsWorkingTime
.
select
.
tdesc
"
>
บันทึกข้อมูล
</button>
</div>
...
...
@@ -360,7 +424,7 @@
ย้อนกลับ
</button>
<a
class=
"ti-btn ti-btn-success"
href=
"javascript:void(0);"
data-hs-overlay=
"#time-attendance-alert-modal"
>
data-hs-overlay=
"#time-attendance-alert-modal"
(
click
)="
updatePmsWorkingTime
()"
>
บันทึกข้อมูล
</a>
</ng-container>
...
...
@@ -371,7 +435,7 @@
ย้อนกลับ
</button>
<a
class=
"ti-btn ti-btn-danger"
href=
"javascript:void(0);"
data-hs-overlay=
"#time-attendance-alert-modal"
>
data-hs-overlay=
"#time-attendance-alert-modal"
(
click
)="
deletePmsWorkingTime
()"
>
ลบข้อมูล
</a>
</ng-container>
...
...
src/app/components/performance-management-evaluation/time-attendance/time-attendance.component.ts
View file @
f7c9eb37
import
{
ChangeDetectorRef
,
Component
}
from
'@angular/core'
;
import
{
ToastrService
}
from
'ngx-toastr'
;
import
{
EventgrpModel
,
MyEventgrpModel
}
from
'src/app/shared/model/eventgrp.model'
;
import
{
MyEmeventgrpModel
}
from
'src/app/shared/model/emeventgrp.model'
;
import
{
EventgrpModel
,
MyEventgrpModel
,
}
from
'src/app/shared/model/eventgrp.model'
;
import
{
PmsWorkingTimeModel
,
MyPmsWorkingTimeModel
}
from
'src/app/shared/model/pms-working-time.model'
;
import
{
EventgrpService
}
from
'src/app/shared/services/eventgrp.service'
;
import
{
FileService
}
from
'src/app/shared/services/file.service'
;
import
{
PmsWorkingTimeService
}
from
'src/app/shared/services/pms-working-time.service'
;
interface
table
{
currentPage
:
number
,
page
:
number
[],
...
...
@@ -31,16 +34,66 @@ export class TimeAttendanceComponent {
eventgrp
:
{
loading
:
boolean
,
selectIndex
:
number
,
selectList
:
EventgrpModel
[],
dataList
:
{
check
:
boolean
,
data
:
EventgrpModel
}[]
}
=
{
loading
:
false
,
selectIndex
:
-
1
,
selectList
:
[
new
MyEventgrpModel
()],
dataList
:
[]
}
pmsWorkingTime
:
{
loading
:
boolean
,
select
:
PmsWorkingTimeModel
,
dataList
:
{
check
:
boolean
,
data
:
PmsWorkingTimeModel
}[]
}
=
{
loading
:
false
,
select
:
new
MyPmsWorkingTimeModel
(),
dataList
:
[]
}
constructor
(
private
toastr
:
ToastrService
,
private
cdr
:
ChangeDetectorRef
,
private
fileService
:
FileService
,
private
eventgrpService
:
EventgrpService
private
eventgrpService
:
EventgrpService
,
private
pmsWorkingTimeService
:
PmsWorkingTimeService
,
)
{
}
ngOnInit
():
void
{
this
.
getEventgrpList
()
this
.
getPmsWorkingTimeList
()
}
getPmsWorkingTimeList
()
{
this
.
pmsWorkingTime
.
loading
=
true
this
.
pmsWorkingTimeService
.
getList
().
subscribe
({
next
:
response
=>
{
this
.
pmsWorkingTime
.
dataList
=
response
.
map
(
x
=>
({
check
:
false
,
data
:
new
MyPmsWorkingTimeModel
(
x
)
}))
this
.
pmsWorkingTime
.
loading
=
false
this
.
isDataListCheckedAll
=
false
this
.
dataListCheckAll
()
this
.
searchChange
()
this
.
cdr
.
detectChanges
();
},
error
:
error
=>
{
this
.
pmsWorkingTime
.
loading
=
false
this
.
cdr
.
detectChanges
()
}
})
}
pmsWorkingTimeFilter
()
{
return
this
.
pmsWorkingTime
.
dataList
.
filter
((
x
)
=>
{
const
data
=
x
.
data
const
match
=
data
.
pmsWorkingTimeId
.
toLowerCase
().
includes
(
this
.
search
.
toLowerCase
())
||
data
.
tdesc
.
toLowerCase
().
includes
(
this
.
search
.
toLowerCase
())
||
data
.
detailUnit
.
toLowerCase
().
includes
(
this
.
search
.
toLowerCase
())
||
(
data
.
weight
+
""
).
toLowerCase
().
includes
(
this
.
search
.
toLowerCase
())
return
match
;
});
}
searchChange
()
{
this
.
currentPage
=
1
;
const
filteredData
=
this
.
pmsWorkingTimeFilter
();
this
.
page
=
Array
.
from
({
length
:
Math
.
ceil
(
filteredData
.
length
/
10
)
},
(
_
,
i
)
=>
i
+
1
);
this
.
dataListCheck
();
}
selectData
(
data
?:
PmsWorkingTimeModel
)
{
this
.
pmsWorkingTime
.
select
=
new
MyPmsWorkingTimeModel
(
data
)
}
dataListCheckAll
()
{
const
selectAll
=
this
.
isDataListCheckedAll
;
this
.
pmsWorkingTimeFilter
().
forEach
(
x
=>
x
.
check
=
selectAll
);
this
.
dataListCheck
();
}
dataListCheck
()
{
const
dataCheck
=
this
.
pmsWorkingTimeFilter
();
this
.
isDataListCheckedAll
=
dataCheck
.
length
?
dataCheck
.
every
(
x
=>
x
.
check
)
:
false
;
this
.
numDataListChecked
=
this
.
pmsWorkingTime
.
dataList
.
filter
(
x
=>
x
.
check
).
length
;
this
.
isDataListChecked
=
Boolean
(
this
.
numDataListChecked
)
}
getEventgrpList
()
{
this
.
eventgrp
.
loading
=
true
this
.
eventgrpService
.
getList
().
subscribe
({
...
...
@@ -66,53 +119,18 @@ export class TimeAttendanceComponent {
}
selectEventgrp
(
data
?:
EventgrpModel
)
{
if
(
!
data
)
{
this
.
eventgrp
.
selectList
.
splice
(
this
.
eventgrp
.
selectIndex
,
1
);
this
.
pmsWorkingTime
.
select
.
emeventgrp
.
splice
(
this
.
eventgrp
.
selectIndex
,
1
);
return
;
}
this
.
eventgrp
.
selectList
[
this
.
eventgrp
.
selectIndex
]
=
new
MyEventgrpModel
(
data
);
if
(
this
.
eventgrp
.
selectIndex
===
this
.
eventgrp
.
selectList
.
length
-
1
)
{
this
.
eventgrp
.
selectList
.
push
(
new
MyEventgrpModel
());
}
}
dataListFilter
()
{
// return this.pmsGrade.dataList.filter((x) => {
// const data = x.data
// const match = data.gradeId.toLowerCase().includes(this.search.toLowerCase()) || data.tdesc.toLowerCase().includes(this.search.toLowerCase()) || data.edesc.toLowerCase().includes(this.search.toLowerCase());
// return match;
// });
return
[]
}
dataListCheckAll
()
{
// const selectAll = this.isDataListCheckedAll;
// this.dataListFilter().forEach(x => x.check = selectAll);
// this.dataListCheck();
this
.
pmsWorkingTime
.
select
.
emeventgrp
.
push
(
new
MyEmeventgrpModel
(
data
))
}
dataListCheck
()
{
// const dataCheck = this.dataListFilter();
// this.isDataListCheckedAll = dataCheck.length ? dataCheck.every(x => x.check) : false;
// this.numDataListChecked = this.pmsGrade.dataList.filter(x => x.check).length;
// this.isDataListChecked = Boolean(this.numDataListChecked)
}
searchChange
()
{
this
.
currentPage
=
1
;
const
filteredData
=
this
.
dataListFilter
();
this
.
page
=
Array
.
from
({
length
:
Math
.
ceil
(
filteredData
.
length
/
10
)
},
(
_
,
i
)
=>
i
+
1
);
this
.
dataListCheck
();
}
selectData
()
{
}
clearData
(
modalStatus
:
string
)
{
if
(
modalStatus
==
'add'
)
{
this
.
pmsWorkingTime
.
select
=
new
MyPmsWorkingTimeModel
()
}
else
if
(
modalStatus
==
'edit'
)
{
this
.
pmsWorkingTime
.
select
=
new
MyPmsWorkingTimeModel
({
pmsWorkingTimeId
:
this
.
pmsWorkingTime
.
select
.
pmsWorkingTimeId
})
}
this
.
eventgrp
.
selectList
=
[
new
MyEventgrpModel
()]
}
...
...
@@ -121,4 +139,55 @@ export class TimeAttendanceComponent {
this
.
modal
.
currentPage
=
1
this
.
modal
.
page
=
Array
.
from
({
length
:
Math
.
ceil
(
dataList
.
length
/
10
)
},
(
_
,
i
)
=>
i
+
1
);
}
updatePmsWorkingTime
()
{
this
.
pmsWorkingTime
.
loading
=
true
this
.
pmsWorkingTimeService
.
post
(
new
MyPmsWorkingTimeModel
(
this
.
pmsWorkingTime
.
select
)).
subscribe
({
next
:
response
=>
{
if
(
response
.
success
)
{
this
.
showAlert
(
response
.
message
,
'success'
)
this
.
getPmsWorkingTimeList
()
this
.
searchChange
()
}
else
{
this
.
showAlert
(
response
.
message
,
'error'
)
this
.
pmsWorkingTime
.
loading
=
false
}
this
.
cdr
.
detectChanges
()
},
error
:
error
=>
{
this
.
showAlert
(
error
.
message
,
'error'
)
this
.
pmsWorkingTime
.
loading
=
false
this
.
cdr
.
detectChanges
()
}
})
}
deletePmsWorkingTime
()
{
let
body
:
PmsWorkingTimeModel
[]
=
[]
if
(
this
.
modalStatus
==
"deleteGroup"
)
{
body
=
this
.
pmsWorkingTime
.
dataList
.
filter
(
x
=>
x
.
check
).
map
(
x
=>
new
MyPmsWorkingTimeModel
(
x
.
data
))
}
else
{
body
=
[
new
MyPmsWorkingTimeModel
(
this
.
pmsWorkingTime
.
select
)]
}
this
.
pmsWorkingTime
.
loading
=
true
this
.
pmsWorkingTimeService
.
delete
(
body
).
subscribe
({
next
:
response
=>
{
if
(
response
.
success
)
{
this
.
showAlert
(
response
.
message
,
'success'
)
this
.
getPmsWorkingTimeList
()
}
else
{
this
.
showAlert
(
response
.
message
,
'error'
)
this
.
pmsWorkingTime
.
loading
=
false
this
.
cdr
.
detectChanges
()
}
},
error
:
error
=>
{
this
.
showAlert
(
error
.
message
,
'error'
)
this
.
pmsWorkingTime
.
loading
=
false
this
.
cdr
.
detectChanges
()
}
})
}
showAlert
(
text
:
string
,
type
:
'success'
|
'error'
)
{
this
.
toastr
[
type
](
text
,
'แจ้งเตือน'
,
{
timeOut
:
3000
,
positionClass
:
'toast-top-right'
,
})
}
}
src/app/shared/model/emeventgrp.model.ts
0 → 100644
View file @
f7c9eb37
export
interface
EmeventgrpModel
{
eventgrpId
:
string
companyId
:
string
tdesc
:
string
edesc
:
string
event_status
:
number
limits
:
number
daytype
:
string
datebeforerequest
:
number
service_year
:
number
limit_times
:
number
clear_leave
:
number
privilege_event
:
string
limit_probation
:
number
sex_type
:
string
guarantee
:
string
guarantee_date
:
number
remarks
:
string
display_order
:
number
display
:
number
displayEss
:
number
event_desc
:
string
display_limit
:
number
lvpastlimit
:
number
lvfuturelimit
:
number
day_leave_stat
:
number
fhalf_leave_stat
:
number
shalf_leave_stat
:
number
hour_leave_stat
:
number
month_limit0
:
number
month_limit1
:
number
month_limit2
:
number
month_limit3
:
number
leaverounding
:
string
clear_leave_month
:
number
limit_hours
:
string
sharelimit_event
:
string
needapprovedate
:
number
min_limit_hours
:
string
advance_approve
:
string
approve_before
:
number
approve_after
:
number
tsdesc
:
string
esdesc
:
string
dctsal
:
string
dctsvc
:
string
prev_last
:
string
yos
:
string
ispay
:
number
limit_per_request
:
number
}
export
class
MyEmeventgrpModel
implements
EmeventgrpModel
{
eventgrpId
:
string
companyId
:
string
tdesc
:
string
edesc
:
string
event_status
:
number
limits
:
number
daytype
:
string
datebeforerequest
:
number
service_year
:
number
limit_times
:
number
clear_leave
:
number
privilege_event
:
string
limit_probation
:
number
sex_type
:
string
guarantee
:
string
guarantee_date
:
number
remarks
:
string
display_order
:
number
display
:
number
displayEss
:
number
event_desc
:
string
display_limit
:
number
lvpastlimit
:
number
lvfuturelimit
:
number
day_leave_stat
:
number
fhalf_leave_stat
:
number
shalf_leave_stat
:
number
hour_leave_stat
:
number
month_limit0
:
number
month_limit1
:
number
month_limit2
:
number
month_limit3
:
number
leaverounding
:
string
clear_leave_month
:
number
limit_hours
:
string
sharelimit_event
:
string
needapprovedate
:
number
min_limit_hours
:
string
advance_approve
:
string
approve_before
:
number
approve_after
:
number
tsdesc
:
string
esdesc
:
string
dctsal
:
string
dctsvc
:
string
prev_last
:
string
yos
:
string
ispay
:
number
limit_per_request
:
number
constructor
(
data
?:
Partial
<
EmeventgrpModel
>
)
{
this
.
eventgrpId
=
data
?.
eventgrpId
||
""
this
.
companyId
=
data
?.
companyId
||
""
this
.
tdesc
=
data
?.
tdesc
||
""
this
.
edesc
=
data
?.
edesc
||
""
this
.
event_status
=
data
?.
event_status
??
0
this
.
limits
=
data
?.
limits
??
0
this
.
daytype
=
data
?.
daytype
||
""
this
.
datebeforerequest
=
data
?.
datebeforerequest
??
0
this
.
service_year
=
data
?.
service_year
??
0
this
.
limit_times
=
data
?.
limit_times
??
0
this
.
clear_leave
=
data
?.
clear_leave
??
0
this
.
privilege_event
=
data
?.
privilege_event
||
""
this
.
limit_probation
=
data
?.
limit_probation
??
0
this
.
sex_type
=
data
?.
sex_type
||
""
this
.
guarantee
=
data
?.
guarantee
||
""
this
.
guarantee_date
=
data
?.
guarantee_date
??
0
this
.
remarks
=
data
?.
remarks
||
""
this
.
display_order
=
data
?.
display_order
??
0
this
.
display
=
data
?.
display
??
0
this
.
displayEss
=
data
?.
displayEss
??
0
this
.
event_desc
=
data
?.
event_desc
||
""
this
.
display_limit
=
data
?.
display_limit
??
0
this
.
lvpastlimit
=
data
?.
lvpastlimit
??
0
this
.
lvfuturelimit
=
data
?.
lvfuturelimit
??
0
this
.
day_leave_stat
=
data
?.
day_leave_stat
??
0
this
.
fhalf_leave_stat
=
data
?.
fhalf_leave_stat
??
0
this
.
shalf_leave_stat
=
data
?.
shalf_leave_stat
??
0
this
.
hour_leave_stat
=
data
?.
hour_leave_stat
??
0
this
.
month_limit0
=
data
?.
month_limit0
??
0
this
.
month_limit1
=
data
?.
month_limit1
??
0
this
.
month_limit2
=
data
?.
month_limit2
??
0
this
.
month_limit3
=
data
?.
month_limit3
??
0
this
.
leaverounding
=
data
?.
leaverounding
||
""
this
.
clear_leave_month
=
data
?.
clear_leave_month
??
0
this
.
limit_hours
=
data
?.
limit_hours
||
""
this
.
sharelimit_event
=
data
?.
sharelimit_event
||
""
this
.
needapprovedate
=
data
?.
needapprovedate
??
0
this
.
min_limit_hours
=
data
?.
min_limit_hours
||
""
this
.
advance_approve
=
data
?.
advance_approve
||
""
this
.
approve_before
=
data
?.
approve_before
??
0
this
.
approve_after
=
data
?.
approve_after
??
0
this
.
tsdesc
=
data
?.
tsdesc
||
""
this
.
esdesc
=
data
?.
esdesc
||
""
this
.
dctsal
=
data
?.
dctsal
||
""
this
.
dctsvc
=
data
?.
dctsvc
||
""
this
.
prev_last
=
data
?.
prev_last
||
""
this
.
yos
=
data
?.
yos
||
""
this
.
ispay
=
data
?.
ispay
??
0
this
.
limit_per_request
=
data
?.
limit_per_request
??
0
}
}
src/app/shared/model/pms-working-time.model.ts
0 → 100644
View file @
f7c9eb37
import
{
EmeventgrpModel
,
MyEmeventgrpModel
}
from
"./emeventgrp.model"
export
interface
PmsWorkingTimeModel
{
pmsWorkingTimeId
:
string
companyId
:
string
meventgrpId
:
string
tdesc
:
string
edesc
:
string
weight
:
number
detailUnit
:
string
performanceTargets
:
string
targetADetail
:
string
conditionAMin
:
string
conditionAMax
:
string
targetBDetail
:
string
conditionBMin
:
string
conditionBMax
:
string
targetCDetail
:
string
conditionCMin
:
string
conditionCMax
:
string
targetDDetail
:
string
conditionDMin
:
string
conditionDMax
:
string
targetEDetail
:
string
conditionEMin
:
string
conditionEMax
:
string
emeventgrp
:
EmeventgrpModel
[]
}
export
class
MyPmsWorkingTimeModel
implements
PmsWorkingTimeModel
{
pmsWorkingTimeId
:
string
companyId
:
string
meventgrpId
:
string
tdesc
:
string
edesc
:
string
weight
:
number
detailUnit
:
string
performanceTargets
:
string
targetADetail
:
string
conditionAMin
:
string
conditionAMax
:
string
targetBDetail
:
string
conditionBMin
:
string
conditionBMax
:
string
targetCDetail
:
string
conditionCMin
:
string
conditionCMax
:
string
targetDDetail
:
string
conditionDMin
:
string
conditionDMax
:
string
targetEDetail
:
string
conditionEMin
:
string
conditionEMax
:
string
emeventgrp
:
EmeventgrpModel
[]
constructor
(
data
?:
Partial
<
PmsWorkingTimeModel
>
)
{
this
.
pmsWorkingTimeId
=
data
?.
pmsWorkingTimeId
||
""
this
.
companyId
=
data
?.
companyId
||
""
this
.
meventgrpId
=
data
?.
meventgrpId
||
""
this
.
tdesc
=
data
?.
tdesc
||
""
this
.
edesc
=
data
?.
edesc
||
""
this
.
weight
=
data
?.
weight
??
0
this
.
detailUnit
=
data
?.
detailUnit
||
""
this
.
performanceTargets
=
data
?.
performanceTargets
||
""
this
.
targetADetail
=
data
?.
targetADetail
||
""
this
.
conditionAMin
=
data
?.
conditionAMin
||
""
this
.
conditionAMax
=
data
?.
conditionAMax
||
""
this
.
targetBDetail
=
data
?.
targetBDetail
||
""
this
.
conditionBMin
=
data
?.
conditionBMin
||
""
this
.
conditionBMax
=
data
?.
conditionBMax
||
""
this
.
targetCDetail
=
data
?.
targetCDetail
||
""
this
.
conditionCMin
=
data
?.
conditionCMin
||
""
this
.
conditionCMax
=
data
?.
conditionCMax
||
""
this
.
targetDDetail
=
data
?.
targetDDetail
||
""
this
.
conditionDMin
=
data
?.
conditionDMin
||
""
this
.
conditionDMax
=
data
?.
conditionDMax
||
""
this
.
targetEDetail
=
data
?.
targetEDetail
||
""
this
.
conditionEMin
=
data
?.
conditionEMin
||
""
this
.
conditionEMax
=
data
?.
conditionEMax
||
""
this
.
emeventgrp
=
data
?.
emeventgrp
?.
map
(
x
=>
new
MyEmeventgrpModel
(
x
))
||
[]
}
}
src/app/shared/services/pms-working-time.service.ts
0 → 100644
View file @
f7c9eb37
import
{
HttpClient
,
HttpHeaders
}
from
'@angular/common/http'
;
import
{
Injectable
}
from
'@angular/core'
;
import
{
Observable
}
from
'rxjs'
;
import
{
environment
}
from
'src/environments/environment'
;
import
{
AlertModel
}
from
'../model/alert.model'
;
import
{
PmsWorkingTimeModel
}
from
'../model/pms-working-time.model'
;
@
Injectable
({
providedIn
:
'root'
})
export
class
PmsWorkingTimeService
{
api
=
"/pms-working-time"
urlApi
=
environment
.
baseUrl
+
this
.
api
constructor
(
private
http
:
HttpClient
)
{
}
getById
(
pmsWorkingTimeId
:
string
):
Observable
<
PmsWorkingTimeModel
>
{
return
this
.
http
.
get
<
PmsWorkingTimeModel
>
(
this
.
urlApi
+
"/"
+
pmsWorkingTimeId
)
}
getList
():
Observable
<
PmsWorkingTimeModel
[]
>
{
return
this
.
http
.
get
<
PmsWorkingTimeModel
[]
>
(
this
.
urlApi
+
"/lists"
)
}
post
(
body
:
PmsWorkingTimeModel
):
Observable
<
AlertModel
>
{
return
this
.
http
.
post
<
AlertModel
>
(
this
.
urlApi
,
body
)
}
delete
(
body
:
PmsWorkingTimeModel
[]):
Observable
<
AlertModel
>
{
const
options
=
{
headers
:
new
HttpHeaders
({
"Content-Type"
:
"application/json"
,
}),
body
:
body
};
return
this
.
http
.
delete
<
AlertModel
>
(
this
.
urlApi
,
options
)
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment