@colijnit/corecomponents_v12 258.1.5 → 258.1.7

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.
@@ -0,0 +1,125 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as XLSX from 'xlsx';
3
+ import * as i0 from "@angular/core";
4
+ export class ExcelExportService {
5
+ /**
6
+ * Export data to Excel file
7
+ * @param data - Array of objects to export
8
+ * @param columns - Column configuration (optional)
9
+ * @param fileName - Name of the exported file
10
+ * @param sheetName - Name of the Excel sheet
11
+ */
12
+ exportToExcel(data, columns, fileName = 'export', sheetName = 'Sheet1') {
13
+ // If columns are specified, transform data to match column structure
14
+ let exportData = data;
15
+ if (columns && columns.length > 0) {
16
+ exportData = data.map(item => {
17
+ const newItem = {};
18
+ columns.forEach(col => {
19
+ newItem[col.header] = this.getNestedValue(item, col.key);
20
+ });
21
+ return newItem;
22
+ });
23
+ }
24
+ // Create workbook and worksheet
25
+ const wb = XLSX.utils.book_new();
26
+ const ws = XLSX.utils.json_to_sheet(exportData);
27
+ // Set column widths if specified
28
+ if (columns && columns.some(col => col.width)) {
29
+ const colWidths = columns.map(col => ({ wch: col.width || 20 }));
30
+ ws['!cols'] = colWidths;
31
+ }
32
+ // Add worksheet to workbook
33
+ XLSX.utils.book_append_sheet(wb, ws, sheetName);
34
+ // Save file
35
+ XLSX.writeFile(wb, `${fileName}.xlsx`);
36
+ }
37
+ /**
38
+ * Export multiple sheets to one Excel file
39
+ * @param sheets - Array of sheet data
40
+ * @param fileName - Name of the exported file
41
+ */
42
+ exportMultipleSheets(sheets, fileName = 'multi-sheet-export') {
43
+ const wb = XLSX.utils.book_new();
44
+ sheets.forEach(sheet => {
45
+ let exportData = sheet.data;
46
+ if (sheet.columns && sheet.columns.length > 0) {
47
+ exportData = sheet.data.map(item => {
48
+ const newItem = {};
49
+ sheet.columns.forEach(col => {
50
+ newItem[col.header] = this.getNestedValue(item, col.key);
51
+ });
52
+ return newItem;
53
+ });
54
+ }
55
+ const ws = XLSX.utils.json_to_sheet(exportData);
56
+ if (sheet.columns && sheet.columns.some(col => col.width)) {
57
+ const colWidths = sheet.columns.map(col => ({ wch: col.width || 20 }));
58
+ ws['!cols'] = colWidths;
59
+ }
60
+ XLSX.utils.book_append_sheet(wb, ws, sheet.sheetName);
61
+ });
62
+ XLSX.writeFile(wb, `${fileName}.xlsx`);
63
+ }
64
+ /**
65
+ * Export HTML table to Excel
66
+ * @param tableId - ID of the HTML table element
67
+ * @param fileName - Name of the exported file
68
+ * @param sheetName - Name of the Excel sheet
69
+ */
70
+ exportTableToExcel(tableId, fileName = 'table-export', sheetName = 'Sheet1') {
71
+ const table = document.getElementById(tableId);
72
+ if (!table) {
73
+ console.error(`Table with ID '${tableId}' not found`);
74
+ return;
75
+ }
76
+ const wb = XLSX.utils.book_new();
77
+ const ws = XLSX.utils.table_to_sheet(table);
78
+ XLSX.utils.book_append_sheet(wb, ws, sheetName);
79
+ XLSX.writeFile(wb, `${fileName}.xlsx`);
80
+ }
81
+ /**
82
+ * Get nested object value using dot notation
83
+ * @param obj - Object to search in
84
+ * @param path - Dot notation path (e.g., 'user.address.city')
85
+ */
86
+ getNestedValue(obj, path) {
87
+ return path.split('.').reduce((current, key) => {
88
+ return current && current[key] !== undefined ? current[key] : '';
89
+ }, obj);
90
+ }
91
+ /**
92
+ * Format date for Excel export
93
+ * @param date - Date to format
94
+ * @param format - Format string (default: 'MM/DD/YYYY')
95
+ */
96
+ formatDateForExport(date, format = 'MM/DD/YYYY') {
97
+ if (!date) {
98
+ return '';
99
+ }
100
+ const d = new Date(date);
101
+ if (isNaN(d.getTime())) {
102
+ return '';
103
+ }
104
+ const month = (d.getMonth() + 1).toString().padStart(2, '0');
105
+ const day = d.getDate().toString().padStart(2, '0');
106
+ const year = d.getFullYear();
107
+ switch (format) {
108
+ case 'MM/DD/YYYY':
109
+ return `${month}/${day}/${year}`;
110
+ case 'DD/MM/YYYY':
111
+ return `${day}/${month}/${year}`;
112
+ case 'YYYY-MM-DD':
113
+ return `${year}-${month}-${day}`;
114
+ default:
115
+ return d.toLocaleDateString();
116
+ }
117
+ }
118
+ }
119
+ ExcelExportService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ExcelExportService_Factory() { return new ExcelExportService(); }, token: ExcelExportService, providedIn: "root" });
120
+ ExcelExportService.decorators = [
121
+ { type: Injectable, args: [{
122
+ providedIn: 'root'
123
+ },] }
124
+ ];
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZWwtZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2UvZXhjZWwtZXhwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQzs7QUFXN0IsTUFBTSxPQUFPLGtCQUFrQjtJQUU3Qjs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQ1gsSUFBVyxFQUNYLE9BQXdCLEVBQ3hCLFdBQW1CLFFBQVEsRUFDM0IsWUFBb0IsUUFBUTtRQUc1QixxRUFBcUU7UUFDckUsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQixNQUFNLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsZ0NBQWdDO1FBQ2hDLE1BQU0sRUFBRSxHQUFrQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hELE1BQU0sRUFBRSxHQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVoRSxpQ0FBaUM7UUFDakMs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QUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFN0IsUUFBUSxNQUFNLEVBQUU7WUFDZCxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxHQUFHLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkMsS0FBSyxZQUFZO2dCQUNmLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ25DLEtBQUssWUFBWTtnQkFDZixPQUFPLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNuQztnQkFDRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7OztZQXpKRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBYTFNYIGZyb20gJ3hsc3gnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRDb2x1bW4ge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGhlYWRlcjogc3RyaW5nO1xyXG4gIHdpZHRoPzogbnVtYmVyO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFeGNlbEV4cG9ydFNlcnZpY2Uge1xyXG5cclxuICAvKipcclxuICAgKiBFeHBvcnQgZGF0YSB0byBFeGNlbCBmaWxlXHJcbiAgICogQHBhcmFtIGRhdGEgLSBBcnJheSBvZiBvYmplY3RzIHRvIGV4cG9ydFxyXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gQ29sdW1uIGNvbmZpZ3VyYXRpb24gKG9wdGlvbmFsKVxyXG4gICAqIEBwYXJhbSBmaWxlTmFtZSAtIE5hbWUgb2YgdGhlIGV4cG9ydGVkIGZpbGVcclxuICAgKiBAcGFyYW0gc2hlZXROYW1lIC0gTmFtZSBvZiB0aGUgRXhjZWwgc2hlZXRcclxuICAgKi9cclxuICBleHBvcnRUb0V4Y2VsKFxyXG4gICAgZGF0YTogYW55W10sXHJcbiAgICBjb2x1bW5zPzogRXhwb3J0Q29sdW1uW10sXHJcbiAgICBmaWxlTmFtZTogc3RyaW5nID0gJ2V4cG9ydCcsXHJcbiAgICBzaGVldE5hbWU6IHN0cmluZyA9ICdTaGVldDEnXHJcbiAgKTogdm9pZCB7XHJcblxyXG4gICAgLy8gSWYgY29sdW1ucyBhcmUgc3BlY2lmaWVkLCB0cmFuc2Zvcm0gZGF0YSB0byBtYXRjaCBjb2x1bW4gc3RydWN0dXJlXHJcbiAgICBsZXQgZXhwb3J0RGF0YSA9IGRhdGE7XHJcbiAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZXhwb3J0RGF0YSA9IGRhdGEubWFwKGl0ZW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld0l0ZW06IGFueSA9IHt9O1xyXG4gICAgICAgIGNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgbmV3SXRlbVtjb2wuaGVhZGVyXSA9IHRoaXMuZ2V0TmVzdGVkVmFsdWUoaXRlbSwgY29sLmtleSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSB3b3JrYm9vayBhbmQgd29ya3NoZWV0XHJcbiAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuICAgIGNvbnN0IHdzOiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChleHBvcnREYXRhKTtcclxuXHJcbiAgICAvLyBTZXQgY29sdW1uIHdpZHRocyBpZiBzcGVjaWZpZWRcclxuICAgIGlmIChjb2x1bW5zICYmIGNvbHVtbnMuc29tZShjb2wgPT4gY29sLndpZHRoKSkge1xyXG4gICAgICBjb25zdCBjb2xXaWR0aHMgPSBjb2x1bW5zLm1hcChjb2wgPT4gKHt3Y2g6IGNvbC53aWR0aCB8fCAyMH0pKTtcclxuICAgICAgd3NbJyFjb2xzJ10gPSBjb2xXaWR0aHM7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIHdvcmtzaGVldCB0byB3b3JrYm9va1xyXG4gICAgWExTWC51dGlscy5ib29rX2FwcGVuZF9zaGVldCh3Yiwgd3MsIHNoZWV0TmFtZSk7XHJcblxyXG4gICAgLy8gU2F2ZSBmaWxlXHJcbiAgICBYTFNYLndyaXRlRmlsZSh3YiwgYCR7ZmlsZU5hbWV9Lnhsc3hgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEV4cG9ydCBtdWx0aXBsZSBzaGVldHMgdG8gb25lIEV4Y2VsIGZpbGVcclxuICAgKiBAcGFyYW0gc2hlZXRzIC0gQXJyYXkgb2Ygc2hlZXQgZGF0YVxyXG4gICAqIEBwYXJhbSBmaWxlTmFtZSAtIE5hbWUgb2YgdGhlIGV4cG9ydGVkIGZpbGVcclxuICAgKi9cclxuICBleHBvcnRNdWx0aXBsZVNoZWV0cyhcclxuICAgIHNoZWV0czogQXJyYXk8e1xyXG4gICAgICBkYXRhOiBhbnlbXTtcclxuICAgICAgY29sdW1ucz86IEV4cG9ydENvbHVtbltdO1xyXG4gICAgICBzaGVldE5hbWU6IHN0cmluZztcclxuICAgIH0+LFxyXG4gICAgZmlsZU5hbWU6IHN0cmluZyA9ICdtdWx0aS1zaGVldC1leHBvcnQnXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuXHJcbiAgICBzaGVldHMuZm9yRWFjaChzaGVldCA9PiB7XHJcbiAgICAgIGxldCBleHBvcnREYXRhID0gc2hlZXQuZGF0YTtcclxuXHJcbiAgICAgIGlmIChzaGVldC5jb2x1bW5zICYmIHNoZWV0LmNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGV4cG9ydERhdGEgPSBzaGVldC5kYXRhLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgIGNvbnN0IG5ld0l0ZW06IGFueSA9IHt9O1xyXG4gICAgICAgICAgc2hlZXQuY29sdW1ucyEuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBuZXdJdGVtW2NvbC5oZWFkZXJdID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShpdGVtLCBjb2wua2V5KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHdzOiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldChleHBvcnREYXRhKTtcclxuXHJcbiAgICAgIGlmIChzaGVldC5jb2x1bW5zICYmIHNoZWV0LmNvbHVtbnMuc29tZShjb2wgPT4gY29sLndpZHRoKSkge1xyXG4gICAgICAgIGNvbnN0IGNvbFdpZHRocyA9IHNoZWV0LmNvbHVtbnMubWFwKGNvbCA9PiAoe3djaDogY29sLndpZHRoIHx8IDIwfSkpO1xyXG4gICAgICAgIHdzWychY29scyddID0gY29sV2lkdGhzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBYTFNYLnV0aWxzLmJvb2tfYXBwZW5kX3NoZWV0KHdiLCB3cywgc2hlZXQuc2hlZXROYW1lKTtcclxuICAgIH0pO1xyXG5cclxuICAgIFhMU1gud3JpdGVGaWxlKHdiLCBgJHtmaWxlTmFtZX0ueGxzeGApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXhwb3J0IEhUTUwgdGFibGUgdG8gRXhjZWxcclxuICAgKiBAcGFyYW0gdGFibGVJZCAtIElEIG9mIHRoZSBIVE1MIHRhYmxlIGVsZW1lbnRcclxuICAgKiBAcGFyYW0gZmlsZU5hbWUgLSBOYW1lIG9mIHRoZSBleHBvcnRlZCBmaWxlXHJcbiAgICogQHBhcmFtIHNoZWV0TmFtZSAtIE5hbWUgb2YgdGhlIEV4Y2VsIHNoZWV0XHJcbiAgICovXHJcbiAgZXhwb3J0VGFibGVUb0V4Y2VsKFxyXG4gICAgdGFibGVJZDogc3RyaW5nLFxyXG4gICAgZmlsZU5hbWU6IHN0cmluZyA9ICd0YWJsZS1leHBvcnQnLFxyXG4gICAgc2hlZXROYW1lOiBzdHJpbmcgPSAnU2hlZXQxJ1xyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0YWJsZUlkKTtcclxuICAgIGlmICghdGFibGUpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgVGFibGUgd2l0aCBJRCAnJHt0YWJsZUlkfScgbm90IGZvdW5kYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB3YjogWExTWC5Xb3JrQm9vayA9IFhMU1gudXRpbHMuYm9va19uZXcoKTtcclxuICAgIGNvbnN0IHdzOiBYTFNYLldvcmtTaGVldCA9IFhMU1gudXRpbHMudGFibGVfdG9fc2hlZXQodGFibGUpO1xyXG5cclxuICAgIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQod2IsIHdzLCBzaGVldE5hbWUpO1xyXG4gICAgWExTWC53cml0ZUZpbGUod2IsIGAke2ZpbGVOYW1lfS54bHN4YCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgbmVzdGVkIG9iamVjdCB2YWx1ZSB1c2luZyBkb3Qgbm90YXRpb25cclxuICAgKiBAcGFyYW0gb2JqIC0gT2JqZWN0IHRvIHNlYXJjaCBpblxyXG4gICAqIEBwYXJhbSBwYXRoIC0gRG90IG5vdGF0aW9uIHBhdGggKGUuZy4sICd1c2VyLmFkZHJlc3MuY2l0eScpXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChjdXJyZW50LCBrZXkpID0+IHtcclxuICAgICAgcmV0dXJuIGN1cnJlbnQgJiYgY3VycmVudFtrZXldICE9PSB1bmRlZmluZWQgPyBjdXJyZW50W2tleV0gOiAnJztcclxuICAgIH0sIG9iaik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JtYXQgZGF0ZSBmb3IgRXhjZWwgZXhwb3J0XHJcbiAgICogQHBhcmFtIGRhdGUgLSBEYXRlIHRvIGZvcm1hdFxyXG4gICAqIEBwYXJhbSBmb3JtYXQgLSBGb3JtYXQgc3RyaW5nIChkZWZhdWx0OiAnTU0vREQvWVlZWScpXHJcbiAgICovXHJcbiAgZm9ybWF0RGF0ZUZvckV4cG9ydChkYXRlOiBEYXRlIHwgc3RyaW5nLCBmb3JtYXQ6IHN0cmluZyA9ICdNTS9ERC9ZWVlZJyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWRhdGUpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRlKTtcclxuICAgIGlmIChpc05hTihkLmdldFRpbWUoKSkpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1vbnRoID0gKGQuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRheSA9IGQuZ2V0RGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IHllYXIgPSBkLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcclxuICAgICAgY2FzZSAnTU0vREQvWVlZWSc6XHJcbiAgICAgICAgcmV0dXJuIGAke21vbnRofS8ke2RheX0vJHt5ZWFyfWA7XHJcbiAgICAgIGNhc2UgJ0REL01NL1lZWVknOlxyXG4gICAgICAgIHJldHVybiBgJHtkYXl9LyR7bW9udGh9LyR7eWVhcn1gO1xyXG4gICAgICBjYXNlICdZWVlZLU1NLUREJzpcclxuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9YDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZC50b0xvY2FsZURhdGVTdHJpbmcoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19