diff --git a/js/notebook/src/tableDisplay/dataGrid/DataFormatter.ts b/js/notebook/src/tableDisplay/dataGrid/DataFormatter.ts index 88d45b371a..f77f6946a2 100644 --- a/js/notebook/src/tableDisplay/dataGrid/DataFormatter.ts +++ b/js/notebook/src/tableDisplay/dataGrid/DataFormatter.ts @@ -32,6 +32,7 @@ import { selectTimeZone } from "./model/selectors"; import {BeakerxDataStore} from "./store/dataStore"; +import formatTimestamp = DataGridHelpers.formatTimestamp; const bkUtils = require('../../shared/bkUtils'); @@ -228,12 +229,12 @@ export class DataFormatter { : TIME_UNIT_FORMATS.DATETIME.format; if (_.isObject(config.value) && config.value.type === 'Date') { - return bkUtils.formatTimestamp(config.value.timestamp, this.timeZone, format); + return formatTimestamp(config.value.timestamp, this.timeZone, format); } let milli = config.value * 1000; - return bkUtils.formatTimestamp(milli, this.timeZone, format); + return formatTimestamp(milli, this.timeZone, format); } private getTimeFormatForColumn(columnState?: IColumnState) { diff --git a/js/notebook/src/tableDisplay/dataGrid/column/ColumnManager.ts b/js/notebook/src/tableDisplay/dataGrid/column/ColumnManager.ts index 3f58b3eb7f..a1164b9c79 100644 --- a/js/notebook/src/tableDisplay/dataGrid/column/ColumnManager.ts +++ b/js/notebook/src/tableDisplay/dataGrid/column/ColumnManager.ts @@ -23,22 +23,17 @@ import {ICellData} from "../interface/ICell"; import {IColumnPosition, IColumns} from "../interface/IColumn"; import {BeakerxDataStore} from "../store/dataStore"; import { - selectColumnNames, selectHasIndex, selectBodyColumnNames + selectColumnNames, selectHasIndex, selectBodyColumnNames, selectIndexColumnNames } from "../model/selectors"; import {default as DataGridAction, DataGridColumnsAction} from "../store/DataGridAction"; -import { - selectColumnIndexByPosition, - selectIndexColumnNames -} from "./selectors"; -import { - UPDATE_COLUMNS_FILTERS, UPDATE_COLUMNS_VISIBILITY -} from "./reducer"; +import {selectColumnIndexByPosition} from "./selectors"; +import {UPDATE_COLUMNS_FILTERS} from "./reducer"; import {COLUMN_TYPES, SORT_ORDER} from "./enums"; import CellRegion = DataModel.CellRegion; import ICellConfig = CellRenderer.ICellConfig; import {DataGridHelpers} from "../dataGridHelpers"; import sortColumnsByPositionCallback = DataGridHelpers.sortColumnsByPositionCallback; -import {RESET_COLUMNS_ORDER, UPDATE_COLUMN_VISIBLE, UPDATE_COLUMNS_VISIBLE} from "../model/reducer"; +import {RESET_COLUMNS_ORDER, UPDATE_COLUMNS_VISIBLE} from "../model/reducer"; export interface IBkoColumnsChangedArgs { type: COLUMN_CHANGED_TYPES, diff --git a/js/notebook/src/tableDisplay/dataGrid/column/selectors.ts b/js/notebook/src/tableDisplay/dataGrid/column/selectors.ts index 5cf34898d6..dab0a4dc4d 100644 --- a/js/notebook/src/tableDisplay/dataGrid/column/selectors.ts +++ b/js/notebook/src/tableDisplay/dataGrid/column/selectors.ts @@ -56,11 +56,6 @@ export const selectBodyColumnStates = createSelector( .sort((state1, state2) => state1.index - state2.index) )); -export const selectIndexColumnNames = createSelector( - [selectColumnNames, selectHasIndex], - (columnNames, hasIndex) => hasIndex && columnNames[0] !== null ? [columnNames[0]] : [DEFAULT_INDEX_COLUMN_NAME] -); - export const selectVisibleBodyColumns = createSelector( [selectBodyColumnStates, selectColumnsVisible, selectColumnOrder], (bodyColumnStates, columnsVisible, columnOrder) => (bodyColumnStates.filter( diff --git a/js/notebook/src/tableDisplay/dataGrid/dataGridHelpers.ts b/js/notebook/src/tableDisplay/dataGrid/dataGridHelpers.ts index f6a67f25ab..c2c4e96368 100644 --- a/js/notebook/src/tableDisplay/dataGrid/dataGridHelpers.ts +++ b/js/notebook/src/tableDisplay/dataGrid/dataGridHelpers.ts @@ -18,6 +18,7 @@ import {SectionList} from "@phosphor/datagrid/lib/sectionlist"; import {DEFAULT_DATA_FONT_SIZE} from "./style/dataGridStyle"; import {KEYBOARD_KEYS} from "./event/enums"; import DataGridColumn from "./column/DataGridColumn"; +import * as moment from 'moment-timezone/builds/moment-timezone-with-data'; export namespace DataGridHelpers { const urlRegex = /((https?|ftp|file):\/\/)(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[A-Z0-9+&@#/%=~_|$])/i; @@ -177,4 +178,24 @@ export namespace DataGridHelpers { return positionA.region === 'row-header' ? -1 : 1; } + + export function applyTimezone(timestamp, tz) { + const time = moment(timestamp); + + if (!tz) { + return time; + } + + if (tz.startsWith("GMT")) { + time.utcOffset(tz); + } else { + time.tz(tz); + } + + return time; + } + + export function formatTimestamp(timestamp, tz, format) { + return applyTimezone(timestamp, tz).format(format); + } } diff --git a/js/notebook/src/tableDisplay/dataGrid/model/selectors.ts b/js/notebook/src/tableDisplay/dataGrid/model/selectors.ts deleted file mode 100644 index 63ab9a34b4..0000000000 --- a/js/notebook/src/tableDisplay/dataGrid/model/selectors.ts +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright 2018 TWO SIGMA OPEN SOURCE, LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import IDataModelState from "../interface/IDataGridModelState"; -import IHihglighterState from "../interface/IHighlighterState"; -import {getAlignmentByChar, getAlignmentByType} from "../column/columnAlignment"; -import {ALL_TYPES} from "../dataTypes"; -import {TIME_UNIT_FORMATS} from "../../consts"; -import { createSelector } from 'reselect' -import {IColumnPosition} from "../interface/IColumn"; -import {DataModel} from "@phosphor/datagrid"; - -export const DEFAULT_INDEX_COLUMN_NAME = 'index'; - -export const selectModel = (state): IDataModelState => state.model; -export const selectValues = (state) => selectModel(state).values; -export const selectHasIndex = (state) => selectModel(state).hasIndex; -export const selectTooltips = (state) => selectModel(state).tooltips; -export const selectCellHighlighters = (state): IHihglighterState[] => selectModel(state).cellHighlighters || []; -export const selectHeadersVertical = (state) => selectModel(state).headersVertical; -export const selectHeaderFontSize = (state) => selectModel(state).headerFontSize; -export const selectDataFontSize = (state) => selectModel(state).dataFontSize; -export const selectFontColor = (state) => selectModel(state).fontColor; -export const selectRawColumnNames = (state) => selectModel(state).columnNames || []; -export const selectColumnsFrozen = (state) => selectModel(state).columnsFrozen || {}; -export const selectColumnsFrozenNames = createSelector( - [selectColumnsFrozen], - (columnsFrozen): string[] => Object.keys(columnsFrozen).filter(key => columnsFrozen[key]) -); -export const selectColumnsFrozenCount = (state) => selectColumnsFrozenNames(state).length; -export const selectIsColumnFrozen = createSelector( - [selectColumnsFrozenNames, (state, column) => column], - (columnsFrozen, column) => columnsFrozen.indexOf(column.name) !== -1 -); -export const selectColumnNames = createSelector(selectRawColumnNames,names => names.map(name => name !== null ? String(name) : null)); -export const selectBodyColumnNames = createSelector( - [selectColumnNames, selectHasIndex], - (columnNames, hasIndex) => hasIndex ? columnNames.slice(1) : columnNames -); -export const selectColumnTypes = (state) => selectModel(state).types; -export const selectColumnOrder = (state) => selectModel(state).columnOrder; -export const selectColumnsVisible = (state) => selectModel(state).columnsVisible || {}; -export const selectColumnVisible = createSelector( - [selectColumnsVisible, selectColumnOrder, (state, column) => column], - (columnsVisible, columnsOrder, column) => ( - columnsVisible[column.name] !== false - && (columnsOrder.length === 0 || columnsOrder.indexOf(column.name) !== -1) - ) -); -export const selectAlignmentForColumn = (state, dataType, columnName) => (selectModel(state).alignmentForColumn || {})[columnName]; -export const selectAlignmentForType = (state, dataType) => (selectModel(state).alignmentForType || {})[ALL_TYPES[dataType]]; -export const selectAlignmentByType = (state, dataType) => getAlignmentByType(dataType); -export const selectHasDoubleClickAction = (state) => selectModel(state).hasDoubleClickAction; -export const selectDoubleClickTag = (state) => selectModel(state).doubleClickTag; -export const selectContextMenuItems = (state) => selectModel(state).contextMenuItems || []; -export const selectContextMenuTags = (state) => selectModel(state).contextMenuTags || {}; -export const selectStringFormatForType = (state) => selectModel(state).stringFormatForType; -export const selectStringFormatForColumn = (state) => selectModel(state).stringFormatForColumn || {}; -export const selectStringFormatForTimes = (state) => selectModel(state).stringFormatForTimes; -export const selectFormatForTimes = (state) => TIME_UNIT_FORMATS[selectStringFormatForTimes(state)]; -export const selectTimeStrings = (state) => selectModel(state).timeStrings; -export const selectRendererForColumn = (state, column) => selectModel(state).rendererForColumn[column.name]; -export const selectRendererForType = (state, column) => selectModel(state).rendererForType[column.getDataTypeName()]; -export const selectTimeZone = (state) => selectModel(state).timeZone; -export const selectInitialColumnAlignment = createSelector( -[selectAlignmentForColumn, selectAlignmentForType, selectAlignmentByType], -(alignmentForColumn, alignmentForType, alignmentByType) => { - if (alignmentForColumn) { - return getAlignmentByChar(alignmentForColumn); - } - - if (alignmentForType) { - return getAlignmentByChar(alignmentForType); - } - - return alignmentByType; - } -); - -export const selectVisibleColumnsFrozenCount = createSelector( - [selectColumnsFrozenNames, selectColumnsVisible], - (columnsFrozenNames, columnsVisible) => columnsFrozenNames - .filter(name => columnsVisible[name] !== false) - .length -); - -// Returns the map columnIndex => position -export const selectInitialColumnPositions = createSelector( - [selectColumnOrder, selectColumnNames, selectColumnsVisible, selectHasIndex, selectColumnsFrozenNames], - (columnOrder, allColumnNames, columnsVisible, hasIndex, columnsFrozenNames) => { - const hasInitialOrder = columnOrder && columnOrder.length > 0; - const columnNames = hasIndex ? allColumnNames.slice(1) : allColumnNames; - const order = [...columnNames]; - const reversedOrder = [...columnOrder].reverse(); - const frozenColumnsOrder = []; - - if (hasInitialOrder) { - reversedOrder.forEach((name) => { - const columnPosition = order.indexOf(name); - const frozenColumnIndex = columnsFrozenNames.indexOf(name); - - if (frozenColumnIndex !== -1) { - frozenColumnsOrder.unshift(name); - } - - if (columnPosition === -1) { - return true; - } - - order.splice(columnPosition, 1); - order.unshift(name); - }); - } - - Object.keys(columnsVisible).forEach((name) => { - if (columnsVisible[name] === false) { - let indexToRemove = order.indexOf(name); - let removed = order.splice(indexToRemove, 1)[0]; - - order.push(removed); - } - }); - - columnsFrozenNames.forEach((name, index) => { - let frozenColumnIndex = order.indexOf(name); - - if (frozenColumnIndex !== -1) { - order.splice(frozenColumnIndex, 1); - } - - if (frozenColumnsOrder.indexOf(name) === -1) { - frozenColumnsOrder.push(name); - } - }); - - const result: IColumnPosition[] = []; - - columnNames.forEach((name: string, index: number) => { - let value = order.indexOf(name); - let region: DataModel.ColumnRegion = 'body'; - - if (value === -1) { - value = frozenColumnsOrder.indexOf(name) + 1; - region = 'row-header'; - } - - result[index] = { value, region }; - }); - - if (hasIndex) { - result.unshift({ value: 0, region: 'row-header' }); - } - - return result; -}); - -export const selectRenderer = createSelector( - [selectRendererForColumn, selectRendererForType], - (columnRenderer, typeRenderer) => { - if (columnRenderer || columnRenderer === null) { - return columnRenderer; - } - - return typeRenderer; - } -); diff --git a/js/notebook/src/tableDisplay/dataGrid/model/selectors/column.ts b/js/notebook/src/tableDisplay/dataGrid/model/selectors/column.ts new file mode 100644 index 0000000000..a56ece0afc --- /dev/null +++ b/js/notebook/src/tableDisplay/dataGrid/model/selectors/column.ts @@ -0,0 +1,166 @@ +/* + * Copyright 2018 TWO SIGMA OPEN SOURCE, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {createSelector} from "reselect"; +import {DataModel} from "@phosphor/datagrid"; +import { + selectAlignmentByType, + selectAlignmentForColumn, selectAlignmentForType, + selectColumnOrder, + selectColumnsFrozen, selectColumnsVisible, selectHasIndex, + selectRawColumnNames, selectRendererForColumn, selectRendererForType +} from "./model"; +import {getAlignmentByChar} from "../../column/columnAlignment"; +import {IColumnPosition} from "../../interface/IColumn"; + +export const DEFAULT_INDEX_COLUMN_NAME = 'index'; + +export const selectColumnNames = createSelector(selectRawColumnNames, names => names.map(name => name !== null ? String(name) : null)); + +export const selectBodyColumnNames = createSelector( + [selectColumnNames, selectHasIndex], + (columnNames, hasIndex) => hasIndex ? columnNames.slice(1) : columnNames +); + +export const selectIndexColumnNames = createSelector( + [selectColumnNames, selectHasIndex], + (columnNames, hasIndex) => hasIndex && columnNames[0] !== null ? [columnNames[0]] : [DEFAULT_INDEX_COLUMN_NAME] +); + +export const selectColumnsFrozenNames = createSelector( + [selectColumnsFrozen, selectIndexColumnNames], + (columnsFrozen, indexColumnNames): string[] => Object.keys(columnsFrozen).filter( + name => columnsFrozen[name] && indexColumnNames.indexOf(name) === -1 + ) +); + +export const selectColumnsFrozenCount = (state) => selectColumnsFrozenNames(state).length; +export const selectIsColumnFrozen = createSelector( + [selectColumnsFrozenNames, (state, column) => column], + (columnsFrozen, column) => columnsFrozen.indexOf(column.name) !== -1 +); + +export const selectColumnVisible = createSelector( + [selectColumnsVisible, selectColumnOrder, (state, column) => column], + (columnsVisible, columnsOrder, column) => ( + columnsVisible[column.name] !== false + && (columnsOrder.length === 0 || columnsOrder.indexOf(column.name) !== -1) + ) +); + +export const selectInitialColumnAlignment = createSelector( + [selectAlignmentForColumn, selectAlignmentForType, selectAlignmentByType], + (alignmentForColumn, alignmentForType, alignmentByType) => { + if (alignmentForColumn) { + return getAlignmentByChar(alignmentForColumn); + } + + if (alignmentForType) { + return getAlignmentByChar(alignmentForType); + } + + return alignmentByType; + } +); + +export const selectVisibleColumnsFrozenCount = createSelector( + [selectColumnsFrozenNames, selectColumnsVisible], + (columnsFrozenNames, columnsVisible) => columnsFrozenNames + .filter(name => columnsVisible[name] !== false) + .length +); + +// Returns the map columnIndex => position +export const selectInitialColumnPositions = createSelector( +[selectColumnOrder, selectColumnNames, selectColumnsVisible, selectHasIndex, selectColumnsFrozenNames], +(columnOrder, allColumnNames, columnsVisible, hasIndex, columnsFrozenNames) => { + const hasInitialOrder = columnOrder && columnOrder.length > 0; + const columnNames = hasIndex ? allColumnNames.slice(1) : allColumnNames; + const order = [...columnNames]; + const reversedOrder = [...columnOrder].reverse(); + const frozenColumnsOrder = []; + + if (hasInitialOrder) { + reversedOrder.forEach((name) => { + const columnPosition = order.indexOf(name); + const frozenColumnIndex = columnsFrozenNames.indexOf(name); + + if (frozenColumnIndex !== -1) { + frozenColumnsOrder.unshift(name); + } + + if (columnPosition === -1) { + return true; + } + + order.splice(columnPosition, 1); + order.unshift(name); + }); + } + + Object.keys(columnsVisible).forEach((name) => { + if (columnsVisible[name] === false) { + let indexToRemove = order.indexOf(name); + let removed = order.splice(indexToRemove, 1)[0]; + + order.push(removed); + } + }); + + columnsFrozenNames.forEach((name, index) => { + let frozenColumnIndex = order.indexOf(name); + + if (frozenColumnIndex !== -1) { + order.splice(frozenColumnIndex, 1); + } + + if (frozenColumnsOrder.indexOf(name) === -1) { + frozenColumnsOrder.push(name); + } + }); + + const result: IColumnPosition[] = []; + + columnNames.forEach((name: string, index: number) => { + let value = order.indexOf(name); + let region: DataModel.ColumnRegion = 'body'; + + if (value === -1) { + value = frozenColumnsOrder.indexOf(name) + 1; + region = 'row-header'; + } + + result[index] = { value, region }; + }); + + if (hasIndex) { + result.unshift({ value: 0, region: 'row-header' }); + } + + return result; + } +); + +export const selectRenderer = createSelector( + [selectRendererForColumn, selectRendererForType], + (columnRenderer, typeRenderer) => { + if (columnRenderer || columnRenderer === null) { + return columnRenderer; + } + + return typeRenderer; + } +); diff --git a/js/notebook/src/tableDisplay/dataGrid/model/selectors/index.ts b/js/notebook/src/tableDisplay/dataGrid/model/selectors/index.ts new file mode 100644 index 0000000000..0d42513448 --- /dev/null +++ b/js/notebook/src/tableDisplay/dataGrid/model/selectors/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2018 TWO SIGMA OPEN SOURCE, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './model' +export * from './column' diff --git a/js/notebook/src/tableDisplay/dataGrid/model/selectors/model.ts b/js/notebook/src/tableDisplay/dataGrid/model/selectors/model.ts new file mode 100644 index 0000000000..7ac8bb2d05 --- /dev/null +++ b/js/notebook/src/tableDisplay/dataGrid/model/selectors/model.ts @@ -0,0 +1,51 @@ +/* + * Copyright 2018 TWO SIGMA OPEN SOURCE, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {TIME_UNIT_FORMATS} from "../../../consts"; +import {getAlignmentByType} from "../../column/columnAlignment"; +import {ALL_TYPES} from "../../dataTypes"; +import IDataModelState from "../../interface/IDataGridModelState"; +import IHihglighterState from "../../interface/IHighlighterState" + +export const selectModel = (state): IDataModelState => state.model; +export const selectValues = (state) => selectModel(state).values; +export const selectHasIndex = (state) => selectModel(state).hasIndex; +export const selectTooltips = (state) => selectModel(state).tooltips; +export const selectCellHighlighters = (state): IHihglighterState[] => selectModel(state).cellHighlighters || []; +export const selectHeadersVertical = (state) => selectModel(state).headersVertical; +export const selectHeaderFontSize = (state) => selectModel(state).headerFontSize; +export const selectDataFontSize = (state) => selectModel(state).dataFontSize; +export const selectFontColor = (state) => selectModel(state).fontColor; +export const selectRawColumnNames = (state) => selectModel(state).columnNames || []; +export const selectAlignmentForColumn = (state, dataType, columnName) => (selectModel(state).alignmentForColumn || {})[columnName]; +export const selectAlignmentForType = (state, dataType) => (selectModel(state).alignmentForType || {})[ALL_TYPES[dataType]]; +export const selectAlignmentByType = (state, dataType) => getAlignmentByType(dataType); +export const selectHasDoubleClickAction = (state) => selectModel(state).hasDoubleClickAction; +export const selectDoubleClickTag = (state) => selectModel(state).doubleClickTag; +export const selectContextMenuItems = (state) => selectModel(state).contextMenuItems || []; +export const selectContextMenuTags = (state) => selectModel(state).contextMenuTags || {}; +export const selectStringFormatForType = (state) => selectModel(state).stringFormatForType; +export const selectStringFormatForColumn = (state) => selectModel(state).stringFormatForColumn || {}; +export const selectStringFormatForTimes = (state) => selectModel(state).stringFormatForTimes; +export const selectFormatForTimes = (state) => TIME_UNIT_FORMATS[selectStringFormatForTimes(state)]; +export const selectTimeStrings = (state) => selectModel(state).timeStrings; +export const selectRendererForColumn = (state, column) => selectModel(state).rendererForColumn[column.name]; +export const selectRendererForType = (state, column) => selectModel(state).rendererForType[column.getDataTypeName()]; +export const selectTimeZone = (state) => selectModel(state).timeZone; +export const selectColumnTypes = (state) => selectModel(state).types; +export const selectColumnOrder = (state) => selectModel(state).columnOrder; +export const selectColumnsVisible = (state) => selectModel(state).columnsVisible || {}; +export const selectColumnsFrozen = (state) => selectModel(state).columnsFrozen || {}; diff --git a/js/notebook/test/src/tableDisplay/dataGrid/DataFormatter.spec.ts b/js/notebook/test/src/tableDisplay/dataGrid/DataFormatter.spec.ts index 58b1395903..7c7b997c5f 100644 --- a/js/notebook/test/src/tableDisplay/dataGrid/DataFormatter.spec.ts +++ b/js/notebook/test/src/tableDisplay/dataGrid/DataFormatter.spec.ts @@ -108,12 +108,10 @@ describe('DataFormatter', () => { .to.equal('&test<>"Works"Ok/<>'); }); - /* it('should convert to date', () => { expect(stringFormatFn({ ...cellConfig, value: { timestamp: 1516697673043, type: 'Date' }})) .to.equal('20180123 09:54:33.043 +0100'); }); - */ it('should return given value', () => { expect(stringFormatFn({ ...cellConfig, value: 1 })).to.equal(1); @@ -291,14 +289,12 @@ describe('DataFormatter', () => { bkUtils.formatTimestamp.restore() }); - /* it('should return formatted datetime', () => { expect(datetimeFormatFn({ ...cellConfig, value: { timestamp: 1516697673043, type: 'Date' }})) - .to.equal('20180123 09:54:33.043 +0100'); + .to.equal('20180123 08:54:33.043 +0000'); - expect(datetimeFormatFn({ ...cellConfig, value: 1516703121 })).to.equal('20180123 11:25:21.000 +0100'); + expect(datetimeFormatFn({ ...cellConfig, value: 1516703121 })).to.equal('20180123 10:25:21.000 +0000'); }); - */ it('should return Invalid date', () => { expect(datetimeFormatFn({ ...cellConfig, value: NaN }).toString()).to.equal('Invalid date'); diff --git a/js/notebook/test/src/tableDisplay/dataGrid/mock/modelStateMock.ts b/js/notebook/test/src/tableDisplay/dataGrid/mock/modelStateMock.ts index 008e10a36b..bb86c47b28 100644 --- a/js/notebook/test/src/tableDisplay/dataGrid/mock/modelStateMock.ts +++ b/js/notebook/test/src/tableDisplay/dataGrid/mock/modelStateMock.ts @@ -44,7 +44,7 @@ let modelStateMock: IDataGridModelState = { stringFormatForType: {}, subtype: 'Tabledisplay', timeStrings: null, - timeZone: null, + timeZone: 'UTC', tooManyRows: false, type: 'Tabledisplay', };