cat-documents-ng 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Shared/constant/URLS.d.ts +1 -0
- package/fesm2022/cat-documents-ng.mjs +515 -563
- package/fesm2022/cat-documents-ng.mjs.map +1 -1
- package/lib/document/components/document-container/document-container.component.d.ts +0 -33
- package/lib/document/components/document-content-viewer/document-content-viewer.component.d.ts +18 -11
- package/lib/document/components/document-list/document-list.component.d.ts +1 -39
- package/lib/document/services/document-http.service.d.ts +14 -0
- package/package.json +1 -1
|
@@ -36,19 +36,19 @@ import * as i5 from 'primeng/messages';
|
|
|
36
36
|
import { MessagesModule } from 'primeng/messages';
|
|
37
37
|
import * as i9$3 from 'primeng/badge';
|
|
38
38
|
import { BadgeModule } from 'primeng/badge';
|
|
39
|
-
import * as i8$
|
|
39
|
+
import * as i8$2 from 'primeng/dialog';
|
|
40
40
|
import { DialogModule } from 'primeng/dialog';
|
|
41
41
|
import * as i6$1 from 'primeng/inputtext';
|
|
42
42
|
import { InputTextModule } from 'primeng/inputtext';
|
|
43
43
|
import * as i2$1 from 'primeng/table';
|
|
44
44
|
import { TableModule } from 'primeng/table';
|
|
45
45
|
import * as XLSX from 'xlsx';
|
|
46
|
-
import * as
|
|
47
|
-
import * as
|
|
46
|
+
import * as i5$1 from '@angular/platform-browser';
|
|
47
|
+
import * as i8$1 from 'ng2-pdf-viewer';
|
|
48
48
|
import { PdfViewerModule } from 'ng2-pdf-viewer';
|
|
49
|
-
import * as
|
|
49
|
+
import * as i9$2 from 'ngx-doc-viewer';
|
|
50
50
|
import { NgxDocViewerModule } from 'ngx-doc-viewer';
|
|
51
|
-
import * as i8$
|
|
51
|
+
import * as i8$3 from 'primeng/menu';
|
|
52
52
|
import { MenuModule } from 'primeng/menu';
|
|
53
53
|
import * as i9$4 from 'primeng/card';
|
|
54
54
|
import { CardModule } from 'primeng/card';
|
|
@@ -1103,6 +1103,7 @@ class URLS {
|
|
|
1103
1103
|
static UPDATE_DOCUMENT_STATUS = "documents/updateDocumentStatusByDocumentId/";
|
|
1104
1104
|
static DOCUMENT_REQUEST = "documents/requestDocument";
|
|
1105
1105
|
static VALUATION_REPORT = "valuationReport/";
|
|
1106
|
+
static CONVERT_TO_PDF = "documents/convert-email-to-pdf";
|
|
1106
1107
|
}
|
|
1107
1108
|
|
|
1108
1109
|
/**
|
|
@@ -1432,7 +1433,7 @@ class DocumentHttpService {
|
|
|
1432
1433
|
*/
|
|
1433
1434
|
getDocumentCatagories(contextId) {
|
|
1434
1435
|
let headers = new HttpHeaders({
|
|
1435
|
-
'Authorization': `Bearer
|
|
1436
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1436
1437
|
});
|
|
1437
1438
|
return this.http.get(`${this.apiUrl}${URLS.DOCUMENTS_CATAGORIES}/${contextId}`, { headers })
|
|
1438
1439
|
.pipe(tap((response) => {
|
|
@@ -1478,7 +1479,7 @@ class DocumentHttpService {
|
|
|
1478
1479
|
*/
|
|
1479
1480
|
getDocumentByFolderID(folderId, contextId) {
|
|
1480
1481
|
let headers = new HttpHeaders({
|
|
1481
|
-
'Authorization': `Bearer
|
|
1482
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1482
1483
|
});
|
|
1483
1484
|
return this.http.get(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD}/${URLS.PARENT_DOCUMENT_TYPE_ID}${folderId}${URLS.CONTEXT_ID}${contextId}`, { headers }).pipe(tap((records) => {
|
|
1484
1485
|
this.documentStore.set(records);
|
|
@@ -1496,7 +1497,7 @@ class DocumentHttpService {
|
|
|
1496
1497
|
*/
|
|
1497
1498
|
updateDocumentName(documentId, payload) {
|
|
1498
1499
|
let headers = new HttpHeaders({
|
|
1499
|
-
'Authorization': `Bearer
|
|
1500
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1500
1501
|
});
|
|
1501
1502
|
return this.http.put(`${this.apiUrl}${URLS.ALIAS_NAME}${documentId}`, payload, { headers }).pipe(catchError((error) => {
|
|
1502
1503
|
return throwError(() => new Error(error));
|
|
@@ -1509,7 +1510,7 @@ class DocumentHttpService {
|
|
|
1509
1510
|
*/
|
|
1510
1511
|
getUserListByContextId(contextId) {
|
|
1511
1512
|
let headers = new HttpHeaders({
|
|
1512
|
-
'Authorization': `Bearer
|
|
1513
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1513
1514
|
});
|
|
1514
1515
|
if (!contextId)
|
|
1515
1516
|
return EMPTY;
|
|
@@ -1530,7 +1531,7 @@ class DocumentHttpService {
|
|
|
1530
1531
|
if (!applicationId)
|
|
1531
1532
|
return EMPTY;
|
|
1532
1533
|
let headers = new HttpHeaders({
|
|
1533
|
-
'Authorization': `Bearer
|
|
1534
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1534
1535
|
});
|
|
1535
1536
|
let url = `${this.apiUrl}${URLS.STATUS_DOCUMENT_COUNT}${applicationId}`;
|
|
1536
1537
|
let params = new HttpParams();
|
|
@@ -1560,7 +1561,7 @@ class DocumentHttpService {
|
|
|
1560
1561
|
*/
|
|
1561
1562
|
getDocumentsBySelection(contextId, menuItem, userId, status, searchKey = null) {
|
|
1562
1563
|
let headers = new HttpHeaders({
|
|
1563
|
-
'Authorization': `Bearer
|
|
1564
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1564
1565
|
});
|
|
1565
1566
|
let params = new HttpParams();
|
|
1566
1567
|
if (userId) {
|
|
@@ -1582,7 +1583,7 @@ class DocumentHttpService {
|
|
|
1582
1583
|
}
|
|
1583
1584
|
getDocumentHistory(documentId) {
|
|
1584
1585
|
let headers = new HttpHeaders({
|
|
1585
|
-
'Authorization': `Bearer
|
|
1586
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1586
1587
|
});
|
|
1587
1588
|
if (!documentId) {
|
|
1588
1589
|
return of([]);
|
|
@@ -1600,7 +1601,7 @@ class DocumentHttpService {
|
|
|
1600
1601
|
if (!source)
|
|
1601
1602
|
return EMPTY;
|
|
1602
1603
|
let headers = new HttpHeaders({
|
|
1603
|
-
'Authorization': `Bearer
|
|
1604
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1604
1605
|
});
|
|
1605
1606
|
return this.http.get(`${this.apiUrl}${URLS.GET_CATEGORIES_BY_SOURCE}${source}`, { headers }).pipe(catchError((error) => {
|
|
1606
1607
|
return throwError(() => new Error(error));
|
|
@@ -1613,7 +1614,7 @@ class DocumentHttpService {
|
|
|
1613
1614
|
*/
|
|
1614
1615
|
getDocumentTypesByCategory(categoryId) {
|
|
1615
1616
|
let headers = new HttpHeaders({
|
|
1616
|
-
'Authorization': `Bearer
|
|
1617
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1617
1618
|
});
|
|
1618
1619
|
if (!categoryId)
|
|
1619
1620
|
return EMPTY;
|
|
@@ -1628,7 +1629,7 @@ class DocumentHttpService {
|
|
|
1628
1629
|
*/
|
|
1629
1630
|
uploadFile(formData) {
|
|
1630
1631
|
let headers = new HttpHeaders({
|
|
1631
|
-
'Authorization': `Bearer
|
|
1632
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1632
1633
|
});
|
|
1633
1634
|
return this.http.post(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}`, formData, { headers }).pipe(catchError((error) => {
|
|
1634
1635
|
return throwError(() => new Error(error));
|
|
@@ -1641,7 +1642,7 @@ class DocumentHttpService {
|
|
|
1641
1642
|
*/
|
|
1642
1643
|
saveDocumentUpload(payload) {
|
|
1643
1644
|
let headers = new HttpHeaders({
|
|
1644
|
-
'Authorization': `Bearer
|
|
1645
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1645
1646
|
});
|
|
1646
1647
|
return this.http.post(`${this.apiUrl}${URLS.SAVE_DOCUMENT_UPLOAD}`, payload, { headers }).pipe(catchError((error) => {
|
|
1647
1648
|
return throwError(() => new Error(error));
|
|
@@ -1656,7 +1657,7 @@ class DocumentHttpService {
|
|
|
1656
1657
|
*/
|
|
1657
1658
|
updateDocumentStatus(documentId, status, statusUpdateDescription) {
|
|
1658
1659
|
let headers = new HttpHeaders({
|
|
1659
|
-
'Authorization': `Bearer
|
|
1660
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1660
1661
|
});
|
|
1661
1662
|
const payload = {
|
|
1662
1663
|
statusUpdateDescription: statusUpdateDescription
|
|
@@ -1695,7 +1696,7 @@ class DocumentHttpService {
|
|
|
1695
1696
|
*/
|
|
1696
1697
|
deleteDocument(documentId, contextId) {
|
|
1697
1698
|
let headers = new HttpHeaders({
|
|
1698
|
-
'Authorization': `Bearer
|
|
1699
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1699
1700
|
});
|
|
1700
1701
|
return this.http.delete(`${this.apiUrl}${URLS.DELETE_DOCUMENT}${documentId}`, { headers }).pipe(tap(() => {
|
|
1701
1702
|
this.getDocumentCatagories(contextId).subscribe();
|
|
@@ -1714,7 +1715,7 @@ class DocumentHttpService {
|
|
|
1714
1715
|
*/
|
|
1715
1716
|
downloadExcelFile(documentUrl) {
|
|
1716
1717
|
let headers = new HttpHeaders({
|
|
1717
|
-
'Authorization': `Bearer
|
|
1718
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1718
1719
|
});
|
|
1719
1720
|
return this.http.get(documentUrl, { headers,
|
|
1720
1721
|
responseType: 'arraybuffer'
|
|
@@ -1730,7 +1731,7 @@ class DocumentHttpService {
|
|
|
1730
1731
|
*/
|
|
1731
1732
|
downloadCsvFile(documentUrl) {
|
|
1732
1733
|
let headers = new HttpHeaders({
|
|
1733
|
-
'Authorization': `Bearer
|
|
1734
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1734
1735
|
});
|
|
1735
1736
|
return this.http.get(documentUrl, { headers,
|
|
1736
1737
|
responseType: 'text'
|
|
@@ -1745,7 +1746,7 @@ class DocumentHttpService {
|
|
|
1745
1746
|
*/
|
|
1746
1747
|
downloadEmailFile(documentUrl) {
|
|
1747
1748
|
let headers = new HttpHeaders({
|
|
1748
|
-
'Authorization': `Bearer
|
|
1749
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1749
1750
|
});
|
|
1750
1751
|
const isAzureBlobStorage = documentUrl.includes('.blob.core.windows.net');
|
|
1751
1752
|
if (isAzureBlobStorage) {
|
|
@@ -1763,7 +1764,7 @@ class DocumentHttpService {
|
|
|
1763
1764
|
}
|
|
1764
1765
|
documentRequest(payload) {
|
|
1765
1766
|
let headers = new HttpHeaders({
|
|
1766
|
-
'Authorization': `Bearer
|
|
1767
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1767
1768
|
});
|
|
1768
1769
|
return this.http.post(`${this.apiUrl}${URLS.DOCUMENT_REQUEST}`, payload, { headers }).pipe(catchError((error) => {
|
|
1769
1770
|
return throwError(() => new Error(error));
|
|
@@ -1776,7 +1777,7 @@ class DocumentHttpService {
|
|
|
1776
1777
|
*/
|
|
1777
1778
|
getValuationReportByContextId(contextId) {
|
|
1778
1779
|
let headers = new HttpHeaders({
|
|
1779
|
-
'Authorization': `Bearer
|
|
1780
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1780
1781
|
});
|
|
1781
1782
|
if (!contextId)
|
|
1782
1783
|
return EMPTY;
|
|
@@ -1785,6 +1786,24 @@ class DocumentHttpService {
|
|
|
1785
1786
|
return of(null);
|
|
1786
1787
|
}));
|
|
1787
1788
|
}
|
|
1789
|
+
/**
|
|
1790
|
+
* Converts an email document to PDF format
|
|
1791
|
+
* @param {string} documentUrl - The URL of the email document to convert
|
|
1792
|
+
* @returns {Observable<ConvertToPdfResponse>} Observable that emits the PDF URL response
|
|
1793
|
+
*/
|
|
1794
|
+
convertEmailToPdf(documentUrl) {
|
|
1795
|
+
let headers = new HttpHeaders({
|
|
1796
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
1797
|
+
});
|
|
1798
|
+
if (!documentUrl)
|
|
1799
|
+
return EMPTY;
|
|
1800
|
+
const payload = { documentUrl: documentUrl };
|
|
1801
|
+
return this.http.post(`${this.apiUrl}${URLS.CONVERT_TO_PDF}`, payload, {
|
|
1802
|
+
headers
|
|
1803
|
+
}).pipe(catchError((error) => {
|
|
1804
|
+
return throwError(() => new Error(error?.message || 'Failed to convert email to PDF'));
|
|
1805
|
+
}));
|
|
1806
|
+
}
|
|
1788
1807
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentHttpService, deps: [{ token: DocumentStore }, { token: i2.HttpClient }, { token: AppConfigService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1789
1808
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentHttpService, providedIn: 'root' });
|
|
1790
1809
|
}
|
|
@@ -2705,7 +2724,10 @@ class DocumentService {
|
|
|
2705
2724
|
* @returns {Observable<any>} Observable that emits the newly created document.
|
|
2706
2725
|
*/
|
|
2707
2726
|
create(entity) {
|
|
2708
|
-
|
|
2727
|
+
let headers = new HttpHeaders({
|
|
2728
|
+
'Authorization': `Bearer 3def65bf-2dfc-466b-85a3-13cd1db0960e`
|
|
2729
|
+
});
|
|
2730
|
+
return this.http.post(`${this.apiUrl}${URLS.DOCUMENT_UPLOAD_FILE}`, entity, { headers }).pipe(tap((newEntity) => this.documentStore.add(newEntity)));
|
|
2709
2731
|
}
|
|
2710
2732
|
/**
|
|
2711
2733
|
* Fetches all documents from the backend.
|
|
@@ -7585,437 +7607,63 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
7585
7607
|
}]
|
|
7586
7608
|
}], ctorParameters: () => [] });
|
|
7587
7609
|
|
|
7588
|
-
|
|
7589
|
-
|
|
7590
|
-
|
|
7591
|
-
|
|
7592
|
-
|
|
7593
|
-
|
|
7594
|
-
|
|
7595
|
-
|
|
7596
|
-
|
|
7597
|
-
|
|
7610
|
+
class DocumentZoomService {
|
|
7611
|
+
DEFAULT_CONFIG = {
|
|
7612
|
+
defaultZoom: 100,
|
|
7613
|
+
zoomStep: 25,
|
|
7614
|
+
minZoom: 25,
|
|
7615
|
+
maxZoom: 400
|
|
7616
|
+
};
|
|
7617
|
+
zoomLevelSubject = new BehaviorSubject(this.DEFAULT_CONFIG.defaultZoom);
|
|
7618
|
+
config = { ...this.DEFAULT_CONFIG };
|
|
7619
|
+
/**
|
|
7620
|
+
* Gets the current zoom level as an observable
|
|
7621
|
+
*/
|
|
7622
|
+
get zoomLevel$() {
|
|
7623
|
+
return this.zoomLevelSubject.asObservable();
|
|
7598
7624
|
}
|
|
7599
7625
|
/**
|
|
7600
|
-
*
|
|
7601
|
-
* @param emlContent - Raw EML file content as string
|
|
7602
|
-
* @returns Parsed email data
|
|
7626
|
+
* Gets the current zoom level value
|
|
7603
7627
|
*/
|
|
7604
|
-
|
|
7605
|
-
|
|
7606
|
-
const lines = emlContent.split(/\r?\n/);
|
|
7607
|
-
const headers = this.parseHeaders(lines);
|
|
7608
|
-
const body = this.parseBody(lines);
|
|
7609
|
-
return {
|
|
7610
|
-
from: this.cleanEmailAddress(headers['from'] || 'Unknown'),
|
|
7611
|
-
to: this.cleanEmailAddress(headers['to'] || 'Unknown'),
|
|
7612
|
-
cc: headers['cc'] ? this.cleanEmailAddress(headers['cc']) : undefined,
|
|
7613
|
-
subject: this.decodeHeader(headers['subject'] || 'No Subject'),
|
|
7614
|
-
date: this.formatDate(headers['date'] || ''),
|
|
7615
|
-
body: body.content,
|
|
7616
|
-
isHtml: body.isHtml,
|
|
7617
|
-
attachments: this.parseAttachments(emlContent)
|
|
7618
|
-
};
|
|
7619
|
-
}
|
|
7620
|
-
catch (error) {
|
|
7621
|
-
console.error('Error parsing EML file:', error);
|
|
7622
|
-
return null;
|
|
7623
|
-
}
|
|
7628
|
+
get currentZoom() {
|
|
7629
|
+
return this.zoomLevelSubject.value;
|
|
7624
7630
|
}
|
|
7625
7631
|
/**
|
|
7626
|
-
*
|
|
7627
|
-
* @param lines - Lines of the EML file
|
|
7628
|
-
* @returns Object containing parsed headers
|
|
7632
|
+
* Gets the current zoom configuration
|
|
7629
7633
|
*/
|
|
7630
|
-
|
|
7631
|
-
|
|
7632
|
-
let currentHeader = '';
|
|
7633
|
-
let currentValue = '';
|
|
7634
|
-
for (const line of lines) {
|
|
7635
|
-
// Empty line indicates end of headers
|
|
7636
|
-
if (line.trim() === '') {
|
|
7637
|
-
if (currentHeader) {
|
|
7638
|
-
headers[currentHeader.toLowerCase()] = currentValue.trim();
|
|
7639
|
-
}
|
|
7640
|
-
break;
|
|
7641
|
-
}
|
|
7642
|
-
// Check if line is a new header (starts without whitespace and contains ':')
|
|
7643
|
-
if (line.match(/^[\w-]+:/) && !line.startsWith(' ') && !line.startsWith('\t')) {
|
|
7644
|
-
// Save previous header if exists
|
|
7645
|
-
if (currentHeader) {
|
|
7646
|
-
headers[currentHeader.toLowerCase()] = currentValue.trim();
|
|
7647
|
-
}
|
|
7648
|
-
// Parse new header
|
|
7649
|
-
const colonIndex = line.indexOf(':');
|
|
7650
|
-
currentHeader = line.substring(0, colonIndex).trim();
|
|
7651
|
-
currentValue = line.substring(colonIndex + 1).trim();
|
|
7652
|
-
}
|
|
7653
|
-
else if (currentHeader && (line.startsWith(' ') || line.startsWith('\t'))) {
|
|
7654
|
-
// Continuation of previous header (folded header)
|
|
7655
|
-
currentValue += ' ' + line.trim();
|
|
7656
|
-
}
|
|
7657
|
-
}
|
|
7658
|
-
return headers;
|
|
7634
|
+
get zoomConfig() {
|
|
7635
|
+
return { ...this.config };
|
|
7659
7636
|
}
|
|
7660
7637
|
/**
|
|
7661
|
-
*
|
|
7662
|
-
* @param lines - Lines of the EML file
|
|
7663
|
-
* @returns Object containing body content and format information
|
|
7638
|
+
* Sets custom zoom configuration
|
|
7664
7639
|
*/
|
|
7665
|
-
|
|
7666
|
-
|
|
7667
|
-
|
|
7668
|
-
let contentType = 'text/plain';
|
|
7669
|
-
let boundary = '';
|
|
7670
|
-
let isBase64 = false;
|
|
7671
|
-
let isQuotedPrintable = false;
|
|
7672
|
-
// Find Content-Type and boundary
|
|
7673
|
-
for (let i = 0; i < lines.length; i++) {
|
|
7674
|
-
const line = lines[i];
|
|
7675
|
-
if (line.toLowerCase().startsWith('content-type:')) {
|
|
7676
|
-
contentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';
|
|
7677
|
-
// Check for multipart boundary
|
|
7678
|
-
const boundaryMatch = line.match(/boundary="?([^";\s]+)"?/i);
|
|
7679
|
-
if (boundaryMatch) {
|
|
7680
|
-
boundary = boundaryMatch[1];
|
|
7681
|
-
}
|
|
7682
|
-
}
|
|
7683
|
-
if (line.toLowerCase().startsWith('content-transfer-encoding:')) {
|
|
7684
|
-
isBase64 = line.toLowerCase().includes('base64');
|
|
7685
|
-
isQuotedPrintable = line.toLowerCase().includes('quoted-printable');
|
|
7686
|
-
}
|
|
7687
|
-
// Empty line marks start of body
|
|
7688
|
-
if (line.trim() === '' && !inBody) {
|
|
7689
|
-
inBody = true;
|
|
7690
|
-
continue;
|
|
7691
|
-
}
|
|
7692
|
-
if (inBody) {
|
|
7693
|
-
bodyLines.push(line);
|
|
7694
|
-
}
|
|
7695
|
-
}
|
|
7696
|
-
// If multipart, extract the relevant part
|
|
7697
|
-
if (boundary) {
|
|
7698
|
-
bodyLines = this.extractMultipartBody(bodyLines.join('\n'), boundary, contentType);
|
|
7699
|
-
}
|
|
7700
|
-
let bodyContent = bodyLines.join('\n').trim();
|
|
7701
|
-
// Decode body if necessary
|
|
7702
|
-
if (isBase64) {
|
|
7703
|
-
try {
|
|
7704
|
-
bodyContent = atob(bodyContent.replace(/\s/g, ''));
|
|
7705
|
-
}
|
|
7706
|
-
catch (e) {
|
|
7707
|
-
console.warn('Failed to decode base64 content');
|
|
7708
|
-
}
|
|
7709
|
-
}
|
|
7710
|
-
else if (isQuotedPrintable) {
|
|
7711
|
-
bodyContent = this.decodeQuotedPrintable(bodyContent);
|
|
7712
|
-
}
|
|
7713
|
-
// Clean up HTML if present
|
|
7714
|
-
if (contentType === 'text/html') {
|
|
7715
|
-
bodyContent = this.sanitizeHtmlContent(bodyContent);
|
|
7716
|
-
}
|
|
7717
|
-
return {
|
|
7718
|
-
content: bodyContent || 'No content available',
|
|
7719
|
-
isHtml: contentType === 'text/html'
|
|
7720
|
-
};
|
|
7640
|
+
setZoomConfig(config) {
|
|
7641
|
+
this.config = { ...this.DEFAULT_CONFIG, ...config };
|
|
7642
|
+
this.setZoom(this.config.defaultZoom);
|
|
7721
7643
|
}
|
|
7722
7644
|
/**
|
|
7723
|
-
*
|
|
7724
|
-
* @param content - Email content
|
|
7725
|
-
* @param boundary - Multipart boundary string
|
|
7726
|
-
* @param preferredType - Preferred content type
|
|
7727
|
-
* @returns Array of body lines
|
|
7645
|
+
* Zooms in by the configured step
|
|
7728
7646
|
*/
|
|
7729
|
-
|
|
7730
|
-
const
|
|
7731
|
-
|
|
7732
|
-
const lines = part.split(/\r?\n/);
|
|
7733
|
-
let partContentType = 'text/plain';
|
|
7734
|
-
let isBase64 = false;
|
|
7735
|
-
let isQuotedPrintable = false;
|
|
7736
|
-
let inPartBody = false;
|
|
7737
|
-
const partBodyLines = [];
|
|
7738
|
-
for (let i = 0; i < lines.length; i++) {
|
|
7739
|
-
const line = lines[i];
|
|
7740
|
-
if (line.toLowerCase().startsWith('content-type:')) {
|
|
7741
|
-
partContentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';
|
|
7742
|
-
}
|
|
7743
|
-
if (line.toLowerCase().startsWith('content-transfer-encoding:')) {
|
|
7744
|
-
isBase64 = line.toLowerCase().includes('base64');
|
|
7745
|
-
isQuotedPrintable = line.toLowerCase().includes('quoted-printable');
|
|
7746
|
-
}
|
|
7747
|
-
if (line.trim() === '' && !inPartBody) {
|
|
7748
|
-
inPartBody = true;
|
|
7749
|
-
continue;
|
|
7750
|
-
}
|
|
7751
|
-
if (inPartBody) {
|
|
7752
|
-
partBodyLines.push(line);
|
|
7753
|
-
}
|
|
7754
|
-
}
|
|
7755
|
-
// If this part matches our preferred content type, use it
|
|
7756
|
-
if (partContentType === preferredType && partBodyLines.length > 0) {
|
|
7757
|
-
let bodyContent = partBodyLines.join('\n');
|
|
7758
|
-
if (isBase64) {
|
|
7759
|
-
try {
|
|
7760
|
-
bodyContent = atob(bodyContent.replace(/\s/g, ''));
|
|
7761
|
-
}
|
|
7762
|
-
catch (e) {
|
|
7763
|
-
console.warn('Failed to decode base64 part');
|
|
7764
|
-
}
|
|
7765
|
-
}
|
|
7766
|
-
else if (isQuotedPrintable) {
|
|
7767
|
-
bodyContent = this.decodeQuotedPrintable(bodyContent);
|
|
7768
|
-
}
|
|
7769
|
-
return [bodyContent];
|
|
7770
|
-
}
|
|
7771
|
-
}
|
|
7772
|
-
// Fallback: return first non-empty part
|
|
7773
|
-
for (const part of parts) {
|
|
7774
|
-
const lines = part.split(/\r?\n/);
|
|
7775
|
-
const bodyLines = lines.filter(line => line.trim() !== '').slice(3); // Skip headers
|
|
7776
|
-
if (bodyLines.length > 0) {
|
|
7777
|
-
return bodyLines;
|
|
7778
|
-
}
|
|
7779
|
-
}
|
|
7780
|
-
return [];
|
|
7647
|
+
zoomIn() {
|
|
7648
|
+
const newZoom = Math.min(this.currentZoom + this.config.zoomStep, this.config.maxZoom);
|
|
7649
|
+
this.setZoom(newZoom);
|
|
7781
7650
|
}
|
|
7782
7651
|
/**
|
|
7783
|
-
*
|
|
7784
|
-
* @param content - Quoted-printable encoded string
|
|
7785
|
-
* @returns Decoded string
|
|
7652
|
+
* Zooms out by the configured step
|
|
7786
7653
|
*/
|
|
7787
|
-
|
|
7788
|
-
|
|
7789
|
-
|
|
7790
|
-
.replace(/=([0-9A-F]{2})/gi, (match, hex) => {
|
|
7791
|
-
return String.fromCharCode(parseInt(hex, 16));
|
|
7792
|
-
});
|
|
7654
|
+
zoomOut() {
|
|
7655
|
+
const newZoom = Math.max(this.currentZoom - this.config.zoomStep, this.config.minZoom);
|
|
7656
|
+
this.setZoom(newZoom);
|
|
7793
7657
|
}
|
|
7794
7658
|
/**
|
|
7795
|
-
*
|
|
7796
|
-
* @param html - Raw HTML content
|
|
7797
|
-
* @returns Sanitized HTML
|
|
7659
|
+
* Sets zoom to a specific level
|
|
7798
7660
|
*/
|
|
7799
|
-
|
|
7800
|
-
|
|
7801
|
-
|
|
7802
|
-
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
|
|
7803
|
-
.replace(/on\w+\s*=\s*["'][^"']*["']/gi, '')
|
|
7804
|
-
.replace(/javascript:/gi, '');
|
|
7805
|
-
return sanitized;
|
|
7661
|
+
setZoom(zoom) {
|
|
7662
|
+
const clampedZoom = Math.max(this.config.minZoom, Math.min(zoom, this.config.maxZoom));
|
|
7663
|
+
this.zoomLevelSubject.next(clampedZoom);
|
|
7806
7664
|
}
|
|
7807
7665
|
/**
|
|
7808
|
-
*
|
|
7809
|
-
* @param emlContent - Raw EML content
|
|
7810
|
-
* @returns Array of attachment information
|
|
7811
|
-
*/
|
|
7812
|
-
parseAttachments(emlContent) {
|
|
7813
|
-
const attachments = [];
|
|
7814
|
-
const attachmentRegex = /Content-Disposition:\s*attachment[^;]*;\s*filename="?([^"\r\n]+)"?/gi;
|
|
7815
|
-
let match;
|
|
7816
|
-
while ((match = attachmentRegex.exec(emlContent)) !== null) {
|
|
7817
|
-
attachments.push({
|
|
7818
|
-
filename: match[1],
|
|
7819
|
-
contentType: 'application/octet-stream',
|
|
7820
|
-
size: 0
|
|
7821
|
-
});
|
|
7822
|
-
}
|
|
7823
|
-
return attachments;
|
|
7824
|
-
}
|
|
7825
|
-
/**
|
|
7826
|
-
* Cleans and formats email addresses
|
|
7827
|
-
* @param email - Raw email address string
|
|
7828
|
-
* @returns Cleaned email address
|
|
7829
|
-
*/
|
|
7830
|
-
cleanEmailAddress(email) {
|
|
7831
|
-
// Remove quotes and extra whitespace
|
|
7832
|
-
let cleaned = email.replace(/['"]/g, '').trim();
|
|
7833
|
-
// Extract email from format: "Name <email@example.com>"
|
|
7834
|
-
const emailMatch = cleaned.match(/<([^>]+)>/);
|
|
7835
|
-
if (emailMatch) {
|
|
7836
|
-
const name = cleaned.substring(0, cleaned.indexOf('<')).trim();
|
|
7837
|
-
const address = emailMatch[1];
|
|
7838
|
-
return name ? `${name} <${address}>` : address;
|
|
7839
|
-
}
|
|
7840
|
-
return cleaned;
|
|
7841
|
-
}
|
|
7842
|
-
/**
|
|
7843
|
-
* Decodes encoded email headers (RFC 2047)
|
|
7844
|
-
* @param header - Encoded header string
|
|
7845
|
-
* @returns Decoded header string
|
|
7846
|
-
*/
|
|
7847
|
-
decodeHeader(header) {
|
|
7848
|
-
// Decode RFC 2047 encoded words (=?charset?encoding?text?=)
|
|
7849
|
-
return header.replace(/=\?([^?]+)\?([BQ])\?([^?]+)\?=/gi, (match, charset, encoding, text) => {
|
|
7850
|
-
try {
|
|
7851
|
-
if (encoding.toUpperCase() === 'B') {
|
|
7852
|
-
// Base64 encoding
|
|
7853
|
-
return atob(text);
|
|
7854
|
-
}
|
|
7855
|
-
else if (encoding.toUpperCase() === 'Q') {
|
|
7856
|
-
// Quoted-printable encoding
|
|
7857
|
-
return this.decodeQuotedPrintable(text.replace(/_/g, ' '));
|
|
7858
|
-
}
|
|
7859
|
-
}
|
|
7860
|
-
catch (e) {
|
|
7861
|
-
console.warn('Failed to decode header:', match);
|
|
7862
|
-
}
|
|
7863
|
-
return match;
|
|
7864
|
-
});
|
|
7865
|
-
}
|
|
7866
|
-
/**
|
|
7867
|
-
* Formats email date to readable format
|
|
7868
|
-
* @param dateStr - Raw date string from email
|
|
7869
|
-
* @returns Formatted date string
|
|
7870
|
-
*/
|
|
7871
|
-
formatDate(dateStr) {
|
|
7872
|
-
try {
|
|
7873
|
-
const date = new Date(dateStr);
|
|
7874
|
-
if (isNaN(date.getTime())) {
|
|
7875
|
-
return dateStr || 'Unknown date';
|
|
7876
|
-
}
|
|
7877
|
-
return date.toLocaleString('en-GB', {
|
|
7878
|
-
day: '2-digit',
|
|
7879
|
-
month: 'short',
|
|
7880
|
-
year: 'numeric',
|
|
7881
|
-
hour: '2-digit',
|
|
7882
|
-
minute: '2-digit'
|
|
7883
|
-
});
|
|
7884
|
-
}
|
|
7885
|
-
catch (e) {
|
|
7886
|
-
return dateStr || 'Unknown date';
|
|
7887
|
-
}
|
|
7888
|
-
}
|
|
7889
|
-
/**
|
|
7890
|
-
* Sanitizes HTML for Angular display
|
|
7891
|
-
* @param html - HTML string
|
|
7892
|
-
* @returns SafeHtml for Angular templates
|
|
7893
|
-
*/
|
|
7894
|
-
getSafeHtml(html) {
|
|
7895
|
-
return this.sanitizer.sanitize(1, html) || '';
|
|
7896
|
-
}
|
|
7897
|
-
/**
|
|
7898
|
-
* Downloads and parses an EML file from a URL
|
|
7899
|
-
* @param documentUrl - URL of the EML file
|
|
7900
|
-
* @returns Observable of parsed email data
|
|
7901
|
-
*/
|
|
7902
|
-
loadAndParseEmail(documentUrl) {
|
|
7903
|
-
console.log('EmlParserService: Loading email from URL:', documentUrl);
|
|
7904
|
-
return this.downloadEmailFile(documentUrl).pipe(map((emlContent) => {
|
|
7905
|
-
console.log('EmlParserService: Email downloaded, size:', emlContent?.length || 0, 'bytes');
|
|
7906
|
-
if (!emlContent || emlContent.trim().length === 0) {
|
|
7907
|
-
throw new Error('Email file is empty or could not be loaded');
|
|
7908
|
-
}
|
|
7909
|
-
const parsedData = this.parseEmlData(emlContent);
|
|
7910
|
-
if (!parsedData) {
|
|
7911
|
-
throw new Error('Failed to parse email data');
|
|
7912
|
-
}
|
|
7913
|
-
console.log('EmlParserService: Email parsed successfully:', parsedData);
|
|
7914
|
-
return parsedData;
|
|
7915
|
-
}), catchError$1((error) => {
|
|
7916
|
-
console.error('EmlParserService: Error loading/parsing email:', error);
|
|
7917
|
-
return throwError(() => new Error(error.message || 'Failed to load or parse email file'));
|
|
7918
|
-
}));
|
|
7919
|
-
}
|
|
7920
|
-
/**
|
|
7921
|
-
* Downloads an email file with appropriate authentication handling
|
|
7922
|
-
* @param documentUrl - URL of the email file
|
|
7923
|
-
* @returns Observable of file content as text
|
|
7924
|
-
*/
|
|
7925
|
-
downloadEmailFile(documentUrl) {
|
|
7926
|
-
// Check if it's Azure Blob Storage URL
|
|
7927
|
-
const isAzureBlobStorage = documentUrl.includes('.blob.core.windows.net');
|
|
7928
|
-
if (isAzureBlobStorage) {
|
|
7929
|
-
// For Azure Blob Storage, don't send Authorization header
|
|
7930
|
-
// The URL should contain a SAS token or the blob should be publicly accessible
|
|
7931
|
-
return this.http.get(documentUrl, {
|
|
7932
|
-
responseType: 'text'
|
|
7933
|
-
}).pipe(catchError$1((error) => {
|
|
7934
|
-
console.error('Error downloading email from blob storage:', error);
|
|
7935
|
-
return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));
|
|
7936
|
-
}));
|
|
7937
|
-
}
|
|
7938
|
-
else {
|
|
7939
|
-
// For other storage types, use Bearer token authentication
|
|
7940
|
-
const Authorization = `Bearer d8764575-d713-4e31-aeb0-29ea31057461`;
|
|
7941
|
-
return this.http.get(documentUrl, {
|
|
7942
|
-
headers: new HttpHeaders({
|
|
7943
|
-
'Authorization': Authorization
|
|
7944
|
-
}),
|
|
7945
|
-
responseType: 'text'
|
|
7946
|
-
}).pipe(catchError$1((error) => {
|
|
7947
|
-
console.error('Error downloading email file:', error);
|
|
7948
|
-
return throwError(() => new Error('Failed to download email file. Please check authentication.'));
|
|
7949
|
-
}));
|
|
7950
|
-
}
|
|
7951
|
-
}
|
|
7952
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmlParserService, deps: [{ token: i1$1.DomSanitizer }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
7953
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmlParserService, providedIn: 'root' });
|
|
7954
|
-
}
|
|
7955
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmlParserService, decorators: [{
|
|
7956
|
-
type: Injectable,
|
|
7957
|
-
args: [{
|
|
7958
|
-
providedIn: 'root'
|
|
7959
|
-
}]
|
|
7960
|
-
}], ctorParameters: () => [{ type: i1$1.DomSanitizer }, { type: i2.HttpClient }] });
|
|
7961
|
-
|
|
7962
|
-
class DocumentZoomService {
|
|
7963
|
-
DEFAULT_CONFIG = {
|
|
7964
|
-
defaultZoom: 100,
|
|
7965
|
-
zoomStep: 25,
|
|
7966
|
-
minZoom: 25,
|
|
7967
|
-
maxZoom: 400
|
|
7968
|
-
};
|
|
7969
|
-
zoomLevelSubject = new BehaviorSubject(this.DEFAULT_CONFIG.defaultZoom);
|
|
7970
|
-
config = { ...this.DEFAULT_CONFIG };
|
|
7971
|
-
/**
|
|
7972
|
-
* Gets the current zoom level as an observable
|
|
7973
|
-
*/
|
|
7974
|
-
get zoomLevel$() {
|
|
7975
|
-
return this.zoomLevelSubject.asObservable();
|
|
7976
|
-
}
|
|
7977
|
-
/**
|
|
7978
|
-
* Gets the current zoom level value
|
|
7979
|
-
*/
|
|
7980
|
-
get currentZoom() {
|
|
7981
|
-
return this.zoomLevelSubject.value;
|
|
7982
|
-
}
|
|
7983
|
-
/**
|
|
7984
|
-
* Gets the current zoom configuration
|
|
7985
|
-
*/
|
|
7986
|
-
get zoomConfig() {
|
|
7987
|
-
return { ...this.config };
|
|
7988
|
-
}
|
|
7989
|
-
/**
|
|
7990
|
-
* Sets custom zoom configuration
|
|
7991
|
-
*/
|
|
7992
|
-
setZoomConfig(config) {
|
|
7993
|
-
this.config = { ...this.DEFAULT_CONFIG, ...config };
|
|
7994
|
-
this.setZoom(this.config.defaultZoom);
|
|
7995
|
-
}
|
|
7996
|
-
/**
|
|
7997
|
-
* Zooms in by the configured step
|
|
7998
|
-
*/
|
|
7999
|
-
zoomIn() {
|
|
8000
|
-
const newZoom = Math.min(this.currentZoom + this.config.zoomStep, this.config.maxZoom);
|
|
8001
|
-
this.setZoom(newZoom);
|
|
8002
|
-
}
|
|
8003
|
-
/**
|
|
8004
|
-
* Zooms out by the configured step
|
|
8005
|
-
*/
|
|
8006
|
-
zoomOut() {
|
|
8007
|
-
const newZoom = Math.max(this.currentZoom - this.config.zoomStep, this.config.minZoom);
|
|
8008
|
-
this.setZoom(newZoom);
|
|
8009
|
-
}
|
|
8010
|
-
/**
|
|
8011
|
-
* Sets zoom to a specific level
|
|
8012
|
-
*/
|
|
8013
|
-
setZoom(zoom) {
|
|
8014
|
-
const clampedZoom = Math.max(this.config.minZoom, Math.min(zoom, this.config.maxZoom));
|
|
8015
|
-
this.zoomLevelSubject.next(clampedZoom);
|
|
8016
|
-
}
|
|
8017
|
-
/**
|
|
8018
|
-
* Resets zoom to default level
|
|
7666
|
+
* Resets zoom to default level
|
|
8019
7667
|
*/
|
|
8020
7668
|
resetZoom() {
|
|
8021
7669
|
this.setZoom(this.config.defaultZoom);
|
|
@@ -8244,7 +7892,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
8244
7892
|
class DocumentContentViewerComponent {
|
|
8245
7893
|
excelParserService;
|
|
8246
7894
|
csvParserService;
|
|
8247
|
-
emlParserService;
|
|
8248
7895
|
documentHttpService;
|
|
8249
7896
|
zoomService;
|
|
8250
7897
|
sanitizer;
|
|
@@ -8348,11 +7995,6 @@ class DocumentContentViewerComponent {
|
|
|
8348
7995
|
* @type {number}
|
|
8349
7996
|
*/
|
|
8350
7997
|
currentZoom = 100;
|
|
8351
|
-
/**
|
|
8352
|
-
* Email data for display
|
|
8353
|
-
* @type {ParsedEmailData | null}
|
|
8354
|
-
*/
|
|
8355
|
-
emailData = null;
|
|
8356
7998
|
/**
|
|
8357
7999
|
* Loading state for Email files
|
|
8358
8000
|
* @type {boolean}
|
|
@@ -8363,19 +8005,22 @@ class DocumentContentViewerComponent {
|
|
|
8363
8005
|
* @type {string | null}
|
|
8364
8006
|
*/
|
|
8365
8007
|
emailError = null;
|
|
8008
|
+
/**
|
|
8009
|
+
* PDF URL for converted email
|
|
8010
|
+
* @type {string | null}
|
|
8011
|
+
*/
|
|
8012
|
+
emailPdfUrl = null;
|
|
8366
8013
|
/**
|
|
8367
8014
|
* Constructor
|
|
8368
8015
|
* @param {ExcelParserService} excelParserService - Service for parsing Excel files
|
|
8369
8016
|
* @param {CsvParserService} csvParserService - Service for parsing CSV files
|
|
8370
|
-
* @param {EmlParserService} emlParserService - Service for parsing EML files
|
|
8371
8017
|
* @param {DocumentHttpService} documentHttpService - Service for making HTTP requests for Excel/CSV files
|
|
8372
8018
|
* @param {DocumentZoomService} zoomService - Service for handling zoom functionality
|
|
8373
8019
|
* @param {DomSanitizer} sanitizer - Service for sanitizing HTML content
|
|
8374
8020
|
*/
|
|
8375
|
-
constructor(excelParserService, csvParserService,
|
|
8021
|
+
constructor(excelParserService, csvParserService, documentHttpService, zoomService, sanitizer) {
|
|
8376
8022
|
this.excelParserService = excelParserService;
|
|
8377
8023
|
this.csvParserService = csvParserService;
|
|
8378
|
-
this.emlParserService = emlParserService;
|
|
8379
8024
|
this.documentHttpService = documentHttpService;
|
|
8380
8025
|
this.zoomService = zoomService;
|
|
8381
8026
|
this.sanitizer = sanitizer;
|
|
@@ -8799,22 +8444,32 @@ class DocumentContentViewerComponent {
|
|
|
8799
8444
|
}
|
|
8800
8445
|
/**
|
|
8801
8446
|
* Loads Email data for display
|
|
8447
|
+
* Converts email to PDF and renders it
|
|
8802
8448
|
*/
|
|
8803
8449
|
loadEmailData() {
|
|
8804
8450
|
if (this.isEmail && this.documentUrl) {
|
|
8805
8451
|
this.isLoadingEmail = true;
|
|
8806
8452
|
this.emailError = null;
|
|
8807
|
-
this.
|
|
8808
|
-
|
|
8453
|
+
this.emailPdfUrl = null;
|
|
8454
|
+
// Call convert-to-pdf API
|
|
8455
|
+
this.documentHttpService.convertEmailToPdf(this.documentUrl)
|
|
8809
8456
|
.subscribe({
|
|
8810
|
-
next: (
|
|
8811
|
-
|
|
8812
|
-
|
|
8813
|
-
|
|
8457
|
+
next: (response) => {
|
|
8458
|
+
if (response.success && response.pdfUrl) {
|
|
8459
|
+
// Use the PDF URL directly from the response
|
|
8460
|
+
this.emailPdfUrl = response.pdfUrl;
|
|
8461
|
+
this.emailError = null;
|
|
8462
|
+
this.isLoadingEmail = false;
|
|
8463
|
+
}
|
|
8464
|
+
else {
|
|
8465
|
+
// Response indicates failure
|
|
8466
|
+
this.emailError = response.message || 'Failed to convert email to PDF';
|
|
8467
|
+
this.isLoadingEmail = false;
|
|
8468
|
+
}
|
|
8814
8469
|
},
|
|
8815
8470
|
error: (error) => {
|
|
8816
|
-
|
|
8817
|
-
this.
|
|
8471
|
+
console.error('Error converting email to PDF:', error);
|
|
8472
|
+
this.emailError = error?.message || 'Failed to convert email to PDF';
|
|
8818
8473
|
this.isLoadingEmail = false;
|
|
8819
8474
|
}
|
|
8820
8475
|
});
|
|
@@ -8827,17 +8482,32 @@ class DocumentContentViewerComponent {
|
|
|
8827
8482
|
* Resets Email data to initial state
|
|
8828
8483
|
*/
|
|
8829
8484
|
resetEmailData() {
|
|
8830
|
-
|
|
8485
|
+
// Note: No need to revoke URL since it's a direct URL from the API, not a blob URL
|
|
8486
|
+
this.emailPdfUrl = null;
|
|
8831
8487
|
this.isLoadingEmail = false;
|
|
8832
8488
|
this.emailError = null;
|
|
8833
8489
|
}
|
|
8834
|
-
|
|
8835
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DocumentContentViewerComponent, isStandalone: false, selector: "document-content-viewer", inputs: { documentUrl: "documentUrl", contentType: "contentType", documentName: "documentName", selectedDocument: "selectedDocument", contextId: "contextId", isFormHide: "isFormHide" }, host: { listeners: { "wheel": "onWheel($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-content-viewer-container\">\r\n @if(documentUrl && contentType){\r\n <!-- Zoom Controls -->\r\n <div class=\"zoom-controls-wrapper\">\r\n <document-zoom-controls \r\n [selectedDocument]=\"selectedDocument\" \r\n [contextId]=\"contextId\"\r\n [isFormHide]=\"isFormHide\"\r\n >\r\n </document-zoom-controls>\r\n </div>\r\n \r\n <!-- PDF Viewer -->\r\n @if(isPdf){\r\n <div class=\"pdf-container\">\r\n <pdf-viewer\r\n [src]=\"documentUrl\"\r\n [rotation]=\"0\"\r\n [original-size]=\"false\"\r\n [show-all]=\"true\"\r\n [fit-to-page]=\"false\"\r\n [zoom]=\"currentZoom / 100\"\r\n [zoom-scale]=\"'page-width'\"\r\n [stick-to-page]=\"false\"\r\n [render-text]=\"true\"\r\n [external-link-target]=\"'blank'\"\r\n [autoresize]=\"true\"\r\n [show-borders]=\"false\"\r\n style=\"width: 100%; height: 100%\"\r\n ></pdf-viewer>\r\n </div>\r\n }\r\n\r\n <!-- Image Viewer -->\r\n @else if(isImage){\r\n <div class=\"image-container\">\r\n <img\r\n [src]=\"documentUrl\"\r\n [alt]=\"documentName || 'Document Image'\"\r\n class=\"document-image\"\r\n [style.transform]=\"'scale(' + (currentZoom / 100) + ')'\"\r\n [style.transform-origin]=\"'center center'\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Excel Files -->\r\n @else if(isExcel){\r\n <div class=\"excel-container\">\r\n @if(isLoadingExcel){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading Excel file...</p>\r\n </div>\r\n </div>\r\n }@else if(excelError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading Excel File</h4>\r\n <p>{{ excelError }}</p>\r\n <div class=\"error-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(excelData){\r\n <div class=\"excel-container\">\r\n <div class=\"excel-zoom-wrapper\" \r\n [class.zoomed]=\"currentZoom !== 100\"\r\n (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer\r\n [url]=\"documentUrl\"\r\n viewer=\"office\"\r\n style=\"width:100%;height:97%;\"\r\n ></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" \r\n (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Word Files -->\r\n @else if(isWord){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" \r\n [class.zoomed]=\"currentZoom !== 100\"\r\n (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer\r\n [url]=\"documentUrl\"\r\n viewer=\"office\"\r\n style=\"width:100%;height:97%;\"\r\n ></ngx-doc-viewer>\r\n <div class=\"wheel-capture-overlay\" \r\n (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- CSV Files -->\r\n @else if(isCsv){\r\n <div class=\"csv-container\">\r\n @if(isLoadingCsv){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading CSV file...</p>\r\n </div>\r\n </div>\r\n }@else if(csvError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading CSV File</h4>\r\n <p>{{ csvError }}</p>\r\n <div class=\"error-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(csvData){\r\n <div class=\"csv-content\">\r\n <div class=\"csv-header\">\r\n <div class=\"csv-info\">\r\n <p>{{ documentName || 'CSV File' }}</p>\r\n <span class=\"csv-stats\">\r\n {{ csvData.totalRows }} rows \u00D7 {{ csvData.totalColumns }} columns\r\n </span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"csv-table-container\" \r\n [style.transform-origin]=\"'center center'\"\r\n (wheel)=\"onWheel($event)\">\r\n <p-table \r\n [value]=\"safeCsvStyledData\" \r\n [tableStyle]=\"{'min-width': '100%'}\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"67vh\"\r\n class=\"csv-table\"\r\n >\r\n <ng-template pTemplate=\"body\" let-row>\r\n <tr>\r\n <ng-container *ngFor=\"let cell of row.cells; trackBy: trackByCell\">\r\n <td [ngClass]=\"{'csv-header-cell': cell.isHeader}\">\r\n {{ cell.value }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Email Files -->\r\n @else if(isEmail){\r\n <div class=\"email-container\">\r\n @if(isLoadingEmail){\r\n <div class=\"loading-container\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem;\"></i>\r\n <p>Loading email...</p>\r\n </div>\r\n }\r\n @else if(emailError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-circle\" style=\"font-size: 2rem; color: #ef4444;\"></i>\r\n <h4>Unable to Preview Email</h4>\r\n <p>{{ emailError }}</p>\r\n <div class=\"error-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(emailData){\r\n <div class=\"email-viewer ml-3\">\r\n <div class=\"email-header\">\r\n <h3 class=\"email-subject\">{{ emailData.subject }}</h3>\r\n <div class=\"email-metadata\">\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">From:</span>\r\n <span class=\"field-value\">{{ emailData.from }}</span>\r\n </div>\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">To:</span>\r\n <span class=\"field-value\">{{ emailData.to }}</span>\r\n </div>\r\n @if(emailData.cc){\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">CC:</span>\r\n <span class=\"field-value\">{{ emailData.cc }}</span>\r\n </div>\r\n }\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">Date:</span>\r\n <span class=\"field-value\">{{ emailData.date }}</span>\r\n </div>\r\n @if(emailData.attachments && emailData.attachments.length > 0){\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">Attachments:</span>\r\n <span class=\"field-value\">\r\n <i class=\"pi pi-paperclip\"></i>\r\n {{ emailData.attachments.length }} attachment(s)\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"email-body-container\">\r\n \r\n <div class=\"email-body email-body-text\">\r\n <pre>{{ emailData.body }}</pre>\r\n </div>\r\n </div>\r\n @if(emailData.attachments && emailData.attachments.length > 0){\r\n <div class=\"email-attachments\">\r\n <h4>Attachments</h4>\r\n <div class=\"attachment-list\">\r\n @for(attachment of emailData.attachments; track attachment.filename){\r\n <div class=\"attachment-item\">\r\n <i class=\"pi pi-file\"></i>\r\n <span>{{ attachment.filename }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @else {\r\n <div class=\"no-email-data\">\r\n <i class=\"pi pi-envelope\" style=\"font-size: 3rem; color: #6b7280;\"></i>\r\n <p>No email data available</p>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- OpenDocument Files -->\r\n @else if(isOpenDocument){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" \r\n [class.zoomed]=\"currentZoom !== 100\"\r\n (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer\r\n [url]=\"documentUrl\"\r\n viewer=\"office\"\r\n style=\"width:100%;height:800px;\"\r\n ></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" \r\n (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Unsupported Files -->\r\n @else if(isUnsupported){\r\n <div class=\"unsupported-document-container\">\r\n <div class=\"document-preview\">\r\n <div class=\"document-icon\">\r\n <i [class]=\"documentIcon\"></i>\r\n </div>\r\n <div class=\"document-info\">\r\n <h4>Unsupported Document Type</h4>\r\n <p>{{ documentName || 'Document' }}</p>\r\n <p class=\"document-note\">This document type ({{ contentType }}) is not supported for preview. Please download to view.</p>\r\n </div>\r\n <div class=\"document-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-outlined p-button-sm\"\r\n (click)=\"openInNewTab()\"\r\n >\r\n <i class=\"pi pi-external-link\"></i>\r\n Open\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @else {\r\n <div class=\"no-document-container\">\r\n <div class=\"no-document-content\">\r\n <i class=\"pi pi-file-o\" style=\"font-size: 3rem; color: #6b7280;\"></i>\r\n <h4>No Document Uploaded</h4>\r\n <p>Please Upload a document to view its content.</p>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n\r\n", styles: [".document-content-viewer-container{height:100%;width:100%;display:flex;flex-direction:column;background:#f8f9fa;border-radius:8px;overflow:auto}.document-content-viewer-container .zoom-controls-wrapper{position:sticky;top:0;z-index:10;background:#f8f9faf2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid #e5e7eb;justify-content:space-between;align-items:center;border-radius:10px}.document-content-viewer-container .docx-container{overflow:auto}.document-content-viewer-container .pdf-container{width:100%;height:100%;border-radius:8px;overflow:auto}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{height:100%;overflow:auto}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar{width:12px;height:12px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb{background:#888;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb:hover{background:#555}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.document-content-viewer-container .image-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:1rem;overflow:auto}.document-content-viewer-container .image-container .document-image{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a;transition:transform .2s ease-in-out}.document-content-viewer-container .excel-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.document-content-viewer-container .excel-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .loading-container .loading-content{text-align:center;color:#6b7280}.document-content-viewer-container .excel-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.document-content-viewer-container .excel-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.document-content-viewer-container .excel-container .error-container .error-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.document-content-viewer-container .excel-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .error-container .error-content .error-actions{display:flex;justify-content:center}.document-content-viewer-container .excel-container .excel-viewer{width:100%;height:100%;display:flex;flex-direction:column}.document-content-viewer-container .excel-container .excel-viewer .excel-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;background:#f8fafc;border-bottom:1px solid #e2e8f0}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{display:flex;align-items:center;gap:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info i{font-size:2rem;color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{margin:0 0 .25rem;color:#1f2937;font-size:1.125rem;font-weight:600}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{margin:0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{display:flex;gap:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button.p-button-sm{padding:.375rem .75rem;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content{flex:1;display:flex;flex-direction:column;padding:1rem;background:#fafafa;overflow:hidden}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.5rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-label{font-size:.875rem;font-weight:500;color:#6b7280;margin-right:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{padding:.375rem .75rem;border:1px solid #d1d5db;background:#fff;border-radius:4px;font-size:.75rem;color:#6b7280;cursor:pointer;transition:all .2s}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#f3f4f6;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{flex:1;overflow:auto;background:#fff;border-radius:6px;border:1px solid #e5e7eb;margin-bottom:1rem;min-width:100%;position:relative;min-height:300px;overflow-x:auto;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container::-webkit-scrollbar{display:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{width:100%;min-width:max-content;border-collapse:collapse;font-size:.875rem;table-layout:auto;border:2px solid #e5e7eb;word-wrap:break-word;white-space:nowrap}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.5rem .75rem;text-align:left;border-bottom:1px solid #f3f4f6;border-right:1px solid #f3f4f6;min-width:80px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:normal;position:relative;box-sizing:border-box;vertical-align:top}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:empty:after{content:\"\";display:block;min-height:1.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:last-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:last-child{border-right:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:first-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{border-left:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table .empty-cell{background-color:#fafafa;color:#9ca3af;font-style:italic;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr{border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#f8fafc;font-weight:600;color:#374151;position:sticky;top:0;z-index:10;border-bottom:2px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{color:#6b7280;background:#fff}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{font-weight:500;color:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tbody tr:last-child td{border-bottom:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{display:flex;align-items:center;gap:1.5rem;padding:.75rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item{display:flex;align-items:center;gap:.5rem;color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item i{color:#10b981;font-size:.875rem}.document-content-viewer-container .office-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .office-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .office-document-container .document-preview .document-icon i{font-size:4rem;color:#3b82f6}.document-content-viewer-container .office-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .office-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#1f2937;font-size:1.25rem;font-weight:600}.document-content-viewer-container .office-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note{color:#9ca3af;font-style:italic;margin-top:.75rem}.document-content-viewer-container .office-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .unsupported-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .unsupported-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%;border:2px solid #fbbf24}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:4rem;color:#f59e0b}.document-content-viewer-container .unsupported-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#92400e;font-size:1.25rem;font-weight:600}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#d97706;font-style:italic;margin-top:.75rem;background:#fef3c7;padding:.5rem;border-radius:6px;border:1px solid #fde68a}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .no-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .no-document-container .no-document-content{text-align:center;color:#6b7280}.document-content-viewer-container .no-document-container .no-document-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .no-document-container .no-document-content h4{margin:0 0 .5rem;color:#374151;font-size:1.25rem;font-weight:600}.document-content-viewer-container .no-document-container .no-document-content p{margin:0;color:#9ca3af;font-size:.875rem}@media (max-width: 768px){.document-content-viewer-container .office-document-container,.document-content-viewer-container .unsupported-document-container{padding:1rem}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{padding:1.5rem;max-width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon i,.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:3rem}.document-content-viewer-container .office-document-container .document-preview .document-actions,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{flex-direction:column;align-items:center}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{width:100%;max-width:200px}.document-content-viewer-container .image-container{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header{flex-direction:column;gap:1rem;padding:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{justify-content:center}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{justify-content:center;width:100%}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button{flex:1;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{flex-wrap:wrap;gap:.25rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{font-size:.7rem;padding:.25rem .5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.25rem .5rem;min-width:80px;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{flex-wrap:wrap;gap:1rem;font-size:.7rem}}@media (prefers-color-scheme: dark){.document-content-viewer-container{background:#1f2937}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{background:#374151;color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info h4,.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info p,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{color:#d1d5db}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#9ca3af;background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-header{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#6b7280;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#6b7280;color:#f9fafb;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{background:#4b5563;color:#d1d5db;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .no-document-container .no-document-content{color:#9ca3af}.document-content-viewer-container .no-document-container .no-document-content h4{color:#f9fafb}.document-content-viewer-container .no-document-container .no-document-content p{color:#d1d5db}}.excel-table{border-collapse:collapse;width:100%;font-size:.875rem}.excel-table th,.excel-table td{padding:.5rem;border:1px solid #e2e8f0;text-align:left;vertical-align:top;min-width:80px}.excel-table th[style*=background-color]:not([style*=color]),.excel-table td[style*=background-color]:not([style*=color]){color:#1f2937}.excel-table th[style*=\"font-weight: bold\"],.excel-table td[style*=\"font-weight: bold\"]{font-weight:600}.excel-table th[style*=\"font-style: italic\"],.excel-table td[style*=\"font-style: italic\"]{font-style:italic}.excel-table th{background-color:#f8fafc;font-weight:600;color:#475569;position:sticky;top:0;z-index:10}.excel-table td{background-color:#fff}.excel-table td.empty-cell{background-color:#f8fafc;color:#9ca3af}.excel-table tbody tr:hover td{background-color:#f1f5f9}.excel-table tbody tr:hover td[style*=background-color]{opacity:.8}.debug-info{margin-top:1rem;padding:1rem;background-color:#fef3c7;border:1px solid #f59e0b;border-radius:8px}.debug-info summary{cursor:pointer;font-weight:600;color:#d97706;margin-bottom:.5rem}.debug-info summary:hover{color:#b45309}.debug-info .debug-content{margin-top:.5rem}.debug-info .debug-content p{margin:.5rem 0;color:#92400e}.debug-info .debug-content ul{margin:.5rem 0;padding-left:1.5rem;color:#92400e}.debug-info .debug-content li{margin:.25rem 0}.debug-info .debug-content button{margin-top:.5rem}.docx-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;overflow:hidden}.docx-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .loading-container .loading-content{text-align:center;color:#6b7280}.docx-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.docx-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.docx-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.docx-container .error-container .error-content i{margin-bottom:1rem;display:block}.docx-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.docx-container .error-container .error-content p{margin:0 0 1rem;color:#9ca3af;font-size:.875rem}.docx-container .error-container .error-content .error-actions{margin-top:1rem}.docx-container .docx-viewer{width:100%;height:100%;display:flex;flex-direction:column;background:#fff}.docx-container .docx-viewer .docx-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid #e5e7eb;background-color:#f9fafb}.docx-container .docx-viewer .docx-header .docx-info{display:flex;align-items:center;gap:1rem}.docx-container .docx-viewer .docx-header .docx-info i{font-size:2rem;color:#2563eb}.docx-container .docx-viewer .docx-header .docx-info .docx-details h4{margin:0 0 .25rem;font-size:1.125rem;font-weight:600;color:#111827}.docx-container .docx-viewer .docx-header .docx-info .docx-details p{margin:0 0 .125rem;font-size:.875rem;color:#6b7280}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-title{font-weight:500;color:#374151;font-size:.875rem}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-author{font-style:italic;color:#6b7280;font-size:.75rem}.docx-container .docx-viewer .docx-header .docx-actions{display:flex;gap:.5rem}.docx-container .docx-viewer .docx-content{flex:1;overflow:auto;padding:1.5rem}.docx-container .docx-viewer .docx-content .docx-stats{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:1.5rem;padding:1rem;background-color:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.docx-container .docx-viewer .docx-content .docx-stats .stat-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background-color:#fff;border-radius:6px;border:1px solid #e2e8f0;font-size:.75rem;color:#475569;font-weight:500}.docx-container .docx-viewer .docx-content .docx-stats .stat-item i{color:#64748b}.docx-container .docx-viewer .docx-content .docx-content-body{line-height:1.6;color:#1f2937}.docx-container .docx-viewer .docx-content .docx-content-body .docx-paragraph{margin:0 0 1rem;text-align:justify}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading{margin:1.5rem 0 1rem;font-weight:600;color:#111827;line-height:1.3}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h1{font-size:1.875rem;border-bottom:2px solid #e5e7eb;padding-bottom:.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h2{font-size:1.5rem;border-bottom:1px solid #e5e7eb;padding-bottom:.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h3{font-size:1.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h4,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h5,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h6{font-size:1.125rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table{width:100%;margin:1rem 0;border-collapse:collapse;border:1px solid #e5e7eb;background-color:#fff}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{background-color:#f8fafc;font-weight:600;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-cell,.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{padding:.75rem;border:1px solid #e5e7eb;text-align:left;vertical-align:top}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-row:hover{background-color:#f9fafb}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list{margin:1rem 0;padding-left:1.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ul{list-style-type:disc}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ol{list-style-type:decimal}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list .docx-list-item{margin:.5rem 0;line-height:1.5}.docx-container .docx-viewer .docx-content .docx-content-body .docx-image{max-width:100%;height:auto;border-radius:6px;box-shadow:0 2px 4px #0000001a;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body blockquote{margin:1rem 0;padding:1rem 1.5rem;border-left:4px solid #3b82f6;background-color:#f8fafc;font-style:italic;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body pre,.docx-container .docx-viewer .docx-content .docx-content-body code{background-color:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:.5rem;font-family:Courier New,monospace;font-size:.875rem;color:#1e293b;overflow-x:auto}.docx-container .docx-viewer .docx-content .docx-content-body pre{padding:1rem;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body a{color:#2563eb;text-decoration:none}.docx-container .docx-viewer .docx-content .docx-content-body a:hover{text-decoration:underline}.docx-container .docx-viewer .docx-content .docx-content-body em,.docx-container .docx-viewer .docx-content .docx-content-body i{font-style:italic}.docx-container .docx-viewer .docx-content .docx-content-body strong,.docx-container .docx-viewer .docx-content .docx-content-body b{font-weight:600}.docx-container .docx-viewer .docx-content .docx-content-body hr{border:none;border-top:1px solid #e5e7eb;margin:2rem 0}.word-loading-container{display:flex;align-items:center;justify-content:center;min-height:400px;width:100%;background-color:#f9fafb;border-radius:8px}.word-loading-container .loading-content{text-align:center}.word-loading-container .loading-content i{margin-bottom:1rem;display:block;font-size:2rem;color:#3b82f6}.word-loading-container .loading-content p{margin:0;color:#6b7280;font-size:1rem;font-weight:500}.docx-container{min-height:400px;overflow:auto}.doc-viewer-wrapper{transition:transform .2s ease-in-out;overflow:auto;position:relative;transform-origin:center center;height:100%;scroll-behavior:smooth}.doc-viewer-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.doc-viewer-wrapper .wheel-capture-overlay:active{pointer-events:none}.doc-viewer-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}.excel-zoom-wrapper{overflow:auto;position:relative;height:100%;width:100%;scroll-behavior:smooth}.excel-zoom-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.excel-zoom-wrapper .wheel-capture-overlay:active{pointer-events:none}.excel-zoom-wrapper:not(.zoomed){display:flex;align-items:center;justify-content:center}.excel-zoom-wrapper.zoomed{overflow:auto;display:block}.excel-zoom-wrapper ngx-doc-viewer{transition:transform .2s ease-in-out;transform-origin:center center;display:block;width:100%;height:100%}.excel-zoom-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}ngx-doc-viewer{display:block;width:100%;height:100%}ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:center center}.csv-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container *{scrollbar-width:none;-ms-overflow-style:none}.csv-container *::-webkit-scrollbar{display:none}.csv-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .loading-container .loading-content{text-align:center;color:#6b7280}.csv-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.csv-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.csv-container .error-container .error-content i{margin-bottom:1rem;display:block}.csv-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.csv-container .error-container .error-content p{margin:0 0 1rem;color:#6b7280;font-size:.875rem}.csv-container .error-container .error-content .error-actions{margin-top:1rem}.csv-container .csv-content{width:100%;height:98%;display:flex;flex-direction:column;padding:1rem}.csv-container .csv-content .csv-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.csv-container .csv-content .csv-header .csv-info h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem;font-weight:600}.csv-container .csv-content .csv-header .csv-info p{margin:0 0 .25rem;color:#6b7280;font-size:.875rem}.csv-container .csv-content .csv-header .csv-info .csv-stats{display:inline-block;background-color:#f3f4f6;color:#6b7280;font-size:.75rem;padding:.25rem .5rem;border-radius:4px;font-weight:500}.csv-container .csv-content .csv-header .csv-actions{display:flex;gap:.5rem}.csv-container .csv-content .csv-table-container{flex:1;overflow:auto;border-radius:6px;min-width:0;min-height:0;transition:transform .2s ease-in-out;scroll-behavior:smooth;transform-origin:center center;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper{height:100%;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-table{border-collapse:collapse}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th{background-color:#f8f9fa;border:1px solid #e5e7eb;padding:.75rem;font-weight:600;color:#374151;text-align:left;position:sticky;top:0;z-index:1;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th.csv-header-cell{background-color:#f1f5f9;font-weight:700;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td{border:1px solid #e5e7eb;padding:.75rem;color:#374151;vertical-align:top;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td.csv-header-cell{background-color:#f1f5f9;font-weight:600;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:nth-child(2n){background-color:#f9fafb}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:hover{background-color:#f3f4f6}.csv-container .email-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container .email-container .loading-container{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .loading-container i{margin-bottom:1rem}.csv-container .email-container .loading-container p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .email-container .error-container .error-content{text-align:center;max-width:400px}.csv-container .email-container .error-container .error-content i{margin-bottom:1rem}.csv-container .email-container .error-container .error-content h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem}.csv-container .email-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.csv-container .email-container .error-container .error-content .error-actions{display:flex;justify-content:center;gap:.5rem}.csv-container .email-container .no-email-data{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .no-email-data i{margin-bottom:1rem}.csv-container .email-container .no-email-data p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .email-viewer{display:flex;flex-direction:column;height:100%;overflow:hidden}.csv-container .email-container .email-viewer .email-header{position:relative;padding:1.5rem;border-bottom:2px solid #e5e7eb;background:linear-gradient(to bottom,#fff,#f9fafb)}.csv-container .email-container .email-viewer .email-header .email-actions{position:absolute;top:1rem;right:1rem;display:flex;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-subject{margin:0 0 1rem;padding-right:100px;color:#111827;font-size:1.5rem;font-weight:600;line-height:1.4;word-break:break-word}.csv-container .email-container .email-viewer .email-header .email-metadata{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field{display:flex;gap:.75rem;font-size:.875rem;line-height:1.5}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-label{min-width:80px;color:#6b7280;font-weight:600}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value{color:#374151;word-break:break-word;flex:1}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value i{margin-right:.25rem;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container{flex:1;overflow:auto;padding:1.5rem;background:#fff}.csv-container .email-container .email-viewer .email-body-container .email-body{max-width:100%;min-height:200px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep p{margin:0 0 1rem;line-height:1.6}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a{color:#3b82f6;text-decoration:none}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a:hover{text-decoration:underline}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep img{max-width:100%;height:auto;border-radius:4px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table{border-collapse:collapse;width:100%;margin:1rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table td,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{padding:.5rem;border:1px solid #e5e7eb}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{background-color:#f9fafb;font-weight:600}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep blockquote{margin:1rem 0;padding-left:1rem;border-left:3px solid #e5e7eb;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ul,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ol{margin:0 0 1rem;padding-left:1.5rem}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep li{margin:.25rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-text pre{margin:0;padding:1rem;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;font-family:Courier New,Courier,monospace;font-size:.875rem;line-height:1.6;color:#374151;white-space:pre-wrap;word-break:break-word;overflow-x:auto}.csv-container .email-container .email-viewer .email-attachments{padding:1rem 1.5rem;border-top:1px solid #e5e7eb;background:#f9fafb}.csv-container .email-container .email-viewer .email-attachments h4{margin:0 0 .75rem;color:#374151;font-size:.875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.csv-container .email-container .email-viewer .email-attachments .attachment-list{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item{display:flex;align-items:center;gap:.5rem;padding:.625rem .875rem;background:#fff;border:1px solid #e5e7eb;border-radius:6px;font-size:.875rem;color:#374151;transition:all .2s ease}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item i{color:#6b7280;font-size:1rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item span{word-break:break-word}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item:hover{background:#f3f4f6;border-color:#d1d5db}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i9$2.PdfViewerComponent, selector: "pdf-viewer", inputs: ["src", "c-maps-url", "page", "render-text", "render-text-mode", "original-size", "show-all", "stick-to-page", "zoom", "zoom-scale", "rotation", "external-link-target", "autoresize", "fit-to-page", "show-borders"], outputs: ["after-load-complete", "page-rendered", "pages-initialized", "text-layer-rendered", "error", "on-progress", "pageChange"] }, { kind: "component", type: i10$1.NgxDocViewerComponent, selector: "ngx-doc-viewer", inputs: ["url", "queryParams", "viewerUrl", "googleCheckInterval", "googleMaxChecks", "disableContent", "googleCheckContentLoaded", "viewer", "overrideLocalhost"], outputs: ["loaded"] }, { kind: "component", type: i2$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: DocumentZoomControlsComponent, selector: "document-zoom-controls", inputs: ["selectedDocument", "contextId", "isFormHide"], outputs: ["documentNameUpdated"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
8490
|
+
/**
|
|
8491
|
+
* Computed property to determine if email should be displayed as PDF
|
|
8492
|
+
* @type {boolean}
|
|
8493
|
+
*/
|
|
8494
|
+
get isEmailAsPdf() {
|
|
8495
|
+
return this.isEmail && !!this.emailPdfUrl;
|
|
8496
|
+
}
|
|
8497
|
+
/**
|
|
8498
|
+
* Cleanup when component is destroyed
|
|
8499
|
+
*/
|
|
8500
|
+
ngOnDestroy() {
|
|
8501
|
+
// Note: No need to revoke URL since it's a direct URL from the API, not a blob URL
|
|
8502
|
+
this.emailPdfUrl = null;
|
|
8503
|
+
}
|
|
8504
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentContentViewerComponent, deps: [{ token: ExcelParserService }, { token: CsvParserService }, { token: DocumentHttpService }, { token: DocumentZoomService }, { token: i5$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
8505
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DocumentContentViewerComponent, isStandalone: false, selector: "document-content-viewer", inputs: { documentUrl: "documentUrl", contentType: "contentType", documentName: "documentName", selectedDocument: "selectedDocument", contextId: "contextId", isFormHide: "isFormHide" }, host: { listeners: { "wheel": "onWheel($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-content-viewer-container\">\n @if(documentUrl && contentType){\n <!-- Zoom Controls -->\n <div class=\"zoom-controls-wrapper\">\n <document-zoom-controls [selectedDocument]=\"selectedDocument\" [contextId]=\"contextId\" [isFormHide]=\"isFormHide\">\n </document-zoom-controls>\n </div>\n\n <!-- PDF Viewer -->\n @if(isPdf){\n <div class=\"pdf-container\">\n <pdf-viewer [src]=\"documentUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\n [zoom]=\"currentZoom / 100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\n style=\"width: 100%; height: 100%\"></pdf-viewer>\n </div>\n }\n\n <!-- Image Viewer -->\n @else if(isImage){\n <div class=\"image-container\">\n <img [src]=\"documentUrl\" [alt]=\"documentName || 'Document Image'\" class=\"document-image\"\n [style.transform]=\"'scale(' + (currentZoom / 100) + ')'\" [style.transform-origin]=\"'center center'\" />\n </div>\n }\n\n <!-- Excel Files -->\n @else if(isExcel){\n <div class=\"excel-container\">\n @if(isLoadingExcel){\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\n <p>Loading Excel file...</p>\n </div>\n </div>\n }@else if(excelError){\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\n <h4>Error Loading Excel File</h4>\n <p>{{ excelError }}</p>\n <div class=\"error-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download Instead\n </button>\n </div>\n </div>\n </div>\n }\n @else if(excelData){\n <div class=\"excel-container\">\n <div class=\"excel-zoom-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\n <!-- Invisible overlay to capture wheel events over document content -->\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Word Files -->\n @else if(isWord){\n <div class=\"docx-container\">\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\n </div>\n </div>\n }\n\n <!-- CSV Files -->\n @else if(isCsv){\n <div class=\"csv-container\">\n @if(isLoadingCsv){\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\n <p>Loading CSV file...</p>\n </div>\n </div>\n }@else if(csvError){\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\n <h4>Error Loading CSV File</h4>\n <p>{{ csvError }}</p>\n <div class=\"error-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download Instead\n </button>\n </div>\n </div>\n </div>\n }\n @else if(csvData){\n <div class=\"csv-content\">\n <div class=\"csv-header\">\n <div class=\"csv-info\">\n <p>{{ documentName || 'CSV File' }}</p>\n <span class=\"csv-stats\">\n {{ csvData.totalRows }} rows \u00D7 {{ csvData.totalColumns }} columns\n </span>\n </div>\n </div>\n\n <div class=\"csv-table-container\" [style.transform-origin]=\"'center center'\" (wheel)=\"onWheel($event)\">\n <p-table [value]=\"safeCsvStyledData\" [tableStyle]=\"{'min-width': '100%'}\" [scrollable]=\"true\"\n scrollHeight=\"67vh\" class=\"csv-table\">\n <ng-template pTemplate=\"body\" let-row>\n <tr>\n <ng-container *ngFor=\"let cell of row.cells; trackBy: trackByCell\">\n <td [ngClass]=\"{'csv-header-cell': cell.isHeader}\">\n {{ cell.value }}\n </td>\n </ng-container>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Email Files -->\n @else if(isEmail){\n <div class=\"email-container\">\n @if(isLoadingEmail){\n <div class=\"loading-container text-center m-1/2\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem;\"></i>\n <p>Opening email...</p>\n </div>\n }\n @else if(isEmailAsPdf && emailPdfUrl){\n <!-- Render PDF when email is converted -->\n <pdf-viewer [src]=\"emailPdfUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\n [zoom]=\"currentZoom/100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\n style=\"width: 100%; height: 82vh;\"></pdf-viewer>\n }\n @else if(emailError){\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"pi pi-exclamation-circle\" style=\"font-size: 2rem; color: #ef4444;\"></i>\n <h4>Unable to Preview Email</h4>\n <p>{{ emailError }}</p>\n <div class=\"error-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- OpenDocument Files -->\n @else if(isOpenDocument){\n <div class=\"docx-container\">\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:800px;\"></ngx-doc-viewer>\n <!-- Invisible overlay to capture wheel events over document content -->\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\n </div>\n </div>\n }\n\n <!-- Unsupported Files -->\n @else if(isUnsupported){\n <div class=\"unsupported-document-container\">\n <div class=\"document-preview\">\n <div class=\"document-icon\">\n <i [class]=\"documentIcon\"></i>\n </div>\n <div class=\"document-info\">\n <h4>Unsupported Document Type</h4>\n <p>{{ documentName || 'Document' }}</p>\n <p class=\"document-note\">This document type ({{ contentType }}) is not supported for preview. Please download to\n view.</p>\n </div>\n <div class=\"document-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download\n </button>\n <button type=\"button\" class=\"p-button p-button-outlined p-button-sm\" (click)=\"openInNewTab()\">\n <i class=\"pi pi-external-link\"></i>\n Open\n </button>\n </div>\n </div>\n </div>\n }\n }\n @else {\n <div class=\"no-document-container\">\n <div class=\"no-document-content\">\n <i class=\"pi pi-file-o\" style=\"font-size: 3rem; color: #6b7280;\"></i>\n <h4>No Document Uploaded</h4>\n <p>Please Upload a document to view its content.</p>\n </div>\n </div>\n }\n</div>", styles: [".document-content-viewer-container{height:100%;width:100%;display:flex;flex-direction:column;background:#f8f9fa;border-radius:8px;overflow:auto}.document-content-viewer-container .zoom-controls-wrapper{position:sticky;top:0;z-index:10;background:#f8f9faf2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid #e5e7eb;justify-content:space-between;align-items:center;border-radius:10px}.document-content-viewer-container .docx-container{overflow:auto}.document-content-viewer-container .email-container{width:100%;height:100%;border-radius:8px;overflow:hidden}.document-content-viewer-container .email-container ::ng-deep .ng2-pdf-viewer-container{height:82%!important;overflow:auto}.document-content-viewer-container .pdf-container{width:100%;height:100%;border-radius:8px;overflow:hidden}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{height:100%;overflow:auto}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar{width:12px;height:12px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb{background:#888;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb:hover{background:#555}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.document-content-viewer-container .image-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:1rem;overflow:auto}.document-content-viewer-container .image-container .document-image{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a;transition:transform .2s ease-in-out}.document-content-viewer-container .excel-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.document-content-viewer-container .excel-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .loading-container .loading-content{text-align:center;color:#6b7280}.document-content-viewer-container .excel-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.document-content-viewer-container .excel-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.document-content-viewer-container .excel-container .error-container .error-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.document-content-viewer-container .excel-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .error-container .error-content .error-actions{display:flex;justify-content:center}.document-content-viewer-container .excel-container .excel-viewer{width:100%;height:100%;display:flex;flex-direction:column}.document-content-viewer-container .excel-container .excel-viewer .excel-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;background:#f8fafc;border-bottom:1px solid #e2e8f0}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{display:flex;align-items:center;gap:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info i{font-size:2rem;color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{margin:0 0 .25rem;color:#1f2937;font-size:1.125rem;font-weight:600}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{margin:0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{display:flex;gap:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button.p-button-sm{padding:.375rem .75rem;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content{flex:1;display:flex;flex-direction:column;padding:1rem;background:#fafafa;overflow:hidden}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.5rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-label{font-size:.875rem;font-weight:500;color:#6b7280;margin-right:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{padding:.375rem .75rem;border:1px solid #d1d5db;background:#fff;border-radius:4px;font-size:.75rem;color:#6b7280;cursor:pointer;transition:all .2s}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#f3f4f6;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{flex:1;overflow:auto;background:#fff;border-radius:6px;border:1px solid #e5e7eb;margin-bottom:1rem;min-width:100%;position:relative;min-height:300px;overflow-x:auto;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container::-webkit-scrollbar{display:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{width:100%;min-width:max-content;border-collapse:collapse;font-size:.875rem;table-layout:auto;border:2px solid #e5e7eb;word-wrap:break-word;white-space:nowrap}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.5rem .75rem;text-align:left;border-bottom:1px solid #f3f4f6;border-right:1px solid #f3f4f6;min-width:80px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:normal;position:relative;box-sizing:border-box;vertical-align:top}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:empty:after{content:\"\";display:block;min-height:1.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:last-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:last-child{border-right:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:first-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{border-left:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table .empty-cell{background-color:#fafafa;color:#9ca3af;font-style:italic;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr{border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#f8fafc;font-weight:600;color:#374151;position:sticky;top:0;z-index:10;border-bottom:2px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{color:#6b7280;background:#fff}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{font-weight:500;color:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tbody tr:last-child td{border-bottom:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{display:flex;align-items:center;gap:1.5rem;padding:.75rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item{display:flex;align-items:center;gap:.5rem;color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item i{color:#10b981;font-size:.875rem}.document-content-viewer-container .office-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .office-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .office-document-container .document-preview .document-icon i{font-size:4rem;color:#3b82f6}.document-content-viewer-container .office-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .office-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#1f2937;font-size:1.25rem;font-weight:600}.document-content-viewer-container .office-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note{color:#9ca3af;font-style:italic;margin-top:.75rem}.document-content-viewer-container .office-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .unsupported-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .unsupported-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%;border:2px solid #fbbf24}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:4rem;color:#f59e0b}.document-content-viewer-container .unsupported-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#92400e;font-size:1.25rem;font-weight:600}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#d97706;font-style:italic;margin-top:.75rem;background:#fef3c7;padding:.5rem;border-radius:6px;border:1px solid #fde68a}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .no-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .no-document-container .no-document-content{text-align:center;color:#6b7280}.document-content-viewer-container .no-document-container .no-document-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .no-document-container .no-document-content h4{margin:0 0 .5rem;color:#374151;font-size:1.25rem;font-weight:600}.document-content-viewer-container .no-document-container .no-document-content p{margin:0;color:#9ca3af;font-size:.875rem}@media (max-width: 768px){.document-content-viewer-container .office-document-container,.document-content-viewer-container .unsupported-document-container{padding:1rem}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{padding:1.5rem;max-width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon i,.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:3rem}.document-content-viewer-container .office-document-container .document-preview .document-actions,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{flex-direction:column;align-items:center}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{width:100%;max-width:200px}.document-content-viewer-container .image-container{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header{flex-direction:column;gap:1rem;padding:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{justify-content:center}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{justify-content:center;width:100%}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button{flex:1;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{flex-wrap:wrap;gap:.25rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{font-size:.7rem;padding:.25rem .5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.25rem .5rem;min-width:80px;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{flex-wrap:wrap;gap:1rem;font-size:.7rem}}@media (prefers-color-scheme: dark){.document-content-viewer-container{background:#1f2937}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{background:#374151;color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info h4,.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info p,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{color:#d1d5db}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#9ca3af;background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-header{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#6b7280;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#6b7280;color:#f9fafb;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{background:#4b5563;color:#d1d5db;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .no-document-container .no-document-content{color:#9ca3af}.document-content-viewer-container .no-document-container .no-document-content h4{color:#f9fafb}.document-content-viewer-container .no-document-container .no-document-content p{color:#d1d5db}}.excel-table{border-collapse:collapse;width:100%;font-size:.875rem}.excel-table th,.excel-table td{padding:.5rem;border:1px solid #e2e8f0;text-align:left;vertical-align:top;min-width:80px}.excel-table th[style*=background-color]:not([style*=color]),.excel-table td[style*=background-color]:not([style*=color]){color:#1f2937}.excel-table th[style*=\"font-weight: bold\"],.excel-table td[style*=\"font-weight: bold\"]{font-weight:600}.excel-table th[style*=\"font-style: italic\"],.excel-table td[style*=\"font-style: italic\"]{font-style:italic}.excel-table th{background-color:#f8fafc;font-weight:600;color:#475569;position:sticky;top:0;z-index:10}.excel-table td{background-color:#fff}.excel-table td.empty-cell{background-color:#f8fafc;color:#9ca3af}.excel-table tbody tr:hover td{background-color:#f1f5f9}.excel-table tbody tr:hover td[style*=background-color]{opacity:.8}.debug-info{margin-top:1rem;padding:1rem;background-color:#fef3c7;border:1px solid #f59e0b;border-radius:8px}.debug-info summary{cursor:pointer;font-weight:600;color:#d97706;margin-bottom:.5rem}.debug-info summary:hover{color:#b45309}.debug-info .debug-content{margin-top:.5rem}.debug-info .debug-content p{margin:.5rem 0;color:#92400e}.debug-info .debug-content ul{margin:.5rem 0;padding-left:1.5rem;color:#92400e}.debug-info .debug-content li{margin:.25rem 0}.debug-info .debug-content button{margin-top:.5rem}.docx-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;overflow:hidden}.docx-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .loading-container .loading-content{text-align:center;color:#6b7280}.docx-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.docx-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.docx-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.docx-container .error-container .error-content i{margin-bottom:1rem;display:block}.docx-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.docx-container .error-container .error-content p{margin:0 0 1rem;color:#9ca3af;font-size:.875rem}.docx-container .error-container .error-content .error-actions{margin-top:1rem}.docx-container .docx-viewer{width:100%;height:100%;display:flex;flex-direction:column;background:#fff}.docx-container .docx-viewer .docx-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid #e5e7eb;background-color:#f9fafb}.docx-container .docx-viewer .docx-header .docx-info{display:flex;align-items:center;gap:1rem}.docx-container .docx-viewer .docx-header .docx-info i{font-size:2rem;color:#2563eb}.docx-container .docx-viewer .docx-header .docx-info .docx-details h4{margin:0 0 .25rem;font-size:1.125rem;font-weight:600;color:#111827}.docx-container .docx-viewer .docx-header .docx-info .docx-details p{margin:0 0 .125rem;font-size:.875rem;color:#6b7280}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-title{font-weight:500;color:#374151;font-size:.875rem}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-author{font-style:italic;color:#6b7280;font-size:.75rem}.docx-container .docx-viewer .docx-header .docx-actions{display:flex;gap:.5rem}.docx-container .docx-viewer .docx-content{flex:1;overflow:auto;padding:1.5rem}.docx-container .docx-viewer .docx-content .docx-stats{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:1.5rem;padding:1rem;background-color:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.docx-container .docx-viewer .docx-content .docx-stats .stat-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background-color:#fff;border-radius:6px;border:1px solid #e2e8f0;font-size:.75rem;color:#475569;font-weight:500}.docx-container .docx-viewer .docx-content .docx-stats .stat-item i{color:#64748b}.docx-container .docx-viewer .docx-content .docx-content-body{line-height:1.6;color:#1f2937}.docx-container .docx-viewer .docx-content .docx-content-body .docx-paragraph{margin:0 0 1rem;text-align:justify}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading{margin:1.5rem 0 1rem;font-weight:600;color:#111827;line-height:1.3}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h1{font-size:1.875rem;border-bottom:2px solid #e5e7eb;padding-bottom:.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h2{font-size:1.5rem;border-bottom:1px solid #e5e7eb;padding-bottom:.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h3{font-size:1.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h4,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h5,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h6{font-size:1.125rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table{width:100%;margin:1rem 0;border-collapse:collapse;border:1px solid #e5e7eb;background-color:#fff}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{background-color:#f8fafc;font-weight:600;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-cell,.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{padding:.75rem;border:1px solid #e5e7eb;text-align:left;vertical-align:top}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-row:hover{background-color:#f9fafb}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list{margin:1rem 0;padding-left:1.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ul{list-style-type:disc}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ol{list-style-type:decimal}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list .docx-list-item{margin:.5rem 0;line-height:1.5}.docx-container .docx-viewer .docx-content .docx-content-body .docx-image{max-width:100%;height:auto;border-radius:6px;box-shadow:0 2px 4px #0000001a;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body blockquote{margin:1rem 0;padding:1rem 1.5rem;border-left:4px solid #3b82f6;background-color:#f8fafc;font-style:italic;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body pre,.docx-container .docx-viewer .docx-content .docx-content-body code{background-color:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:.5rem;font-family:Courier New,monospace;font-size:.875rem;color:#1e293b;overflow-x:auto}.docx-container .docx-viewer .docx-content .docx-content-body pre{padding:1rem;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body a{color:#2563eb;text-decoration:none}.docx-container .docx-viewer .docx-content .docx-content-body a:hover{text-decoration:underline}.docx-container .docx-viewer .docx-content .docx-content-body em,.docx-container .docx-viewer .docx-content .docx-content-body i{font-style:italic}.docx-container .docx-viewer .docx-content .docx-content-body strong,.docx-container .docx-viewer .docx-content .docx-content-body b{font-weight:600}.docx-container .docx-viewer .docx-content .docx-content-body hr{border:none;border-top:1px solid #e5e7eb;margin:2rem 0}.word-loading-container{display:flex;align-items:center;justify-content:center;min-height:400px;width:100%;background-color:#f9fafb;border-radius:8px}.word-loading-container .loading-content{text-align:center}.word-loading-container .loading-content i{margin-bottom:1rem;display:block;font-size:2rem;color:#3b82f6}.word-loading-container .loading-content p{margin:0;color:#6b7280;font-size:1rem;font-weight:500}.docx-container{min-height:400px;overflow:auto}.doc-viewer-wrapper{transition:transform .2s ease-in-out;overflow:auto;position:relative;transform-origin:center center;height:100%;scroll-behavior:smooth}.doc-viewer-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.doc-viewer-wrapper .wheel-capture-overlay:active{pointer-events:none}.doc-viewer-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}.excel-zoom-wrapper{overflow:auto;position:relative;height:100%;width:100%;scroll-behavior:smooth}.excel-zoom-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.excel-zoom-wrapper .wheel-capture-overlay:active{pointer-events:none}.excel-zoom-wrapper:not(.zoomed){display:flex;align-items:center;justify-content:center}.excel-zoom-wrapper.zoomed{overflow:auto;display:block}.excel-zoom-wrapper ngx-doc-viewer{transition:transform .2s ease-in-out;transform-origin:center center;display:block;width:100%;height:100%}.excel-zoom-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}ngx-doc-viewer{display:block;width:100%;height:100%}ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:center center}.csv-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container *{scrollbar-width:none;-ms-overflow-style:none}.csv-container *::-webkit-scrollbar{display:none}.csv-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .loading-container .loading-content{text-align:center;color:#6b7280}.csv-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.csv-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.csv-container .error-container .error-content i{margin-bottom:1rem;display:block}.csv-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.csv-container .error-container .error-content p{margin:0 0 1rem;color:#6b7280;font-size:.875rem}.csv-container .error-container .error-content .error-actions{margin-top:1rem}.csv-container .csv-content{width:100%;height:98%;display:flex;flex-direction:column;padding:1rem}.csv-container .csv-content .csv-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.csv-container .csv-content .csv-header .csv-info h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem;font-weight:600}.csv-container .csv-content .csv-header .csv-info p{margin:0 0 .25rem;color:#6b7280;font-size:.875rem}.csv-container .csv-content .csv-header .csv-info .csv-stats{display:inline-block;background-color:#f3f4f6;color:#6b7280;font-size:.75rem;padding:.25rem .5rem;border-radius:4px;font-weight:500}.csv-container .csv-content .csv-header .csv-actions{display:flex;gap:.5rem}.csv-container .csv-content .csv-table-container{flex:1;overflow:auto;border-radius:6px;min-width:0;min-height:0;transition:transform .2s ease-in-out;scroll-behavior:smooth;transform-origin:center center;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper{height:100%;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-table{border-collapse:collapse}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th{background-color:#f8f9fa;border:1px solid #e5e7eb;padding:.75rem;font-weight:600;color:#374151;text-align:left;position:sticky;top:0;z-index:1;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th.csv-header-cell{background-color:#f1f5f9;font-weight:700;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td{border:1px solid #e5e7eb;padding:.75rem;color:#374151;vertical-align:top;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td.csv-header-cell{background-color:#f1f5f9;font-weight:600;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:nth-child(2n){background-color:#f9fafb}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:hover{background-color:#f3f4f6}.csv-container .email-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container .email-container .loading-container{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .loading-container i{margin-bottom:1rem}.csv-container .email-container .loading-container p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .email-container .error-container .error-content{text-align:center;max-width:400px}.csv-container .email-container .error-container .error-content i{margin-bottom:1rem}.csv-container .email-container .error-container .error-content h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem}.csv-container .email-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.csv-container .email-container .error-container .error-content .error-actions{display:flex;justify-content:center;gap:.5rem}.csv-container .email-container .no-email-data{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .no-email-data i{margin-bottom:1rem}.csv-container .email-container .no-email-data p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .email-viewer{display:flex;flex-direction:column;height:100%;overflow:hidden}.csv-container .email-container .email-viewer .email-header{position:relative;padding:1.5rem;border-bottom:2px solid #e5e7eb;background:linear-gradient(to bottom,#fff,#f9fafb)}.csv-container .email-container .email-viewer .email-header .email-actions{position:absolute;top:1rem;right:1rem;display:flex;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-subject{margin:0 0 1rem;padding-right:100px;color:#111827;font-size:1.5rem;font-weight:600;line-height:1.4;word-break:break-word}.csv-container .email-container .email-viewer .email-header .email-metadata{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field{display:flex;gap:.75rem;font-size:.875rem;line-height:1.5}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-label{min-width:80px;color:#6b7280;font-weight:600}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value{color:#374151;word-break:break-word;flex:1}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value i{margin-right:.25rem;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container{flex:1;overflow:auto;padding:1.5rem;background:#fff}.csv-container .email-container .email-viewer .email-body-container .email-body{max-width:100%;min-height:200px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep p{margin:0 0 1rem;line-height:1.6}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a{color:#3b82f6;text-decoration:none}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a:hover{text-decoration:underline}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep img{max-width:100%;height:auto;border-radius:4px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table{border-collapse:collapse;width:100%;margin:1rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table td,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{padding:.5rem;border:1px solid #e5e7eb}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{background-color:#f9fafb;font-weight:600}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep blockquote{margin:1rem 0;padding-left:1rem;border-left:3px solid #e5e7eb;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ul,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ol{margin:0 0 1rem;padding-left:1.5rem}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep li{margin:.25rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-text pre{margin:0;padding:1rem;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;font-family:Courier New,Courier,monospace;font-size:.875rem;line-height:1.6;color:#374151;white-space:pre-wrap;word-break:break-word;overflow-x:auto}.csv-container .email-container .email-viewer .email-attachments{padding:1rem 1.5rem;border-top:1px solid #e5e7eb;background:#f9fafb}.csv-container .email-container .email-viewer .email-attachments h4{margin:0 0 .75rem;color:#374151;font-size:.875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.csv-container .email-container .email-viewer .email-attachments .attachment-list{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item{display:flex;align-items:center;gap:.5rem;padding:.625rem .875rem;background:#fff;border:1px solid #e5e7eb;border-radius:6px;font-size:.875rem;color:#374151;transition:all .2s ease}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item i{color:#6b7280;font-size:1rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item span{word-break:break-word}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item:hover{background:#f3f4f6;border-color:#d1d5db}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i8$1.PdfViewerComponent, selector: "pdf-viewer", inputs: ["src", "c-maps-url", "page", "render-text", "render-text-mode", "original-size", "show-all", "stick-to-page", "zoom", "zoom-scale", "rotation", "external-link-target", "autoresize", "fit-to-page", "show-borders"], outputs: ["after-load-complete", "page-rendered", "pages-initialized", "text-layer-rendered", "error", "on-progress", "pageChange"] }, { kind: "component", type: i9$2.NgxDocViewerComponent, selector: "ngx-doc-viewer", inputs: ["url", "queryParams", "viewerUrl", "googleCheckInterval", "googleMaxChecks", "disableContent", "googleCheckContentLoaded", "viewer", "overrideLocalhost"], outputs: ["loaded"] }, { kind: "component", type: i2$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: DocumentZoomControlsComponent, selector: "document-zoom-controls", inputs: ["selectedDocument", "contextId", "isFormHide"], outputs: ["documentNameUpdated"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
8836
8506
|
}
|
|
8837
8507
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentContentViewerComponent, decorators: [{
|
|
8838
8508
|
type: Component,
|
|
8839
|
-
args: [{ selector: 'document-content-viewer', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"document-content-viewer-container\">\r\n @if(documentUrl && contentType){\r\n <!-- Zoom Controls -->\r\n <div class=\"zoom-controls-wrapper\">\r\n <document-zoom-controls \r\n [selectedDocument]=\"selectedDocument\" \r\n [contextId]=\"contextId\"\r\n [isFormHide]=\"isFormHide\"\r\n >\r\n </document-zoom-controls>\r\n </div>\r\n \r\n <!-- PDF Viewer -->\r\n @if(isPdf){\r\n <div class=\"pdf-container\">\r\n <pdf-viewer\r\n [src]=\"documentUrl\"\r\n [rotation]=\"0\"\r\n [original-size]=\"false\"\r\n [show-all]=\"true\"\r\n [fit-to-page]=\"false\"\r\n [zoom]=\"currentZoom / 100\"\r\n [zoom-scale]=\"'page-width'\"\r\n [stick-to-page]=\"false\"\r\n [render-text]=\"true\"\r\n [external-link-target]=\"'blank'\"\r\n [autoresize]=\"true\"\r\n [show-borders]=\"false\"\r\n style=\"width: 100%; height: 100%\"\r\n ></pdf-viewer>\r\n </div>\r\n }\r\n\r\n <!-- Image Viewer -->\r\n @else if(isImage){\r\n <div class=\"image-container\">\r\n <img\r\n [src]=\"documentUrl\"\r\n [alt]=\"documentName || 'Document Image'\"\r\n class=\"document-image\"\r\n [style.transform]=\"'scale(' + (currentZoom / 100) + ')'\"\r\n [style.transform-origin]=\"'center center'\"\r\n />\r\n </div>\r\n }\r\n\r\n <!-- Excel Files -->\r\n @else if(isExcel){\r\n <div class=\"excel-container\">\r\n @if(isLoadingExcel){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading Excel file...</p>\r\n </div>\r\n </div>\r\n }@else if(excelError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading Excel File</h4>\r\n <p>{{ excelError }}</p>\r\n <div class=\"error-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(excelData){\r\n <div class=\"excel-container\">\r\n <div class=\"excel-zoom-wrapper\" \r\n [class.zoomed]=\"currentZoom !== 100\"\r\n (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer\r\n [url]=\"documentUrl\"\r\n viewer=\"office\"\r\n style=\"width:100%;height:97%;\"\r\n ></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" \r\n (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Word Files -->\r\n @else if(isWord){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" \r\n [class.zoomed]=\"currentZoom !== 100\"\r\n (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer\r\n [url]=\"documentUrl\"\r\n viewer=\"office\"\r\n style=\"width:100%;height:97%;\"\r\n ></ngx-doc-viewer>\r\n <div class=\"wheel-capture-overlay\" \r\n (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- CSV Files -->\r\n @else if(isCsv){\r\n <div class=\"csv-container\">\r\n @if(isLoadingCsv){\r\n <div class=\"loading-container\">\r\n <div class=\"loading-content\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\r\n <p>Loading CSV file...</p>\r\n </div>\r\n </div>\r\n }@else if(csvError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\r\n <h4>Error Loading CSV File</h4>\r\n <p>{{ csvError }}</p>\r\n <div class=\"error-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download Instead\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(csvData){\r\n <div class=\"csv-content\">\r\n <div class=\"csv-header\">\r\n <div class=\"csv-info\">\r\n <p>{{ documentName || 'CSV File' }}</p>\r\n <span class=\"csv-stats\">\r\n {{ csvData.totalRows }} rows \u00D7 {{ csvData.totalColumns }} columns\r\n </span>\r\n </div>\r\n </div>\r\n \r\n <div class=\"csv-table-container\" \r\n [style.transform-origin]=\"'center center'\"\r\n (wheel)=\"onWheel($event)\">\r\n <p-table \r\n [value]=\"safeCsvStyledData\" \r\n [tableStyle]=\"{'min-width': '100%'}\"\r\n [scrollable]=\"true\"\r\n scrollHeight=\"67vh\"\r\n class=\"csv-table\"\r\n >\r\n <ng-template pTemplate=\"body\" let-row>\r\n <tr>\r\n <ng-container *ngFor=\"let cell of row.cells; trackBy: trackByCell\">\r\n <td [ngClass]=\"{'csv-header-cell': cell.isHeader}\">\r\n {{ cell.value }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Email Files -->\r\n @else if(isEmail){\r\n <div class=\"email-container\">\r\n @if(isLoadingEmail){\r\n <div class=\"loading-container\">\r\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem;\"></i>\r\n <p>Loading email...</p>\r\n </div>\r\n }\r\n @else if(emailError){\r\n <div class=\"error-container\">\r\n <div class=\"error-content\">\r\n <i class=\"pi pi-exclamation-circle\" style=\"font-size: 2rem; color: #ef4444;\"></i>\r\n <h4>Unable to Preview Email</h4>\r\n <p>{{ emailError }}</p>\r\n <div class=\"error-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n @else if(emailData){\r\n <div class=\"email-viewer ml-3\">\r\n <div class=\"email-header\">\r\n <h3 class=\"email-subject\">{{ emailData.subject }}</h3>\r\n <div class=\"email-metadata\">\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">From:</span>\r\n <span class=\"field-value\">{{ emailData.from }}</span>\r\n </div>\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">To:</span>\r\n <span class=\"field-value\">{{ emailData.to }}</span>\r\n </div>\r\n @if(emailData.cc){\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">CC:</span>\r\n <span class=\"field-value\">{{ emailData.cc }}</span>\r\n </div>\r\n }\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">Date:</span>\r\n <span class=\"field-value\">{{ emailData.date }}</span>\r\n </div>\r\n @if(emailData.attachments && emailData.attachments.length > 0){\r\n <div class=\"email-field\">\r\n <span class=\"field-label\">Attachments:</span>\r\n <span class=\"field-value\">\r\n <i class=\"pi pi-paperclip\"></i>\r\n {{ emailData.attachments.length }} attachment(s)\r\n </span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"email-body-container\">\r\n \r\n <div class=\"email-body email-body-text\">\r\n <pre>{{ emailData.body }}</pre>\r\n </div>\r\n </div>\r\n @if(emailData.attachments && emailData.attachments.length > 0){\r\n <div class=\"email-attachments\">\r\n <h4>Attachments</h4>\r\n <div class=\"attachment-list\">\r\n @for(attachment of emailData.attachments; track attachment.filename){\r\n <div class=\"attachment-item\">\r\n <i class=\"pi pi-file\"></i>\r\n <span>{{ attachment.filename }}</span>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n @else {\r\n <div class=\"no-email-data\">\r\n <i class=\"pi pi-envelope\" style=\"font-size: 3rem; color: #6b7280;\"></i>\r\n <p>No email data available</p>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- OpenDocument Files -->\r\n @else if(isOpenDocument){\r\n <div class=\"docx-container\">\r\n <div class=\"doc-viewer-wrapper\" \r\n [class.zoomed]=\"currentZoom !== 100\"\r\n (wheel)=\"onWheel($event)\">\r\n <ngx-doc-viewer\r\n [url]=\"documentUrl\"\r\n viewer=\"office\"\r\n style=\"width:100%;height:800px;\"\r\n ></ngx-doc-viewer>\r\n <!-- Invisible overlay to capture wheel events over document content -->\r\n <div class=\"wheel-capture-overlay\" \r\n (wheel)=\"onWheel($event)\"></div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Unsupported Files -->\r\n @else if(isUnsupported){\r\n <div class=\"unsupported-document-container\">\r\n <div class=\"document-preview\">\r\n <div class=\"document-icon\">\r\n <i [class]=\"documentIcon\"></i>\r\n </div>\r\n <div class=\"document-info\">\r\n <h4>Unsupported Document Type</h4>\r\n <p>{{ documentName || 'Document' }}</p>\r\n <p class=\"document-note\">This document type ({{ contentType }}) is not supported for preview. Please download to view.</p>\r\n </div>\r\n <div class=\"document-actions\">\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-primary p-button-sm\"\r\n (click)=\"downloadDocument()\"\r\n >\r\n <i class=\"pi pi-download\"></i>\r\n Download\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"p-button p-button-outlined p-button-sm\"\r\n (click)=\"openInNewTab()\"\r\n >\r\n <i class=\"pi pi-external-link\"></i>\r\n Open\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n }\r\n @else {\r\n <div class=\"no-document-container\">\r\n <div class=\"no-document-content\">\r\n <i class=\"pi pi-file-o\" style=\"font-size: 3rem; color: #6b7280;\"></i>\r\n <h4>No Document Uploaded</h4>\r\n <p>Please Upload a document to view its content.</p>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n\r\n", styles: [".document-content-viewer-container{height:100%;width:100%;display:flex;flex-direction:column;background:#f8f9fa;border-radius:8px;overflow:auto}.document-content-viewer-container .zoom-controls-wrapper{position:sticky;top:0;z-index:10;background:#f8f9faf2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid #e5e7eb;justify-content:space-between;align-items:center;border-radius:10px}.document-content-viewer-container .docx-container{overflow:auto}.document-content-viewer-container .pdf-container{width:100%;height:100%;border-radius:8px;overflow:auto}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{height:100%;overflow:auto}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar{width:12px;height:12px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb{background:#888;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb:hover{background:#555}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.document-content-viewer-container .image-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:1rem;overflow:auto}.document-content-viewer-container .image-container .document-image{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a;transition:transform .2s ease-in-out}.document-content-viewer-container .excel-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.document-content-viewer-container .excel-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .loading-container .loading-content{text-align:center;color:#6b7280}.document-content-viewer-container .excel-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.document-content-viewer-container .excel-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.document-content-viewer-container .excel-container .error-container .error-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.document-content-viewer-container .excel-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .error-container .error-content .error-actions{display:flex;justify-content:center}.document-content-viewer-container .excel-container .excel-viewer{width:100%;height:100%;display:flex;flex-direction:column}.document-content-viewer-container .excel-container .excel-viewer .excel-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;background:#f8fafc;border-bottom:1px solid #e2e8f0}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{display:flex;align-items:center;gap:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info i{font-size:2rem;color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{margin:0 0 .25rem;color:#1f2937;font-size:1.125rem;font-weight:600}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{margin:0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{display:flex;gap:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button.p-button-sm{padding:.375rem .75rem;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content{flex:1;display:flex;flex-direction:column;padding:1rem;background:#fafafa;overflow:hidden}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.5rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-label{font-size:.875rem;font-weight:500;color:#6b7280;margin-right:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{padding:.375rem .75rem;border:1px solid #d1d5db;background:#fff;border-radius:4px;font-size:.75rem;color:#6b7280;cursor:pointer;transition:all .2s}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#f3f4f6;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{flex:1;overflow:auto;background:#fff;border-radius:6px;border:1px solid #e5e7eb;margin-bottom:1rem;min-width:100%;position:relative;min-height:300px;overflow-x:auto;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container::-webkit-scrollbar{display:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{width:100%;min-width:max-content;border-collapse:collapse;font-size:.875rem;table-layout:auto;border:2px solid #e5e7eb;word-wrap:break-word;white-space:nowrap}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.5rem .75rem;text-align:left;border-bottom:1px solid #f3f4f6;border-right:1px solid #f3f4f6;min-width:80px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:normal;position:relative;box-sizing:border-box;vertical-align:top}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:empty:after{content:\"\";display:block;min-height:1.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:last-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:last-child{border-right:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:first-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{border-left:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table .empty-cell{background-color:#fafafa;color:#9ca3af;font-style:italic;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr{border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#f8fafc;font-weight:600;color:#374151;position:sticky;top:0;z-index:10;border-bottom:2px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{color:#6b7280;background:#fff}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{font-weight:500;color:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tbody tr:last-child td{border-bottom:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{display:flex;align-items:center;gap:1.5rem;padding:.75rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item{display:flex;align-items:center;gap:.5rem;color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item i{color:#10b981;font-size:.875rem}.document-content-viewer-container .office-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .office-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .office-document-container .document-preview .document-icon i{font-size:4rem;color:#3b82f6}.document-content-viewer-container .office-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .office-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#1f2937;font-size:1.25rem;font-weight:600}.document-content-viewer-container .office-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note{color:#9ca3af;font-style:italic;margin-top:.75rem}.document-content-viewer-container .office-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .unsupported-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .unsupported-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%;border:2px solid #fbbf24}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:4rem;color:#f59e0b}.document-content-viewer-container .unsupported-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#92400e;font-size:1.25rem;font-weight:600}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#d97706;font-style:italic;margin-top:.75rem;background:#fef3c7;padding:.5rem;border-radius:6px;border:1px solid #fde68a}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .no-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .no-document-container .no-document-content{text-align:center;color:#6b7280}.document-content-viewer-container .no-document-container .no-document-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .no-document-container .no-document-content h4{margin:0 0 .5rem;color:#374151;font-size:1.25rem;font-weight:600}.document-content-viewer-container .no-document-container .no-document-content p{margin:0;color:#9ca3af;font-size:.875rem}@media (max-width: 768px){.document-content-viewer-container .office-document-container,.document-content-viewer-container .unsupported-document-container{padding:1rem}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{padding:1.5rem;max-width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon i,.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:3rem}.document-content-viewer-container .office-document-container .document-preview .document-actions,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{flex-direction:column;align-items:center}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{width:100%;max-width:200px}.document-content-viewer-container .image-container{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header{flex-direction:column;gap:1rem;padding:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{justify-content:center}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{justify-content:center;width:100%}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button{flex:1;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{flex-wrap:wrap;gap:.25rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{font-size:.7rem;padding:.25rem .5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.25rem .5rem;min-width:80px;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{flex-wrap:wrap;gap:1rem;font-size:.7rem}}@media (prefers-color-scheme: dark){.document-content-viewer-container{background:#1f2937}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{background:#374151;color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info h4,.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info p,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{color:#d1d5db}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#9ca3af;background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-header{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#6b7280;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#6b7280;color:#f9fafb;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{background:#4b5563;color:#d1d5db;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .no-document-container .no-document-content{color:#9ca3af}.document-content-viewer-container .no-document-container .no-document-content h4{color:#f9fafb}.document-content-viewer-container .no-document-container .no-document-content p{color:#d1d5db}}.excel-table{border-collapse:collapse;width:100%;font-size:.875rem}.excel-table th,.excel-table td{padding:.5rem;border:1px solid #e2e8f0;text-align:left;vertical-align:top;min-width:80px}.excel-table th[style*=background-color]:not([style*=color]),.excel-table td[style*=background-color]:not([style*=color]){color:#1f2937}.excel-table th[style*=\"font-weight: bold\"],.excel-table td[style*=\"font-weight: bold\"]{font-weight:600}.excel-table th[style*=\"font-style: italic\"],.excel-table td[style*=\"font-style: italic\"]{font-style:italic}.excel-table th{background-color:#f8fafc;font-weight:600;color:#475569;position:sticky;top:0;z-index:10}.excel-table td{background-color:#fff}.excel-table td.empty-cell{background-color:#f8fafc;color:#9ca3af}.excel-table tbody tr:hover td{background-color:#f1f5f9}.excel-table tbody tr:hover td[style*=background-color]{opacity:.8}.debug-info{margin-top:1rem;padding:1rem;background-color:#fef3c7;border:1px solid #f59e0b;border-radius:8px}.debug-info summary{cursor:pointer;font-weight:600;color:#d97706;margin-bottom:.5rem}.debug-info summary:hover{color:#b45309}.debug-info .debug-content{margin-top:.5rem}.debug-info .debug-content p{margin:.5rem 0;color:#92400e}.debug-info .debug-content ul{margin:.5rem 0;padding-left:1.5rem;color:#92400e}.debug-info .debug-content li{margin:.25rem 0}.debug-info .debug-content button{margin-top:.5rem}.docx-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;overflow:hidden}.docx-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .loading-container .loading-content{text-align:center;color:#6b7280}.docx-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.docx-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.docx-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.docx-container .error-container .error-content i{margin-bottom:1rem;display:block}.docx-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.docx-container .error-container .error-content p{margin:0 0 1rem;color:#9ca3af;font-size:.875rem}.docx-container .error-container .error-content .error-actions{margin-top:1rem}.docx-container .docx-viewer{width:100%;height:100%;display:flex;flex-direction:column;background:#fff}.docx-container .docx-viewer .docx-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid #e5e7eb;background-color:#f9fafb}.docx-container .docx-viewer .docx-header .docx-info{display:flex;align-items:center;gap:1rem}.docx-container .docx-viewer .docx-header .docx-info i{font-size:2rem;color:#2563eb}.docx-container .docx-viewer .docx-header .docx-info .docx-details h4{margin:0 0 .25rem;font-size:1.125rem;font-weight:600;color:#111827}.docx-container .docx-viewer .docx-header .docx-info .docx-details p{margin:0 0 .125rem;font-size:.875rem;color:#6b7280}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-title{font-weight:500;color:#374151;font-size:.875rem}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-author{font-style:italic;color:#6b7280;font-size:.75rem}.docx-container .docx-viewer .docx-header .docx-actions{display:flex;gap:.5rem}.docx-container .docx-viewer .docx-content{flex:1;overflow:auto;padding:1.5rem}.docx-container .docx-viewer .docx-content .docx-stats{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:1.5rem;padding:1rem;background-color:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.docx-container .docx-viewer .docx-content .docx-stats .stat-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background-color:#fff;border-radius:6px;border:1px solid #e2e8f0;font-size:.75rem;color:#475569;font-weight:500}.docx-container .docx-viewer .docx-content .docx-stats .stat-item i{color:#64748b}.docx-container .docx-viewer .docx-content .docx-content-body{line-height:1.6;color:#1f2937}.docx-container .docx-viewer .docx-content .docx-content-body .docx-paragraph{margin:0 0 1rem;text-align:justify}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading{margin:1.5rem 0 1rem;font-weight:600;color:#111827;line-height:1.3}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h1{font-size:1.875rem;border-bottom:2px solid #e5e7eb;padding-bottom:.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h2{font-size:1.5rem;border-bottom:1px solid #e5e7eb;padding-bottom:.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h3{font-size:1.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h4,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h5,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h6{font-size:1.125rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table{width:100%;margin:1rem 0;border-collapse:collapse;border:1px solid #e5e7eb;background-color:#fff}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{background-color:#f8fafc;font-weight:600;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-cell,.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{padding:.75rem;border:1px solid #e5e7eb;text-align:left;vertical-align:top}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-row:hover{background-color:#f9fafb}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list{margin:1rem 0;padding-left:1.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ul{list-style-type:disc}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ol{list-style-type:decimal}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list .docx-list-item{margin:.5rem 0;line-height:1.5}.docx-container .docx-viewer .docx-content .docx-content-body .docx-image{max-width:100%;height:auto;border-radius:6px;box-shadow:0 2px 4px #0000001a;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body blockquote{margin:1rem 0;padding:1rem 1.5rem;border-left:4px solid #3b82f6;background-color:#f8fafc;font-style:italic;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body pre,.docx-container .docx-viewer .docx-content .docx-content-body code{background-color:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:.5rem;font-family:Courier New,monospace;font-size:.875rem;color:#1e293b;overflow-x:auto}.docx-container .docx-viewer .docx-content .docx-content-body pre{padding:1rem;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body a{color:#2563eb;text-decoration:none}.docx-container .docx-viewer .docx-content .docx-content-body a:hover{text-decoration:underline}.docx-container .docx-viewer .docx-content .docx-content-body em,.docx-container .docx-viewer .docx-content .docx-content-body i{font-style:italic}.docx-container .docx-viewer .docx-content .docx-content-body strong,.docx-container .docx-viewer .docx-content .docx-content-body b{font-weight:600}.docx-container .docx-viewer .docx-content .docx-content-body hr{border:none;border-top:1px solid #e5e7eb;margin:2rem 0}.word-loading-container{display:flex;align-items:center;justify-content:center;min-height:400px;width:100%;background-color:#f9fafb;border-radius:8px}.word-loading-container .loading-content{text-align:center}.word-loading-container .loading-content i{margin-bottom:1rem;display:block;font-size:2rem;color:#3b82f6}.word-loading-container .loading-content p{margin:0;color:#6b7280;font-size:1rem;font-weight:500}.docx-container{min-height:400px;overflow:auto}.doc-viewer-wrapper{transition:transform .2s ease-in-out;overflow:auto;position:relative;transform-origin:center center;height:100%;scroll-behavior:smooth}.doc-viewer-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.doc-viewer-wrapper .wheel-capture-overlay:active{pointer-events:none}.doc-viewer-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}.excel-zoom-wrapper{overflow:auto;position:relative;height:100%;width:100%;scroll-behavior:smooth}.excel-zoom-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.excel-zoom-wrapper .wheel-capture-overlay:active{pointer-events:none}.excel-zoom-wrapper:not(.zoomed){display:flex;align-items:center;justify-content:center}.excel-zoom-wrapper.zoomed{overflow:auto;display:block}.excel-zoom-wrapper ngx-doc-viewer{transition:transform .2s ease-in-out;transform-origin:center center;display:block;width:100%;height:100%}.excel-zoom-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}ngx-doc-viewer{display:block;width:100%;height:100%}ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:center center}.csv-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container *{scrollbar-width:none;-ms-overflow-style:none}.csv-container *::-webkit-scrollbar{display:none}.csv-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .loading-container .loading-content{text-align:center;color:#6b7280}.csv-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.csv-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.csv-container .error-container .error-content i{margin-bottom:1rem;display:block}.csv-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.csv-container .error-container .error-content p{margin:0 0 1rem;color:#6b7280;font-size:.875rem}.csv-container .error-container .error-content .error-actions{margin-top:1rem}.csv-container .csv-content{width:100%;height:98%;display:flex;flex-direction:column;padding:1rem}.csv-container .csv-content .csv-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.csv-container .csv-content .csv-header .csv-info h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem;font-weight:600}.csv-container .csv-content .csv-header .csv-info p{margin:0 0 .25rem;color:#6b7280;font-size:.875rem}.csv-container .csv-content .csv-header .csv-info .csv-stats{display:inline-block;background-color:#f3f4f6;color:#6b7280;font-size:.75rem;padding:.25rem .5rem;border-radius:4px;font-weight:500}.csv-container .csv-content .csv-header .csv-actions{display:flex;gap:.5rem}.csv-container .csv-content .csv-table-container{flex:1;overflow:auto;border-radius:6px;min-width:0;min-height:0;transition:transform .2s ease-in-out;scroll-behavior:smooth;transform-origin:center center;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper{height:100%;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-table{border-collapse:collapse}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th{background-color:#f8f9fa;border:1px solid #e5e7eb;padding:.75rem;font-weight:600;color:#374151;text-align:left;position:sticky;top:0;z-index:1;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th.csv-header-cell{background-color:#f1f5f9;font-weight:700;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td{border:1px solid #e5e7eb;padding:.75rem;color:#374151;vertical-align:top;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td.csv-header-cell{background-color:#f1f5f9;font-weight:600;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:nth-child(2n){background-color:#f9fafb}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:hover{background-color:#f3f4f6}.csv-container .email-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container .email-container .loading-container{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .loading-container i{margin-bottom:1rem}.csv-container .email-container .loading-container p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .email-container .error-container .error-content{text-align:center;max-width:400px}.csv-container .email-container .error-container .error-content i{margin-bottom:1rem}.csv-container .email-container .error-container .error-content h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem}.csv-container .email-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.csv-container .email-container .error-container .error-content .error-actions{display:flex;justify-content:center;gap:.5rem}.csv-container .email-container .no-email-data{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .no-email-data i{margin-bottom:1rem}.csv-container .email-container .no-email-data p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .email-viewer{display:flex;flex-direction:column;height:100%;overflow:hidden}.csv-container .email-container .email-viewer .email-header{position:relative;padding:1.5rem;border-bottom:2px solid #e5e7eb;background:linear-gradient(to bottom,#fff,#f9fafb)}.csv-container .email-container .email-viewer .email-header .email-actions{position:absolute;top:1rem;right:1rem;display:flex;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-subject{margin:0 0 1rem;padding-right:100px;color:#111827;font-size:1.5rem;font-weight:600;line-height:1.4;word-break:break-word}.csv-container .email-container .email-viewer .email-header .email-metadata{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field{display:flex;gap:.75rem;font-size:.875rem;line-height:1.5}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-label{min-width:80px;color:#6b7280;font-weight:600}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value{color:#374151;word-break:break-word;flex:1}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value i{margin-right:.25rem;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container{flex:1;overflow:auto;padding:1.5rem;background:#fff}.csv-container .email-container .email-viewer .email-body-container .email-body{max-width:100%;min-height:200px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep p{margin:0 0 1rem;line-height:1.6}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a{color:#3b82f6;text-decoration:none}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a:hover{text-decoration:underline}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep img{max-width:100%;height:auto;border-radius:4px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table{border-collapse:collapse;width:100%;margin:1rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table td,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{padding:.5rem;border:1px solid #e5e7eb}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{background-color:#f9fafb;font-weight:600}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep blockquote{margin:1rem 0;padding-left:1rem;border-left:3px solid #e5e7eb;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ul,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ol{margin:0 0 1rem;padding-left:1.5rem}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep li{margin:.25rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-text pre{margin:0;padding:1rem;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;font-family:Courier New,Courier,monospace;font-size:.875rem;line-height:1.6;color:#374151;white-space:pre-wrap;word-break:break-word;overflow-x:auto}.csv-container .email-container .email-viewer .email-attachments{padding:1rem 1.5rem;border-top:1px solid #e5e7eb;background:#f9fafb}.csv-container .email-container .email-viewer .email-attachments h4{margin:0 0 .75rem;color:#374151;font-size:.875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.csv-container .email-container .email-viewer .email-attachments .attachment-list{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item{display:flex;align-items:center;gap:.5rem;padding:.625rem .875rem;background:#fff;border:1px solid #e5e7eb;border-radius:6px;font-size:.875rem;color:#374151;transition:all .2s ease}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item i{color:#6b7280;font-size:1rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item span{word-break:break-word}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item:hover{background:#f3f4f6;border-color:#d1d5db}\n"] }]
|
|
8840
|
-
}], ctorParameters: () => [{ type: ExcelParserService }, { type: CsvParserService }, { type:
|
|
8509
|
+
args: [{ selector: 'document-content-viewer', standalone: false, encapsulation: ViewEncapsulation.None, template: "<div class=\"document-content-viewer-container\">\n @if(documentUrl && contentType){\n <!-- Zoom Controls -->\n <div class=\"zoom-controls-wrapper\">\n <document-zoom-controls [selectedDocument]=\"selectedDocument\" [contextId]=\"contextId\" [isFormHide]=\"isFormHide\">\n </document-zoom-controls>\n </div>\n\n <!-- PDF Viewer -->\n @if(isPdf){\n <div class=\"pdf-container\">\n <pdf-viewer [src]=\"documentUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\n [zoom]=\"currentZoom / 100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\n style=\"width: 100%; height: 100%\"></pdf-viewer>\n </div>\n }\n\n <!-- Image Viewer -->\n @else if(isImage){\n <div class=\"image-container\">\n <img [src]=\"documentUrl\" [alt]=\"documentName || 'Document Image'\" class=\"document-image\"\n [style.transform]=\"'scale(' + (currentZoom / 100) + ')'\" [style.transform-origin]=\"'center center'\" />\n </div>\n }\n\n <!-- Excel Files -->\n @else if(isExcel){\n <div class=\"excel-container\">\n @if(isLoadingExcel){\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\n <p>Loading Excel file...</p>\n </div>\n </div>\n }@else if(excelError){\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\n <h4>Error Loading Excel File</h4>\n <p>{{ excelError }}</p>\n <div class=\"error-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download Instead\n </button>\n </div>\n </div>\n </div>\n }\n @else if(excelData){\n <div class=\"excel-container\">\n <div class=\"excel-zoom-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\n <!-- Invisible overlay to capture wheel events over document content -->\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Word Files -->\n @else if(isWord){\n <div class=\"docx-container\">\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:97%;\"></ngx-doc-viewer>\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\n </div>\n </div>\n }\n\n <!-- CSV Files -->\n @else if(isCsv){\n <div class=\"csv-container\">\n @if(isLoadingCsv){\n <div class=\"loading-container\">\n <div class=\"loading-content\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem; color: #3b82f6;\"></i>\n <p>Loading CSV file...</p>\n </div>\n </div>\n }@else if(csvError){\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"pi pi-exclamation-triangle\" style=\"font-size: 3rem; color: #ef4444;\"></i>\n <h4>Error Loading CSV File</h4>\n <p>{{ csvError }}</p>\n <div class=\"error-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download Instead\n </button>\n </div>\n </div>\n </div>\n }\n @else if(csvData){\n <div class=\"csv-content\">\n <div class=\"csv-header\">\n <div class=\"csv-info\">\n <p>{{ documentName || 'CSV File' }}</p>\n <span class=\"csv-stats\">\n {{ csvData.totalRows }} rows \u00D7 {{ csvData.totalColumns }} columns\n </span>\n </div>\n </div>\n\n <div class=\"csv-table-container\" [style.transform-origin]=\"'center center'\" (wheel)=\"onWheel($event)\">\n <p-table [value]=\"safeCsvStyledData\" [tableStyle]=\"{'min-width': '100%'}\" [scrollable]=\"true\"\n scrollHeight=\"67vh\" class=\"csv-table\">\n <ng-template pTemplate=\"body\" let-row>\n <tr>\n <ng-container *ngFor=\"let cell of row.cells; trackBy: trackByCell\">\n <td [ngClass]=\"{'csv-header-cell': cell.isHeader}\">\n {{ cell.value }}\n </td>\n </ng-container>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Email Files -->\n @else if(isEmail){\n <div class=\"email-container\">\n @if(isLoadingEmail){\n <div class=\"loading-container text-center m-1/2\">\n <i class=\"pi pi-spin pi-spinner\" style=\"font-size: 2rem;\"></i>\n <p>Opening email...</p>\n </div>\n }\n @else if(isEmailAsPdf && emailPdfUrl){\n <!-- Render PDF when email is converted -->\n <pdf-viewer [src]=\"emailPdfUrl\" [rotation]=\"0\" [original-size]=\"false\" [show-all]=\"true\" [fit-to-page]=\"false\"\n [zoom]=\"currentZoom/100\" [zoom-scale]=\"'page-width'\" [stick-to-page]=\"false\" [render-text]=\"true\"\n [external-link-target]=\"'blank'\" [autoresize]=\"true\" [show-borders]=\"false\"\n style=\"width: 100%; height: 82vh;\"></pdf-viewer>\n }\n @else if(emailError){\n <div class=\"error-container\">\n <div class=\"error-content\">\n <i class=\"pi pi-exclamation-circle\" style=\"font-size: 2rem; color: #ef4444;\"></i>\n <h4>Unable to Preview Email</h4>\n <p>{{ emailError }}</p>\n <div class=\"error-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- OpenDocument Files -->\n @else if(isOpenDocument){\n <div class=\"docx-container\">\n <div class=\"doc-viewer-wrapper\" [class.zoomed]=\"currentZoom !== 100\" (wheel)=\"onWheel($event)\">\n <ngx-doc-viewer [url]=\"documentUrl\" viewer=\"office\" style=\"width:100%;height:800px;\"></ngx-doc-viewer>\n <!-- Invisible overlay to capture wheel events over document content -->\n <div class=\"wheel-capture-overlay\" (wheel)=\"onWheel($event)\"></div>\n </div>\n </div>\n }\n\n <!-- Unsupported Files -->\n @else if(isUnsupported){\n <div class=\"unsupported-document-container\">\n <div class=\"document-preview\">\n <div class=\"document-icon\">\n <i [class]=\"documentIcon\"></i>\n </div>\n <div class=\"document-info\">\n <h4>Unsupported Document Type</h4>\n <p>{{ documentName || 'Document' }}</p>\n <p class=\"document-note\">This document type ({{ contentType }}) is not supported for preview. Please download to\n view.</p>\n </div>\n <div class=\"document-actions\">\n <button type=\"button\" class=\"p-button p-button-primary p-button-sm\" (click)=\"downloadDocument()\">\n <i class=\"pi pi-download\"></i>\n Download\n </button>\n <button type=\"button\" class=\"p-button p-button-outlined p-button-sm\" (click)=\"openInNewTab()\">\n <i class=\"pi pi-external-link\"></i>\n Open\n </button>\n </div>\n </div>\n </div>\n }\n }\n @else {\n <div class=\"no-document-container\">\n <div class=\"no-document-content\">\n <i class=\"pi pi-file-o\" style=\"font-size: 3rem; color: #6b7280;\"></i>\n <h4>No Document Uploaded</h4>\n <p>Please Upload a document to view its content.</p>\n </div>\n </div>\n }\n</div>", styles: [".document-content-viewer-container{height:100%;width:100%;display:flex;flex-direction:column;background:#f8f9fa;border-radius:8px;overflow:auto}.document-content-viewer-container .zoom-controls-wrapper{position:sticky;top:0;z-index:10;background:#f8f9faf2;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid #e5e7eb;justify-content:space-between;align-items:center;border-radius:10px}.document-content-viewer-container .docx-container{overflow:auto}.document-content-viewer-container .email-container{width:100%;height:100%;border-radius:8px;overflow:hidden}.document-content-viewer-container .email-container ::ng-deep .ng2-pdf-viewer-container{height:82%!important;overflow:auto}.document-content-viewer-container .pdf-container{width:100%;height:100%;border-radius:8px;overflow:hidden}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{height:100%;overflow:auto}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar{width:12px;height:12px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-track{background:#f1f1f1;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb{background:#888;border-radius:6px}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container::-webkit-scrollbar-thumb:hover{background:#555}.document-content-viewer-container .pdf-container ::ng-deep .ng2-pdf-viewer-container{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}.document-content-viewer-container .image-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:1rem;overflow:auto}.document-content-viewer-container .image-container .document-image{max-width:100%;max-height:100%;object-fit:contain;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a;transition:transform .2s ease-in-out}.document-content-viewer-container .excel-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.document-content-viewer-container .excel-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .loading-container .loading-content{text-align:center;color:#6b7280}.document-content-viewer-container .excel-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.document-content-viewer-container .excel-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .excel-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.document-content-viewer-container .excel-container .error-container .error-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .excel-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.document-content-viewer-container .excel-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .error-container .error-content .error-actions{display:flex;justify-content:center}.document-content-viewer-container .excel-container .excel-viewer{width:100%;height:100%;display:flex;flex-direction:column}.document-content-viewer-container .excel-container .excel-viewer .excel-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;background:#f8fafc;border-bottom:1px solid #e2e8f0}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{display:flex;align-items:center;gap:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info i{font-size:2rem;color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{margin:0 0 .25rem;color:#1f2937;font-size:1.125rem;font-weight:600}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{margin:0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{display:flex;gap:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button.p-button-sm{padding:.375rem .75rem;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content{flex:1;display:flex;flex-direction:column;padding:1rem;background:#fafafa;overflow:hidden}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;padding:.5rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-label{font-size:.875rem;font-weight:500;color:#6b7280;margin-right:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{padding:.375rem .75rem;border:1px solid #d1d5db;background:#fff;border-radius:4px;font-size:.75rem;color:#6b7280;cursor:pointer;transition:all .2s}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#f3f4f6;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{flex:1;overflow:auto;background:#fff;border-radius:6px;border:1px solid #e5e7eb;margin-bottom:1rem;min-width:100%;position:relative;min-height:300px;overflow-x:auto;overflow-y:auto;scrollbar-width:none;-ms-overflow-style:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container::-webkit-scrollbar{display:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{width:100%;min-width:max-content;border-collapse:collapse;font-size:.875rem;table-layout:auto;border:2px solid #e5e7eb;word-wrap:break-word;white-space:nowrap}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.5rem .75rem;text-align:left;border-bottom:1px solid #f3f4f6;border-right:1px solid #f3f4f6;min-width:80px;max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:normal;position:relative;box-sizing:border-box;vertical-align:top}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:empty:after{content:\"\";display:block;min-height:1.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:last-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:last-child{border-right:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th:first-child,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{border-left:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table .empty-cell{background-color:#fafafa;color:#9ca3af;font-style:italic;border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr{border:1px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#f8fafc;font-weight:600;color:#374151;position:sticky;top:0;z-index:10;border-bottom:2px solid #e5e7eb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{color:#6b7280;background:#fff}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{font-weight:500;color:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tbody tr:last-child td{border-bottom:none}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{display:flex;align-items:center;gap:1.5rem;padding:.75rem;background:#fff;border-radius:6px;border:1px solid #e5e7eb;font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item{display:flex;align-items:center;gap:.5rem;color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar .info-item i{color:#10b981;font-size:.875rem}.document-content-viewer-container .office-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .office-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .office-document-container .document-preview .document-icon i{font-size:4rem;color:#3b82f6}.document-content-viewer-container .office-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .office-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#1f2937;font-size:1.25rem;font-weight:600}.document-content-viewer-container .office-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note{color:#9ca3af;font-style:italic;margin-top:.75rem}.document-content-viewer-container .office-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .unsupported-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .unsupported-document-container .document-preview{background:#fff;border-radius:12px;padding:2rem;text-align:center;box-shadow:0 10px 15px -3px #0000001a;max-width:400px;width:100%;border:2px solid #fbbf24}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon{margin-bottom:1.5rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:4rem;color:#f59e0b}.document-content-viewer-container .unsupported-document-container .document-preview .document-info{margin-bottom:2rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{margin:0 0 .5rem;color:#92400e;font-size:1.25rem;font-weight:600}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{margin:.25rem 0;color:#6b7280;font-size:.875rem}.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#d97706;font-style:italic;margin-top:.75rem;background:#fef3c7;padding:.5rem;border-radius:6px;border:1px solid #fde68a}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{min-width:120px}.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button.p-button-sm{padding:.5rem 1rem;font-size:.875rem}.document-content-viewer-container .no-document-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.document-content-viewer-container .no-document-container .no-document-content{text-align:center;color:#6b7280}.document-content-viewer-container .no-document-container .no-document-content i{margin-bottom:1rem;display:block}.document-content-viewer-container .no-document-container .no-document-content h4{margin:0 0 .5rem;color:#374151;font-size:1.25rem;font-weight:600}.document-content-viewer-container .no-document-container .no-document-content p{margin:0;color:#9ca3af;font-size:.875rem}@media (max-width: 768px){.document-content-viewer-container .office-document-container,.document-content-viewer-container .unsupported-document-container{padding:1rem}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{padding:1.5rem;max-width:100%}.document-content-viewer-container .office-document-container .document-preview .document-icon i,.document-content-viewer-container .unsupported-document-container .document-preview .document-icon i{font-size:3rem}.document-content-viewer-container .office-document-container .document-preview .document-actions,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions{flex-direction:column;align-items:center}.document-content-viewer-container .office-document-container .document-preview .document-actions .p-button,.document-content-viewer-container .unsupported-document-container .document-preview .document-actions .p-button{width:100%;max-width:200px}.document-content-viewer-container .image-container{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header{flex-direction:column;gap:1rem;padding:1rem}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info{justify-content:center}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions{justify-content:center;width:100%}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-actions .p-button{flex:1;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content{padding:.5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{flex-wrap:wrap;gap:.25rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{font-size:.7rem;padding:.25rem .5rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table{font-size:.75rem}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th,.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{padding:.25rem .5rem;min-width:80px;max-width:150px}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{flex-wrap:wrap;gap:1rem;font-size:.7rem}}@media (prefers-color-scheme: dark){.document-content-viewer-container{background:#1f2937}.document-content-viewer-container .office-document-container .document-preview,.document-content-viewer-container .unsupported-document-container .document-preview{background:#374151;color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info h4,.document-content-viewer-container .unsupported-document-container .document-preview .document-info h4{color:#f9fafb}.document-content-viewer-container .office-document-container .document-preview .document-info p,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p{color:#d1d5db}.document-content-viewer-container .office-document-container .document-preview .document-info p.document-note,.document-content-viewer-container .unsupported-document-container .document-preview .document-info p.document-note{color:#9ca3af;background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-header{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details h4{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-header .excel-info .excel-details p{color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content{background:#374151}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab:hover{background:#6b7280;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .sheet-navigation .sheet-tab.active{background:#10b981;color:#fff;border-color:#10b981}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container{background:#4b5563;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table th{background:#6b7280;color:#f9fafb;border-color:#9ca3af}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td{background:#4b5563;color:#d1d5db;border-color:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table td:first-child{color:#f9fafb}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-table-container .excel-table tr:hover td{background:#6b7280}.document-content-viewer-container .excel-container .excel-viewer .excel-content .excel-info-bar{background:#4b5563;border-color:#6b7280;color:#d1d5db}.document-content-viewer-container .no-document-container .no-document-content{color:#9ca3af}.document-content-viewer-container .no-document-container .no-document-content h4{color:#f9fafb}.document-content-viewer-container .no-document-container .no-document-content p{color:#d1d5db}}.excel-table{border-collapse:collapse;width:100%;font-size:.875rem}.excel-table th,.excel-table td{padding:.5rem;border:1px solid #e2e8f0;text-align:left;vertical-align:top;min-width:80px}.excel-table th[style*=background-color]:not([style*=color]),.excel-table td[style*=background-color]:not([style*=color]){color:#1f2937}.excel-table th[style*=\"font-weight: bold\"],.excel-table td[style*=\"font-weight: bold\"]{font-weight:600}.excel-table th[style*=\"font-style: italic\"],.excel-table td[style*=\"font-style: italic\"]{font-style:italic}.excel-table th{background-color:#f8fafc;font-weight:600;color:#475569;position:sticky;top:0;z-index:10}.excel-table td{background-color:#fff}.excel-table td.empty-cell{background-color:#f8fafc;color:#9ca3af}.excel-table tbody tr:hover td{background-color:#f1f5f9}.excel-table tbody tr:hover td[style*=background-color]{opacity:.8}.debug-info{margin-top:1rem;padding:1rem;background-color:#fef3c7;border:1px solid #f59e0b;border-radius:8px}.debug-info summary{cursor:pointer;font-weight:600;color:#d97706;margin-bottom:.5rem}.debug-info summary:hover{color:#b45309}.debug-info .debug-content{margin-top:.5rem}.debug-info .debug-content p{margin:.5rem 0;color:#92400e}.debug-info .debug-content ul{margin:.5rem 0;padding-left:1.5rem;color:#92400e}.debug-info .debug-content li{margin:.25rem 0}.debug-info .debug-content button{margin-top:.5rem}.docx-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;overflow:hidden}.docx-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .loading-container .loading-content{text-align:center;color:#6b7280}.docx-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.docx-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.docx-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.docx-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.docx-container .error-container .error-content i{margin-bottom:1rem;display:block}.docx-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.docx-container .error-container .error-content p{margin:0 0 1rem;color:#9ca3af;font-size:.875rem}.docx-container .error-container .error-content .error-actions{margin-top:1rem}.docx-container .docx-viewer{width:100%;height:100%;display:flex;flex-direction:column;background:#fff}.docx-container .docx-viewer .docx-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid #e5e7eb;background-color:#f9fafb}.docx-container .docx-viewer .docx-header .docx-info{display:flex;align-items:center;gap:1rem}.docx-container .docx-viewer .docx-header .docx-info i{font-size:2rem;color:#2563eb}.docx-container .docx-viewer .docx-header .docx-info .docx-details h4{margin:0 0 .25rem;font-size:1.125rem;font-weight:600;color:#111827}.docx-container .docx-viewer .docx-header .docx-info .docx-details p{margin:0 0 .125rem;font-size:.875rem;color:#6b7280}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-title{font-weight:500;color:#374151;font-size:.875rem}.docx-container .docx-viewer .docx-header .docx-info .docx-details .document-author{font-style:italic;color:#6b7280;font-size:.75rem}.docx-container .docx-viewer .docx-header .docx-actions{display:flex;gap:.5rem}.docx-container .docx-viewer .docx-content{flex:1;overflow:auto;padding:1.5rem}.docx-container .docx-viewer .docx-content .docx-stats{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:1.5rem;padding:1rem;background-color:#f8fafc;border-radius:8px;border:1px solid #e2e8f0}.docx-container .docx-viewer .docx-content .docx-stats .stat-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background-color:#fff;border-radius:6px;border:1px solid #e2e8f0;font-size:.75rem;color:#475569;font-weight:500}.docx-container .docx-viewer .docx-content .docx-stats .stat-item i{color:#64748b}.docx-container .docx-viewer .docx-content .docx-content-body{line-height:1.6;color:#1f2937}.docx-container .docx-viewer .docx-content .docx-content-body .docx-paragraph{margin:0 0 1rem;text-align:justify}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading{margin:1.5rem 0 1rem;font-weight:600;color:#111827;line-height:1.3}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h1{font-size:1.875rem;border-bottom:2px solid #e5e7eb;padding-bottom:.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h2{font-size:1.5rem;border-bottom:1px solid #e5e7eb;padding-bottom:.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h3{font-size:1.25rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h4,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h5,.docx-container .docx-viewer .docx-content .docx-content-body .docx-heading.docx-h6{font-size:1.125rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table{width:100%;margin:1rem 0;border-collapse:collapse;border:1px solid #e5e7eb;background-color:#fff}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{background-color:#f8fafc;font-weight:600;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-cell,.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-header{padding:.75rem;border:1px solid #e5e7eb;text-align:left;vertical-align:top}.docx-container .docx-viewer .docx-content .docx-content-body .docx-table .docx-row:hover{background-color:#f9fafb}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list{margin:1rem 0;padding-left:1.5rem}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ul{list-style-type:disc}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list.docx-ol{list-style-type:decimal}.docx-container .docx-viewer .docx-content .docx-content-body .docx-list .docx-list-item{margin:.5rem 0;line-height:1.5}.docx-container .docx-viewer .docx-content .docx-content-body .docx-image{max-width:100%;height:auto;border-radius:6px;box-shadow:0 2px 4px #0000001a;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body blockquote{margin:1rem 0;padding:1rem 1.5rem;border-left:4px solid #3b82f6;background-color:#f8fafc;font-style:italic;color:#374151}.docx-container .docx-viewer .docx-content .docx-content-body pre,.docx-container .docx-viewer .docx-content .docx-content-body code{background-color:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:.5rem;font-family:Courier New,monospace;font-size:.875rem;color:#1e293b;overflow-x:auto}.docx-container .docx-viewer .docx-content .docx-content-body pre{padding:1rem;margin:1rem 0}.docx-container .docx-viewer .docx-content .docx-content-body a{color:#2563eb;text-decoration:none}.docx-container .docx-viewer .docx-content .docx-content-body a:hover{text-decoration:underline}.docx-container .docx-viewer .docx-content .docx-content-body em,.docx-container .docx-viewer .docx-content .docx-content-body i{font-style:italic}.docx-container .docx-viewer .docx-content .docx-content-body strong,.docx-container .docx-viewer .docx-content .docx-content-body b{font-weight:600}.docx-container .docx-viewer .docx-content .docx-content-body hr{border:none;border-top:1px solid #e5e7eb;margin:2rem 0}.word-loading-container{display:flex;align-items:center;justify-content:center;min-height:400px;width:100%;background-color:#f9fafb;border-radius:8px}.word-loading-container .loading-content{text-align:center}.word-loading-container .loading-content i{margin-bottom:1rem;display:block;font-size:2rem;color:#3b82f6}.word-loading-container .loading-content p{margin:0;color:#6b7280;font-size:1rem;font-weight:500}.docx-container{min-height:400px;overflow:auto}.doc-viewer-wrapper{transition:transform .2s ease-in-out;overflow:auto;position:relative;transform-origin:center center;height:100%;scroll-behavior:smooth}.doc-viewer-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.doc-viewer-wrapper .wheel-capture-overlay:active{pointer-events:none}.doc-viewer-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}.excel-zoom-wrapper{overflow:auto;position:relative;height:100%;width:100%;scroll-behavior:smooth}.excel-zoom-wrapper .wheel-capture-overlay{position:absolute;top:0;left:0;width:100%;height:100%;background:transparent;z-index:5;pointer-events:auto}.excel-zoom-wrapper .wheel-capture-overlay:active{pointer-events:none}.excel-zoom-wrapper:not(.zoomed){display:flex;align-items:center;justify-content:center}.excel-zoom-wrapper.zoomed{overflow:auto;display:block}.excel-zoom-wrapper ngx-doc-viewer{transition:transform .2s ease-in-out;transform-origin:center center;display:block;width:100%;height:100%}.excel-zoom-wrapper ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:top left;border:none;min-width:100%;min-height:100%}ngx-doc-viewer{display:block;width:100%;height:100%}ngx-doc-viewer ::ng-deep iframe{transition:transform .2s ease-in-out;transform-origin:center center}.csv-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container *{scrollbar-width:none;-ms-overflow-style:none}.csv-container *::-webkit-scrollbar{display:none}.csv-container .loading-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .loading-container .loading-content{text-align:center;color:#6b7280}.csv-container .loading-container .loading-content i{margin-bottom:1rem;display:block}.csv-container .loading-container .loading-content p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .error-container .error-content{text-align:center;color:#6b7280;max-width:400px}.csv-container .error-container .error-content i{margin-bottom:1rem;display:block}.csv-container .error-container .error-content h4{margin:0 0 .5rem;color:#dc2626;font-size:1.25rem;font-weight:600}.csv-container .error-container .error-content p{margin:0 0 1rem;color:#6b7280;font-size:.875rem}.csv-container .error-container .error-content .error-actions{margin-top:1rem}.csv-container .csv-content{width:100%;height:98%;display:flex;flex-direction:column;padding:1rem}.csv-container .csv-content .csv-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.csv-container .csv-content .csv-header .csv-info h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem;font-weight:600}.csv-container .csv-content .csv-header .csv-info p{margin:0 0 .25rem;color:#6b7280;font-size:.875rem}.csv-container .csv-content .csv-header .csv-info .csv-stats{display:inline-block;background-color:#f3f4f6;color:#6b7280;font-size:.75rem;padding:.25rem .5rem;border-radius:4px;font-weight:500}.csv-container .csv-content .csv-header .csv-actions{display:flex;gap:.5rem}.csv-container .csv-content .csv-table-container{flex:1;overflow:auto;border-radius:6px;min-width:0;min-height:0;transition:transform .2s ease-in-out;scroll-behavior:smooth;transform-origin:center center;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper{height:100%;scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-body::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-header::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-scrollable-footer::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper{scrollbar-width:none;-ms-overflow-style:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-scrollbar-wrapper::-webkit-scrollbar{display:none}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-table{border-collapse:collapse}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th{background-color:#f8f9fa;border:1px solid #e5e7eb;padding:.75rem;font-weight:600;color:#374151;text-align:left;position:sticky;top:0;z-index:1;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-thead>tr>th.csv-header-cell{background-color:#f1f5f9;font-weight:700;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td{border:1px solid #e5e7eb;padding:.75rem;color:#374151;vertical-align:top;word-wrap:break-word;white-space:normal}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr>td.csv-header-cell{background-color:#f1f5f9;font-weight:600;color:#1e293b}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:nth-child(2n){background-color:#f9fafb}.csv-container .csv-content .csv-table-container .csv-table ::ng-deep .p-datatable-tbody>tr:hover{background-color:#f3f4f6}.csv-container .email-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;border-radius:8px;overflow:auto}.csv-container .email-container .loading-container{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .loading-container i{margin-bottom:1rem}.csv-container .email-container .loading-container p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .error-container{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:2rem}.csv-container .email-container .error-container .error-content{text-align:center;max-width:400px}.csv-container .email-container .error-container .error-content i{margin-bottom:1rem}.csv-container .email-container .error-container .error-content h4{margin:0 0 .5rem;color:#111827;font-size:1.25rem}.csv-container .email-container .error-container .error-content p{margin:0 0 1.5rem;color:#6b7280;font-size:.875rem}.csv-container .email-container .error-container .error-content .error-actions{display:flex;justify-content:center;gap:.5rem}.csv-container .email-container .no-email-data{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;color:#6b7280}.csv-container .email-container .no-email-data i{margin-bottom:1rem}.csv-container .email-container .no-email-data p{margin:0;color:#9ca3af;font-size:.875rem}.csv-container .email-container .email-viewer{display:flex;flex-direction:column;height:100%;overflow:hidden}.csv-container .email-container .email-viewer .email-header{position:relative;padding:1.5rem;border-bottom:2px solid #e5e7eb;background:linear-gradient(to bottom,#fff,#f9fafb)}.csv-container .email-container .email-viewer .email-header .email-actions{position:absolute;top:1rem;right:1rem;display:flex;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-subject{margin:0 0 1rem;padding-right:100px;color:#111827;font-size:1.5rem;font-weight:600;line-height:1.4;word-break:break-word}.csv-container .email-container .email-viewer .email-header .email-metadata{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field{display:flex;gap:.75rem;font-size:.875rem;line-height:1.5}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-label{min-width:80px;color:#6b7280;font-weight:600}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value{color:#374151;word-break:break-word;flex:1}.csv-container .email-container .email-viewer .email-header .email-metadata .email-field .field-value i{margin-right:.25rem;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container{flex:1;overflow:auto;padding:1.5rem;background:#fff}.csv-container .email-container .email-viewer .email-body-container .email-body{max-width:100%;min-height:200px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep p{margin:0 0 1rem;line-height:1.6}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a{color:#3b82f6;text-decoration:none}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep a:hover{text-decoration:underline}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep img{max-width:100%;height:auto;border-radius:4px}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table{border-collapse:collapse;width:100%;margin:1rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table td,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{padding:.5rem;border:1px solid #e5e7eb}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep table th{background-color:#f9fafb;font-weight:600}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep blockquote{margin:1rem 0;padding-left:1rem;border-left:3px solid #e5e7eb;color:#6b7280}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ul,.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep ol{margin:0 0 1rem;padding-left:1.5rem}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-html ::ng-deep li{margin:.25rem 0}.csv-container .email-container .email-viewer .email-body-container .email-body.email-body-text pre{margin:0;padding:1rem;background:#f9fafb;border:1px solid #e5e7eb;border-radius:6px;font-family:Courier New,Courier,monospace;font-size:.875rem;line-height:1.6;color:#374151;white-space:pre-wrap;word-break:break-word;overflow-x:auto}.csv-container .email-container .email-viewer .email-attachments{padding:1rem 1.5rem;border-top:1px solid #e5e7eb;background:#f9fafb}.csv-container .email-container .email-viewer .email-attachments h4{margin:0 0 .75rem;color:#374151;font-size:.875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.csv-container .email-container .email-viewer .email-attachments .attachment-list{display:flex;flex-direction:column;gap:.5rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item{display:flex;align-items:center;gap:.5rem;padding:.625rem .875rem;background:#fff;border:1px solid #e5e7eb;border-radius:6px;font-size:.875rem;color:#374151;transition:all .2s ease}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item i{color:#6b7280;font-size:1rem}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item span{word-break:break-word}.csv-container .email-container .email-viewer .email-attachments .attachment-list .attachment-item:hover{background:#f3f4f6;border-color:#d1d5db}\n"] }]
|
|
8510
|
+
}], ctorParameters: () => [{ type: ExcelParserService }, { type: CsvParserService }, { type: DocumentHttpService }, { type: DocumentZoomService }, { type: i5$1.DomSanitizer }], propDecorators: { documentUrl: [{
|
|
8841
8511
|
type: Input
|
|
8842
8512
|
}], contentType: [{
|
|
8843
8513
|
type: Input
|
|
@@ -8984,7 +8654,7 @@ class DocumentActionsComponent {
|
|
|
8984
8654
|
this.rejectNote = SHARED.EMPTY;
|
|
8985
8655
|
}
|
|
8986
8656
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentActionsComponent, deps: [{ token: DocumentActionsService }, { token: SessionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
8987
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentActionsComponent, isStandalone: false, selector: "document-actions", inputs: { document: "document", documentId: "documentId", currentStatus: "currentStatus", isLoading: "isLoading", isUploaded: "isUploaded", statusId: "statusId" }, outputs: { actionPerformed: "actionPerformed" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-actions-container\" *ngIf=\"document?.status !=='Pending' && !document?.isUploaded && document?.status === 'Reviewing'\">\r\n <div class=\"actions-card\" [ngClass]=\"cardClass\">\r\n <div class=\"actions-buttons\">\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn reject-btn\" [ngClass]=\"rejectButtonClass\"\r\n (click)=\"onRejectClick()\" [disabled]=\"areButtonsDisabled || isRejecting\">\r\n <i class=\"pi pi-times\" *ngIf=\"isDocumentRejected\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isRejecting\"></i>\r\n <span>{{ isDocumentRejected ? SHARED.BUTTON_LABEL_REJECTED :\r\n SHARED.BUTTON_LABEL_REJECT }}</span>\r\n </button>\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn accept-btn\" [ngClass]=\"acceptButtonClass\"\r\n (click)=\"onAcceptClick()\" [disabled]=\"areButtonsDisabled || isAccepting\">\r\n <i class=\"pi pi-check\" *ngIf=\"isDocumentApproved\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isAccepting\"></i>\r\n <span>{{ isDocumentApproved ? SHARED.BUTTON_LABEL_ACCEPTED : SHARED.BUTTON_LABEL_ACCEPT\r\n }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<p-dialog [(visible)]=\"showAcceptDialog\" [header]=\"SHARED.ACCEPT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"acceptNote\" class=\"note-label\">{{ SHARED.ACCEPT_NOTE_LABEL }}</label>\r\n <textarea id=\"acceptNote\" pInputTextarea [(ngModel)]=\"acceptNote\" [placeholder]=\"SHARED.ACCEPT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.ACCEPT_BUTTON_LABEL\" class=\"p-button-success\" (click)=\"onAcceptConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [(visible)]=\"showRejectDialog\" [header]=\"SHARED.REJECT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"rejectNote\" class=\"note-label\">{{ SHARED.REJECT_NOTE_LABEL }}</label>\r\n <textarea id=\"rejectNote\" pInputTextarea [(ngModel)]=\"rejectNote\" [placeholder]=\"SHARED.REJECT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.REJECT_BUTTON_LABEL\" class=\"p-button-danger\" [disabled]=\"isRejectNoteEmpty\"\r\n (click)=\"onRejectConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>", styles: [".document-actions-container{margin:0}.actions-card{border-radius:8px;padding:.75rem;box-shadow:0 2px 4px #0000001a;transition:all .3s ease;width:92%;margin-left:3%}.actions-card.pending-card{background-color:#f8f9fa;border:1px solid #e9ecef}.actions-card.accepted-card{background-color:#e8f5e9;border:1px solid #66bb6a}.actions-card.rejected-card{background-color:#feeaea;border:1px solid #e57373}.actions-card[class*=status-].status-approved-card{background-color:#e8f5e9;border:1px solid #66bb6a}.actions-card[class*=status-].status-rejected-card{background-color:#feeaea;border:1px solid #e57373}.actions-card[class*=status-].status-pending-card{background-color:#f8f9fa;border:1px solid #e9ecef}.actions-buttons{display:flex;gap:.5rem;align-items:center}.action-btn{padding:.5rem 1rem;border-radius:6px;border:1px solid;font-weight:500;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:.5rem;min-width:48%;justify-content:center}.action-btn:disabled{opacity:.6;cursor:not-allowed}.action-btn i{font-size:.875rem}.reject-btn.default-reject{background-color:#fff;border-color:#ef4444;color:#ef4444}.reject-btn.default-reject:hover:not(:disabled){background-color:#fef2f2;border-color:#dc2626}.reject-btn.secondary-reject{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.reject-btn.secondary-reject:hover:not(:disabled){background-color:#edf2f7}.reject-btn.primary-reject{background-color:#feeaea;border-color:#e57373;color:#e57373}.reject-btn.primary-reject:hover:not(:disabled){background-color:#fed7d7;border-color:#fc8181}.reject-btn[class*=status-].status-approved-reject{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.reject-btn[class*=status-].status-approved-reject:hover:not(:disabled){background-color:#edf2f7}.reject-btn[class*=status-].status-rejected-reject{background-color:#feeaea;border-color:#e57373;color:#e57373}.reject-btn[class*=status-].status-rejected-reject:hover:not(:disabled){background-color:#fed7d7;border-color:#fc8181}.reject-btn[class*=status-].status-pending-reject{background-color:#fff;border-color:#ef4444;color:#ef4444}.reject-btn[class*=status-].status-pending-reject:hover:not(:disabled){background-color:#fef2f2;border-color:#dc2626}.accept-btn.default-accept{background-color:#3b82f6;border-color:#3b82f6;color:#fff}.accept-btn.default-accept:hover:not(:disabled){background-color:#2563eb;border-color:#2563eb}.accept-btn.secondary-accept{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.accept-btn.secondary-accept:hover:not(:disabled){background-color:#edf2f7}.accept-btn.primary-accept{background-color:#4caf50;border-color:#4caf50;color:#fff}.accept-btn.primary-accept:hover:not(:disabled){background-color:#45a049;border-color:#45a049}.accept-btn[class*=status-].status-approved-accept{background-color:#4caf50;border-color:#4caf50;color:#fff}.accept-btn[class*=status-].status-approved-accept:hover:not(:disabled){background-color:#45a049;border-color:#45a049}.accept-btn[class*=status-].status-rejected-accept{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.accept-btn[class*=status-].status-rejected-accept:hover:not(:disabled){background-color:#edf2f7}.accept-btn[class*=status-].status-pending-accept{background-color:#3b82f6;border-color:#3b82f6;color:#fff}.accept-btn[class*=status-].status-pending-accept:hover:not(:disabled){background-color:#2563eb;border-color:#2563eb}:host ::ng-deep .confirmation-dialog .p-dialog{border-radius:8px;box-shadow:0 4px 12px #00000026;border:none;overflow:hidden}:host ::ng-deep .confirmation-dialog .p-dialog-header{padding:1.25rem 1.5rem;background-color:#fff;border-bottom:none;border-top-right-radius:10px;border-top-left-radius:10px}:host ::ng-deep .confirmation-dialog .p-dialog-header .p-dialog-header-icon{display:none}:host ::ng-deep .confirmation-dialog .p-dialog-header .p-dialog-title{font-size:1.125rem;font-weight:600;color:#2d3748;margin:0}:host ::ng-deep .confirmation-dialog .p-dialog-content{padding:1.5rem;background-color:#fff}:host ::ng-deep .confirmation-dialog .p-dialog-footer{padding:1rem 1.5rem;background-color:#f7fafc;border-top:1px solid #e2e8f0;display:flex;gap:.75rem;justify-content:flex-end;border-bottom-right-radius:10px;border-bottom-left-radius:10px}.dialog-content .note-label{display:block;margin-bottom:.75rem;font-weight:500;font-size:.875rem;color:#2d3748}.dialog-content .note-textarea{width:100%;min-height:100px;padding:.75rem;border:1px solid #e2e8f0;border-radius:6px;font-family:inherit;font-size:.875rem;line-height:1.5;resize:vertical;background-color:#fff;color:#2d3748}.dialog-content .note-textarea::placeholder{color:#a0aec0}.dialog-content .note-textarea:focus{outline:none;border-color:#3182ce;box-shadow:0 0 0 3px #3182ce1a}.dialog-footer{display:flex;gap:.75rem;justify-content:flex-end}.dialog-footer button{min-width:80px;padding:.5rem 1rem;border-radius:6px;font-weight:500;font-size:.875rem;border:1px solid;cursor:pointer;transition:all .2s ease}.dialog-footer button.p-button-secondary{background-color:#f7fafc;border-color:#e2e8f0;color:#4a5568}.dialog-footer button.p-button-secondary:hover{background-color:#edf2f7;border-color:#cbd5e0}.dialog-footer button.p-button-success{background-color:#38a169;border-color:#38a169;color:#fff}.dialog-footer button.p-button-success:hover{background-color:#2f855a;border-color:#2f855a}.dialog-footer button.p-button-danger{background-color:#e53e3e;border-color:#e53e3e;color:#fff}.dialog-footer button.p-button-danger:hover{background-color:#c53030;border-color:#c53030}.no-actions-message{display:flex;align-items:center;justify-content:center;padding:.5rem;min-height:40px}.no-actions-message .no-actions-text{color:#6b7280;font-size:.875rem;font-style:italic;text-align:center}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i9.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i8.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "directive", type: i9$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8$1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }] });
|
|
8657
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentActionsComponent, isStandalone: false, selector: "document-actions", inputs: { document: "document", documentId: "documentId", currentStatus: "currentStatus", isLoading: "isLoading", isUploaded: "isUploaded", statusId: "statusId" }, outputs: { actionPerformed: "actionPerformed" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-actions-container\" *ngIf=\"document?.status !=='Pending' && !document?.isUploaded && document?.status === 'Reviewing'\">\r\n <div class=\"actions-card\" [ngClass]=\"cardClass\">\r\n <div class=\"actions-buttons\">\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn reject-btn\" [ngClass]=\"rejectButtonClass\"\r\n (click)=\"onRejectClick()\" [disabled]=\"areButtonsDisabled || isRejecting\">\r\n <i class=\"pi pi-times\" *ngIf=\"isDocumentRejected\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isRejecting\"></i>\r\n <span>{{ isDocumentRejected ? SHARED.BUTTON_LABEL_REJECTED :\r\n SHARED.BUTTON_LABEL_REJECT }}</span>\r\n </button>\r\n <button *ngIf=\"!document?.isUploaded\" class=\"action-btn accept-btn\" [ngClass]=\"acceptButtonClass\"\r\n (click)=\"onAcceptClick()\" [disabled]=\"areButtonsDisabled || isAccepting\">\r\n <i class=\"pi pi-check\" *ngIf=\"isDocumentApproved\"></i>\r\n <i class=\"pi pi-spin pi-spinner\" *ngIf=\"isAccepting\"></i>\r\n <span>{{ isDocumentApproved ? SHARED.BUTTON_LABEL_ACCEPTED : SHARED.BUTTON_LABEL_ACCEPT\r\n }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n\r\n<p-dialog [(visible)]=\"showAcceptDialog\" [header]=\"SHARED.ACCEPT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"acceptNote\" class=\"note-label\">{{ SHARED.ACCEPT_NOTE_LABEL }}</label>\r\n <textarea id=\"acceptNote\" pInputTextarea [(ngModel)]=\"acceptNote\" [placeholder]=\"SHARED.ACCEPT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.ACCEPT_BUTTON_LABEL\" class=\"p-button-success\" (click)=\"onAcceptConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [(visible)]=\"showRejectDialog\" [header]=\"SHARED.REJECT_CONFIRM_HEADER\" [modal]=\"true\" [draggable]=\"false\"\r\n [closable]=\"true\" [style]=\"{ width: '25rem', height: '25rem' }\" styleClass=\"confirmation-dialog\">\r\n <div class=\"dialog-content\">\r\n <label for=\"rejectNote\" class=\"note-label\">{{ SHARED.REJECT_NOTE_LABEL }}</label>\r\n <textarea id=\"rejectNote\" pInputTextarea [(ngModel)]=\"rejectNote\" [placeholder]=\"SHARED.REJECT_NOTE_PLACEHOLDER\"\r\n rows=\"6\" class=\"note-textarea\">\r\n </textarea>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"dialog-footer\">\r\n <button pButton [label]=\"SHARED.CANCEL_BUTTON_LABEL\" class=\"p-button-secondary\" (click)=\"onCancel()\">\r\n </button>\r\n <button pButton [label]=\"SHARED.REJECT_BUTTON_LABEL\" class=\"p-button-danger\" [disabled]=\"isRejectNoteEmpty\"\r\n (click)=\"onRejectConfirm()\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>", styles: [".document-actions-container{margin:0}.actions-card{border-radius:8px;padding:.75rem;box-shadow:0 2px 4px #0000001a;transition:all .3s ease;width:92%;margin-left:3%}.actions-card.pending-card{background-color:#f8f9fa;border:1px solid #e9ecef}.actions-card.accepted-card{background-color:#e8f5e9;border:1px solid #66bb6a}.actions-card.rejected-card{background-color:#feeaea;border:1px solid #e57373}.actions-card[class*=status-].status-approved-card{background-color:#e8f5e9;border:1px solid #66bb6a}.actions-card[class*=status-].status-rejected-card{background-color:#feeaea;border:1px solid #e57373}.actions-card[class*=status-].status-pending-card{background-color:#f8f9fa;border:1px solid #e9ecef}.actions-buttons{display:flex;gap:.5rem;align-items:center}.action-btn{padding:.5rem 1rem;border-radius:6px;border:1px solid;font-weight:500;cursor:pointer;transition:all .2s ease;display:flex;align-items:center;gap:.5rem;min-width:48%;justify-content:center}.action-btn:disabled{opacity:.6;cursor:not-allowed}.action-btn i{font-size:.875rem}.reject-btn.default-reject{background-color:#fff;border-color:#ef4444;color:#ef4444}.reject-btn.default-reject:hover:not(:disabled){background-color:#fef2f2;border-color:#dc2626}.reject-btn.secondary-reject{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.reject-btn.secondary-reject:hover:not(:disabled){background-color:#edf2f7}.reject-btn.primary-reject{background-color:#feeaea;border-color:#e57373;color:#e57373}.reject-btn.primary-reject:hover:not(:disabled){background-color:#fed7d7;border-color:#fc8181}.reject-btn[class*=status-].status-approved-reject{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.reject-btn[class*=status-].status-approved-reject:hover:not(:disabled){background-color:#edf2f7}.reject-btn[class*=status-].status-rejected-reject{background-color:#feeaea;border-color:#e57373;color:#e57373}.reject-btn[class*=status-].status-rejected-reject:hover:not(:disabled){background-color:#fed7d7;border-color:#fc8181}.reject-btn[class*=status-].status-pending-reject{background-color:#fff;border-color:#ef4444;color:#ef4444}.reject-btn[class*=status-].status-pending-reject:hover:not(:disabled){background-color:#fef2f2;border-color:#dc2626}.accept-btn.default-accept{background-color:#3b82f6;border-color:#3b82f6;color:#fff}.accept-btn.default-accept:hover:not(:disabled){background-color:#2563eb;border-color:#2563eb}.accept-btn.secondary-accept{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.accept-btn.secondary-accept:hover:not(:disabled){background-color:#edf2f7}.accept-btn.primary-accept{background-color:#4caf50;border-color:#4caf50;color:#fff}.accept-btn.primary-accept:hover:not(:disabled){background-color:#45a049;border-color:#45a049}.accept-btn[class*=status-].status-approved-accept{background-color:#4caf50;border-color:#4caf50;color:#fff}.accept-btn[class*=status-].status-approved-accept:hover:not(:disabled){background-color:#45a049;border-color:#45a049}.accept-btn[class*=status-].status-rejected-accept{background-color:#f5f5f5;border-color:transparent;color:#4a4a4a}.accept-btn[class*=status-].status-rejected-accept:hover:not(:disabled){background-color:#edf2f7}.accept-btn[class*=status-].status-pending-accept{background-color:#3b82f6;border-color:#3b82f6;color:#fff}.accept-btn[class*=status-].status-pending-accept:hover:not(:disabled){background-color:#2563eb;border-color:#2563eb}:host ::ng-deep .confirmation-dialog .p-dialog{border-radius:8px;box-shadow:0 4px 12px #00000026;border:none;overflow:hidden}:host ::ng-deep .confirmation-dialog .p-dialog-header{padding:1.25rem 1.5rem;background-color:#fff;border-bottom:none;border-top-right-radius:10px;border-top-left-radius:10px}:host ::ng-deep .confirmation-dialog .p-dialog-header .p-dialog-header-icon{display:none}:host ::ng-deep .confirmation-dialog .p-dialog-header .p-dialog-title{font-size:1.125rem;font-weight:600;color:#2d3748;margin:0}:host ::ng-deep .confirmation-dialog .p-dialog-content{padding:1.5rem;background-color:#fff}:host ::ng-deep .confirmation-dialog .p-dialog-footer{padding:1rem 1.5rem;background-color:#f7fafc;border-top:1px solid #e2e8f0;display:flex;gap:.75rem;justify-content:flex-end;border-bottom-right-radius:10px;border-bottom-left-radius:10px}.dialog-content .note-label{display:block;margin-bottom:.75rem;font-weight:500;font-size:.875rem;color:#2d3748}.dialog-content .note-textarea{width:100%;min-height:100px;padding:.75rem;border:1px solid #e2e8f0;border-radius:6px;font-family:inherit;font-size:.875rem;line-height:1.5;resize:vertical;background-color:#fff;color:#2d3748}.dialog-content .note-textarea::placeholder{color:#a0aec0}.dialog-content .note-textarea:focus{outline:none;border-color:#3182ce;box-shadow:0 0 0 3px #3182ce1a}.dialog-footer{display:flex;gap:.75rem;justify-content:flex-end}.dialog-footer button{min-width:80px;padding:.5rem 1rem;border-radius:6px;font-weight:500;font-size:.875rem;border:1px solid;cursor:pointer;transition:all .2s ease}.dialog-footer button.p-button-secondary{background-color:#f7fafc;border-color:#e2e8f0;color:#4a5568}.dialog-footer button.p-button-secondary:hover{background-color:#edf2f7;border-color:#cbd5e0}.dialog-footer button.p-button-success{background-color:#38a169;border-color:#38a169;color:#fff}.dialog-footer button.p-button-success:hover{background-color:#2f855a;border-color:#2f855a}.dialog-footer button.p-button-danger{background-color:#e53e3e;border-color:#e53e3e;color:#fff}.dialog-footer button.p-button-danger:hover{background-color:#c53030;border-color:#c53030}.no-actions-message{display:flex;align-items:center;justify-content:center;padding:.5rem;min-height:40px}.no-actions-message .no-actions-text{color:#6b7280;font-size:.875rem;font-style:italic;text-align:center}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i9.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i8.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize", "variant"], outputs: ["onResize"] }, { kind: "directive", type: i9$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8$2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }] });
|
|
8988
8658
|
}
|
|
8989
8659
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentActionsComponent, decorators: [{
|
|
8990
8660
|
type: Component,
|
|
@@ -9280,40 +8950,6 @@ class DocumentListComponent {
|
|
|
9280
8950
|
*/
|
|
9281
8951
|
documentListSubscription = new Subscription();
|
|
9282
8952
|
handleSelectedDocumentInNewTab = new EventEmitter();
|
|
9283
|
-
/**
|
|
9284
|
-
* Callback function to handle opening a document in a new tab when Ctrl+Click is used.
|
|
9285
|
-
* This callback is called directly from the user gesture (preserving the gesture chain),
|
|
9286
|
-
* BEFORE any Angular change detection, so window.open() will work without popup blockers.
|
|
9287
|
-
*
|
|
9288
|
-
* IMPORTANT: Build your URL synchronously and call window.open() immediately. Do NOT:
|
|
9289
|
-
* - Use setTimeout, Promise, async/await
|
|
9290
|
-
* - Use Angular Router.navigate() (use window.open() with URL string instead)
|
|
9291
|
-
* - Trigger any operations that cause change detection before window.open()
|
|
9292
|
-
*
|
|
9293
|
-
* Best practice implementation:
|
|
9294
|
-
*
|
|
9295
|
-
* ```typescript
|
|
9296
|
-
* onOpenInNewTab = (event: { selectedDocument: any, contextId: string, documentList: any[] }) => {
|
|
9297
|
-
* // Build URL synchronously (no async operations)
|
|
9298
|
-
* const baseUrl = window.location.origin;
|
|
9299
|
-
* const params = new URLSearchParams({
|
|
9300
|
-
* selectedDocument: JSON.stringify(event.selectedDocument),
|
|
9301
|
-
* contextId: event.contextId,
|
|
9302
|
-
* documentList: JSON.stringify(event.documentList)
|
|
9303
|
-
* });
|
|
9304
|
-
* const url = `${baseUrl}/your-route?${params.toString()}`;
|
|
9305
|
-
*
|
|
9306
|
-
* // Call window.open() immediately - this preserves the user gesture chain
|
|
9307
|
-
* const newWindow = window.open(url, '_blank');
|
|
9308
|
-
* if (newWindow) {
|
|
9309
|
-
* newWindow.focus(); // Focus the new tab
|
|
9310
|
-
* }
|
|
9311
|
-
* }
|
|
9312
|
-
* ```
|
|
9313
|
-
*
|
|
9314
|
-
* @param event - The event object containing selectedDocument, contextId, and documentList
|
|
9315
|
-
*/
|
|
9316
|
-
onOpenInNewTab;
|
|
9317
8953
|
/**
|
|
9318
8954
|
* The currently selected document.
|
|
9319
8955
|
* @type {DocumentModel}
|
|
@@ -9540,38 +9176,13 @@ class DocumentListComponent {
|
|
|
9540
9176
|
}
|
|
9541
9177
|
}
|
|
9542
9178
|
handleTableRowCtrlClick(rowData) {
|
|
9543
|
-
|
|
9544
|
-
|
|
9545
|
-
|
|
9546
|
-
|
|
9547
|
-
selectedDocument: selectedDocument,
|
|
9179
|
+
this.selectedDocument = this.documentListService.handleTableRowClick(rowData);
|
|
9180
|
+
this.handleSelectedDocument.emit(this.selectedDocument);
|
|
9181
|
+
this.handleSelectedDocumentInNewTab.emit({
|
|
9182
|
+
selectedDocument: this.selectedDocument,
|
|
9548
9183
|
contextId: this.contextId,
|
|
9549
9184
|
documentList: this.documentList
|
|
9550
|
-
};
|
|
9551
|
-
// Call callback FIRST, before any Angular operations that might trigger change detection
|
|
9552
|
-
// This preserves the user gesture chain, allowing window.open() to work and focus properly
|
|
9553
|
-
if (this.onOpenInNewTab && typeof this.onOpenInNewTab === 'function') {
|
|
9554
|
-
try {
|
|
9555
|
-
// Execute callback immediately while still in the user gesture chain
|
|
9556
|
-
this.onOpenInNewTab(event);
|
|
9557
|
-
// After callback completes, update component state and emit events
|
|
9558
|
-
// These operations happen after window.open() has already been called
|
|
9559
|
-
this.selectedDocument = selectedDocument;
|
|
9560
|
-
this.handleSelectedDocument.emit(this.selectedDocument);
|
|
9561
|
-
}
|
|
9562
|
-
catch (error) {
|
|
9563
|
-
console.error('Error in onOpenInNewTab callback:', error);
|
|
9564
|
-
// Fallback to event emitter if callback fails
|
|
9565
|
-
this.selectedDocument = selectedDocument;
|
|
9566
|
-
this.handleSelectedDocument.emit(this.selectedDocument);
|
|
9567
|
-
this.handleSelectedDocumentInNewTab.emit(event);
|
|
9568
|
-
}
|
|
9569
|
-
return;
|
|
9570
|
-
}
|
|
9571
|
-
// Only emit if no callback provided (backward compatibility)
|
|
9572
|
-
this.selectedDocument = selectedDocument;
|
|
9573
|
-
this.handleSelectedDocument.emit(this.selectedDocument);
|
|
9574
|
-
this.handleSelectedDocumentInNewTab.emit(event);
|
|
9185
|
+
});
|
|
9575
9186
|
}
|
|
9576
9187
|
/**
|
|
9577
9188
|
* Handles document status update events from viewer
|
|
@@ -9846,7 +9457,7 @@ class DocumentListComponent {
|
|
|
9846
9457
|
}
|
|
9847
9458
|
}
|
|
9848
9459
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentListComponent, deps: [{ token: DocumentListService }, { token: DocumentHttpService }, { token: DocumentMenuService }, { token: DocumentStore }, { token: DocumentScrollService }], target: i0.ɵɵFactoryTarget.Component });
|
|
9849
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentListComponent, isStandalone: false, selector: "lib-document-list", inputs: { contextId: "contextId", documentListResponse: "documentListResponse", selectedMenuItemId: "selectedMenuItemId", navigationInfo: "navigationInfo", onOpenInNewTab: "onOpenInNewTab", documentList: "documentList" }, outputs: { handleSelectedDocumentInNewTab: "handleSelectedDocumentInNewTab", handleSelectedDocument: "handleSelectedDocument" }, viewQueries: [{ propertyName: "documentCategoriesContainer", first: true, predicate: ["documentCategoriesContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"document-viewer\">\r\n <p-dialog [(visible)]=\"isdialogVisible\" [modal]=\"true\"\r\n class=\"w-full h-full document-dailog-wrapper\" [draggable]=\"false\" [closable]=\"true\" (onHide)=\"handleCloseModal()\">\r\n <p-messages [(value)]=\"deleteMessage\" [enableService]=\"false\" [closable]=\"false\" />\r\n \r\n <document-viewer [selectedDocument]=\"selectedDocument\" [documentList]=\"documentList\" [contextId]=\"contextId\" \r\n (documentStatusUpdated)=\"handleDocumentStatusUpdate($event)\"\r\n (viewerDestroyed)=\"handleViewerDestroyed()\"\r\n (deleteError)=\"handleDeleteError($event)\"\r\n (deleteSuccess)=\"handleDeleteSuccess()\">\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"w-full flex align-items-center justify-content-between\">\r\n <input type=\"text\" class=\"w-full border-none bg-white h-3rem file-input-wrapper\" pInputText\r\n [(ngModel)]=\"fileName\" />\r\n\r\n </div>\r\n </ng-template>\r\n <ng-content></ng-content>\r\n </document-viewer>\r\n </p-dialog>\r\n</div>\r\n\r\n<div class=\"document-categories-container\" #documentCategoriesContainer>\r\n <div class=\"category\" *ngFor=\"let category of documentCategories; let i = index\"\r\n [id]=\"categoryIds[i]\">\r\n <div class=\"category-header\" *ngIf=\"documentCategories[i]?.list?.length\">\r\n <div class=\"category-title\">\r\n <h3>{{ formattedCategoryLabels[i] }}</h3>\r\n <p class=\"category-description\">{{ category.categoryDescription }}</p>\r\n </div>\r\n <div class=\"completion-status\">\r\n <p-badge \r\n [severity]=\"categorySeverities[i]\" \r\n [value]=\"(((categoryCompletionCounts && categoryCompletionCounts[i]) || 0) + ' Complete')\"\r\n class=\"completion-badge\">\r\n </p-badge>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-container\">\r\n <lib-table-primary [tableData]=\"categoryTables[i]\" [tableStyle]=\"{ 'min-width': '100%' }\"\r\n (rowClick)=\"handleTableRowClick($event)\" (deleteAction)=\"handleDeleteAction($event)\" (rowCtrlClick)=\"handleTableRowCtrlClick($event)\" >\r\n </lib-table-primary>\r\n </div>\r\n </div>\r\n</div>", styles: [".document-list-wrapper .p-accordion-header-link{padding:.5rem}.document-list-wrapper .p-sidebar-right{width:35%}.error-message-wrapper{color:#dc3545}.right-sidebar{width:35%}.document-title-wrapper{font-size:20px;font-weight:700;color:var(--text-color)}.document-input-field{display:flex;flex-direction:column}.document-input-field input{width:100%;height:46px;padding:10px 15px;gap:10px;border-radius:10px;outline:none;border:1px solid rgba(76,98,146,.1019607843);font-size:15px}label{color:#0f1729;font-weight:600}.document-list-dropDown .p-element{padding:10px 0 10px 15px}.document-list-dropDown .p-dropdown{border-radius:10px!important}.side-bar-con{display:flex;flex-direction:column}.save-btn-con{width:100%;border-top:1px solid rgba(76,98,146,.2);background:#4c629214;padding:13px 40px}.save-btn-wrapper{padding:10px 4px}.save-btn .p-button{height:45px!important;width:140px;border-radius:10px}.p-sidebar-footer{padding:0}.file-input-wrapper.p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa!important}.clickable-doc-name{cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px}.clickable-doc-name:hover{background-color:#4c62921a;color:var(--primary-color, #4C6292)}.clickable-doc-name:active{background-color:#4c629233;transform:scale(.98)}.clickable-doc-name .edit-icon{font-size:.8em;margin-left:8px;opacity:.6;transition:opacity .2s ease}.clickable-doc-name:hover .edit-icon{opacity:1}.document-name-display{display:flex;flex-direction:column;align-items:flex-start;gap:4px;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;width:100%}.document-name-display:hover{background-color:#4c62921a}.document-name-display:hover .alias-name{color:var(--primary-color, #4C6292)}.document-name-display:active{background-color:#4c629233;transform:scale(.98)}.document-name-display .alias-name{font-size:1.5rem;font-weight:700;color:var(--text-color, #2c3e50);line-height:1.2;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;max-width:none;transition:color .2s ease;display:flex;align-items:center;justify-content:flex-start;gap:8px}.document-name-display .alias-name .edit-icon-small{font-size:.7em;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease;margin-left:6px}.document-name-display:hover .edit-icon-small{opacity:1;visibility:visible}.document-name-display .document-name{font-size:.875rem;color:var(--text-color-secondary, #6c757d);font-weight:400;line-height:1.2;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;max-width:none;opacity:.8}.file-input-wrapper{transition:all .2s ease;min-width:300px!important;width:auto!important;max-width:80vw!important}.file-input-wrapper:focus{border-color:var(--primary-color, #4C6292)!important;box-shadow:0 0 0 .2rem #4c629240!important;outline:none!important}.document-name-input{min-width:400px!important;width:auto!important;max-width:70vw!important;padding:8px 12px!important;font-size:1.1rem!important;font-weight:500!important;border:2px solid var(--primary-color, #4C6292)!important;border-radius:6px!important;background-color:#fff!important}.document-name-input:focus{outline:none!important;border-color:var(--primary-color, #4C6292)!important;box-shadow:0 0 0 .2rem #4c629240!important}.document-edit-container{display:flex;flex-direction:column;align-items:flex-start;gap:6px;width:100%;max-width:70vw}.document-name-subline{font-size:.85rem;color:var(--text-color-secondary, #6c757d);line-height:1.2;padding-left:4px;opacity:.8}.document-viewer{position:relative;z-index:1}.document-viewer ::ng-deep .p-dialog{z-index:9999!important}.document-viewer ::ng-deep .p-dialog-mask{z-index:9998!important}.document-viewer ::ng-deep .p-dialog{width:100vw!important;height:100vh!important;max-width:none!important;max-height:none!important;margin:0!important;top:0!important;left:0!important;transform:none!important}.document-viewer ::ng-deep .p-dialog-content{height:calc(100vh - 60px)!important;max-height:none!important}.document-categories-container{padding:1rem;min-height:auto}.document-categories-container .category{background:#fff;border-radius:8px;margin-bottom:2rem;overflow:hidden;transition:all .3s ease}.document-categories-container .category .category-header{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding-top:.6rem;padding-bottom:1rem}.document-categories-container .category .category-header .category-title{flex:1;min-width:0}.document-categories-container .category .category-header .category-title h3{margin:0 0 .5rem;font-size:1.25rem;font-weight:600;color:#2c3e50}.document-categories-container .category .category-header .category-title .category-description{margin:0;color:#6c757d;font-size:.875rem;line-height:1.4}.document-categories-container .category .category-header .completion-status{display:flex;align-items:center;justify-content:center;min-width:fit-content}.document-categories-container .category .category-header .completion-status .status-badge{background-color:#fbbf24;color:#92400e;padding:.375rem .75rem;border-radius:6px;font-size:.75rem;font-weight:500;display:inline-block}.document-categories-container .category .category-header .completion-status .completion-badge{display:flex;align-items:center;justify-content:center}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge{font-size:.75rem;font-weight:500;padding:.375rem .75rem;border-radius:6px;display:flex;align-items:center;justify-content:center;min-width:fit-content;white-space:nowrap}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-success{background-color:#d1fae5;color:#065f46;font-family:inherit;font-size:12px;padding:15px;font-weight:400}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-info{background-color:#e5e7eb;color:#000;font-family:inherit;font-size:12px;font-weight:400;padding:15px;font-style:inherit}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-warning{background-color:#fef3c7;color:#d97706;font-family:inherit;padding:15px;font-size:12px;font-weight:400;font-style:inherit}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-danger{background-color:#fee2e2;color:#dc2626;font-family:inherit;font-size:12px;padding:15px;font-weight:400;font-style:inherit}.document-categories-container .category .table-container{padding:0}@keyframes highlightPulse{0%{transform:scale(1.02);box-shadow:0 4px 20px #3b82f64d}50%{transform:scale(1.03);box-shadow:0 6px 25px #3b82f680}to{transform:scale(1.02);box-shadow:0 4px 20px #3b82f64d}}.document-sections-container{padding:1rem;background-color:#f8f9fa;min-height:100vh}.document-sections-container .section{background:#fff;border-radius:8px;margin-bottom:2rem;box-shadow:0 2px 4px #0000001a;overflow:hidden}.document-sections-container .section .section-header{display:flex;justify-content:space-between;align-items:flex-start;padding:1.5rem 1.5rem 1rem;border-bottom:1px solid #e9ecef}.document-sections-container .section .section-header .section-title h3{margin:0 0 .5rem;font-size:1.25rem;font-weight:600;color:#2c3e50}.document-sections-container .section .section-header .section-title .section-description{margin:0;color:#6c757d;font-size:.875rem;line-height:1.4}.document-sections-container .section .section-header .completion-status .status-badge{background-color:#fbbf24;color:#92400e;padding:.375rem .75rem;border-radius:6px;font-size:.75rem;font-weight:500;display:inline-block}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge{font-size:.75rem;font-weight:500;padding:.375rem .75rem;border-radius:6px}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-success{background-color:#10b981;color:#fff}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-info{background-color:#3b82f6;color:#fff}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-warning{background-color:#f59e0b;color:#fff}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-danger{background-color:#ef4444;color:#fff}.document-sections-container .section .table-container{padding:0}@media (max-width: 768px){.document-categories-container,.document-sections-container{padding:.5rem}.document-categories-container .category .category-header,.document-categories-container .category .section-header,.document-categories-container .section .category-header,.document-categories-container .section .section-header,.document-sections-container .category .category-header,.document-sections-container .category .section-header,.document-sections-container .section .category-header,.document-sections-container .section .section-header{flex-direction:column;gap:1rem;align-items:stretch}.document-categories-container .category .category-header .completion-status,.document-categories-container .category .section-header .completion-status,.document-categories-container .section .category-header .completion-status,.document-categories-container .section .section-header .completion-status,.document-sections-container .category .category-header .completion-status,.document-sections-container .category .section-header .completion-status,.document-sections-container .section .category-header .completion-status,.document-sections-container .section .section-header .completion-status{align-self:center;width:100%;justify-content:center}}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "component", type: i9$3.Badge, selector: "p-badge", inputs: ["styleClass", "style", "badgeSize", "severity", "value", "badgeDisabled", "size"] }, { kind: "directive", type: i9$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8$1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i6$1.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: TablePrimaryComponent, selector: "lib-table-primary", inputs: ["tableData", "showHeader", "tableStyle"], outputs: ["rowClick", "rowCtrlClick"] }, { kind: "component", type: DocumentViewerComponent, selector: "document-viewer", inputs: ["selectedDocument", "documentList", "contextId", "isFormHide"], outputs: ["documentStatusUpdated", "deleteError", "deleteSuccess", "viewerDestroyed"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
9460
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentListComponent, isStandalone: false, selector: "lib-document-list", inputs: { contextId: "contextId", documentListResponse: "documentListResponse", selectedMenuItemId: "selectedMenuItemId", navigationInfo: "navigationInfo", documentList: "documentList" }, outputs: { handleSelectedDocumentInNewTab: "handleSelectedDocumentInNewTab", handleSelectedDocument: "handleSelectedDocument" }, viewQueries: [{ propertyName: "documentCategoriesContainer", first: true, predicate: ["documentCategoriesContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"document-viewer\">\r\n <p-dialog [(visible)]=\"isdialogVisible\" [modal]=\"true\"\r\n class=\"w-full h-full document-dailog-wrapper\" [draggable]=\"false\" [closable]=\"true\" (onHide)=\"handleCloseModal()\">\r\n <p-messages [(value)]=\"deleteMessage\" [enableService]=\"false\" [closable]=\"false\" />\r\n \r\n <document-viewer [selectedDocument]=\"selectedDocument\" [documentList]=\"documentList\" [contextId]=\"contextId\" \r\n (documentStatusUpdated)=\"handleDocumentStatusUpdate($event)\"\r\n (viewerDestroyed)=\"handleViewerDestroyed()\"\r\n (deleteError)=\"handleDeleteError($event)\"\r\n (deleteSuccess)=\"handleDeleteSuccess()\">\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"w-full flex align-items-center justify-content-between\">\r\n <input type=\"text\" class=\"w-full border-none bg-white h-3rem file-input-wrapper\" pInputText\r\n [(ngModel)]=\"fileName\" />\r\n\r\n </div>\r\n </ng-template>\r\n <ng-content></ng-content>\r\n </document-viewer>\r\n </p-dialog>\r\n</div>\r\n\r\n<div class=\"document-categories-container\" #documentCategoriesContainer>\r\n <div class=\"category\" *ngFor=\"let category of documentCategories; let i = index\"\r\n [id]=\"categoryIds[i]\">\r\n <div class=\"category-header\" *ngIf=\"documentCategories[i]?.list?.length\">\r\n <div class=\"category-title\">\r\n <h3>{{ formattedCategoryLabels[i] }}</h3>\r\n <p class=\"category-description\">{{ category.categoryDescription }}</p>\r\n </div>\r\n <div class=\"completion-status\">\r\n <p-badge \r\n [severity]=\"categorySeverities[i]\" \r\n [value]=\"(((categoryCompletionCounts && categoryCompletionCounts[i]) || 0) + ' Complete')\"\r\n class=\"completion-badge\">\r\n </p-badge>\r\n </div>\r\n </div>\r\n\r\n <div class=\"table-container\">\r\n <lib-table-primary [tableData]=\"categoryTables[i]\" [tableStyle]=\"{ 'min-width': '100%' }\"\r\n (rowClick)=\"handleTableRowClick($event)\" (deleteAction)=\"handleDeleteAction($event)\" (rowCtrlClick)=\"handleTableRowCtrlClick($event)\" >\r\n </lib-table-primary>\r\n </div>\r\n </div>\r\n</div>", styles: [".document-list-wrapper .p-accordion-header-link{padding:.5rem}.document-list-wrapper .p-sidebar-right{width:35%}.error-message-wrapper{color:#dc3545}.right-sidebar{width:35%}.document-title-wrapper{font-size:20px;font-weight:700;color:var(--text-color)}.document-input-field{display:flex;flex-direction:column}.document-input-field input{width:100%;height:46px;padding:10px 15px;gap:10px;border-radius:10px;outline:none;border:1px solid rgba(76,98,146,.1019607843);font-size:15px}label{color:#0f1729;font-weight:600}.document-list-dropDown .p-element{padding:10px 0 10px 15px}.document-list-dropDown .p-dropdown{border-radius:10px!important}.side-bar-con{display:flex;flex-direction:column}.save-btn-con{width:100%;border-top:1px solid rgba(76,98,146,.2);background:#4c629214;padding:13px 40px}.save-btn-wrapper{padding:10px 4px}.save-btn .p-button{height:45px!important;width:140px;border-radius:10px}.p-sidebar-footer{padding:0}.file-input-wrapper.p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa!important}.clickable-doc-name{cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px}.clickable-doc-name:hover{background-color:#4c62921a;color:var(--primary-color, #4C6292)}.clickable-doc-name:active{background-color:#4c629233;transform:scale(.98)}.clickable-doc-name .edit-icon{font-size:.8em;margin-left:8px;opacity:.6;transition:opacity .2s ease}.clickable-doc-name:hover .edit-icon{opacity:1}.document-name-display{display:flex;flex-direction:column;align-items:flex-start;gap:4px;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;width:100%}.document-name-display:hover{background-color:#4c62921a}.document-name-display:hover .alias-name{color:var(--primary-color, #4C6292)}.document-name-display:active{background-color:#4c629233;transform:scale(.98)}.document-name-display .alias-name{font-size:1.5rem;font-weight:700;color:var(--text-color, #2c3e50);line-height:1.2;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;max-width:none;transition:color .2s ease;display:flex;align-items:center;justify-content:flex-start;gap:8px}.document-name-display .alias-name .edit-icon-small{font-size:.7em;opacity:0;visibility:hidden;transition:opacity .2s ease,visibility .2s ease;margin-left:6px}.document-name-display:hover .edit-icon-small{opacity:1;visibility:visible}.document-name-display .document-name{font-size:.875rem;color:var(--text-color-secondary, #6c757d);font-weight:400;line-height:1.2;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;max-width:none;opacity:.8}.file-input-wrapper{transition:all .2s ease;min-width:300px!important;width:auto!important;max-width:80vw!important}.file-input-wrapper:focus{border-color:var(--primary-color, #4C6292)!important;box-shadow:0 0 0 .2rem #4c629240!important;outline:none!important}.document-name-input{min-width:400px!important;width:auto!important;max-width:70vw!important;padding:8px 12px!important;font-size:1.1rem!important;font-weight:500!important;border:2px solid var(--primary-color, #4C6292)!important;border-radius:6px!important;background-color:#fff!important}.document-name-input:focus{outline:none!important;border-color:var(--primary-color, #4C6292)!important;box-shadow:0 0 0 .2rem #4c629240!important}.document-edit-container{display:flex;flex-direction:column;align-items:flex-start;gap:6px;width:100%;max-width:70vw}.document-name-subline{font-size:.85rem;color:var(--text-color-secondary, #6c757d);line-height:1.2;padding-left:4px;opacity:.8}.document-viewer{position:relative;z-index:1}.document-viewer ::ng-deep .p-dialog{z-index:9999!important}.document-viewer ::ng-deep .p-dialog-mask{z-index:9998!important}.document-viewer ::ng-deep .p-dialog{width:100vw!important;height:100vh!important;max-width:none!important;max-height:none!important;margin:0!important;top:0!important;left:0!important;transform:none!important}.document-viewer ::ng-deep .p-dialog-content{height:calc(100vh - 60px)!important;max-height:none!important}.document-categories-container{padding:1rem;min-height:auto}.document-categories-container .category{background:#fff;border-radius:8px;margin-bottom:2rem;overflow:hidden;transition:all .3s ease}.document-categories-container .category .category-header{display:flex;justify-content:space-between;align-items:center;gap:1rem;padding-top:.6rem;padding-bottom:1rem}.document-categories-container .category .category-header .category-title{flex:1;min-width:0}.document-categories-container .category .category-header .category-title h3{margin:0 0 .5rem;font-size:1.25rem;font-weight:600;color:#2c3e50}.document-categories-container .category .category-header .category-title .category-description{margin:0;color:#6c757d;font-size:.875rem;line-height:1.4}.document-categories-container .category .category-header .completion-status{display:flex;align-items:center;justify-content:center;min-width:fit-content}.document-categories-container .category .category-header .completion-status .status-badge{background-color:#fbbf24;color:#92400e;padding:.375rem .75rem;border-radius:6px;font-size:.75rem;font-weight:500;display:inline-block}.document-categories-container .category .category-header .completion-status .completion-badge{display:flex;align-items:center;justify-content:center}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge{font-size:.75rem;font-weight:500;padding:.375rem .75rem;border-radius:6px;display:flex;align-items:center;justify-content:center;min-width:fit-content;white-space:nowrap}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-success{background-color:#d1fae5;color:#065f46;font-family:inherit;font-size:12px;padding:15px;font-weight:400}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-info{background-color:#e5e7eb;color:#000;font-family:inherit;font-size:12px;font-weight:400;padding:15px;font-style:inherit}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-warning{background-color:#fef3c7;color:#d97706;font-family:inherit;padding:15px;font-size:12px;font-weight:400;font-style:inherit}.document-categories-container .category .category-header .completion-status .completion-badge .p-badge.p-badge-danger{background-color:#fee2e2;color:#dc2626;font-family:inherit;font-size:12px;padding:15px;font-weight:400;font-style:inherit}.document-categories-container .category .table-container{padding:0}@keyframes highlightPulse{0%{transform:scale(1.02);box-shadow:0 4px 20px #3b82f64d}50%{transform:scale(1.03);box-shadow:0 6px 25px #3b82f680}to{transform:scale(1.02);box-shadow:0 4px 20px #3b82f64d}}.document-sections-container{padding:1rem;background-color:#f8f9fa;min-height:100vh}.document-sections-container .section{background:#fff;border-radius:8px;margin-bottom:2rem;box-shadow:0 2px 4px #0000001a;overflow:hidden}.document-sections-container .section .section-header{display:flex;justify-content:space-between;align-items:flex-start;padding:1.5rem 1.5rem 1rem;border-bottom:1px solid #e9ecef}.document-sections-container .section .section-header .section-title h3{margin:0 0 .5rem;font-size:1.25rem;font-weight:600;color:#2c3e50}.document-sections-container .section .section-header .section-title .section-description{margin:0;color:#6c757d;font-size:.875rem;line-height:1.4}.document-sections-container .section .section-header .completion-status .status-badge{background-color:#fbbf24;color:#92400e;padding:.375rem .75rem;border-radius:6px;font-size:.75rem;font-weight:500;display:inline-block}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge{font-size:.75rem;font-weight:500;padding:.375rem .75rem;border-radius:6px}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-success{background-color:#10b981;color:#fff}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-info{background-color:#3b82f6;color:#fff}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-warning{background-color:#f59e0b;color:#fff}.document-sections-container .section .section-header .completion-status .completion-badge .p-badge.p-badge-danger{background-color:#ef4444;color:#fff}.document-sections-container .section .table-container{padding:0}@media (max-width: 768px){.document-categories-container,.document-sections-container{padding:.5rem}.document-categories-container .category .category-header,.document-categories-container .category .section-header,.document-categories-container .section .category-header,.document-categories-container .section .section-header,.document-sections-container .category .category-header,.document-sections-container .category .section-header,.document-sections-container .section .category-header,.document-sections-container .section .section-header{flex-direction:column;gap:1rem;align-items:stretch}.document-categories-container .category .category-header .completion-status,.document-categories-container .category .section-header .completion-status,.document-categories-container .section .category-header .completion-status,.document-categories-container .section .section-header .completion-status,.document-sections-container .category .category-header .completion-status,.document-sections-container .category .section-header .completion-status,.document-sections-container .section .category-header .completion-status,.document-sections-container .section .section-header .completion-status{align-self:center;width:100%;justify-content:center}}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "component", type: i9$3.Badge, selector: "p-badge", inputs: ["styleClass", "style", "badgeSize", "severity", "value", "badgeDisabled", "size"] }, { kind: "directive", type: i9$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i8$2.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i6$1.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: TablePrimaryComponent, selector: "lib-table-primary", inputs: ["tableData", "showHeader", "tableStyle"], outputs: ["rowClick", "rowCtrlClick"] }, { kind: "component", type: DocumentViewerComponent, selector: "document-viewer", inputs: ["selectedDocument", "documentList", "contextId", "isFormHide"], outputs: ["documentStatusUpdated", "deleteError", "deleteSuccess", "viewerDestroyed"] }], encapsulation: i0.ViewEncapsulation.None });
|
|
9850
9461
|
}
|
|
9851
9462
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentListComponent, decorators: [{
|
|
9852
9463
|
type: Component,
|
|
@@ -9864,8 +9475,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
9864
9475
|
args: ['documentCategoriesContainer', { static: false }]
|
|
9865
9476
|
}], handleSelectedDocumentInNewTab: [{
|
|
9866
9477
|
type: Output
|
|
9867
|
-
}], onOpenInNewTab: [{
|
|
9868
|
-
type: Input
|
|
9869
9478
|
}], documentList: [{
|
|
9870
9479
|
type: Input
|
|
9871
9480
|
}], handleSelectedDocument: [{
|
|
@@ -10132,7 +9741,7 @@ class DocumentsMenuComponent {
|
|
|
10132
9741
|
}
|
|
10133
9742
|
}
|
|
10134
9743
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentsMenuComponent, deps: [{ token: DocumentStore }, { token: DocumentQuery }, { token: DocumentMenuService }, { token: DocumentHelperService }], target: i0.ɵɵFactoryTarget.Component });
|
|
10135
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DocumentsMenuComponent, isStandalone: false, selector: "lib-documents-menu", inputs: { catagories: "catagories", applicationNumber: "applicationNumber", contextId: "contextId" }, outputs: { menuItemSelected: "menuItemSelected" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-sidebar-container\">\r\n <!-- Menu items are now used for navigation to specific sections, not for filtering documents -->\r\n <p-card class=\"widget-menu-wrapper h-full\">\r\n @if(applicationNumber){\r\n <div class=\"flex align-items-center justify-content-between widget-menu-header-wrapper\">\r\n <p class=\"mb-0 application-title-wrapper\">ID - {{applicationNumber}}</p>\r\n <div class=\"expand-icon-wrapper\">\r\n <i class=\"ri-arrow-left-s-line text-primary flex align-items-center justify-content-center w-full h-full\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"widget-menu-container\" >\r\n <div class=\"widget-menu-wrapper h-ful l custom-scroll\">\r\n <p-menu [model]=\"categories\" styleClass=\"w-full md:w-15rem\">\r\n <ng-template pTemplate=\"submenuheader\" let-item>\r\n <span [style]=\"{\r\n color : '#9EA0B3'\r\n }\">{{ item.label }} Documents</span>\r\n </ng-template>\r\n <ng-template pTemplate=\"item\" let-item>\r\n <a pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [class.selected-menu-item]=\"selectedMenuItemId === item._id\"\r\n [class.disabled-menu-item]=\"item.isSelectable === false\"\r\n [class.pointer-events-none]=\"item.isSelectable === false\"\r\n [style.opacity]=\"item.isSelectable === false ? '0.5' : '1'\"\r\n [style.cursor]=\"item.isSelectable === false ? 'not-allowed' : 'pointer'\"\r\n (click)=\"onMenuItemClick($event, item)\">\r\n <span [class]=\"item.icon\" class=\"text-xl\"></span>\r\n <span class=\"ml-2\">{{ item.label }}</span>\r\n <p-badge *ngIf=\"item.menuData?.shouldShowBadge\" \r\n class=\"ml-auto\" \r\n [severity]=\"item.menuData?.badgeSeverity\" \r\n [value]=\"item.menuData?.badgeValue\" />\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n </div>\r\n </div>\r\n </p-card>\r\n</div>\r\n\r\n ", styles: [".expand-icon-wrapper{border:1px solid var(--primary-color);height:24px;width:24px;border-radius:50%;background:var(--blue-bg-light)}::ng-deep .p-badge.p-badge-success{background-color:#dcfce7;color:#16a34a;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-badge.p-badge-danger{background-color:#fee2e2;color:#dc2626;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-badge.p-badge-warning{background-color:#fef3c7;color:#d97706;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-badge.p-badge-info{background-color:#e5e7eb;color:#000;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-menu .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#1f2937}@media screen and (min-width: 768px){::ng-deep .md\\:w-15rem{width:100%!important}}::ng-deep .p-menu{border:none}::ng-deep .custom-scroll{scrollbar-gutter:inherit}::ng-deep .selected-menu-item{background-color:#0066ff1a!important;color:var(--primary-color)!important;border:1px solid rgba(68,72,109,.1)!important;border-radius:10px!important}::ng-deep .selected-menu-item .text-xl{color:var(--primary-color)!important}::ng-deep .disabled-menu-item{opacity:.5!important;cursor:not-allowed!important;pointer-events:none!important}::ng-deep .disabled-menu-item .text-xl{color:#9ea0b3!important}::ng-deep .disabled-menu-item .ml-2{color:#9ea0b3!important}::ng-deep .disabled-menu-item .p-badge{opacity:.5!important}::ng-deep .p-menuitem-link:not(.selected-menu-item){background-color:#fff!important;border:none!important;border-radius:0!important}::ng-deep .p-menuitem-link:not(.selected-menu-item) .text-xl{color:var(--text-color)!important}::ng-deep .p-panelmenu .p-panelmenu-content{border:none!important}.application-title-wrapper{color:#9ea0b3;font-weight:500}.widget-menu-wrapper{margin-top:8px}.widget-menu-header-wrapper{padding:4px 4px 4px 16px}.widget-menu-container{overflow-y:auto;overflow-x:hidden}.custom-scroll{overflow-y:hidden;scrollbar-gutter:stable}.custom-scroll:hover{overflow-y:auto}::ng-deep .document-sidebar-container .p-card{height:100%;box-shadow:none}::ng-deep .document-sidebar-container .p-card .p-card-content{height:100%;padding:0!important}::ng-deep .document-sidebar-container .p-card .p-card-body{height:100%;width:100%;padding:12px 8px;border-radius:10px;border:1px solid #e5e7eb}::ng-deep .document-sidebar-container .widget-menu-wrapper .p-panelmenu-panel .p-panelmenu-expanded .p-panelmenu-content{border:none!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content{border:none;color:var(--text-color);font-weight:400!important;background-color:var(--surface-0)!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action{color:var(--text-color);font-weight:400!important;position:relative;padding:12px}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action .p-icon-wrapper{position:absolute;right:0;top:16px;margin-right:7px;transform:rotate(90deg)!important;transition:none!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action .p-menuitem-text{max-width:75%;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-menuitem-link-active{border:1px solid rgba(68,72,109,.1);border-radius:10px;padding:12px;color:var(--primary-color);background-color:#0066ff1a!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-menuitem-link-active .p-menuitem-icon{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-menuitem-link-active .p-menuitem-text{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .company-action-wrapper:not(.p-disabled).p-highlight .p-panelmenu-header-content{margin:12px 0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .no-highlight.p-panelmenu-header:not(.p-disabled).p-highlight .p-panelmenu-header-content{background-color:transparent!important;border-radius:10px;padding:12px;border-bottom:0!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .no-highlight.p-panelmenu-header:not(.p-disabled).p-highlight .p-panelmenu-header-content .p-panelmenu-header-action{padding:0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .no-highlight.p-panelmenu-header:not(.p-disabled).p-highlight .p-panelmenu-header-content .p-panelmenu-header-action .p-icon-wrapper{transform:rotate(180deg)!important;transition:none!important;top:0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link{background-color:#fff!important;color:var(--text-color);padding:12px 6px!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{max-width:75%;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link-active{border:1px solid rgba(68,72,109,.1);border-radius:10px;padding:12px;color:var(--primary-color);box-shadow:none!important;background-color:#0066ff1a!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link-active .p-menuitem-icon{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link-active .p-menuitem-text{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem.p-focus>.p-menuitem-content{background-color:#fff!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-focus)>.p-menuitem-content .p-menuitem-link{background-color:#fff!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link:not(.selected-menu-item){background-color:#fff!important;border:none!important;border-radius:0!important;color:var(--text-color)!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link:not(.selected-menu-item) .p-menuitem-icon{color:var(--text-color)!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link:not(.selected-menu-item) .p-menuitem-text{color:var(--text-color)!important}::ng-deep .widget-menu-wrapper .p-panelmenu-panel .p-panelmenu-expanded .p-panelmenu-content{border:1px solid rgba(68,72,109,.1)!important;border-top:0!important;border-bottom-left-radius:10px;border-bottom-right-radius:10px}::ng-deep .widget-menu-wrapper .p-panelmenu-panel .widget-separator{border-top:1px solid rgba(68,72,109,.1)!important}::ng-deep .widget-menu-wrapper .p-panelmenu-panel .widget-separator .p-panelmenu-header-content .p-panelmenu-header-action{padding:0!important}.no-documents-message{padding:12px 16px;text-align:center}.no-documents-message .text-muted{color:#9ea0b3;font-size:14px;font-style:italic}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i9$3.Badge, selector: "p-badge", inputs: ["styleClass", "style", "badgeSize", "severity", "value", "badgeDisabled", "size"] }, { kind: "component", type: i8$2.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i9$4.Card, selector: "p-card", inputs: ["header", "subheader", "style", "styleClass"] }] });
|
|
9744
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DocumentsMenuComponent, isStandalone: false, selector: "lib-documents-menu", inputs: { catagories: "catagories", applicationNumber: "applicationNumber", contextId: "contextId" }, outputs: { menuItemSelected: "menuItemSelected" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-sidebar-container\">\r\n <!-- Menu items are now used for navigation to specific sections, not for filtering documents -->\r\n <p-card class=\"widget-menu-wrapper h-full\">\r\n @if(applicationNumber){\r\n <div class=\"flex align-items-center justify-content-between widget-menu-header-wrapper\">\r\n <p class=\"mb-0 application-title-wrapper\">ID - {{applicationNumber}}</p>\r\n <div class=\"expand-icon-wrapper\">\r\n <i class=\"ri-arrow-left-s-line text-primary flex align-items-center justify-content-center w-full h-full\"></i>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"widget-menu-container\" >\r\n <div class=\"widget-menu-wrapper h-ful l custom-scroll\">\r\n <p-menu [model]=\"categories\" styleClass=\"w-full md:w-15rem\">\r\n <ng-template pTemplate=\"submenuheader\" let-item>\r\n <span [style]=\"{\r\n color : '#9EA0B3'\r\n }\">{{ item.label }} Documents</span>\r\n </ng-template>\r\n <ng-template pTemplate=\"item\" let-item>\r\n <a pRipple \r\n class=\"flex align-items-center p-menuitem-link\"\r\n [class.selected-menu-item]=\"selectedMenuItemId === item._id\"\r\n [class.disabled-menu-item]=\"item.isSelectable === false\"\r\n [class.pointer-events-none]=\"item.isSelectable === false\"\r\n [style.opacity]=\"item.isSelectable === false ? '0.5' : '1'\"\r\n [style.cursor]=\"item.isSelectable === false ? 'not-allowed' : 'pointer'\"\r\n (click)=\"onMenuItemClick($event, item)\">\r\n <span [class]=\"item.icon\" class=\"text-xl\"></span>\r\n <span class=\"ml-2\">{{ item.label }}</span>\r\n <p-badge *ngIf=\"item.menuData?.shouldShowBadge\" \r\n class=\"ml-auto\" \r\n [severity]=\"item.menuData?.badgeSeverity\" \r\n [value]=\"item.menuData?.badgeValue\" />\r\n </a>\r\n </ng-template>\r\n </p-menu>\r\n </div>\r\n </div>\r\n </p-card>\r\n</div>\r\n\r\n ", styles: [".expand-icon-wrapper{border:1px solid var(--primary-color);height:24px;width:24px;border-radius:50%;background:var(--blue-bg-light)}::ng-deep .p-badge.p-badge-success{background-color:#dcfce7;color:#16a34a;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-badge.p-badge-danger{background-color:#fee2e2;color:#dc2626;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-badge.p-badge-warning{background-color:#fef3c7;color:#d97706;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-badge.p-badge-info{background-color:#e5e7eb;color:#000;font-family:inherit;font-size:12px;font-weight:400;font-style:inherit}::ng-deep .p-menu .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#1f2937}@media screen and (min-width: 768px){::ng-deep .md\\:w-15rem{width:100%!important}}::ng-deep .p-menu{border:none}::ng-deep .custom-scroll{scrollbar-gutter:inherit}::ng-deep .selected-menu-item{background-color:#0066ff1a!important;color:var(--primary-color)!important;border:1px solid rgba(68,72,109,.1)!important;border-radius:10px!important}::ng-deep .selected-menu-item .text-xl{color:var(--primary-color)!important}::ng-deep .disabled-menu-item{opacity:.5!important;cursor:not-allowed!important;pointer-events:none!important}::ng-deep .disabled-menu-item .text-xl{color:#9ea0b3!important}::ng-deep .disabled-menu-item .ml-2{color:#9ea0b3!important}::ng-deep .disabled-menu-item .p-badge{opacity:.5!important}::ng-deep .p-menuitem-link:not(.selected-menu-item){background-color:#fff!important;border:none!important;border-radius:0!important}::ng-deep .p-menuitem-link:not(.selected-menu-item) .text-xl{color:var(--text-color)!important}::ng-deep .p-panelmenu .p-panelmenu-content{border:none!important}.application-title-wrapper{color:#9ea0b3;font-weight:500}.widget-menu-wrapper{margin-top:8px}.widget-menu-header-wrapper{padding:4px 4px 4px 16px}.widget-menu-container{overflow-y:auto;overflow-x:hidden}.custom-scroll{overflow-y:hidden;scrollbar-gutter:stable}.custom-scroll:hover{overflow-y:auto}::ng-deep .document-sidebar-container .p-card{height:100%;box-shadow:none}::ng-deep .document-sidebar-container .p-card .p-card-content{height:100%;padding:0!important}::ng-deep .document-sidebar-container .p-card .p-card-body{height:100%;width:100%;padding:12px 8px;border-radius:10px;border:1px solid #e5e7eb}::ng-deep .document-sidebar-container .widget-menu-wrapper .p-panelmenu-panel .p-panelmenu-expanded .p-panelmenu-content{border:none!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content{border:none;color:var(--text-color);font-weight:400!important;background-color:var(--surface-0)!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action{color:var(--text-color);font-weight:400!important;position:relative;padding:12px}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action .p-icon-wrapper{position:absolute;right:0;top:16px;margin-right:7px;transform:rotate(90deg)!important;transition:none!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action .p-menuitem-text{max-width:75%;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-menuitem-link-active{border:1px solid rgba(68,72,109,.1);border-radius:10px;padding:12px;color:var(--primary-color);background-color:#0066ff1a!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-menuitem-link-active .p-menuitem-icon{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-menuitem-link-active .p-menuitem-text{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .company-action-wrapper:not(.p-disabled).p-highlight .p-panelmenu-header-content{margin:12px 0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .no-highlight.p-panelmenu-header:not(.p-disabled).p-highlight .p-panelmenu-header-content{background-color:transparent!important;border-radius:10px;padding:12px;border-bottom:0!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .no-highlight.p-panelmenu-header:not(.p-disabled).p-highlight .p-panelmenu-header-content .p-panelmenu-header-action{padding:0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .no-highlight.p-panelmenu-header:not(.p-disabled).p-highlight .p-panelmenu-header-content .p-panelmenu-header-action .p-icon-wrapper{transform:rotate(180deg)!important;transition:none!important;top:0!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link{background-color:#fff!important;color:var(--text-color);padding:12px 6px!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{max-width:75%;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link-active{border:1px solid rgba(68,72,109,.1);border-radius:10px;padding:12px;color:var(--primary-color);box-shadow:none!important;background-color:#0066ff1a!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link-active .p-menuitem-icon{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link-active .p-menuitem-text{color:var(--primary-color)}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem.p-focus>.p-menuitem-content{background-color:#fff!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-focus)>.p-menuitem-content .p-menuitem-link{background-color:#fff!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link:not(.selected-menu-item){background-color:#fff!important;border:none!important;border-radius:0!important;color:var(--text-color)!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link:not(.selected-menu-item) .p-menuitem-icon{color:var(--text-color)!important}::ng-deep .widget-menu-wrapper .p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link:not(.selected-menu-item) .p-menuitem-text{color:var(--text-color)!important}::ng-deep .widget-menu-wrapper .p-panelmenu-panel .p-panelmenu-expanded .p-panelmenu-content{border:1px solid rgba(68,72,109,.1)!important;border-top:0!important;border-bottom-left-radius:10px;border-bottom-right-radius:10px}::ng-deep .widget-menu-wrapper .p-panelmenu-panel .widget-separator{border-top:1px solid rgba(68,72,109,.1)!important}::ng-deep .widget-menu-wrapper .p-panelmenu-panel .widget-separator .p-panelmenu-header-content .p-panelmenu-header-action{padding:0!important}.no-documents-message{padding:12px 16px;text-align:center}.no-documents-message .text-muted{color:#9ea0b3;font-size:14px;font-style:italic}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i9$3.Badge, selector: "p-badge", inputs: ["styleClass", "style", "badgeSize", "severity", "value", "badgeDisabled", "size"] }, { kind: "component", type: i8$3.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "component", type: i9$4.Card, selector: "p-card", inputs: ["header", "subheader", "style", "styleClass"] }] });
|
|
10136
9745
|
}
|
|
10137
9746
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentsMenuComponent, decorators: [{
|
|
10138
9747
|
type: Component,
|
|
@@ -10172,39 +9781,6 @@ class DocumentContainerComponent {
|
|
|
10172
9781
|
* The currently selected menu item ID for scrolling
|
|
10173
9782
|
*/
|
|
10174
9783
|
selectedMenuItemId = null;
|
|
10175
|
-
/**
|
|
10176
|
-
* Callback function to handle opening a document in a new tab when Ctrl+Click is used.
|
|
10177
|
-
* This callback is called directly from the user gesture (preserving the gesture chain),
|
|
10178
|
-
* BEFORE any Angular change detection, so window.open() will work without popup blockers.
|
|
10179
|
-
*
|
|
10180
|
-
* IMPORTANT: Build your URL synchronously and call window.open() immediately. Do NOT:
|
|
10181
|
-
* - Use setTimeout, Promise, async/await
|
|
10182
|
-
* - Use Angular Router.navigate() (use window.open() with URL string instead)
|
|
10183
|
-
* - Trigger any operations that cause change detection before window.open()
|
|
10184
|
-
*
|
|
10185
|
-
* Best practice implementation:
|
|
10186
|
-
*
|
|
10187
|
-
* ```typescript
|
|
10188
|
-
* onOpenInNewTab = (event: { selectedDocument: any, contextId: string, documentList: any[] }) => {
|
|
10189
|
-
* // Build URL synchronously (no async operations)
|
|
10190
|
-
* const baseUrl = window.location.origin;
|
|
10191
|
-
* const params = new URLSearchParams({
|
|
10192
|
-
* selectedDocument: JSON.stringify(event.selectedDocument),
|
|
10193
|
-
* contextId: event.contextId,
|
|
10194
|
-
* documentList: JSON.stringify(event.documentList)
|
|
10195
|
-
* });
|
|
10196
|
-
* const url = `${baseUrl}/your-route?${params.toString()}`;
|
|
10197
|
-
*
|
|
10198
|
-
* // Call window.open() immediately - this preserves the user gesture chain
|
|
10199
|
-
* const newWindow = window.open(url, '_blank');
|
|
10200
|
-
* if (newWindow) {
|
|
10201
|
-
* newWindow.focus(); // Focus the new tab
|
|
10202
|
-
* }
|
|
10203
|
-
* }
|
|
10204
|
-
* ```
|
|
10205
|
-
*
|
|
10206
|
-
* @param event - The event object containing selectedDocument, contextId, and documentList
|
|
10207
|
-
*/
|
|
10208
9784
|
onOpenInNewTab;
|
|
10209
9785
|
/**
|
|
10210
9786
|
* Additional navigation information for better scrolling
|
|
@@ -10368,9 +9944,11 @@ class DocumentContainerComponent {
|
|
|
10368
9944
|
this.fetchStatusData();
|
|
10369
9945
|
}
|
|
10370
9946
|
onDocumentSelectedInNewTab(event) {
|
|
10371
|
-
if (
|
|
10372
|
-
|
|
9947
|
+
// Call callback first if provided (preserves user gesture chain)
|
|
9948
|
+
if (this.onOpenInNewTab && typeof this.onOpenInNewTab === 'function') {
|
|
9949
|
+
this.onOpenInNewTab(event);
|
|
10373
9950
|
}
|
|
9951
|
+
this.selectedDocumentInNewTab.emit(event);
|
|
10374
9952
|
}
|
|
10375
9953
|
/**
|
|
10376
9954
|
* Fetches status data based on current selections
|
|
@@ -10474,11 +10052,11 @@ class DocumentContainerComponent {
|
|
|
10474
10052
|
this.clearAllState();
|
|
10475
10053
|
}
|
|
10476
10054
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentContainerComponent, deps: [{ token: DocumentHttpService }, { token: DocumentHelperService }, { token: DocumentQuery }, { token: DocumentStore }, { token: DocumentMenuService }], target: i0.ɵɵFactoryTarget.Component });
|
|
10477
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentContainerComponent, isStandalone: false, selector: "lib-document-container", inputs: { onOpenInNewTab: "onOpenInNewTab", contextId: "contextId" }, outputs: { selectedDocument: "selectedDocument", selectedDocumentInNewTab: "selectedDocumentInNewTab" }, viewQueries: [{ propertyName: "contentScrollContainer", first: true, predicate: ["contentScrollContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"grid m-0 flex document-container-layout\">\r\n <div class=\"menu-panel col-12 md:col-2\">\r\n <lib-documents-menu \r\n [catagories]=\"catagories\" \r\n [applicationNumber]=\"applicationNumber\" \r\n [contextId]=\"contextId\"\r\n (menuItemSelected)=\"onMenuItemSelected($event)\">\r\n </lib-documents-menu>\r\n </div>\r\n \r\n <div class=\"content-panel col-12 md:col-10\" #contentScrollContainer>\r\n <div class=\"content-card\">\r\n <lib-folder-container [contextId]=\"contextId\" [userList]=\"userList\" [statusData]=\"statusData\" [categories]=\"catagories\"></lib-folder-container>\r\n </div>\r\n <div>\r\n <lib-document-list \r\n [contextId]=\"contextId\" \r\n [documentListResponse]=\"documentListResponse\"\r\n [selectedMenuItemId]=\"selectedMenuItemId\"\r\n [navigationInfo]=\"navigationInfo\"\r\n (handleSelectedDocumentInNewTab)=\"onDocumentSelectedInNewTab($event)\"\r\n (handleSelectedDocument)=\"onDocumentSelected($event)\"\r\n
|
|
10055
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentContainerComponent, isStandalone: false, selector: "lib-document-container", inputs: { onOpenInNewTab: "onOpenInNewTab", contextId: "contextId" }, outputs: { selectedDocument: "selectedDocument", selectedDocumentInNewTab: "selectedDocumentInNewTab" }, viewQueries: [{ propertyName: "contentScrollContainer", first: true, predicate: ["contentScrollContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"grid m-0 flex document-container-layout\">\r\n <div class=\"menu-panel col-12 md:col-2\">\r\n <lib-documents-menu \r\n [catagories]=\"catagories\" \r\n [applicationNumber]=\"applicationNumber\" \r\n [contextId]=\"contextId\"\r\n (menuItemSelected)=\"onMenuItemSelected($event)\">\r\n </lib-documents-menu>\r\n </div>\r\n \r\n <div class=\"content-panel col-12 md:col-10\" #contentScrollContainer>\r\n <div class=\"content-card\">\r\n <lib-folder-container [contextId]=\"contextId\" [userList]=\"userList\" [statusData]=\"statusData\" [categories]=\"catagories\"></lib-folder-container>\r\n </div>\r\n <div>\r\n <lib-document-list \r\n [contextId]=\"contextId\" \r\n [documentListResponse]=\"documentListResponse\"\r\n [selectedMenuItemId]=\"selectedMenuItemId\"\r\n [navigationInfo]=\"navigationInfo\"\r\n (handleSelectedDocumentInNewTab)=\"onDocumentSelectedInNewTab($event)\"\r\n (handleSelectedDocument)=\"onDocumentSelected($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </lib-document-list>\r\n </div>\r\n </div>\r\n <p-confirmDialog \r\n [style]=\"{width: '25vw'}\" \r\n acceptLabel=\"Yes\"\r\n rejectLabel=\"No\"\r\n appendTo=\"body\"\r\n acceptIcon=\"pi pi-check\"\r\n rejectIcon=\"pi pi-times\">\r\n </p-confirmDialog>\r\n</div>\r\n", styles: [".document-container-layout{display:grid;grid-template-columns:1fr;height:98vh;overflow:auto;position:relative}@media (min-width: 768px){.document-container-layout{grid-template-columns:16.6667% 1fr}}.menu-panel{background-color:#fff;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}@media (min-width: 768px){.menu-panel{position:fixed;left:0;top:0;bottom:0;width:16.6667%}}.menu-panel::-webkit-scrollbar{display:none}.content-panel{display:flex;flex-direction:column;height:98vh;overflow-y:auto;overflow-x:hidden;padding:0;position:relative;z-index:10;scrollbar-width:none;-ms-overflow-style:none}@media (min-width: 768px){.content-panel{margin-left:16.6667%}}.content-panel::-webkit-scrollbar{display:none}@media (max-width: 1024px){.menu-panel{width:240px}.content-panel{margin-left:240px}}@media (max-width: 768px){.document-container-layout{grid-template-columns:1fr}.menu-panel{position:relative;width:100%;height:200px;border-right:none;border-bottom:1px solid #e5e7eb;z-index:auto}.content-panel{margin-left:0;flex:1}}.custom-scroll{overflow-y:hidden;scrollbar-gutter:stable}.custom-scroll:hover{overflow-y:auto}*{scrollbar-width:thin}body,html{height:100%}::ng-deep .p-card{overflow:visible!important}::ng-deep .p-card-body{overflow:visible!important}::ng-deep .p-dialog{z-index:9999!important}::ng-deep .p-dialog-mask{z-index:9998!important}::ng-deep .content-panel .p-card{overflow:visible!important}\n"], dependencies: [{ kind: "component", type: i6$2.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "component", type: FolderContainerComponent, selector: "lib-folder-container", inputs: ["documentList", "folderList", "contextId", "userList", "statusData", "categories"] }, { kind: "component", type: DocumentListComponent, selector: "lib-document-list", inputs: ["contextId", "documentListResponse", "selectedMenuItemId", "navigationInfo", "documentList"], outputs: ["handleSelectedDocumentInNewTab", "handleSelectedDocument"] }, { kind: "component", type: DocumentsMenuComponent, selector: "lib-documents-menu", inputs: ["catagories", "applicationNumber", "contextId"], outputs: ["menuItemSelected"] }] });
|
|
10478
10056
|
}
|
|
10479
10057
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentContainerComponent, decorators: [{
|
|
10480
10058
|
type: Component,
|
|
10481
|
-
args: [{ selector: 'lib-document-container', standalone: false, template: "<div class=\"grid m-0 flex document-container-layout\">\r\n <div class=\"menu-panel col-12 md:col-2\">\r\n <lib-documents-menu \r\n [catagories]=\"catagories\" \r\n [applicationNumber]=\"applicationNumber\" \r\n [contextId]=\"contextId\"\r\n (menuItemSelected)=\"onMenuItemSelected($event)\">\r\n </lib-documents-menu>\r\n </div>\r\n \r\n <div class=\"content-panel col-12 md:col-10\" #contentScrollContainer>\r\n <div class=\"content-card\">\r\n <lib-folder-container [contextId]=\"contextId\" [userList]=\"userList\" [statusData]=\"statusData\" [categories]=\"catagories\"></lib-folder-container>\r\n </div>\r\n <div>\r\n <lib-document-list \r\n [contextId]=\"contextId\" \r\n [documentListResponse]=\"documentListResponse\"\r\n [selectedMenuItemId]=\"selectedMenuItemId\"\r\n [navigationInfo]=\"navigationInfo\"\r\n (handleSelectedDocumentInNewTab)=\"onDocumentSelectedInNewTab($event)\"\r\n (handleSelectedDocument)=\"onDocumentSelected($event)\"\r\n
|
|
10059
|
+
args: [{ selector: 'lib-document-container', standalone: false, template: "<div class=\"grid m-0 flex document-container-layout\">\r\n <div class=\"menu-panel col-12 md:col-2\">\r\n <lib-documents-menu \r\n [catagories]=\"catagories\" \r\n [applicationNumber]=\"applicationNumber\" \r\n [contextId]=\"contextId\"\r\n (menuItemSelected)=\"onMenuItemSelected($event)\">\r\n </lib-documents-menu>\r\n </div>\r\n \r\n <div class=\"content-panel col-12 md:col-10\" #contentScrollContainer>\r\n <div class=\"content-card\">\r\n <lib-folder-container [contextId]=\"contextId\" [userList]=\"userList\" [statusData]=\"statusData\" [categories]=\"catagories\"></lib-folder-container>\r\n </div>\r\n <div>\r\n <lib-document-list \r\n [contextId]=\"contextId\" \r\n [documentListResponse]=\"documentListResponse\"\r\n [selectedMenuItemId]=\"selectedMenuItemId\"\r\n [navigationInfo]=\"navigationInfo\"\r\n (handleSelectedDocumentInNewTab)=\"onDocumentSelectedInNewTab($event)\"\r\n (handleSelectedDocument)=\"onDocumentSelected($event)\"\r\n >\r\n <ng-content></ng-content>\r\n </lib-document-list>\r\n </div>\r\n </div>\r\n <p-confirmDialog \r\n [style]=\"{width: '25vw'}\" \r\n acceptLabel=\"Yes\"\r\n rejectLabel=\"No\"\r\n appendTo=\"body\"\r\n acceptIcon=\"pi pi-check\"\r\n rejectIcon=\"pi pi-times\">\r\n </p-confirmDialog>\r\n</div>\r\n", styles: [".document-container-layout{display:grid;grid-template-columns:1fr;height:98vh;overflow:auto;position:relative}@media (min-width: 768px){.document-container-layout{grid-template-columns:16.6667% 1fr}}.menu-panel{background-color:#fff;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}@media (min-width: 768px){.menu-panel{position:fixed;left:0;top:0;bottom:0;width:16.6667%}}.menu-panel::-webkit-scrollbar{display:none}.content-panel{display:flex;flex-direction:column;height:98vh;overflow-y:auto;overflow-x:hidden;padding:0;position:relative;z-index:10;scrollbar-width:none;-ms-overflow-style:none}@media (min-width: 768px){.content-panel{margin-left:16.6667%}}.content-panel::-webkit-scrollbar{display:none}@media (max-width: 1024px){.menu-panel{width:240px}.content-panel{margin-left:240px}}@media (max-width: 768px){.document-container-layout{grid-template-columns:1fr}.menu-panel{position:relative;width:100%;height:200px;border-right:none;border-bottom:1px solid #e5e7eb;z-index:auto}.content-panel{margin-left:0;flex:1}}.custom-scroll{overflow-y:hidden;scrollbar-gutter:stable}.custom-scroll:hover{overflow-y:auto}*{scrollbar-width:thin}body,html{height:100%}::ng-deep .p-card{overflow:visible!important}::ng-deep .p-card-body{overflow:visible!important}::ng-deep .p-dialog{z-index:9999!important}::ng-deep .p-dialog-mask{z-index:9998!important}::ng-deep .content-panel .p-card{overflow:visible!important}\n"] }]
|
|
10482
10060
|
}], ctorParameters: () => [{ type: DocumentHttpService }, { type: DocumentHelperService }, { type: DocumentQuery }, { type: DocumentStore }, { type: DocumentMenuService }], propDecorators: { onOpenInNewTab: [{
|
|
10483
10061
|
type: Input
|
|
10484
10062
|
}], contentScrollContainer: [{
|
|
@@ -11496,6 +11074,380 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
11496
11074
|
}]
|
|
11497
11075
|
}] });
|
|
11498
11076
|
|
|
11077
|
+
/**
|
|
11078
|
+
* Service for parsing EML (email message) files
|
|
11079
|
+
* Handles both plain text and HTML email content
|
|
11080
|
+
*/
|
|
11081
|
+
class EmlParserService {
|
|
11082
|
+
sanitizer;
|
|
11083
|
+
http;
|
|
11084
|
+
constructor(sanitizer, http) {
|
|
11085
|
+
this.sanitizer = sanitizer;
|
|
11086
|
+
this.http = http;
|
|
11087
|
+
}
|
|
11088
|
+
/**
|
|
11089
|
+
* Parses EML file content
|
|
11090
|
+
* @param emlContent - Raw EML file content as string
|
|
11091
|
+
* @returns Parsed email data
|
|
11092
|
+
*/
|
|
11093
|
+
parseEmlData(emlContent) {
|
|
11094
|
+
try {
|
|
11095
|
+
const lines = emlContent.split(/\r?\n/);
|
|
11096
|
+
const headers = this.parseHeaders(lines);
|
|
11097
|
+
const body = this.parseBody(lines);
|
|
11098
|
+
return {
|
|
11099
|
+
from: this.cleanEmailAddress(headers['from'] || 'Unknown'),
|
|
11100
|
+
to: this.cleanEmailAddress(headers['to'] || 'Unknown'),
|
|
11101
|
+
cc: headers['cc'] ? this.cleanEmailAddress(headers['cc']) : undefined,
|
|
11102
|
+
subject: this.decodeHeader(headers['subject'] || 'No Subject'),
|
|
11103
|
+
date: this.formatDate(headers['date'] || ''),
|
|
11104
|
+
body: body.content,
|
|
11105
|
+
isHtml: body.isHtml,
|
|
11106
|
+
attachments: this.parseAttachments(emlContent)
|
|
11107
|
+
};
|
|
11108
|
+
}
|
|
11109
|
+
catch (error) {
|
|
11110
|
+
console.error('Error parsing EML file:', error);
|
|
11111
|
+
return null;
|
|
11112
|
+
}
|
|
11113
|
+
}
|
|
11114
|
+
/**
|
|
11115
|
+
* Parses email headers from EML content
|
|
11116
|
+
* @param lines - Lines of the EML file
|
|
11117
|
+
* @returns Object containing parsed headers
|
|
11118
|
+
*/
|
|
11119
|
+
parseHeaders(lines) {
|
|
11120
|
+
const headers = {};
|
|
11121
|
+
let currentHeader = '';
|
|
11122
|
+
let currentValue = '';
|
|
11123
|
+
for (const line of lines) {
|
|
11124
|
+
// Empty line indicates end of headers
|
|
11125
|
+
if (line.trim() === '') {
|
|
11126
|
+
if (currentHeader) {
|
|
11127
|
+
headers[currentHeader.toLowerCase()] = currentValue.trim();
|
|
11128
|
+
}
|
|
11129
|
+
break;
|
|
11130
|
+
}
|
|
11131
|
+
// Check if line is a new header (starts without whitespace and contains ':')
|
|
11132
|
+
if (line.match(/^[\w-]+:/) && !line.startsWith(' ') && !line.startsWith('\t')) {
|
|
11133
|
+
// Save previous header if exists
|
|
11134
|
+
if (currentHeader) {
|
|
11135
|
+
headers[currentHeader.toLowerCase()] = currentValue.trim();
|
|
11136
|
+
}
|
|
11137
|
+
// Parse new header
|
|
11138
|
+
const colonIndex = line.indexOf(':');
|
|
11139
|
+
currentHeader = line.substring(0, colonIndex).trim();
|
|
11140
|
+
currentValue = line.substring(colonIndex + 1).trim();
|
|
11141
|
+
}
|
|
11142
|
+
else if (currentHeader && (line.startsWith(' ') || line.startsWith('\t'))) {
|
|
11143
|
+
// Continuation of previous header (folded header)
|
|
11144
|
+
currentValue += ' ' + line.trim();
|
|
11145
|
+
}
|
|
11146
|
+
}
|
|
11147
|
+
return headers;
|
|
11148
|
+
}
|
|
11149
|
+
/**
|
|
11150
|
+
* Parses the email body from EML content
|
|
11151
|
+
* @param lines - Lines of the EML file
|
|
11152
|
+
* @returns Object containing body content and format information
|
|
11153
|
+
*/
|
|
11154
|
+
parseBody(lines) {
|
|
11155
|
+
let inBody = false;
|
|
11156
|
+
let bodyLines = [];
|
|
11157
|
+
let contentType = 'text/plain';
|
|
11158
|
+
let boundary = '';
|
|
11159
|
+
let isBase64 = false;
|
|
11160
|
+
let isQuotedPrintable = false;
|
|
11161
|
+
// Find Content-Type and boundary
|
|
11162
|
+
for (let i = 0; i < lines.length; i++) {
|
|
11163
|
+
const line = lines[i];
|
|
11164
|
+
if (line.toLowerCase().startsWith('content-type:')) {
|
|
11165
|
+
contentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';
|
|
11166
|
+
// Check for multipart boundary
|
|
11167
|
+
const boundaryMatch = line.match(/boundary="?([^";\s]+)"?/i);
|
|
11168
|
+
if (boundaryMatch) {
|
|
11169
|
+
boundary = boundaryMatch[1];
|
|
11170
|
+
}
|
|
11171
|
+
}
|
|
11172
|
+
if (line.toLowerCase().startsWith('content-transfer-encoding:')) {
|
|
11173
|
+
isBase64 = line.toLowerCase().includes('base64');
|
|
11174
|
+
isQuotedPrintable = line.toLowerCase().includes('quoted-printable');
|
|
11175
|
+
}
|
|
11176
|
+
// Empty line marks start of body
|
|
11177
|
+
if (line.trim() === '' && !inBody) {
|
|
11178
|
+
inBody = true;
|
|
11179
|
+
continue;
|
|
11180
|
+
}
|
|
11181
|
+
if (inBody) {
|
|
11182
|
+
bodyLines.push(line);
|
|
11183
|
+
}
|
|
11184
|
+
}
|
|
11185
|
+
// If multipart, extract the relevant part
|
|
11186
|
+
if (boundary) {
|
|
11187
|
+
bodyLines = this.extractMultipartBody(bodyLines.join('\n'), boundary, contentType);
|
|
11188
|
+
}
|
|
11189
|
+
let bodyContent = bodyLines.join('\n').trim();
|
|
11190
|
+
// Decode body if necessary
|
|
11191
|
+
if (isBase64) {
|
|
11192
|
+
try {
|
|
11193
|
+
bodyContent = atob(bodyContent.replace(/\s/g, ''));
|
|
11194
|
+
}
|
|
11195
|
+
catch (e) {
|
|
11196
|
+
console.warn('Failed to decode base64 content');
|
|
11197
|
+
}
|
|
11198
|
+
}
|
|
11199
|
+
else if (isQuotedPrintable) {
|
|
11200
|
+
bodyContent = this.decodeQuotedPrintable(bodyContent);
|
|
11201
|
+
}
|
|
11202
|
+
// Clean up HTML if present
|
|
11203
|
+
if (contentType === 'text/html') {
|
|
11204
|
+
bodyContent = this.sanitizeHtmlContent(bodyContent);
|
|
11205
|
+
}
|
|
11206
|
+
return {
|
|
11207
|
+
content: bodyContent || 'No content available',
|
|
11208
|
+
isHtml: contentType === 'text/html'
|
|
11209
|
+
};
|
|
11210
|
+
}
|
|
11211
|
+
/**
|
|
11212
|
+
* Extracts body from multipart email
|
|
11213
|
+
* @param content - Email content
|
|
11214
|
+
* @param boundary - Multipart boundary string
|
|
11215
|
+
* @param preferredType - Preferred content type
|
|
11216
|
+
* @returns Array of body lines
|
|
11217
|
+
*/
|
|
11218
|
+
extractMultipartBody(content, boundary, preferredType) {
|
|
11219
|
+
const parts = content.split('--' + boundary);
|
|
11220
|
+
for (const part of parts) {
|
|
11221
|
+
const lines = part.split(/\r?\n/);
|
|
11222
|
+
let partContentType = 'text/plain';
|
|
11223
|
+
let isBase64 = false;
|
|
11224
|
+
let isQuotedPrintable = false;
|
|
11225
|
+
let inPartBody = false;
|
|
11226
|
+
const partBodyLines = [];
|
|
11227
|
+
for (let i = 0; i < lines.length; i++) {
|
|
11228
|
+
const line = lines[i];
|
|
11229
|
+
if (line.toLowerCase().startsWith('content-type:')) {
|
|
11230
|
+
partContentType = line.toLowerCase().includes('text/html') ? 'text/html' : 'text/plain';
|
|
11231
|
+
}
|
|
11232
|
+
if (line.toLowerCase().startsWith('content-transfer-encoding:')) {
|
|
11233
|
+
isBase64 = line.toLowerCase().includes('base64');
|
|
11234
|
+
isQuotedPrintable = line.toLowerCase().includes('quoted-printable');
|
|
11235
|
+
}
|
|
11236
|
+
if (line.trim() === '' && !inPartBody) {
|
|
11237
|
+
inPartBody = true;
|
|
11238
|
+
continue;
|
|
11239
|
+
}
|
|
11240
|
+
if (inPartBody) {
|
|
11241
|
+
partBodyLines.push(line);
|
|
11242
|
+
}
|
|
11243
|
+
}
|
|
11244
|
+
// If this part matches our preferred content type, use it
|
|
11245
|
+
if (partContentType === preferredType && partBodyLines.length > 0) {
|
|
11246
|
+
let bodyContent = partBodyLines.join('\n');
|
|
11247
|
+
if (isBase64) {
|
|
11248
|
+
try {
|
|
11249
|
+
bodyContent = atob(bodyContent.replace(/\s/g, ''));
|
|
11250
|
+
}
|
|
11251
|
+
catch (e) {
|
|
11252
|
+
console.warn('Failed to decode base64 part');
|
|
11253
|
+
}
|
|
11254
|
+
}
|
|
11255
|
+
else if (isQuotedPrintable) {
|
|
11256
|
+
bodyContent = this.decodeQuotedPrintable(bodyContent);
|
|
11257
|
+
}
|
|
11258
|
+
return [bodyContent];
|
|
11259
|
+
}
|
|
11260
|
+
}
|
|
11261
|
+
// Fallback: return first non-empty part
|
|
11262
|
+
for (const part of parts) {
|
|
11263
|
+
const lines = part.split(/\r?\n/);
|
|
11264
|
+
const bodyLines = lines.filter(line => line.trim() !== '').slice(3); // Skip headers
|
|
11265
|
+
if (bodyLines.length > 0) {
|
|
11266
|
+
return bodyLines;
|
|
11267
|
+
}
|
|
11268
|
+
}
|
|
11269
|
+
return [];
|
|
11270
|
+
}
|
|
11271
|
+
/**
|
|
11272
|
+
* Decodes quoted-printable encoded content
|
|
11273
|
+
* @param content - Quoted-printable encoded string
|
|
11274
|
+
* @returns Decoded string
|
|
11275
|
+
*/
|
|
11276
|
+
decodeQuotedPrintable(content) {
|
|
11277
|
+
return content
|
|
11278
|
+
.replace(/=\r?\n/g, '') // Remove soft line breaks
|
|
11279
|
+
.replace(/=([0-9A-F]{2})/gi, (match, hex) => {
|
|
11280
|
+
return String.fromCharCode(parseInt(hex, 16));
|
|
11281
|
+
});
|
|
11282
|
+
}
|
|
11283
|
+
/**
|
|
11284
|
+
* Sanitizes HTML content for safe display
|
|
11285
|
+
* @param html - Raw HTML content
|
|
11286
|
+
* @returns Sanitized HTML
|
|
11287
|
+
*/
|
|
11288
|
+
sanitizeHtmlContent(html) {
|
|
11289
|
+
// Basic sanitization - remove script tags and dangerous attributes
|
|
11290
|
+
let sanitized = html
|
|
11291
|
+
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
|
|
11292
|
+
.replace(/on\w+\s*=\s*["'][^"']*["']/gi, '')
|
|
11293
|
+
.replace(/javascript:/gi, '');
|
|
11294
|
+
return sanitized;
|
|
11295
|
+
}
|
|
11296
|
+
/**
|
|
11297
|
+
* Parses attachment information from EML content
|
|
11298
|
+
* @param emlContent - Raw EML content
|
|
11299
|
+
* @returns Array of attachment information
|
|
11300
|
+
*/
|
|
11301
|
+
parseAttachments(emlContent) {
|
|
11302
|
+
const attachments = [];
|
|
11303
|
+
const attachmentRegex = /Content-Disposition:\s*attachment[^;]*;\s*filename="?([^"\r\n]+)"?/gi;
|
|
11304
|
+
let match;
|
|
11305
|
+
while ((match = attachmentRegex.exec(emlContent)) !== null) {
|
|
11306
|
+
attachments.push({
|
|
11307
|
+
filename: match[1],
|
|
11308
|
+
contentType: 'application/octet-stream',
|
|
11309
|
+
size: 0
|
|
11310
|
+
});
|
|
11311
|
+
}
|
|
11312
|
+
return attachments;
|
|
11313
|
+
}
|
|
11314
|
+
/**
|
|
11315
|
+
* Cleans and formats email addresses
|
|
11316
|
+
* @param email - Raw email address string
|
|
11317
|
+
* @returns Cleaned email address
|
|
11318
|
+
*/
|
|
11319
|
+
cleanEmailAddress(email) {
|
|
11320
|
+
// Remove quotes and extra whitespace
|
|
11321
|
+
let cleaned = email.replace(/['"]/g, '').trim();
|
|
11322
|
+
// Extract email from format: "Name <email@example.com>"
|
|
11323
|
+
const emailMatch = cleaned.match(/<([^>]+)>/);
|
|
11324
|
+
if (emailMatch) {
|
|
11325
|
+
const name = cleaned.substring(0, cleaned.indexOf('<')).trim();
|
|
11326
|
+
const address = emailMatch[1];
|
|
11327
|
+
return name ? `${name} <${address}>` : address;
|
|
11328
|
+
}
|
|
11329
|
+
return cleaned;
|
|
11330
|
+
}
|
|
11331
|
+
/**
|
|
11332
|
+
* Decodes encoded email headers (RFC 2047)
|
|
11333
|
+
* @param header - Encoded header string
|
|
11334
|
+
* @returns Decoded header string
|
|
11335
|
+
*/
|
|
11336
|
+
decodeHeader(header) {
|
|
11337
|
+
// Decode RFC 2047 encoded words (=?charset?encoding?text?=)
|
|
11338
|
+
return header.replace(/=\?([^?]+)\?([BQ])\?([^?]+)\?=/gi, (match, charset, encoding, text) => {
|
|
11339
|
+
try {
|
|
11340
|
+
if (encoding.toUpperCase() === 'B') {
|
|
11341
|
+
// Base64 encoding
|
|
11342
|
+
return atob(text);
|
|
11343
|
+
}
|
|
11344
|
+
else if (encoding.toUpperCase() === 'Q') {
|
|
11345
|
+
// Quoted-printable encoding
|
|
11346
|
+
return this.decodeQuotedPrintable(text.replace(/_/g, ' '));
|
|
11347
|
+
}
|
|
11348
|
+
}
|
|
11349
|
+
catch (e) {
|
|
11350
|
+
console.warn('Failed to decode header:', match);
|
|
11351
|
+
}
|
|
11352
|
+
return match;
|
|
11353
|
+
});
|
|
11354
|
+
}
|
|
11355
|
+
/**
|
|
11356
|
+
* Formats email date to readable format
|
|
11357
|
+
* @param dateStr - Raw date string from email
|
|
11358
|
+
* @returns Formatted date string
|
|
11359
|
+
*/
|
|
11360
|
+
formatDate(dateStr) {
|
|
11361
|
+
try {
|
|
11362
|
+
const date = new Date(dateStr);
|
|
11363
|
+
if (isNaN(date.getTime())) {
|
|
11364
|
+
return dateStr || 'Unknown date';
|
|
11365
|
+
}
|
|
11366
|
+
return date.toLocaleString('en-GB', {
|
|
11367
|
+
day: '2-digit',
|
|
11368
|
+
month: 'short',
|
|
11369
|
+
year: 'numeric',
|
|
11370
|
+
hour: '2-digit',
|
|
11371
|
+
minute: '2-digit'
|
|
11372
|
+
});
|
|
11373
|
+
}
|
|
11374
|
+
catch (e) {
|
|
11375
|
+
return dateStr || 'Unknown date';
|
|
11376
|
+
}
|
|
11377
|
+
}
|
|
11378
|
+
/**
|
|
11379
|
+
* Sanitizes HTML for Angular display
|
|
11380
|
+
* @param html - HTML string
|
|
11381
|
+
* @returns SafeHtml for Angular templates
|
|
11382
|
+
*/
|
|
11383
|
+
getSafeHtml(html) {
|
|
11384
|
+
return this.sanitizer.sanitize(1, html) || '';
|
|
11385
|
+
}
|
|
11386
|
+
/**
|
|
11387
|
+
* Downloads and parses an EML file from a URL
|
|
11388
|
+
* @param documentUrl - URL of the EML file
|
|
11389
|
+
* @returns Observable of parsed email data
|
|
11390
|
+
*/
|
|
11391
|
+
loadAndParseEmail(documentUrl) {
|
|
11392
|
+
console.log('EmlParserService: Loading email from URL:', documentUrl);
|
|
11393
|
+
return this.downloadEmailFile(documentUrl).pipe(map((emlContent) => {
|
|
11394
|
+
console.log('EmlParserService: Email downloaded, size:', emlContent?.length || 0, 'bytes');
|
|
11395
|
+
if (!emlContent || emlContent.trim().length === 0) {
|
|
11396
|
+
throw new Error('Email file is empty or could not be loaded');
|
|
11397
|
+
}
|
|
11398
|
+
const parsedData = this.parseEmlData(emlContent);
|
|
11399
|
+
if (!parsedData) {
|
|
11400
|
+
throw new Error('Failed to parse email data');
|
|
11401
|
+
}
|
|
11402
|
+
console.log('EmlParserService: Email parsed successfully:', parsedData);
|
|
11403
|
+
return parsedData;
|
|
11404
|
+
}), catchError$1((error) => {
|
|
11405
|
+
console.error('EmlParserService: Error loading/parsing email:', error);
|
|
11406
|
+
return throwError(() => new Error(error.message || 'Failed to load or parse email file'));
|
|
11407
|
+
}));
|
|
11408
|
+
}
|
|
11409
|
+
/**
|
|
11410
|
+
* Downloads an email file with appropriate authentication handling
|
|
11411
|
+
* @param documentUrl - URL of the email file
|
|
11412
|
+
* @returns Observable of file content as text
|
|
11413
|
+
*/
|
|
11414
|
+
downloadEmailFile(documentUrl) {
|
|
11415
|
+
// Check if it's Azure Blob Storage URL
|
|
11416
|
+
const isAzureBlobStorage = documentUrl.includes('.blob.core.windows.net');
|
|
11417
|
+
if (isAzureBlobStorage) {
|
|
11418
|
+
// For Azure Blob Storage, don't send Authorization header
|
|
11419
|
+
// The URL should contain a SAS token or the blob should be publicly accessible
|
|
11420
|
+
return this.http.get(documentUrl, {
|
|
11421
|
+
responseType: 'text'
|
|
11422
|
+
}).pipe(catchError$1((error) => {
|
|
11423
|
+
console.error('Error downloading email from blob storage:', error);
|
|
11424
|
+
return throwError(() => new Error('Failed to download email file. Please check if the file URL is valid and accessible.'));
|
|
11425
|
+
}));
|
|
11426
|
+
}
|
|
11427
|
+
else {
|
|
11428
|
+
// For other storage types, use Bearer token authentication
|
|
11429
|
+
const Authorization = `Bearer d8764575-d713-4e31-aeb0-29ea31057461`;
|
|
11430
|
+
return this.http.get(documentUrl, {
|
|
11431
|
+
headers: new HttpHeaders({
|
|
11432
|
+
'Authorization': Authorization
|
|
11433
|
+
}),
|
|
11434
|
+
responseType: 'text'
|
|
11435
|
+
}).pipe(catchError$1((error) => {
|
|
11436
|
+
console.error('Error downloading email file:', error);
|
|
11437
|
+
return throwError(() => new Error('Failed to download email file. Please check authentication.'));
|
|
11438
|
+
}));
|
|
11439
|
+
}
|
|
11440
|
+
}
|
|
11441
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmlParserService, deps: [{ token: i5$1.DomSanitizer }, { token: i2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
11442
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmlParserService, providedIn: 'root' });
|
|
11443
|
+
}
|
|
11444
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmlParserService, decorators: [{
|
|
11445
|
+
type: Injectable,
|
|
11446
|
+
args: [{
|
|
11447
|
+
providedIn: 'root'
|
|
11448
|
+
}]
|
|
11449
|
+
}], ctorParameters: () => [{ type: i5$1.DomSanitizer }, { type: i2.HttpClient }] });
|
|
11450
|
+
|
|
11499
11451
|
/*
|
|
11500
11452
|
* Public API Surface of cat-document-lib
|
|
11501
11453
|
*/
|