Commit 0ede5a33 by Nattana Chaiyamat

ภาษาไทย อังกฤษ

parent 8e8e7ae4
...@@ -38,21 +38,22 @@ ...@@ -38,21 +38,22 @@
<td class="font-medium !p-2 align-start">{{'NameSurname' | translate}}</td> <td class="font-medium !p-2 align-start">{{'NameSurname' | translate}}</td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start"> <td class="font-medium !p-2 align-start">
{{appraisalIdp.apsassessy.thFullName || ''}} {{translateText(appraisalIdp.apsassessy.thFullName,appraisalIdp.apsassessy.engFullName
)}}
</td> </td>
</tr> </tr>
<tr class="!border-0"> <tr class="!border-0">
<td class="font-medium !p-2 align-start">{{'Position' | translate}}</td> <td class="font-medium !p-2 align-start">{{'Position' | translate}}</td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start !text-warp"> <td class="font-medium !p-2 align-start !text-warp">
{{appraisalIdp.apsassessy.position.tdesc || ''}} {{translateText(appraisalIdp.apsassessy.position.tdesc,appraisalIdp.apsassessy.position.tdesc)}}
</td> </td>
</tr> </tr>
<tr class="!border-0"> <tr class="!border-0">
<td class="font-medium !p-2 align-start">{{'Job' | translate}}</td> <td class="font-medium !p-2 align-start">{{'Job' | translate}}</td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start !text-warp"> <td class="font-medium !p-2 align-start !text-warp">
{{appraisalIdp.apsassessy.job.tdesc || ""}} {{translateText(appraisalIdp.apsassessy.job.tdesc,appraisalIdp.apsassessy.job.tdesc)}}
</td> </td>
</tr> </tr>
<tr class="!border-0"> <tr class="!border-0">
...@@ -60,7 +61,7 @@ ...@@ -60,7 +61,7 @@
</td> </td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start !text-warp"> <td class="font-medium !p-2 align-start !text-warp">
{{appraisalIdp.apsassessy.bu1.tdesc}} {{translateText(appraisalIdp.apsassessy.bu1.tdesc,appraisalIdp.apsassessy.bu1.edesc)}}
</td> </td>
</tr> </tr>
</tbody> </tbody>
...@@ -80,21 +81,22 @@ ...@@ -80,21 +81,22 @@
<td class="font-medium !p-2 align-start">{{'NameSurname' | translate}}</td> <td class="font-medium !p-2 align-start">{{'NameSurname' | translate}}</td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start"> <td class="font-medium !p-2 align-start">
{{appraisalIdp.boss.thFullName || ''}} {{translateText(appraisalIdp.boss.thFullName,appraisalIdp.boss.engFullName
)}}
</td> </td>
</tr> </tr>
<tr class="!border-0"> <tr class="!border-0">
<td class="font-medium !p-2 align-start">{{'Position' | translate}}</td> <td class="font-medium !p-2 align-start">{{'Position' | translate}}</td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start !text-warp"> <td class="font-medium !p-2 align-start !text-warp">
{{appraisalIdp.boss.position.tdesc || ''}} {{translateText(appraisalIdp.boss.position.tdesc,appraisalIdp.boss.position.edesc)}}
</td> </td>
</tr> </tr>
<tr class="!border-0"> <tr class="!border-0">
<td class="font-medium !p-2 align-start">{{'Job' | translate}}</td> <td class="font-medium !p-2 align-start">{{'Job' | translate}}</td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start !text-warp"> <td class="font-medium !p-2 align-start !text-warp">
{{appraisalIdp.boss.job.tdesc || ""}} {{translateText(appraisalIdp.boss.job.tdesc,appraisalIdp.boss.job.edesc)}}
</td> </td>
</tr> </tr>
<tr class="!border-0"> <tr class="!border-0">
...@@ -102,7 +104,7 @@ ...@@ -102,7 +104,7 @@
</td> </td>
<td class="!p-2 align-start">:</td> <td class="!p-2 align-start">:</td>
<td class="font-medium !p-2 align-start !text-warp"> <td class="font-medium !p-2 align-start !text-warp">
{{appraisalIdp.boss.bu1.tdesc}} {{translateText(appraisalIdp.boss.bu1.tdesc,appraisalIdp.boss.bu1.edesc)}}
</td> </td>
</tr> </tr>
</tbody> </tbody>
......
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, SimpleChanges, ViewChild } from '@angular/core'; import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, SimpleChanges, ViewChild } from '@angular/core';
import { MatDialog } from '@angular/material/dialog'; import { MatDialog } from '@angular/material/dialog';
import { TranslateService } from '@ngx-translate/core';
import { Idp } from 'src/app/shared/model/competency.model'; import { Idp } from 'src/app/shared/model/competency.model';
import { CompetencycourseMiniModel, MyCompetencycourseMiniModel } from 'src/app/shared/model/competencycourse-mini.model'; import { CompetencycourseMiniModel, MyCompetencycourseMiniModel } from 'src/app/shared/model/competencycourse-mini.model';
import { IdpFormModel } from 'src/app/shared/model/idp-form.model'; import { IdpFormModel } from 'src/app/shared/model/idp-form.model';
...@@ -52,6 +53,7 @@ export class PmsIdpComponent { ...@@ -52,6 +53,7 @@ export class PmsIdpComponent {
@ViewChild("competencycourseModal") competencycourseModal: any; @ViewChild("competencycourseModal") competencycourseModal: any;
dialogRefCompetencycourseModal: any dialogRefCompetencycourseModal: any
constructor(private evaluationIdpService: EvaluationIdpService, constructor(private evaluationIdpService: EvaluationIdpService,
private translateService: TranslateService,
private employeeService: EmployeeService, private employeeService: EmployeeService,
private competencycourseService: CompetencycourseService, private competencycourseService: CompetencycourseService,
private cdr: ChangeDetectorRef, private cdr: ChangeDetectorRef,
...@@ -342,63 +344,65 @@ export class PmsIdpComponent { ...@@ -342,63 +344,65 @@ export class PmsIdpComponent {
// } // }
async exportPdf() { async exportPdf() {
this.pdfPrintCheck = 1; this.pdfPrintCheck = 1;
const el = this.pdfArea?.nativeElement; const el = this.pdfArea?.nativeElement;
if (!el) return; if (!el) return;
// 👉 ลบ shadow ออกจากทุก element ที่มี shadow class // 👉 ลบ shadow ออกจากทุก element ที่มี shadow class
const shadowEls = el.querySelectorAll('.shadow'); const shadowEls = el.querySelectorAll('.shadow');
shadowEls.forEach(e => e.classList.remove('shadow')); shadowEls.forEach(e => e.classList.remove('shadow'));
const mod: any = await import('html2pdf.js'); const mod: any = await import('html2pdf.js');
const html2pdf = mod.default ?? mod; const html2pdf = mod.default ?? mod;
const cleanupScale = this.expandToFullWidthThenScale(el); const cleanupScale = this.expandToFullWidthThenScale(el);
const cleanupUnclip = this.unclipOverflows(el); const cleanupUnclip = this.unclipOverflows(el);
const prevBodyOverflow = document.body.style.overflow; const prevBodyOverflow = document.body.style.overflow;
document.body.style.overflow = 'hidden'; document.body.style.overflow = 'hidden';
const fullW = el.scrollWidth; const fullW = el.scrollWidth;
const fullH = el.scrollHeight; const fullH = el.scrollHeight;
const epsilon = 2; const epsilon = 2;
const opt = { const opt = {
margin: [10, 10, 10, 10], margin: [10, 10, 10, 10],
filename: `pms-${this.evaluateeId || 'employee'}-${new Date().toISOString().slice(0, 10)}.pdf`, filename: `pms-${this.evaluateeId || 'employee'}-${new Date().toISOString().slice(0, 10)}.pdf`,
image: { type: 'jpeg', quality: 0.96 }, image: { type: 'jpeg', quality: 0.96 },
html2canvas: { html2canvas: {
scale: 2, scale: 2,
useCORS: true, useCORS: true,
logging: false, logging: false,
scrollX: 0, scrollX: 0,
scrollY: -window.scrollY, scrollY: -window.scrollY,
width: 800, width: 800,
height: Math.max(0, fullH - epsilon), height: Math.max(0, fullH - epsilon),
windowWidth: 800, windowWidth: 800,
windowHeight: Math.max(0, fullH - epsilon), windowHeight: Math.max(0, fullH - epsilon),
}, },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }, jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
pagebreak: { mode: ['css', 'legacy'], avoid: ['.no-break', 'table', 'img'] }, pagebreak: { mode: ['css', 'legacy'], avoid: ['.no-break', 'table', 'img'] },
onclone: (doc: any) => { onclone: (doc: any) => {
doc.querySelectorAll('[data-hide-in-pdf]').forEach((el: any) => el.remove()); doc.querySelectorAll('[data-hide-in-pdf]').forEach((el: any) => el.remove());
}, },
}; };
try {
await html2pdf().from(el).set(opt).save();
} finally {
cleanupUnclip();
cleanupScale();
document.body.style.overflow = prevBodyOverflow;
// 👉 คืน class shadow กลับ
shadowEls.forEach(e => e.classList.add('shadow'));
}
this.pdfPrintCheck = 0; try {
} await html2pdf().from(el).set(opt).save();
} finally {
cleanupUnclip();
cleanupScale();
document.body.style.overflow = prevBodyOverflow;
// 👉 คืน class shadow กลับ
shadowEls.forEach(e => e.classList.add('shadow'));
}
this.pdfPrintCheck = 0;
}
translateText(th?: string, en?: string) {
return this.translateService.getCurrentLang() == 'th' ? (th || '') : (en || '')
}
} }
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