View Code? Open in Web Editor
NEW
⚡️ A practical visualization library for tabular analysis.
Home Page: https://s2.antv.antgroup.com
License: MIT License
JavaScript 1.23%
TypeScript 96.40%
Less 0.81%
Shell 0.02%
HTML 0.02%
Vue 1.51%
CSS 0.02%
s2's Issues
|
// TODO 使用到的时候根据情况增加配置项 |
|
// const updateScrollOffset = (nodeKey: string, isRow = true) => { |
|
// let item; |
|
// if (isRow) { |
|
// item = baseSpreadsheet |
|
// .getRowNodes() |
This issue was generated by todo based on a TODO
comment in 3f5afbc when #52 was merged. cc @antvis.
use totalData to control if calculate value by Front-End
|
// TODO adapt drill down scene |
|
const { rows, columns, valueInCols } = this.fields; |
|
const rowDimensionValues = this.getQueryDimValues(rows, query); |
|
const colDimensionValues = this.getQueryDimValues(columns, query); |
|
const path = this.getDataPath({ |
|
rowDimensionValues, |
This issue was generated by todo based on a TODO
comment in 72a66fd when #76 was merged. cc @antvis.
当存在成本和价格两个指标的时候,初始化显示错误:
切换指标挂行头能正确显示
鼠标拖动框选多个cell时,这样计算会比较耗费性能,最好是计算startCell和endCell的index,然后再处理数据。
另外selectedCells是不是用二维数组表示更好
比如 关闭关闭十字器后, 再次刷选, mask 不显示了
|
// TODO 如何去业务化 |
|
const tempCell = data?.label ? [data?.label] : []; |
|
const values = data?.values; |
|
if(!isEmpty(values)) { |
|
forEach(values, (value) => { |
|
tempCell.push(value.join(' ')); |
This issue was generated by todo based on a TODO
comment in 6e9cd55. It's been assigned to @xingwanying because they committed the code.
|
// TODO 待整理 |
|
export const KEY_LIST_SORT = 'spreadsheet:list-sort'; |
|
export const KEY_COLLAPSE_TREE_ROWS = 'spreadsheet:collapsed-tree-rows'; |
|
export const KEY_JUMP_HREF = 'spreadsheet:jump-href'; |
This issue was generated by todo based on a TODO
comment in 9a8f183 when #174 was merged. cc @antvis.
|
// TODO 如何去业务化 |
|
const tempCell = data?.label ? [data?.label] : []; |
|
const values = data?.values; |
|
if(!isEmpty(values)) { |
|
forEach(values, (value) => { |
|
tempCell.push(value.join(' ')); |
This issue was generated by todo based on a TODO
comment in 5314895 when #103 was merged. cc @antvis.
|
// TODO 检查排序 |
|
// expect(dataSet?.getDimensionValues('type')).toEqual([ |
|
// '办公用品', |
|
// '家具产品', |
|
// ]); |
|
|
This issue was generated by todo based on a TODO
comment in 87682fd when #219 was merged. cc @antvis.
|
// TODO: 处理derivedValues |
|
const derivedValues = []; |
|
const derivedValue = head(derivedValues); |
|
if (viewMeta) { |
|
const { data, fieldValue, valueField } = viewMeta; |
This issue was generated by todo based on a TODO
comment in 631e72e when #113 was merged. cc @antvis.
|
// TODO 外部定义的pageSize和内部PageSize改变的优先级处理 |
|
showSizeChanger={false} |
|
size={'small'} |
|
showQuickJumper={showQuickJumper} |
|
onChange={(page) => setCurrent(page)} |
|
/> |
This issue was generated by todo based on a TODO
comment in 863943e when #61 was merged. cc @antvis.
|
// TODO 异常处理 低版本兼容 |
|
export const download = (str: string, fileName: string) => { |
|
const link = document.createElement('a'); |
|
link.download = `${fileName}.csv`; |
|
// Avoid errors in Chinese encoding. |
|
const dataBlob = new Blob([`\ufeff${str}`], { |
This issue was generated by todo based on a TODO
comment in 5ecd328 when #29 was merged. cc @antvis.
- 树形结构下点击行头只选中了自己,未选中数据项
- 树形结构下切换行头点击时,变成了多选状态
|
// TODO: tooltip 很多cellInfos类型不正确,需要整体重新梳理 |
|
export const getTooltipData = ( |
|
spreadsheet: SpreadSheet, |
|
cellInfos?: TooltipData[], |
This issue was generated by todo based on a TODO
comment in 631e72e when #113 was merged. cc @antvis.
|
// TODO brucetoo check if viewCellWidth0Indexes needed |
|
const newIndexes = add.filter(([i, j]) => { |
|
return ( |
|
!includes(this.viewCellWidth0Indexes, i) && |
|
!includes(this.viewCellHeight0Indexes, j) |
|
); |
This issue was generated by todo based on a TODO
comment in 7087ec2 when #55 was merged. cc @antvis.
|
// TODO 光生哥看下是否需要更改 |
|
throw new Error('There are not header hierarchy in table mode'); |
|
} |
|
}; |
|
|
|
const handleColHeaderHierarchy = (params: HeaderParams) => { |
This issue was generated by todo based on a TODO
comment in 10d97ef when #100 was merged. cc @antvis.
💥 基础第一版本交叉表 (due:2021/03/31)
------------------ todo list -----------------------------
✨ feat: 列宽的适配规则(自适应+计算方式) @卿珂
|
// TODO: 改个名字 spreadsheet => customSpreadsheet 之类的? |
|
if (spreadsheet) { |
|
return spreadsheet(...params); |
|
} |
|
return new SpreadSheet(...params); |
|
}; |
This issue was generated by todo based on a TODO
comment in 4d385f5 when #85 was merged. cc @antvis.
|
// TODO 这个东西存在这里的必要性? |
|
private bindResetSheetStyle() { |
|
this.spreadsheet.on(S2Event.GLOBAL_CLEAR_INTERACTION_STYLE_EFFECT, () => { |
|
this.interaction.clearStyleIndependent(); |
This issue was generated by todo based on a TODO
comment in 3be5e9b when #138 was merged. cc @antvis.
|
// TODO how to test? |
|
test('should get correct data cell with rowNode', () => { |
|
// dataCfg.fields.columns = ['category', 'subCategory']; |
|
// dataCfg.data = drillDownData1; |
|
// dataSet.setDataCfg(dataCfg); |
|
// // city |
This issue was generated by todo based on a TODO
comment in 72a66fd when #76 was merged. cc @antvis.
目前的数据转化逻辑存在standardTransform和multiValueTransform两种模式。理论上来说底表只需要确定好一种规范,让使用者遵守即可,需要看下是否有必要保留两种情况,如果无可以将相关逻辑和参数都移除
|
// TODO: 这个 extra 感觉不应该放在 data cfg 里面, 目前看来就是用于自定义 tooltip @蒺藜 |
|
extra: [ |
|
{ |
|
field: 'type', |
This issue was generated by todo based on a TODO
comment in 5a86a3f when #194 was merged. cc @antvis.
|
// TODO:tabular类型数据需要补充兼容 |
|
if (!options?.hideSummary) { |
|
// 计算多项的sum(默认为sum,可自定义) |
|
summaries = map(cellInfos, (cellInfo) => |
|
getSummaryProps({ |
|
spreadsheet, |
This issue was generated by todo based on a TODO
comment in f24466e when #158 was merged. cc @antvis.
|
// TODO: 条件格式的icon和mini chart也需要置灰 |
|
unselected: { |
|
backgroundOpacity: 0.3, |
|
textOpacity: 0.3, |
|
}, |
|
// -------------- prepare select -------------- |
This issue was generated by todo based on a TODO
comment in 3be5e9b when #138 was merged. cc @antvis.
|
// TODO: 这里的主题不应该用 default 吧, 代码里面都是写死的 defaultDataConfig |
|
|
|
const THEME = getTheme('default'); |
|
|
|
export abstract class BaseFacet { |
|
// spreadsheet instance |
This issue was generated by todo based on a TODO
comment in 6d3e7af when #101 was merged. cc @antvis.
1、di 相关的分页组件都沉淀到底层
2、适配pc & 移动版本
参考表头组件的开发
|
// TODO: 待确定 是否可以复用 mergeCellInfo |
|
|
|
export const getActiveCellsTooltipData = ( |
|
spreadsheet: SpreadSheet, |
|
): TooltipData[] => { |
|
const cellInfos: TooltipData[] = []; |
This issue was generated by todo based on a TODO
comment in 0397b7c when #185 was merged. cc @antvis.
|
// TODO: 这里需要迁移 spreadsheet 的逻辑 |
|
if ( |
|
this.isScrollToTop(optimizedDeltaY) || |
|
this.isScrollToBottom(optimizedDeltaY) |
This issue was generated by todo based on a TODO
comment in 57dc581 when #129 was merged. cc @antvis.
|
// TODO dataCfg细化 |
|
dataCfg, |
|
options, |
|
adaptive = true, |
|
header, |
|
theme, |
This issue was generated by todo based on a TODO
comment in 3f5afbc when #52 was merged. cc @antvis.
|
// TODO: 常量分类, 而不是所有都放在一个文件 |
|
export * from './events'; |
|
|
|
// 值字段的 id 是固定的! |
|
export const VALUE_FIELD = '$$value$$'; |
|
export const EXTRA_FIELD = '$$extra$$'; |
This issue was generated by todo based on a TODO
comment in 4d385f5 when #85 was merged. cc @antvis.
|
// TODO this logic need be changed!!! |
|
// const summaryField = this.meta.valueField; |
|
// const pivot = this.spreadsheet.dataSet.pivot; |
|
// if (pivot) { |
|
// const MIN = summaryField |
|
// ? pivot.getTotals(summaryField, {}, 'MIN') |
This issue was generated by todo based on a TODO
comment in 2009283 when #149 was merged. cc @antvis.
|
// TODO abstract |
|
this.hScrollBar = new ScrollBar({ |
|
isHorizontal: true, |
|
trackLen: finalWidth, |
This issue was generated by todo based on a TODO
comment in 46b29ed when #24 was merged. cc @antvis.
|
// TODO: 这里为啥返回 {level: '', id: '', label: ''} 这样的结构 |
|
const rows: LayoutRow[] = layoutResult.rowsHierarchy |
|
.getNodesLessThanLevel(rowLevel) |
|
.map((value) => { |
|
return [value.level, value.id, value.label]; |
|
}); |
This issue was generated by todo based on a TODO
comment in 4d385f5 when #85 was merged. cc @antvis.
目前明细表(Dataphin)这边有几个需求,和 Cell 选中态相关:
- 通过 API 设置某个格子为选中态
- 如果格子不在可视区,可以移动滚动位置让格子可见,类似一个 focus 的效果。
- 选中全部格子的能力(常用的 Command + A 然后 Command + C 复制的交互)
- 进阶需求:选中一个格子之后按住 Command 多选,全选后按住 Command 反选
- 选中不可见区域格子的能力,比如现在冻结行的情况下,滚动一段,然后从冻结的行往下框选,中间一段不可见的行是不会被选中的
这些零碎的需求,总结一下,对能力上的要求有两方面:
- Select 状态下,可以指定任意的格子被选中,不管是否可见
- 新增一个 Select All 的状态,可以指定哪些格子不被选中(因为全选情况下去存储不选中的格子空间占用更小)
这都要求目前 InteractionStateInfo 中增加一个表示 被选中/未选中 Cell Id 的数组。和现在直接存储 Cell 实例相比,存储 id 让当前不可见,没有 Cell 实例的格子也可以被选中。
在 Cell 的 update 方法中,在 Select 状态下,可以用 id 去匹配是否被选中。
|
// TODO 异常处理 |
|
export const copyToClipboard = (str: string) => { |
|
const el = document.createElement('textarea'); |
|
el.value = str; |
|
document.body.appendChild(el); |
|
el.select(); |
This issue was generated by todo based on a TODO
comment in 5ecd328 when #29 was merged. cc @antvis.
|
// TODO valueInCol = false and one or more values |
|
if (totalsConfig.showGrandTotals) { |
|
const func = totalsConfig.reverseLayout ? 'unshift' : 'push'; |
|
fieldValues[func](new TotalClass(totalsConfig.label, false, true)); |
|
} |
|
}; |
This issue was generated by todo based on a TODO
comment in 72a66fd when #76 was merged. cc @antvis.
|
// custom frame TODO rename this |
|
readonly frame?: FrameCallback; |
|
// custom corner header |
|
readonly cornerHeader?: CornerHeaderCallback; |
|
// custom tooltips |
|
readonly initTooltip?: TooltipCallback; |
This issue was generated by todo based on a TODO
comment in 91d9518 when #60 was merged. cc @antvis.