@deephaven/iris-grid 0.11.6 → 0.11.7-beta.2
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/IrisGridTableModel.js +1 -1
- package/dist/IrisGridTableModel.js.map +1 -1
- package/dist/sidebar/TableSaver.js +1 -1
- package/dist/sidebar/TableSaver.js.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.d.ts.map +1 -1
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js +5 -4
- package/dist/sidebar/conditional-formatting/ConditionalFormattingUtils.js.map +1 -1
- package/package.json +12 -12
|
@@ -410,7 +410,7 @@ class IrisGridTableModel extends IrisGridModel {
|
|
|
410
410
|
}
|
|
411
411
|
|
|
412
412
|
var column = (_this$totalsColumn = this.totalsColumn(x, y)) !== null && _this$totalsColumn !== void 0 ? _this$totalsColumn : this.columns[x];
|
|
413
|
-
var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(this.formatter, column.
|
|
413
|
+
var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(this.formatter, column.name, column.type);
|
|
414
414
|
var formatOverride = null;
|
|
415
415
|
|
|
416
416
|
if (!hasCustomColumnFormat) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/IrisGridTableModel.js"],"names":["memoize","throttle","GridRange","memoizeClear","dh","Log","PromiseUtils","TableUtils","Formatter","FormatterUtils","IrisGridModel","AggregationOperation","IrisGridUtils","MissingKeyError","log","module","SET_VIEWPORT_THROTTLE","APPLY_VIEWPORT_THROTTLE","IrisGridTableModel","constructor","table","formatter","inputTable","columnMap","frontColumns","backColumns","frozenColumns","columns","values","length","finalFrontColumns","finalBackColumns","finalFrozenColumns","map","name","get","filter","Boolean","Error","frontColumnSet","Set","backColumnSet","frozenColumnSet","middleColumns","col","has","tableColumns","Map","forEach","set","layoutHintsFrontColumns","layoutHintsBackColumns","layoutHintsFrozenColumns","userFrozenColumns","indices","i","_","index","value","columnType","columnName","formatOverride","getFormattedString","max","isCustomColumnFormatDefined","top","bottom","viewHeight","viewportTop","Math","ROW_BUFFER_PAGES","viewportBottom","pendingDataMap","keyColumnCount","row","rowIndex","data","rowData","push","handleTableDisconnect","bind","handleTableReconnect","handleTableUpdate","handleTotalsUpdate","handleRequestFailed","handleCustomColumnsChanged","setViewport","applyViewport","leading","irisFormatter","listenerCount","subscription","viewport","viewportData","formattedStringData","pendingStringData","isSaveInProgress","totalsTable","totalsTablePromise","totals","totalsDataMap","customColumnList","formatColumnList","pendingNewDataMap","pendingNewRowCount","close","cancel","startListening","addEventListener","Table","EVENT_DISCONNECT","EVENT_RECONNECT","EVENT_UPDATED","Client","EVENT_REQUEST_FAILED","EVENT_CUSTOMCOLUMNSCHANGED","addTotalsListeners","stopListening","removeEventListener","removeTotalsListeners","closeSubscription","dispatchEvent","CustomEvent","EVENT","DISCONNECT","RECONNECT","event","copyViewportData","detail","UPDATED","copyTotalsData","REQUEST_FAILED","COLUMNS_CHANGED","rowCount","size","operationOrder","pendingDataErrors","getCachedPendingErrors","keyColumns","isValidIndex","columnIndex","maxPendingDataRow","PENDING_DATA_UPDATED","pendingRowCount","count","keys","columnCount","floatingBottomRowCount","showOnTop","floatingTopRowCount","isExportAvailable","freeze","isColumnStatisticsAvailable","getColumnStatistics","isValuesTableAvailable","selectDistinct","copy","isRollupAvailable","rollup","isSelectDistinctAvailable","isCustomColumnsAvailable","applyCustomColumns","isFormatColumnsAvailable","isChartBuilderAvailable","isTotalsAvailable","getTotalsTable","isEditable","cacheFormattedValue","x","y","text","cachePendingValue","clearPendingValue","column","textValueForCell","undefined","valueForCell","totalsColumn","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","type","formatForCell","formatString","displayString","textForCell","isKeyColumn","pendingRow","truncationCharForCell","isNumberType","truncateNumbersWithPound","colorForCell","theme","dataForCell","format","nullStringColor","color","isPendingRow","pendingTextColor","isDateType","dateColor","positiveNumberColor","negativeNumberColor","zeroNumberColor","errorTextColor","textColor","backgroundColorForCell","backgroundColor","textAlignForCell","textForColumnHeader","textForRowFooter","totalsRow","getColumnsWithLayoutHints","getMemoizedColumnMap","getMemoizedFrontColumns","layoutHints","getMemoizedBackColumns","getMemoizedFrozenColumns","floatingLeftColumnCount","groupedColumns","description","totalsRowCount","operation","offset","viewportY","rows","defaultOperation","SUM","tableColumn","find","isTotalsRow","warn","extractViewportData","totalsData","error","dataMap","operationMap","c","split","findIndex","getFormat","debug2","getColumnIndexByName","getColumnIndicesByNameMap","newData","r","newRow","extractViewportRow","applyFilter","FORMATTER_UPDATED","getCachedFormattedString","sort","applySort","customColumns","debug","formatColumns","updateFrozenColumns","TABLE_CHANGED","totalsConfig","setTotalsTable","makeCancelable","then","catch","err","isCanceled","getCachedViewportRowRange","applyBufferedViewport","snapshot","ranges","includeHeaders","formatValue","consolidated","consolidate","isValidSnapshotRanges","topFloatingRowsSet","tableRanges","bottomFloatingRowsSet","range","startRow","endRow","add","startColumn","min","endColumn","columnsFromRanges","result","topFloatingRows","rangeSet","rangeSetFromRanges","bottomFloatingRows","textSnapshot","join","isFilterRequired","isUncoalesced","isFilterable","getCachedFilterableColumnSet","valuesTable","export","columnStatistics","isColumnMovable","includes","isColumnFrozen","isRowMovable","isEditableRange","isBounded","isDeletableRange","isEditableRanges","every","isDeletableRanges","getTableAreaRange","getPendingAreaRange","setValueForCell","setValueForRanges","columnSet","formattedText","forEachCell","makeValue","timeZone","pendingAreaRange","pendingRanges","intersection","newDataMap","newRowData","delete","tableAreaRange","newRows","addRows","setValues","edits","edit","makeCell","rowEditMap","reduce","rowMap","dataIndex","rangeRowCount","rowEdits","info","commitPending","pendingNewDataErrors","editValueForCell","pendingRange","deleteTable","Promise","all","filters","columnFilters","filterValue","makeFilterRawValue","eq","agg","curr","and","or","isValidForCell","e"],"mappings":"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","sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport memoize from 'memoize-one';\nimport throttle from 'lodash.throttle';\nimport { GridRange, memoizeClear } from '@deephaven/grid';\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport TableUtils from './TableUtils';\nimport Formatter from './Formatter';\nimport FormatterUtils from './FormatterUtils';\nimport IrisGridModel from './IrisGridModel';\nimport AggregationOperation from './sidebar/aggregations/AggregationOperation';\nimport IrisGridUtils from './IrisGridUtils';\nimport MissingKeyError from './MissingKeyError';\n\nconst log = Log.module('IrisGridTableModel');\n\nconst SET_VIEWPORT_THROTTLE = 150;\nconst APPLY_VIEWPORT_THROTTLE = 0;\n\n/**\n * Model for a grid showing an iris data table\n */\nclass IrisGridTableModel extends IrisGridModel {\n static ROW_BUFFER_PAGES = 1;\n\n static COLUMN_BUFFER_PAGES = 0;\n\n /**\n * @param {dh.Table} table Iris data table to be used in the model\n * @param {Formatter} formatter The formatter to use when getting formats\n * @param {dh.InputTable} inputTable Iris input table associated with this table\n */\n constructor(table, formatter = new Formatter(), inputTable = null) {\n super();\n\n this.handleTableDisconnect = this.handleTableDisconnect.bind(this);\n this.handleTableReconnect = this.handleTableReconnect.bind(this);\n this.handleTableUpdate = this.handleTableUpdate.bind(this);\n this.handleTotalsUpdate = this.handleTotalsUpdate.bind(this);\n this.handleRequestFailed = this.handleRequestFailed.bind(this);\n this.handleCustomColumnsChanged = this.handleCustomColumnsChanged.bind(\n this\n );\n this.setViewport = throttle(\n this.setViewport.bind(this),\n SET_VIEWPORT_THROTTLE\n );\n this.applyViewport = throttle(\n this.applyViewport.bind(this),\n APPLY_VIEWPORT_THROTTLE,\n { leading: false }\n );\n\n this.irisFormatter = formatter;\n this.inputTable = inputTable;\n this.listenerCount = 0;\n this.subscription = null;\n this.table = table;\n this.viewport = null;\n this.viewportData = null;\n this.formattedStringData = [];\n this.pendingStringData = [];\n this.isSaveInProgress = false;\n\n this.totalsTable = null;\n this.totalsTablePromise = null;\n this.totals = null;\n this.totalsDataMap = null;\n\n this.customColumnList = [];\n this.formatColumnList = [];\n\n // Map from new row index to their values. Only for input tables that can have new rows added.\n // The index of these rows start at 0, and they are appended at the end of the regular table data.\n // These rows can be sparse, so using a map instead of an array.\n this.pendingNewDataMap = new Map();\n this.pendingNewRowCount = 0;\n\n this.userFrozenColumns = null;\n }\n\n close() {\n this.table.close();\n if (this.totalsTable !== null) {\n this.totalsTable.close();\n }\n if (this.totalsTablePromise !== null) {\n this.totalsTablePromise.cancel();\n }\n }\n\n startListening() {\n super.startListening();\n\n this.table.addEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleTableDisconnect\n );\n this.table.addEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleTableReconnect\n );\n this.table.addEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n this.table.addEventListener(\n dh.Client.EVENT_REQUEST_FAILED,\n this.handleRequestFailed\n );\n this.table.addEventListener(\n dh.Table.EVENT_CUSTOMCOLUMNSCHANGED,\n this.handleCustomColumnsChanged\n );\n\n if (this.totalsTable != null) {\n this.addTotalsListeners(this.totalsTable);\n }\n\n this.applyViewport();\n }\n\n stopListening() {\n super.stopListening();\n\n this.table.removeEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleTableDisconnect\n );\n this.table.removeEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleTableReconnect\n );\n this.table.removeEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleTableUpdate\n );\n this.table.removeEventListener(\n dh.Client.EVENT_REQUEST_FAILED,\n this.handleRequestFailed\n );\n this.table.removeEventListener(\n dh.Table.EVENT_CUSTOMCOLUMNSCHANGED,\n this.handleCustomColumnsChanged\n );\n\n if (this.totalsTable != null) {\n this.removeTotalsListeners(this.totalsTable);\n }\n\n this.closeSubscription();\n }\n\n addTotalsListeners(totalsTable) {\n totalsTable.addEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleTotalsUpdate\n );\n\n // Totals table only has one row of data\n totalsTable.setViewport(0, 0);\n }\n\n removeTotalsListeners(totalsTable) {\n totalsTable.removeEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleTotalsUpdate\n );\n }\n\n handleTableDisconnect() {\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.DISCONNECT));\n }\n\n handleTableReconnect() {\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.RECONNECT));\n }\n\n handleTableUpdate(event) {\n this.copyViewportData(event.detail);\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n handleTotalsUpdate(event) {\n this.copyTotalsData(event.detail);\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n handleRequestFailed(event) {\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.REQUEST_FAILED, event)\n );\n }\n\n handleCustomColumnsChanged() {\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.COLUMNS_CHANGED, {\n detail: this.columns,\n })\n );\n }\n\n get rowCount() {\n return (\n this.table.size +\n (this.totals?.operationOrder?.length ?? 0) +\n this.pendingNewRowCount\n );\n }\n\n get pendingDataErrors() {\n return this.getCachedPendingErrors(\n this.pendingNewDataMap,\n this.columns,\n this.inputTable?.keyColumns.length ?? 0\n );\n }\n\n get pendingDataMap() {\n return this.pendingNewDataMap;\n }\n\n set pendingDataMap(map) {\n if (map === this.pendingNewDataMap) {\n return;\n }\n\n map.forEach((row, rowIndex) => {\n if (!IrisGridUtils.isValidIndex(rowIndex)) {\n throw new Error('Invalid rowIndex', rowIndex);\n }\n\n const { data } = row;\n data.forEach((value, columnIndex) => {\n if (!IrisGridUtils.isValidIndex(columnIndex)) {\n throw new Error('Invalid columnIndex', columnIndex);\n }\n });\n });\n\n this.pendingNewDataMap = map;\n\n this.pendingNewRowCount = Math.max(\n this.pendingNewRowCount,\n this.maxPendingDataRow\n );\n\n this.formattedStringData = [];\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED)\n );\n }\n\n get pendingRowCount() {\n return this.pendingNewRowCount;\n }\n\n set pendingRowCount(count) {\n if (count === this.pendingNewRowCount) {\n return;\n }\n\n this.pendingNewRowCount = Math.max(0, count, this.maxPendingDataRow);\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n get maxPendingDataRow() {\n return this.pendingNewDataMap.size > 0\n ? Math.max(...this.pendingNewDataMap.keys()) + 1\n : 0;\n }\n\n get columnCount() {\n return this.columns.length;\n }\n\n get floatingBottomRowCount() {\n return this.totals?.showOnTop\n ? 0\n : this.totals?.operationOrder?.length ?? 0;\n }\n\n get floatingTopRowCount() {\n return this.totals?.showOnTop\n ? this.totals?.operationOrder?.length ?? 0\n : 0;\n }\n\n get isExportAvailable() {\n return this.table.freeze != null;\n }\n\n get isColumnStatisticsAvailable() {\n return this.table.getColumnStatistics != null;\n }\n\n get isValuesTableAvailable() {\n return this.table.selectDistinct != null && this.table.copy != null;\n }\n\n get isRollupAvailable() {\n return this.table.rollup != null;\n }\n\n get isSelectDistinctAvailable() {\n return this.table.selectDistinct != null;\n }\n\n get isCustomColumnsAvailable() {\n return this.table.applyCustomColumns != null;\n }\n\n get isFormatColumnsAvailable() {\n return this.table.applyCustomColumns != null;\n }\n\n get isChartBuilderAvailable() {\n return true;\n }\n\n get isTotalsAvailable() {\n return this.table.getTotalsTable != null;\n }\n\n get isEditable() {\n return !this.isSaveInProgress && this.inputTable != null;\n }\n\n cacheFormattedValue(x, y, text) {\n if (this.formattedStringData[x] == null) {\n this.formattedStringData[x] = [];\n }\n this.formattedStringData[x][y] = text;\n }\n\n cachePendingValue(x, y, text) {\n if (this.pendingStringData[x] == null) {\n this.pendingStringData[x] = [];\n }\n this.pendingStringData[x][y] = text;\n }\n\n clearPendingValue(x, y) {\n const column = this.pendingStringData[x];\n if (column != null) {\n delete column[y];\n }\n }\n\n textValueForCell(x, y) {\n // First check if there's any pending values we should read from\n if (this.pendingStringData[x]?.[y] !== undefined) {\n return this.pendingStringData[x][y];\n }\n\n // Use a separate cache from memoization just for the strings that are currently displayed\n if (this.formattedStringData[x]?.[y] === undefined) {\n const value = this.valueForCell(x, y);\n if (value == null) {\n return null;\n }\n\n const column = this.totalsColumn(x, y) ?? this.columns[x];\n const hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(\n this.formatter,\n column.type,\n column.name\n );\n let formatOverride = null;\n if (!hasCustomColumnFormat) {\n const formatForCell = this.formatForCell(x, y);\n if (formatForCell?.formatString != null) {\n formatOverride = formatForCell;\n }\n }\n const text = this.displayString(\n value,\n column.type,\n column.name,\n formatOverride\n );\n this.cacheFormattedValue(x, y, text);\n }\n\n return this.formattedStringData[x][y];\n }\n\n textForCell(x, y) {\n const text = this.textValueForCell(x, y);\n if (text == null && this.isKeyColumn(x)) {\n const pendingRow = this.pendingRow(y);\n if (this.pendingDataMap.has(pendingRow)) {\n // Asterisk to show a value is required for a key column on a row that has some data entered\n return '*';\n }\n }\n return text;\n }\n\n truncationCharForCell(x) {\n const column = this.columns[x];\n const { type } = column;\n if (\n TableUtils.isNumberType(type) &&\n this.formatter.truncateNumbersWithPound\n ) {\n return '#';\n }\n\n return undefined;\n }\n\n colorForCell(x, y, theme) {\n const data = this.dataForCell(x, y);\n if (data) {\n const { format, value } = data;\n if (value == null || value === '') {\n return theme.nullStringColor;\n }\n if (format && format.color) {\n return format.color;\n }\n\n if (this.isPendingRow(y)) {\n // Data entered in a pending row\n return theme.pendingTextColor;\n }\n\n // Fallback to formatting based on the value/type of the cell\n if (value != null) {\n const column = this.totalsColumn(x, y) ?? this.columns[x];\n if (TableUtils.isDateType(column.type) || column.name === 'Date') {\n return theme.dateColor;\n }\n if (TableUtils.isNumberType(column.type)) {\n if (value > 0) {\n return theme.positiveNumberColor;\n }\n if (value < 0) {\n return theme.negativeNumberColor;\n }\n return theme.zeroNumberColor;\n }\n }\n } else if (this.isPendingRow(y) && this.isKeyColumn(x)) {\n return theme.errorTextColor;\n }\n\n return theme.textColor;\n }\n\n backgroundColorForCell(x, y) {\n return this.formatForCell(x, y)?.backgroundColor;\n }\n\n textAlignForCell(x) {\n const column = this.columns[x];\n const { type } = column;\n\n if (TableUtils.isNumberType(type)) {\n return 'right';\n }\n if (TableUtils.isDateType(type) || column.name === 'Date') {\n return 'center';\n }\n return 'left';\n }\n\n textForColumnHeader(x) {\n const column = this.columns[x];\n return `${column.name}`;\n }\n\n textForRowFooter(y) {\n const totalsRow = this.totalsRow(y);\n if (totalsRow != null) {\n return this.totals.operationOrder[totalsRow];\n }\n return '';\n }\n\n getColumnsWithLayoutHints = memoize(\n (columnMap, frontColumns, backColumns, frozenColumns) => {\n const columns = [...columnMap.values()];\n if (frontColumns.length || backColumns.length || frozenColumns.length) {\n let finalFrontColumns = [];\n let finalBackColumns = [];\n let finalFrozenColumns = [];\n\n if (frontColumns.length) {\n finalFrontColumns = frontColumns\n .map(name => columnMap.get(name))\n .filter(Boolean);\n }\n if (backColumns.length) {\n finalBackColumns = backColumns\n .map(name => columnMap.get(name))\n .filter(Boolean);\n }\n if (frozenColumns.length) {\n finalFrozenColumns = frozenColumns\n .map(name => columnMap.get(name))\n .filter(Boolean);\n }\n\n if (\n finalFrontColumns.length !== frontColumns.length ||\n finalBackColumns.length !== backColumns.length ||\n finalFrozenColumns.length !== frozenColumns.length\n ) {\n throw new Error(\n 'Layout hints are invalid (contain invalid column names)'\n );\n }\n\n const frontColumnSet = new Set(finalFrontColumns);\n const backColumnSet = new Set(finalBackColumns);\n const frozenColumnSet = new Set(finalFrozenColumns);\n const middleColumns = columns.filter(\n col =>\n !frontColumnSet.has(col) &&\n !backColumnSet.has(col) &&\n !frozenColumnSet.has(col)\n );\n\n return [\n ...finalFrozenColumns,\n ...finalFrontColumns,\n ...middleColumns,\n ...finalBackColumns,\n ];\n }\n return columns;\n }\n );\n\n get columns() {\n return this.getColumnsWithLayoutHints(\n this.columnMap,\n this.frontColumns,\n this.backColumns,\n this.frozenColumns\n );\n }\n\n getMemoizedColumnMap = memoize(tableColumns => {\n const columnMap = new Map();\n tableColumns.forEach(col => columnMap.set(col.name, col));\n return columnMap;\n });\n\n get columnMap() {\n return this.getMemoizedColumnMap(this.table.columns);\n }\n\n getMemoizedFrontColumns = memoize(\n layoutHintsFrontColumns => layoutHintsFrontColumns ?? []\n );\n\n get frontColumns() {\n return this.getMemoizedFrontColumns(this.layoutHints?.frontColumns);\n }\n\n getMemoizedBackColumns = memoize(\n layoutHintsBackColumns => layoutHintsBackColumns ?? []\n );\n\n get backColumns() {\n return this.getMemoizedBackColumns(this.layoutHints?.backColumns);\n }\n\n getMemoizedFrozenColumns = memoize(\n (layoutHintsFrozenColumns, userFrozenColumns) =>\n userFrozenColumns ?? layoutHintsFrozenColumns ?? []\n );\n\n get frozenColumns() {\n return this.getMemoizedFrozenColumns(\n this.layoutHints?.frozenColumns,\n this.userFrozenColumns\n );\n }\n\n get layoutHints() {\n return this.table.layoutHints;\n }\n\n get floatingLeftColumnCount() {\n return this.frozenColumns.length;\n }\n\n get groupedColumns() {\n return [];\n }\n\n get description() {\n return this.table.description;\n }\n\n row(y) {\n const totalsRowCount = this.totals?.operationOrder?.length ?? 0;\n const showOnTop = this.totals?.showOnTop ?? false;\n const totalsRow = this.totalsRow(y);\n if (totalsRow != null) {\n const operation = this.totals.operationOrder[totalsRow];\n return this.totalsDataMap?.get(operation) ?? null;\n }\n const pendingRow = this.pendingRow(y);\n if (pendingRow != null) {\n return this.pendingNewDataMap.get(pendingRow) ?? null;\n }\n const offset = this.viewportData?.offset ?? 0;\n const viewportY = (showOnTop ? y - totalsRowCount : y) - offset;\n return this.viewportData?.rows?.[viewportY] ?? null;\n }\n\n /**\n * Retrieve the totals column if this is a totals row, or null otherwise\n * @param {ModelIndex} x Column index to get the totals column from\n * @param {ModelIndex} y Row index to get the totals column from\n * @returns {dh.Column | null}\n */\n totalsColumn(x, y) {\n const totalsRow = this.totalsRow(y);\n if (totalsRow == null) return null;\n\n const operation = this.totals.operationOrder[totalsRow];\n const defaultOperation =\n this.totals?.defaultOperation ?? AggregationOperation.SUM;\n const tableColumn = this.columns[x];\n return this.totalsTable.columns.find(\n column =>\n column.name === `${tableColumn.name}__${operation}` ||\n (operation === defaultOperation && column.name === tableColumn.name)\n );\n }\n\n /**\n * Translate from the row in the model to a row in the totals table.\n * If the row is not a totals row, return null\n * @param {number} y The row in the model to get the totals row for\n * @returns {number|null} The row within the totals table if it's a totals row, null otherwise\n */\n totalsRow(y) {\n const totalsRowCount = this.totals?.operationOrder?.length ?? 0;\n const showOnTop = this.totals?.showOnTop ?? false;\n const totalsRow = showOnTop ? y : y - this.table.size;\n if (totalsRow >= 0 && totalsRow < totalsRowCount) {\n return totalsRow;\n }\n return null;\n }\n\n /**\n * Translate from the row in the model to a pending input row.\n * If the row is not a pending input row, return null\n * @param {number} y The row in the model to get the pending row for\n * @returns {number|null} The row within the pending input rows if it's a pending row, null otherwise\n */\n pendingRow(y) {\n const pendingRow = y - this.floatingTopRowCount - this.table.size;\n if (pendingRow >= 0 && pendingRow < this.pendingNewRowCount) {\n return pendingRow;\n }\n\n return null;\n }\n\n /**\n * Check if a row is a totals table row\n * @param {number} y The row in the model to check if it's a totals table row\n * @returns {boolean} True if the row is a totals row, false if not\n */\n isTotalsRow(y) {\n return this.totalsRow(y) != null;\n }\n\n /**\n * Check if a row is a pending input row\n * @param {number} y The row in the model to check if it's a pending new row\n * @returns {boolean} True if the row is a pending new row, false if not\n */\n isPendingRow(y) {\n return this.pendingRow(y) != null;\n }\n\n dataForCell(x, y) {\n return this.row(y)?.data.get(x);\n }\n\n formatForCell(x, y) {\n return this.dataForCell(x, y)?.format;\n }\n\n valueForCell(x, y) {\n const data = this.dataForCell(x, y);\n if (data) {\n return data.value ?? null;\n }\n return undefined;\n }\n\n copyViewportData(data) {\n if (!data) {\n log.warn('invalid data!');\n return;\n }\n\n this.viewportData = this.extractViewportData(data);\n this.formattedStringData = [];\n }\n\n copyTotalsData(totalsData) {\n if (!totalsData) {\n log.warn('invalid data!');\n return;\n }\n\n const { columns, rows } = totalsData;\n if (rows.length !== 1) {\n log.error(\n 'Unexpected number of rows received for totals table, ignoring update'\n );\n return;\n }\n\n const dataMap = new Map();\n const row = rows[0];\n const defaultOperation =\n this.totals?.defaultOperation ?? AggregationOperation.SUM;\n const operationMap = this.totals?.operationMap;\n for (let c = 0; c < columns.length; c += 1) {\n const column = columns[c];\n const [\n name,\n operation = operationMap?.[name]?.[0] ?? defaultOperation,\n ] = column.name.split('__');\n if (!dataMap.has(operation)) {\n dataMap.set(operation, { data: new Map() });\n }\n const { data: rowData } = dataMap.get(operation);\n const columnIndex = this.columns.findIndex(col => col.name === name);\n rowData.set(columnIndex, {\n value: row.get(column),\n format: row.getFormat(column),\n });\n }\n\n log.debug2('copyTotalsData', dataMap);\n\n this.totalsDataMap = dataMap;\n this.formattedStringData = [];\n }\n\n /**\n * Use this as the canonical column index since things like layoutHints could have\n * changed the column order.\n */\n getColumnIndexByName(name) {\n return this.getColumnIndicesByNameMap(this.columns).get(name);\n }\n\n getColumnIndicesByNameMap = memoize(columns => {\n const indices = new Map();\n columns.forEach(({ name }, i) => indices.set(name, i));\n return indices;\n });\n\n /**\n * Copies all the viewport data into an object that we can reference later.\n * @param {ViewportData} data The data to copy from\n */\n extractViewportData(data) {\n const newData = {\n offset: data.offset,\n rows: [],\n };\n\n const { columns } = data;\n for (let r = 0; r < data.rows.length; r += 1) {\n const row = data.rows[r];\n const newRow = this.extractViewportRow(row, columns);\n newData.rows.push(newRow);\n }\n\n return newData;\n }\n\n extractViewportRow(row, columns) {\n const data = new Map();\n for (let c = 0; c < columns.length; c += 1) {\n const column = columns[c];\n\n data.set(this.getColumnIndexByName(column.name), {\n value: row.get(column),\n format: row.getFormat(column),\n });\n }\n\n return { data };\n }\n\n closeSubscription() {\n log.debug2('closeSubscription', this.subscription);\n if (this.subscription) {\n this.subscription.close();\n this.subscription = null;\n }\n\n this.setViewport.cancel();\n this.applyViewport.cancel();\n }\n\n get filter() {\n return this.table.filter;\n }\n\n set filter(filter) {\n this.closeSubscription();\n this.table.applyFilter(filter);\n this.applyViewport();\n }\n\n get formatter() {\n return this.irisFormatter;\n }\n\n set formatter(formatter) {\n this.irisFormatter = formatter;\n this.formattedStringData = [];\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.FORMATTER_UPDATED));\n }\n\n displayString(value, columnType, columnName = '', formatOverride = null) {\n return this.getCachedFormattedString(\n this.formatter,\n value,\n columnType,\n columnName,\n formatOverride\n );\n }\n\n get sort() {\n return this.table.sort;\n }\n\n set sort(sort) {\n this.closeSubscription();\n this.table.applySort(sort);\n this.applyViewport();\n }\n\n get customColumns() {\n return this.customColumnList;\n }\n\n set customColumns(customColumns) {\n log.debug2(\n 'set customColumns',\n customColumns,\n this.customColumnList,\n customColumns === this.customColumnList\n );\n if (this.customColumnList.length === 0 && customColumns.length === 0) {\n log.debug('Ignore empty initial customColumns');\n this.customColumnList = customColumns;\n return;\n }\n if (this.customColumnList === customColumns) {\n log.debug('Ignore same customColumns');\n return;\n }\n this.closeSubscription();\n this.customColumnList = customColumns;\n this.table.applyCustomColumns([...customColumns, ...this.formatColumns]);\n this.applyViewport();\n }\n\n get formatColumns() {\n return this.formatColumnList;\n }\n\n set formatColumns(formatColumns) {\n log.debug2(\n 'set formatColumns',\n formatColumns,\n this.formatColumnList,\n formatColumns === this.formatColumnList\n );\n if (this.formatColumnList.length === 0 && formatColumns.length === 0) {\n log.debug('Ignore empty initial formatColumns');\n this.formatColumnList = formatColumns;\n return;\n }\n if (this.formatColumnList === formatColumns) {\n log.debug('Ignore same formatColumns');\n return;\n }\n this.closeSubscription();\n this.formatColumnList = formatColumns;\n this.table.applyCustomColumns([...this.customColumns, ...formatColumns]);\n this.applyViewport();\n }\n\n updateFrozenColumns(columns) {\n this.userFrozenColumns = columns;\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.TABLE_CHANGED));\n }\n\n set totalsConfig(totalsConfig) {\n log.debug('set totalsConfig', totalsConfig);\n\n if (totalsConfig === this.totals) {\n // Totals already set, or it will be set when the next model actually gets set\n return;\n }\n\n this.totals = totalsConfig;\n this.formattedStringData = [];\n\n if (this.totalsTablePromise != null) {\n this.totalsTablePromise.cancel();\n }\n\n this.setTotalsTable(null);\n\n if (totalsConfig == null) {\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n return;\n }\n\n this.totalsTablePromise = PromiseUtils.makeCancelable(\n this.table.getTotalsTable(totalsConfig),\n table => table.close()\n );\n this.totalsTablePromise\n .then(totalsTable => {\n this.totalsTablePromise = null;\n this.setTotalsTable(totalsTable);\n })\n .catch(err => {\n if (PromiseUtils.isCanceled(err)) {\n return;\n }\n\n log.error('Unable to set next totalsTable', err);\n this.totalsTablePromise = null;\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.REQUEST_FAILED, { detail: err })\n );\n });\n }\n\n setTotalsTable(totalsTable) {\n log.debug('setTotalsTable', totalsTable);\n\n if (this.totalsTable !== null) {\n if (this.listenerCount > 0) {\n this.removeTotalsListeners(this.totalsTable);\n }\n\n this.totalsTable.close();\n }\n\n this.totalsTable = totalsTable;\n this.totalsDataMap = null;\n\n if (this.listenerCount > 0 && this.totalsTable != null) {\n this.addTotalsListeners(totalsTable);\n }\n }\n\n setViewport(top, bottom, columns) {\n if (bottom < top) {\n log.error('Invalid viewport', top, bottom);\n return;\n }\n\n const { viewport } = this;\n if (\n viewport != null &&\n viewport.top === top &&\n viewport.bottom === bottom &&\n viewport.columns === columns\n ) {\n log.debug2('Ignoring duplicate viewport', viewport);\n return;\n }\n\n this.viewport = {\n top,\n bottom,\n columns,\n };\n log.debug2('setViewport', this.viewport);\n\n this.applyViewport();\n }\n\n /**\n * Applies the current viewport to the underlying table.\n */\n applyViewport() {\n if (!this.viewport) {\n return;\n }\n\n log.debug2('applyViewport', this.viewport);\n const { top, bottom, columns } = this.viewport;\n const [viewportTop, viewportBottom] = this.getCachedViewportRowRange(\n top,\n bottom\n );\n this.applyBufferedViewport(viewportTop, viewportBottom, columns);\n }\n\n applyBufferedViewport(viewportTop, viewportBottom, columns) {\n log.debug2('applyBufferedViewport', viewportTop, viewportBottom, columns);\n if (this.subscription == null) {\n log.debug2('applyBufferedViewport creating new subscription');\n this.subscription = this.table.setViewport(\n viewportTop,\n viewportBottom,\n columns\n );\n } else {\n log.debug2('applyBufferedViewport using existing subscription');\n this.subscription.setViewport(viewportTop, viewportBottom, columns);\n }\n }\n\n async snapshot(ranges, includeHeaders = false, formatValue = value => value) {\n if (this.subscription == null) {\n throw new Error('No subscription available');\n }\n\n const consolidated = GridRange.consolidate(ranges);\n if (!IrisGridUtils.isValidSnapshotRanges(consolidated)) {\n throw new Error('Invalid snapshot ranges', ranges);\n }\n\n // Need to separate out the floating ranges as they're from a different source\n const topFloatingRowsSet = new Set();\n const tableRanges = [];\n const bottomFloatingRowsSet = new Set();\n for (let i = 0; i < consolidated.length; i += 1) {\n const range = consolidated[i];\n\n // Get the rows that are in the top aggregations section\n for (\n let r = range.startRow;\n r <= range.endRow && r < this.floatingTopRowCount;\n r += 1\n ) {\n topFloatingRowsSet.add(r);\n }\n\n // Separate out the range that is part of the actual table (ie. not the floating ranges, not aggregations)\n if (\n range.endRow >= this.floatingTopRowCount &&\n range.startRow <= this.floatingTopRowCount + this.table.size\n ) {\n tableRanges.push(\n new GridRange(\n range.startColumn,\n Math.min(Math.max(0, range.startRow - this.floatingTopRowCount)),\n range.endColumn,\n Math.min(\n Math.max(0, range.endRow - this.floatingTopRowCount),\n this.table.size - this.floatingTopRowCount\n )\n )\n );\n }\n\n // Get the rows that are in the bottom aggregations section\n for (\n let r = Math.max(\n range.startRow,\n this.floatingTopRowCount + this.table.size\n );\n r <= range.endRow &&\n r <\n this.floatingTopRowCount +\n this.table.size +\n this.floatingBottomRowCount;\n r += 1\n ) {\n bottomFloatingRowsSet.add(r);\n }\n }\n\n const columns = IrisGridUtils.columnsFromRanges(consolidated, this.columns);\n const result = [];\n if (includeHeaders) {\n result.push(columns.map(c => c.name));\n }\n const topFloatingRows = [...topFloatingRowsSet].sort();\n for (let i = 0; i < topFloatingRows.length; i += 1) {\n const row = topFloatingRows[i];\n const rowData = columns.map(column =>\n formatValue(\n this.valueForCell(this.getColumnIndexByName(column.name), row),\n column\n )\n );\n if (includeHeaders) {\n rowData.push(this.textForRowFooter(row));\n }\n result.push(rowData);\n }\n\n if (tableRanges.length > 0) {\n const rangeSet = IrisGridUtils.rangeSetFromRanges(tableRanges);\n const snapshot = await this.subscription.snapshot(rangeSet, columns);\n result.push(\n ...snapshot.rows.map(rowData =>\n columns.map(column => formatValue(rowData.get(column), column))\n )\n );\n }\n\n const bottomFloatingRows = [...bottomFloatingRowsSet].sort();\n for (let i = 0; i < bottomFloatingRows.length; i += 1) {\n const row = bottomFloatingRows[i];\n const rowData = columns.map(column =>\n formatValue(\n this.valueForCell(this.getColumnIndexByName(column.name), row),\n column\n )\n );\n if (includeHeaders) {\n rowData.push(this.textForRowFooter(row));\n }\n result.push(rowData);\n }\n\n return result;\n }\n\n /**\n * Get a text snapshot of the provided ranges\n * @param {GridRange[]} ranges The ranges to get the snapshot for\n * @param {boolean} includeHeaders Whether to include the headers in the snapshot or not\n * @param {(unknown, dh.Column) => string} formatValue Function for formatting the raw value into a string\n * @returns {string} A formatted string of all the data, columns separated by `\\t` and rows separated by `\\n`\n */\n async textSnapshot(\n ranges,\n includeHeaders = false,\n formatValue = value => `${value}`\n ) {\n log.debug2('textSnapshot', ranges, includeHeaders);\n\n const data = await this.snapshot(ranges, includeHeaders, formatValue);\n return data.map(row => row.join('\\t')).join('\\n');\n }\n\n get isFilterRequired() {\n return this.table.isUncoalesced;\n }\n\n isFilterable(columnIndex) {\n return this.getCachedFilterableColumnSet(this.columns).has(columnIndex);\n }\n\n async valuesTable(column) {\n let table = null;\n try {\n table = await this.table.copy();\n table.applyFilter([]);\n table.applySort([]);\n return table.selectDistinct([column]);\n } finally {\n if (table != null) {\n table.close();\n }\n }\n }\n\n async export() {\n return this.table.freeze();\n }\n\n columnStatistics(column) {\n return this.table.getColumnStatistics(column);\n }\n\n getCachedFilterableColumnSet = memoize(\n columns => new Set(columns.map((_, index) => index))\n );\n\n getCachedFormattedString = memoizeClear(\n (formatter, value, columnType, columnName, formatOverride) =>\n formatter.getFormattedString(\n value,\n columnType,\n columnName,\n formatOverride\n ),\n { max: 10000 }\n );\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n getCachedViewportRowRange = memoize((top, bottom) => {\n const viewHeight = bottom - top;\n const viewportTop = Math.max(\n 0,\n top - viewHeight * IrisGridTableModel.ROW_BUFFER_PAGES\n );\n const viewportBottom =\n bottom + viewHeight * IrisGridTableModel.ROW_BUFFER_PAGES;\n return [viewportTop, viewportBottom];\n });\n\n getCachedPendingErrors = memoize(\n (pendingDataMap, columns, keyColumnCount) => {\n const map = new Map();\n pendingDataMap.forEach((row, rowIndex) => {\n const { data: rowData } = row;\n for (let i = 0; i < keyColumnCount; i += 1) {\n if (!rowData.has(i)) {\n if (!map.has(rowIndex)) {\n map.set(rowIndex, []);\n }\n map\n .get(rowIndex)\n .push(new MissingKeyError(rowIndex, columns[i].name));\n }\n }\n });\n return map;\n }\n );\n\n isColumnMovable(x) {\n const columnName = this.columns[x].name;\n if (\n this.layoutHints?.frontColumns?.includes(columnName) ||\n this.layoutHints?.backColumns?.includes(columnName) ||\n this.frozenColumns.includes(columnName)\n ) {\n return false;\n }\n return !this.isKeyColumn(x);\n }\n\n isColumnFrozen(x) {\n return this.frozenColumns.includes(this.columns[x].name);\n }\n\n isKeyColumn(x) {\n return x < (this.inputTable?.keyColumns.length ?? 0);\n }\n\n isRowMovable() {\n return false;\n }\n\n isEditableRange(range) {\n return (\n this.inputTable != null &&\n GridRange.isBounded(range) &&\n ((this.isPendingRow(range.startRow) && this.isPendingRow(range.endRow)) ||\n (range.startColumn >= this.inputTable.keyColumns.length &&\n range.endColumn >= this.inputTable.keyColumns.length)) &&\n range.startRow >= this.floatingTopRowCount &&\n range.startRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount &&\n range.endRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount\n );\n }\n\n isDeletableRange(range) {\n return (\n this.inputTable != null &&\n range.startRow != null &&\n range.endRow != null &&\n range.startRow >= this.floatingTopRowCount &&\n range.startRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount &&\n range.endRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount\n );\n }\n\n isEditableRanges(ranges) {\n return ranges.every(range => this.isEditableRange(range));\n }\n\n isDeletableRanges(ranges) {\n return ranges.every(range => this.isDeletableRange(range));\n }\n\n /**\n * @returns {GridRange} A range corresponding to the underlying table\n */\n getTableAreaRange() {\n return new GridRange(\n null,\n this.floatingTopRowCount,\n null,\n this.floatingTopRowCount + this.table.size - 1\n );\n }\n\n /**\n * @returns {GridRange} A range corresponding to the pending new rows\n */\n getPendingAreaRange() {\n return new GridRange(\n null,\n this.floatingTopRowCount + this.table.size,\n null,\n this.floatingTopRowCount + this.table.size + this.pendingNewRowCount - 1\n );\n }\n\n /**\n * Set value in an editable table\n * @param {number} x The column to set\n * @param {number} y The row to set\n * @param {string} value The value to set\n * @returns {Promise<void>} A promise that resolves successfully when the operation is complete, or rejects if there's an error\n */\n async setValueForCell(x, y, text) {\n // Cache the value in our pending string cache so that it stays displayed until our edit has been completed\n return this.setValueForRanges([new GridRange(x, y, x, y)], text);\n }\n\n /**\n * Set value in an editable table\n * @param {GridRange[]} ranges The ranges to set\n * @param {string} value The values to set\n * @returns {Promise<void>} A promise that resolves successfully when the operation is complete, or rejects if there's an error\n */\n async setValueForRanges(ranges, text) {\n if (!this.isEditableRanges(ranges)) {\n throw new Error('Uneditable ranges', ranges);\n }\n\n try {\n // Cache the value in our pending string cache so that it stays displayed until our edit has been completed\n const columnSet = new Set();\n\n // Formatted text for each column\n // Since there could be different formatting for each column, but the value will be the same across rows\n const formattedText = [];\n GridRange.forEachCell(ranges, (x, y) => {\n const column = this.columns[x];\n columnSet.add(column);\n if (formattedText[x] === undefined) {\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n formattedText[x] =\n value != null\n ? this.displayString(value, column.type, column.name)\n : null;\n }\n this.cachePendingValue(x, y, formattedText[x]);\n });\n\n // Take care of updates to the pending new area first, as they can be updated synchronously\n const pendingAreaRange = this.getPendingAreaRange();\n const pendingRanges = ranges\n .map(range => GridRange.intersection(pendingAreaRange, range))\n .filter(range => range != null)\n .map(range =>\n GridRange.offset(\n range,\n 0,\n -(this.floatingTopRowCount + this.table.size)\n )\n );\n if (pendingRanges.length > 0) {\n const newDataMap = new Map(this.pendingNewDataMap);\n GridRange.forEachCell(pendingRanges, (columnIndex, rowIndex) => {\n if (!newDataMap.has(rowIndex)) {\n newDataMap.set(rowIndex, { data: new Map() });\n }\n\n const column = this.columns[columnIndex];\n const row = newDataMap.get(rowIndex);\n const { data: rowData } = row;\n const newRowData = new Map(rowData);\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n if (value != null) {\n newRowData.set(columnIndex, { value });\n } else {\n newRowData.delete(columnIndex);\n }\n if (newRowData.size > 0) {\n newDataMap.set(rowIndex, { ...row, data: newRowData });\n } else {\n newDataMap.delete(rowIndex);\n }\n });\n this.pendingDataMap = newDataMap;\n }\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n\n const tableAreaRange = this.getTableAreaRange();\n const tableRanges = ranges\n .map(range => GridRange.intersection(tableAreaRange, range))\n .filter(range => range != null);\n if (tableRanges.length > 0) {\n // Get a snapshot of the full rows, as we need to write a full row when editing\n const data = await this.snapshot(\n tableRanges.map(\n range => new GridRange(null, range.startRow, null, range.endRow)\n )\n );\n const newRows = data.map(row => {\n const newRow = {};\n for (let c = 0; c < this.columns.length; c += 1) {\n newRow[this.columns[c].name] = row[c];\n }\n\n columnSet.forEach(column => {\n newRow[column.name] = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n });\n return newRow;\n });\n\n const result = await this.inputTable.addRows(newRows);\n\n log.debug(\n 'setValueForRanges(',\n ranges,\n ',',\n text,\n ') set tableRanges',\n tableRanges,\n 'result',\n result\n );\n }\n\n // Add the changes to the formatted cache so it's still displayed until the update event is received\n // The update event could be received on the next tick, after the input rows have been committed,\n // so make sure we don't display stale data\n GridRange.forEachCell(ranges, (x, y) => {\n this.cacheFormattedValue(x, y, formattedText[x]);\n });\n } catch (err) {\n log.error('Unable to set ranges', ranges, text, err);\n } finally {\n GridRange.forEachCell(ranges, (x, y) => {\n this.clearPendingValue(x, y);\n });\n }\n }\n\n async setValues(edits = []) {\n log.debug('setValues(', edits, ')');\n if (\n !edits.every(edit =>\n this.isEditableRange(\n GridRange.makeCell(edit.column ?? edit.x, edit.row ?? edit.y)\n )\n )\n ) {\n throw new Error('Uneditable ranges', edits);\n }\n\n try {\n const newDataMap = new Map(this.pendingNewDataMap);\n\n // Cache the display values\n edits.forEach(edit => {\n const { text } = edit;\n const x = edit.column ?? edit.x;\n const y = edit.row ?? edit.y;\n const column = this.columns[x];\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n const formattedText =\n value != null\n ? this.displayString(value, column.type, column.name)\n : null;\n this.cachePendingValue(x, y, formattedText);\n\n // Take care of updates to the pending new area as well, as that can be updated synchronously\n const pendingRow = this.pendingRow(y);\n if (pendingRow != null) {\n if (!newDataMap.has(pendingRow)) {\n newDataMap.set(pendingRow, { data: new Map() });\n }\n\n const row = newDataMap.get(pendingRow);\n const { data: rowData } = row;\n const newRowData = new Map(rowData);\n if (value != null) {\n newRowData.set(x, { value });\n } else {\n newRowData.delete(x);\n }\n if (newRowData.size > 0) {\n newDataMap.set(pendingRow, { ...row, data: newRowData });\n } else {\n newDataMap.delete(pendingRow);\n }\n }\n });\n\n this.pendingDataMap = newDataMap;\n\n // Send an update right after setting the pending map so the values are displayed immediately\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n\n // Need to group by row...\n const rowEditMap = edits.reduce((rowMap, edit) => {\n const y = edit.row ?? edit.y;\n if (!rowMap.has(y)) {\n rowMap.set(y, []);\n }\n rowMap.get(y).push(edit);\n return rowMap;\n }, new Map());\n\n const ranges = GridRange.consolidate(\n edits.map(edit =>\n GridRange.makeCell(edit.column ?? edit.x, edit.row ?? edit.y)\n )\n );\n const tableAreaRange = this.getTableAreaRange();\n const tableRanges = ranges\n .map(range => GridRange.intersection(tableAreaRange, range))\n .filter(range => range != null);\n\n if (tableRanges.length > 0) {\n // Get a snapshot of the full rows, as we need to write a full row when editing\n const data = await this.snapshot(\n tableRanges.map(\n range => new GridRange(null, range.startRow, null, range.endRow)\n )\n );\n const newRows = data.map((row, dataIndex) => {\n let rowIndex = null;\n let r = dataIndex;\n for (let i = 0; i < tableRanges.length; i += 1) {\n const range = tableRanges[i];\n const rangeRowCount = GridRange.rowCount([range]);\n if (r < rangeRowCount) {\n rowIndex = range.startRow + r;\n break;\n }\n r -= rangeRowCount;\n }\n\n const newRow = {};\n for (let c = 0; c < this.columns.length; c += 1) {\n newRow[this.columns[c].name] = row[c];\n }\n\n const rowEdits = rowEditMap.get(rowIndex);\n if (rowEdits != null) {\n rowEdits.forEach(edit => {\n const column = this.columns[edit.column ?? edit.x];\n newRow[column.name] = TableUtils.makeValue(\n column.type,\n edit.text,\n this.formatter.timeZone\n );\n });\n }\n return newRow;\n });\n\n log.info('setValues setting tableRanges', tableRanges);\n\n const result = await this.inputTable.addRows(newRows);\n\n log.info('setValues set tableRanges', tableRanges, 'SUCCESS', result);\n }\n\n // We've sent the changes to the server, but have not yet got an update with those changes committed\n // Add the changes to the formatted cache so it's still displayed until the update event is received\n // The update event could be received on the next tick, after the input rows have been committed,\n // so make sure we don't display stale data\n edits.forEach(edit => {\n const { text } = edit;\n const x = edit.column ?? edit.x;\n const y = edit.row ?? edit.y;\n const column = this.columns[x];\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n const formattedText =\n value != null\n ? this.displayString(value, column.type, column.name)\n : null;\n this.cacheFormattedValue(x, y, formattedText);\n });\n } finally {\n edits.forEach(edit => {\n this.clearPendingValue(edit.column, edit.row);\n });\n }\n }\n\n async commitPending() {\n if (this.pendingNewDataMap.size <= 0) {\n throw new Error('No pending changes to commit');\n }\n\n try {\n this.isSaveInProgress = true;\n\n const newRows = [];\n this.pendingNewDataMap.forEach(row => {\n const newRow = {};\n row.data.forEach(({ value }, columnIndex) => {\n const column = this.columns[columnIndex];\n newRow[column.name] = value;\n });\n newRows.push(newRow);\n });\n const result = await this.inputTable.addRows(newRows);\n\n log.debug('commitPending()', this.pendingNewDataMap, 'result', result);\n\n this.pendingNewDataMap = new Map();\n this.pendingNewDataErrors = new Map();\n this.pendingNewRowCount = Math.max(\n 0,\n (this.viewport?.bottom ?? 0) - this.table.size\n );\n this.formattedStringData = [];\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED)\n );\n\n return result;\n } finally {\n this.isSaveInProgress = false;\n }\n }\n\n editValueForCell(x, y) {\n return this.textValueForCell(x, y);\n }\n\n async delete(ranges) {\n if (!this.isDeletableRanges(ranges)) {\n throw new Error('Undeletable ranges', ranges);\n }\n\n const { keyColumns } = this.inputTable;\n if (keyColumns.length === 0) {\n throw new Error('No key columns to allow deletion');\n }\n\n const pendingAreaRange = this.getPendingAreaRange();\n const pendingRanges = ranges\n .map(range => GridRange.intersection(pendingAreaRange, range))\n .filter(range => range != null)\n .map(range =>\n GridRange.offset(\n range,\n 0,\n -(this.floatingTopRowCount + this.table.size)\n )\n );\n\n if (pendingRanges.length > 0) {\n const newDataMap = new Map(this.pendingNewDataMap);\n for (let i = 0; i < pendingRanges.length; i += 1) {\n const pendingRange = pendingRanges[i];\n for (let r = pendingRange.startRow; r <= pendingRange.endRow; r += 1) {\n newDataMap.delete(r);\n }\n }\n this.pendingNewDataMap = newDataMap;\n\n this.formattedStringData = [];\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED)\n );\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n const tableAreaRange = this.getTableAreaRange();\n const tableRanges = ranges\n .map(range => GridRange.intersection(tableAreaRange, range))\n .filter(range => range != null);\n if (tableRanges.length <= 0) {\n return null;\n }\n const [data, deleteTable] = await Promise.all([\n // Need to get the key values of each row\n this.snapshot(\n tableRanges.map(\n range =>\n new GridRange(\n 0,\n range.startRow,\n keyColumns.length - 1,\n range.endRow\n )\n )\n ),\n this.table.copy(),\n ]);\n\n // Now copy the existing table and filter it on the values in the snapshot for the key columns in the input table\n const filters = data.map(row => {\n const columnFilters = [];\n for (let c = 0; c < keyColumns.length; c += 1) {\n const column = keyColumns[c];\n const value = row[c];\n const filterValue = TableUtils.makeFilterRawValue(column.type, value);\n const filter = column.filter().eq(filterValue);\n columnFilters.push(filter);\n }\n return columnFilters.reduce((agg, curr) => (agg ? agg.and(curr) : curr));\n });\n\n const filter = filters.reduce((agg, curr) => (agg ? agg.or(curr) : curr));\n deleteTable.applyFilter([filter]);\n\n const result = await this.inputTable.deleteTable(deleteTable);\n deleteTable.close();\n return result;\n }\n\n isValidForCell(x, y, value) {\n try {\n const column = this.columns[x];\n TableUtils.makeValue(column.type, value, this.formatter.timeZone);\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n\nexport default IrisGridTableModel;\n"],"file":"IrisGridTableModel.js"}
|
|
1
|
+
{"version":3,"sources":["../src/IrisGridTableModel.js"],"names":["memoize","throttle","GridRange","memoizeClear","dh","Log","PromiseUtils","TableUtils","Formatter","FormatterUtils","IrisGridModel","AggregationOperation","IrisGridUtils","MissingKeyError","log","module","SET_VIEWPORT_THROTTLE","APPLY_VIEWPORT_THROTTLE","IrisGridTableModel","constructor","table","formatter","inputTable","columnMap","frontColumns","backColumns","frozenColumns","columns","values","length","finalFrontColumns","finalBackColumns","finalFrozenColumns","map","name","get","filter","Boolean","Error","frontColumnSet","Set","backColumnSet","frozenColumnSet","middleColumns","col","has","tableColumns","Map","forEach","set","layoutHintsFrontColumns","layoutHintsBackColumns","layoutHintsFrozenColumns","userFrozenColumns","indices","i","_","index","value","columnType","columnName","formatOverride","getFormattedString","max","isCustomColumnFormatDefined","top","bottom","viewHeight","viewportTop","Math","ROW_BUFFER_PAGES","viewportBottom","pendingDataMap","keyColumnCount","row","rowIndex","data","rowData","push","handleTableDisconnect","bind","handleTableReconnect","handleTableUpdate","handleTotalsUpdate","handleRequestFailed","handleCustomColumnsChanged","setViewport","applyViewport","leading","irisFormatter","listenerCount","subscription","viewport","viewportData","formattedStringData","pendingStringData","isSaveInProgress","totalsTable","totalsTablePromise","totals","totalsDataMap","customColumnList","formatColumnList","pendingNewDataMap","pendingNewRowCount","close","cancel","startListening","addEventListener","Table","EVENT_DISCONNECT","EVENT_RECONNECT","EVENT_UPDATED","Client","EVENT_REQUEST_FAILED","EVENT_CUSTOMCOLUMNSCHANGED","addTotalsListeners","stopListening","removeEventListener","removeTotalsListeners","closeSubscription","dispatchEvent","CustomEvent","EVENT","DISCONNECT","RECONNECT","event","copyViewportData","detail","UPDATED","copyTotalsData","REQUEST_FAILED","COLUMNS_CHANGED","rowCount","size","operationOrder","pendingDataErrors","getCachedPendingErrors","keyColumns","isValidIndex","columnIndex","maxPendingDataRow","PENDING_DATA_UPDATED","pendingRowCount","count","keys","columnCount","floatingBottomRowCount","showOnTop","floatingTopRowCount","isExportAvailable","freeze","isColumnStatisticsAvailable","getColumnStatistics","isValuesTableAvailable","selectDistinct","copy","isRollupAvailable","rollup","isSelectDistinctAvailable","isCustomColumnsAvailable","applyCustomColumns","isFormatColumnsAvailable","isChartBuilderAvailable","isTotalsAvailable","getTotalsTable","isEditable","cacheFormattedValue","x","y","text","cachePendingValue","clearPendingValue","column","textValueForCell","undefined","valueForCell","totalsColumn","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","type","formatForCell","formatString","displayString","textForCell","isKeyColumn","pendingRow","truncationCharForCell","isNumberType","truncateNumbersWithPound","colorForCell","theme","dataForCell","format","nullStringColor","color","isPendingRow","pendingTextColor","isDateType","dateColor","positiveNumberColor","negativeNumberColor","zeroNumberColor","errorTextColor","textColor","backgroundColorForCell","backgroundColor","textAlignForCell","textForColumnHeader","textForRowFooter","totalsRow","getColumnsWithLayoutHints","getMemoizedColumnMap","getMemoizedFrontColumns","layoutHints","getMemoizedBackColumns","getMemoizedFrozenColumns","floatingLeftColumnCount","groupedColumns","description","totalsRowCount","operation","offset","viewportY","rows","defaultOperation","SUM","tableColumn","find","isTotalsRow","warn","extractViewportData","totalsData","error","dataMap","operationMap","c","split","findIndex","getFormat","debug2","getColumnIndexByName","getColumnIndicesByNameMap","newData","r","newRow","extractViewportRow","applyFilter","FORMATTER_UPDATED","getCachedFormattedString","sort","applySort","customColumns","debug","formatColumns","updateFrozenColumns","TABLE_CHANGED","totalsConfig","setTotalsTable","makeCancelable","then","catch","err","isCanceled","getCachedViewportRowRange","applyBufferedViewport","snapshot","ranges","includeHeaders","formatValue","consolidated","consolidate","isValidSnapshotRanges","topFloatingRowsSet","tableRanges","bottomFloatingRowsSet","range","startRow","endRow","add","startColumn","min","endColumn","columnsFromRanges","result","topFloatingRows","rangeSet","rangeSetFromRanges","bottomFloatingRows","textSnapshot","join","isFilterRequired","isUncoalesced","isFilterable","getCachedFilterableColumnSet","valuesTable","export","columnStatistics","isColumnMovable","includes","isColumnFrozen","isRowMovable","isEditableRange","isBounded","isDeletableRange","isEditableRanges","every","isDeletableRanges","getTableAreaRange","getPendingAreaRange","setValueForCell","setValueForRanges","columnSet","formattedText","forEachCell","makeValue","timeZone","pendingAreaRange","pendingRanges","intersection","newDataMap","newRowData","delete","tableAreaRange","newRows","addRows","setValues","edits","edit","makeCell","rowEditMap","reduce","rowMap","dataIndex","rangeRowCount","rowEdits","info","commitPending","pendingNewDataErrors","editValueForCell","pendingRange","deleteTable","Promise","all","filters","columnFilters","filterValue","makeFilterRawValue","eq","agg","curr","and","or","isValidForCell","e"],"mappings":"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","sourcesContent":["/* eslint class-methods-use-this: \"off\" */\nimport memoize from 'memoize-one';\nimport throttle from 'lodash.throttle';\nimport { GridRange, memoizeClear } from '@deephaven/grid';\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { PromiseUtils } from '@deephaven/utils';\nimport TableUtils from './TableUtils';\nimport Formatter from './Formatter';\nimport FormatterUtils from './FormatterUtils';\nimport IrisGridModel from './IrisGridModel';\nimport AggregationOperation from './sidebar/aggregations/AggregationOperation';\nimport IrisGridUtils from './IrisGridUtils';\nimport MissingKeyError from './MissingKeyError';\n\nconst log = Log.module('IrisGridTableModel');\n\nconst SET_VIEWPORT_THROTTLE = 150;\nconst APPLY_VIEWPORT_THROTTLE = 0;\n\n/**\n * Model for a grid showing an iris data table\n */\nclass IrisGridTableModel extends IrisGridModel {\n static ROW_BUFFER_PAGES = 1;\n\n static COLUMN_BUFFER_PAGES = 0;\n\n /**\n * @param {dh.Table} table Iris data table to be used in the model\n * @param {Formatter} formatter The formatter to use when getting formats\n * @param {dh.InputTable} inputTable Iris input table associated with this table\n */\n constructor(table, formatter = new Formatter(), inputTable = null) {\n super();\n\n this.handleTableDisconnect = this.handleTableDisconnect.bind(this);\n this.handleTableReconnect = this.handleTableReconnect.bind(this);\n this.handleTableUpdate = this.handleTableUpdate.bind(this);\n this.handleTotalsUpdate = this.handleTotalsUpdate.bind(this);\n this.handleRequestFailed = this.handleRequestFailed.bind(this);\n this.handleCustomColumnsChanged = this.handleCustomColumnsChanged.bind(\n this\n );\n this.setViewport = throttle(\n this.setViewport.bind(this),\n SET_VIEWPORT_THROTTLE\n );\n this.applyViewport = throttle(\n this.applyViewport.bind(this),\n APPLY_VIEWPORT_THROTTLE,\n { leading: false }\n );\n\n this.irisFormatter = formatter;\n this.inputTable = inputTable;\n this.listenerCount = 0;\n this.subscription = null;\n this.table = table;\n this.viewport = null;\n this.viewportData = null;\n this.formattedStringData = [];\n this.pendingStringData = [];\n this.isSaveInProgress = false;\n\n this.totalsTable = null;\n this.totalsTablePromise = null;\n this.totals = null;\n this.totalsDataMap = null;\n\n this.customColumnList = [];\n this.formatColumnList = [];\n\n // Map from new row index to their values. Only for input tables that can have new rows added.\n // The index of these rows start at 0, and they are appended at the end of the regular table data.\n // These rows can be sparse, so using a map instead of an array.\n this.pendingNewDataMap = new Map();\n this.pendingNewRowCount = 0;\n\n this.userFrozenColumns = null;\n }\n\n close() {\n this.table.close();\n if (this.totalsTable !== null) {\n this.totalsTable.close();\n }\n if (this.totalsTablePromise !== null) {\n this.totalsTablePromise.cancel();\n }\n }\n\n startListening() {\n super.startListening();\n\n this.table.addEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleTableDisconnect\n );\n this.table.addEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleTableReconnect\n );\n this.table.addEventListener(dh.Table.EVENT_UPDATED, this.handleTableUpdate);\n this.table.addEventListener(\n dh.Client.EVENT_REQUEST_FAILED,\n this.handleRequestFailed\n );\n this.table.addEventListener(\n dh.Table.EVENT_CUSTOMCOLUMNSCHANGED,\n this.handleCustomColumnsChanged\n );\n\n if (this.totalsTable != null) {\n this.addTotalsListeners(this.totalsTable);\n }\n\n this.applyViewport();\n }\n\n stopListening() {\n super.stopListening();\n\n this.table.removeEventListener(\n dh.Table.EVENT_DISCONNECT,\n this.handleTableDisconnect\n );\n this.table.removeEventListener(\n dh.Table.EVENT_RECONNECT,\n this.handleTableReconnect\n );\n this.table.removeEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleTableUpdate\n );\n this.table.removeEventListener(\n dh.Client.EVENT_REQUEST_FAILED,\n this.handleRequestFailed\n );\n this.table.removeEventListener(\n dh.Table.EVENT_CUSTOMCOLUMNSCHANGED,\n this.handleCustomColumnsChanged\n );\n\n if (this.totalsTable != null) {\n this.removeTotalsListeners(this.totalsTable);\n }\n\n this.closeSubscription();\n }\n\n addTotalsListeners(totalsTable) {\n totalsTable.addEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleTotalsUpdate\n );\n\n // Totals table only has one row of data\n totalsTable.setViewport(0, 0);\n }\n\n removeTotalsListeners(totalsTable) {\n totalsTable.removeEventListener(\n dh.Table.EVENT_UPDATED,\n this.handleTotalsUpdate\n );\n }\n\n handleTableDisconnect() {\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.DISCONNECT));\n }\n\n handleTableReconnect() {\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.RECONNECT));\n }\n\n handleTableUpdate(event) {\n this.copyViewportData(event.detail);\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n handleTotalsUpdate(event) {\n this.copyTotalsData(event.detail);\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n handleRequestFailed(event) {\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.REQUEST_FAILED, event)\n );\n }\n\n handleCustomColumnsChanged() {\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.COLUMNS_CHANGED, {\n detail: this.columns,\n })\n );\n }\n\n get rowCount() {\n return (\n this.table.size +\n (this.totals?.operationOrder?.length ?? 0) +\n this.pendingNewRowCount\n );\n }\n\n get pendingDataErrors() {\n return this.getCachedPendingErrors(\n this.pendingNewDataMap,\n this.columns,\n this.inputTable?.keyColumns.length ?? 0\n );\n }\n\n get pendingDataMap() {\n return this.pendingNewDataMap;\n }\n\n set pendingDataMap(map) {\n if (map === this.pendingNewDataMap) {\n return;\n }\n\n map.forEach((row, rowIndex) => {\n if (!IrisGridUtils.isValidIndex(rowIndex)) {\n throw new Error('Invalid rowIndex', rowIndex);\n }\n\n const { data } = row;\n data.forEach((value, columnIndex) => {\n if (!IrisGridUtils.isValidIndex(columnIndex)) {\n throw new Error('Invalid columnIndex', columnIndex);\n }\n });\n });\n\n this.pendingNewDataMap = map;\n\n this.pendingNewRowCount = Math.max(\n this.pendingNewRowCount,\n this.maxPendingDataRow\n );\n\n this.formattedStringData = [];\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED)\n );\n }\n\n get pendingRowCount() {\n return this.pendingNewRowCount;\n }\n\n set pendingRowCount(count) {\n if (count === this.pendingNewRowCount) {\n return;\n }\n\n this.pendingNewRowCount = Math.max(0, count, this.maxPendingDataRow);\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n get maxPendingDataRow() {\n return this.pendingNewDataMap.size > 0\n ? Math.max(...this.pendingNewDataMap.keys()) + 1\n : 0;\n }\n\n get columnCount() {\n return this.columns.length;\n }\n\n get floatingBottomRowCount() {\n return this.totals?.showOnTop\n ? 0\n : this.totals?.operationOrder?.length ?? 0;\n }\n\n get floatingTopRowCount() {\n return this.totals?.showOnTop\n ? this.totals?.operationOrder?.length ?? 0\n : 0;\n }\n\n get isExportAvailable() {\n return this.table.freeze != null;\n }\n\n get isColumnStatisticsAvailable() {\n return this.table.getColumnStatistics != null;\n }\n\n get isValuesTableAvailable() {\n return this.table.selectDistinct != null && this.table.copy != null;\n }\n\n get isRollupAvailable() {\n return this.table.rollup != null;\n }\n\n get isSelectDistinctAvailable() {\n return this.table.selectDistinct != null;\n }\n\n get isCustomColumnsAvailable() {\n return this.table.applyCustomColumns != null;\n }\n\n get isFormatColumnsAvailable() {\n return this.table.applyCustomColumns != null;\n }\n\n get isChartBuilderAvailable() {\n return true;\n }\n\n get isTotalsAvailable() {\n return this.table.getTotalsTable != null;\n }\n\n get isEditable() {\n return !this.isSaveInProgress && this.inputTable != null;\n }\n\n cacheFormattedValue(x, y, text) {\n if (this.formattedStringData[x] == null) {\n this.formattedStringData[x] = [];\n }\n this.formattedStringData[x][y] = text;\n }\n\n cachePendingValue(x, y, text) {\n if (this.pendingStringData[x] == null) {\n this.pendingStringData[x] = [];\n }\n this.pendingStringData[x][y] = text;\n }\n\n clearPendingValue(x, y) {\n const column = this.pendingStringData[x];\n if (column != null) {\n delete column[y];\n }\n }\n\n textValueForCell(x, y) {\n // First check if there's any pending values we should read from\n if (this.pendingStringData[x]?.[y] !== undefined) {\n return this.pendingStringData[x][y];\n }\n\n // Use a separate cache from memoization just for the strings that are currently displayed\n if (this.formattedStringData[x]?.[y] === undefined) {\n const value = this.valueForCell(x, y);\n if (value == null) {\n return null;\n }\n\n const column = this.totalsColumn(x, y) ?? this.columns[x];\n const hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(\n this.formatter,\n column.name,\n column.type\n );\n let formatOverride = null;\n if (!hasCustomColumnFormat) {\n const formatForCell = this.formatForCell(x, y);\n if (formatForCell?.formatString != null) {\n formatOverride = formatForCell;\n }\n }\n const text = this.displayString(\n value,\n column.type,\n column.name,\n formatOverride\n );\n this.cacheFormattedValue(x, y, text);\n }\n\n return this.formattedStringData[x][y];\n }\n\n textForCell(x, y) {\n const text = this.textValueForCell(x, y);\n if (text == null && this.isKeyColumn(x)) {\n const pendingRow = this.pendingRow(y);\n if (this.pendingDataMap.has(pendingRow)) {\n // Asterisk to show a value is required for a key column on a row that has some data entered\n return '*';\n }\n }\n return text;\n }\n\n truncationCharForCell(x) {\n const column = this.columns[x];\n const { type } = column;\n if (\n TableUtils.isNumberType(type) &&\n this.formatter.truncateNumbersWithPound\n ) {\n return '#';\n }\n\n return undefined;\n }\n\n colorForCell(x, y, theme) {\n const data = this.dataForCell(x, y);\n if (data) {\n const { format, value } = data;\n if (value == null || value === '') {\n return theme.nullStringColor;\n }\n if (format && format.color) {\n return format.color;\n }\n\n if (this.isPendingRow(y)) {\n // Data entered in a pending row\n return theme.pendingTextColor;\n }\n\n // Fallback to formatting based on the value/type of the cell\n if (value != null) {\n const column = this.totalsColumn(x, y) ?? this.columns[x];\n if (TableUtils.isDateType(column.type) || column.name === 'Date') {\n return theme.dateColor;\n }\n if (TableUtils.isNumberType(column.type)) {\n if (value > 0) {\n return theme.positiveNumberColor;\n }\n if (value < 0) {\n return theme.negativeNumberColor;\n }\n return theme.zeroNumberColor;\n }\n }\n } else if (this.isPendingRow(y) && this.isKeyColumn(x)) {\n return theme.errorTextColor;\n }\n\n return theme.textColor;\n }\n\n backgroundColorForCell(x, y) {\n return this.formatForCell(x, y)?.backgroundColor;\n }\n\n textAlignForCell(x) {\n const column = this.columns[x];\n const { type } = column;\n\n if (TableUtils.isNumberType(type)) {\n return 'right';\n }\n if (TableUtils.isDateType(type) || column.name === 'Date') {\n return 'center';\n }\n return 'left';\n }\n\n textForColumnHeader(x) {\n const column = this.columns[x];\n return `${column.name}`;\n }\n\n textForRowFooter(y) {\n const totalsRow = this.totalsRow(y);\n if (totalsRow != null) {\n return this.totals.operationOrder[totalsRow];\n }\n return '';\n }\n\n getColumnsWithLayoutHints = memoize(\n (columnMap, frontColumns, backColumns, frozenColumns) => {\n const columns = [...columnMap.values()];\n if (frontColumns.length || backColumns.length || frozenColumns.length) {\n let finalFrontColumns = [];\n let finalBackColumns = [];\n let finalFrozenColumns = [];\n\n if (frontColumns.length) {\n finalFrontColumns = frontColumns\n .map(name => columnMap.get(name))\n .filter(Boolean);\n }\n if (backColumns.length) {\n finalBackColumns = backColumns\n .map(name => columnMap.get(name))\n .filter(Boolean);\n }\n if (frozenColumns.length) {\n finalFrozenColumns = frozenColumns\n .map(name => columnMap.get(name))\n .filter(Boolean);\n }\n\n if (\n finalFrontColumns.length !== frontColumns.length ||\n finalBackColumns.length !== backColumns.length ||\n finalFrozenColumns.length !== frozenColumns.length\n ) {\n throw new Error(\n 'Layout hints are invalid (contain invalid column names)'\n );\n }\n\n const frontColumnSet = new Set(finalFrontColumns);\n const backColumnSet = new Set(finalBackColumns);\n const frozenColumnSet = new Set(finalFrozenColumns);\n const middleColumns = columns.filter(\n col =>\n !frontColumnSet.has(col) &&\n !backColumnSet.has(col) &&\n !frozenColumnSet.has(col)\n );\n\n return [\n ...finalFrozenColumns,\n ...finalFrontColumns,\n ...middleColumns,\n ...finalBackColumns,\n ];\n }\n return columns;\n }\n );\n\n get columns() {\n return this.getColumnsWithLayoutHints(\n this.columnMap,\n this.frontColumns,\n this.backColumns,\n this.frozenColumns\n );\n }\n\n getMemoizedColumnMap = memoize(tableColumns => {\n const columnMap = new Map();\n tableColumns.forEach(col => columnMap.set(col.name, col));\n return columnMap;\n });\n\n get columnMap() {\n return this.getMemoizedColumnMap(this.table.columns);\n }\n\n getMemoizedFrontColumns = memoize(\n layoutHintsFrontColumns => layoutHintsFrontColumns ?? []\n );\n\n get frontColumns() {\n return this.getMemoizedFrontColumns(this.layoutHints?.frontColumns);\n }\n\n getMemoizedBackColumns = memoize(\n layoutHintsBackColumns => layoutHintsBackColumns ?? []\n );\n\n get backColumns() {\n return this.getMemoizedBackColumns(this.layoutHints?.backColumns);\n }\n\n getMemoizedFrozenColumns = memoize(\n (layoutHintsFrozenColumns, userFrozenColumns) =>\n userFrozenColumns ?? layoutHintsFrozenColumns ?? []\n );\n\n get frozenColumns() {\n return this.getMemoizedFrozenColumns(\n this.layoutHints?.frozenColumns,\n this.userFrozenColumns\n );\n }\n\n get layoutHints() {\n return this.table.layoutHints;\n }\n\n get floatingLeftColumnCount() {\n return this.frozenColumns.length;\n }\n\n get groupedColumns() {\n return [];\n }\n\n get description() {\n return this.table.description;\n }\n\n row(y) {\n const totalsRowCount = this.totals?.operationOrder?.length ?? 0;\n const showOnTop = this.totals?.showOnTop ?? false;\n const totalsRow = this.totalsRow(y);\n if (totalsRow != null) {\n const operation = this.totals.operationOrder[totalsRow];\n return this.totalsDataMap?.get(operation) ?? null;\n }\n const pendingRow = this.pendingRow(y);\n if (pendingRow != null) {\n return this.pendingNewDataMap.get(pendingRow) ?? null;\n }\n const offset = this.viewportData?.offset ?? 0;\n const viewportY = (showOnTop ? y - totalsRowCount : y) - offset;\n return this.viewportData?.rows?.[viewportY] ?? null;\n }\n\n /**\n * Retrieve the totals column if this is a totals row, or null otherwise\n * @param {ModelIndex} x Column index to get the totals column from\n * @param {ModelIndex} y Row index to get the totals column from\n * @returns {dh.Column | null}\n */\n totalsColumn(x, y) {\n const totalsRow = this.totalsRow(y);\n if (totalsRow == null) return null;\n\n const operation = this.totals.operationOrder[totalsRow];\n const defaultOperation =\n this.totals?.defaultOperation ?? AggregationOperation.SUM;\n const tableColumn = this.columns[x];\n return this.totalsTable.columns.find(\n column =>\n column.name === `${tableColumn.name}__${operation}` ||\n (operation === defaultOperation && column.name === tableColumn.name)\n );\n }\n\n /**\n * Translate from the row in the model to a row in the totals table.\n * If the row is not a totals row, return null\n * @param {number} y The row in the model to get the totals row for\n * @returns {number|null} The row within the totals table if it's a totals row, null otherwise\n */\n totalsRow(y) {\n const totalsRowCount = this.totals?.operationOrder?.length ?? 0;\n const showOnTop = this.totals?.showOnTop ?? false;\n const totalsRow = showOnTop ? y : y - this.table.size;\n if (totalsRow >= 0 && totalsRow < totalsRowCount) {\n return totalsRow;\n }\n return null;\n }\n\n /**\n * Translate from the row in the model to a pending input row.\n * If the row is not a pending input row, return null\n * @param {number} y The row in the model to get the pending row for\n * @returns {number|null} The row within the pending input rows if it's a pending row, null otherwise\n */\n pendingRow(y) {\n const pendingRow = y - this.floatingTopRowCount - this.table.size;\n if (pendingRow >= 0 && pendingRow < this.pendingNewRowCount) {\n return pendingRow;\n }\n\n return null;\n }\n\n /**\n * Check if a row is a totals table row\n * @param {number} y The row in the model to check if it's a totals table row\n * @returns {boolean} True if the row is a totals row, false if not\n */\n isTotalsRow(y) {\n return this.totalsRow(y) != null;\n }\n\n /**\n * Check if a row is a pending input row\n * @param {number} y The row in the model to check if it's a pending new row\n * @returns {boolean} True if the row is a pending new row, false if not\n */\n isPendingRow(y) {\n return this.pendingRow(y) != null;\n }\n\n dataForCell(x, y) {\n return this.row(y)?.data.get(x);\n }\n\n formatForCell(x, y) {\n return this.dataForCell(x, y)?.format;\n }\n\n valueForCell(x, y) {\n const data = this.dataForCell(x, y);\n if (data) {\n return data.value ?? null;\n }\n return undefined;\n }\n\n copyViewportData(data) {\n if (!data) {\n log.warn('invalid data!');\n return;\n }\n\n this.viewportData = this.extractViewportData(data);\n this.formattedStringData = [];\n }\n\n copyTotalsData(totalsData) {\n if (!totalsData) {\n log.warn('invalid data!');\n return;\n }\n\n const { columns, rows } = totalsData;\n if (rows.length !== 1) {\n log.error(\n 'Unexpected number of rows received for totals table, ignoring update'\n );\n return;\n }\n\n const dataMap = new Map();\n const row = rows[0];\n const defaultOperation =\n this.totals?.defaultOperation ?? AggregationOperation.SUM;\n const operationMap = this.totals?.operationMap;\n for (let c = 0; c < columns.length; c += 1) {\n const column = columns[c];\n const [\n name,\n operation = operationMap?.[name]?.[0] ?? defaultOperation,\n ] = column.name.split('__');\n if (!dataMap.has(operation)) {\n dataMap.set(operation, { data: new Map() });\n }\n const { data: rowData } = dataMap.get(operation);\n const columnIndex = this.columns.findIndex(col => col.name === name);\n rowData.set(columnIndex, {\n value: row.get(column),\n format: row.getFormat(column),\n });\n }\n\n log.debug2('copyTotalsData', dataMap);\n\n this.totalsDataMap = dataMap;\n this.formattedStringData = [];\n }\n\n /**\n * Use this as the canonical column index since things like layoutHints could have\n * changed the column order.\n */\n getColumnIndexByName(name) {\n return this.getColumnIndicesByNameMap(this.columns).get(name);\n }\n\n getColumnIndicesByNameMap = memoize(columns => {\n const indices = new Map();\n columns.forEach(({ name }, i) => indices.set(name, i));\n return indices;\n });\n\n /**\n * Copies all the viewport data into an object that we can reference later.\n * @param {ViewportData} data The data to copy from\n */\n extractViewportData(data) {\n const newData = {\n offset: data.offset,\n rows: [],\n };\n\n const { columns } = data;\n for (let r = 0; r < data.rows.length; r += 1) {\n const row = data.rows[r];\n const newRow = this.extractViewportRow(row, columns);\n newData.rows.push(newRow);\n }\n\n return newData;\n }\n\n extractViewportRow(row, columns) {\n const data = new Map();\n for (let c = 0; c < columns.length; c += 1) {\n const column = columns[c];\n\n data.set(this.getColumnIndexByName(column.name), {\n value: row.get(column),\n format: row.getFormat(column),\n });\n }\n\n return { data };\n }\n\n closeSubscription() {\n log.debug2('closeSubscription', this.subscription);\n if (this.subscription) {\n this.subscription.close();\n this.subscription = null;\n }\n\n this.setViewport.cancel();\n this.applyViewport.cancel();\n }\n\n get filter() {\n return this.table.filter;\n }\n\n set filter(filter) {\n this.closeSubscription();\n this.table.applyFilter(filter);\n this.applyViewport();\n }\n\n get formatter() {\n return this.irisFormatter;\n }\n\n set formatter(formatter) {\n this.irisFormatter = formatter;\n this.formattedStringData = [];\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.FORMATTER_UPDATED));\n }\n\n displayString(value, columnType, columnName = '', formatOverride = null) {\n return this.getCachedFormattedString(\n this.formatter,\n value,\n columnType,\n columnName,\n formatOverride\n );\n }\n\n get sort() {\n return this.table.sort;\n }\n\n set sort(sort) {\n this.closeSubscription();\n this.table.applySort(sort);\n this.applyViewport();\n }\n\n get customColumns() {\n return this.customColumnList;\n }\n\n set customColumns(customColumns) {\n log.debug2(\n 'set customColumns',\n customColumns,\n this.customColumnList,\n customColumns === this.customColumnList\n );\n if (this.customColumnList.length === 0 && customColumns.length === 0) {\n log.debug('Ignore empty initial customColumns');\n this.customColumnList = customColumns;\n return;\n }\n if (this.customColumnList === customColumns) {\n log.debug('Ignore same customColumns');\n return;\n }\n this.closeSubscription();\n this.customColumnList = customColumns;\n this.table.applyCustomColumns([...customColumns, ...this.formatColumns]);\n this.applyViewport();\n }\n\n get formatColumns() {\n return this.formatColumnList;\n }\n\n set formatColumns(formatColumns) {\n log.debug2(\n 'set formatColumns',\n formatColumns,\n this.formatColumnList,\n formatColumns === this.formatColumnList\n );\n if (this.formatColumnList.length === 0 && formatColumns.length === 0) {\n log.debug('Ignore empty initial formatColumns');\n this.formatColumnList = formatColumns;\n return;\n }\n if (this.formatColumnList === formatColumns) {\n log.debug('Ignore same formatColumns');\n return;\n }\n this.closeSubscription();\n this.formatColumnList = formatColumns;\n this.table.applyCustomColumns([...this.customColumns, ...formatColumns]);\n this.applyViewport();\n }\n\n updateFrozenColumns(columns) {\n this.userFrozenColumns = columns;\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.TABLE_CHANGED));\n }\n\n set totalsConfig(totalsConfig) {\n log.debug('set totalsConfig', totalsConfig);\n\n if (totalsConfig === this.totals) {\n // Totals already set, or it will be set when the next model actually gets set\n return;\n }\n\n this.totals = totalsConfig;\n this.formattedStringData = [];\n\n if (this.totalsTablePromise != null) {\n this.totalsTablePromise.cancel();\n }\n\n this.setTotalsTable(null);\n\n if (totalsConfig == null) {\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n return;\n }\n\n this.totalsTablePromise = PromiseUtils.makeCancelable(\n this.table.getTotalsTable(totalsConfig),\n table => table.close()\n );\n this.totalsTablePromise\n .then(totalsTable => {\n this.totalsTablePromise = null;\n this.setTotalsTable(totalsTable);\n })\n .catch(err => {\n if (PromiseUtils.isCanceled(err)) {\n return;\n }\n\n log.error('Unable to set next totalsTable', err);\n this.totalsTablePromise = null;\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.REQUEST_FAILED, { detail: err })\n );\n });\n }\n\n setTotalsTable(totalsTable) {\n log.debug('setTotalsTable', totalsTable);\n\n if (this.totalsTable !== null) {\n if (this.listenerCount > 0) {\n this.removeTotalsListeners(this.totalsTable);\n }\n\n this.totalsTable.close();\n }\n\n this.totalsTable = totalsTable;\n this.totalsDataMap = null;\n\n if (this.listenerCount > 0 && this.totalsTable != null) {\n this.addTotalsListeners(totalsTable);\n }\n }\n\n setViewport(top, bottom, columns) {\n if (bottom < top) {\n log.error('Invalid viewport', top, bottom);\n return;\n }\n\n const { viewport } = this;\n if (\n viewport != null &&\n viewport.top === top &&\n viewport.bottom === bottom &&\n viewport.columns === columns\n ) {\n log.debug2('Ignoring duplicate viewport', viewport);\n return;\n }\n\n this.viewport = {\n top,\n bottom,\n columns,\n };\n log.debug2('setViewport', this.viewport);\n\n this.applyViewport();\n }\n\n /**\n * Applies the current viewport to the underlying table.\n */\n applyViewport() {\n if (!this.viewport) {\n return;\n }\n\n log.debug2('applyViewport', this.viewport);\n const { top, bottom, columns } = this.viewport;\n const [viewportTop, viewportBottom] = this.getCachedViewportRowRange(\n top,\n bottom\n );\n this.applyBufferedViewport(viewportTop, viewportBottom, columns);\n }\n\n applyBufferedViewport(viewportTop, viewportBottom, columns) {\n log.debug2('applyBufferedViewport', viewportTop, viewportBottom, columns);\n if (this.subscription == null) {\n log.debug2('applyBufferedViewport creating new subscription');\n this.subscription = this.table.setViewport(\n viewportTop,\n viewportBottom,\n columns\n );\n } else {\n log.debug2('applyBufferedViewport using existing subscription');\n this.subscription.setViewport(viewportTop, viewportBottom, columns);\n }\n }\n\n async snapshot(ranges, includeHeaders = false, formatValue = value => value) {\n if (this.subscription == null) {\n throw new Error('No subscription available');\n }\n\n const consolidated = GridRange.consolidate(ranges);\n if (!IrisGridUtils.isValidSnapshotRanges(consolidated)) {\n throw new Error('Invalid snapshot ranges', ranges);\n }\n\n // Need to separate out the floating ranges as they're from a different source\n const topFloatingRowsSet = new Set();\n const tableRanges = [];\n const bottomFloatingRowsSet = new Set();\n for (let i = 0; i < consolidated.length; i += 1) {\n const range = consolidated[i];\n\n // Get the rows that are in the top aggregations section\n for (\n let r = range.startRow;\n r <= range.endRow && r < this.floatingTopRowCount;\n r += 1\n ) {\n topFloatingRowsSet.add(r);\n }\n\n // Separate out the range that is part of the actual table (ie. not the floating ranges, not aggregations)\n if (\n range.endRow >= this.floatingTopRowCount &&\n range.startRow <= this.floatingTopRowCount + this.table.size\n ) {\n tableRanges.push(\n new GridRange(\n range.startColumn,\n Math.min(Math.max(0, range.startRow - this.floatingTopRowCount)),\n range.endColumn,\n Math.min(\n Math.max(0, range.endRow - this.floatingTopRowCount),\n this.table.size - this.floatingTopRowCount\n )\n )\n );\n }\n\n // Get the rows that are in the bottom aggregations section\n for (\n let r = Math.max(\n range.startRow,\n this.floatingTopRowCount + this.table.size\n );\n r <= range.endRow &&\n r <\n this.floatingTopRowCount +\n this.table.size +\n this.floatingBottomRowCount;\n r += 1\n ) {\n bottomFloatingRowsSet.add(r);\n }\n }\n\n const columns = IrisGridUtils.columnsFromRanges(consolidated, this.columns);\n const result = [];\n if (includeHeaders) {\n result.push(columns.map(c => c.name));\n }\n const topFloatingRows = [...topFloatingRowsSet].sort();\n for (let i = 0; i < topFloatingRows.length; i += 1) {\n const row = topFloatingRows[i];\n const rowData = columns.map(column =>\n formatValue(\n this.valueForCell(this.getColumnIndexByName(column.name), row),\n column\n )\n );\n if (includeHeaders) {\n rowData.push(this.textForRowFooter(row));\n }\n result.push(rowData);\n }\n\n if (tableRanges.length > 0) {\n const rangeSet = IrisGridUtils.rangeSetFromRanges(tableRanges);\n const snapshot = await this.subscription.snapshot(rangeSet, columns);\n result.push(\n ...snapshot.rows.map(rowData =>\n columns.map(column => formatValue(rowData.get(column), column))\n )\n );\n }\n\n const bottomFloatingRows = [...bottomFloatingRowsSet].sort();\n for (let i = 0; i < bottomFloatingRows.length; i += 1) {\n const row = bottomFloatingRows[i];\n const rowData = columns.map(column =>\n formatValue(\n this.valueForCell(this.getColumnIndexByName(column.name), row),\n column\n )\n );\n if (includeHeaders) {\n rowData.push(this.textForRowFooter(row));\n }\n result.push(rowData);\n }\n\n return result;\n }\n\n /**\n * Get a text snapshot of the provided ranges\n * @param {GridRange[]} ranges The ranges to get the snapshot for\n * @param {boolean} includeHeaders Whether to include the headers in the snapshot or not\n * @param {(unknown, dh.Column) => string} formatValue Function for formatting the raw value into a string\n * @returns {string} A formatted string of all the data, columns separated by `\\t` and rows separated by `\\n`\n */\n async textSnapshot(\n ranges,\n includeHeaders = false,\n formatValue = value => `${value}`\n ) {\n log.debug2('textSnapshot', ranges, includeHeaders);\n\n const data = await this.snapshot(ranges, includeHeaders, formatValue);\n return data.map(row => row.join('\\t')).join('\\n');\n }\n\n get isFilterRequired() {\n return this.table.isUncoalesced;\n }\n\n isFilterable(columnIndex) {\n return this.getCachedFilterableColumnSet(this.columns).has(columnIndex);\n }\n\n async valuesTable(column) {\n let table = null;\n try {\n table = await this.table.copy();\n table.applyFilter([]);\n table.applySort([]);\n return table.selectDistinct([column]);\n } finally {\n if (table != null) {\n table.close();\n }\n }\n }\n\n async export() {\n return this.table.freeze();\n }\n\n columnStatistics(column) {\n return this.table.getColumnStatistics(column);\n }\n\n getCachedFilterableColumnSet = memoize(\n columns => new Set(columns.map((_, index) => index))\n );\n\n getCachedFormattedString = memoizeClear(\n (formatter, value, columnType, columnName, formatOverride) =>\n formatter.getFormattedString(\n value,\n columnType,\n columnName,\n formatOverride\n ),\n { max: 10000 }\n );\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n getCachedViewportRowRange = memoize((top, bottom) => {\n const viewHeight = bottom - top;\n const viewportTop = Math.max(\n 0,\n top - viewHeight * IrisGridTableModel.ROW_BUFFER_PAGES\n );\n const viewportBottom =\n bottom + viewHeight * IrisGridTableModel.ROW_BUFFER_PAGES;\n return [viewportTop, viewportBottom];\n });\n\n getCachedPendingErrors = memoize(\n (pendingDataMap, columns, keyColumnCount) => {\n const map = new Map();\n pendingDataMap.forEach((row, rowIndex) => {\n const { data: rowData } = row;\n for (let i = 0; i < keyColumnCount; i += 1) {\n if (!rowData.has(i)) {\n if (!map.has(rowIndex)) {\n map.set(rowIndex, []);\n }\n map\n .get(rowIndex)\n .push(new MissingKeyError(rowIndex, columns[i].name));\n }\n }\n });\n return map;\n }\n );\n\n isColumnMovable(x) {\n const columnName = this.columns[x].name;\n if (\n this.layoutHints?.frontColumns?.includes(columnName) ||\n this.layoutHints?.backColumns?.includes(columnName) ||\n this.frozenColumns.includes(columnName)\n ) {\n return false;\n }\n return !this.isKeyColumn(x);\n }\n\n isColumnFrozen(x) {\n return this.frozenColumns.includes(this.columns[x].name);\n }\n\n isKeyColumn(x) {\n return x < (this.inputTable?.keyColumns.length ?? 0);\n }\n\n isRowMovable() {\n return false;\n }\n\n isEditableRange(range) {\n return (\n this.inputTable != null &&\n GridRange.isBounded(range) &&\n ((this.isPendingRow(range.startRow) && this.isPendingRow(range.endRow)) ||\n (range.startColumn >= this.inputTable.keyColumns.length &&\n range.endColumn >= this.inputTable.keyColumns.length)) &&\n range.startRow >= this.floatingTopRowCount &&\n range.startRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount &&\n range.endRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount\n );\n }\n\n isDeletableRange(range) {\n return (\n this.inputTable != null &&\n range.startRow != null &&\n range.endRow != null &&\n range.startRow >= this.floatingTopRowCount &&\n range.startRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount &&\n range.endRow <\n this.floatingTopRowCount + this.table.size + this.pendingRowCount\n );\n }\n\n isEditableRanges(ranges) {\n return ranges.every(range => this.isEditableRange(range));\n }\n\n isDeletableRanges(ranges) {\n return ranges.every(range => this.isDeletableRange(range));\n }\n\n /**\n * @returns {GridRange} A range corresponding to the underlying table\n */\n getTableAreaRange() {\n return new GridRange(\n null,\n this.floatingTopRowCount,\n null,\n this.floatingTopRowCount + this.table.size - 1\n );\n }\n\n /**\n * @returns {GridRange} A range corresponding to the pending new rows\n */\n getPendingAreaRange() {\n return new GridRange(\n null,\n this.floatingTopRowCount + this.table.size,\n null,\n this.floatingTopRowCount + this.table.size + this.pendingNewRowCount - 1\n );\n }\n\n /**\n * Set value in an editable table\n * @param {number} x The column to set\n * @param {number} y The row to set\n * @param {string} value The value to set\n * @returns {Promise<void>} A promise that resolves successfully when the operation is complete, or rejects if there's an error\n */\n async setValueForCell(x, y, text) {\n // Cache the value in our pending string cache so that it stays displayed until our edit has been completed\n return this.setValueForRanges([new GridRange(x, y, x, y)], text);\n }\n\n /**\n * Set value in an editable table\n * @param {GridRange[]} ranges The ranges to set\n * @param {string} value The values to set\n * @returns {Promise<void>} A promise that resolves successfully when the operation is complete, or rejects if there's an error\n */\n async setValueForRanges(ranges, text) {\n if (!this.isEditableRanges(ranges)) {\n throw new Error('Uneditable ranges', ranges);\n }\n\n try {\n // Cache the value in our pending string cache so that it stays displayed until our edit has been completed\n const columnSet = new Set();\n\n // Formatted text for each column\n // Since there could be different formatting for each column, but the value will be the same across rows\n const formattedText = [];\n GridRange.forEachCell(ranges, (x, y) => {\n const column = this.columns[x];\n columnSet.add(column);\n if (formattedText[x] === undefined) {\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n formattedText[x] =\n value != null\n ? this.displayString(value, column.type, column.name)\n : null;\n }\n this.cachePendingValue(x, y, formattedText[x]);\n });\n\n // Take care of updates to the pending new area first, as they can be updated synchronously\n const pendingAreaRange = this.getPendingAreaRange();\n const pendingRanges = ranges\n .map(range => GridRange.intersection(pendingAreaRange, range))\n .filter(range => range != null)\n .map(range =>\n GridRange.offset(\n range,\n 0,\n -(this.floatingTopRowCount + this.table.size)\n )\n );\n if (pendingRanges.length > 0) {\n const newDataMap = new Map(this.pendingNewDataMap);\n GridRange.forEachCell(pendingRanges, (columnIndex, rowIndex) => {\n if (!newDataMap.has(rowIndex)) {\n newDataMap.set(rowIndex, { data: new Map() });\n }\n\n const column = this.columns[columnIndex];\n const row = newDataMap.get(rowIndex);\n const { data: rowData } = row;\n const newRowData = new Map(rowData);\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n if (value != null) {\n newRowData.set(columnIndex, { value });\n } else {\n newRowData.delete(columnIndex);\n }\n if (newRowData.size > 0) {\n newDataMap.set(rowIndex, { ...row, data: newRowData });\n } else {\n newDataMap.delete(rowIndex);\n }\n });\n this.pendingDataMap = newDataMap;\n }\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n\n const tableAreaRange = this.getTableAreaRange();\n const tableRanges = ranges\n .map(range => GridRange.intersection(tableAreaRange, range))\n .filter(range => range != null);\n if (tableRanges.length > 0) {\n // Get a snapshot of the full rows, as we need to write a full row when editing\n const data = await this.snapshot(\n tableRanges.map(\n range => new GridRange(null, range.startRow, null, range.endRow)\n )\n );\n const newRows = data.map(row => {\n const newRow = {};\n for (let c = 0; c < this.columns.length; c += 1) {\n newRow[this.columns[c].name] = row[c];\n }\n\n columnSet.forEach(column => {\n newRow[column.name] = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n });\n return newRow;\n });\n\n const result = await this.inputTable.addRows(newRows);\n\n log.debug(\n 'setValueForRanges(',\n ranges,\n ',',\n text,\n ') set tableRanges',\n tableRanges,\n 'result',\n result\n );\n }\n\n // Add the changes to the formatted cache so it's still displayed until the update event is received\n // The update event could be received on the next tick, after the input rows have been committed,\n // so make sure we don't display stale data\n GridRange.forEachCell(ranges, (x, y) => {\n this.cacheFormattedValue(x, y, formattedText[x]);\n });\n } catch (err) {\n log.error('Unable to set ranges', ranges, text, err);\n } finally {\n GridRange.forEachCell(ranges, (x, y) => {\n this.clearPendingValue(x, y);\n });\n }\n }\n\n async setValues(edits = []) {\n log.debug('setValues(', edits, ')');\n if (\n !edits.every(edit =>\n this.isEditableRange(\n GridRange.makeCell(edit.column ?? edit.x, edit.row ?? edit.y)\n )\n )\n ) {\n throw new Error('Uneditable ranges', edits);\n }\n\n try {\n const newDataMap = new Map(this.pendingNewDataMap);\n\n // Cache the display values\n edits.forEach(edit => {\n const { text } = edit;\n const x = edit.column ?? edit.x;\n const y = edit.row ?? edit.y;\n const column = this.columns[x];\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n const formattedText =\n value != null\n ? this.displayString(value, column.type, column.name)\n : null;\n this.cachePendingValue(x, y, formattedText);\n\n // Take care of updates to the pending new area as well, as that can be updated synchronously\n const pendingRow = this.pendingRow(y);\n if (pendingRow != null) {\n if (!newDataMap.has(pendingRow)) {\n newDataMap.set(pendingRow, { data: new Map() });\n }\n\n const row = newDataMap.get(pendingRow);\n const { data: rowData } = row;\n const newRowData = new Map(rowData);\n if (value != null) {\n newRowData.set(x, { value });\n } else {\n newRowData.delete(x);\n }\n if (newRowData.size > 0) {\n newDataMap.set(pendingRow, { ...row, data: newRowData });\n } else {\n newDataMap.delete(pendingRow);\n }\n }\n });\n\n this.pendingDataMap = newDataMap;\n\n // Send an update right after setting the pending map so the values are displayed immediately\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n\n // Need to group by row...\n const rowEditMap = edits.reduce((rowMap, edit) => {\n const y = edit.row ?? edit.y;\n if (!rowMap.has(y)) {\n rowMap.set(y, []);\n }\n rowMap.get(y).push(edit);\n return rowMap;\n }, new Map());\n\n const ranges = GridRange.consolidate(\n edits.map(edit =>\n GridRange.makeCell(edit.column ?? edit.x, edit.row ?? edit.y)\n )\n );\n const tableAreaRange = this.getTableAreaRange();\n const tableRanges = ranges\n .map(range => GridRange.intersection(tableAreaRange, range))\n .filter(range => range != null);\n\n if (tableRanges.length > 0) {\n // Get a snapshot of the full rows, as we need to write a full row when editing\n const data = await this.snapshot(\n tableRanges.map(\n range => new GridRange(null, range.startRow, null, range.endRow)\n )\n );\n const newRows = data.map((row, dataIndex) => {\n let rowIndex = null;\n let r = dataIndex;\n for (let i = 0; i < tableRanges.length; i += 1) {\n const range = tableRanges[i];\n const rangeRowCount = GridRange.rowCount([range]);\n if (r < rangeRowCount) {\n rowIndex = range.startRow + r;\n break;\n }\n r -= rangeRowCount;\n }\n\n const newRow = {};\n for (let c = 0; c < this.columns.length; c += 1) {\n newRow[this.columns[c].name] = row[c];\n }\n\n const rowEdits = rowEditMap.get(rowIndex);\n if (rowEdits != null) {\n rowEdits.forEach(edit => {\n const column = this.columns[edit.column ?? edit.x];\n newRow[column.name] = TableUtils.makeValue(\n column.type,\n edit.text,\n this.formatter.timeZone\n );\n });\n }\n return newRow;\n });\n\n log.info('setValues setting tableRanges', tableRanges);\n\n const result = await this.inputTable.addRows(newRows);\n\n log.info('setValues set tableRanges', tableRanges, 'SUCCESS', result);\n }\n\n // We've sent the changes to the server, but have not yet got an update with those changes committed\n // Add the changes to the formatted cache so it's still displayed until the update event is received\n // The update event could be received on the next tick, after the input rows have been committed,\n // so make sure we don't display stale data\n edits.forEach(edit => {\n const { text } = edit;\n const x = edit.column ?? edit.x;\n const y = edit.row ?? edit.y;\n const column = this.columns[x];\n const value = TableUtils.makeValue(\n column.type,\n text,\n this.formatter.timeZone\n );\n const formattedText =\n value != null\n ? this.displayString(value, column.type, column.name)\n : null;\n this.cacheFormattedValue(x, y, formattedText);\n });\n } finally {\n edits.forEach(edit => {\n this.clearPendingValue(edit.column, edit.row);\n });\n }\n }\n\n async commitPending() {\n if (this.pendingNewDataMap.size <= 0) {\n throw new Error('No pending changes to commit');\n }\n\n try {\n this.isSaveInProgress = true;\n\n const newRows = [];\n this.pendingNewDataMap.forEach(row => {\n const newRow = {};\n row.data.forEach(({ value }, columnIndex) => {\n const column = this.columns[columnIndex];\n newRow[column.name] = value;\n });\n newRows.push(newRow);\n });\n const result = await this.inputTable.addRows(newRows);\n\n log.debug('commitPending()', this.pendingNewDataMap, 'result', result);\n\n this.pendingNewDataMap = new Map();\n this.pendingNewDataErrors = new Map();\n this.pendingNewRowCount = Math.max(\n 0,\n (this.viewport?.bottom ?? 0) - this.table.size\n );\n this.formattedStringData = [];\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED)\n );\n\n return result;\n } finally {\n this.isSaveInProgress = false;\n }\n }\n\n editValueForCell(x, y) {\n return this.textValueForCell(x, y);\n }\n\n async delete(ranges) {\n if (!this.isDeletableRanges(ranges)) {\n throw new Error('Undeletable ranges', ranges);\n }\n\n const { keyColumns } = this.inputTable;\n if (keyColumns.length === 0) {\n throw new Error('No key columns to allow deletion');\n }\n\n const pendingAreaRange = this.getPendingAreaRange();\n const pendingRanges = ranges\n .map(range => GridRange.intersection(pendingAreaRange, range))\n .filter(range => range != null)\n .map(range =>\n GridRange.offset(\n range,\n 0,\n -(this.floatingTopRowCount + this.table.size)\n )\n );\n\n if (pendingRanges.length > 0) {\n const newDataMap = new Map(this.pendingNewDataMap);\n for (let i = 0; i < pendingRanges.length; i += 1) {\n const pendingRange = pendingRanges[i];\n for (let r = pendingRange.startRow; r <= pendingRange.endRow; r += 1) {\n newDataMap.delete(r);\n }\n }\n this.pendingNewDataMap = newDataMap;\n\n this.formattedStringData = [];\n\n this.dispatchEvent(\n new CustomEvent(IrisGridModel.EVENT.PENDING_DATA_UPDATED)\n );\n\n this.dispatchEvent(new CustomEvent(IrisGridModel.EVENT.UPDATED));\n }\n\n const tableAreaRange = this.getTableAreaRange();\n const tableRanges = ranges\n .map(range => GridRange.intersection(tableAreaRange, range))\n .filter(range => range != null);\n if (tableRanges.length <= 0) {\n return null;\n }\n const [data, deleteTable] = await Promise.all([\n // Need to get the key values of each row\n this.snapshot(\n tableRanges.map(\n range =>\n new GridRange(\n 0,\n range.startRow,\n keyColumns.length - 1,\n range.endRow\n )\n )\n ),\n this.table.copy(),\n ]);\n\n // Now copy the existing table and filter it on the values in the snapshot for the key columns in the input table\n const filters = data.map(row => {\n const columnFilters = [];\n for (let c = 0; c < keyColumns.length; c += 1) {\n const column = keyColumns[c];\n const value = row[c];\n const filterValue = TableUtils.makeFilterRawValue(column.type, value);\n const filter = column.filter().eq(filterValue);\n columnFilters.push(filter);\n }\n return columnFilters.reduce((agg, curr) => (agg ? agg.and(curr) : curr));\n });\n\n const filter = filters.reduce((agg, curr) => (agg ? agg.or(curr) : curr));\n deleteTable.applyFilter([filter]);\n\n const result = await this.inputTable.deleteTable(deleteTable);\n deleteTable.close();\n return result;\n }\n\n isValidForCell(x, y, value) {\n try {\n const column = this.columns[x];\n TableUtils.makeValue(column.type, value, this.formatter.timeZone);\n return true;\n } catch (e) {\n return false;\n }\n }\n}\n\nexport default IrisGridTableModel;\n"],"file":"IrisGridTableModel.js"}
|
|
@@ -331,7 +331,7 @@ export default class TableSaver extends PureComponent {
|
|
|
331
331
|
type,
|
|
332
332
|
name
|
|
333
333
|
} = this.columns[j];
|
|
334
|
-
var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(formatter,
|
|
334
|
+
var hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(formatter, name, type);
|
|
335
335
|
var formatOverride = null;
|
|
336
336
|
|
|
337
337
|
if (!hasCustomColumnFormat) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sidebar/TableSaver.jsx"],"names":["PureComponent","PropTypes","WritableStream","ponyfillWritableStream","dh","Log","memoizeClear","PromiseUtils","Formatter","FormatterUtils","log","module","TableSaver","csvEscapeString","str","replace","constructor","props","isCustomColumnFormatDefined","max","handlePortMessage","bind","handleSnapshotResolved","handleDownloadTimeout","state","sw","port","fileWriter","table","tableSubscription","columns","fileName","chunkRows","gridRanges","gridRangeCounter","rangedSnapshotsTotal","rangedSnapshotCounter","snapshotsTotal","snapshotCounter","snapshotsBuffer","Map","currentSnapshotIndex","snapshotPending","cancelableSnapshots","window","streamTimeout","snapshotHandlerTimeout","downloadStartTime","iframes","useBlobFallback","safari","componentDidMount","getDownloadWorker","then","info","postMessage","catch","error","warn","componentWillUnmount","length","forEach","iframe","remove","clearTimeout","createWriterStream","useBlob","chunks","encode","TextEncoder","prototype","streamConfig","write","chunk","push","rows","close","blob","Blob","type","link","document","createElement","href","URL","createObjectURL","download","click","abort","cancel","end","startDownload","frozenTable","isDownloading","Date","now","encodedFileName","encodeURIComponent","escape","messageChannel","MessageChannel","port1","getWriter","writeCsvTable","port2","onmessage","finishDownload","onDownloadCompleted","resetTableSaver","cancelDownload","cancelable","onDownloadCanceled","writeTableHeader","headerString","i","name","header","startWriteTableBody","Math","floor","DOWNLOAD_CELL_CHUNK","map","range","ceil","endRow","startRow","reduce","total","snapshotCount","makeSnapshot","min","SNAPSHOT_BUFFER_SIZE","writeSnapshot","snapshotIndex","snapshotStartRow","snapshotEndRow","has","convertSnapshotIntoCsv","get","delete","updateDownloadProgress","debug2","size","onDownloadProgressUpdate","downloadProgress","estimateTime","snapshot","csvString","snapshotIterator","added","iterator","formatter","hasNext","next","value","rowIdx","j","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","formatOverride","cellFormat","getFormat","formatString","cellData","getFormattedString","getData","n","currentGridRange","makeCancelable","RangeSet","ofRange","err","val","data","readableStreamPulling","makeIframe","setTimeout","STREAM_TIMEOUT","set","SNAPSHOT_HANDLER_TIMEOUT","src","hidden","loaded","isIframe","addEventListener","body","appendChild","render","propTypes","func","bool","instanceOf","isRequired","defaultProps","Promise","reject","Error"],"mappings":"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","sourcesContent":["import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { WritableStream as ponyfillWritableStream } from 'web-streams-polyfill/dist/ponyfill.js';\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { memoizeClear } from '@deephaven/grid';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Formatter from '../Formatter';\nimport FormatterUtils from '../FormatterUtils';\n\nconst log = Log.module('TableSaver');\n\nexport default class TableSaver extends PureComponent {\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 csvEscapeString(str) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n constructor(props) {\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.sw = null;\n this.port = null;\n this.fileWriter = null;\n\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n\n this.fileName = null;\n\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\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 // WritableStream is not supported in Firefox (also IE) yet. use ponyfillWritableStream instead\n this.WritableStream = window.WritableStream || ponyfillWritableStream;\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 this.streamTimeout = null;\n\n this.snapshotHandlerTimeout = null;\n\n this.downloadStartTime = null;\n\n this.iframes = [];\n\n this.useBlobFallback = !!window.safari;\n }\n\n componentDidMount() {\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() {\n if (this.iframes.length > 0) {\n this.iframes.forEach(iframe => {\n iframe.remove();\n });\n }\n clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n }\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n createWriterStream(port) {\n // use blob fall back if it's safari\n const useBlob = this.useBlobFallback;\n const chunks = [];\n let encode = null;\n if (useBlob) {\n encode = TextEncoder.prototype.encode.bind(new TextEncoder());\n }\n const { fileName } = this;\n\n const streamConfig = {};\n if (useBlob) {\n streamConfig.write = chunk => {\n chunks.push(encode(chunk.rows));\n };\n streamConfig.close = () => {\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 => {\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 this.WritableStream(streamConfig);\n }\n\n startDownload(fileName, frozenTable, tableSubscription, gridRanges) {\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 = frozenTable.columns;\n this.tableSubscription = tableSubscription;\n this.gridRanges = gridRanges;\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();\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() {\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 log.info(\n `download finished, total elapsed time ${\n (Date.now() - this.downloadStartTime) / 1000\n } seconds`\n );\n }\n\n cancelDownload() {\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(() => {});\n cancelable.cancel();\n }\n });\n const { onDownloadCanceled } = this.props;\n onDownloadCanceled();\n this.resetTableSaver();\n }\n\n resetTableSaver() {\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\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 clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n this.streamTimeout = null;\n this.snapshotHandlerTimeout = null;\n }\n\n handleDownloadTimeout() {\n log.info('download canceled');\n this.cancelDownload();\n }\n\n writeTableHeader() {\n let headerString = '';\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 this.fileWriter.write({ header: headerString }).then(() => {});\n }\n\n startWriteTableBody() {\n this.chunkRows = Math.floor(\n TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length\n );\n\n this.rangedSnapshotsTotal = this.gridRanges.map(range =>\n Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows)\n );\n this.snapshotsTotal = this.rangedSnapshotsTotal.reduce(\n (total, snapshotCount) => 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 writeCsvTable() {\n this.writeTableHeader();\n this.startWriteTableBody();\n }\n\n writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow) {\n if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {\n while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {\n this.fileWriter.write({\n rows: this.convertSnapshotIntoCsv(\n this.snapshotsBuffer.get(this.currentSnapshotIndex),\n snapshotStartRow,\n snapshotEndRow\n ),\n });\n this.snapshotsBuffer.delete(this.currentSnapshotIndex);\n this.currentSnapshotIndex += 1;\n\n this.updateDownloadProgress(snapshotIndex);\n }\n if (this.currentSnapshotIndex >= this.snapshotsTotal) {\n this.finishDownload();\n return;\n }\n }\n\n if (this.snapshotCounter < this.snapshotsTotal) {\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) {\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 convertSnapshotIntoCsv(snapshot) {\n let csvString = '';\n const snapshotIterator = snapshot.added.iterator();\n const { formatter } = this.props;\n\n const rows = [];\n while (snapshotIterator.hasNext()) {\n rows.push(snapshotIterator.next().value);\n }\n\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 const hasCustomColumnFormat = this.getCachedCustomColumnFormatFlag(\n formatter,\n type,\n name\n );\n let formatOverride = null;\n if (!hasCustomColumnFormat) {\n const cellFormat = snapshot.getFormat(rowIdx, this.columns[j]);\n formatOverride = cellFormat?.formatString != null ? cellFormat : null;\n }\n const cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name,\n formatOverride\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) {\n if (n <= 0) {\n return;\n }\n let i = 0;\n let currentGridRange = this.gridRanges[this.gridRangeCounter];\n while (i < n) {\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 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({ data }) {\n const { download, readableStreamPulling } = data;\n if (this.useBlobFallback) {\n return;\n }\n if (download) {\n this.makeIframe(`${download}`);\n this.writeCsvTable();\n }\n if (readableStreamPulling) {\n if (!this.useBlobFallback) {\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,\n snapshotIndex,\n snapshotStartRow,\n snapshotEndRow\n ) {\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) {\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.loaded = false;\n iframe.name = 'iframe';\n iframe.isIframe = true;\n iframe.addEventListener(\n 'load',\n () => {\n iframe.loaded = true;\n },\n false\n );\n document.body.appendChild(iframe);\n this.iframes.push(iframe);\n }\n\n render() {\n return null;\n }\n}\n\nTableSaver.propTypes = {\n getDownloadWorker: PropTypes.func,\n isDownloading: PropTypes.bool,\n onDownloadCompleted: PropTypes.func,\n onDownloadCanceled: PropTypes.func,\n onDownloadProgressUpdate: PropTypes.func,\n formatter: PropTypes.instanceOf(Formatter).isRequired,\n};\n\nTableSaver.defaultProps = {\n getDownloadWorker: () =>\n Promise.reject(new Error('Download worker not provided')),\n isDownloading: false,\n onDownloadCompleted: () => {},\n onDownloadCanceled: () => {},\n onDownloadProgressUpdate: () => {},\n};\n"],"file":"TableSaver.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/sidebar/TableSaver.jsx"],"names":["PureComponent","PropTypes","WritableStream","ponyfillWritableStream","dh","Log","memoizeClear","PromiseUtils","Formatter","FormatterUtils","log","module","TableSaver","csvEscapeString","str","replace","constructor","props","isCustomColumnFormatDefined","max","handlePortMessage","bind","handleSnapshotResolved","handleDownloadTimeout","state","sw","port","fileWriter","table","tableSubscription","columns","fileName","chunkRows","gridRanges","gridRangeCounter","rangedSnapshotsTotal","rangedSnapshotCounter","snapshotsTotal","snapshotCounter","snapshotsBuffer","Map","currentSnapshotIndex","snapshotPending","cancelableSnapshots","window","streamTimeout","snapshotHandlerTimeout","downloadStartTime","iframes","useBlobFallback","safari","componentDidMount","getDownloadWorker","then","info","postMessage","catch","error","warn","componentWillUnmount","length","forEach","iframe","remove","clearTimeout","createWriterStream","useBlob","chunks","encode","TextEncoder","prototype","streamConfig","write","chunk","push","rows","close","blob","Blob","type","link","document","createElement","href","URL","createObjectURL","download","click","abort","cancel","end","startDownload","frozenTable","isDownloading","Date","now","encodedFileName","encodeURIComponent","escape","messageChannel","MessageChannel","port1","getWriter","writeCsvTable","port2","onmessage","finishDownload","onDownloadCompleted","resetTableSaver","cancelDownload","cancelable","onDownloadCanceled","writeTableHeader","headerString","i","name","header","startWriteTableBody","Math","floor","DOWNLOAD_CELL_CHUNK","map","range","ceil","endRow","startRow","reduce","total","snapshotCount","makeSnapshot","min","SNAPSHOT_BUFFER_SIZE","writeSnapshot","snapshotIndex","snapshotStartRow","snapshotEndRow","has","convertSnapshotIntoCsv","get","delete","updateDownloadProgress","debug2","size","onDownloadProgressUpdate","downloadProgress","estimateTime","snapshot","csvString","snapshotIterator","added","iterator","formatter","hasNext","next","value","rowIdx","j","hasCustomColumnFormat","getCachedCustomColumnFormatFlag","formatOverride","cellFormat","getFormat","formatString","cellData","getFormattedString","getData","n","currentGridRange","makeCancelable","RangeSet","ofRange","err","val","data","readableStreamPulling","makeIframe","setTimeout","STREAM_TIMEOUT","set","SNAPSHOT_HANDLER_TIMEOUT","src","hidden","loaded","isIframe","addEventListener","body","appendChild","render","propTypes","func","bool","instanceOf","isRequired","defaultProps","Promise","reject","Error"],"mappings":"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","sourcesContent":["import { PureComponent } from 'react';\nimport PropTypes from 'prop-types';\nimport { WritableStream as ponyfillWritableStream } from 'web-streams-polyfill/dist/ponyfill.js';\nimport dh from '@deephaven/jsapi-shim';\nimport Log from '@deephaven/log';\nimport { memoizeClear } from '@deephaven/grid';\nimport { PromiseUtils } from '@deephaven/utils';\nimport Formatter from '../Formatter';\nimport FormatterUtils from '../FormatterUtils';\n\nconst log = Log.module('TableSaver');\n\nexport default class TableSaver extends PureComponent {\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 csvEscapeString(str) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n\n constructor(props) {\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.sw = null;\n this.port = null;\n this.fileWriter = null;\n\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n\n this.fileName = null;\n\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\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 // WritableStream is not supported in Firefox (also IE) yet. use ponyfillWritableStream instead\n this.WritableStream = window.WritableStream || ponyfillWritableStream;\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 this.streamTimeout = null;\n\n this.snapshotHandlerTimeout = null;\n\n this.downloadStartTime = null;\n\n this.iframes = [];\n\n this.useBlobFallback = !!window.safari;\n }\n\n componentDidMount() {\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() {\n if (this.iframes.length > 0) {\n this.iframes.forEach(iframe => {\n iframe.remove();\n });\n }\n clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n }\n\n getCachedCustomColumnFormatFlag = memoizeClear(\n FormatterUtils.isCustomColumnFormatDefined,\n { max: 10000 }\n );\n\n createWriterStream(port) {\n // use blob fall back if it's safari\n const useBlob = this.useBlobFallback;\n const chunks = [];\n let encode = null;\n if (useBlob) {\n encode = TextEncoder.prototype.encode.bind(new TextEncoder());\n }\n const { fileName } = this;\n\n const streamConfig = {};\n if (useBlob) {\n streamConfig.write = chunk => {\n chunks.push(encode(chunk.rows));\n };\n streamConfig.close = () => {\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 => {\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 this.WritableStream(streamConfig);\n }\n\n startDownload(fileName, frozenTable, tableSubscription, gridRanges) {\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 = frozenTable.columns;\n this.tableSubscription = tableSubscription;\n this.gridRanges = gridRanges;\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();\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() {\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 log.info(\n `download finished, total elapsed time ${\n (Date.now() - this.downloadStartTime) / 1000\n } seconds`\n );\n }\n\n cancelDownload() {\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(() => {});\n cancelable.cancel();\n }\n });\n const { onDownloadCanceled } = this.props;\n onDownloadCanceled();\n this.resetTableSaver();\n }\n\n resetTableSaver() {\n this.table = null;\n this.tableSubscription = null;\n this.columns = null;\n this.chunkRows = null;\n\n this.gridRanges = [];\n this.gridRangeCounter = 0;\n this.rangedSnapshotsTotal = [];\n this.rangedSnapshotCounter = 0;\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 clearTimeout(this.streamTimeout);\n clearTimeout(this.snapshotHandlerTimeout);\n this.streamTimeout = null;\n this.snapshotHandlerTimeout = null;\n }\n\n handleDownloadTimeout() {\n log.info('download canceled');\n this.cancelDownload();\n }\n\n writeTableHeader() {\n let headerString = '';\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 this.fileWriter.write({ header: headerString }).then(() => {});\n }\n\n startWriteTableBody() {\n this.chunkRows = Math.floor(\n TableSaver.DOWNLOAD_CELL_CHUNK / this.columns.length\n );\n\n this.rangedSnapshotsTotal = this.gridRanges.map(range =>\n Math.ceil((range.endRow - range.startRow + 1) / this.chunkRows)\n );\n this.snapshotsTotal = this.rangedSnapshotsTotal.reduce(\n (total, snapshotCount) => 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 writeCsvTable() {\n this.writeTableHeader();\n this.startWriteTableBody();\n }\n\n writeSnapshot(snapshotIndex, snapshotStartRow, snapshotEndRow) {\n if (this.currentSnapshotIndex === snapshotIndex && this.fileWriter) {\n while (this.snapshotsBuffer.has(this.currentSnapshotIndex)) {\n this.fileWriter.write({\n rows: this.convertSnapshotIntoCsv(\n this.snapshotsBuffer.get(this.currentSnapshotIndex),\n snapshotStartRow,\n snapshotEndRow\n ),\n });\n this.snapshotsBuffer.delete(this.currentSnapshotIndex);\n this.currentSnapshotIndex += 1;\n\n this.updateDownloadProgress(snapshotIndex);\n }\n if (this.currentSnapshotIndex >= this.snapshotsTotal) {\n this.finishDownload();\n return;\n }\n }\n\n if (this.snapshotCounter < this.snapshotsTotal) {\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) {\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 convertSnapshotIntoCsv(snapshot) {\n let csvString = '';\n const snapshotIterator = snapshot.added.iterator();\n const { formatter } = this.props;\n\n const rows = [];\n while (snapshotIterator.hasNext()) {\n rows.push(snapshotIterator.next().value);\n }\n\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 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 = cellFormat?.formatString != null ? cellFormat : null;\n }\n const cellData = formatter.getFormattedString(\n snapshot.getData(rowIdx, this.columns[j]),\n type,\n name,\n formatOverride\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) {\n if (n <= 0) {\n return;\n }\n let i = 0;\n let currentGridRange = this.gridRanges[this.gridRangeCounter];\n while (i < n) {\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 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({ data }) {\n const { download, readableStreamPulling } = data;\n if (this.useBlobFallback) {\n return;\n }\n if (download) {\n this.makeIframe(`${download}`);\n this.writeCsvTable();\n }\n if (readableStreamPulling) {\n if (!this.useBlobFallback) {\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,\n snapshotIndex,\n snapshotStartRow,\n snapshotEndRow\n ) {\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) {\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.loaded = false;\n iframe.name = 'iframe';\n iframe.isIframe = true;\n iframe.addEventListener(\n 'load',\n () => {\n iframe.loaded = true;\n },\n false\n );\n document.body.appendChild(iframe);\n this.iframes.push(iframe);\n }\n\n render() {\n return null;\n }\n}\n\nTableSaver.propTypes = {\n getDownloadWorker: PropTypes.func,\n isDownloading: PropTypes.bool,\n onDownloadCompleted: PropTypes.func,\n onDownloadCanceled: PropTypes.func,\n onDownloadProgressUpdate: PropTypes.func,\n formatter: PropTypes.instanceOf(Formatter).isRequired,\n};\n\nTableSaver.defaultProps = {\n getDownloadWorker: () =>\n Promise.reject(new Error('Download worker not provided')),\n isDownloading: false,\n onDownloadCompleted: () => {},\n onDownloadCanceled: () => {},\n onDownloadProgressUpdate: () => {},\n};\n"],"file":"TableSaver.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionalFormattingUtils.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingUtils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ConditionalFormattingUtils.d.ts","sourceRoot":"","sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -725,15 +725,16 @@ export function getFormatColumns(columns, rules) {
|
|
|
725
725
|
} // Stack ternary format conditions by column
|
|
726
726
|
|
|
727
727
|
|
|
728
|
-
var prevRule = (_ruleMap$formatterTyp = ruleMap[formatterType].get(col.name)) !== null && _ruleMap$formatterTyp !== void 0 ? _ruleMap$formatterTyp : null;
|
|
728
|
+
var [prevRule, prevFormatColumn] = (_ruleMap$formatterTyp = ruleMap[formatterType].get(col.name)) !== null && _ruleMap$formatterTyp !== void 0 ? _ruleMap$formatterTyp : ['null', undefined];
|
|
729
729
|
var rule = makeTernaryFormatRule(config, prevRule);
|
|
730
730
|
|
|
731
731
|
if (rule === undefined) {
|
|
732
732
|
log.debug("Ignoring format rule.", config);
|
|
733
733
|
return;
|
|
734
|
-
}
|
|
734
|
+
} // Replace existing formatColumn with the new stacked format
|
|
735
|
+
|
|
735
736
|
|
|
736
|
-
var index = result.indexOf(
|
|
737
|
+
var index = prevFormatColumn === undefined ? -1 : result.indexOf(prevFormatColumn);
|
|
737
738
|
|
|
738
739
|
if (index > -1) {
|
|
739
740
|
result.splice(index, 1);
|
|
@@ -741,7 +742,7 @@ export function getFormatColumns(columns, rules) {
|
|
|
741
742
|
|
|
742
743
|
var formatColumn = formatterType === FormatterType.CONDITIONAL ? makeColumnFormatColumn(col, rule) : makeRowFormatColumn(rule);
|
|
743
744
|
result.push(formatColumn);
|
|
744
|
-
ruleMap[formatterType].set(col.name, rule);
|
|
745
|
+
ruleMap[formatterType].set(col.name, [rule, formatColumn]);
|
|
745
746
|
});
|
|
746
747
|
return result;
|
|
747
748
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingUtils.ts"],"names":["Log","TableUtils","makeColumnFormatColumn","makeRowFormatColumn","makeTernaryFormatRule","log","module","FormatterType","NumberCondition","StringCondition","DateCondition","BooleanCondition","CharCondition","FormatStyleType","getLabelForStyleType","option","NO_FORMATTING","POSITIVE","NEGATIVE","WARN","NEUTRAL","ACCENT_1","ACCENT_2","CUSTOM","getBackgroundForStyleConfig","config","type","customConfig","undefined","background","getColorForStyleConfig","color","getStyleDBString","style","bg","getNumberConditionText","column","value","start","end","getTextForNumberCondition","name","condition","getStringConditionText","getTextForStringCondition","getDateConditionText","getTextForDateCondition","getBooleanConditionText","getTextForBooleanCondition","getCharConditionText","getTextForCharCondition","getConditionDBString","isNumberType","isCharType","isStringType","isDateType","isBooleanType","Error","getLabelForNumberCondition","IS_EQUAL","IS_NOT_EQUAL","IS_BETWEEN","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","IS_NULL","IS_NOT_NULL","getLabelForStringCondition","IS_EXACTLY","IS_NOT_EXACTLY","CONTAINS","DOES_NOT_CONTAIN","STARTS_WITH","ENDS_WITH","getLabelForDateCondition","IS_BEFORE","IS_BEFORE_OR_EQUAL","IS_AFTER","IS_AFTER_OR_EQUAL","getLabelForBooleanCondition","IS_TRUE","IS_FALSE","getLabelForCharCondition","getDefaultConditionForType","columnType","getDefaultValueForType","getConditionConfig","getDefaultConditionConfigForType","getDefaultStyleConfig","getShortLabelForStringCondition","getShortLabelForDateCondition","getShortLabelForBooleanCondition","getShortLabelForCharCondition","getShortLabelForNumberCondition","columnName","getShortLabelForConditionType","getFormatColumns","columns","rules","result","ruleMap","ROWS","Map","CONDITIONAL","forEach","formatterType","col","find","debug","prevRule","get","rule","index","indexOf","splice","formatColumn","push","set","isSupportedColumn"],"mappings":"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","sourcesContent":["import Log from '@deephaven/log';\nimport { Column, CustomColumn } from '@deephaven/jsapi-shim';\nimport TableUtils from '../../TableUtils';\nimport {\n makeColumnFormatColumn,\n makeRowFormatColumn,\n makeTernaryFormatRule,\n} from './ConditionalFormattingAPIUtils';\n\nconst log = Log.module('ConditionalFormattingUtils');\n\nexport type ModelColumn = {\n name: string;\n type: string;\n};\n\nexport type Condition =\n | NumberCondition\n | StringCondition\n | DateCondition\n | BooleanCondition\n | CharCondition;\n\nexport interface BaseFormatConfig {\n column: ModelColumn;\n condition: Condition;\n value?: string;\n start?: string;\n end?: string;\n style: FormatStyleConfig;\n}\n\nexport interface ConditionConfig {\n condition: Condition;\n value?: string;\n start?: string;\n end?: string;\n}\n\nexport type ChangeCallback = (\n ruleConfig: BaseFormatConfig,\n isValid: boolean\n) => void;\n\nexport enum FormatterType {\n CONDITIONAL = 'conditional',\n ROWS = 'rows',\n}\n\nexport interface FormattingRule {\n type: FormatterType;\n config: BaseFormatConfig;\n}\n\nexport enum NumberCondition {\n IS_EQUAL = 'is-equal',\n IS_NOT_EQUAL = 'is-not-equal',\n IS_BETWEEN = 'is-between',\n GREATER_THAN = 'greater-than',\n GREATER_THAN_OR_EQUAL = 'greater-than-or-equal',\n LESS_THAN = 'less-than',\n LESS_THAN_OR_EQUAL = 'less-than-or-equal',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum StringCondition {\n IS_EXACTLY = 'is-exactly',\n IS_NOT_EXACTLY = 'is-not-exactly',\n CONTAINS = 'contains',\n DOES_NOT_CONTAIN = 'does-not-contain',\n STARTS_WITH = 'starts-with',\n ENDS_WITH = 'ends-with',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum DateCondition {\n IS_EXACTLY = 'is-exactly',\n IS_NOT_EXACTLY = 'is-not-exactly',\n IS_BEFORE = 'is-before',\n IS_BEFORE_OR_EQUAL = 'is-before-or-equal',\n IS_AFTER = 'is-after',\n IS_AFTER_OR_EQUAL = 'is-after-or-equal',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum BooleanCondition {\n IS_TRUE = 'is-true',\n IS_FALSE = 'is-false',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum CharCondition {\n IS_EQUAL = 'is-equal',\n IS_NOT_EQUAL = 'is-not-equal',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum FormatStyleType {\n NO_FORMATTING = 'no-formatting',\n POSITIVE = 'positive',\n NEGATIVE = 'negative',\n WARN = 'warn',\n NEUTRAL = 'neutral',\n ACCENT_1 = 'accent-1',\n ACCENT_2 = 'accent-2',\n CUSTOM = 'custom',\n}\n\nexport interface FormatStyleConfig {\n type: FormatStyleType;\n customConfig?: {\n color: string;\n background: string;\n };\n}\n\nexport function getLabelForStyleType(option: FormatStyleType): string {\n switch (option) {\n case FormatStyleType.NO_FORMATTING:\n return 'No formatting';\n case FormatStyleType.POSITIVE:\n return 'Positive';\n case FormatStyleType.NEGATIVE:\n return 'Negative';\n case FormatStyleType.WARN:\n return 'Warn';\n case FormatStyleType.NEUTRAL:\n return 'Neutral';\n case FormatStyleType.ACCENT_1:\n return 'Accent 1';\n case FormatStyleType.ACCENT_2:\n return 'Accent 2';\n case FormatStyleType.CUSTOM:\n return 'Custom...';\n }\n}\n\nexport function getBackgroundForStyleConfig(\n config: FormatStyleConfig\n): string | undefined {\n const { type, customConfig } = config;\n switch (type) {\n case FormatStyleType.NO_FORMATTING:\n return undefined;\n case FormatStyleType.POSITIVE:\n return '#9fde6f';\n case FormatStyleType.NEGATIVE:\n return '#ff6087';\n case FormatStyleType.WARN:\n return '#f67f40';\n case FormatStyleType.NEUTRAL:\n return '#ffd95c';\n case FormatStyleType.ACCENT_1:\n return '#78dce8';\n case FormatStyleType.ACCENT_2:\n return '#ab9bf5';\n case FormatStyleType.CUSTOM:\n return customConfig?.background;\n default:\n return undefined;\n }\n}\n\nexport function getColorForStyleConfig(\n config: FormatStyleConfig\n): string | undefined {\n const { type, customConfig } = config;\n switch (type) {\n case FormatStyleType.NO_FORMATTING:\n return undefined;\n case FormatStyleType.POSITIVE:\n return '#526a3f';\n case FormatStyleType.NEGATIVE:\n return '#802f44';\n case FormatStyleType.WARN:\n return '#663318';\n case FormatStyleType.NEUTRAL:\n return '#63562b';\n case FormatStyleType.ACCENT_1:\n return '#3f6469';\n case FormatStyleType.ACCENT_2:\n return '#554d72';\n case FormatStyleType.CUSTOM:\n return customConfig?.color;\n default:\n return undefined;\n }\n}\n\nexport function getStyleDBString(config: BaseFormatConfig): string | undefined {\n const color = getColorForStyleConfig(config.style);\n const bg = getBackgroundForStyleConfig(config.style);\n if (color === undefined || bg === undefined) {\n return undefined;\n }\n return `bgfg(\\`${bg}\\`, \\`${color}\\`)`;\n}\n\nfunction getNumberConditionText(config: BaseFormatConfig): string {\n const { column, value, start, end } = config;\n return getTextForNumberCondition(\n column.name,\n config.condition as NumberCondition,\n value,\n start,\n end\n );\n}\n\nfunction getStringConditionText(config: BaseFormatConfig): string {\n const { column, value } = config;\n return getTextForStringCondition(\n column.name,\n config.condition as StringCondition,\n value\n );\n}\n\nfunction getDateConditionText(config: BaseFormatConfig): string {\n const { column, value } = config;\n return getTextForDateCondition(\n column.name,\n config.condition as DateCondition,\n value\n );\n}\n\nfunction getBooleanConditionText(config: BaseFormatConfig): string {\n const { column } = config;\n return getTextForBooleanCondition(\n column.name,\n config.condition as BooleanCondition\n );\n}\n\nfunction getCharConditionText(config: BaseFormatConfig): string {\n const { column, value } = config;\n return getTextForCharCondition(\n column.name,\n config.condition as CharCondition,\n value\n );\n}\n\nexport function getConditionDBString(config: BaseFormatConfig): string {\n const { column } = config;\n\n if (TableUtils.isNumberType(column.type)) {\n return getNumberConditionText(config);\n }\n if (TableUtils.isCharType(column.type)) {\n return getCharConditionText(config);\n }\n if (TableUtils.isStringType(column.type)) {\n return getStringConditionText(config);\n }\n if (TableUtils.isDateType(column.type)) {\n return getDateConditionText(config);\n }\n if (TableUtils.isBooleanType(column.type)) {\n return getBooleanConditionText(config);\n }\n\n throw new Error('Invalid column type');\n}\n\nexport function getLabelForNumberCondition(condition: NumberCondition): string {\n switch (condition) {\n case NumberCondition.IS_EQUAL:\n return 'is equal to';\n case NumberCondition.IS_NOT_EQUAL:\n return 'is not equal to';\n case NumberCondition.IS_BETWEEN:\n return 'is between';\n case NumberCondition.GREATER_THAN:\n return 'greater than';\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n return 'greater than or equal to';\n case NumberCondition.LESS_THAN:\n return 'less than';\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return 'less than or equal to';\n case NumberCondition.IS_NULL:\n return 'is null';\n case NumberCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForStringCondition(condition: StringCondition): string {\n switch (condition) {\n case StringCondition.IS_EXACTLY:\n return 'is exactly';\n case StringCondition.IS_NOT_EXACTLY:\n return 'is not exactly';\n case StringCondition.CONTAINS:\n return 'contains';\n case StringCondition.DOES_NOT_CONTAIN:\n return 'does not contain';\n case StringCondition.STARTS_WITH:\n return 'starts with';\n case StringCondition.ENDS_WITH:\n return 'ends with';\n case StringCondition.IS_NULL:\n return 'is null';\n case StringCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForDateCondition(condition: DateCondition): string {\n switch (condition) {\n case DateCondition.IS_EXACTLY:\n return 'is';\n case DateCondition.IS_NOT_EXACTLY:\n return 'is not';\n case DateCondition.IS_BEFORE:\n return 'is before';\n case DateCondition.IS_BEFORE_OR_EQUAL:\n return 'is before or equal';\n case DateCondition.IS_AFTER:\n return 'is after';\n case DateCondition.IS_AFTER_OR_EQUAL:\n return 'is after or equal';\n case DateCondition.IS_NULL:\n return 'is null';\n case DateCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForBooleanCondition(\n condition: BooleanCondition\n): string {\n switch (condition) {\n case BooleanCondition.IS_TRUE:\n return 'is true';\n case BooleanCondition.IS_FALSE:\n return 'is false';\n case BooleanCondition.IS_NULL:\n return 'is null';\n case BooleanCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForCharCondition(condition: CharCondition): string {\n switch (condition) {\n case CharCondition.IS_EQUAL:\n return 'is';\n case CharCondition.IS_NOT_EQUAL:\n return 'is not';\n case CharCondition.IS_NULL:\n return 'is null';\n case CharCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getDefaultConditionForType(columnType: string): Condition {\n if (TableUtils.isNumberType(columnType)) {\n return NumberCondition.IS_EQUAL;\n }\n if (TableUtils.isCharType(columnType)) {\n return CharCondition.IS_EQUAL;\n }\n if (TableUtils.isStringType(columnType)) {\n return StringCondition.IS_EXACTLY;\n }\n if (TableUtils.isDateType(columnType)) {\n return DateCondition.IS_EXACTLY;\n }\n if (TableUtils.isBooleanType(columnType)) {\n return BooleanCondition.IS_TRUE;\n }\n\n throw new Error('Invalid column type');\n}\n\nexport function getDefaultValueForType(columnType: string): string | undefined {\n if (TableUtils.isCharType(columnType)) {\n return '';\n }\n if (TableUtils.isStringType(columnType)) {\n return '';\n }\n return undefined;\n}\n\nexport function getConditionConfig(config: BaseFormatConfig): ConditionConfig {\n const { condition, value, start, end } = config;\n return { condition, value, start, end };\n}\n\nexport function getDefaultConditionConfigForType(\n type: string\n): ConditionConfig {\n return {\n condition: getDefaultConditionForType(type),\n value: getDefaultValueForType(type),\n start: undefined,\n end: undefined,\n };\n}\n\nexport function getDefaultStyleConfig(): FormatStyleConfig {\n return {\n type: FormatStyleType.NO_FORMATTING,\n };\n}\n\nfunction getShortLabelForStringCondition(condition: StringCondition): string {\n switch (condition) {\n case StringCondition.IS_EXACTLY:\n return '==';\n case StringCondition.IS_NOT_EXACTLY:\n return '!=';\n case StringCondition.CONTAINS:\n return 'contains';\n case StringCondition.DOES_NOT_CONTAIN:\n return 'does not contain';\n case StringCondition.STARTS_WITH:\n return 'starts with';\n case StringCondition.ENDS_WITH:\n return 'ends with';\n case StringCondition.IS_NULL:\n return 'is null';\n case StringCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nfunction getShortLabelForDateCondition(condition: DateCondition): string {\n switch (condition) {\n case DateCondition.IS_EXACTLY:\n return '==';\n case DateCondition.IS_NOT_EXACTLY:\n return '!=';\n case DateCondition.IS_BEFORE:\n return '<';\n case DateCondition.IS_BEFORE_OR_EQUAL:\n return '<=';\n case DateCondition.IS_AFTER:\n return '>';\n case DateCondition.IS_AFTER_OR_EQUAL:\n return '>=';\n case DateCondition.IS_NULL:\n return 'is null';\n case DateCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nfunction getShortLabelForBooleanCondition(condition: BooleanCondition): string {\n switch (condition) {\n case BooleanCondition.IS_TRUE:\n return 'is true';\n case BooleanCondition.IS_FALSE:\n return 'is false';\n case BooleanCondition.IS_NULL:\n return 'is null';\n case BooleanCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nfunction getShortLabelForCharCondition(condition: CharCondition): string {\n switch (condition) {\n case CharCondition.IS_EQUAL:\n return '==';\n case CharCondition.IS_NOT_EQUAL:\n return '!=';\n case CharCondition.IS_NULL:\n return 'is null';\n case CharCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getShortLabelForNumberCondition(\n condition: NumberCondition\n): string {\n switch (condition) {\n case NumberCondition.IS_EQUAL:\n return '==';\n case NumberCondition.IS_NOT_EQUAL:\n return '!=';\n case NumberCondition.IS_BETWEEN:\n return '==';\n case NumberCondition.GREATER_THAN:\n return '>';\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n return '>=';\n case NumberCondition.LESS_THAN:\n return '<';\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return '<=';\n case NumberCondition.IS_NULL:\n return 'is null';\n case NumberCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getTextForNumberCondition(\n columnName: string,\n condition: NumberCondition,\n value: unknown,\n start: unknown,\n end: unknown\n): string {\n switch (condition) {\n case NumberCondition.IS_EQUAL:\n return `${columnName} == ${value}`;\n case NumberCondition.IS_NOT_EQUAL:\n return `${columnName} != ${value}`;\n case NumberCondition.IS_BETWEEN:\n return `${columnName} > ${start} && ${columnName} < ${end}`;\n case NumberCondition.GREATER_THAN:\n return `${columnName} > ${value}`;\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n return `${columnName} >= ${value}`;\n case NumberCondition.LESS_THAN:\n return `${columnName} < ${value}`;\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return `${columnName} <= ${value}`;\n case NumberCondition.IS_NULL:\n return `${columnName} == null`;\n case NumberCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForStringCondition(\n columnName: string,\n condition: StringCondition,\n value: unknown\n): string {\n switch (condition) {\n case StringCondition.IS_EXACTLY:\n return `${columnName} == \"${value}\"`;\n case StringCondition.IS_NOT_EXACTLY:\n return `${columnName} != \"${value}\"`;\n case StringCondition.CONTAINS:\n return `${columnName} != null && ${columnName}.contains(\"${value}\")`;\n case StringCondition.DOES_NOT_CONTAIN:\n return `!${columnName} != null && !${columnName}.contains(\"${value}\")`;\n case StringCondition.STARTS_WITH:\n return `!${columnName} != null && ${columnName}.startsWith(\"${value}\")`;\n case StringCondition.ENDS_WITH:\n return `!${columnName} != null && ${columnName}.endsWith(\"${value}\")`;\n case StringCondition.IS_NULL:\n return `${columnName} == null`;\n case StringCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForDateCondition(\n columnName: string,\n condition: DateCondition,\n value: unknown\n): string {\n switch (condition) {\n case DateCondition.IS_EXACTLY:\n return `${columnName} == convertDateTime(\"${value}\")`;\n case DateCondition.IS_NOT_EXACTLY:\n return `${columnName} != convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_BEFORE:\n return `${columnName} < convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_BEFORE_OR_EQUAL:\n return `${columnName} <= convertDateTime(\"${value}\")`;\n case DateCondition.IS_AFTER:\n return `${columnName} > convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_AFTER_OR_EQUAL:\n return `${columnName} >= convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_NULL:\n return `${columnName} == null`;\n case DateCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForBooleanCondition(\n columnName: string,\n condition: BooleanCondition\n): string {\n switch (condition) {\n case BooleanCondition.IS_TRUE:\n return `${columnName} == true`;\n case BooleanCondition.IS_FALSE:\n return `${columnName} == false`;\n case BooleanCondition.IS_NULL:\n return `${columnName} == null`;\n case BooleanCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForCharCondition(\n columnName: string,\n condition: CharCondition,\n value: unknown\n): string {\n switch (condition) {\n case CharCondition.IS_EQUAL:\n return `${columnName} == '${value}'`;\n case CharCondition.IS_NOT_EQUAL:\n return `${columnName} != '${value}'`;\n case CharCondition.IS_NULL:\n return `isNull(${columnName})`;\n case CharCondition.IS_NOT_NULL:\n return `!isNull(${columnName})`;\n }\n}\n\nexport function getShortLabelForConditionType(\n columnType: string,\n condition: Condition\n): string {\n if (TableUtils.isNumberType(columnType)) {\n return getShortLabelForNumberCondition(condition as NumberCondition);\n }\n if (TableUtils.isCharType(columnType)) {\n return getShortLabelForCharCondition(condition as CharCondition);\n }\n if (TableUtils.isStringType(columnType)) {\n return getShortLabelForStringCondition(condition as StringCondition);\n }\n if (TableUtils.isDateType(columnType)) {\n return getShortLabelForDateCondition(condition as DateCondition);\n }\n if (TableUtils.isBooleanType(columnType)) {\n return getShortLabelForBooleanCondition(condition as BooleanCondition);\n }\n\n throw new Error('Invalid column type');\n}\n\n/**\n * Get format columns array for the given columns and formatting rules\n * @param columns Available columns\n * @param rules Formatting rules to build the format columns from\n * @returns Array of format columns\n */\nexport function getFormatColumns(\n columns: Column[],\n rules: FormattingRule[]\n): CustomColumn[] {\n const result: CustomColumn[] = [];\n const ruleMap = {\n [FormatterType.ROWS]: new Map(),\n [FormatterType.CONDITIONAL]: new Map(),\n };\n rules.forEach(({ config, type: formatterType }) => {\n const { column } = config;\n // Check both name and type because the type can change\n const col = columns.find(\n ({ name, type }) => name === column.name && type === column.type\n );\n if (col === undefined) {\n log.debug(\n `Column ${column.name}:${column.type} not found. Ignoring format rule.`,\n config\n );\n return;\n }\n // Stack ternary format conditions by column\n const prevRule = ruleMap[formatterType].get(col.name) ?? null;\n const rule = makeTernaryFormatRule(config, prevRule);\n if (rule === undefined) {\n log.debug(`Ignoring format rule.`, config);\n return;\n }\n const index = result.indexOf(prevRule);\n if (index > -1) {\n result.splice(index, 1);\n }\n const formatColumn =\n formatterType === FormatterType.CONDITIONAL\n ? makeColumnFormatColumn(col, rule)\n : makeRowFormatColumn(rule);\n result.push(formatColumn);\n ruleMap[formatterType].set(col.name, rule);\n });\n\n return result;\n}\n\nexport function isSupportedColumn({ type }: ModelColumn): boolean {\n return (\n TableUtils.isNumberType(type) ||\n TableUtils.isCharType(type) ||\n TableUtils.isStringType(type) ||\n TableUtils.isDateType(type) ||\n TableUtils.isBooleanType(type)\n );\n}\n"],"file":"ConditionalFormattingUtils.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/sidebar/conditional-formatting/ConditionalFormattingUtils.ts"],"names":["Log","TableUtils","makeColumnFormatColumn","makeRowFormatColumn","makeTernaryFormatRule","log","module","FormatterType","NumberCondition","StringCondition","DateCondition","BooleanCondition","CharCondition","FormatStyleType","getLabelForStyleType","option","NO_FORMATTING","POSITIVE","NEGATIVE","WARN","NEUTRAL","ACCENT_1","ACCENT_2","CUSTOM","getBackgroundForStyleConfig","config","type","customConfig","undefined","background","getColorForStyleConfig","color","getStyleDBString","style","bg","getNumberConditionText","column","value","start","end","getTextForNumberCondition","name","condition","getStringConditionText","getTextForStringCondition","getDateConditionText","getTextForDateCondition","getBooleanConditionText","getTextForBooleanCondition","getCharConditionText","getTextForCharCondition","getConditionDBString","isNumberType","isCharType","isStringType","isDateType","isBooleanType","Error","getLabelForNumberCondition","IS_EQUAL","IS_NOT_EQUAL","IS_BETWEEN","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","IS_NULL","IS_NOT_NULL","getLabelForStringCondition","IS_EXACTLY","IS_NOT_EXACTLY","CONTAINS","DOES_NOT_CONTAIN","STARTS_WITH","ENDS_WITH","getLabelForDateCondition","IS_BEFORE","IS_BEFORE_OR_EQUAL","IS_AFTER","IS_AFTER_OR_EQUAL","getLabelForBooleanCondition","IS_TRUE","IS_FALSE","getLabelForCharCondition","getDefaultConditionForType","columnType","getDefaultValueForType","getConditionConfig","getDefaultConditionConfigForType","getDefaultStyleConfig","getShortLabelForStringCondition","getShortLabelForDateCondition","getShortLabelForBooleanCondition","getShortLabelForCharCondition","getShortLabelForNumberCondition","columnName","getShortLabelForConditionType","getFormatColumns","columns","rules","result","ruleMap","ROWS","Map","CONDITIONAL","forEach","formatterType","col","find","debug","prevRule","prevFormatColumn","get","rule","index","indexOf","splice","formatColumn","push","set","isSupportedColumn"],"mappings":"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","sourcesContent":["import Log from '@deephaven/log';\nimport { Column, CustomColumn } from '@deephaven/jsapi-shim';\nimport TableUtils from '../../TableUtils';\nimport {\n makeColumnFormatColumn,\n makeRowFormatColumn,\n makeTernaryFormatRule,\n} from './ConditionalFormattingAPIUtils';\n\nconst log = Log.module('ConditionalFormattingUtils');\n\nexport type ModelColumn = {\n name: string;\n type: string;\n};\n\nexport type Condition =\n | NumberCondition\n | StringCondition\n | DateCondition\n | BooleanCondition\n | CharCondition;\n\nexport interface BaseFormatConfig {\n column: ModelColumn;\n condition: Condition;\n value?: string;\n start?: string;\n end?: string;\n style: FormatStyleConfig;\n}\n\nexport interface ConditionConfig {\n condition: Condition;\n value?: string;\n start?: string;\n end?: string;\n}\n\nexport type ChangeCallback = (\n ruleConfig: BaseFormatConfig,\n isValid: boolean\n) => void;\n\nexport enum FormatterType {\n CONDITIONAL = 'conditional',\n ROWS = 'rows',\n}\n\nexport interface FormattingRule {\n type: FormatterType;\n config: BaseFormatConfig;\n}\n\nexport enum NumberCondition {\n IS_EQUAL = 'is-equal',\n IS_NOT_EQUAL = 'is-not-equal',\n IS_BETWEEN = 'is-between',\n GREATER_THAN = 'greater-than',\n GREATER_THAN_OR_EQUAL = 'greater-than-or-equal',\n LESS_THAN = 'less-than',\n LESS_THAN_OR_EQUAL = 'less-than-or-equal',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum StringCondition {\n IS_EXACTLY = 'is-exactly',\n IS_NOT_EXACTLY = 'is-not-exactly',\n CONTAINS = 'contains',\n DOES_NOT_CONTAIN = 'does-not-contain',\n STARTS_WITH = 'starts-with',\n ENDS_WITH = 'ends-with',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum DateCondition {\n IS_EXACTLY = 'is-exactly',\n IS_NOT_EXACTLY = 'is-not-exactly',\n IS_BEFORE = 'is-before',\n IS_BEFORE_OR_EQUAL = 'is-before-or-equal',\n IS_AFTER = 'is-after',\n IS_AFTER_OR_EQUAL = 'is-after-or-equal',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum BooleanCondition {\n IS_TRUE = 'is-true',\n IS_FALSE = 'is-false',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum CharCondition {\n IS_EQUAL = 'is-equal',\n IS_NOT_EQUAL = 'is-not-equal',\n IS_NULL = 'is-null',\n IS_NOT_NULL = 'is-not-null',\n}\n\nexport enum FormatStyleType {\n NO_FORMATTING = 'no-formatting',\n POSITIVE = 'positive',\n NEGATIVE = 'negative',\n WARN = 'warn',\n NEUTRAL = 'neutral',\n ACCENT_1 = 'accent-1',\n ACCENT_2 = 'accent-2',\n CUSTOM = 'custom',\n}\n\nexport interface FormatStyleConfig {\n type: FormatStyleType;\n customConfig?: {\n color: string;\n background: string;\n };\n}\n\nexport function getLabelForStyleType(option: FormatStyleType): string {\n switch (option) {\n case FormatStyleType.NO_FORMATTING:\n return 'No formatting';\n case FormatStyleType.POSITIVE:\n return 'Positive';\n case FormatStyleType.NEGATIVE:\n return 'Negative';\n case FormatStyleType.WARN:\n return 'Warn';\n case FormatStyleType.NEUTRAL:\n return 'Neutral';\n case FormatStyleType.ACCENT_1:\n return 'Accent 1';\n case FormatStyleType.ACCENT_2:\n return 'Accent 2';\n case FormatStyleType.CUSTOM:\n return 'Custom...';\n }\n}\n\nexport function getBackgroundForStyleConfig(\n config: FormatStyleConfig\n): string | undefined {\n const { type, customConfig } = config;\n switch (type) {\n case FormatStyleType.NO_FORMATTING:\n return undefined;\n case FormatStyleType.POSITIVE:\n return '#9fde6f';\n case FormatStyleType.NEGATIVE:\n return '#ff6087';\n case FormatStyleType.WARN:\n return '#f67f40';\n case FormatStyleType.NEUTRAL:\n return '#ffd95c';\n case FormatStyleType.ACCENT_1:\n return '#78dce8';\n case FormatStyleType.ACCENT_2:\n return '#ab9bf5';\n case FormatStyleType.CUSTOM:\n return customConfig?.background;\n default:\n return undefined;\n }\n}\n\nexport function getColorForStyleConfig(\n config: FormatStyleConfig\n): string | undefined {\n const { type, customConfig } = config;\n switch (type) {\n case FormatStyleType.NO_FORMATTING:\n return undefined;\n case FormatStyleType.POSITIVE:\n return '#526a3f';\n case FormatStyleType.NEGATIVE:\n return '#802f44';\n case FormatStyleType.WARN:\n return '#663318';\n case FormatStyleType.NEUTRAL:\n return '#63562b';\n case FormatStyleType.ACCENT_1:\n return '#3f6469';\n case FormatStyleType.ACCENT_2:\n return '#554d72';\n case FormatStyleType.CUSTOM:\n return customConfig?.color;\n default:\n return undefined;\n }\n}\n\nexport function getStyleDBString(config: BaseFormatConfig): string | undefined {\n const color = getColorForStyleConfig(config.style);\n const bg = getBackgroundForStyleConfig(config.style);\n if (color === undefined || bg === undefined) {\n return undefined;\n }\n return `bgfg(\\`${bg}\\`, \\`${color}\\`)`;\n}\n\nfunction getNumberConditionText(config: BaseFormatConfig): string {\n const { column, value, start, end } = config;\n return getTextForNumberCondition(\n column.name,\n config.condition as NumberCondition,\n value,\n start,\n end\n );\n}\n\nfunction getStringConditionText(config: BaseFormatConfig): string {\n const { column, value } = config;\n return getTextForStringCondition(\n column.name,\n config.condition as StringCondition,\n value\n );\n}\n\nfunction getDateConditionText(config: BaseFormatConfig): string {\n const { column, value } = config;\n return getTextForDateCondition(\n column.name,\n config.condition as DateCondition,\n value\n );\n}\n\nfunction getBooleanConditionText(config: BaseFormatConfig): string {\n const { column } = config;\n return getTextForBooleanCondition(\n column.name,\n config.condition as BooleanCondition\n );\n}\n\nfunction getCharConditionText(config: BaseFormatConfig): string {\n const { column, value } = config;\n return getTextForCharCondition(\n column.name,\n config.condition as CharCondition,\n value\n );\n}\n\nexport function getConditionDBString(config: BaseFormatConfig): string {\n const { column } = config;\n\n if (TableUtils.isNumberType(column.type)) {\n return getNumberConditionText(config);\n }\n if (TableUtils.isCharType(column.type)) {\n return getCharConditionText(config);\n }\n if (TableUtils.isStringType(column.type)) {\n return getStringConditionText(config);\n }\n if (TableUtils.isDateType(column.type)) {\n return getDateConditionText(config);\n }\n if (TableUtils.isBooleanType(column.type)) {\n return getBooleanConditionText(config);\n }\n\n throw new Error('Invalid column type');\n}\n\nexport function getLabelForNumberCondition(condition: NumberCondition): string {\n switch (condition) {\n case NumberCondition.IS_EQUAL:\n return 'is equal to';\n case NumberCondition.IS_NOT_EQUAL:\n return 'is not equal to';\n case NumberCondition.IS_BETWEEN:\n return 'is between';\n case NumberCondition.GREATER_THAN:\n return 'greater than';\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n return 'greater than or equal to';\n case NumberCondition.LESS_THAN:\n return 'less than';\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return 'less than or equal to';\n case NumberCondition.IS_NULL:\n return 'is null';\n case NumberCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForStringCondition(condition: StringCondition): string {\n switch (condition) {\n case StringCondition.IS_EXACTLY:\n return 'is exactly';\n case StringCondition.IS_NOT_EXACTLY:\n return 'is not exactly';\n case StringCondition.CONTAINS:\n return 'contains';\n case StringCondition.DOES_NOT_CONTAIN:\n return 'does not contain';\n case StringCondition.STARTS_WITH:\n return 'starts with';\n case StringCondition.ENDS_WITH:\n return 'ends with';\n case StringCondition.IS_NULL:\n return 'is null';\n case StringCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForDateCondition(condition: DateCondition): string {\n switch (condition) {\n case DateCondition.IS_EXACTLY:\n return 'is';\n case DateCondition.IS_NOT_EXACTLY:\n return 'is not';\n case DateCondition.IS_BEFORE:\n return 'is before';\n case DateCondition.IS_BEFORE_OR_EQUAL:\n return 'is before or equal';\n case DateCondition.IS_AFTER:\n return 'is after';\n case DateCondition.IS_AFTER_OR_EQUAL:\n return 'is after or equal';\n case DateCondition.IS_NULL:\n return 'is null';\n case DateCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForBooleanCondition(\n condition: BooleanCondition\n): string {\n switch (condition) {\n case BooleanCondition.IS_TRUE:\n return 'is true';\n case BooleanCondition.IS_FALSE:\n return 'is false';\n case BooleanCondition.IS_NULL:\n return 'is null';\n case BooleanCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getLabelForCharCondition(condition: CharCondition): string {\n switch (condition) {\n case CharCondition.IS_EQUAL:\n return 'is';\n case CharCondition.IS_NOT_EQUAL:\n return 'is not';\n case CharCondition.IS_NULL:\n return 'is null';\n case CharCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getDefaultConditionForType(columnType: string): Condition {\n if (TableUtils.isNumberType(columnType)) {\n return NumberCondition.IS_EQUAL;\n }\n if (TableUtils.isCharType(columnType)) {\n return CharCondition.IS_EQUAL;\n }\n if (TableUtils.isStringType(columnType)) {\n return StringCondition.IS_EXACTLY;\n }\n if (TableUtils.isDateType(columnType)) {\n return DateCondition.IS_EXACTLY;\n }\n if (TableUtils.isBooleanType(columnType)) {\n return BooleanCondition.IS_TRUE;\n }\n\n throw new Error('Invalid column type');\n}\n\nexport function getDefaultValueForType(columnType: string): string | undefined {\n if (TableUtils.isCharType(columnType)) {\n return '';\n }\n if (TableUtils.isStringType(columnType)) {\n return '';\n }\n return undefined;\n}\n\nexport function getConditionConfig(config: BaseFormatConfig): ConditionConfig {\n const { condition, value, start, end } = config;\n return { condition, value, start, end };\n}\n\nexport function getDefaultConditionConfigForType(\n type: string\n): ConditionConfig {\n return {\n condition: getDefaultConditionForType(type),\n value: getDefaultValueForType(type),\n start: undefined,\n end: undefined,\n };\n}\n\nexport function getDefaultStyleConfig(): FormatStyleConfig {\n return {\n type: FormatStyleType.NO_FORMATTING,\n };\n}\n\nfunction getShortLabelForStringCondition(condition: StringCondition): string {\n switch (condition) {\n case StringCondition.IS_EXACTLY:\n return '==';\n case StringCondition.IS_NOT_EXACTLY:\n return '!=';\n case StringCondition.CONTAINS:\n return 'contains';\n case StringCondition.DOES_NOT_CONTAIN:\n return 'does not contain';\n case StringCondition.STARTS_WITH:\n return 'starts with';\n case StringCondition.ENDS_WITH:\n return 'ends with';\n case StringCondition.IS_NULL:\n return 'is null';\n case StringCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nfunction getShortLabelForDateCondition(condition: DateCondition): string {\n switch (condition) {\n case DateCondition.IS_EXACTLY:\n return '==';\n case DateCondition.IS_NOT_EXACTLY:\n return '!=';\n case DateCondition.IS_BEFORE:\n return '<';\n case DateCondition.IS_BEFORE_OR_EQUAL:\n return '<=';\n case DateCondition.IS_AFTER:\n return '>';\n case DateCondition.IS_AFTER_OR_EQUAL:\n return '>=';\n case DateCondition.IS_NULL:\n return 'is null';\n case DateCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nfunction getShortLabelForBooleanCondition(condition: BooleanCondition): string {\n switch (condition) {\n case BooleanCondition.IS_TRUE:\n return 'is true';\n case BooleanCondition.IS_FALSE:\n return 'is false';\n case BooleanCondition.IS_NULL:\n return 'is null';\n case BooleanCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nfunction getShortLabelForCharCondition(condition: CharCondition): string {\n switch (condition) {\n case CharCondition.IS_EQUAL:\n return '==';\n case CharCondition.IS_NOT_EQUAL:\n return '!=';\n case CharCondition.IS_NULL:\n return 'is null';\n case CharCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getShortLabelForNumberCondition(\n condition: NumberCondition\n): string {\n switch (condition) {\n case NumberCondition.IS_EQUAL:\n return '==';\n case NumberCondition.IS_NOT_EQUAL:\n return '!=';\n case NumberCondition.IS_BETWEEN:\n return '==';\n case NumberCondition.GREATER_THAN:\n return '>';\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n return '>=';\n case NumberCondition.LESS_THAN:\n return '<';\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return '<=';\n case NumberCondition.IS_NULL:\n return 'is null';\n case NumberCondition.IS_NOT_NULL:\n return 'is not null';\n }\n}\n\nexport function getTextForNumberCondition(\n columnName: string,\n condition: NumberCondition,\n value: unknown,\n start: unknown,\n end: unknown\n): string {\n switch (condition) {\n case NumberCondition.IS_EQUAL:\n return `${columnName} == ${value}`;\n case NumberCondition.IS_NOT_EQUAL:\n return `${columnName} != ${value}`;\n case NumberCondition.IS_BETWEEN:\n return `${columnName} > ${start} && ${columnName} < ${end}`;\n case NumberCondition.GREATER_THAN:\n return `${columnName} > ${value}`;\n case NumberCondition.GREATER_THAN_OR_EQUAL:\n return `${columnName} >= ${value}`;\n case NumberCondition.LESS_THAN:\n return `${columnName} < ${value}`;\n case NumberCondition.LESS_THAN_OR_EQUAL:\n return `${columnName} <= ${value}`;\n case NumberCondition.IS_NULL:\n return `${columnName} == null`;\n case NumberCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForStringCondition(\n columnName: string,\n condition: StringCondition,\n value: unknown\n): string {\n switch (condition) {\n case StringCondition.IS_EXACTLY:\n return `${columnName} == \"${value}\"`;\n case StringCondition.IS_NOT_EXACTLY:\n return `${columnName} != \"${value}\"`;\n case StringCondition.CONTAINS:\n return `${columnName} != null && ${columnName}.contains(\"${value}\")`;\n case StringCondition.DOES_NOT_CONTAIN:\n return `!${columnName} != null && !${columnName}.contains(\"${value}\")`;\n case StringCondition.STARTS_WITH:\n return `!${columnName} != null && ${columnName}.startsWith(\"${value}\")`;\n case StringCondition.ENDS_WITH:\n return `!${columnName} != null && ${columnName}.endsWith(\"${value}\")`;\n case StringCondition.IS_NULL:\n return `${columnName} == null`;\n case StringCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForDateCondition(\n columnName: string,\n condition: DateCondition,\n value: unknown\n): string {\n switch (condition) {\n case DateCondition.IS_EXACTLY:\n return `${columnName} == convertDateTime(\"${value}\")`;\n case DateCondition.IS_NOT_EXACTLY:\n return `${columnName} != convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_BEFORE:\n return `${columnName} < convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_BEFORE_OR_EQUAL:\n return `${columnName} <= convertDateTime(\"${value}\")`;\n case DateCondition.IS_AFTER:\n return `${columnName} > convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_AFTER_OR_EQUAL:\n return `${columnName} >= convertDateTime(\\`${value}\\`)`;\n case DateCondition.IS_NULL:\n return `${columnName} == null`;\n case DateCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForBooleanCondition(\n columnName: string,\n condition: BooleanCondition\n): string {\n switch (condition) {\n case BooleanCondition.IS_TRUE:\n return `${columnName} == true`;\n case BooleanCondition.IS_FALSE:\n return `${columnName} == false`;\n case BooleanCondition.IS_NULL:\n return `${columnName} == null`;\n case BooleanCondition.IS_NOT_NULL:\n return `${columnName} != null`;\n }\n}\n\nexport function getTextForCharCondition(\n columnName: string,\n condition: CharCondition,\n value: unknown\n): string {\n switch (condition) {\n case CharCondition.IS_EQUAL:\n return `${columnName} == '${value}'`;\n case CharCondition.IS_NOT_EQUAL:\n return `${columnName} != '${value}'`;\n case CharCondition.IS_NULL:\n return `isNull(${columnName})`;\n case CharCondition.IS_NOT_NULL:\n return `!isNull(${columnName})`;\n }\n}\n\nexport function getShortLabelForConditionType(\n columnType: string,\n condition: Condition\n): string {\n if (TableUtils.isNumberType(columnType)) {\n return getShortLabelForNumberCondition(condition as NumberCondition);\n }\n if (TableUtils.isCharType(columnType)) {\n return getShortLabelForCharCondition(condition as CharCondition);\n }\n if (TableUtils.isStringType(columnType)) {\n return getShortLabelForStringCondition(condition as StringCondition);\n }\n if (TableUtils.isDateType(columnType)) {\n return getShortLabelForDateCondition(condition as DateCondition);\n }\n if (TableUtils.isBooleanType(columnType)) {\n return getShortLabelForBooleanCondition(condition as BooleanCondition);\n }\n\n throw new Error('Invalid column type');\n}\n\n/**\n * Get format columns array for the given columns and formatting rules\n * @param columns Available columns\n * @param rules Formatting rules to build the format columns from\n * @returns Array of format columns\n */\nexport function getFormatColumns(\n columns: Column[],\n rules: FormattingRule[]\n): CustomColumn[] {\n const result: CustomColumn[] = [];\n const ruleMap = {\n [FormatterType.ROWS]: new Map<string, [string, CustomColumn]>(),\n [FormatterType.CONDITIONAL]: new Map<string, [string, CustomColumn]>(),\n };\n rules.forEach(({ config, type: formatterType }) => {\n const { column } = config;\n // Check both name and type because the type can change\n const col = columns.find(\n ({ name, type }) => name === column.name && type === column.type\n );\n if (col === undefined) {\n log.debug(\n `Column ${column.name}:${column.type} not found. Ignoring format rule.`,\n config\n );\n return;\n }\n // Stack ternary format conditions by column\n const [prevRule, prevFormatColumn] = ruleMap[formatterType].get(\n col.name\n ) ?? ['null', undefined];\n const rule = makeTernaryFormatRule(config, prevRule);\n if (rule === undefined) {\n log.debug(`Ignoring format rule.`, config);\n return;\n }\n // Replace existing formatColumn with the new stacked format\n const index =\n prevFormatColumn === undefined ? -1 : result.indexOf(prevFormatColumn);\n if (index > -1) {\n result.splice(index, 1);\n }\n const formatColumn =\n formatterType === FormatterType.CONDITIONAL\n ? makeColumnFormatColumn(col, rule)\n : makeRowFormatColumn(rule);\n result.push(formatColumn);\n ruleMap[formatterType].set(col.name, [rule, formatColumn]);\n });\n\n return result;\n}\n\nexport function isSupportedColumn({ type }: ModelColumn): boolean {\n return (\n TableUtils.isNumberType(type) ||\n TableUtils.isCharType(type) ||\n TableUtils.isStringType(type) ||\n TableUtils.isDateType(type) ||\n TableUtils.isBooleanType(type)\n );\n}\n"],"file":"ConditionalFormattingUtils.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deephaven/iris-grid",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.7-beta.2+ade8524",
|
|
4
4
|
"description": "Deephaven Iris Grid",
|
|
5
5
|
"author": "Deephaven Data Labs LLC",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
"start": "cross-env NODE_ENV=development npm run watch"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@deephaven/console": "^0.11.
|
|
34
|
-
"@deephaven/grid": "^0.11.
|
|
35
|
-
"@deephaven/icons": "^0.11.
|
|
36
|
-
"@deephaven/jsapi-shim": "^0.11.
|
|
37
|
-
"@deephaven/react-hooks": "^0.11.
|
|
38
|
-
"@deephaven/storage": "^0.11.
|
|
39
|
-
"@deephaven/utils": "^0.11.
|
|
33
|
+
"@deephaven/console": "^0.11.7-beta.2+ade8524",
|
|
34
|
+
"@deephaven/grid": "^0.11.7-beta.2+ade8524",
|
|
35
|
+
"@deephaven/icons": "^0.11.7-beta.2+ade8524",
|
|
36
|
+
"@deephaven/jsapi-shim": "^0.11.7-beta.2+ade8524",
|
|
37
|
+
"@deephaven/react-hooks": "^0.11.7-beta.2+ade8524",
|
|
38
|
+
"@deephaven/storage": "^0.11.7-beta.2+ade8524",
|
|
39
|
+
"@deephaven/utils": "^0.11.7-beta.2+ade8524",
|
|
40
40
|
"@fortawesome/react-fontawesome": "^0.1.15",
|
|
41
41
|
"classnames": "^2.3.1",
|
|
42
42
|
"deep-equal": "^2.0.5",
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
"react": "^17.x"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
|
-
"@deephaven/log": "^0.11.
|
|
63
|
-
"@deephaven/mocks": "^0.11.
|
|
64
|
-
"@deephaven/tsconfig": "^0.11.
|
|
62
|
+
"@deephaven/log": "^0.11.7-beta.2+ade8524",
|
|
63
|
+
"@deephaven/mocks": "^0.11.7-beta.2+ade8524",
|
|
64
|
+
"@deephaven/tsconfig": "^0.11.7-beta.2+ade8524"
|
|
65
65
|
},
|
|
66
66
|
"files": [
|
|
67
67
|
"dist"
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"publishConfig": {
|
|
73
73
|
"access": "public"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "ade8524929a123c741dc248825f5ba00b242b387"
|
|
76
76
|
}
|