@deephaven/iris-grid 0.43.0 → 0.44.0
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/dist/AdvancedFilterCreator.css +106 -0
- package/dist/AdvancedFilterCreator.css.map +1 -0
- package/dist/AdvancedFilterCreator.js +541 -0
- package/dist/AdvancedFilterCreator.js.map +1 -0
- package/dist/AdvancedFilterCreatorFilterItem.css +9 -0
- package/dist/AdvancedFilterCreatorFilterItem.css.map +1 -0
- package/dist/AdvancedFilterCreatorFilterItem.js +184 -0
- package/dist/AdvancedFilterCreatorFilterItem.js.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValue.css +50 -0
- package/dist/AdvancedFilterCreatorSelectValue.css.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValue.js +301 -0
- package/dist/AdvancedFilterCreatorSelectValue.js.map +1 -0
- package/dist/AdvancedFilterCreatorSelectValueList.js +272 -0
- package/dist/AdvancedFilterCreatorSelectValueList.js.map +1 -0
- package/dist/ColumnHeaderGroup.js +61 -0
- package/dist/ColumnHeaderGroup.js.map +1 -0
- package/dist/ColumnStatistics.css +76 -0
- package/dist/ColumnStatistics.css.map +1 -0
- package/dist/ColumnStatistics.js +202 -0
- package/dist/ColumnStatistics.js.map +1 -0
- package/dist/CommonTypes.js +2 -0
- package/dist/CommonTypes.js.map +1 -0
- package/dist/CrossColumnSearch.css +35 -0
- package/dist/CrossColumnSearch.css.map +1 -0
- package/dist/CrossColumnSearch.js +199 -0
- package/dist/CrossColumnSearch.js.map +1 -0
- package/dist/FilterInputField.css +56 -0
- package/dist/FilterInputField.css.map +1 -0
- package/dist/FilterInputField.js +232 -0
- package/dist/FilterInputField.js.map +1 -0
- package/dist/GotoRow.css +45 -0
- package/dist/GotoRow.css.map +1 -0
- package/dist/GotoRow.js +298 -0
- package/dist/GotoRow.js.map +1 -0
- package/dist/IrisGrid.css +359 -0
- package/dist/IrisGrid.css.map +1 -0
- package/dist/IrisGrid.js +3651 -0
- package/dist/IrisGrid.js.map +1 -0
- package/dist/IrisGridBottomBar.css +85 -0
- package/dist/IrisGridBottomBar.css.map +1 -0
- package/dist/IrisGridBottomBar.js +36 -0
- package/dist/IrisGridBottomBar.js.map +1 -0
- package/dist/IrisGridCellOverflowModal.css +17 -0
- package/dist/IrisGridCellOverflowModal.css.map +1 -0
- package/dist/IrisGridCellOverflowModal.js +157 -0
- package/dist/IrisGridCellOverflowModal.js.map +1 -0
- package/dist/IrisGridCellRendererUtils.js +20 -0
- package/dist/IrisGridCellRendererUtils.js.map +1 -0
- package/dist/IrisGridCopyHandler.css +64 -0
- package/dist/IrisGridCopyHandler.css.map +1 -0
- package/dist/IrisGridCopyHandler.js +331 -0
- package/dist/IrisGridCopyHandler.js.map +1 -0
- package/dist/IrisGridDataBarCellRenderer.js +10 -0
- package/dist/IrisGridDataBarCellRenderer.js.map +1 -0
- package/dist/IrisGridIcons.js +25 -0
- package/dist/IrisGridIcons.js.map +1 -0
- package/dist/IrisGridMetricCalculator.js +33 -0
- package/dist/IrisGridMetricCalculator.js.map +1 -0
- package/dist/IrisGridModel.js +263 -0
- package/dist/IrisGridModel.js.map +1 -0
- package/dist/IrisGridModelFactory.js +27 -0
- package/dist/IrisGridModelFactory.js.map +1 -0
- package/dist/IrisGridModelUpdater.js +96 -0
- package/dist/IrisGridModelUpdater.js.map +1 -0
- package/dist/IrisGridPartitionSelector.css +48 -0
- package/dist/IrisGridPartitionSelector.css.map +1 -0
- package/dist/IrisGridPartitionSelector.js +198 -0
- package/dist/IrisGridPartitionSelector.js.map +1 -0
- package/dist/IrisGridProxyModel.js +530 -0
- package/dist/IrisGridProxyModel.js.map +1 -0
- package/dist/IrisGridRenderer.js +779 -0
- package/dist/IrisGridRenderer.js.map +1 -0
- package/dist/IrisGridShortcuts.js +59 -0
- package/dist/IrisGridShortcuts.js.map +1 -0
- package/dist/IrisGridTableModel.js +273 -0
- package/dist/IrisGridTableModel.js.map +1 -0
- package/dist/IrisGridTableModelTemplate.js +1589 -0
- package/dist/IrisGridTableModelTemplate.js.map +1 -0
- package/dist/IrisGridTestUtils.js +121 -0
- package/dist/IrisGridTestUtils.js.map +1 -0
- package/dist/IrisGridTextCellRenderer.js +139 -0
- package/dist/IrisGridTextCellRenderer.js.map +1 -0
- package/dist/IrisGridTheme.js +96 -0
- package/dist/IrisGridTheme.js.map +1 -0
- package/dist/IrisGridTheme.module.css +69 -0
- package/dist/IrisGridTheme.module.css.map +1 -0
- package/dist/IrisGridTreeTableModel.js +145 -0
- package/dist/IrisGridTreeTableModel.js.map +1 -0
- package/dist/IrisGridUtils.js +1279 -0
- package/dist/IrisGridUtils.js.map +1 -0
- package/dist/MissingKeyError.js +15 -0
- package/dist/MissingKeyError.js.map +1 -0
- package/dist/PartitionSelectorSearch.css +22 -0
- package/dist/PartitionSelectorSearch.css.map +1 -0
- package/dist/PartitionSelectorSearch.js +317 -0
- package/dist/PartitionSelectorSearch.js.map +1 -0
- package/dist/PendingDataBottomBar.css +13 -0
- package/dist/PendingDataBottomBar.css.map +1 -0
- package/dist/PendingDataBottomBar.js +98 -0
- package/dist/PendingDataBottomBar.js.map +1 -0
- package/dist/TableViewportUpdater.js +156 -0
- package/dist/TableViewportUpdater.js.map +1 -0
- package/dist/ToastBottomBar.js +42 -0
- package/dist/ToastBottomBar.js.map +1 -0
- package/dist/TreeTableViewportUpdater.js +96 -0
- package/dist/TreeTableViewportUpdater.js.map +1 -0
- package/dist/declaration.d.js +2 -0
- package/dist/declaration.d.js.map +1 -0
- package/dist/format-context-menus/CustomFormatAction.css +25 -0
- package/dist/format-context-menus/CustomFormatAction.css.map +1 -0
- package/dist/format-context-menus/CustomFormatAction.js +132 -0
- package/dist/format-context-menus/CustomFormatAction.js.map +1 -0
- package/dist/format-context-menus/DateTimeFormatContextMenu.js +53 -0
- package/dist/format-context-menus/DateTimeFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/DecimalFormatContextMenu.js +59 -0
- package/dist/format-context-menus/DecimalFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/FormatContextMenuUtils.js +63 -0
- package/dist/format-context-menus/FormatContextMenuUtils.js.map +1 -0
- package/dist/format-context-menus/IntegerFormatContextMenu.js +43 -0
- package/dist/format-context-menus/IntegerFormatContextMenu.js.map +1 -0
- package/dist/format-context-menus/index.js +4 -0
- package/dist/format-context-menus/index.js.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/key-handlers/ClearFilterKeyHandler.js +21 -0
- package/dist/key-handlers/ClearFilterKeyHandler.js.map +1 -0
- package/dist/key-handlers/CopyKeyHandler.js +31 -0
- package/dist/key-handlers/CopyKeyHandler.js.map +1 -0
- package/dist/key-handlers/ReverseKeyHandler.js +32 -0
- package/dist/key-handlers/ReverseKeyHandler.js.map +1 -0
- package/dist/key-handlers/index.js +4 -0
- package/dist/key-handlers/index.js.map +1 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js +175 -0
- package/dist/mousehandlers/IrisGridCellOverflowMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js +139 -0
- package/dist/mousehandlers/IrisGridColumnSelectMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js +83 -0
- package/dist/mousehandlers/IrisGridColumnTooltipMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.css +19 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.css.map +1 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.js +1220 -0
- package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js +28 -0
- package/dist/mousehandlers/IrisGridDataSelectMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js +80 -0
- package/dist/mousehandlers/IrisGridFilterMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js +126 -0
- package/dist/mousehandlers/IrisGridRowTreeMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridSortMouseHandler.js +46 -0
- package/dist/mousehandlers/IrisGridSortMouseHandler.js.map +1 -0
- package/dist/mousehandlers/IrisGridTokenMouseHandler.js +151 -0
- package/dist/mousehandlers/IrisGridTokenMouseHandler.js.map +1 -0
- package/dist/mousehandlers/PendingMouseHandler.js +39 -0
- package/dist/mousehandlers/PendingMouseHandler.js.map +1 -0
- package/dist/mousehandlers/index.js +11 -0
- package/dist/mousehandlers/index.js.map +1 -0
- package/dist/sidebar/AdvancedSettings.js +6 -0
- package/dist/sidebar/AdvancedSettings.js.map +1 -0
- package/dist/sidebar/AdvancedSettingsMenu.js +29 -0
- package/dist/sidebar/AdvancedSettingsMenu.js.map +1 -0
- package/dist/sidebar/AdvancedSettingsType.js +7 -0
- package/dist/sidebar/AdvancedSettingsType.js.map +1 -0
- package/dist/sidebar/ChartBuilder.css +56 -0
- package/dist/sidebar/ChartBuilder.css.map +1 -0
- package/dist/sidebar/ChartBuilder.js +443 -0
- package/dist/sidebar/ChartBuilder.js.map +1 -0
- package/dist/sidebar/CustomColumnBuilder.css +58 -0
- package/dist/sidebar/CustomColumnBuilder.css.map +1 -0
- package/dist/sidebar/CustomColumnBuilder.js +384 -0
- package/dist/sidebar/CustomColumnBuilder.js.map +1 -0
- package/dist/sidebar/CustomColumnInput.d.ts.map +1 -1
- package/dist/sidebar/CustomColumnInput.js +91 -0
- package/dist/sidebar/CustomColumnInput.js.map +1 -0
- package/dist/sidebar/InputEditor.css +35 -0
- package/dist/sidebar/InputEditor.css.map +1 -0
- package/dist/sidebar/InputEditor.d.ts +4 -2
- package/dist/sidebar/InputEditor.d.ts.map +1 -1
- package/dist/sidebar/InputEditor.js +180 -0
- package/dist/sidebar/InputEditor.js.map +1 -0
- package/dist/sidebar/OptionType.js +19 -0
- package/dist/sidebar/OptionType.js.map +1 -0
- package/dist/sidebar/RollupRows.css +120 -0
- package/dist/sidebar/RollupRows.css.map +1 -0
- package/dist/sidebar/RollupRows.js +519 -0
- package/dist/sidebar/RollupRows.js.map +1 -0
- package/dist/sidebar/SelectDistinctBuilder.css +41 -0
- package/dist/sidebar/SelectDistinctBuilder.css.map +1 -0
- package/dist/sidebar/SelectDistinctBuilder.js +155 -0
- package/dist/sidebar/SelectDistinctBuilder.js.map +1 -0
- package/dist/sidebar/TableCsvExporter.css +32 -0
- package/dist/sidebar/TableCsvExporter.css.map +1 -0
- package/dist/sidebar/TableCsvExporter.js +399 -0
- package/dist/sidebar/TableCsvExporter.js.map +1 -0
- package/dist/sidebar/TableSaver.js +487 -0
- package/dist/sidebar/TableSaver.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationEdit.css +61 -0
- package/dist/sidebar/aggregations/AggregationEdit.css.map +1 -0
- package/dist/sidebar/aggregations/AggregationEdit.js +155 -0
- package/dist/sidebar/aggregations/AggregationEdit.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationOperation.js +19 -0
- package/dist/sidebar/aggregations/AggregationOperation.js.map +1 -0
- package/dist/sidebar/aggregations/AggregationUtils.js +59 -0
- package/dist/sidebar/aggregations/AggregationUtils.js.map +1 -0
- package/dist/sidebar/aggregations/Aggregations.css +43 -0
- package/dist/sidebar/aggregations/Aggregations.css.map +1 -0
- package/dist/sidebar/aggregations/Aggregations.js +178 -0
- package/dist/sidebar/aggregations/Aggregations.js.map +1 -0
- package/dist/sidebar/aggregations/index.js +2 -0
- package/dist/sidebar/aggregations/index.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js +123 -0
- package/dist/sidebar/conditional-formatting/ColumnFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js +243 -0
- package/dist/sidebar/conditional-formatting/ConditionEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css +22 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js +109 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js +18 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingAPIUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +57 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js +150 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.js.map +1 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +635 -0
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js +122 -0
- package/dist/sidebar/conditional-formatting/RowFormatEditor.js.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css +55 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.css.map +1 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js +150 -0
- package/dist/sidebar/conditional-formatting/StyleEditor.js.map +1 -0
- package/dist/sidebar/icons/BarIcon.js +24 -0
- package/dist/sidebar/icons/BarIcon.js.map +1 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js +42 -0
- package/dist/sidebar/icons/FormatColumnWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js +36 -0
- package/dist/sidebar/icons/FormatRowWhereIcon.js.map +1 -0
- package/dist/sidebar/icons/HistogramIcon.js +24 -0
- package/dist/sidebar/icons/HistogramIcon.js.map +1 -0
- package/dist/sidebar/icons/LineIcon.js +27 -0
- package/dist/sidebar/icons/LineIcon.js.map +1 -0
- package/dist/sidebar/icons/PieIcon.js +24 -0
- package/dist/sidebar/icons/PieIcon.js.map +1 -0
- package/dist/sidebar/icons/ScatterIcon.js +74 -0
- package/dist/sidebar/icons/ScatterIcon.js.map +1 -0
- package/dist/sidebar/icons/index.js +8 -0
- package/dist/sidebar/icons/index.js.map +1 -0
- package/dist/sidebar/index.d.ts +1 -0
- package/dist/sidebar/index.d.ts.map +1 -1
- package/dist/sidebar/index.js +19 -0
- package/dist/sidebar/index.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css +68 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js +964 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js +132 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilderUtils.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css +29 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js +188 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingGroup.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js +81 -0
- package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js +30 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/PointerSensorWithInteraction.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js +158 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTree.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js +146 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeInner.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js +59 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/SortableTreeItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +139 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js +44 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js +129 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/keyboardCoordinates.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js +4 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/types.js.map +1 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js +261 -0
- package/dist/sidebar/visibility-ordering-builder/sortable-tree/utilities.js.map +1 -0
- package/package.json +15 -15
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
3
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
4
|
+
import { PureComponent } from 'react';
|
|
5
|
+
import Log from '@deephaven/log';
|
|
6
|
+
import { memoizeClear } from '@deephaven/grid';
|
|
7
|
+
import { FormatterUtils, TableUtils } from '@deephaven/jsapi-utils';
|
|
8
|
+
import { PromiseUtils, assertNotNull } from '@deephaven/utils';
|
|
9
|
+
import IrisGridUtils from "../IrisGridUtils.js";
|
|
10
|
+
var log = Log.module('TableSaver');
|
|
11
|
+
var UNFORMATTED_DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS z";
|
|
12
|
+
function isUpdateEventData(data) {
|
|
13
|
+
return data.added !== undefined;
|
|
14
|
+
}
|
|
15
|
+
function assertIsUpdateEventData(data) {
|
|
16
|
+
if (!isUpdateEventData(data)) {
|
|
17
|
+
throw new Error('event is not UpdateEventData');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export default class TableSaver extends PureComponent {
|
|
21
|
+
static csvEscapeString(str) {
|
|
22
|
+
return "\"".concat(str.replace(/"/g, '""'), "\"");
|
|
23
|
+
}
|
|
24
|
+
constructor(props) {
|
|
25
|
+
super(props);
|
|
26
|
+
_defineProperty(this, "sw", void 0);
|
|
27
|
+
_defineProperty(this, "port", void 0);
|
|
28
|
+
_defineProperty(this, "fileWriter", void 0);
|
|
29
|
+
_defineProperty(this, "table", void 0);
|
|
30
|
+
_defineProperty(this, "tableSubscription", void 0);
|
|
31
|
+
_defineProperty(this, "columns", void 0);
|
|
32
|
+
_defineProperty(this, "fileName", void 0);
|
|
33
|
+
_defineProperty(this, "includeColumnHeaders", void 0);
|
|
34
|
+
_defineProperty(this, "useUnformattedValues", void 0);
|
|
35
|
+
_defineProperty(this, "chunkRows", void 0);
|
|
36
|
+
_defineProperty(this, "gridRanges", void 0);
|
|
37
|
+
_defineProperty(this, "gridRangeCounter", void 0);
|
|
38
|
+
_defineProperty(this, "rangedSnapshotsTotal", void 0);
|
|
39
|
+
_defineProperty(this, "rangedSnapshotCounter", void 0);
|
|
40
|
+
_defineProperty(this, "snapshotsTotal", void 0);
|
|
41
|
+
_defineProperty(this, "snapshotCounter", void 0);
|
|
42
|
+
_defineProperty(this, "snapshotsBuffer", void 0);
|
|
43
|
+
_defineProperty(this, "currentSnapshotIndex", void 0);
|
|
44
|
+
_defineProperty(this, "snapshotPending", void 0);
|
|
45
|
+
_defineProperty(this, "cancelableSnapshots", void 0);
|
|
46
|
+
_defineProperty(this, "streamTimeout", void 0);
|
|
47
|
+
_defineProperty(this, "snapshotHandlerTimeout", void 0);
|
|
48
|
+
_defineProperty(this, "downloadStartTime", void 0);
|
|
49
|
+
_defineProperty(this, "iframes", void 0);
|
|
50
|
+
_defineProperty(this, "useBlobFallback", void 0);
|
|
51
|
+
_defineProperty(this, "getCachedCustomColumnFormatFlag", memoizeClear(FormatterUtils.isCustomColumnFormatDefined, {
|
|
52
|
+
max: 10000
|
|
53
|
+
}));
|
|
54
|
+
this.handlePortMessage = this.handlePortMessage.bind(this);
|
|
55
|
+
this.handleSnapshotResolved = this.handleSnapshotResolved.bind(this);
|
|
56
|
+
this.handleDownloadTimeout = this.handleDownloadTimeout.bind(this);
|
|
57
|
+
this.state = {};
|
|
58
|
+
this.gridRanges = [];
|
|
59
|
+
this.gridRangeCounter = 0;
|
|
60
|
+
this.rangedSnapshotsTotal = [];
|
|
61
|
+
this.rangedSnapshotCounter = 0;
|
|
62
|
+
this.includeColumnHeaders = true;
|
|
63
|
+
this.useUnformattedValues = false;
|
|
64
|
+
this.snapshotsTotal = 0;
|
|
65
|
+
this.snapshotCounter = 0;
|
|
66
|
+
this.snapshotsBuffer = new Map();
|
|
67
|
+
this.currentSnapshotIndex = 0;
|
|
68
|
+
this.snapshotPending = 0;
|
|
69
|
+
this.cancelableSnapshots = [];
|
|
70
|
+
|
|
71
|
+
// Due to an open issue in Chromium, readableStream.cancel() is never called when a user cancel the stream from Chromium's UI and the stream goes on even it's canceled.
|
|
72
|
+
// Instead, we monitor the pull() behavior from the readableStream called when the stream wants more data to write.
|
|
73
|
+
// If the stream doesn't pull for long enough time, chances are the stream is already canceled, so we stop the stream.
|
|
74
|
+
// Issue ticket on Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=638494
|
|
75
|
+
|
|
76
|
+
this.iframes = [];
|
|
77
|
+
this.useBlobFallback = false;
|
|
78
|
+
}
|
|
79
|
+
componentDidMount() {
|
|
80
|
+
var {
|
|
81
|
+
getDownloadWorker
|
|
82
|
+
} = this.props;
|
|
83
|
+
getDownloadWorker().then(sw => {
|
|
84
|
+
log.info('found active service worker');
|
|
85
|
+
this.sw = sw;
|
|
86
|
+
this.sw.postMessage('ping'); // just to activate the service worker
|
|
87
|
+
}).catch(error => {
|
|
88
|
+
// if service worker is not available, use blob as fallback to download table csv
|
|
89
|
+
log.warn('Download csv is not optimized.', error);
|
|
90
|
+
this.useBlobFallback = true;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
componentWillUnmount() {
|
|
94
|
+
if (this.iframes.length > 0) {
|
|
95
|
+
this.iframes.forEach(iframe => {
|
|
96
|
+
iframe.remove();
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (this.streamTimeout) clearTimeout(this.streamTimeout);
|
|
100
|
+
if (this.snapshotHandlerTimeout) clearTimeout(this.snapshotHandlerTimeout);
|
|
101
|
+
}
|
|
102
|
+
createWriterStream(port) {
|
|
103
|
+
// use blob fall back if it's safari
|
|
104
|
+
var useBlob = this.useBlobFallback;
|
|
105
|
+
var chunks = [];
|
|
106
|
+
var encode = null;
|
|
107
|
+
if (useBlob) {
|
|
108
|
+
encode = TextEncoder.prototype.encode.bind(new TextEncoder());
|
|
109
|
+
}
|
|
110
|
+
var {
|
|
111
|
+
fileName
|
|
112
|
+
} = this;
|
|
113
|
+
var streamConfig = {};
|
|
114
|
+
if (useBlob) {
|
|
115
|
+
streamConfig.write = chunk => {
|
|
116
|
+
assertNotNull(encode);
|
|
117
|
+
if (chunk.header !== undefined) {
|
|
118
|
+
chunks.push(encode(chunk.header));
|
|
119
|
+
}
|
|
120
|
+
if (chunk.rows !== undefined) {
|
|
121
|
+
chunks.push(encode(chunk.rows));
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
streamConfig.close = () => {
|
|
125
|
+
assertNotNull(fileName);
|
|
126
|
+
var blob = new Blob(chunks, {
|
|
127
|
+
type: 'application/octet-stream; charset=utf-8'
|
|
128
|
+
});
|
|
129
|
+
var link = document.createElement('a');
|
|
130
|
+
link.href = URL.createObjectURL(blob);
|
|
131
|
+
link.download = fileName;
|
|
132
|
+
link.click();
|
|
133
|
+
};
|
|
134
|
+
streamConfig.abort = () => {
|
|
135
|
+
port.postMessage({
|
|
136
|
+
cancel: true
|
|
137
|
+
});
|
|
138
|
+
port.close();
|
|
139
|
+
};
|
|
140
|
+
} else {
|
|
141
|
+
streamConfig.write = chunk => {
|
|
142
|
+
port.postMessage(chunk);
|
|
143
|
+
};
|
|
144
|
+
streamConfig.close = () => {
|
|
145
|
+
port.postMessage({
|
|
146
|
+
end: true
|
|
147
|
+
});
|
|
148
|
+
port.close();
|
|
149
|
+
};
|
|
150
|
+
streamConfig.abort = () => {
|
|
151
|
+
port.postMessage({
|
|
152
|
+
cancel: true
|
|
153
|
+
});
|
|
154
|
+
port.close();
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return new WritableStream(streamConfig);
|
|
158
|
+
}
|
|
159
|
+
startDownload(fileName, frozenTable, tableSubscription, snapshotRanges, modelRanges, includeColumnHeaders, useUnformattedValues) {
|
|
160
|
+
// don't trigger another download when a download is ongoing
|
|
161
|
+
var {
|
|
162
|
+
isDownloading
|
|
163
|
+
} = this.props;
|
|
164
|
+
if (isDownloading) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
this.downloadStartTime = Date.now();
|
|
168
|
+
log.info("start downloading ".concat(fileName));
|
|
169
|
+
this.table = frozenTable;
|
|
170
|
+
this.columns = IrisGridUtils.columnsFromRanges(modelRanges, frozenTable.columns);
|
|
171
|
+
this.tableSubscription = tableSubscription;
|
|
172
|
+
this.gridRanges = snapshotRanges;
|
|
173
|
+
this.includeColumnHeaders = includeColumnHeaders;
|
|
174
|
+
this.useUnformattedValues = useUnformattedValues;
|
|
175
|
+
|
|
176
|
+
// Make filename RFC5987 compatible
|
|
177
|
+
var encodedFileName = encodeURIComponent(fileName.replace(/\//g, ':')).replace(/['()]/g, escape).replace(/\*/g, '%2A');
|
|
178
|
+
var messageChannel = new MessageChannel();
|
|
179
|
+
this.port = messageChannel.port1;
|
|
180
|
+
this.fileName = fileName;
|
|
181
|
+
this.fileWriter = this.createWriterStream(this.port).getWriter();
|
|
182
|
+
|
|
183
|
+
// if the browser doesn't support stream or there's no active service worker, use blobs for table download
|
|
184
|
+
if (this.useBlobFallback) {
|
|
185
|
+
this.writeCsvTable(includeColumnHeaders);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (this.sw) {
|
|
189
|
+
// send file name and port to service worker
|
|
190
|
+
this.sw.postMessage({
|
|
191
|
+
encodedFileName
|
|
192
|
+
}, [messageChannel.port2]);
|
|
193
|
+
}
|
|
194
|
+
this.port.onmessage = this.handlePortMessage;
|
|
195
|
+
}
|
|
196
|
+
finishDownload() {
|
|
197
|
+
if (this.table) {
|
|
198
|
+
this.table.close();
|
|
199
|
+
}
|
|
200
|
+
if (this.tableSubscription) {
|
|
201
|
+
this.tableSubscription.close();
|
|
202
|
+
}
|
|
203
|
+
if (this.fileWriter) {
|
|
204
|
+
this.fileWriter.close();
|
|
205
|
+
}
|
|
206
|
+
var {
|
|
207
|
+
onDownloadCompleted
|
|
208
|
+
} = this.props;
|
|
209
|
+
onDownloadCompleted();
|
|
210
|
+
this.resetTableSaver();
|
|
211
|
+
if (this.downloadStartTime !== undefined) {
|
|
212
|
+
log.info("download finished, total elapsed time ".concat((Date.now() - this.downloadStartTime) / 1000, " seconds"));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
cancelDownload() {
|
|
216
|
+
if (this.table) {
|
|
217
|
+
this.table.close();
|
|
218
|
+
}
|
|
219
|
+
if (this.tableSubscription) {
|
|
220
|
+
this.tableSubscription.close();
|
|
221
|
+
}
|
|
222
|
+
if (this.fileWriter) {
|
|
223
|
+
this.fileWriter.abort();
|
|
224
|
+
}
|
|
225
|
+
this.cancelableSnapshots.forEach(cancelable => {
|
|
226
|
+
if (cancelable) {
|
|
227
|
+
cancelable.catch(() => null);
|
|
228
|
+
cancelable.cancel();
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
var {
|
|
232
|
+
onDownloadCanceled
|
|
233
|
+
} = this.props;
|
|
234
|
+
onDownloadCanceled();
|
|
235
|
+
this.resetTableSaver();
|
|
236
|
+
}
|
|
237
|
+
resetTableSaver() {
|
|
238
|
+
this.table = undefined;
|
|
239
|
+
this.tableSubscription = undefined;
|
|
240
|
+
this.columns = undefined;
|
|
241
|
+
this.chunkRows = undefined;
|
|
242
|
+
this.gridRanges = [];
|
|
243
|
+
this.gridRangeCounter = 0;
|
|
244
|
+
this.rangedSnapshotsTotal = [];
|
|
245
|
+
this.rangedSnapshotCounter = 0;
|
|
246
|
+
this.includeColumnHeaders = true;
|
|
247
|
+
this.useUnformattedValues = false;
|
|
248
|
+
this.snapshotsTotal = 0;
|
|
249
|
+
this.snapshotCounter = 0;
|
|
250
|
+
this.snapshotsBuffer = new Map();
|
|
251
|
+
this.currentSnapshotIndex = 0;
|
|
252
|
+
this.snapshotPending = 0;
|
|
253
|
+
this.cancelableSnapshots = [];
|
|
254
|
+
if (this.streamTimeout != null) {
|
|
255
|
+
clearTimeout(this.streamTimeout);
|
|
256
|
+
}
|
|
257
|
+
if (this.snapshotHandlerTimeout != null) {
|
|
258
|
+
clearTimeout(this.snapshotHandlerTimeout);
|
|
259
|
+
}
|
|
260
|
+
this.streamTimeout = undefined;
|
|
261
|
+
this.snapshotHandlerTimeout = undefined;
|
|
262
|
+
}
|
|
263
|
+
handleDownloadTimeout() {
|
|
264
|
+
log.info('download canceled');
|
|
265
|
+
this.cancelDownload();
|
|
266
|
+
}
|
|
267
|
+
writeTableHeader() {
|
|
268
|
+
var _this$fileWriter;
|
|
269
|
+
var headerString = '';
|
|
270
|
+
if (this.columns) {
|
|
271
|
+
for (var i = 0; i < this.columns.length; i += 1) {
|
|
272
|
+
headerString += this.columns[i].name;
|
|
273
|
+
headerString += i === this.columns.length - 1 ? '\n' : ',';
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
(_this$fileWriter = this.fileWriter) === null || _this$fileWriter === void 0 ? void 0 : _this$fileWriter.write({
|
|
277
|
+
header: headerString
|
|
278
|
+
}).then(() => null);
|
|
279
|
+
}
|
|
280
|
+
startWriteTableBody() {
|
|
281
|
+
if (this.columns && this.gridRanges != null) {
|
|
282
|
+
this.chunkRows = Math.floor(TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length);
|
|
283
|
+
this.rangedSnapshotsTotal = this.gridRanges.map(range => {
|
|
284
|
+
assertNotNull(range.endRow);
|
|
285
|
+
assertNotNull(range.startRow);
|
|
286
|
+
assertNotNull(this.chunkRows);
|
|
287
|
+
return Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows);
|
|
288
|
+
});
|
|
289
|
+
this.snapshotsTotal = this.rangedSnapshotsTotal.reduce((total, snapshotCount) => total + snapshotCount);
|
|
290
|
+
log.info("start writing table, total snapshots: ", this.snapshotsTotal);
|
|
291
|
+
this.makeSnapshot(Math.min(TableSaver.SNAPSHOT_BUFFER_SIZE, this.snapshotsTotal));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
writeCsvTable(includeColumnHeaders) {
|
|
295
|
+
if (includeColumnHeaders) {
|
|
296
|
+
this.writeTableHeader();
|
|
297
|
+
}
|
|
298
|
+
this.startWriteTableBody();
|
|
299
|
+
}
|
|
300
|
+
writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow) {
|
|
301
|
+
if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {
|
|
302
|
+
while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {
|
|
303
|
+
var n = this.snapshotsBuffer.get(this.currentSnapshotIndex);
|
|
304
|
+
assertNotNull(n);
|
|
305
|
+
this.fileWriter.write({
|
|
306
|
+
rows: this.convertSnapshotIntoCsv(n)
|
|
307
|
+
});
|
|
308
|
+
this.snapshotsBuffer.delete(this.currentSnapshotIndex);
|
|
309
|
+
this.currentSnapshotIndex += 1;
|
|
310
|
+
this.updateDownloadProgress(snapshotIndex);
|
|
311
|
+
}
|
|
312
|
+
if (this.snapshotsTotal && this.currentSnapshotIndex >= this.snapshotsTotal) {
|
|
313
|
+
this.finishDownload();
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (this.snapshotCounter && this.snapshotsTotal && this.snapshotCounter < this.snapshotsTotal) {
|
|
318
|
+
log.debug2("\n current range index: ".concat(this.gridRangeCounter, ", \n snapshotIndexCounter: ").concat(this.snapshotCounter, ", \n currentRangedSnapshotIndex : ").concat(this.rangedSnapshotCounter, ", \n snapshotpending: ").concat(this.snapshotPending, ", \n buffered ").concat(this.snapshotsBuffer.size, "\n making ").concat(Math.min(TableSaver.SNAPSHOT_BUFFER_SIZE - this.snapshotsBuffer.size - this.snapshotPending, this.snapshotsTotal - this.snapshotCounter), " more snapshots\n "));
|
|
319
|
+
this.makeSnapshot(Math.min(TableSaver.SNAPSHOT_BUFFER_SIZE - this.snapshotsBuffer.size - this.snapshotPending, this.snapshotsTotal - this.snapshotCounter));
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
updateDownloadProgress(snapshotIndex) {
|
|
323
|
+
if (snapshotIndex != null && this.snapshotsTotal != null && this.downloadStartTime != null) {
|
|
324
|
+
var {
|
|
325
|
+
onDownloadProgressUpdate
|
|
326
|
+
} = this.props;
|
|
327
|
+
var downloadProgress = Math.floor(snapshotIndex * 100 / this.snapshotsTotal);
|
|
328
|
+
var estimateTime = snapshotIndex > 1 ? Math.floor((Date.now() - this.downloadStartTime) * (this.snapshotsTotal - snapshotIndex) / snapshotIndex / 1000) : null;
|
|
329
|
+
onDownloadProgressUpdate(downloadProgress, estimateTime);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
convertSnapshotIntoCsv(snapshot) {
|
|
333
|
+
var csvString = '';
|
|
334
|
+
var snapshotIterator = snapshot.added.iterator();
|
|
335
|
+
var {
|
|
336
|
+
dh,
|
|
337
|
+
formatter
|
|
338
|
+
} = this.props;
|
|
339
|
+
var rows = [];
|
|
340
|
+
while (snapshotIterator.hasNext()) {
|
|
341
|
+
rows.push(snapshotIterator.next().value);
|
|
342
|
+
}
|
|
343
|
+
assertNotNull(this.columns);
|
|
344
|
+
var {
|
|
345
|
+
useUnformattedValues
|
|
346
|
+
} = this;
|
|
347
|
+
for (var i = 0; i < rows.length; i += 1) {
|
|
348
|
+
var rowIdx = rows[i];
|
|
349
|
+
for (var j = 0; j < this.columns.length; j += 1) {
|
|
350
|
+
var {
|
|
351
|
+
type,
|
|
352
|
+
name
|
|
353
|
+
} = this.columns[j];
|
|
354
|
+
var cellData = null;
|
|
355
|
+
if (useUnformattedValues) {
|
|
356
|
+
var _snapshot$getData;
|
|
357
|
+
var value = (_snapshot$getData = snapshot.getData(rowIdx, this.columns[j])) !== null && _snapshot$getData !== void 0 ? _snapshot$getData : '';
|
|
358
|
+
if (value !== '' && TableUtils.isDateType(type)) {
|
|
359
|
+
// value is just a long value, we should return the value formatted as a full date string
|
|
360
|
+
value = dh.i18n.DateTimeFormat.format(UNFORMATTED_DATE_PATTERN, value, dh.i18n.TimeZone.getTimeZone(formatter.timeZone));
|
|
361
|
+
}
|
|
362
|
+
cellData = value.toString();
|
|
363
|
+
} else {
|
|
364
|
+
var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(formatter, name, type);
|
|
365
|
+
var formatOverride = null;
|
|
366
|
+
if (!hasCustomColumnFormat) {
|
|
367
|
+
var cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);
|
|
368
|
+
formatOverride = (cellFormat === null || cellFormat === void 0 ? void 0 : cellFormat.formatString) != null ? cellFormat : null;
|
|
369
|
+
}
|
|
370
|
+
if (formatOverride) {
|
|
371
|
+
cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), type, name, formatOverride);
|
|
372
|
+
} else {
|
|
373
|
+
cellData = formatter.getFormattedString(snapshot.getData(rowIdx, this.columns[j]), type, name);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
csvString += TableSaver.csvEscapeString(cellData);
|
|
377
|
+
csvString += j === this.columns.length - 1 ? '\n' : ',';
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return csvString;
|
|
381
|
+
}
|
|
382
|
+
makeSnapshot(n) {
|
|
383
|
+
var _this = this;
|
|
384
|
+
if (n <= 0) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
var {
|
|
388
|
+
dh
|
|
389
|
+
} = this.props;
|
|
390
|
+
assertNotNull(this.gridRangeCounter);
|
|
391
|
+
var i = 0;
|
|
392
|
+
var currentGridRange = this.gridRanges[this.gridRangeCounter];
|
|
393
|
+
assertNotNull(this.tableSubscription);
|
|
394
|
+
assertNotNull(this.columns);
|
|
395
|
+
var _loop = function _loop() {
|
|
396
|
+
assertNotNull(currentGridRange);
|
|
397
|
+
assertNotNull(currentGridRange.startRow);
|
|
398
|
+
assertNotNull(currentGridRange.endRow);
|
|
399
|
+
assertNotNull(_this.rangedSnapshotCounter);
|
|
400
|
+
assertNotNull(_this.chunkRows);
|
|
401
|
+
var snapshotStartRow = currentGridRange.startRow + _this.rangedSnapshotCounter * _this.chunkRows;
|
|
402
|
+
var snapshotEndRow = Math.min(snapshotStartRow + _this.chunkRows - 1, currentGridRange.endRow);
|
|
403
|
+
var snapshotIndex = _this.snapshotCounter;
|
|
404
|
+
_this.cancelableSnapshots.push(PromiseUtils.makeCancelable(_this.tableSubscription.snapshot(dh.RangeSet.ofRange(snapshotStartRow, snapshotEndRow), _this.columns).then(snapshot => {
|
|
405
|
+
assertIsUpdateEventData(snapshot);
|
|
406
|
+
_this.handleSnapshotResolved(snapshot, snapshotIndex, snapshotStartRow, snapshotEndRow);
|
|
407
|
+
return snapshotIndex;
|
|
408
|
+
}).catch(err => {
|
|
409
|
+
log.error(err);
|
|
410
|
+
}), val => {
|
|
411
|
+
log.info("snapshot ".concat(val, " has been canceled"));
|
|
412
|
+
}));
|
|
413
|
+
_this.rangedSnapshotCounter += 1;
|
|
414
|
+
_this.snapshotCounter += 1;
|
|
415
|
+
_this.snapshotPending += 1;
|
|
416
|
+
if (_this.rangedSnapshotCounter >= _this.rangedSnapshotsTotal[_this.gridRangeCounter]) {
|
|
417
|
+
_this.gridRangeCounter += 1;
|
|
418
|
+
_this.rangedSnapshotCounter = 0;
|
|
419
|
+
currentGridRange = _this.gridRanges[_this.gridRangeCounter];
|
|
420
|
+
}
|
|
421
|
+
i += 1;
|
|
422
|
+
};
|
|
423
|
+
while (i < n) {
|
|
424
|
+
_loop();
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
handlePortMessage(_ref) {
|
|
428
|
+
var {
|
|
429
|
+
data
|
|
430
|
+
} = _ref;
|
|
431
|
+
var {
|
|
432
|
+
download,
|
|
433
|
+
readableStreamPulling
|
|
434
|
+
} = data;
|
|
435
|
+
if (this.useBlobFallback) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
if (download != null) {
|
|
439
|
+
var {
|
|
440
|
+
includeColumnHeaders
|
|
441
|
+
} = this;
|
|
442
|
+
this.makeIframe("".concat(download));
|
|
443
|
+
this.writeCsvTable(includeColumnHeaders);
|
|
444
|
+
}
|
|
445
|
+
if (readableStreamPulling != null) {
|
|
446
|
+
if (!this.useBlobFallback) {
|
|
447
|
+
if (this.streamTimeout != null) {
|
|
448
|
+
clearTimeout(this.streamTimeout);
|
|
449
|
+
}
|
|
450
|
+
this.streamTimeout = setTimeout(this.handleDownloadTimeout, TableSaver.STREAM_TIMEOUT);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
handleSnapshotResolved(snapshot, snapshotIndex, snapshotStartRow, snapshotEndRow) {
|
|
455
|
+
// use time out to break writeSnapshot into an individual task in browser with timeout, so there's window for the browser to update table in needed.
|
|
456
|
+
this.snapshotHandlerTimeout = setTimeout(() => {
|
|
457
|
+
this.snapshotsBuffer.set(snapshotIndex, snapshot);
|
|
458
|
+
this.snapshotPending -= 1;
|
|
459
|
+
this.writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow);
|
|
460
|
+
this.cancelableSnapshots[snapshotIndex] = null;
|
|
461
|
+
}, TableSaver.SNAPSHOT_HANDLER_TIMEOUT);
|
|
462
|
+
}
|
|
463
|
+
makeIframe(src) {
|
|
464
|
+
// make a return value and make it static method
|
|
465
|
+
var iframe = document.createElement('iframe');
|
|
466
|
+
iframe.hidden = true;
|
|
467
|
+
iframe.src = "download/".concat(src);
|
|
468
|
+
iframe.name = 'iframe';
|
|
469
|
+
document.body.appendChild(iframe);
|
|
470
|
+
this.iframes.push(iframe);
|
|
471
|
+
}
|
|
472
|
+
render() {
|
|
473
|
+
return null;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
_defineProperty(TableSaver, "DOWNLOAD_CELL_CHUNK", 6000);
|
|
477
|
+
_defineProperty(TableSaver, "SNAPSHOT_BUFFER_SIZE", 5);
|
|
478
|
+
_defineProperty(TableSaver, "STREAM_TIMEOUT", 8000);
|
|
479
|
+
_defineProperty(TableSaver, "SNAPSHOT_HANDLER_TIMEOUT", 5);
|
|
480
|
+
_defineProperty(TableSaver, "defaultProps", {
|
|
481
|
+
getDownloadWorker: () => Promise.reject(new Error('Download worker not provided')),
|
|
482
|
+
isDownloading: false,
|
|
483
|
+
onDownloadCompleted: () => undefined,
|
|
484
|
+
onDownloadCanceled: () => undefined,
|
|
485
|
+
onDownloadProgressUpdate: () => undefined
|
|
486
|
+
});
|
|
487
|
+
//# sourceMappingURL=TableSaver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableSaver.js","names":["PureComponent","Log","memoizeClear","FormatterUtils","TableUtils","PromiseUtils","assertNotNull","IrisGridUtils","log","module","UNFORMATTED_DATE_PATTERN","isUpdateEventData","data","added","undefined","assertIsUpdateEventData","Error","TableSaver","csvEscapeString","str","replace","constructor","props","isCustomColumnFormatDefined","max","handlePortMessage","bind","handleSnapshotResolved","handleDownloadTimeout","state","gridRanges","gridRangeCounter","rangedSnapshotsTotal","rangedSnapshotCounter","includeColumnHeaders","useUnformattedValues","snapshotsTotal","snapshotCounter","snapshotsBuffer","Map","currentSnapshotIndex","snapshotPending","cancelableSnapshots","iframes","useBlobFallback","componentDidMount","getDownloadWorker","then","sw","info","postMessage","catch","error","warn","componentWillUnmount","length","forEach","iframe","remove","streamTimeout","clearTimeout","snapshotHandlerTimeout","createWriterStream","port","useBlob","chunks","encode","TextEncoder","prototype","fileName","streamConfig","write","chunk","header","push","rows","close","blob","Blob","type","link","document","createElement","href","URL","createObjectURL","download","click","abort","cancel","end","WritableStream","startDownload","frozenTable","tableSubscription","snapshotRanges","modelRanges","isDownloading","downloadStartTime","Date","now","table","columns","columnsFromRanges","encodedFileName","encodeURIComponent","escape","messageChannel","MessageChannel","port1","fileWriter","getWriter","writeCsvTable","port2","onmessage","finishDownload","onDownloadCompleted","resetTableSaver","cancelDownload","cancelable","onDownloadCanceled","chunkRows","writeTableHeader","headerString","i","name","startWriteTableBody","Math","floor","DOWNLOAD_CELL_CHUNK","map","range","endRow","startRow","ceil","reduce","total","snapshotCount","makeSnapshot","min","SNAPSHOT_BUFFER_SIZE","writeSnapshot","snapshotIndex","snapshotStartRow","snapshotEndRow","has","n","get","convertSnapshotIntoCsv","delete","updateDownloadProgress","debug2","size","onDownloadProgressUpdate","downloadProgress","estimateTime","snapshot","csvString","snapshotIterator","iterator","dh","formatter","hasNext","next","value","rowIdx","j","cellData","getData","isDateType","i18n","DateTimeFormat","format","TimeZone","getTimeZone","timeZone","toString","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","formatOverride","cellFormat","getFormat","formatString","getFormattedString","currentGridRange","makeCancelable","RangeSet","ofRange","err","val","readableStreamPulling","makeIframe","setTimeout","STREAM_TIMEOUT","set","SNAPSHOT_HANDLER_TIMEOUT","src","hidden","body","appendChild","render","Promise","reject"],"sources":["../../src/sidebar/TableSaver.tsx"],"sourcesContent":["import { PureComponent } from 'react';\nimport type {\n Column,\n dh as DhType,\n DateWrapper,\n Table,\n TableData,\n TableViewportSubscription,\n UpdateEventData,\n} from '@deephaven/jsapi-types';\nimport Log from '@deephaven/log';\nimport { GridRange, GridRangeIndex, memoizeClear } from '@deephaven/grid';\nimport { Formatter, FormatterUtils, TableUtils } from '@deephaven/jsapi-utils';\nimport {\n CancelablePromise,\n PromiseUtils,\n assertNotNull,\n} from '@deephaven/utils';\nimport IrisGridUtils from '../IrisGridUtils';\n\nconst log = Log.module('TableSaver');\n\nconst UNFORMATTED_DATE_PATTERN = `yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS z`;\n\ninterface TableSaverProps {\n dh: DhType;\n getDownloadWorker: () => Promise<ServiceWorker>;\n isDownloading: boolean;\n onDownloadCompleted: () => void;\n onDownloadCanceled: () => void;\n onDownloadProgressUpdate: (\n progress: number,\n estimatedTime: number | null\n ) => void;\n formatter: Formatter;\n}\n\nfunction isUpdateEventData(data: TableData): data is UpdateEventData {\n return (data as UpdateEventData).added !== undefined;\n}\n\nfunction assertIsUpdateEventData(\n data: TableData\n): asserts data is UpdateEventData {\n if (!isUpdateEventData(data)) {\n throw new Error('event is not UpdateEventData');\n }\n}\n\nexport default class TableSaver extends PureComponent<\n TableSaverProps,\n Record<string, never>\n> {\n static DOWNLOAD_CELL_CHUNK = 6000;\n\n static SNAPSHOT_BUFFER_SIZE = 5;\n\n static STREAM_TIMEOUT = 8000;\n\n static SNAPSHOT_HANDLER_TIMEOUT = 5;\n\n static defaultProps = {\n getDownloadWorker: (): Promise<never> =>\n Promise.reject(new Error('Download worker not provided')),\n isDownloading: false,\n onDownloadCompleted: (): void => undefined,\n onDownloadCanceled: (): void => undefined,\n onDownloadProgressUpdate: (): void => undefined,\n };\n\n static csvEscapeString(str: string): string {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n constructor(props: TableSaverProps) {\n super(props);\n\n this.handlePortMessage = this.handlePortMessage.bind(this);\n this.handleSnapshotResolved = this.handleSnapshotResolved.bind(this);\n this.handleDownloadTimeout = this.handleDownloadTimeout.bind(this);\n\n this.state = {};\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.includeColumnHeaders = true;\n this.useUnformattedValues = false;\n\n this.snapshotsTotal = 0;\n this.snapshotCounter = 0;\n this.snapshotsBuffer = new Map();\n\n this.currentSnapshotIndex = 0;\n this.snapshotPending = 0;\n this.cancelableSnapshots = [];\n\n // Due to an open issue in Chromium, readableStream.cancel() is never called when a user cancel the stream from Chromium's UI and the stream goes on even it's canceled.\n // Instead, we monitor the pull() behavior from the readableStream called when the stream wants more data to write.\n // If the stream doesn't pull for long enough time, chances are the stream is already canceled, so we stop the stream.\n // Issue ticket on Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=638494\n\n this.iframes = [];\n\n this.useBlobFallback = false;\n }\n\n componentDidMount(): void {\n const { getDownloadWorker } = this.props;\n getDownloadWorker()\n .then(sw => {\n log.info('found active service worker');\n this.sw = sw;\n this.sw.postMessage('ping'); // just to activate the service worker\n })\n .catch(error => {\n // if service worker is not available, use blob as fallback to download table csv\n log.warn('Download csv is not optimized.', error);\n this.useBlobFallback = true;\n });\n }\n\n componentWillUnmount(): void {\n if (this.iframes.length > 0) {\n this.iframes.forEach(iframe => {\n iframe.remove();\n });\n }\n if (this.streamTimeout) clearTimeout(this.streamTimeout);\n if (this.snapshotHandlerTimeout) clearTimeout(this.snapshotHandlerTimeout);\n }\n\n sw?: ServiceWorker;\n\n port?: MessagePort;\n\n fileWriter?: WritableStreamDefaultWriter<unknown>;\n\n table?: Table;\n\n tableSubscription?: TableViewportSubscription;\n\n columns?: readonly Column[];\n\n fileName?: string;\n\n includeColumnHeaders: boolean;\n\n useUnformattedValues: boolean;\n\n chunkRows?: number;\n\n gridRanges: readonly GridRange[];\n\n gridRangeCounter?: number;\n\n rangedSnapshotsTotal: readonly number[];\n\n rangedSnapshotCounter?: number;\n\n snapshotsTotal: number;\n\n snapshotCounter: number;\n\n snapshotsBuffer: Map<number, UpdateEventData>;\n\n currentSnapshotIndex: number;\n\n snapshotPending: number;\n\n cancelableSnapshots: (CancelablePromise<unknown> | null)[];\n\n // Due to an open issue in Chromium, readableStream.cancel() is never called when a user cancel the stream from Chromium's UI and the stream goes on even it's canceled.\n // Instead, we monitor the pull() behavior from the readableStream called when the stream wants more data to write.\n // If the stream doesn't pull for long enough time, chances are the stream is already canceled, so we stop the stream.\n // Issue ticket on Chromium: https://bugs.chromium.org/p/chromium/issues/detail?id=638494\n streamTimeout?: ReturnType<typeof setTimeout>;\n\n snapshotHandlerTimeout?: ReturnType<typeof setTimeout>;\n\n downloadStartTime?: number;\n\n iframes: HTMLIFrameElement[];\n\n useBlobFallback: boolean;\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n createWriterStream(\n port: MessagePort\n ): WritableStream<{\n rows?: string | undefined;\n header?: string | undefined;\n }> {\n // use blob fall back if it's safari\n const useBlob = this.useBlobFallback;\n const chunks = [] as BlobPart[];\n let encode: ((input?: string) => Uint8Array) | null = null;\n if (useBlob) {\n encode = TextEncoder.prototype.encode.bind(new TextEncoder());\n }\n const { fileName } = this;\n\n const streamConfig = {} as UnderlyingSink<{\n rows?: string | undefined;\n header?: string | undefined;\n }>;\n if (useBlob) {\n streamConfig.write = (chunk: { rows?: string; header?: string }) => {\n assertNotNull(encode);\n if (chunk.header !== undefined) {\n chunks.push(encode(chunk.header));\n }\n if (chunk.rows !== undefined) {\n chunks.push(encode(chunk.rows));\n }\n };\n streamConfig.close = () => {\n assertNotNull(fileName);\n const blob = new Blob(chunks, {\n type: 'application/octet-stream; charset=utf-8',\n });\n const link = document.createElement('a');\n link.href = URL.createObjectURL(blob);\n link.download = fileName;\n link.click();\n };\n streamConfig.abort = () => {\n port.postMessage({ cancel: true });\n port.close();\n };\n } else {\n streamConfig.write = (chunk: unknown) => {\n port.postMessage(chunk);\n };\n streamConfig.close = () => {\n port.postMessage({ end: true });\n port.close();\n };\n streamConfig.abort = () => {\n port.postMessage({ cancel: true });\n port.close();\n };\n }\n\n return new WritableStream(streamConfig);\n }\n\n startDownload(\n fileName: string,\n frozenTable: Table,\n tableSubscription: TableViewportSubscription,\n snapshotRanges: readonly GridRange[],\n modelRanges: readonly GridRange[],\n includeColumnHeaders: boolean,\n useUnformattedValues: boolean\n ): void {\n // don't trigger another download when a download is ongoing\n const { isDownloading } = this.props;\n if (isDownloading) {\n return;\n }\n\n this.downloadStartTime = Date.now();\n log.info(`start downloading ${fileName}`);\n\n this.table = frozenTable;\n this.columns = IrisGridUtils.columnsFromRanges(\n modelRanges,\n frozenTable.columns\n );\n this.tableSubscription = tableSubscription;\n this.gridRanges = snapshotRanges;\n this.includeColumnHeaders = includeColumnHeaders;\n this.useUnformattedValues = useUnformattedValues;\n\n // Make filename RFC5987 compatible\n const encodedFileName = encodeURIComponent(fileName.replace(/\\//g, ':'))\n .replace(/['()]/g, escape)\n .replace(/\\*/g, '%2A');\n\n const messageChannel = new MessageChannel();\n this.port = messageChannel.port1;\n this.fileName = fileName;\n this.fileWriter = this.createWriterStream(this.port).getWriter();\n\n // if the browser doesn't support stream or there's no active service worker, use blobs for table download\n if (this.useBlobFallback) {\n this.writeCsvTable(includeColumnHeaders);\n return;\n }\n\n if (this.sw) {\n // send file name and port to service worker\n this.sw.postMessage({ encodedFileName }, [messageChannel.port2]);\n }\n this.port.onmessage = this.handlePortMessage;\n }\n\n finishDownload(): void {\n if (this.table) {\n this.table.close();\n }\n if (this.tableSubscription) {\n this.tableSubscription.close();\n }\n if (this.fileWriter) {\n this.fileWriter.close();\n }\n\n const { onDownloadCompleted } = this.props;\n onDownloadCompleted();\n this.resetTableSaver();\n\n if (this.downloadStartTime !== undefined) {\n log.info(\n `download finished, total elapsed time ${\n (Date.now() - this.downloadStartTime) / 1000\n } seconds`\n );\n }\n }\n\n cancelDownload(): void {\n if (this.table) {\n this.table.close();\n }\n if (this.tableSubscription) {\n this.tableSubscription.close();\n }\n if (this.fileWriter) {\n this.fileWriter.abort();\n }\n\n this.cancelableSnapshots.forEach(cancelable => {\n if (cancelable) {\n cancelable.catch(() => null);\n cancelable.cancel();\n }\n });\n const { onDownloadCanceled } = this.props;\n onDownloadCanceled();\n this.resetTableSaver();\n }\n\n resetTableSaver(): void {\n this.table = undefined;\n this.tableSubscription = undefined;\n this.columns = undefined;\n this.chunkRows = undefined;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\n\n this.includeColumnHeaders = true;\n this.useUnformattedValues = false;\n\n this.snapshotsTotal = 0;\n this.snapshotCounter = 0;\n this.snapshotsBuffer = new Map();\n\n this.currentSnapshotIndex = 0;\n this.snapshotPending = 0;\n this.cancelableSnapshots = [];\n\n if (this.streamTimeout != null) {\n clearTimeout(this.streamTimeout);\n }\n\n if (this.snapshotHandlerTimeout != null) {\n clearTimeout(this.snapshotHandlerTimeout);\n }\n this.streamTimeout = undefined;\n this.snapshotHandlerTimeout = undefined;\n }\n\n handleDownloadTimeout(): void {\n log.info('download canceled');\n this.cancelDownload();\n }\n\n writeTableHeader(): void {\n let headerString = '';\n if (this.columns) {\n for (let i = 0; i < this.columns.length; i += 1) {\n headerString += this.columns[i].name;\n headerString += i === this.columns.length - 1 ? '\\n' : ',';\n }\n }\n this.fileWriter?.write({ header: headerString }).then(() => null);\n }\n\n startWriteTableBody(): void {\n if (this.columns && this.gridRanges != null) {\n this.chunkRows = Math.floor(\n TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length\n );\n\n this.rangedSnapshotsTotal = this.gridRanges.map((range: GridRange) => {\n assertNotNull(range.endRow);\n assertNotNull(range.startRow);\n assertNotNull(this.chunkRows);\n\n return Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows);\n });\n this.snapshotsTotal = this.rangedSnapshotsTotal.reduce(\n (total: number, snapshotCount: number) => total + snapshotCount\n );\n\n log.info(`start writing table, total snapshots: `, this.snapshotsTotal);\n\n this.makeSnapshot(\n Math.min(TableSaver.SNAPSHOT_BUFFER_SIZE, this.snapshotsTotal)\n );\n }\n }\n\n writeCsvTable(includeColumnHeaders: boolean): void {\n if (includeColumnHeaders) {\n this.writeTableHeader();\n }\n this.startWriteTableBody();\n }\n\n writeSnapshot(\n snapshotIndex: number,\n snapshotStartRow: GridRangeIndex,\n snapshotEndRow: GridRangeIndex\n ): void {\n if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {\n while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {\n const n = this.snapshotsBuffer.get(this.currentSnapshotIndex);\n assertNotNull(n);\n this.fileWriter.write({\n rows: this.convertSnapshotIntoCsv(n),\n });\n this.snapshotsBuffer.delete(this.currentSnapshotIndex);\n this.currentSnapshotIndex += 1;\n\n this.updateDownloadProgress(snapshotIndex);\n }\n if (\n this.snapshotsTotal &&\n this.currentSnapshotIndex >= this.snapshotsTotal\n ) {\n this.finishDownload();\n return;\n }\n }\n\n if (\n this.snapshotCounter &&\n this.snapshotsTotal &&\n this.snapshotCounter < this.snapshotsTotal\n ) {\n log.debug2(\n `\n current range index: ${this.gridRangeCounter}, \n snapshotIndexCounter: ${this.snapshotCounter}, \n currentRangedSnapshotIndex : ${this.rangedSnapshotCounter}, \n snapshotpending: ${this.snapshotPending}, \n buffered ${this.snapshotsBuffer.size}\n making ${Math.min(\n TableSaver.SNAPSHOT_BUFFER_SIZE -\n this.snapshotsBuffer.size -\n this.snapshotPending,\n this.snapshotsTotal - this.snapshotCounter\n )} more snapshots\n `\n );\n this.makeSnapshot(\n Math.min(\n TableSaver.SNAPSHOT_BUFFER_SIZE -\n this.snapshotsBuffer.size -\n this.snapshotPending,\n this.snapshotsTotal - this.snapshotCounter\n )\n );\n }\n }\n\n updateDownloadProgress(snapshotIndex: GridRangeIndex): void {\n if (\n snapshotIndex != null &&\n this.snapshotsTotal != null &&\n this.downloadStartTime != null\n ) {\n const { onDownloadProgressUpdate } = this.props;\n const downloadProgress = Math.floor(\n (snapshotIndex * 100) / this.snapshotsTotal\n );\n const estimateTime =\n snapshotIndex > 1\n ? Math.floor(\n ((Date.now() - this.downloadStartTime) *\n (this.snapshotsTotal - snapshotIndex)) /\n snapshotIndex /\n 1000\n )\n : null;\n\n onDownloadProgressUpdate(downloadProgress, estimateTime);\n }\n }\n\n convertSnapshotIntoCsv(snapshot: UpdateEventData): string {\n let csvString = '';\n const snapshotIterator = snapshot.added.iterator();\n const { dh, formatter } = this.props;\n\n const rows = [];\n while (snapshotIterator.hasNext()) {\n rows.push(snapshotIterator.next().value);\n }\n\n assertNotNull(this.columns);\n\n const { useUnformattedValues } = this;\n for (let i = 0; i < rows.length; i += 1) {\n const rowIdx = rows[i];\n for (let j = 0; j < this.columns.length; j += 1) {\n const { type, name } = this.columns[j];\n let cellData = null;\n if (useUnformattedValues) {\n let value = snapshot.getData(rowIdx, this.columns[j]) ?? '';\n if (value !== '' && TableUtils.isDateType(type)) {\n // value is just a long value, we should return the value formatted as a full date string\n value = dh.i18n.DateTimeFormat.format(\n UNFORMATTED_DATE_PATTERN,\n value as number | Date | DateWrapper,\n dh.i18n.TimeZone.getTimeZone(formatter.timeZone)\n );\n }\n cellData = value.toString();\n } else {\n const hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(\n formatter,\n name,\n type\n );\n let formatOverride = null;\n if (!hasCustomColumnFormat) {\n const cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);\n formatOverride =\n cellFormat?.formatString != null ? cellFormat : null;\n }\n if (formatOverride) {\n cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name,\n formatOverride\n );\n } else {\n cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name\n );\n }\n }\n csvString += TableSaver.csvEscapeString(cellData);\n csvString += j === this.columns.length - 1 ? '\\n' : ',';\n }\n }\n\n return csvString;\n }\n\n makeSnapshot(n: number): void {\n if (n <= 0) {\n return;\n }\n const { dh } = this.props;\n assertNotNull(this.gridRangeCounter);\n let i = 0;\n let currentGridRange = this.gridRanges[this.gridRangeCounter];\n\n assertNotNull(this.tableSubscription);\n assertNotNull(this.columns);\n while (i < n) {\n assertNotNull(currentGridRange);\n assertNotNull(currentGridRange.startRow);\n assertNotNull(currentGridRange.endRow);\n assertNotNull(this.rangedSnapshotCounter);\n assertNotNull(this.chunkRows);\n const snapshotStartRow =\n currentGridRange.startRow + this.rangedSnapshotCounter * this.chunkRows;\n const snapshotEndRow = Math.min(\n snapshotStartRow + this.chunkRows - 1,\n currentGridRange.endRow\n );\n\n const snapshotIndex = this.snapshotCounter;\n this.cancelableSnapshots.push(\n PromiseUtils.makeCancelable(\n this.tableSubscription\n .snapshot(\n dh.RangeSet.ofRange(snapshotStartRow, snapshotEndRow),\n this.columns\n )\n .then(snapshot => {\n assertIsUpdateEventData(snapshot);\n this.handleSnapshotResolved(\n snapshot,\n snapshotIndex,\n snapshotStartRow,\n snapshotEndRow\n );\n\n return snapshotIndex;\n })\n .catch(err => {\n log.error(err);\n }),\n val => {\n log.info(`snapshot ${val} has been canceled`);\n }\n )\n );\n\n this.rangedSnapshotCounter += 1;\n this.snapshotCounter += 1;\n this.snapshotPending += 1;\n\n if (\n this.rangedSnapshotCounter >=\n this.rangedSnapshotsTotal[this.gridRangeCounter]\n ) {\n this.gridRangeCounter += 1;\n this.rangedSnapshotCounter = 0;\n currentGridRange = this.gridRanges[this.gridRangeCounter];\n }\n i += 1;\n }\n }\n\n handlePortMessage({\n data,\n }: MessageEvent<{\n download: unknown;\n readableStreamPulling: unknown;\n }>): void {\n const { download, readableStreamPulling } = data;\n if (this.useBlobFallback) {\n return;\n }\n if (download != null) {\n const { includeColumnHeaders } = this;\n this.makeIframe(`${download}`);\n this.writeCsvTable(includeColumnHeaders);\n }\n if (readableStreamPulling != null) {\n if (!this.useBlobFallback) {\n if (this.streamTimeout != null) {\n clearTimeout(this.streamTimeout);\n }\n this.streamTimeout = setTimeout(\n this.handleDownloadTimeout,\n TableSaver.STREAM_TIMEOUT\n );\n }\n }\n }\n\n handleSnapshotResolved(\n snapshot: UpdateEventData,\n snapshotIndex: number,\n snapshotStartRow: GridRangeIndex,\n snapshotEndRow: GridRangeIndex\n ): void {\n // use time out to break writeSnapshot into an individual task in browser with timeout, so there's window for the browser to update table in needed.\n this.snapshotHandlerTimeout = setTimeout(() => {\n this.snapshotsBuffer.set(snapshotIndex, snapshot);\n this.snapshotPending -= 1;\n this.writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow);\n this.cancelableSnapshots[snapshotIndex] = null;\n }, TableSaver.SNAPSHOT_HANDLER_TIMEOUT);\n }\n\n makeIframe(src: string): void {\n // make a return value and make it static method\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n iframe.src = `download/${src}`;\n iframe.name = 'iframe';\n document.body.appendChild(iframe);\n this.iframes.push(iframe);\n }\n\n render(): null {\n return null;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/* stylelint-disable scss/at-import-no-partial-leading-underscore */
|
|
2
|
+
.aggregation-edit {
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
height: 100%;
|
|
6
|
+
}
|
|
7
|
+
.aggregation-edit .top-menu {
|
|
8
|
+
background-color: #373438;
|
|
9
|
+
padding: 0 0.5rem;
|
|
10
|
+
}
|
|
11
|
+
.aggregation-edit .top-menu .form-inline .custom-control {
|
|
12
|
+
padding-top: 0.5rem;
|
|
13
|
+
padding-bottom: 0.5rem;
|
|
14
|
+
}
|
|
15
|
+
.aggregation-edit .top-menu .form-inline .custom-control label {
|
|
16
|
+
justify-content: left;
|
|
17
|
+
}
|
|
18
|
+
.aggregation-edit .top-menu .form-inline .spacer {
|
|
19
|
+
flex-grow: 1;
|
|
20
|
+
}
|
|
21
|
+
.aggregation-edit .top-menu .btn-link-icon {
|
|
22
|
+
color: #929192;
|
|
23
|
+
}
|
|
24
|
+
.aggregation-edit .top-menu .btn-link-icon.active {
|
|
25
|
+
color: #f0f0ee;
|
|
26
|
+
}
|
|
27
|
+
.aggregation-edit .aggregation-edit-item-list {
|
|
28
|
+
flex-grow: 1;
|
|
29
|
+
}
|
|
30
|
+
.aggregation-edit .aggregation-edit-item-list .item-list-scroll-pane {
|
|
31
|
+
border: none;
|
|
32
|
+
}
|
|
33
|
+
.aggregation-edit .aggregation-edit-item-list .item-list-scroll-pane .item-list-item {
|
|
34
|
+
padding-left: 0.5rem;
|
|
35
|
+
padding-right: 0.5rem;
|
|
36
|
+
display: flex;
|
|
37
|
+
}
|
|
38
|
+
.aggregation-edit .aggregation-edit-item-list .item-list-scroll-pane .item-list-item:hover label {
|
|
39
|
+
background-color: #5b5a5c;
|
|
40
|
+
color: #f0f0ee;
|
|
41
|
+
}
|
|
42
|
+
.aggregation-edit .aggregation-edit-item-list .item-list-scroll-pane .item-list-item .custom-control {
|
|
43
|
+
flex-grow: 1;
|
|
44
|
+
display: flex;
|
|
45
|
+
}
|
|
46
|
+
.aggregation-edit .aggregation-edit-item-list .item-list-scroll-pane .item-list-item .custom-control label {
|
|
47
|
+
padding-top: 1px;
|
|
48
|
+
padding-left: 0.5rem;
|
|
49
|
+
padding-right: 0.5rem;
|
|
50
|
+
flex-grow: 1;
|
|
51
|
+
border-radius: 4px;
|
|
52
|
+
margin-bottom: 0.5rem;
|
|
53
|
+
border: 1px solid transparent;
|
|
54
|
+
}
|
|
55
|
+
.aggregation-edit .aggregation-edit-item-list .item-list-scroll-pane .item-list-item .custom-control:focus-within label,
|
|
56
|
+
.aggregation-edit .aggregation-edit-item-list .item-list-scroll-pane .item-list-item .custom-control input[type=checkbox]:active + label {
|
|
57
|
+
background-color: rgba(72, 120, 234, 0.4);
|
|
58
|
+
color: #f0f0ee;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/*# sourceMappingURL=AggregationEdit.css.map */
|