@refinitiv-ui/efx-grid 6.0.45 → 6.0.47
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/core/dist/core.js +129 -2
- package/lib/core/dist/core.min.js +1 -1
- package/lib/core/es6/data/DataTable.d.ts +2 -0
- package/lib/core/es6/data/DataTable.js +97 -1
- package/lib/core/es6/data/DataView.d.ts +2 -0
- package/lib/core/es6/data/DataView.js +9 -0
- package/lib/core/es6/grid/Core.js +1 -1
- package/lib/core/es6/grid/plugins/SortableTitlePlugin.d.ts +2 -0
- package/lib/core/es6/grid/plugins/SortableTitlePlugin.js +22 -0
- package/lib/grid/index.js +1 -1
- package/lib/tr-grid-printer/es6/CellWriter.d.ts +49 -0
- package/lib/tr-grid-printer/es6/CellWriter.js +226 -0
- package/lib/tr-grid-printer/es6/ColumnWriter.d.ts +12 -0
- package/lib/tr-grid-printer/es6/ColumnWriter.js +21 -0
- package/lib/tr-grid-printer/es6/GridPrinter.d.ts +32 -0
- package/lib/tr-grid-printer/es6/GridPrinter.js +774 -0
- package/lib/tr-grid-printer/es6/PrintTrait.d.ts +38 -0
- package/lib/tr-grid-printer/es6/PrintTrait.js +481 -0
- package/lib/tr-grid-printer/es6/SectionWriter.d.ts +54 -0
- package/lib/tr-grid-printer/es6/SectionWriter.js +213 -0
- package/lib/tr-grid-printer/es6/index.d.ts +1 -0
- package/lib/tr-grid-printer/es6/index.js +1 -0
- package/lib/types/es6/Core/data/DataTable.d.ts +2 -0
- package/lib/types/es6/Core/data/DataView.d.ts +2 -0
- package/lib/types/es6/Core/grid/plugins/SortableTitlePlugin.d.ts +2 -0
- package/lib/types/es6/RowFiltering.d.ts +5 -0
- package/package.json +1 -1
@@ -0,0 +1,774 @@
|
|
1
|
+
import { Dom } from "../../tr-grid-util/es6/Dom.js";
|
2
|
+
import { injectCss, prettifyCss } from "../../tr-grid-util/es6/Util.js";
|
3
|
+
import { Table } from "../../tr-grid-util/es6/Table.js";
|
4
|
+
|
5
|
+
import { PrintTrait } from "./PrintTrait.js";
|
6
|
+
import { SectionWriter } from "./SectionWriter.js";
|
7
|
+
|
8
|
+
|
9
|
+
/** @private
|
10
|
+
* @type {Node}
|
11
|
+
*/
|
12
|
+
var _dummyNode = null;
|
13
|
+
|
14
|
+
|
15
|
+
/** TODO: Move this logic to PrintTrait
|
16
|
+
* @private
|
17
|
+
* @param {Object=} options
|
18
|
+
* @return {!Object}
|
19
|
+
*/
|
20
|
+
var _getPageSize = function (options) {
|
21
|
+
var pageWidth = 0;
|
22
|
+
var pageHeight = 0;
|
23
|
+
|
24
|
+
if (options) {
|
25
|
+
if (options["pageWidth"]) {
|
26
|
+
pageWidth = options["pageWidth"];
|
27
|
+
}
|
28
|
+
if (options["pageHeight"]) {
|
29
|
+
pageHeight = options["pageHeight"];
|
30
|
+
}
|
31
|
+
}
|
32
|
+
if (!pageWidth) {
|
33
|
+
pageWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
|
34
|
+
}
|
35
|
+
if (!pageHeight) {
|
36
|
+
pageHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
|
37
|
+
}
|
38
|
+
|
39
|
+
// TODO: Subtract page margins
|
40
|
+
pageWidth -= 2; // HACK: Prevent chrome from populating table incorrectly
|
41
|
+
pageHeight -= 10; // HACK: Prevent chrome from populating table incorrectly
|
42
|
+
|
43
|
+
return {
|
44
|
+
"pageWidth": pageWidth,
|
45
|
+
"pageHeight": pageHeight
|
46
|
+
};
|
47
|
+
};
|
48
|
+
|
49
|
+
/** @private
|
50
|
+
* @param {Node} nodeA
|
51
|
+
* @param {Node} nodeB
|
52
|
+
*/
|
53
|
+
var swapNode = function (nodeA, nodeB) {
|
54
|
+
if (!nodeA || !nodeB || !nodeA.parentNode || !nodeB.parentNode) {
|
55
|
+
Dom.removeParent(nodeA);
|
56
|
+
Dom.removeParent(nodeB);
|
57
|
+
return;
|
58
|
+
}
|
59
|
+
|
60
|
+
if (!_dummyNode) {
|
61
|
+
_dummyNode = document.createElement("span");
|
62
|
+
}
|
63
|
+
|
64
|
+
nodeA.parentNode.replaceChild(_dummyNode, nodeA);
|
65
|
+
nodeB.parentNode.replaceChild(nodeA, nodeB);
|
66
|
+
_dummyNode.parentNode.replaceChild(nodeB, _dummyNode);
|
67
|
+
};
|
68
|
+
/** @private
|
69
|
+
* @param {Node} fromNode
|
70
|
+
* @param {Node} toNode
|
71
|
+
*/
|
72
|
+
var copyNode = function (fromNode, toNode) {
|
73
|
+
if (fromNode && toNode) {
|
74
|
+
var i, attrs;
|
75
|
+
if (toNode.hasAttributes()) {
|
76
|
+
attrs = toNode.attributes;
|
77
|
+
for (i = attrs.length; --i >= 0;) {
|
78
|
+
toNode.removeAttribute(attrs[i].name);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
if (fromNode.hasAttributes()) {
|
83
|
+
attrs = fromNode.attributes;
|
84
|
+
for (i = attrs.length; --i >= 0;) {
|
85
|
+
toNode.setAttribute(attrs[i].name, attrs[i].value);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
Dom.removeChildren(toNode);
|
90
|
+
|
91
|
+
var chdr = fromNode.childNodes;
|
92
|
+
var childCount = chdr.length;
|
93
|
+
for (i = 0; i < childCount; ++i) {
|
94
|
+
toNode.appendChild(chdr[i].cloneNode(true));
|
95
|
+
}
|
96
|
+
}
|
97
|
+
};
|
98
|
+
|
99
|
+
/** @private
|
100
|
+
* @param {Table|SubTable} tbl
|
101
|
+
* @param {number} colIndex
|
102
|
+
* @param {string} alignment
|
103
|
+
*/
|
104
|
+
var _setColumnAlignment = function (tbl, colIndex, alignment) {
|
105
|
+
if (!alignment || alignment === "default") {
|
106
|
+
return;
|
107
|
+
}
|
108
|
+
var cells = tbl.getCellsInColumn(colIndex);
|
109
|
+
if (!cells) return;
|
110
|
+
for (var i = cells.length; --i >= 0;) {
|
111
|
+
var cell = cells[i];
|
112
|
+
cell.classList.add("tr-align-" + alignment);
|
113
|
+
}
|
114
|
+
};
|
115
|
+
|
116
|
+
/** @private
|
117
|
+
* @param {*} grid grid element, currently supports atlas-blotter, emerald-grid, tr.CompositeGrid, rt.Grid and Core
|
118
|
+
* @return {Object} core grid
|
119
|
+
*/
|
120
|
+
var _getCoreGrid = function (grid) {
|
121
|
+
var core = null;
|
122
|
+
try {
|
123
|
+
if (grid.api) { // emerald-grid or atlas-blotter
|
124
|
+
core = grid.api.getCoreGrid();
|
125
|
+
} else if (grid.getCoreGrid) { // tr.CompositeGrid or rt.Grid
|
126
|
+
core = grid.getCoreGrid();
|
127
|
+
} else if (grid.getPlugin) { // coreGrid
|
128
|
+
core = grid;
|
129
|
+
}
|
130
|
+
// TODO: support react/angular wrapper
|
131
|
+
} catch (err) {
|
132
|
+
console.log("Cannot print the given object");
|
133
|
+
}
|
134
|
+
return core;
|
135
|
+
};
|
136
|
+
|
137
|
+
/** @namespaces
|
138
|
+
*/
|
139
|
+
var GridPrinter = {};
|
140
|
+
/** @private
|
141
|
+
* @type {string}
|
142
|
+
*/
|
143
|
+
GridPrinter._styles = ""; // Static variable
|
144
|
+
/** @type {PrintTrait}
|
145
|
+
* @private
|
146
|
+
*/
|
147
|
+
GridPrinter._printTrait = null;
|
148
|
+
/** @type {Element}
|
149
|
+
* @private
|
150
|
+
*/
|
151
|
+
GridPrinter._blankPage = null;
|
152
|
+
/** @type {tr.Grid}
|
153
|
+
* @private
|
154
|
+
*/
|
155
|
+
GridPrinter._grid = null;
|
156
|
+
/** @type {boolean}
|
157
|
+
* @private
|
158
|
+
*/
|
159
|
+
GridPrinter._isObserving = false;
|
160
|
+
/** @type {!Object}
|
161
|
+
* @private
|
162
|
+
*/
|
163
|
+
GridPrinter._options = {};
|
164
|
+
|
165
|
+
/** @public
|
166
|
+
* @param {GridPrinter.Options} options
|
167
|
+
*/
|
168
|
+
GridPrinter.setPrintOptions = function (options) {
|
169
|
+
if (options) {
|
170
|
+
GridPrinter._options = options;
|
171
|
+
} else {
|
172
|
+
GridPrinter._options = {};
|
173
|
+
}
|
174
|
+
};
|
175
|
+
|
176
|
+
/** @public
|
177
|
+
* @param {HTMLIFrameElement=} iFrameElement If not specified, current window is used instead. Specify null to un-observe existing window object.
|
178
|
+
*/
|
179
|
+
GridPrinter.observe = function (iFrameElement) {
|
180
|
+
var pt = GridPrinter._getPrintTrait();
|
181
|
+
pt.observe(iFrameElement);
|
182
|
+
GridPrinter._isObserving = pt.isObserving();
|
183
|
+
};
|
184
|
+
/** @public
|
185
|
+
*/
|
186
|
+
GridPrinter.unobserve = function () {
|
187
|
+
GridPrinter._getPrintTrait().unobserve();
|
188
|
+
};
|
189
|
+
/** @public
|
190
|
+
* @param {boolean=} bool
|
191
|
+
*/
|
192
|
+
GridPrinter.enableDebugMode = function (bool) {
|
193
|
+
PrintTrait.DEBUG = bool !== false;
|
194
|
+
};
|
195
|
+
|
196
|
+
/** @public
|
197
|
+
* @param {tr.Grid} grid
|
198
|
+
* @param {Object=} options
|
199
|
+
* @return {!Object}
|
200
|
+
*/
|
201
|
+
GridPrinter.getPreFlightInfo = function (grid, options) {
|
202
|
+
var pfInfo = options || {};
|
203
|
+
if (!pfInfo.pageCount) {
|
204
|
+
pfInfo.pageCount = 0;
|
205
|
+
}
|
206
|
+
if (!grid) {
|
207
|
+
return pfInfo;
|
208
|
+
}
|
209
|
+
|
210
|
+
var colCount = grid.getColumnCount();
|
211
|
+
if (!colCount) {
|
212
|
+
return pfInfo;
|
213
|
+
}
|
214
|
+
pfInfo._calculated = false;
|
215
|
+
if (GridPrinter._options["pageWidth"]) {
|
216
|
+
options.pageWidth = GridPrinter._options["pageWidth"];
|
217
|
+
}
|
218
|
+
if (GridPrinter._options["pageHeight"]) {
|
219
|
+
options.pageHeight = GridPrinter._options["pageHeight"];
|
220
|
+
}
|
221
|
+
|
222
|
+
var pageSize = _getPageSize(options);
|
223
|
+
var pageWidth = pfInfo.pageWidth = pageSize.pageWidth;
|
224
|
+
var pageHeight = pfInfo.pageHeight = pageSize.pageHeight;
|
225
|
+
|
226
|
+
// Find primary column that will exist in every page
|
227
|
+
var c;
|
228
|
+
var primaryColIndex = 0;
|
229
|
+
var identifierCol = GridPrinter._options["identifierField"] || GridPrinter._options["primaryColumn"];
|
230
|
+
// if(typeof identifierCol === "string") {
|
231
|
+
// for(c = 0; c < colCount; ++c) {
|
232
|
+
// if() {
|
233
|
+
// }
|
234
|
+
// }
|
235
|
+
// } else
|
236
|
+
if (typeof identifierCol === "number") {
|
237
|
+
primaryColIndex = identifierCol;
|
238
|
+
}
|
239
|
+
|
240
|
+
var primaryCol = pfInfo.primaryColumn = GridPrinter._newColInfo(grid, primaryColIndex);
|
241
|
+
|
242
|
+
// Collect properties from all visible columns
|
243
|
+
// Create a column set that fit the page width
|
244
|
+
// Create multiple column sets for single grid
|
245
|
+
var colSets = []; // Each set will fit a single page
|
246
|
+
var colSet, colInfo;
|
247
|
+
// var defaultMinWidth = 50; // WARNING: Hardcoded value
|
248
|
+
var availSpace = 0;
|
249
|
+
for (c = 0; c < colCount; ++c) {
|
250
|
+
if (c == primaryCol.index) {
|
251
|
+
continue;
|
252
|
+
}
|
253
|
+
|
254
|
+
var colVisible = grid.isColumnVisible(c);
|
255
|
+
if (!colVisible) {
|
256
|
+
continue;
|
257
|
+
}
|
258
|
+
colInfo = GridPrinter._newColInfo(grid, c);
|
259
|
+
|
260
|
+
availSpace -= colInfo.width;
|
261
|
+
if (availSpace <= 0 || !colSets.length) {
|
262
|
+
colSet = {
|
263
|
+
columns: []
|
264
|
+
};
|
265
|
+
colSet.columns.push(primaryCol); // Primary column must exist as the first column on each page
|
266
|
+
availSpace = pageWidth - primaryCol.width;
|
267
|
+
availSpace -= colInfo.width;
|
268
|
+
|
269
|
+
colSets.push(colSet);
|
270
|
+
}
|
271
|
+
colSet.columns.push(colInfo);
|
272
|
+
}
|
273
|
+
|
274
|
+
|
275
|
+
var colSetCount = colSets.length;
|
276
|
+
if (!colSetCount) {
|
277
|
+
colSetCount = 1;
|
278
|
+
colSets.push([primaryCol]);
|
279
|
+
}
|
280
|
+
pfInfo.columnSets = colSets;
|
281
|
+
|
282
|
+
// Resolve scalable columns and width
|
283
|
+
for (var i = 0; i < colSetCount; ++i) {
|
284
|
+
colSet = colSets[i];
|
285
|
+
colCount = colSet.columns.length;
|
286
|
+
var scalableColumns = [];
|
287
|
+
availSpace = pageWidth;
|
288
|
+
for (c = 0; c < colCount; ++c) {
|
289
|
+
colInfo = colSet.columns[c];
|
290
|
+
if (colInfo.scalability) {
|
291
|
+
scalableColumns.push(colInfo);
|
292
|
+
} else {
|
293
|
+
availSpace -= colInfo.width;
|
294
|
+
}
|
295
|
+
}
|
296
|
+
var scalableColCount = scalableColumns.length;
|
297
|
+
if (scalableColCount) {
|
298
|
+
var avgWidth = (availSpace / scalableColCount); // TODO: Take min width into account
|
299
|
+
for (c = 0; c < scalableColCount; ++c) {
|
300
|
+
scalableColumns[c].width = (avgWidth * (c + 1) | 0) - (avgWidth * c | 0);
|
301
|
+
}
|
302
|
+
}
|
303
|
+
|
304
|
+
var totalWidth = 0;
|
305
|
+
var widths = colSet.widths = new Array(colCount);
|
306
|
+
for (c = 0; c < colCount; ++c) {
|
307
|
+
colInfo = colSet.columns[c];
|
308
|
+
widths[c] = colInfo.width;
|
309
|
+
totalWidth += colInfo.width;
|
310
|
+
}
|
311
|
+
colSet.width = totalWidth;
|
312
|
+
}
|
313
|
+
|
314
|
+
// Find total row count per table. Remove all empty rows after the last occupied row.
|
315
|
+
var dv = grid.getDataSource();
|
316
|
+
var totalRowCount = pfInfo.totalRowcount = dv.getVisibleRowCount();
|
317
|
+
|
318
|
+
// Find cutoff point for each page
|
319
|
+
var titleSect = grid.getSection("title");
|
320
|
+
var headerHeight = pfInfo.headerHeight = (titleSect.isVisible()) ? titleSect.getDefaultRowHeight() : 0;
|
321
|
+
var rowHeight = pfInfo.rowHeight = grid.getSection("content").getDefaultRowHeight();
|
322
|
+
var maxRowPerPage = (pageHeight - headerHeight) / rowHeight | 0;
|
323
|
+
if (!(maxRowPerPage > 0)) { // NaN, negative number, or zero is not allowed.
|
324
|
+
maxRowPerPage = 1; // number of content rows
|
325
|
+
}
|
326
|
+
pfInfo.maxRowPerPage = maxRowPerPage;
|
327
|
+
|
328
|
+
var gridCount = pfInfo.gridCount = Math.ceil(totalRowCount / maxRowPerPage); // Number of grid require to render all of the rows. Grid must fit a single page
|
329
|
+
// var lastPageRowCount = totalRowCount - (totalRowCount / maxRowPerPage | 0);
|
330
|
+
pfInfo.pageCount = gridCount * colSetCount;
|
331
|
+
|
332
|
+
|
333
|
+
// TODO: Stack the table horizontally, if there is enough space
|
334
|
+
// if(colSetCount == 1 && pageCount > 1) {
|
335
|
+
// availSpace = pageWidth;
|
336
|
+
// tableWidth = tables[0]._width;
|
337
|
+
// var numGridPerPage = Math.floor(pageWidth / tableWidth);
|
338
|
+
|
339
|
+
// var margin = 4;
|
340
|
+
// var takenSpace = numTablePerPage * tableWidth + (numTablePerPage - 1) * margin;
|
341
|
+
// if(takenSpace > pageWidth) {
|
342
|
+
// numGridPerPage--; // There is not enough space for margin
|
343
|
+
// }
|
344
|
+
// if(numGridPerPage > 1) {
|
345
|
+
|
346
|
+
// }
|
347
|
+
// }
|
348
|
+
|
349
|
+
pfInfo._calculated = true; // Internal flag
|
350
|
+
|
351
|
+
return pfInfo;
|
352
|
+
};
|
353
|
+
|
354
|
+
/** @public
|
355
|
+
* @param {*} grid grid element, currently supports atlas-blotter, emerald-grid, tr.CompositeGrid, rt.Grid and Core
|
356
|
+
* @param {Object=} options
|
357
|
+
* @return {Element}
|
358
|
+
*/
|
359
|
+
GridPrinter.createPrintElement = function (grid, options) {
|
360
|
+
if (!grid) {
|
361
|
+
grid = GridPrinter._grid;
|
362
|
+
} else {
|
363
|
+
grid = _getCoreGrid(grid);
|
364
|
+
}
|
365
|
+
|
366
|
+
if (!grid) {
|
367
|
+
return null;
|
368
|
+
}
|
369
|
+
|
370
|
+
var pfInfo = options || GridPrinter._printInfo;
|
371
|
+
if (!pfInfo || !pfInfo._calculated) {
|
372
|
+
pfInfo = GridPrinter.getPreFlightInfo(grid, pfInfo);
|
373
|
+
}
|
374
|
+
|
375
|
+
// TODO: Check if we need to recalculate everything again
|
376
|
+
var maxRowPerPage = pfInfo.maxRowPerPage;
|
377
|
+
var totalRowCount = pfInfo.totalRowcount;
|
378
|
+
var rowHeight = pfInfo.rowHeight;
|
379
|
+
var headerHeight = pfInfo.headerHeight;
|
380
|
+
var colSets = pfInfo.columnSets;
|
381
|
+
var colSetCount = pfInfo.columnSets.length;
|
382
|
+
var primaryColumn = pfInfo.primaryColumn;
|
383
|
+
var gridCount = pfInfo.gridCount;
|
384
|
+
var contentWriter = new SectionWriter(); // content section
|
385
|
+
var headerWriter = new SectionWriter();
|
386
|
+
|
387
|
+
var gridContentSection = grid.getSectionSettings("content");
|
388
|
+
gridContentSection.snapshot(contentWriter);
|
389
|
+
|
390
|
+
var gridHeaderSection = grid.getSectionSettings("title");
|
391
|
+
if (gridHeaderSection) {
|
392
|
+
gridHeaderSection.snapshot(headerWriter);
|
393
|
+
}
|
394
|
+
|
395
|
+
// Begin element construction
|
396
|
+
var tables = [];
|
397
|
+
for (var t = 0; t < gridCount; ++t) { // For each table
|
398
|
+
var rowStart = t * maxRowPerPage;
|
399
|
+
var rowEnd = rowStart + maxRowPerPage;
|
400
|
+
if (rowEnd > totalRowCount) {
|
401
|
+
rowEnd = totalRowCount;
|
402
|
+
}
|
403
|
+
var rowCount = rowEnd - rowStart;
|
404
|
+
|
405
|
+
for (var s = 0; s < colSetCount; ++s) { // For each column set
|
406
|
+
var colSet = colSets[s];
|
407
|
+
var colCount = colSet.columns.length;
|
408
|
+
var c, col, colIndex;
|
409
|
+
var tbl = new Table(null, {
|
410
|
+
colCount: colCount,
|
411
|
+
rowCount: rowCount,
|
412
|
+
rowHeight: rowHeight
|
413
|
+
});
|
414
|
+
|
415
|
+
tbl.setColumnWidths(colSet.widths);
|
416
|
+
|
417
|
+
if (headerHeight) {
|
418
|
+
tbl.addHeaderRows(); // TODO: support multiple rows
|
419
|
+
var thead = tbl.getHeader();
|
420
|
+
thead.setDefaultRowHeight(headerHeight);
|
421
|
+
|
422
|
+
// Render header columns
|
423
|
+
for (c = 0; c < colCount; ++c) { // Create header and columns
|
424
|
+
col = colSet.columns[c];
|
425
|
+
colIndex = col.index;
|
426
|
+
copyNode(headerWriter.getCellElement(colIndex, 0), thead.getCell(c, 0));
|
427
|
+
_setColumnAlignment(thead, c, col.alignment);
|
428
|
+
}
|
429
|
+
|
430
|
+
// TODO: Span the header rows
|
431
|
+
}
|
432
|
+
|
433
|
+
// Render content section
|
434
|
+
for (c = 0; c < colCount; ++c) { // Populate each cell
|
435
|
+
col = colSet.columns[c];
|
436
|
+
colIndex = col.index;
|
437
|
+
var isPrimary = colIndex === primaryColumn.index;
|
438
|
+
|
439
|
+
for (var r = 0; r < rowCount; ++r) {
|
440
|
+
var rowIndex = rowStart + r;
|
441
|
+
var masterCell = contentWriter.getCellElement(colIndex, rowIndex);
|
442
|
+
var cell = tbl.getCell(c, r);
|
443
|
+
if (isPrimary) {
|
444
|
+
copyNode(masterCell, cell);
|
445
|
+
} else {
|
446
|
+
swapNode(masterCell, cell);
|
447
|
+
}
|
448
|
+
}
|
449
|
+
|
450
|
+
_setColumnAlignment(tbl, c, col.alignment);
|
451
|
+
}
|
452
|
+
|
453
|
+
tbl._tableNum = t;
|
454
|
+
tables.push(tbl);
|
455
|
+
}
|
456
|
+
}
|
457
|
+
|
458
|
+
// Produce the root element to be appended to the page
|
459
|
+
var pageCount = pfInfo.pageCount;
|
460
|
+
var rootElem = document.createElement("div");
|
461
|
+
rootElem.className = "tr-printing-root";
|
462
|
+
rootElem.style.display = "block"; // This will beat any CSS selector
|
463
|
+
for (t = 0; t < pageCount; ++t) {
|
464
|
+
rootElem.appendChild(tables[t].getElement());
|
465
|
+
}
|
466
|
+
// rootElem.appendChild(headerWriter.getElement());
|
467
|
+
// rootElem.appendChild(contentWriter.getElement());
|
468
|
+
|
469
|
+
return rootElem;
|
470
|
+
};
|
471
|
+
|
472
|
+
GridPrinter._applyCss = function () {
|
473
|
+
if (GridPrinter._styles) {
|
474
|
+
return;
|
475
|
+
}
|
476
|
+
GridPrinter._styles = prettifyCss([
|
477
|
+
".tr-printing-mode, .tr-printing-mode body", [
|
478
|
+
"width: 100%;",
|
479
|
+
"height: unset;",
|
480
|
+
"padding: 0;",
|
481
|
+
"margin: 0;",
|
482
|
+
"background-color: white;",
|
483
|
+
"overflow: hidden; /* No scrollbar for printing */"
|
484
|
+
],
|
485
|
+
".tr-printing-mode body > *", [
|
486
|
+
"display: none;"
|
487
|
+
],
|
488
|
+
".tr-printing-root", [
|
489
|
+
"width: 100%;",
|
490
|
+
"background-color: white;"
|
491
|
+
],
|
492
|
+
".tr-printing-root > *", [
|
493
|
+
"page-break-after: always;"
|
494
|
+
],
|
495
|
+
".tr-printing-root table", [
|
496
|
+
"border-collapse: collapse;",
|
497
|
+
"table-layout:fixed; /* To force clipping text */"
|
498
|
+
],
|
499
|
+
".tr-printing-root tr", [
|
500
|
+
"height: 21px;",
|
501
|
+
"color: unset;",
|
502
|
+
"background-color: unset;"
|
503
|
+
],
|
504
|
+
".tr-printing-root td", [
|
505
|
+
"border: 1px solid black;",
|
506
|
+
"padding: 0 5px;",
|
507
|
+
"height: unset;",
|
508
|
+
"font-size: 12px;",
|
509
|
+
"text-overflow: ellipsis;",
|
510
|
+
"white-space: nowrap;",
|
511
|
+
"overflow: hidden;"
|
512
|
+
],
|
513
|
+
".tr-printing-root td, .tr-printing-root tr:hover td, .tr-printing-root tr td:hover", [
|
514
|
+
"color: black;",
|
515
|
+
"background-color: white;"
|
516
|
+
],
|
517
|
+
".tr-printing-root .tr-align-left", [
|
518
|
+
"text-align: left;"
|
519
|
+
],
|
520
|
+
".tr-printing-root .tr-align-right", [
|
521
|
+
"text-align: right;"
|
522
|
+
],
|
523
|
+
".tr-printing-root .tr-align-center", [
|
524
|
+
"text-align: center;"
|
525
|
+
],
|
526
|
+
".tr-printing-root .cell coral-icon", [
|
527
|
+
"margin-top: 3px;"
|
528
|
+
],
|
529
|
+
".tr-printing-root .cell .sort-symbol", [
|
530
|
+
"margin-left: 4px;",
|
531
|
+
"display: inline-block;"
|
532
|
+
],
|
533
|
+
".tr-printing-root .cell .sort-symbol", [
|
534
|
+
"margin-left: 4px;",
|
535
|
+
"display: inline-block;"
|
536
|
+
],
|
537
|
+
// eslint-disable-next-line no-multi-str
|
538
|
+
".tr-printing-root .priority-symbol:last-child,\
|
539
|
+
.tr-printing-root .sortable-indicator:last-child,\
|
540
|
+
.tr-printing-root .sort-symbol:last-child", [
|
541
|
+
"margin-right: 0px;"
|
542
|
+
],
|
543
|
+
".tr-printing-root .sortable-indicator:last-child", [
|
544
|
+
"opacity: 0.5;"
|
545
|
+
],
|
546
|
+
".tr-printing-root .folder .expander", [
|
547
|
+
"margin-right: 7px;",
|
548
|
+
"margin-left: 3px;"
|
549
|
+
],
|
550
|
+
".tr-printing-root .folder .fallback-arrow", [
|
551
|
+
"vertical-align: middle;",
|
552
|
+
"font-size: 7px;",
|
553
|
+
"line-height: 1;",
|
554
|
+
"display: inline-block;", // For transformation
|
555
|
+
"transform: scaleX(1.5);",
|
556
|
+
"font-family: Arial;"
|
557
|
+
],
|
558
|
+
".tr-printing-root .folder.closed .expander", [
|
559
|
+
"transform: translate(0px, 1px) rotate(-90deg);"
|
560
|
+
],
|
561
|
+
".tr-printing-root .folder.closed .expander .fallback-arrow", [
|
562
|
+
"transform: translate(0px, -1px) rotate(-90deg) scaleX(1.5);"
|
563
|
+
],
|
564
|
+
".tr-printing-root .print-inline", [
|
565
|
+
"display:inline-block;"
|
566
|
+
],
|
567
|
+
".tr-printing-root .text", [
|
568
|
+
"vertical-align: middle;",
|
569
|
+
"overflow: hidden;",
|
570
|
+
"text-overflow: ellipsis;"
|
571
|
+
],
|
572
|
+
".tr-printing-root .group-header, .tr-printing-root .ric-arrow", [
|
573
|
+
"color: black !important;"
|
574
|
+
],
|
575
|
+
".tr-printing-root .group-header-box", [
|
576
|
+
"display: inline-block;",
|
577
|
+
"width: 180px;"
|
578
|
+
],
|
579
|
+
".tr-printing-root .group-header-box *", [
|
580
|
+
"display: inline-block;"
|
581
|
+
],
|
582
|
+
".tr-printing-root .tr-percent-bar", [
|
583
|
+
"position:relative;",
|
584
|
+
"text-align: left;",
|
585
|
+
"overflow: hidden;",
|
586
|
+
"white-space: nowrap;"
|
587
|
+
],
|
588
|
+
".tr-printing-root .tr-percent-bar>div", [
|
589
|
+
"position:relative;",
|
590
|
+
"display: inline-block;",
|
591
|
+
"height: 8px;",
|
592
|
+
"vertical-align: middle;"
|
593
|
+
],
|
594
|
+
".tr-printing-root .tr-percent-bar>div>div", [
|
595
|
+
"position:absolute;",
|
596
|
+
"height: 100%;"
|
597
|
+
],
|
598
|
+
".tr-printing-root .tr-percent-bar>span", [
|
599
|
+
"display: inline-block;",
|
600
|
+
"vertical-align: middle;",
|
601
|
+
"box-sizing: border-box;",
|
602
|
+
"padding-left: 4px;",
|
603
|
+
"padding-right: 4px;",
|
604
|
+
"overflow: hidden;",
|
605
|
+
"max-width: 100%;"
|
606
|
+
],
|
607
|
+
".tr-printing-wrapper", [
|
608
|
+
"white-space: nowrap;",
|
609
|
+
"overflow: hidden;"
|
610
|
+
],
|
611
|
+
"/* For safety */",
|
612
|
+
".tr-printing-wrapper > *", [
|
613
|
+
"display: inline-block;",
|
614
|
+
"vertical-align: top;"
|
615
|
+
],
|
616
|
+
".tr-printing-wrapper > * + *", [
|
617
|
+
"margin-left: 4px;"
|
618
|
+
],
|
619
|
+
".tr-blank-page", [
|
620
|
+
"page-break-after: always;",
|
621
|
+
"height: 1px;",
|
622
|
+
"visibility: hidden;"
|
623
|
+
],
|
624
|
+
".tr-printing-flex-row", [
|
625
|
+
"display: flex;",
|
626
|
+
"width: 100%;",
|
627
|
+
"min-width: 0;",
|
628
|
+
"align-items: center;"
|
629
|
+
],
|
630
|
+
".tr-printing-flex-row>*:not(.tr-printing-float-right)", [
|
631
|
+
"flex: 1 1 0;"
|
632
|
+
],
|
633
|
+
"@media screen", [
|
634
|
+
prettifyCss([
|
635
|
+
"/* For debugging */",
|
636
|
+
".tr-printing-mode", [
|
637
|
+
"overflow: auto;",
|
638
|
+
"background-color: lightgrey;"
|
639
|
+
],
|
640
|
+
".tr-printing-root > * + *", [
|
641
|
+
"margin-top: 4px;"
|
642
|
+
]
|
643
|
+
])
|
644
|
+
]
|
645
|
+
]);
|
646
|
+
injectCss(GridPrinter._styles, document.body);
|
647
|
+
};
|
648
|
+
|
649
|
+
/** @public
|
650
|
+
* @param {*} grid grid element, currently supports atlas-blotter, emerald-grid, tr.CompositeGrid, rt.Grid and Core
|
651
|
+
*/
|
652
|
+
GridPrinter.print = function (grid) {
|
653
|
+
var core = null;
|
654
|
+
if (grid) {
|
655
|
+
GridPrinter._applyCss();
|
656
|
+
core = _getCoreGrid(grid);
|
657
|
+
}
|
658
|
+
|
659
|
+
if (core) {
|
660
|
+
GridPrinter._grid = core;
|
661
|
+
|
662
|
+
var pt = GridPrinter._getPrintTrait(); // initialize
|
663
|
+
if (!GridPrinter._isObserving) {
|
664
|
+
pt.observe(); // Observe current window
|
665
|
+
}
|
666
|
+
|
667
|
+
pt.print();
|
668
|
+
} else {
|
669
|
+
GridPrinter._grid = null;
|
670
|
+
}
|
671
|
+
};
|
672
|
+
|
673
|
+
|
674
|
+
/** @private
|
675
|
+
* @return {!PrintTrait}
|
676
|
+
*/
|
677
|
+
GridPrinter._getPrintTrait = function () {
|
678
|
+
var pt = GridPrinter._printTrait;
|
679
|
+
if (!pt) {
|
680
|
+
pt = GridPrinter._printTrait = new PrintTrait();
|
681
|
+
// TODO: this._printTrait.fixPaperSize(); // WORKAROUND: We cannot detect the change in paper size during the browser's preview dialog.
|
682
|
+
|
683
|
+
pt.addEventListener('pageCounting', GridPrinter._onPageCounting);
|
684
|
+
pt.addEventListener('beforeprint', GridPrinter._onBeforePrint);
|
685
|
+
pt.addEventListener('afterprint', GridPrinter._onAfterPrint);
|
686
|
+
}
|
687
|
+
return pt;
|
688
|
+
};
|
689
|
+
/** @private
|
690
|
+
* @param {tr.Grid} grid
|
691
|
+
* @param {number} idx
|
692
|
+
* @return {!Object}
|
693
|
+
*/
|
694
|
+
GridPrinter._newColInfo = function (grid, idx) {
|
695
|
+
var minWidth = grid.getMinimumColumnWidth(idx);
|
696
|
+
if (minWidth <= 0) {
|
697
|
+
minWidth = 50; // WARNING: Hard-coded value
|
698
|
+
}
|
699
|
+
var scalability = grid.getColumnScalability(idx);
|
700
|
+
var width = scalability ? minWidth : grid.getColumnWidth(idx);
|
701
|
+
|
702
|
+
return {
|
703
|
+
"index": idx,
|
704
|
+
"width": width,
|
705
|
+
"data": grid.getColumnData(idx),
|
706
|
+
"scalability": scalability,
|
707
|
+
"minWidth": minWidth,
|
708
|
+
"alignment": grid.getColumnAlignment(idx)
|
709
|
+
};
|
710
|
+
};
|
711
|
+
/** @private
|
712
|
+
*/
|
713
|
+
GridPrinter._removePrintElements = function () {
|
714
|
+
Dom.removeParent(GridPrinter._blankPage);
|
715
|
+
GridPrinter._blankPage = null;
|
716
|
+
|
717
|
+
Dom.removeParent(GridPrinter._printElem);
|
718
|
+
GridPrinter._printElem = null;
|
719
|
+
};
|
720
|
+
|
721
|
+
|
722
|
+
/** @private
|
723
|
+
* @param {Object} e Event argument created from PrintTrait
|
724
|
+
*/
|
725
|
+
GridPrinter._onPageCounting = function (e) {
|
726
|
+
GridPrinter._removePrintElements();
|
727
|
+
|
728
|
+
GridPrinter._printInfo = GridPrinter.getPreFlightInfo(GridPrinter._grid, e);
|
729
|
+
if (GridPrinter._printInfo.pageCount) {
|
730
|
+
// There is no need to render anything at this phase
|
731
|
+
GridPrinter._blankPage = PrintTrait.createBlankPages(GridPrinter._printInfo.pageCount);
|
732
|
+
e.bodyElement.appendChild(GridPrinter._blankPage);
|
733
|
+
}
|
734
|
+
};
|
735
|
+
/** @private
|
736
|
+
* @param {Object} e
|
737
|
+
*/
|
738
|
+
GridPrinter._onBeforePrint = function (e) {
|
739
|
+
GridPrinter._removePrintElements();
|
740
|
+
|
741
|
+
if (GridPrinter._printInfo && GridPrinter._printInfo.pageCount) {
|
742
|
+
GridPrinter._printElem = GridPrinter.createPrintElement(GridPrinter._grid, GridPrinter._printInfo); // TODO: Use new sizes given from PrintTrait
|
743
|
+
|
744
|
+
// var elem = GridPrinter._printTrait.createClientBox(e.pageWidth, e.pageHeight);
|
745
|
+
e.bodyElement.appendChild(GridPrinter._printElem);
|
746
|
+
}
|
747
|
+
};
|
748
|
+
/** @private
|
749
|
+
* @param {Object} e
|
750
|
+
*/
|
751
|
+
GridPrinter._onAfterPrint = function (e) {
|
752
|
+
GridPrinter._removePrintElements();
|
753
|
+
|
754
|
+
if (!GridPrinter._isObserving) {
|
755
|
+
GridPrinter._getPrintTrait().unobserve();
|
756
|
+
}
|
757
|
+
|
758
|
+
GridPrinter._printInfo = null;
|
759
|
+
if (GridPrinter._grid) {
|
760
|
+
GridPrinter._grid.updateLayout();
|
761
|
+
GridPrinter._grid = null;
|
762
|
+
}
|
763
|
+
};
|
764
|
+
|
765
|
+
/** @typedef {Object} GridPrinter~Options
|
766
|
+
* @description Configuration object for customizing priting behavior can be passed through `GridPrinter.setPrintOptions` method
|
767
|
+
* @property {number=} pageWidth Paper width in pixel. This limits number of columns to be shown on a single page
|
768
|
+
* @property {number=} pageHeight Paper height in pixel. This limits number of rows to be shown on a single page
|
769
|
+
* @property {number=} primaryColumn Column index that will be placed as the first column on each page.
|
770
|
+
*/
|
771
|
+
GridPrinter.Options;
|
772
|
+
|
773
|
+
|
774
|
+
export { GridPrinter };
|