Commit 897a1cdb by sawit

เพิ่มทะเบียนตำแหน่ง

parent 81cfe32e
...@@ -46,6 +46,11 @@ export const admin: Routes = [ ...@@ -46,6 +46,11 @@ export const admin: Routes = [
loadComponent: () => loadComponent: () =>
import('./admin-manage/admin-manage.component').then((m) => m.AdminManageComponent), import('./admin-manage/admin-manage.component').then((m) => m.AdminManageComponent),
}, },
{
path: 'position',
loadComponent: () =>
import('./company-department/company-position/company-position.component').then((m) => m.CompanyPositionComponent),
},
//////////////emp///////////////// //////////////emp/////////////////
{ {
path: 'emp/department', path: 'emp/department',
...@@ -56,7 +61,8 @@ export const admin: Routes = [ ...@@ -56,7 +61,8 @@ export const admin: Routes = [
path: 'emp/position', path: 'emp/position',
loadComponent: () => loadComponent: () =>
import('./employee/position/position.component').then((m) => m.PositionComponent), import('./employee/position/position.component').then((m) => m.PositionComponent),
} },
] ]
} }
]; ];
......
import { Component, ElementRef, ViewChild } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
import { Router, RouterModule } from '@angular/router';
import { SharedModule } from '../../../../shared/shared.module';
import { TranslateModule, TranslateService } from '@ngx-translate/core';
import swal from 'sweetalert';
import { MatPaginator } from '@angular/material/paginator';
import { FormsModule } from '@angular/forms';
import { NgSelectModule } from '@ng-select/ng-select';
import { CommonModule } from '@angular/common';
import { FileUploadModule } from 'ng2-file-upload';
import { FileItem, FileUploader, ParsedResponseHeaders } from "ng2-file-upload";
import { environment } from '../../../../../environments/environment';
import { TokenService } from '../../../../shared/services/token.service'
import { QuillModule } from 'ngx-quill';
import { MatDialog, MatDialogModule } from '@angular/material/dialog';
import { CompanyPositionService } from '../../../services/company-position.service';
import { CompanyPositionModel } from '../../../models/company-position.model';
@Component({
selector: 'app-company-position',
standalone: true,
imports: [
CommonModule,
SharedModule,
TranslateModule,
NgSelectModule,
FormsModule,
MatPaginator,
RouterModule,
FileUploadModule,
QuillModule,
MatDialogModule
],
templateUrl: './company-position.component.html',
styleUrl: './company-position.component.css',
})
export class CompanyPositionComponent {
quillConfig = {
toolbar: [
['link'], // เพิ่มปุ่มลิงก์
['bold', 'italic', 'underline', 'strike'], // toggled buttons
['blockquote', 'code-block'],
[{ 'header': 1 }, { 'header': 2 }], // custom button values
[{ 'list': 'ordered' }, { 'list': 'bullet' }],
[{ 'script': 'sub' }, { 'script': 'super' }], // superscript/subscript
[{ 'indent': '-1' }, { 'indent': '+1' }], // outdent/indent
[{ 'direction': 'rtl' }], // text direction
[{ 'size': ['small', false, 'large', 'huge'] }], // custom dropdown
[{ 'header': [1, 2, 3, 4, 5, 6, false] }],
[{ 'color': [] }, { 'background': [] }], // dropdown with defaults from theme
[{ 'align': [] }],
['clean'], // remove formatting button
]
};
@ViewChild('closeModal') public childModal?: ElementRef;
@ViewChild('modalDetail') public modalDetail?: ElementRef;
@ViewChild("CompanyPositionModel") CompanyPositionModel: any;
@ViewChild('profileChangeInput') profileChangeInputRef!: ElementRef;
dialogRef: any
currentContentTab: number = 1;
currentExcerptTab: number = 1;
action = "new";
allSelected = false;
someSelected = false;
itemsList: CompanyPositionModel[] = [];
filterList: CompanyPositionModel[] = [];
selectModel: CompanyPositionModel = new CompanyPositionModel();
selectedItems = new Map<string, boolean>();
// empList: CompanyPositionModel[] = [];
// descName = 'engName';
pageIndex = 0;
uploaderProfile: FileUploader | undefined;
uploadErrorMsg: string = "";
modalStatus: "add" | "edit" = "add"
get searchTerm(): string {
return this._searchTerm;
}
set searchTerm(val: string) {
this.pageIndex = 0;
this.allSelected = false;
this._searchTerm = val;
if (val != '') {
this.filterList = this.filter(val);
} else {
this.updatePagedItems();
}
}
_searchTerm = "";
constructor(
private compositionservice: CompanyPositionService,
public translate: TranslateService,
private tokenService: TokenService,
private router: Router,
private dialog: MatDialog,
) {
}
getPosition() {
this.compositionservice.getList().subscribe({
next: (response: CompanyPositionModel[]) => {
this.itemsList = response.map((x: any) => new CompanyPositionModel(x, this.translate));
console.log('ข้อมูลตำแหน่ง (itemsList)', this.itemsList);
this.updatePagedItems();
},
error: (error) => {
console.error('error cant get position', error);
swal("ข้อผิดพลาด", "ไม่สามารถดึงข้อมูลตำแหน่งได้", "error");
}
});
}
ngOnInit(): void {
this.getPosition();
}
filter(v: string) {
return this.itemsList?.filter(
(x) =>
x.positionId?.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.thName?.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.engName?.toLowerCase().indexOf(v.toLowerCase()) !== -1 ||
x.remark?.toLowerCase().indexOf(v.toLowerCase()) !== -1
// x.getStatus().toLowerCase().indexOf(v.toLowerCase()) !== -1
);
}
delete(item: CompanyPositionModel) {
swal({
title: "คุณแน่ใจหรือไม่?",
text: "คุณจะไม่สามารถกู้คืนข้อมูลนี้ได้!",
icon: "warning",
dangerMode: true,
buttons: ["ยกเลิก", "ใช่, ลบเลย!"],
})
.then((willDelete: any) => {
if (willDelete) {
const newPosition = new CompanyPositionModel(item)
this.compositionservice.deletePosition(newPosition).subscribe(result => {
swal("ลบสำเร็จ!!", "ลบข้อมูลสำเร็จ", "success");
this.ngOnInit();
}, error => {
console.error("เกิดข้อผิดพลาดในการลบ:", error);
swal("ข้อผิดพลาด!!", "ไม่สามารถลบข้อมูลได้", "error");
});
}
});
}
new() {
this.action = 'add';
this.selectModel = new CompanyPositionModel();
// this.selectModel.status = 1;
this.selectModel.positionId = "";
this.selectModel.thName = "";
this.selectModel.engName = "";
this.selectModel.remark = "";
}
view(item: CompanyPositionModel) {
this.action = 'edit';
this.selectModel = new CompanyPositionModel(item);
console.log(this.selectModel);
}
save() {
console.log('Before Save, selectModel is:', this.selectModel);
swal({
title: "คุณแน่ใจหรือไม่?",
text: "คุณต้องการบันทึกหรือไม่",
icon: "warning",
dangerMode: false,
buttons: ["ยกเลิก", "ยืนยัน"],
})
.then((willSave: any) => {
if (willSave) {
this.compositionservice.postPosition(this.selectModel).subscribe(result => {
console.log(result);
swal("บันทึกสำเร็จ!!", "บันทึกข้อมูลสมาชิก", "success");
this.ngOnInit();
this.childModal?.nativeElement.click();
}, error => {
console.error("เกิดข้อผิดพลาดในการบันทึก/อัปเดต:", error);
swal("ข้อผิดพลาด!!", "ไม่สามารถบันทึก/อัปเดตข้อมูลได้", "error");
});
}
});
}
updatePagedItems() {
const startIndex = this.pageIndex * 10;
const endIndex = startIndex + 10;
this.filterList = this.itemsList.slice(startIndex, endIndex);
}
toggleAll(event: any) {
this.allSelected = event.target.checked;
this.selectedItems.clear();
this.itemsList.forEach(item => {
this.selectedItems.set(item.positionId, this.allSelected);
});
this.someSelected = this.itemsList.some(item => this.selectedItems.get(item.positionId));
}
onCheckboxChange(positionId: string) {
const isSelected = this.selectedItems.get(positionId) || false;
this.selectedItems.set(positionId, !isSelected);
this.allSelected = this.itemsList.every(item => this.selectedItems.get(item.positionId));
this.someSelected = this.itemsList.some(item => this.selectedItems.get(item.positionId));
}
deleteSelect() {
let employeeInfo = '';
this.selectedItems.forEach((isSelected, positionId) => {
if (isSelected) {
const user = this.itemsList.find(user => user.positionId === positionId);
if (user) {
employeeInfo += `${this.translate.instant('thName')}: ${user.thName}\n`;
}
}
});
swal({
title: "Are you sure?",
text: employeeInfo,
icon: "warning",
dangerMode: true,
buttons: ["Cancel", "Yes, Delete it!"],
})
.then((willDelete: any) => {
if (willDelete) {
this.selectedItems.forEach((isSelected, positionId) => {
if (isSelected) {
const user = this.itemsList.find(user => user.positionId === positionId);
if (user) {
const newPosition = new CompanyPositionModel(user)
this.compositionservice.deletePosition(newPosition).subscribe(result => {
swal("Save Success!!", "บันทึกข้อมูลสำเร็จ", "success");
this.ngOnInit();
});
}
}
});
}
});
}
// openDialog() {
// this.dialogRef = this.dialog.open(this.CompanyPositionModel, {
// width: '1100px',
// disableClose: false,
// });
// }
// closeDialog() {
// this.dialogRef.close()
// }
}
import { TranslateService } from "@ngx-translate/core"
import { BaseModel } from "./base.model"
export interface CompanyPositionModel {
positionId: string
thName: string
engName: string
remark: string
}
export class CompanyPositionModel extends BaseModel implements CompanyPositionModel {
positionId: string
thName: string
engName: string
remark: string
constructor(data?: Partial<CompanyPositionModel>, translateService?: TranslateService) {
super(data, translateService)
this.positionId = data?.positionId!
this.thName = data?.thName!
this.engName = data?.engName!
this.remark = data?.remark!
}
}
\ No newline at end of file
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from "../../../environments/environment";
import { CompanyModelS } from '../models/companys.mode';
import { CompanyPositionModel } from '../models/company-position.model';
@Injectable({
providedIn: 'root'
})
export class CompanyPositionService {
api = "/position"
urlApi = environment.baseUrl + "/position"
constructor(private http: HttpClient) { }
getById(positionId: string): Observable<CompanyPositionModel> {
return this.http.get<CompanyPositionModel>(this.urlApi + "/" + positionId)
}
getList(): Observable<CompanyPositionModel[]> {
return this.http.get<CompanyPositionModel[]>(this.urlApi + "/list")
}
postPosition(body: CompanyPositionModel): Observable<any> {
return this.http.post(this.urlApi, body)
}
deletePosition(body: CompanyPositionModel) {
const options = {
headers: new HttpHeaders({
"Content-Type": "application/json",
}),
body: body,
};
return this.http.delete(this.urlApi, options)
}
deletePositionById(positionId: string) {
const options = {
headers: new HttpHeaders({
"Content-Type": "application/json",
}),
body: {positionId : positionId},
};
return this.http.delete(this.urlApi, options)
}
}
<!-- Footer Start --> <!-- Footer Start -->
<footer class="footer mt-auto xl:ps-[15rem] font-normal font-inter bg-white text-defaultsize leading-normal text-[0.813] shadow-[0_0_0.4rem_rgba(0,0,0,0.1)] dark:bg-bodybg py-4 text-center"> <footer class="footer mt-auto xl:ps-[15rem] font-normal font-inter bg-white text-defaultsize leading-normal text-[0.813] shadow-[0_0_0.4rem_rgba(0,0,0,0.1)] dark:bg-bodybg py-4 text-center">
<div class="container"> <div class="container">
<span class="text-gray dark:text-defaulttextcolor/50"> Copyright © <span id="year">2024</span> <a <span class="text-gray dark:text-defaulttextcolor/50"> Copyright © <span id="year">2025</span> <a
href="javascript:void(0);" class="text-defaulttextcolor font-semibold dark:text-defaulttextcolor"> Final Project(DPU)</a>. href="https://www.myhr.co.th/" class="text-defaulttextcolor font-semibold dark:text-defaulttextcolor">, myHR Corporation Limited.</a>
Designed with <span class="bi bi-heart-fill text-danger"></span> by <a href="javascript:void(0);">
<span class="font-semibold text-primary underline">Oh'Ao Chanachai</span>
</a> All
rights
reserved
</span> </span>
</div> </div>
</footer> </footer>
......
...@@ -129,6 +129,7 @@ export class NavService implements OnDestroy { ...@@ -129,6 +129,7 @@ export class NavService implements OnDestroy {
type: 'sub', type: 'sub',
children: [ children: [
{ path: '/company-departments/company-info', title: 'ข้อมูลบริษัท', type: 'link' }, { path: '/company-departments/company-info', title: 'ข้อมูลบริษัท', type: 'link' },
{ path: '/admin/position', title: 'ทะเบียนตำแหน่ง', type: 'link' },
], ],
}, },
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
"Division": "Division", "Division": "Division",
"Section": "Section", "Section": "Section",
"Position": "Position", "Position": "Position",
"PositionId": "PositionId",
"Employee Management": "Employee Management", "Employee Management": "Employee Management",
"Please fill in information": "Please fill in information", "Please fill in information": "Please fill in information",
"Employee ID": "Employee ID", "Employee ID": "Employee ID",
...@@ -90,5 +91,7 @@ ...@@ -90,5 +91,7 @@
"Surname(Eng)":"Surname(Eng)", "Surname(Eng)":"Surname(Eng)",
"Name-Surname(Thai)":"Name-Surname(Thai)", "Name-Surname(Thai)":"Name-Surname(Thai)",
"Name-Surname(Eng)":"Name-Surname(Eng)", "Name-Surname(Eng)":"Name-Surname(Eng)",
"Add Version":"Add Version" "Add Version":"Add Version",
"Remark":"Remark",
"Position Information":"Position Information"
} }
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
"Division": "ฝ่าย", "Division": "ฝ่าย",
"Section": "ส่วน", "Section": "ส่วน",
"Position": "ตำแหน่ง", "Position": "ตำแหน่ง",
"PositionId": "รหัสตำแหน่ง",
"Employee Management": "จัดการพนักงาน", "Employee Management": "จัดการพนักงาน",
"Please fill in information": "กรุณากรอกข้อมูล", "Please fill in information": "กรุณากรอกข้อมูล",
"Employee ID": "รหัสพนักงาน", "Employee ID": "รหัสพนักงาน",
...@@ -90,5 +91,7 @@ ...@@ -90,5 +91,7 @@
"Surname(Eng)":"นามสกุล(อังกฤษ)", "Surname(Eng)":"นามสกุล(อังกฤษ)",
"Name-Surname(Thai)":"ชื่อ-นามสกุล(ไทย)", "Name-Surname(Thai)":"ชื่อ-นามสกุล(ไทย)",
"Name-Surname(Eng)":"ชื่อ-นามสกุล(อังกฤษ)", "Name-Surname(Eng)":"ชื่อ-นามสกุล(อังกฤษ)",
"Add Version":"สร้างเวอร์ชั่น" "Add Version":"สร้างเวอร์ชั่น",
"Remark":"หมายเหตุ",
"Position Information":"ข้อมูลตำแหน่ง"
} }
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