Skip to content

Commit

Permalink
Merge branch 'data-process' into support-drill-down
Browse files Browse the repository at this point in the history
# Conflicts:
#	packages/s2-core/package.json
#	packages/s2-core/src/cell/data-derived-cell.ts
#	packages/s2-core/src/common/store/index.ts
#	packages/s2-core/src/sheet-type/index.ts
  • Loading branch information
brucetoo committed Jun 17, 2021
2 parents 0a69f1a + ae96c71 commit 3832e6c
Show file tree
Hide file tree
Showing 8 changed files with 213 additions and 41 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"core:build": "cd ./packages/s2-core && lerna run build --include-dependencies --stream",
"core:release": "cd ./packages/s2-core && lerna run build --include-dependencies --stream && lerna publish",
"core:test": "cd ./packages/s2-core && npm run test",
"core-test:live": "cd ./packages/s2-core && npm run test:live",
"core:tsc": "cd ./packages/s2-core && npm run tsc",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0",
"site:start": "cd ./s2-site && npm run start",
Expand All @@ -40,7 +41,7 @@
"hooks": {
"pre-commit": "lint-staged",
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
"pre-push": "cd ./packages/s2-core && npm run test"
"pre-push": "cd ./packages/s2-core && npm run test:coverage"
}
},
"lint-staged": {
Expand Down
24 changes: 11 additions & 13 deletions packages/s2-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"author": "https://github.com/orgs/antvis/people",
"directories": {
"lib": "lib",
"test": "__tests__"
"test": "tests"
},
"repository": {
"type": "git",
Expand Down Expand Up @@ -38,19 +38,11 @@
"rollup:cjs": "FORMAT=cjs rollup -c rollup.config.js",
"rollup:umd": "FORMAT=umd rollup -c rollup.config.js",
"watch": "rimraf esm && FORMAT=es rollup -w -c rollup.config.js",
"coverage": "jest --coverage",
"cpx:svg": "cpx \"src/**/*.svg\" lib; cpx \"src/**/*.svg\" esm",
"cpx:less": "cpx \"src/**/*.less\" lib; cpx \"src/**/*.less\" esm",
"test:live": "node ./scripts/test-live",
"test": "jest",
"test-custom-header-cell": "DEBUG_MODE=1 jest __tests__/spreadsheet/custom-header-cell-spec.tsx",
"test-live": "DEBUG_MODE=1 jest __tests__/s2/spread-sheet-spec.tsx",
"test-accuracy1": "DEBUG_MODE=1 jest __tests__/s2/data-accuracy-one-measure-spec.tsx",
"test-pivot": "DEBUG_MODE=1 jest __tests__/s2/data-set/pivot-data-set.spec.ts --verbose",
"test-accuracy2": "DEBUG_MODE=1 jest __tests__/s2/data-accuracy-two-measures-spec.tsx",
"test-drill-down": "DEBUG_MODE=1 jest tests/spreadsheet/part-drill-down-spec.tsx",
"test-pressure": "DEBUG_MODE=1 jest __tests__/spreadsheet/pressure-test-spec.tsx",
"test-tabular": "DEBUG_MODE=1 jest __tests__/spreadsheet/tabularSheet-spec.tsx",
"test-merge-cells": "DEBUG_MODE=1 jest __tests__/spreadsheet/merge-cells-spec.tsx",
"test:coverage": "npm run test -- --coverage",
"start": "webpack --config webpack-dev.config.js --mode development --progress",
"tsc": "tsc --noEmit"
},
Expand Down Expand Up @@ -81,6 +73,8 @@
"cpx": "^1.5.0",
"css-loader": "^5.2.6",
"d3-dsv": "^1.1.1",
"glob": "^7.1.7",
"inquirer": "^8.1.0",
"install": "^0.13.0",
"jest": "^24.9.0",
"jest-electron": "^0.1.11",
Expand All @@ -92,6 +86,7 @@
"less-loader": "^9.0.0",
"lint-staged": "^9.2.3",
"npm-run-all": "^4.1.5",
"ora": "^5.4.1",
"react": "^16.14.0",
"react-dom": "^16.14.0",
"rimraf": "^3.0.0",
Expand Down Expand Up @@ -129,9 +124,12 @@
"!**/node_modules/**",
"!**/vendor/**"
],
"coverageReporters":["text-summary","html"],
"coverageReporters": [
"text-summary",
"html"
],
"transformIgnorePatterns": [],
"testRegex": "/tests/(s2|spreadsheet)/.*(-|\\.)spec\\.(tsx|ts|js)?$",
"testRegex": "/tests/.*(-|\\.)spec\\.(tsx|ts|js)?$",
"transform": {
"\\.(less|css)$": "jest-less-loader",
"\\.svg$": "jest-raw-loader"
Expand Down
35 changes: 35 additions & 0 deletions packages/s2-core/scripts/test-live.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
const { prompt } = require('inquirer');
const { execSync } = require('child_process');
const path = require('path');
const glob = require('glob');
const ora = require('ora');

async function main() {
const spinner = ora('读取测试文件中...').start();
const paths = glob.sync(`!(node_modules)/**/*-spec.ts?(x)`);
const defaultFilename = path.relative(
process.cwd(),
'tests/unit/spread-sheet-spec.tsx',
);
spinner.stop();

const selectedPath = await prompt([
{
type: 'list',
message: '请选择测试文件',
name: 'path',
choices: paths,
default: () => defaultFilename,
},
]);

const jestSpinner = ora('测试运行中...').start();
try {
execSync(`DEBUG_MODE=1 jest ${selectedPath.path}`);
jestSpinner.succeed('测试运行完成.');
} catch (error) {
jestSpinner.fail();
}
}

main();
7 changes: 7 additions & 0 deletions packages/s2-core/src/common/interface/basic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { BaseTooltip } from '../tooltip';
import { S2DataConfig, safetyDataConfig, Data, DataItem } from './s2DataConfig';
import { S2Options, safetyOptions } from './s2Options';
import { CustomInteraction } from './interaction';
import { ResizeInfo } from '../../facet/header/interface';

export { S2DataConfig, safetyDataConfig, S2Options, safetyOptions, Data };

Expand Down Expand Up @@ -454,3 +455,9 @@ export interface CellPosition {
x: number;
y: number;
}

export interface CellAppendInfo<T = Node> extends Partial<ResizeInfo> {
isCornerHeaderText?: boolean;
isRowHeaderText?: boolean;
cellData?: T;
}
3 changes: 3 additions & 0 deletions packages/s2-core/src/common/store/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
ColWidthCache,
DrillDownDataCache,
DrillDownFieldInLevel,
SortParam,
Expand Down Expand Up @@ -51,6 +52,8 @@ interface StoreKey {
drillDownNode: Node;
// display drill-down data count
drillItemsNum: number;
// 列宽信息缓存
colRealWidthInfo: ColWidthCache;

[key: string]: any;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import { Event } from '@antv/g-canvas';
import { get, isEmpty, set, each, find } from 'lodash';
import { get, isEmpty, find, head } from 'lodash';
import { KEY_JUMP_HREF } from '../../../common/constant';
import { S2Event, DefaultInterceptEventType } from '../types';
import { BaseEvent } from '../base-event';
import { Data } from '../../../common/interface/s2DataConfig';
import { CellAppendInfo } from '../../../common/interface';
import { Node } from '../../../facet/layout/node';

/**
* Row header click navigation interaction
Expand All @@ -19,37 +22,76 @@ export class RowTextClick extends BaseEvent {
) {
return;
}
const appendInfo = get(ev.target, 'attrs.appendInfo', {});
const appendInfo = get(
ev.target,
'attrs.appendInfo',
{},
) as CellAppendInfo;

if (appendInfo.isRowHeaderText) {
// 行头内的文本
const cellData = get(ev.target, 'attrs.appendInfo.cellData');
const { cellData } = appendInfo;
const key = cellData.key;
// 从当前节点出发往上遍历树拿到数据,如点中的是西湖区,则需要拿到 { 省份: 浙江省, 城市: 杭州市, 区县: 西湖区 }
let node = cellData;
const record = {};
while (node.parent) {
record[node.key] = node.value;
node = node.parent;
}
// 透传本行所有数据,供跳转时解析参数
const currentRowData = find(
this.spreadsheet.dataCfg.data,
(d) => d[key] === cellData.value,
);
if (!isEmpty(currentRowData)) {
each(currentRowData, (v, k) => {
record[k] = v;
});
}
// 明细表需要增加rowIndex透出
if (!get(this, 'spreadsheet.options.spreadsheetType')) {
set(record, 'rowIndex', cellData.rowIndex);
}
const rowData = this.getRowData(cellData);

this.spreadsheet.emit(KEY_JUMP_HREF, {
key,
record,
record: rowData,
});
}
});
}

private getRowData = (cellData: Node): Data => {
let node = cellData;
const nodeData: Data = {};
while (node.parent) {
nodeData[node.key] = node.value;
node = node.parent;
}
const rowIndex = this.getRowIndex(cellData);
const originalRowData = this.getOriginalRowData(cellData, rowIndex);
const rowData: Data = {
...originalRowData,
...nodeData,
rowIndex,
};

return rowData;
};

private getOriginalRowData = (cellData: Node, rowIndex: number) => {
const { options } = this.spreadsheet;
const { showGrandTotals, showSubTotals, reverseLayout, reverseSubLayout } =
options?.totals?.row || {};

// If grand totals, sub totals enabled and in the table head
const grandTotalsRowIndexDiff = showGrandTotals && reverseLayout ? 1 : 0;
const subTotalsRowIndexDiff = showSubTotals && reverseSubLayout ? 1 : 0;

const dataIndex = Math.max(
0,
rowIndex - grandTotalsRowIndexDiff - subTotalsRowIndexDiff,
);

const currentRowData = find(
this.spreadsheet.dataCfg.data,
(row: Data, index: number) =>
row[cellData.key] === cellData.value && index === dataIndex,
);
return currentRowData;
};

private getRowIndex = (cellData: Node) => {
const isTree = this.spreadsheet?.options?.hierarchyType === 'tree';
if (isTree) {
let child = cellData;
while (!isEmpty(child.children)) {
child = head(child.children);
}
return cellData.rowIndex ?? child.rowIndex;
}
// if current cell has no row index, return dynamic computed value
const rowIndex = Math.floor(cellData.y / cellData.height);
return cellData.rowIndex ?? rowIndex;
};
}
2 changes: 1 addition & 1 deletion packages/s2-core/tests/unit/spread-sheet-spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import React from 'react';
import { Switch, Checkbox } from 'antd';
import { CustomTooltip } from '../spreadsheet/custom/custom-tooltip';

let data = getMockData('../tests/data/tableau-supermarket.csv');
let data = getMockData('../data/tableau-supermarket.csv');

data = data.map((row) => {
row['profit-tongbi'] = 0.2233;
Expand Down
86 changes: 86 additions & 0 deletions packages/s2-core/tests/unit/state/state.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import { RowCell } from '@/cell/row-cell';
import { SelectedStateName } from '@/common/constant/interatcion';
import { SpreadSheet } from '@/sheet-type';
import { State } from '@/state/state';

jest.mock('@/sheet-type');
jest.mock('@/cell/row-cell');
const MockSpreadSheet = (SpreadSheet as any) as jest.Mock<SpreadSheet>;
const MockRowCell = (RowCell as any) as jest.Mock<RowCell>;
describe('State Test', () => {
let state: State;
let mockInstance;
let mockRowCellInstance;

beforeEach(() => {
MockSpreadSheet.mockClear();
MockRowCell.mockClear();

mockInstance = new MockSpreadSheet();
mockRowCellInstance = new MockRowCell();

state = new State(mockInstance);
});
test('should set select status correctly', () => {
expect(state.getCurrentState()).toEqual({
stateName: '',
cells: [],
});

state.setState(mockRowCellInstance, SelectedStateName.ROW_SELECTED);

expect(state.getCurrentState()).toEqual({
stateName: SelectedStateName.ROW_SELECTED,
cells: [mockRowCellInstance],
});
});

test("should push row cell in current state when state doestn't include it", () => {
state.setState(mockRowCellInstance, SelectedStateName.ROW_SELECTED);

expect(state.getCurrentState()).toEqual({
stateName: SelectedStateName.ROW_SELECTED,
cells: [mockRowCellInstance],
});

const other = new MockRowCell();
state.setState(other, SelectedStateName.ROW_SELECTED);

expect(state.getCurrentState()).toEqual({
stateName: SelectedStateName.ROW_SELECTED,
cells: [mockRowCellInstance, other],
});
});

test('should do nothing when state includes it', () => {
state.setState(mockRowCellInstance, SelectedStateName.ROW_SELECTED);

expect(state.getCurrentState()).toEqual({
stateName: SelectedStateName.ROW_SELECTED,
cells: [mockRowCellInstance],
});

state.setState(mockRowCellInstance, SelectedStateName.ROW_SELECTED);

expect(state.getCurrentState()).toEqual({
stateName: SelectedStateName.ROW_SELECTED,
cells: [mockRowCellInstance],
});
});

test('should clear existed state when call clearState function', () => {
state.setState(mockRowCellInstance, SelectedStateName.ROW_SELECTED);

expect(state.getCurrentState()).toEqual({
stateName: SelectedStateName.ROW_SELECTED,
cells: [mockRowCellInstance],
});

state.clearState();

expect(state.getCurrentState()).toEqual({
stateName: '',
cells: [],
});
});
});

0 comments on commit 3832e6c

Please sign in to comment.