Commit 59123c4f by Nattana Chaiyamat

ทะเบียนกำหนดชื่อ

parent c0bed3aa
...@@ -39,7 +39,8 @@ ...@@ -39,7 +39,8 @@
</div> </div>
<div class="px-1"> <div class="px-1">
<button type="button" class="ti-btn ti-btn-soft-secondary h-10 m-0 shadow-md" <button type="button" class="ti-btn ti-btn-soft-secondary h-10 m-0 shadow-md"
data-hs-overlay="#competency-topic-page-modal" (click)="modalStatus='add';setData()"> data-hs-overlay="#competency-topic-page-modal"
(click)="modalStatus='add';setData();fileInputMedium.value = '';examFile=null;examFileName = 'กรุณาเลือกไฟล์'">
<i class="ri-add-line"></i> <i class="ri-add-line"></i>
Add Add
</button> </button>
...@@ -234,24 +235,30 @@ ...@@ -234,24 +235,30 @@
</div> </div>
</div> </div>
<label class="ti-form-label mt-2rem">แนบไฟล์ข้อสอบ</label> <label class="ti-form-label mt-2rem">แนบไฟล์ข้อสอบ</label>
<div>
<div class="flex rounded-md"> <div class="flex rounded-md">
<label for="file-input-medium" class="sr-only">อัปโหลดไฟล์</label> <label class="sr-only">อัปโหลดไฟล์</label>
<input type="file" id="file-input-medium" name="file-input-medium" <input #fileInputMedium id="fileInputMedium" type="file" (change)="onExamSelected($event)" hidden>
class="block w-full border border-gray-200 focus:shadow-sm dark:focus:shadow-white/10 ltr:rounded-l-md rtl:rounded-r-none text-sm focus:z-10 focus:outline-0 focus:border-gray-200 dark:focus:border-white/10 dark:border-white/10 dark:text-white/70 file:border-0 file:bg-gray-100 ltr:file:mr-4 rtl:file:ml-4 file:py-3 file:px-4 dark:file:bg-black/20 dark:file:text-white/70"> <input type="text" [value]="examFileName" readonly onclick="fileInputMedium.click();"
class=" cursor-pointer block w-full border border-gray-200 focus:shadow-sm dark:focus:shadow-white/10 ltr:rounded-l-md rtl:rounded-r-none text-sm focus:z-10 focus:outline-0 focus:border-gray-200 dark:focus:border-white/10 dark:border-white/10 dark:text-white/70 file:border-0 file:bg-gray-100 ltr:file:mr-4 rtl:file:ml-4 file:py-3 file:px-4 dark:file:bg-black/20 dark:file:text-white/70">
<span <span
class="px-4 inline-flex items-center min-w-fit ltr:rounded-r-md rtl:rounded-l-none border ltr:border-l-0 rtl:border-r-0 border-gray-200 bg-gray-50 text-sm dark:bg-black/20 dark:border-white/10"> class="px-4 inline-flex items-center min-w-fit ltr:rounded-r-md rtl:rounded-l-none border ltr:border-l-0 rtl:border-r-0 border-gray-200 bg-gray-50 text-sm dark:bg-black/20 dark:border-white/10">
<button class="text-sm text-gray-500 dark:text-white/70" <button class="text-sm text-gray-500 dark:text-white/70"
onclick="document.getElementById('file-input-medium').click();">Browse</button> onclick="fileInputMedium.click();">Browse</button>
</span> </span>
<div class="flex items-center ml-2"> <div class="flex items-center ml-2">
<button href="javascript:void(0);" <button href="javascript:void(0);"
class="ti-btn ti-btn-soft-danger h-10px m-0 shadow-md rounded-md"> class="ti-btn ti-btn-soft-danger h-10px m-0 shadow-md rounded-md"
(click)="fileInputMedium.value = '';examFile=null;examFileName = 'กรุณาเลือกไฟล์'">
<i class="ri-delete-bin-6-line"></i> <i class="ri-delete-bin-6-line"></i>
Delete Delete
</button> </button>
</div> </div>
</div> </div>
<div class="flex" *ngIf="examFileName==dataSelect.file">
<h1 class="cursor-pointer justify-center -mb-px inline-flex items-center gap-2 font-weight-500 font-size-12px
text-center text-secondary border-secondary border-b-2 align-items-end"
(click)="dowloadExam(examFileName)">
ดาวน์โหลดไฟล์ข้อสอบ</h1>
</div> </div>
<div class="flex justify-end mt-3rem mb-1rem space-x-4"> <div class="flex justify-end mt-3rem mb-1rem space-x-4">
<button type="button" <button type="button"
......
...@@ -12,6 +12,7 @@ export interface DataModel { ...@@ -12,6 +12,7 @@ export interface DataModel {
code: string code: string
definition: string definition: string
type: DataModel2 type: DataModel2
file: string
checked: boolean checked: boolean
} }
export interface DataModel2 { export interface DataModel2 {
...@@ -50,13 +51,15 @@ export class CompetencyTopic { ...@@ -50,13 +51,15 @@ export class CompetencyTopic {
currentModal = ""; currentModal = "";
dataLoading = false dataLoading = false
dataSelectList: DataModel[] = []; dataSelectList: DataModel[] = [];
dataSelect: DataModel = { id: "", name: "", edesc: "", code: "", definition: "", type: { id: "", name: "", edesc: "", code: "", level: "" }, checked: false } dataSelect: DataModel = { id: "", name: "", edesc: "", code: "", definition: "", file: "", type: { id: "", name: "", edesc: "", code: "", level: "" }, checked: false }
competencytypeListLoading = false competencytypeListLoading = false
competencytypeList: DataModel2[] = [] competencytypeList: DataModel2[] = []
competoncyTopicList: { check: boolean; data: DataModel & { checked?: boolean } }[] = [] competoncyTopicList: { check: boolean; data: DataModel & { checked?: boolean } }[] = []
modalStatus = 'add' modalStatus = 'add'
selectedFile: File | null = null; selectedFile: File | null = null;
selectedFileName: string = 'กรุณาเลือกไฟล์'; selectedFileName: string = 'กรุณาเลือกไฟล์';
examFile: File | null = null;
examFileName: string = 'กรุณาเลือกไฟล์';
selectedItems: string[] = []; selectedItems: string[] = [];
...@@ -74,6 +77,53 @@ export class CompetencyTopic { ...@@ -74,6 +77,53 @@ export class CompetencyTopic {
this.getCompetencytypeList() this.getCompetencytypeList()
} }
onExamSelected(event: any) {
this.examFile = event.target.files.length > 0 ? event.target.files[0] : null;
this.examFileName = this.examFile?.name || "กรุณาเลือกไฟล์"
console.log(" 🐒 this.examFileName:", this.examFileName)
}
uploadExam() {
if (!this.examFile) {
return
}
const formData = new FormData();
formData.append('file', this.examFile);
this.fileService.uploadFiles(formData).subscribe({
next: response => {
if (response.success) {
this.examFile = null
this.addCompetency_topic(response.resultObject)
} else {
this.showAlert(response.message, 'error')
this.cdr.detectChanges()
}
}, error: error => {
this.showAlert(error.message, 'error')
this.cdr.detectChanges()
}
})
}
dowloadExam(fileName: string) {
this.fileService.dowloadFiles(fileName).subscribe({
next: response => {
const url = window.URL.createObjectURL(response);
const a = document.createElement("a");
a.href = url;
a.download = fileName;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
this.cdr.detectChanges()
}, error: error => {
this.showAlert(error.message, 'error')
this.cdr.detectChanges()
}
})
}
onFileSelected(event: any) { onFileSelected(event: any) {
this.selectedFile = event.target.files.length > 0 ? event.target.files[0] : null; this.selectedFile = event.target.files.length > 0 ? event.target.files[0] : null;
this.selectedFileName = this.selectedFile?.name || "กรุณาเลือกไฟล์" this.selectedFileName = this.selectedFile?.name || "กรุณาเลือกไฟล์"
...@@ -159,7 +209,7 @@ export class CompetencyTopic { ...@@ -159,7 +209,7 @@ export class CompetencyTopic {
next: response => { next: response => {
this.competoncyTopicList = response.map(x => ({ this.competoncyTopicList = response.map(x => ({
check: false, data: { check: false, data: {
id: x.competencyTopicId, name: x.tdesc, edesc: x.edesc, code: x.competencyType.shortName, definition: x.competencyDetail, id: x.competencyTopicId, name: x.tdesc, edesc: x.edesc, code: x.competencyType.shortName, definition: x.competencyDetail, file: x.competencyFiles,
type: { id: x.competencyType.competencyTypeId, name: x.competencyType.tdesc, edesc: x.competencyType.edesc, code: x.competencyType.shortName, level: x.expectationLevel }, type: { id: x.competencyType.competencyTypeId, name: x.competencyType.tdesc, edesc: x.competencyType.edesc, code: x.competencyType.shortName, level: x.expectationLevel },
checked: false checked: false
} }
...@@ -189,14 +239,18 @@ export class CompetencyTopic { ...@@ -189,14 +239,18 @@ export class CompetencyTopic {
}); });
} }
setData(data?: DataModel) { setData(data?: DataModel) {
this.dataSelect = JSON.parse(JSON.stringify(data || { id: "", name: "", edesc: "", code: "", definition: "", type: { id: "", name: "", edesc: "", code: "", level: "" }, checked: false })); this.examFileName = data?.file || 'กรุณาเลือกไฟล์'
this.dataSelect = JSON.parse(JSON.stringify(data || { id: "", name: "", edesc: "", code: "", definition: "", file: "", type: { id: "", name: "", edesc: "", code: "", level: "" }, checked: false }));
} }
// ฟังก์ชันสำหรับการเพิ่ม ลบ หรือแก้ไข ข้อมูล addCompetency_topic(competencyFiles?: string) {
addCompetency_topic() { if (this.examFile) {
this.uploadExam()
} else {
const body = new MyCompetencytopicModel({ const body = new MyCompetencytopicModel({
competencyTopicId: this.dataSelect.id, tdesc: this.dataSelect.name, edesc: this.dataSelect.edesc, competencyDetail: this.dataSelect.definition, competencyTopicId: this.dataSelect.id, tdesc: this.dataSelect.name, edesc: this.dataSelect.edesc, competencyDetail: this.dataSelect.definition,
competencyType: new MyCompetencytypeModel({ competencyTypeId: this.dataSelect.type.id, tdesc: this.dataSelect.type.name, edesc: this.dataSelect.type.edesc, shortName: this.dataSelect.type.code, expectationLevel: this.dataSelect.type.level }), competencyType: new MyCompetencytypeModel({ competencyTypeId: this.dataSelect.type.id, tdesc: this.dataSelect.type.name, edesc: this.dataSelect.type.edesc, shortName: this.dataSelect.type.code, expectationLevel: this.dataSelect.type.level }),
competencyFiles: competencyFiles || ""
}) })
this.dataLoading = true this.dataLoading = true
this.competencytopicService.post(body).subscribe({ this.competencytopicService.post(body).subscribe({
...@@ -217,6 +271,7 @@ export class CompetencyTopic { ...@@ -217,6 +271,7 @@ export class CompetencyTopic {
} }
}) })
} }
}
deleteCompetency_topic() { deleteCompetency_topic() {
let body: any let body: any
if (this.modalStatus == "deleteGroup") { if (this.modalStatus == "deleteGroup") {
...@@ -261,7 +316,7 @@ export class CompetencyTopic { ...@@ -261,7 +316,7 @@ export class CompetencyTopic {
if (modalStatus == 'add') { if (modalStatus == 'add') {
this.setData() this.setData()
} else if (modalStatus == 'edit') { } else if (modalStatus == 'edit') {
this.setData({ id: this.dataSelect.id, name: "", edesc: "", code: "", definition: "", type: { id: "", name: "", edesc: "", code: "", level: "" }, checked: this.dataSelect.checked }) this.setData({ id: this.dataSelect.id, name: "", edesc: "", code: "", definition: "", file: "", type: { id: "", name: "", edesc: "", code: "", level: "" }, checked: this.dataSelect.checked })
} }
} }
......
...@@ -215,7 +215,7 @@ ...@@ -215,7 +215,7 @@
<input type="text" id="detail_eng" class="ti-form-input w-2/3" [(ngModel)]="dataSelect.code"> <input type="text" id="detail_eng" class="ti-form-input w-2/3" [(ngModel)]="dataSelect.code">
<label for="detail_eng" class="ti-form-label mt-1rem">ระดับความคาดหวัง *</label> <label for="detail_eng" class="ti-form-label mt-1rem">ระดับความคาดหวัง *</label>
<input type="text" id="detail_eng" class="ti-form-input" style="width: 200px;" <input type="text" id="detail_eng" class="ti-form-input" style="width: 200px;"
[(ngModel)]="dataSelect.level"> oninput="this.value = this.value.replace(/\D/g, '')" [(ngModel)]="dataSelect.level">
<div class="flex justify-end mt-2rem mb-1rem"> <div class="flex justify-end mt-2rem mb-1rem">
<button type="button" <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 dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10" 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 dark:bg-bgdark dark:hover:bg-black/20 dark:border-white/10 dark:text-white/70 dark:hover:text-white dark:focus:ring-offset-white/10"
......
...@@ -179,6 +179,11 @@ ...@@ -179,6 +179,11 @@
<i class="ti ti-upload"></i> <i class="ti ti-upload"></i>
</button> </button>
</div> </div>
<div class="flex justify-center mt-2rem ">
<h1 class="cursor-pointer justify-center -mb-px inline-flex items-center gap-2 font-weight-500 font-size-12px
text-center text-secondary border-secondary border-b-2 align-items-end" (click)="downloadFile()">
ดาวน์โหลดตัวอย่างไฟล์</h1>
</div>
<div class="flex justify-center mt-2rem mb-1rem space-x-4"> <div class="flex justify-center mt-2rem mb-1rem space-x-4">
<button type="submit" class="ti-btn ti-btn-secondary" <button type="submit" class="ti-btn ti-btn-secondary"
data-hs-overlay="#assessment-tool-upload-modal" [class.ti-btn-disabled]="!selectedFile" data-hs-overlay="#assessment-tool-upload-modal" [class.ti-btn-disabled]="!selectedFile"
......
...@@ -65,6 +65,24 @@ export class AssessmentToolComponent { ...@@ -65,6 +65,24 @@ export class AssessmentToolComponent {
} }
}) })
} }
downloadFile() {
const fileName = '.xlsx'
this.fileService.downloadTemplate(fileName).subscribe({
next: response => {
const url = window.URL.createObjectURL(response);
const a = document.createElement("a");
a.href = url;
a.download = fileName;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, error: error => {
this.showAlert(error.message, 'error')
}
})
}
getAssessmentList() { getAssessmentList() {
this.assessment.loading = true this.assessment.loading = true
this.assessmentService.getList().subscribe({ this.assessmentService.getList().subscribe({
......
...@@ -9,7 +9,12 @@ import { AlertModel } from '../model/alert.model'; ...@@ -9,7 +9,12 @@ import { AlertModel } from '../model/alert.model';
export class FileService { export class FileService {
constructor(private http: HttpClient) { constructor(private http: HttpClient) {
} }
uploadFiles(formData: any): Observable<AlertModel> {
return this.http.post<AlertModel>(environment.baseUrl + '/files/upload', formData)
}
dowloadFiles(filename: string) {
return this.http.get(environment.baseUrl + '/files/download/' + filename, { responseType: "blob" })
}
uploadExcel(formData: any, table: string): Observable<AlertModel> { uploadExcel(formData: any, table: string): Observable<AlertModel> {
return this.http.post<AlertModel>(environment.baseUrl + '/import/excel/' + table, formData) return this.http.post<AlertModel>(environment.baseUrl + '/import/excel/' + table, formData)
} }
......
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