@visactor/vchart 1.1.0-beta.2 → 1.1.0-beta.3

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.
Files changed (159) hide show
  1. package/build/index.js +531 -150
  2. package/build/index.min.js +1 -1
  3. package/cjs/chart/base-chart.d.ts +2 -1
  4. package/cjs/chart/base-chart.js +12 -0
  5. package/cjs/chart/base-chart.js.map +1 -1
  6. package/cjs/chart/interface/chart.d.ts +3 -3
  7. package/cjs/chart/interface/chart.js.map +1 -1
  8. package/cjs/chart/word-cloud/word-cloud-3d.js +1 -2
  9. package/cjs/chart/word-cloud/word-cloud-3d.js.map +1 -1
  10. package/cjs/chart/word-cloud/word-cloud.js +1 -2
  11. package/cjs/chart/word-cloud/word-cloud.js.map +1 -1
  12. package/cjs/compile/compiler.js +2 -1
  13. package/cjs/compile/compiler.js.map +1 -1
  14. package/cjs/compile/interface/compilable-item.d.ts +1 -0
  15. package/cjs/compile/interface/compilable-item.js.map +1 -1
  16. package/cjs/component/axis/base-axis.d.ts +6 -14
  17. package/cjs/component/axis/base-axis.js +10 -1
  18. package/cjs/component/axis/base-axis.js.map +1 -1
  19. package/cjs/component/axis/cartesian/axis.d.ts +1 -1
  20. package/cjs/component/axis/cartesian/axis.js +8 -3
  21. package/cjs/component/axis/cartesian/axis.js.map +1 -1
  22. package/cjs/component/axis/cartesian/interface/spec.d.ts +9 -2
  23. package/cjs/component/axis/cartesian/interface/spec.js.map +1 -1
  24. package/cjs/component/axis/interface.d.ts +9 -0
  25. package/cjs/component/axis/interface.js.map +1 -1
  26. package/cjs/component/axis/mixin/linear-axis-mixin.d.ts +4 -0
  27. package/cjs/component/axis/mixin/linear-axis-mixin.js +6 -1
  28. package/cjs/component/axis/mixin/linear-axis-mixin.js.map +1 -1
  29. package/cjs/component/base/base-component.js +4 -2
  30. package/cjs/component/base/base-component.js.map +1 -1
  31. package/cjs/component/crosshair/base.js +26 -18
  32. package/cjs/component/crosshair/base.js.map +1 -1
  33. package/cjs/component/marker/base-marker.js +2 -1
  34. package/cjs/component/marker/base-marker.js.map +1 -1
  35. package/cjs/constant/event.d.ts +1 -0
  36. package/cjs/constant/event.js +4 -4
  37. package/cjs/constant/event.js.map +1 -1
  38. package/cjs/core/index.d.ts +1 -1
  39. package/cjs/core/index.js +1 -1
  40. package/cjs/core/index.js.map +1 -1
  41. package/cjs/event/event-dispatcher.d.ts +2 -2
  42. package/cjs/event/event-dispatcher.js +23 -18
  43. package/cjs/event/event-dispatcher.js.map +1 -1
  44. package/cjs/event/event.d.ts +2 -2
  45. package/cjs/event/event.js +2 -2
  46. package/cjs/event/event.js.map +1 -1
  47. package/cjs/event/interface.d.ts +2 -2
  48. package/cjs/event/interface.js.map +1 -1
  49. package/cjs/interaction/drill/drillable.js +3 -2
  50. package/cjs/interaction/drill/drillable.js.map +1 -1
  51. package/cjs/interaction/zoom/zoomable.d.ts +1 -1
  52. package/cjs/interaction/zoom/zoomable.js +16 -15
  53. package/cjs/interaction/zoom/zoomable.js.map +1 -1
  54. package/cjs/plugin/components/axis-sync-plugin/axis-sync.d.ts +11 -0
  55. package/cjs/plugin/components/axis-sync-plugin/axis-sync.js +53 -0
  56. package/cjs/plugin/components/axis-sync-plugin/axis-sync.js.map +1 -0
  57. package/cjs/plugin/components/axis-sync-plugin/index.d.ts +1 -0
  58. package/cjs/plugin/components/axis-sync-plugin/index.js +21 -0
  59. package/cjs/plugin/components/axis-sync-plugin/index.js.map +1 -0
  60. package/cjs/plugin/components/axis-sync-plugin/tick-align-transform.d.ts +7 -0
  61. package/cjs/plugin/components/axis-sync-plugin/tick-align-transform.js +36 -0
  62. package/cjs/plugin/components/axis-sync-plugin/tick-align-transform.js.map +1 -0
  63. package/cjs/plugin/components/axis-sync-plugin/zero-align-transform.d.ts +15 -0
  64. package/cjs/plugin/components/axis-sync-plugin/zero-align-transform.js +123 -0
  65. package/cjs/plugin/components/axis-sync-plugin/zero-align-transform.js.map +1 -0
  66. package/cjs/plugin/components/index.d.ts +2 -0
  67. package/cjs/plugin/components/index.js +3 -2
  68. package/cjs/plugin/components/index.js.map +1 -1
  69. package/cjs/plugin/components/interface.d.ts +2 -0
  70. package/cjs/plugin/components/interface.js.map +1 -1
  71. package/cjs/series/word-cloud/base.d.ts +2 -2
  72. package/cjs/series/word-cloud/base.js +42 -43
  73. package/cjs/series/word-cloud/base.js.map +1 -1
  74. package/cjs/series/word-cloud/interface.d.ts +1 -2
  75. package/cjs/series/word-cloud/interface.js.map +1 -1
  76. package/cjs/series/word-cloud/word-cloud-3d.js +37 -37
  77. package/cjs/series/word-cloud/word-cloud-3d.js.map +1 -1
  78. package/esm/chart/base-chart.d.ts +2 -1
  79. package/esm/chart/base-chart.js +12 -0
  80. package/esm/chart/base-chart.js.map +1 -1
  81. package/esm/chart/interface/chart.d.ts +3 -3
  82. package/esm/chart/interface/chart.js.map +1 -1
  83. package/esm/chart/word-cloud/word-cloud-3d.js +1 -2
  84. package/esm/chart/word-cloud/word-cloud-3d.js.map +1 -1
  85. package/esm/chart/word-cloud/word-cloud.js +1 -2
  86. package/esm/chart/word-cloud/word-cloud.js.map +1 -1
  87. package/esm/compile/compiler.js +2 -1
  88. package/esm/compile/compiler.js.map +1 -1
  89. package/esm/compile/interface/compilable-item.d.ts +1 -0
  90. package/esm/compile/interface/compilable-item.js.map +1 -1
  91. package/esm/component/axis/base-axis.d.ts +6 -14
  92. package/esm/component/axis/base-axis.js +10 -1
  93. package/esm/component/axis/base-axis.js.map +1 -1
  94. package/esm/component/axis/cartesian/axis.d.ts +1 -1
  95. package/esm/component/axis/cartesian/axis.js +8 -3
  96. package/esm/component/axis/cartesian/axis.js.map +1 -1
  97. package/esm/component/axis/cartesian/interface/spec.d.ts +9 -2
  98. package/esm/component/axis/cartesian/interface/spec.js.map +1 -1
  99. package/esm/component/axis/interface.d.ts +9 -0
  100. package/esm/component/axis/interface.js.map +1 -1
  101. package/esm/component/axis/mixin/linear-axis-mixin.d.ts +4 -0
  102. package/esm/component/axis/mixin/linear-axis-mixin.js +6 -1
  103. package/esm/component/axis/mixin/linear-axis-mixin.js.map +1 -1
  104. package/esm/component/base/base-component.js +4 -2
  105. package/esm/component/base/base-component.js.map +1 -1
  106. package/esm/component/crosshair/base.js +25 -17
  107. package/esm/component/crosshair/base.js.map +1 -1
  108. package/esm/component/marker/base-marker.js +2 -1
  109. package/esm/component/marker/base-marker.js.map +1 -1
  110. package/esm/constant/event.d.ts +1 -0
  111. package/esm/constant/event.js +4 -4
  112. package/esm/constant/event.js.map +1 -1
  113. package/esm/core/index.d.ts +1 -1
  114. package/esm/core/index.js +1 -1
  115. package/esm/core/index.js.map +1 -1
  116. package/esm/event/event-dispatcher.d.ts +2 -2
  117. package/esm/event/event-dispatcher.js +23 -18
  118. package/esm/event/event-dispatcher.js.map +1 -1
  119. package/esm/event/event.d.ts +2 -2
  120. package/esm/event/event.js +2 -2
  121. package/esm/event/event.js.map +1 -1
  122. package/esm/event/interface.d.ts +2 -2
  123. package/esm/event/interface.js.map +1 -1
  124. package/esm/interaction/drill/drillable.js +3 -2
  125. package/esm/interaction/drill/drillable.js.map +1 -1
  126. package/esm/interaction/zoom/zoomable.d.ts +1 -1
  127. package/esm/interaction/zoom/zoomable.js +16 -15
  128. package/esm/interaction/zoom/zoomable.js.map +1 -1
  129. package/esm/plugin/components/axis-sync-plugin/axis-sync.d.ts +11 -0
  130. package/esm/plugin/components/axis-sync-plugin/axis-sync.js +55 -0
  131. package/esm/plugin/components/axis-sync-plugin/axis-sync.js.map +1 -0
  132. package/esm/plugin/components/axis-sync-plugin/index.d.ts +1 -0
  133. package/esm/plugin/components/axis-sync-plugin/index.js +2 -0
  134. package/esm/plugin/components/axis-sync-plugin/index.js.map +1 -0
  135. package/esm/plugin/components/axis-sync-plugin/tick-align-transform.d.ts +7 -0
  136. package/esm/plugin/components/axis-sync-plugin/tick-align-transform.js +30 -0
  137. package/esm/plugin/components/axis-sync-plugin/tick-align-transform.js.map +1 -0
  138. package/esm/plugin/components/axis-sync-plugin/zero-align-transform.d.ts +15 -0
  139. package/esm/plugin/components/axis-sync-plugin/zero-align-transform.js +115 -0
  140. package/esm/plugin/components/axis-sync-plugin/zero-align-transform.js.map +1 -0
  141. package/esm/plugin/components/index.d.ts +2 -0
  142. package/esm/plugin/components/index.js +4 -1
  143. package/esm/plugin/components/index.js.map +1 -1
  144. package/esm/plugin/components/interface.d.ts +2 -0
  145. package/esm/plugin/components/interface.js.map +1 -1
  146. package/esm/series/word-cloud/base.d.ts +2 -2
  147. package/esm/series/word-cloud/base.js +42 -43
  148. package/esm/series/word-cloud/base.js.map +1 -1
  149. package/esm/series/word-cloud/interface.d.ts +1 -2
  150. package/esm/series/word-cloud/interface.js.map +1 -1
  151. package/esm/series/word-cloud/word-cloud-3d.js +37 -37
  152. package/esm/series/word-cloud/word-cloud-3d.js.map +1 -1
  153. package/package.json +9 -8
  154. package/cjs/series/treemap/config.d.ts +0 -44
  155. package/cjs/series/treemap/config.js +0 -51
  156. package/cjs/series/treemap/config.js.map +0 -1
  157. package/esm/series/treemap/config.d.ts +0 -44
  158. package/esm/series/treemap/config.js +0 -49
  159. package/esm/series/treemap/config.js.map +0 -1
@@ -8,8 +8,9 @@ const vutils_1 = require("@visactor/vutils"), drill_1 = require("../../data/tran
8
8
 
9
9
  class Drillable {
10
10
  _getTriggerEvent(type) {
11
+ var _a;
11
12
  const {mode: mode} = this._drillParams;
12
- return config_1.defaultTriggerEvent[mode][type];
13
+ return null === (_a = config_1.defaultTriggerEvent[mode]) || void 0 === _a ? void 0 : _a[type];
13
14
  }
14
15
  _hideTooltip() {
15
16
  const tooltip = this.getChart().getAllComponents().find((c => c.type === interface_1.ComponentTypeEnum.tooltip));
@@ -31,7 +32,7 @@ class Drillable {
31
32
  }
32
33
  bindDrillEvent() {
33
34
  const {event: event, getRawData: getRawData, drillField: drillField} = this._drillParams, keyField = drillField();
34
- event.on(this._getTriggerEvent("start"), (e => {
35
+ this._getTriggerEvent("start") && event.on(this._getTriggerEvent("start"), (e => {
35
36
  var _a, _b, _c;
36
37
  if ((0, vutils_1.isNil)(e.datum) || (0, vutils_1.isNil)(null === (_a = e.datum) || void 0 === _a ? void 0 : _a[keyField])) return void this.drillUp();
37
38
  this._hideTooltip();
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interaction/drill/drillable.ts"],"names":[],"mappings":"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","file":"drillable.js","sourcesContent":["/* eslint-disable no-duplicate-imports */\nimport { isArray, isEmpty, isNil } from '@visactor/vutils';\nimport type { DataSet, DataView } from '@visactor/vdataset';\n\nimport type { DrillInfo } from '../../data/transforms/drill';\nimport { drillFilter } from '../../data/transforms/drill';\nimport { DrillEnum } from '../../data/transforms/drill';\nimport type { EventType, IEvent } from '../../event/interface';\nimport type { RenderMode } from '../../typings/spec';\nimport { defaultTriggerEvent } from '../../component/common/trigger/config';\nimport { findHierarchyPath } from '../../util';\nimport { ChartEvent } from '../../constant';\nimport { registerDataSetInstanceTransform } from '../../data/register';\nimport type { IModel } from '../../model/interface';\nimport type { BaseSeries } from '../../series/base/base-series';\nimport { ComponentTypeEnum } from '../../component/interface';\nimport type { Tooltip } from '../../component/tooltip';\n\ninterface DrillParams {\n event: IEvent;\n mode: RenderMode;\n drillField: () => string;\n getRawData: () => DataView;\n}\n\nexport interface IDrillable {\n /**\n * 初始化钻取设置\n */\n initDrillable: (params: DrillParams) => void;\n\n /**\n * 初始化钻取数据\n */\n initDrillableData: (dataSet: DataSet) => void;\n\n /**\n * 绑定钻取事件\n */\n bindDrillEvent: () => void;\n\n /**\n * 上卷\n */\n drillUp: () => void;\n\n /**\n * 下钻\n * @param drillPath 钻取路径\n */\n drillDown: (drillPath: string[]) => string[];\n}\n\nexport class Drillable implements IDrillable {\n private _drillParams: DrillParams;\n private _drillInfo: DrillInfo;\n\n private _getTriggerEvent(type: string): EventType {\n const { mode } = this._drillParams;\n return defaultTriggerEvent[mode][type];\n }\n\n private _hideTooltip() {\n const tooltip = (this as unknown as BaseSeries<null>)\n .getChart()\n .getAllComponents()\n .find(c => c.type === ComponentTypeEnum.tooltip) as Tooltip;\n tooltip && tooltip.hideTooltip();\n }\n\n initDrillable(params: DrillParams) {\n this._drillParams = params;\n }\n\n initDrillableData(dataSet: DataSet) {\n const { getRawData } = this._drillParams;\n // 注册筛选方法\n registerDataSetInstanceTransform(dataSet, 'drillFilter', drillFilter);\n\n // 调用筛选数据, 用于上卷下钻\n getRawData().transform({\n type: 'drillFilter',\n options: {\n info: () => this._drillInfo,\n keyField: () => this._drillParams.drillField()\n }\n });\n }\n\n bindDrillEvent() {\n const { event, getRawData, drillField } = this._drillParams;\n const keyField = drillField();\n event.on(this._getTriggerEvent('start'), e => {\n if (isNil(e.datum) || isNil(e.datum?.[keyField])) {\n this.drillUp();\n return;\n }\n\n // Drill交互后, 隐藏Tooltip\n this._hideTooltip();\n // 获取数据key\n const dataKey = e.datum[keyField];\n // 已钻取的路径\n const selectPath = this._drillInfo?.path ?? [];\n // 用户点击的路径\n const clickedPath = findHierarchyPath(getRawData().rawData, dataKey, keyField, 'children');\n // 已钻取过, 则一定上卷\n if (selectPath[selectPath.length - 1] === clickedPath[clickedPath.length - 1]) {\n this.drillUp();\n } else {\n this.drillDown(clickedPath);\n }\n });\n }\n\n /**\n * 下钻接口\n * @param drillPath 下钻后的路径\n * @returns 当然路径\n * @description 根据传入的path, 向指定层级下钻.\n */\n drillDown(drillPath: string[] = []): string[] {\n const { getRawData, event } = this._drillParams;\n if (!isArray(drillPath) || isEmpty(drillPath)) {\n return drillPath;\n }\n\n // 根据钻取路径, 获得当前需要展示的层级\n const dataKey = drillPath[drillPath.length - 1];\n\n this._drillInfo = {\n key: dataKey,\n path: drillPath,\n type: DrillEnum.DrillDown\n };\n\n getRawData().reRunAllTransform();\n event.emit(ChartEvent.drill, {\n value: { path: drillPath, type: DrillEnum.DrillDown },\n model: this as unknown as IModel\n });\n return drillPath;\n }\n\n /**\n * 上卷接口\n * @returns 上卷后的路径\n * @description 根据path信息, 向父层级上卷.\n */\n drillUp() {\n const { getRawData, event } = this._drillParams;\n\n const path = this._drillInfo?.path ?? [];\n if (!isArray(path) || isEmpty(path)) {\n return path;\n }\n\n const dataKey = path.pop();\n\n this._drillInfo = {\n key: dataKey,\n path: path,\n type: DrillEnum.DrillUp\n };\n\n getRawData().reRunAllTransform();\n event.emit(ChartEvent.drill, {\n value: { path, type: DrillEnum.DrillUp },\n model: this as unknown as IModel\n });\n return path;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/interaction/drill/drillable.ts"],"names":[],"mappings":"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","file":"drillable.js","sourcesContent":["/* eslint-disable no-duplicate-imports */\nimport { isArray, isEmpty, isNil } from '@visactor/vutils';\nimport type { DataSet, DataView } from '@visactor/vdataset';\n\nimport type { DrillInfo } from '../../data/transforms/drill';\nimport { drillFilter } from '../../data/transforms/drill';\nimport { DrillEnum } from '../../data/transforms/drill';\nimport type { EventType, IEvent } from '../../event/interface';\nimport type { RenderMode } from '../../typings/spec';\nimport { defaultTriggerEvent } from '../../component/common/trigger/config';\nimport { findHierarchyPath } from '../../util';\nimport { ChartEvent } from '../../constant';\nimport { registerDataSetInstanceTransform } from '../../data/register';\nimport type { IModel } from '../../model/interface';\nimport type { BaseSeries } from '../../series/base/base-series';\nimport { ComponentTypeEnum } from '../../component/interface';\nimport type { Tooltip } from '../../component/tooltip';\n\ninterface DrillParams {\n event: IEvent;\n mode: RenderMode;\n drillField: () => string;\n getRawData: () => DataView;\n}\n\nexport interface IDrillable {\n /**\n * 初始化钻取设置\n */\n initDrillable: (params: DrillParams) => void;\n\n /**\n * 初始化钻取数据\n */\n initDrillableData: (dataSet: DataSet) => void;\n\n /**\n * 绑定钻取事件\n */\n bindDrillEvent: () => void;\n\n /**\n * 上卷\n */\n drillUp: () => void;\n\n /**\n * 下钻\n * @param drillPath 钻取路径\n */\n drillDown: (drillPath: string[]) => string[];\n}\n\nexport class Drillable implements IDrillable {\n private _drillParams: DrillParams;\n private _drillInfo: DrillInfo;\n\n private _getTriggerEvent(type: string): EventType {\n const { mode } = this._drillParams;\n return defaultTriggerEvent[mode]?.[type];\n }\n\n private _hideTooltip() {\n const tooltip = (this as unknown as BaseSeries<null>)\n .getChart()\n .getAllComponents()\n .find(c => c.type === ComponentTypeEnum.tooltip) as Tooltip;\n tooltip && tooltip.hideTooltip();\n }\n\n initDrillable(params: DrillParams) {\n this._drillParams = params;\n }\n\n initDrillableData(dataSet: DataSet) {\n const { getRawData } = this._drillParams;\n // 注册筛选方法\n registerDataSetInstanceTransform(dataSet, 'drillFilter', drillFilter);\n\n // 调用筛选数据, 用于上卷下钻\n getRawData().transform({\n type: 'drillFilter',\n options: {\n info: () => this._drillInfo,\n keyField: () => this._drillParams.drillField()\n }\n });\n }\n\n bindDrillEvent() {\n const { event, getRawData, drillField } = this._drillParams;\n const keyField = drillField();\n if (this._getTriggerEvent('start')) {\n event.on(this._getTriggerEvent('start'), e => {\n if (isNil(e.datum) || isNil(e.datum?.[keyField])) {\n this.drillUp();\n return;\n }\n\n // Drill交互后, 隐藏Tooltip\n this._hideTooltip();\n // 获取数据key\n const dataKey = e.datum[keyField];\n // 已钻取的路径\n const selectPath = this._drillInfo?.path ?? [];\n // 用户点击的路径\n const clickedPath = findHierarchyPath(getRawData().rawData, dataKey, keyField, 'children');\n // 已钻取过, 则一定上卷\n if (selectPath[selectPath.length - 1] === clickedPath[clickedPath.length - 1]) {\n this.drillUp();\n } else {\n this.drillDown(clickedPath);\n }\n });\n }\n }\n\n /**\n * 下钻接口\n * @param drillPath 下钻后的路径\n * @returns 当然路径\n * @description 根据传入的path, 向指定层级下钻.\n */\n drillDown(drillPath: string[] = []): string[] {\n const { getRawData, event } = this._drillParams;\n if (!isArray(drillPath) || isEmpty(drillPath)) {\n return drillPath;\n }\n\n // 根据钻取路径, 获得当前需要展示的层级\n const dataKey = drillPath[drillPath.length - 1];\n\n this._drillInfo = {\n key: dataKey,\n path: drillPath,\n type: DrillEnum.DrillDown\n };\n\n getRawData().reRunAllTransform();\n event.emit(ChartEvent.drill, {\n value: { path: drillPath, type: DrillEnum.DrillDown },\n model: this as unknown as IModel\n });\n return drillPath;\n }\n\n /**\n * 上卷接口\n * @returns 上卷后的路径\n * @description 根据path信息, 向父层级上卷.\n */\n drillUp() {\n const { getRawData, event } = this._drillParams;\n\n const path = this._drillInfo?.path ?? [];\n if (!isArray(path) || isEmpty(path)) {\n return path;\n }\n\n const dataKey = path.pop();\n\n this._drillInfo = {\n key: dataKey,\n path: path,\n type: DrillEnum.DrillUp\n };\n\n getRawData().reRunAllTransform();\n event.emit(ChartEvent.drill, {\n value: { path, type: DrillEnum.DrillUp },\n model: this as unknown as IModel\n });\n return path;\n }\n}\n"]}
@@ -44,7 +44,7 @@ export declare class Zoomable implements IZoomable {
44
44
  private _eventObj;
45
45
  private _renderMode;
46
46
  initZoomable(evt: IEvent, mode?: RenderMode): void;
47
- private getTriggerEvent;
47
+ private _getTriggerEvent;
48
48
  private _bindZoomEventAsRegion;
49
49
  initZoomEventOfSeries(s: ISeries, callback?: (params: {
50
50
  zoomDelta: number;
@@ -8,18 +8,19 @@ const vutils_1 = require("@visactor/vutils"), spec_1 = require("../../typings/sp
8
8
 
9
9
  class Zoomable {
10
10
  initZoomable(evt, mode = spec_1.RenderModeEnum["desktop-browser"]) {
11
- this._eventObj = evt, this._renderMode = mode, this._clickEnable = !0, this._zoomableTrigger = new (this.getTriggerEvent("trigger"));
11
+ this._eventObj = evt, this._renderMode = mode, config_1.defaultTriggerEvent[this._renderMode] && (this._clickEnable = !0,
12
+ this._zoomableTrigger = new (this._getTriggerEvent("trigger")));
12
13
  }
13
- getTriggerEvent(type) {
14
+ _getTriggerEvent(type) {
14
15
  return config_1.defaultTriggerEvent[this._renderMode][type];
15
16
  }
16
17
  _bindZoomEventAsRegion(eventObj, regionOrSeries, callback) {
17
- eventObj.on(this.getTriggerEvent("scrollEnd"), {
18
+ eventObj.on(this._getTriggerEvent("scrollEnd"), {
18
19
  level: constant_1.Event_Bubble_Level.chart,
19
20
  consume: !1
20
21
  }, (params => {
21
22
  this._zoomableTrigger.clearZoom();
22
- })), eventObj.on(this.getTriggerEvent("scroll"), {
23
+ })), eventObj.on(this._getTriggerEvent("scroll"), {
23
24
  level: constant_1.Event_Bubble_Level.chart,
24
25
  consume: !0
25
26
  }, (params => {
@@ -46,32 +47,32 @@ class Zoomable {
46
47
  }));
47
48
  }
48
49
  initZoomEventOfSeries(s, callback) {
49
- this._bindZoomEventAsRegion(s.event, s, callback);
50
+ config_1.defaultTriggerEvent[this._renderMode] && this._bindZoomEventAsRegion(s.event, s, callback);
50
51
  }
51
52
  initZoomEventOfRegions(regions, filter, callback) {
52
- regions.forEach((r => {
53
+ config_1.defaultTriggerEvent[this._renderMode] && regions.forEach((r => {
53
54
  filter ? r.getSeries().forEach((s => {
54
55
  filter(s) && this._bindZoomEventAsRegion(s.event, s, callback);
55
56
  })) : this._bindZoomEventAsRegion(this._eventObj, r, callback);
56
57
  }));
57
58
  }
58
59
  initScrollEventOfSeries(s, callback) {
59
- this._bindScrollEventAsRegion(s.event, s, callback);
60
+ config_1.defaultTriggerEvent[this._renderMode] && this._bindScrollEventAsRegion(s.event, s, callback);
60
61
  }
61
62
  initScrollEventOfRegions(regions, filter, callback) {
62
- regions.forEach((r => {
63
+ config_1.defaultTriggerEvent[this._renderMode] && regions.forEach((r => {
63
64
  filter ? r.getSeries().forEach((s => {
64
65
  filter(s) && this._bindScrollEventAsRegion(s.event, s, callback);
65
66
  })) : this._bindScrollEventAsRegion(this._eventObj, r, callback);
66
67
  }));
67
68
  }
68
69
  _bindScrollEventAsRegion(eventObj, regionOrSeries, callback) {
69
- eventObj.on(this.getTriggerEvent("scrollEnd"), {
70
+ eventObj.on(this._getTriggerEvent("scrollEnd"), {
70
71
  level: constant_1.Event_Bubble_Level.chart,
71
72
  consume: !1
72
73
  }, (params => {
73
74
  this._zoomableTrigger.clearScroll();
74
- })), eventObj.on(this.getTriggerEvent("scroll"), {
75
+ })), eventObj.on(this._getTriggerEvent("scroll"), {
75
76
  level: constant_1.Event_Bubble_Level.chart,
76
77
  consume: !0
77
78
  }, (params => {
@@ -94,7 +95,7 @@ class Zoomable {
94
95
  }));
95
96
  }
96
97
  _bindDragEventAsRegion(eventObj, regionOrSeries, callback) {
97
- eventObj.on(this.getTriggerEvent("start"), {
98
+ eventObj.on(this._getTriggerEvent("start"), {
98
99
  level: constant_1.Event_Bubble_Level.chart
99
100
  }, (params => {
100
101
  if (!params.event) return;
@@ -108,7 +109,7 @@ class Zoomable {
108
109
  }, (() => !this._clickEnable));
109
110
  }
110
111
  initDragEventOfSeries(s, callback) {
111
- s.event.on(this.getTriggerEvent("start"), {
112
+ config_1.defaultTriggerEvent[this._renderMode] && s.event.on(this._getTriggerEvent("start"), {
112
113
  level: constant_1.Event_Bubble_Level.model,
113
114
  filter: ({model: model}) => (null == model ? void 0 : model.id) === s.id
114
115
  }, (params => {
@@ -116,9 +117,9 @@ class Zoomable {
116
117
  }));
117
118
  }
118
119
  initDragEventOfRegions(regions, filter, callback) {
119
- regions.forEach((r => {
120
+ config_1.defaultTriggerEvent[this._renderMode] && regions.forEach((r => {
120
121
  filter ? r.getSeries().forEach((s => {
121
- filter(s) && (s.event.on(this.getTriggerEvent("start"), {
122
+ filter(s) && (s.event.on(this._getTriggerEvent("start"), {
122
123
  level: constant_1.Event_Bubble_Level.model,
123
124
  filter: ({model: model}) => (null == model ? void 0 : model.id) === s.id
124
125
  }, (params => {
@@ -132,7 +133,7 @@ class Zoomable {
132
133
  }
133
134
  _handleDrag(params, callback) {
134
135
  if (this._clickEnable = !0, !this._zoomableTrigger.parserDragEvent(params.event)) return;
135
- const move = this.getTriggerEvent("move"), end = this.getTriggerEvent("end"), event = params.event;
136
+ const move = this._getTriggerEvent("move"), end = this._getTriggerEvent("end"), event = params.event;
136
137
  let x = event.canvasX, y = event.canvasY;
137
138
  const mouseup = () => {
138
139
  this._zoomableTrigger.pointerId = null, this._eventObj.off(move, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interaction/zoom/zoomable.ts"],"names":[],"mappings":";;;AACA,6CAAyC;AAIzC,6CAAoD;AACpD,kEAA4E;AAE5E,qCAA2C;AAE3C,6CAAuE;AAsCvE,MAAa,QAAQ;IASnB,YAAY,CAAC,GAAW,EAAE,OAAmB,qBAAc,CAAC,iBAAiB,CAAC;QAC5E,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,KAAK,IAAI,CAAC,eAAe,CAAC,SAAS,CAAS,GAAE,CAAC;IACzE,CAAC;IAGO,eAAe,CAAC,IAAY;QAClC,OAAO,4BAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAEO,sBAAsB,CAC5B,QAAgB,EAChB,cAAiC,EACjC,QAA6G;QAE7G,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE;YAC3G,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE;YACvG,IAAI,CAAE,MAA0B,CAAC,KAAK,EAAE;gBACtC,OAAO;aACR;YACD,MAAM,KAAK,GAAI,MAA0B,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAE7C,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAY,CAAC;YACjD,IAAI,IAAA,cAAK,EAAC,SAAS,CAAC,EAAE;gBACpB,OAAO;aACR;YACD,IACE,CAAC,IAAA,oBAAa,EACZ;gBACE,CAAC,EAAE,KAAK;gBACR,CAAC,EAAE,KAAK;aACT,kCAEI,cAAc,CAAC,aAAa,EAAE,GAC9B,cAAc,CAAC,mBAAmB,EAAE,EAE1C,EACD;gBACA,OAAO;aACR;YACD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAE1B,IAAI,QAAQ,EAAE;gBAEZ,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;aAC9C;YAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC1B,KAAK,EAAE,KAAK,CAAC,SAAS;gBACtB,WAAW,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE;gBAC/C,KAAK,EAAE,IAAI;aACmB,CAAC,CAAC;QAOpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB,CACnB,CAAU,EACV,QAA6G;QAE7G,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,sBAAsB,CACpB,OAAkB,EAClB,MAAgC,EAChC,QAA6G;QAE7G,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAClB,IAAI,MAAM,EAAE;gBACV,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACxB,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;wBACb,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;qBACnD;gBACH,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;aAC1D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB,CACrB,CAAU,EACV,QAA8F;QAE9F,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED,wBAAwB,CACtB,OAAkB,EAClB,MAAgC,EAChC,QAA8F;QAE9F,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAClB,IAAI,MAAM,EAAE;gBACV,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACxB,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;wBACb,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;qBACrD;gBACH,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;aAC5D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,wBAAwB,CAC9B,QAAgB,EAChB,cAAiC,EACjC,QAA8F;QAE9F,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE;YAC3G,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE;YACvG,IAAI,CAAE,MAA0B,CAAC,KAAK,EAAE;gBACtC,OAAO;aACR;YACD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAyB,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAE/C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,KAAY,CAAC;YAC1C,IAAI,IAAA,cAAK,EAAC,OAAO,CAAC,IAAI,IAAA,cAAK,EAAC,OAAO,CAAC,EAAE;gBACpC,OAAO;aACR;YACD,IACE,CAAC,IAAA,oBAAa,EACZ;gBACE,CAAC,EAAE,KAAK,CAAC,OAAO;gBAChB,CAAC,EAAE,KAAK,CAAC,OAAO;aACjB,kCAEI,cAAc,CAAC,aAAa,EAAE,GAC9B,cAAc,CAAC,mBAAmB,EAAE,EAE1C,EACD;gBACA,OAAO;aACR;YACD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAE1B,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC;aACvC;YAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC5B,OAAO;gBACP,OAAO;gBACP,KAAK,EAAE,IAAI;aACmB,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,sBAAsB,CAC5B,QAAgB,EAChB,cAAiC,EACjC,QAAyE;QAEzE,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,EAAE;YACvF,IAAI,CAAE,MAA0B,CAAC,KAAK,EAAE;gBACtC,OAAO;aACR;YAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAyB,CAAC;YAC5C,MAAM,aAAa,GAAG,IAAA,oBAAa,EACjC;gBACE,CAAC,EAAE,KAAK,CAAC,OAAO;gBAChB,CAAC,EAAE,KAAK,CAAC,OAAO;aACjB,kCAEI,cAAc,CAAC,aAAa,EAAE,GAC9B,cAAc,CAAC,mBAAmB,EAAE,EAE1C,CAAC;YACF,IAAI,aAAa,EAAE;gBACjB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aACpC;QACH,CAAC,CAAC,CAAC;QAGH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE;YAC7D,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB,CAAC,CAAU,EAAE,QAAyE;QACzG,CAAC,CAAC,KAAK,CAAC,EAAE,CACR,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAC7B,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,EAAE,MAAK,CAAC,CAAC,EAAE,EAAE,EAC9E,MAAM,CAAC,EAAE;YACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;IACJ,CAAC;IAED,sBAAsB,CACpB,OAAkB,EAClB,MAAgC,EAChC,QAAyE;QAEzE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAClB,IAAI,MAAM,EAAE;gBACV,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACxB,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE;wBACb,CAAC,CAAC,KAAK,CAAC,EAAE,CACR,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAC7B,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,EAAE,MAAK,CAAC,CAAC,EAAE,EAAE,EAC9E,MAAM,CAAC,EAAE;4BACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;wBACrC,CAAC,CACF,CAAC;wBAIF,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,EAAE,MAAK,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE;4BACvG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;wBAC5B,CAAC,CAAC,CAAC;qBACJ;gBACH,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;aAC1D;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAES,WAAW,CACnB,MAAwB,EACxB,QAAyE;QAEzE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;YACxD,OAAO;SACR;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAY,CAAC;QAClC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;QAEtB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAAG,IAAI,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,IAAI,EACJ,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,4BAAiB,CAAC,KAAK,EAAE,EACpE,SAA2B,CAC5B,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,4BAAiB,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1G,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,CAAC,MAAuB,EAAE,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACxD,OAAO;aACR;YACD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAY,CAAC;YAClC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAC7B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAqB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEzC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;YAClB,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;YAElB,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;aAC/B;YACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE;gBAC7B,KAAK;gBACL,KAAK,EAAE,IAAI;aACmB,CAAC,CAAC;QACpC,CAAC,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,EAAE,CACf,IAAI,EACJ,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,4BAAiB,CAAC,KAAK,EAAE,EACpE,SAA2B,CAC5B,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,6BAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,4BAAiB,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;IACxG,CAAC;CACF;AAxSD,4BAwSC","file":"zoomable.js","sourcesContent":["/* eslint-disable no-duplicate-imports */\nimport { isNil } from '@visactor/vutils';\nimport type { BaseEventParams, EventType, ExtendEventParam, IEvent } from '../../event/interface';\nimport type { IRegion } from '../../region/interface';\nimport type { RenderMode } from '../../typings/spec';\nimport { RenderModeEnum } from '../../typings/spec';\nimport { defaultTriggerEvent } from '../../component/common/trigger/config';\nimport type { IZoomTrigger } from '../../component/common/trigger/interface';\nimport { isPointInRect } from '../../util';\nimport type { ISeries } from '../../series/interface';\nimport { Event_Bubble_Level, Event_Source_Type } from '../../constant';\n\nexport interface IZoomEventOptions {\n shouldZoom?: boolean;\n zoomCallback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void;\n shouldScroll?: boolean;\n scrollCallback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void;\n}\nexport interface IZoomable {\n initZoomable: (evt: IEvent, mode?: RenderMode) => void;\n initZoomEventOfSeries: (\n s: ISeries,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) => any;\n initZoomEventOfRegions: (\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) => void;\n\n initScrollEventOfSeries: (\n s: ISeries,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) => any;\n initScrollEventOfRegions: (\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) => void;\n\n initDragEventOfSeries: (s: ISeries, callback?: (delta: [number, number], e: BaseEventParams['event']) => void) => any;\n initDragEventOfRegions: (\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) => void;\n}\n\nexport class Zoomable implements IZoomable {\n private _clickEnable: boolean;\n\n private _zoomableTrigger: IZoomTrigger;\n\n private _eventObj: IEvent;\n\n private _renderMode: RenderMode;\n\n initZoomable(evt: IEvent, mode: RenderMode = RenderModeEnum['desktop-browser']) {\n this._eventObj = evt;\n this._renderMode = mode;\n // hack 应该由事件系统做?或者事件系统有更好的方式处理这种交互冲突场景\n this._clickEnable = true;\n this._zoomableTrigger = new (this.getTriggerEvent('trigger') as any)();\n }\n\n // event\n private getTriggerEvent(type: string): EventType {\n return defaultTriggerEvent[this._renderMode][type];\n }\n\n private _bindZoomEventAsRegion(\n eventObj: IEvent,\n regionOrSeries: IRegion | ISeries,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) {\n eventObj.on(this.getTriggerEvent('scrollEnd'), { level: Event_Bubble_Level.chart, consume: false }, params => {\n this._zoomableTrigger.clearZoom();\n });\n eventObj.on(this.getTriggerEvent('scroll'), { level: Event_Bubble_Level.chart, consume: true }, params => {\n if (!(params as BaseEventParams).event) {\n return;\n }\n const event = (params as BaseEventParams).event.clone();\n this._zoomableTrigger.parserZoomEvent(event);\n // FIXME: event类型目前不全\n const { zoomDelta, zoomX, zoomY } = event as any;\n if (isNil(zoomDelta)) {\n return;\n }\n if (\n !isPointInRect(\n {\n x: zoomX,\n y: zoomY\n },\n {\n ...regionOrSeries.getLayoutRect(),\n ...regionOrSeries.getLayoutStartPoint()\n }\n )\n ) {\n return;\n }\n this._clickEnable = false;\n\n if (callback) {\n // zoomDelta, zoomX, zoomY can be changed in the callback\n callback({ zoomDelta, zoomX, zoomY }, event);\n }\n\n this._eventObj.emit('zoom', {\n scale: event.zoomDelta,\n scaleCenter: { x: event.zoomX, y: event.zoomY },\n model: this\n } as unknown as ExtendEventParam);\n\n // this._eventObj.emit('scroll', {\n // scrollX: event.scrollX,\n // scrollY: event.scrollY,\n // model: this\n // } as unknown as ExtendEventParam);\n });\n }\n\n initZoomEventOfSeries(\n s: ISeries,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) {\n this._bindZoomEventAsRegion(s.event, s, callback);\n }\n\n initZoomEventOfRegions(\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) {\n regions.forEach(r => {\n if (filter) {\n r.getSeries().forEach(s => {\n if (filter(s)) {\n this._bindZoomEventAsRegion(s.event, s, callback);\n }\n });\n } else {\n this._bindZoomEventAsRegion(this._eventObj, r, callback);\n }\n });\n }\n\n initScrollEventOfSeries(\n s: ISeries,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) {\n this._bindScrollEventAsRegion(s.event, s, callback);\n }\n\n initScrollEventOfRegions(\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) {\n regions.forEach(r => {\n if (filter) {\n r.getSeries().forEach(s => {\n if (filter(s)) {\n this._bindScrollEventAsRegion(s.event, s, callback);\n }\n });\n } else {\n this._bindScrollEventAsRegion(this._eventObj, r, callback);\n }\n });\n }\n\n private _bindScrollEventAsRegion(\n eventObj: IEvent,\n regionOrSeries: IRegion | ISeries,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) {\n eventObj.on(this.getTriggerEvent('scrollEnd'), { level: Event_Bubble_Level.chart, consume: false }, params => {\n this._zoomableTrigger.clearScroll();\n });\n eventObj.on(this.getTriggerEvent('scroll'), { level: Event_Bubble_Level.chart, consume: true }, params => {\n if (!(params as BaseEventParams).event) {\n return;\n }\n const { event } = params as BaseEventParams;\n this._zoomableTrigger.parserScrollEvent(event);\n // FIXME: event类型目前不全\n const { scrollX, scrollY } = event as any;\n if (isNil(scrollX) && isNil(scrollY)) {\n return;\n }\n if (\n !isPointInRect(\n {\n x: event.canvasX,\n y: event.canvasY\n },\n {\n ...regionOrSeries.getLayoutRect(),\n ...regionOrSeries.getLayoutStartPoint()\n }\n )\n ) {\n return;\n }\n this._clickEnable = false;\n\n if (callback) {\n callback({ scrollX, scrollY }, event);\n }\n\n this._eventObj.emit('scroll', {\n scrollX,\n scrollY,\n model: this\n } as unknown as ExtendEventParam);\n });\n }\n\n private _bindDragEventAsRegion(\n eventObj: IEvent,\n regionOrSeries: IRegion | ISeries,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) {\n eventObj.on(this.getTriggerEvent('start'), { level: Event_Bubble_Level.chart }, params => {\n if (!(params as BaseEventParams).event) {\n return;\n }\n\n const { event } = params as BaseEventParams;\n const shouldTrigger = isPointInRect(\n {\n x: event.canvasX,\n y: event.canvasY\n },\n {\n ...regionOrSeries.getLayoutRect(),\n ...regionOrSeries.getLayoutStartPoint()\n }\n );\n if (shouldTrigger) {\n this._handleDrag(params, callback);\n }\n });\n // click 事件需要在drag和zoom时被屏蔽\n // hack 应该由事件系统做?或者事件系统有更好的方式处理这种交互冲突场景\n eventObj.on('click', { level: Event_Bubble_Level.chart }, () => {\n return !this._clickEnable;\n });\n }\n\n initDragEventOfSeries(s: ISeries, callback?: (delta: [number, number], e: BaseEventParams['event']) => void) {\n s.event.on(\n this.getTriggerEvent('start'),\n { level: Event_Bubble_Level.model, filter: ({ model }) => model?.id === s.id },\n params => {\n this._handleDrag(params, callback);\n }\n );\n }\n\n initDragEventOfRegions(\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) {\n regions.forEach(r => {\n if (filter) {\n r.getSeries().forEach(s => {\n if (filter(s)) {\n s.event.on(\n this.getTriggerEvent('start'),\n { level: Event_Bubble_Level.model, filter: ({ model }) => model?.id === s.id },\n params => {\n this._handleDrag(params, callback);\n }\n );\n\n // click 事件需要在drag和zoom时被屏蔽\n // hack 应该由事件系统做?或者事件系统有更好的方式处理这种交互冲突场景\n s.event.on('click', { level: Event_Bubble_Level.model, filter: ({ model }) => model?.id === s.id }, () => {\n return !this._clickEnable;\n });\n }\n });\n } else {\n this._bindDragEventAsRegion(this._eventObj, r, callback);\n }\n });\n }\n\n protected _handleDrag(\n params: ExtendEventParam,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) {\n this._clickEnable = true;\n if (!this._zoomableTrigger.parserDragEvent(params.event)) {\n return;\n }\n const move = this.getTriggerEvent('move');\n const end = this.getTriggerEvent('end');\n const event = params.event as any;\n let x = event.canvasX;\n let y = event.canvasY;\n\n const mouseup = () => {\n this._zoomableTrigger.pointerId = null;\n this._eventObj.off(\n move,\n { level: Event_Bubble_Level.chart, source: Event_Source_Type.chart },\n mousemove as unknown as any\n );\n this._eventObj.off(end, { level: Event_Bubble_Level.chart, source: Event_Source_Type.window }, mouseup);\n };\n const mousemove = (params: BaseEventParams) => {\n if (!this._zoomableTrigger.parserDragEvent(params.event)) {\n return;\n }\n this._clickEnable = false;\n const event = params.event as any;\n const dx = event.canvasX - x;\n const dy = event.canvasY - y;\n const delta: [number, number] = [dx, dy];\n\n x = event.canvasX;\n y = event.canvasY;\n\n if (callback) {\n callback(delta, params.event);\n }\n this._eventObj.emit('panmove', {\n delta,\n model: this\n } as unknown as ExtendEventParam);\n };\n this._eventObj.on(\n move,\n { level: Event_Bubble_Level.chart, source: Event_Source_Type.chart },\n mousemove as unknown as any\n );\n this._eventObj.on(end, { level: Event_Bubble_Level.chart, source: Event_Source_Type.chart }, mouseup);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/interaction/zoom/zoomable.ts"],"names":[],"mappings":"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","file":"zoomable.js","sourcesContent":["/* eslint-disable no-duplicate-imports */\nimport { isNil } from '@visactor/vutils';\nimport type { BaseEventParams, EventType, ExtendEventParam, IEvent } from '../../event/interface';\nimport type { IRegion } from '../../region/interface';\nimport type { RenderMode } from '../../typings/spec';\nimport { RenderModeEnum } from '../../typings/spec';\nimport { defaultTriggerEvent } from '../../component/common/trigger/config';\nimport type { IZoomTrigger } from '../../component/common/trigger/interface';\nimport { isPointInRect } from '../../util';\nimport type { ISeries } from '../../series/interface';\nimport { Event_Bubble_Level, Event_Source_Type } from '../../constant';\n\nexport interface IZoomEventOptions {\n shouldZoom?: boolean;\n zoomCallback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void;\n shouldScroll?: boolean;\n scrollCallback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void;\n}\nexport interface IZoomable {\n initZoomable: (evt: IEvent, mode?: RenderMode) => void;\n initZoomEventOfSeries: (\n s: ISeries,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) => any;\n initZoomEventOfRegions: (\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) => void;\n\n initScrollEventOfSeries: (\n s: ISeries,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) => any;\n initScrollEventOfRegions: (\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) => void;\n\n initDragEventOfSeries: (s: ISeries, callback?: (delta: [number, number], e: BaseEventParams['event']) => void) => any;\n initDragEventOfRegions: (\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) => void;\n}\n\nexport class Zoomable implements IZoomable {\n private _clickEnable: boolean;\n\n private _zoomableTrigger: IZoomTrigger;\n\n private _eventObj: IEvent;\n\n private _renderMode: RenderMode;\n\n initZoomable(evt: IEvent, mode: RenderMode = RenderModeEnum['desktop-browser']) {\n this._eventObj = evt;\n this._renderMode = mode;\n if (defaultTriggerEvent[this._renderMode]) {\n // hack 应该由事件系统做?或者事件系统有更好的方式处理这种交互冲突场景\n this._clickEnable = true;\n this._zoomableTrigger = new (this._getTriggerEvent('trigger') as any)();\n }\n }\n\n // event\n private _getTriggerEvent(type: string): EventType {\n return defaultTriggerEvent[this._renderMode][type];\n }\n\n private _bindZoomEventAsRegion(\n eventObj: IEvent,\n regionOrSeries: IRegion | ISeries,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) {\n eventObj.on(this._getTriggerEvent('scrollEnd'), { level: Event_Bubble_Level.chart, consume: false }, params => {\n this._zoomableTrigger.clearZoom();\n });\n eventObj.on(this._getTriggerEvent('scroll'), { level: Event_Bubble_Level.chart, consume: true }, params => {\n if (!(params as BaseEventParams).event) {\n return;\n }\n const event = (params as BaseEventParams).event.clone();\n this._zoomableTrigger.parserZoomEvent(event);\n // FIXME: event类型目前不全\n const { zoomDelta, zoomX, zoomY } = event as any;\n if (isNil(zoomDelta)) {\n return;\n }\n if (\n !isPointInRect(\n {\n x: zoomX,\n y: zoomY\n },\n {\n ...regionOrSeries.getLayoutRect(),\n ...regionOrSeries.getLayoutStartPoint()\n }\n )\n ) {\n return;\n }\n this._clickEnable = false;\n\n if (callback) {\n // zoomDelta, zoomX, zoomY can be changed in the callback\n callback({ zoomDelta, zoomX, zoomY }, event);\n }\n\n this._eventObj.emit('zoom', {\n scale: event.zoomDelta,\n scaleCenter: { x: event.zoomX, y: event.zoomY },\n model: this\n } as unknown as ExtendEventParam);\n\n // this._eventObj.emit('scroll', {\n // scrollX: event.scrollX,\n // scrollY: event.scrollY,\n // model: this\n // } as unknown as ExtendEventParam);\n });\n }\n\n initZoomEventOfSeries(\n s: ISeries,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) {\n if (defaultTriggerEvent[this._renderMode]) {\n this._bindZoomEventAsRegion(s.event, s, callback);\n }\n }\n\n initZoomEventOfRegions(\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { zoomDelta: number; zoomX: number; zoomY: number }, e: BaseEventParams['event']) => void\n ) {\n if (defaultTriggerEvent[this._renderMode]) {\n regions.forEach(r => {\n if (filter) {\n r.getSeries().forEach(s => {\n if (filter(s)) {\n this._bindZoomEventAsRegion(s.event, s, callback);\n }\n });\n } else {\n this._bindZoomEventAsRegion(this._eventObj, r, callback);\n }\n });\n }\n }\n\n initScrollEventOfSeries(\n s: ISeries,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) {\n if (defaultTriggerEvent[this._renderMode]) {\n this._bindScrollEventAsRegion(s.event, s, callback);\n }\n }\n\n initScrollEventOfRegions(\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) {\n if (defaultTriggerEvent[this._renderMode]) {\n regions.forEach(r => {\n if (filter) {\n r.getSeries().forEach(s => {\n if (filter(s)) {\n this._bindScrollEventAsRegion(s.event, s, callback);\n }\n });\n } else {\n this._bindScrollEventAsRegion(this._eventObj, r, callback);\n }\n });\n }\n }\n\n private _bindScrollEventAsRegion(\n eventObj: IEvent,\n regionOrSeries: IRegion | ISeries,\n callback?: (params: { scrollX: number; scrollY: number }, e: BaseEventParams['event']) => void\n ) {\n eventObj.on(this._getTriggerEvent('scrollEnd'), { level: Event_Bubble_Level.chart, consume: false }, params => {\n this._zoomableTrigger.clearScroll();\n });\n eventObj.on(this._getTriggerEvent('scroll'), { level: Event_Bubble_Level.chart, consume: true }, params => {\n if (!(params as BaseEventParams).event) {\n return;\n }\n const { event } = params as BaseEventParams;\n this._zoomableTrigger.parserScrollEvent(event);\n // FIXME: event类型目前不全\n const { scrollX, scrollY } = event as any;\n if (isNil(scrollX) && isNil(scrollY)) {\n return;\n }\n if (\n !isPointInRect(\n {\n x: event.canvasX,\n y: event.canvasY\n },\n {\n ...regionOrSeries.getLayoutRect(),\n ...regionOrSeries.getLayoutStartPoint()\n }\n )\n ) {\n return;\n }\n this._clickEnable = false;\n\n if (callback) {\n callback({ scrollX, scrollY }, event);\n }\n\n this._eventObj.emit('scroll', {\n scrollX,\n scrollY,\n model: this\n } as unknown as ExtendEventParam);\n });\n }\n\n private _bindDragEventAsRegion(\n eventObj: IEvent,\n regionOrSeries: IRegion | ISeries,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) {\n eventObj.on(this._getTriggerEvent('start'), { level: Event_Bubble_Level.chart }, params => {\n if (!(params as BaseEventParams).event) {\n return;\n }\n\n const { event } = params as BaseEventParams;\n const shouldTrigger = isPointInRect(\n {\n x: event.canvasX,\n y: event.canvasY\n },\n {\n ...regionOrSeries.getLayoutRect(),\n ...regionOrSeries.getLayoutStartPoint()\n }\n );\n if (shouldTrigger) {\n this._handleDrag(params, callback);\n }\n });\n // click 事件需要在drag和zoom时被屏蔽\n // hack 应该由事件系统做?或者事件系统有更好的方式处理这种交互冲突场景\n eventObj.on('click', { level: Event_Bubble_Level.chart }, () => {\n return !this._clickEnable;\n });\n }\n\n initDragEventOfSeries(s: ISeries, callback?: (delta: [number, number], e: BaseEventParams['event']) => void) {\n if (defaultTriggerEvent[this._renderMode]) {\n s.event.on(\n this._getTriggerEvent('start'),\n { level: Event_Bubble_Level.model, filter: ({ model }) => model?.id === s.id },\n params => {\n this._handleDrag(params, callback);\n }\n );\n }\n }\n\n initDragEventOfRegions(\n regions: IRegion[],\n filter?: (s: ISeries) => boolean,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) {\n if (defaultTriggerEvent[this._renderMode]) {\n regions.forEach(r => {\n if (filter) {\n r.getSeries().forEach(s => {\n if (filter(s)) {\n s.event.on(\n this._getTriggerEvent('start'),\n { level: Event_Bubble_Level.model, filter: ({ model }) => model?.id === s.id },\n params => {\n this._handleDrag(params, callback);\n }\n );\n\n // click 事件需要在drag和zoom时被屏蔽\n // hack 应该由事件系统做?或者事件系统有更好的方式处理这种交互冲突场景\n s.event.on(\n 'click',\n { level: Event_Bubble_Level.model, filter: ({ model }) => model?.id === s.id },\n () => {\n return !this._clickEnable;\n }\n );\n }\n });\n } else {\n this._bindDragEventAsRegion(this._eventObj, r, callback);\n }\n });\n }\n }\n\n protected _handleDrag(\n params: ExtendEventParam,\n callback?: (delta: [number, number], e: BaseEventParams['event']) => void\n ) {\n this._clickEnable = true;\n if (!this._zoomableTrigger.parserDragEvent(params.event)) {\n return;\n }\n const move = this._getTriggerEvent('move');\n const end = this._getTriggerEvent('end');\n const event = params.event as any;\n let x = event.canvasX;\n let y = event.canvasY;\n\n const mouseup = () => {\n this._zoomableTrigger.pointerId = null;\n this._eventObj.off(\n move,\n { level: Event_Bubble_Level.chart, source: Event_Source_Type.chart },\n mousemove as unknown as any\n );\n this._eventObj.off(end, { level: Event_Bubble_Level.chart, source: Event_Source_Type.window }, mouseup);\n };\n const mousemove = (params: BaseEventParams) => {\n if (!this._zoomableTrigger.parserDragEvent(params.event)) {\n return;\n }\n this._clickEnable = false;\n const event = params.event as any;\n const dx = event.canvasX - x;\n const dy = event.canvasY - y;\n const delta: [number, number] = [dx, dy];\n\n x = event.canvasX;\n y = event.canvasY;\n\n if (callback) {\n callback(delta, params.event);\n }\n this._eventObj.emit('panmove', {\n delta,\n model: this\n } as unknown as ExtendEventParam);\n };\n this._eventObj.on(\n move,\n { level: Event_Bubble_Level.chart, source: Event_Source_Type.chart },\n mousemove as unknown as any\n );\n this._eventObj.on(end, { level: Event_Bubble_Level.chart, source: Event_Source_Type.chart }, mouseup);\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { BasicComponentPlugin } from '../basic-plugin';
2
+ import type { IComponentPlugin, IComponentPluginService } from '../interface';
3
+ import type { CartesianAxis, ILinearAxisSync } from '../../../component/axis/cartesian';
4
+ export declare class AxisSyncPlugin extends BasicComponentPlugin implements IComponentPlugin {
5
+ Name: string;
6
+ constructor();
7
+ protected _checkEnableSync(axis: CartesianAxis): ILinearAxisSync | false;
8
+ private _getTargetAxis;
9
+ onInit(service: IComponentPluginService, axis: CartesianAxis): void;
10
+ onDidCompile(service: IComponentPluginService, axis: CartesianAxis): void;
11
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.AxisSyncPlugin = void 0;
6
+
7
+ const event_1 = require("./../../../constant/event"), zero_align_transform_1 = require("./zero-align-transform"), basic_plugin_1 = require("../basic-plugin"), vscale_1 = require("@visactor/vscale"), register_1 = require("../../../data/register"), tick_align_transform_1 = require("./tick-align-transform");
8
+
9
+ class AxisSyncPlugin extends basic_plugin_1.BasicComponentPlugin {
10
+ constructor() {
11
+ super(AxisSyncPlugin.Name), this.Name = "AxisSyncPlugin";
12
+ }
13
+ _checkEnableSync(axis) {
14
+ if (!(0, vscale_1.isContinuous)(axis.getScale().type)) return !1;
15
+ const sync = axis.getSpec().sync;
16
+ return !!(null == sync ? void 0 : sync.axisId) && sync;
17
+ }
18
+ _getTargetAxis(axis, sync) {
19
+ const targetAxis = axis.getOption().getChart().getComponentByUserId(sync.axisId);
20
+ return (null == targetAxis ? void 0 : targetAxis.type.startsWith("cartesianAxis")) ? targetAxis : null;
21
+ }
22
+ onInit(service, axis) {
23
+ const sync = this._checkEnableSync(axis);
24
+ if (!sync) return;
25
+ if (!sync.zeroAlign) return;
26
+ const targetAxis = this._getTargetAxis(axis, sync);
27
+ targetAxis && axis.event.on(event_1.ChartEvent.scaleDomainUpdate, {
28
+ filter: ({model: model}) => model.id === axis.id
29
+ }, (() => {
30
+ (0, zero_align_transform_1.zeroAlign)(targetAxis, axis);
31
+ }));
32
+ }
33
+ onDidCompile(service, axis) {
34
+ const sync = this._checkEnableSync(axis);
35
+ if (!sync) return;
36
+ const targetAxis = this._getTargetAxis(axis, sync);
37
+ if (targetAxis && sync.tickAlign) {
38
+ (0, register_1.registerDataSetInstanceTransform)(axis.getOption().dataSet, "tickAlign", tick_align_transform_1.tickAlign);
39
+ const opt = {
40
+ targetAxis: () => targetAxis,
41
+ currentAxis: () => axis
42
+ };
43
+ axis.addTransformToTickData({
44
+ type: "tickAlign",
45
+ options: opt,
46
+ level: Number.MAX_SAFE_INTEGER
47
+ }, !1);
48
+ }
49
+ }
50
+ }
51
+
52
+ exports.AxisSyncPlugin = AxisSyncPlugin;
53
+ //# sourceMappingURL=axis-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin/components/axis-sync-plugin/axis-sync.ts"],"names":[],"mappings":";;;AAAA,qDAAuD;AACvD,iEAAmD;AACnD,kDAAuD;AAGvD,6CAAgD;AAChD,qDAA0E;AAC1E,iEAAmD;AAEnD,MAAa,cAAe,SAAQ,mCAAoB;IAGtD;QACE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAH7B,SAAI,GAAW,gBAAgB,CAAC;IAIhC,CAAC;IAES,gBAAgB,CAAC,IAAmB;QAC5C,IAAI,CAAC,IAAA,qBAAY,EAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE;YACvC,OAAO,KAAK,CAAC;SACd;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAuB,CAAC;QACpD,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,CAAA,EAAE;YACjB,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc,CAAC,IAAmB,EAAE,IAAqB;QAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAkB,CAAC;QAClG,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA,EAAE;YACjD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,OAAgC,EAAE,IAAmB;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,OAAO;SACR;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE;YACf,OAAO;SACR;QAED,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,kBAAU,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE;YAChG,IAAA,gCAAS,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,OAAgC,EAAE,IAAmB;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE;YACT,OAAO;SACR;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE;YACf,OAAO;SACR;QACD,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAA,2CAAgC,EAAC,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,gCAAS,CAAC,CAAC;YACnF,MAAM,GAAG,GAAG;gBACV,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU;gBAC5B,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;aACxB,CAAC;YAEF,IAAI,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,gBAAgB,EAAE,EAAE,KAAK,CAAC,CAAC;SACzG;IACH,CAAC;CACF;AA/DD,wCA+DC","file":"axis-sync.js","sourcesContent":["import { ChartEvent } from './../../../constant/event';\nimport { zeroAlign } from './zero-align-transform';\nimport { BasicComponentPlugin } from '../basic-plugin';\nimport type { IComponentPlugin, IComponentPluginService } from '../interface';\nimport type { CartesianAxis, ILinearAxisSync } from '../../../component/axis/cartesian';\nimport { isContinuous } from '@visactor/vscale';\nimport { registerDataSetInstanceTransform } from '../../../data/register';\nimport { tickAlign } from './tick-align-transform';\n\nexport class AxisSyncPlugin extends BasicComponentPlugin implements IComponentPlugin {\n Name: string = 'AxisSyncPlugin';\n\n constructor() {\n super(AxisSyncPlugin.Name);\n }\n\n protected _checkEnableSync(axis: CartesianAxis): ILinearAxisSync | false {\n if (!isContinuous(axis.getScale().type)) {\n return false;\n }\n const sync = axis.getSpec().sync as ILinearAxisSync;\n if (!sync?.axisId) {\n return false;\n }\n return sync;\n }\n\n private _getTargetAxis(axis: CartesianAxis, sync: ILinearAxisSync) {\n const targetAxis = axis.getOption().getChart().getComponentByUserId(sync.axisId) as CartesianAxis;\n if (!targetAxis?.type.startsWith('cartesianAxis')) {\n return null;\n }\n return targetAxis;\n }\n\n onInit(service: IComponentPluginService, axis: CartesianAxis) {\n const sync = this._checkEnableSync(axis);\n if (!sync) {\n return;\n }\n if (!sync.zeroAlign) {\n return;\n }\n const targetAxis = this._getTargetAxis(axis, sync);\n if (!targetAxis) {\n return;\n }\n // because of if the to axes bind in same region, the region will update them both in the data update.\n axis.event.on(ChartEvent.scaleDomainUpdate, { filter: ({ model }) => model.id === axis.id }, () => {\n zeroAlign(targetAxis, axis);\n });\n }\n\n onDidCompile(service: IComponentPluginService, axis: CartesianAxis) {\n const sync = this._checkEnableSync(axis);\n if (!sync) {\n return;\n }\n const targetAxis = this._getTargetAxis(axis, sync);\n if (!targetAxis) {\n return;\n }\n if (sync.tickAlign) {\n registerDataSetInstanceTransform(axis.getOption().dataSet, 'tickAlign', tickAlign);\n const opt = {\n targetAxis: () => targetAxis,\n currentAxis: () => axis\n };\n // only make this one follow target\n axis.addTransformToTickData({ type: 'tickAlign', options: opt, level: Number.MAX_SAFE_INTEGER }, false);\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export * from './axis-sync';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
4
+ void 0 === k2 && (k2 = k);
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
7
+ enumerable: !0,
8
+ get: function() {
9
+ return m[k];
10
+ }
11
+ }), Object.defineProperty(o, k2, desc);
12
+ } : function(o, m, k, k2) {
13
+ void 0 === k2 && (k2 = k), o[k2] = m[k];
14
+ }), __exportStar = this && this.__exportStar || function(m, exports) {
15
+ for (var p in m) "default" === p || Object.prototype.hasOwnProperty.call(exports, p) || __createBinding(exports, m, p);
16
+ };
17
+
18
+ Object.defineProperty(exports, "__esModule", {
19
+ value: !0
20
+ }), __exportStar(require("./axis-sync"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin/components/axis-sync-plugin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B","file":"index.js","sourcesContent":["export * from './axis-sync';\n"]}
@@ -0,0 +1,7 @@
1
+ import type { Datum } from '../../../typings';
2
+ import type { CartesianAxis } from '../../../component';
3
+ export interface ITickAlignOpt {
4
+ targetAxis: () => CartesianAxis;
5
+ currentAxis: () => CartesianAxis;
6
+ }
7
+ export declare const tickAlign: (data: Array<Datum>, op: ITickAlignOpt) => Datum[];
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.tickAlign = void 0;
6
+
7
+ const util_1 = require("../../../data/transforms/tick-data/util"), tickAlign = (data, op) => {
8
+ var _a, _b, _c, _d, _e;
9
+ if (!data) return data;
10
+ const targetAxis = null === (_a = null == op ? void 0 : op.targetAxis) || void 0 === _a ? void 0 : _a.call(op);
11
+ if (!targetAxis) return data;
12
+ const currentAxis = null === (_b = null == op ? void 0 : op.currentAxis) || void 0 === _b ? void 0 : _b.call(op);
13
+ if (!currentAxis) return data;
14
+ const currentData = null === (_c = currentAxis.getTickData()) || void 0 === _c ? void 0 : _c.getDataView();
15
+ if (!currentData) return data;
16
+ const currentTickTransform = currentData.transformsArr.find((t => "ticks" === t.type));
17
+ if (!currentTickTransform) return data;
18
+ const currentScale = currentAxis.getScale();
19
+ if (!currentScale) return data;
20
+ const targetData = null === (_e = null === (_d = targetAxis.getTickData()) || void 0 === _d ? void 0 : _d.getDataView()) || void 0 === _e ? void 0 : _e.latestData;
21
+ if (!(null == targetData ? void 0 : targetData.length)) return data;
22
+ const targetScale = targetAxis.getScale();
23
+ if (!targetScale) return data;
24
+ const targetDomain = targetScale.domain(), targetRange = targetDomain[1] - targetDomain[0];
25
+ if (0 === targetRange) return data;
26
+ const currentDomain = currentScale.domain(), currentRange = currentDomain[1] - currentDomain[0];
27
+ if (0 === targetRange) return data;
28
+ const newTicks = targetData.map((d => {
29
+ const percent = (d.value - targetDomain[0]) / targetRange;
30
+ return currentRange * percent + currentDomain[0];
31
+ }));
32
+ return (0, util_1.convertDomainToTickData)(newTicks, currentTickTransform.options);
33
+ };
34
+
35
+ exports.tickAlign = tickAlign;
36
+ //# sourceMappingURL=tick-align-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin/components/axis-sync-plugin/tick-align-transform.ts"],"names":[],"mappings":";;;AAEA,kEAAkF;AAO3E,MAAM,SAAS,GAAG,CAAC,IAAkB,EAAE,EAAiB,EAAE,EAAE;;IACjE,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,IAAI,CAAC;KACb;IAED,MAAM,UAAU,GAAG,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,UAAU,kDAAI,CAAC;IACtC,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,IAAI,CAAC;KACb;IACD,MAAM,WAAW,GAAG,MAAA,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,WAAW,kDAAI,CAAC;IACxC,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,IAAI,CAAC;KACb;IACD,MAAM,WAAW,GAAG,MAAA,WAAW,CAAC,WAAW,EAAE,0CAAE,WAAW,EAAE,CAAC;IAC7D,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,IAAI,CAAC;KACb;IACD,MAAM,oBAAoB,GAAG,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IACrF,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,IAAI,CAAC;KACb;IACD,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC5C,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,IAAI,CAAC;KACb;IACD,MAAM,UAAU,GAAG,MAAA,MAAA,UAAU,CAAC,WAAW,EAAE,0CAAE,WAAW,EAAE,0CAAE,UAAU,CAAC;IACvE,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAA,EAAE;QACvB,OAAO,IAAI,CAAC;KACb;IACD,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,CAAC,WAAW,EAAE;QAChB,OAAO,IAAI,CAAC;KACb;IACD,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,WAAW,KAAK,CAAC,EAAE;QACrB,OAAO,IAAI,CAAC;KACb;IACD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,WAAW,KAAK,CAAC,EAAE;QACrB,OAAO,IAAI,CAAC;KACb;IAED,MAAM,QAAQ,GAAa,UAAU,CAAC,GAAG,CAAC,CAAC,CAAoB,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;QAC1D,OAAO,YAAY,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO,IAAA,8BAAuB,EAAC,QAAQ,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC,CAAC;AAjDW,QAAA,SAAS,aAiDpB","file":"tick-align-transform.js","sourcesContent":["import type { Datum } from '../../../typings';\nimport type { CartesianAxis } from '../../../component';\nimport { convertDomainToTickData } from '../../../data/transforms/tick-data/util';\n\nexport interface ITickAlignOpt {\n targetAxis: () => CartesianAxis;\n currentAxis: () => CartesianAxis;\n}\n\nexport const tickAlign = (data: Array<Datum>, op: ITickAlignOpt) => {\n if (!data) {\n return data;\n }\n // check align enable\n const targetAxis = op?.targetAxis?.();\n if (!targetAxis) {\n return data;\n }\n const currentAxis = op?.currentAxis?.();\n if (!currentAxis) {\n return data;\n }\n const currentData = currentAxis.getTickData()?.getDataView();\n if (!currentData) {\n return data;\n }\n const currentTickTransform = currentData.transformsArr.find(t => t.type === 'ticks');\n if (!currentTickTransform) {\n return data;\n }\n const currentScale = currentAxis.getScale();\n if (!currentScale) {\n return data;\n }\n const targetData = targetAxis.getTickData()?.getDataView()?.latestData;\n if (!targetData?.length) {\n return data;\n }\n const targetScale = targetAxis.getScale();\n if (!targetScale) {\n return data;\n }\n const targetDomain = targetScale.domain();\n const targetRange = targetDomain[1] - targetDomain[0];\n if (targetRange === 0) {\n return data;\n }\n const currentDomain = currentScale.domain();\n const currentRange = currentDomain[1] - currentDomain[0];\n if (targetRange === 0) {\n return data;\n }\n // make the tickData of the current axis consistent with the tickData of the target axis\n const newTicks: number[] = targetData.map((d: { value: number }) => {\n const percent = (d.value - targetDomain[0]) / targetRange;\n return currentRange * percent + currentDomain[0];\n });\n return convertDomainToTickData(newTicks, currentTickTransform.options);\n};\n"]}
@@ -0,0 +1,15 @@
1
+ import type { CartesianAxis } from '../../../component';
2
+ import type { LinearAxisMixin } from '../../../component/axis/mixin/linear-axis-mixin';
3
+ type ScaleInfo = {
4
+ total: number;
5
+ negative: number;
6
+ positive: number;
7
+ includeZero: boolean;
8
+ extendable_min: boolean;
9
+ extendable_max: boolean;
10
+ domain: number[];
11
+ };
12
+ export declare function isValidAlignDomain(domain: number[]): boolean;
13
+ export declare function getScaleInfo(axis: LinearAxisMixin, domain: number[]): ScaleInfo;
14
+ export declare const zeroAlign: (targetAxis: CartesianAxis, currentAxis: CartesianAxis) => void;
15
+ export {};
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: !0
5
+ }), exports.zeroAlign = exports.getScaleInfo = exports.isValidAlignDomain = void 0;
6
+
7
+ const vutils_1 = require("@visactor/vutils"), vscale_1 = require("@visactor/vscale");
8
+
9
+ function isValidAlignDomain(domain) {
10
+ return 2 === domain.length && (0, vutils_1.isValidNumber)(domain[0]) && (0, vutils_1.isValidNumber)(domain[1]) && domain[1] >= domain[0];
11
+ }
12
+
13
+ function getScaleInfo(axis, domain) {
14
+ const total = domain[1] - domain[0], includeZero = domain[1] * domain[0] < 0;
15
+ let negative = domain[0] <= 0 ? 0 - domain[0] : 0, positive = domain[1] > 0 ? domain[1] - 0 : 0;
16
+ 0 === total ? domain[0] < 0 ? (negative = 1, positive = 0) : domain[0] > 0 && (negative = 0,
17
+ positive = 1) : (negative /= total, positive /= total);
18
+ const domainSpec = axis.getDomainSpec();
19
+ return {
20
+ total: total,
21
+ negative: negative,
22
+ positive: positive,
23
+ includeZero: includeZero,
24
+ domain: domain,
25
+ extendable_min: !(0, vutils_1.isValidNumber)(domainSpec.min),
26
+ extendable_max: !(0, vutils_1.isValidNumber)(domainSpec.max)
27
+ };
28
+ }
29
+
30
+ function inDifferentCrossZero(info1, info2) {
31
+ const {positive: positive1, negative: negative1, extendable_min: s1Extendable_min, extendable_max: s1Extendable_max, domain: domain1} = info1, {positive: positive2, negative: negative2, extendable_min: s2Extendable_min, extendable_max: s2Extendable_max, domain: domain2} = info2;
32
+ if (positive2 > 0) {
33
+ if (!s2Extendable_min) return !1;
34
+ let comp = negative1 / positive1;
35
+ s1Extendable_max && (comp = negative1 / Math.max(positive1, positive2), domain1[1] = -domain1[0] / comp),
36
+ domain2[0] = -domain2[1] * comp;
37
+ } else if (negative2 > 0) {
38
+ if (!s2Extendable_max) return !1;
39
+ let comp = positive1 / negative1;
40
+ s1Extendable_min && (comp = positive1 / Math.max(negative1, negative1), domain1[0] = -domain1[1] / comp),
41
+ domain2[1] = -domain2[0] * comp;
42
+ }
43
+ return !0;
44
+ }
45
+
46
+ function inOnlyZeroDomain(info1, info2) {
47
+ const {extendable_min: s1Extendable_min, extendable_max: s1Extendable_max, domain: domain1} = info1, {positive: positive2, negative: negative2, domain: domain2} = info2;
48
+ return (0 !== positive2 || 0 !== negative2) && (!(positive2 > 0 && !s1Extendable_max) && (!(negative2 > 0 && !s1Extendable_min) && (domain1[0] = domain2[0],
49
+ domain1[1] = domain2[1], !0)));
50
+ }
51
+
52
+ function inAllCrossZero(info1, info2) {
53
+ const {positive: positive1, negative: negative1, extendable_max: s1Extendable_max, domain: domain1} = info1, {positive: positive2, negative: negative2, extendable_min: s2Extendable_min, domain: domain2} = info2;
54
+ if (s1Extendable_max && s2Extendable_min) {
55
+ const comp = Math.max(negative1, negative2) / Math.max(positive1, positive2);
56
+ domain1[1] = -domain1[0] / comp, domain2[0] = -domain2[1] * comp;
57
+ } else if (s2Extendable_min) {
58
+ const comp = negative1 / positive1;
59
+ domain2[0] = -domain2[1] * comp;
60
+ } else {
61
+ if (!s1Extendable_max) return !1;
62
+ {
63
+ const comp = negative2 / positive2;
64
+ domain1[1] = -domain1[0] / comp;
65
+ }
66
+ }
67
+ return !0;
68
+ }
69
+
70
+ function inNoCrossDifferentSide(info1, info2) {
71
+ const {extendable_min: s1Extendable_min, domain: domain1} = info1, {extendable_max: s2Extendable_max, domain: domain2} = info2;
72
+ return !(!s1Extendable_min || !s2Extendable_max) && (domain1[0] = -domain1[1], domain2[1] = -domain2[0],
73
+ !0);
74
+ }
75
+
76
+ exports.isValidAlignDomain = isValidAlignDomain, exports.getScaleInfo = getScaleInfo;
77
+
78
+ const zeroAlign = (targetAxis, currentAxis) => {
79
+ const s1 = targetAxis.getScale(), s2 = currentAxis.getScale();
80
+ if (!s1 || !s2) return;
81
+ if (!(0, vscale_1.isContinuous)(s1.type) || !(0, vscale_1.isContinuous)(s2.type)) return;
82
+ const domain1 = [ ...s1.domain() ], domain2 = [ ...s2.domain() ];
83
+ if (!isValidAlignDomain(domain1) || !isValidAlignDomain(domain2)) return;
84
+ const info1 = getScaleInfo(targetAxis, domain1), info2 = getScaleInfo(currentAxis, domain2), {positive: positive1, negative: negative1, extendable_min: s1Extendable_min, extendable_max: s1Extendable_max, includeZero: includeZero1} = info1, {positive: positive2, negative: negative2, extendable_min: s2Extendable_min, extendable_max: s2Extendable_max, includeZero: includeZero2} = info2;
85
+ if (0 === positive1 && 0 === negative1) {
86
+ if (!inOnlyZeroDomain(info1, info2)) return;
87
+ } else if (0 === positive2 && 0 === negative2) {
88
+ if (!inOnlyZeroDomain(info2, info1)) return;
89
+ } else if (includeZero1 || includeZero2) if (includeZero1 && !includeZero2) {
90
+ if (!inDifferentCrossZero(info1, info2)) return;
91
+ } else if (includeZero2 && !includeZero1) {
92
+ if (!inDifferentCrossZero(info2, info1)) return;
93
+ } else {
94
+ if (negative1 === negative2) return;
95
+ if (negative1 > negative2) {
96
+ if (!inAllCrossZero(info1, info2)) return;
97
+ } else if (!inAllCrossZero(info2, info1)) return;
98
+ } else {
99
+ if (0 === negative1 && 0 === positive2) {
100
+ if (!inNoCrossDifferentSide(info1, info2)) return;
101
+ } else if (0 === negative2 && 0 === positive1 && !inNoCrossDifferentSide(info2, info1)) return;
102
+ if (0 === negative1 && 0 === negative2) if (0 === domain1[0] && domain2[0] > 0) {
103
+ if (!s2Extendable_min) return;
104
+ domain2[0] = 0;
105
+ } else {
106
+ if (!(0 === domain2[0] && domain1[0] > 0)) return;
107
+ if (!s1Extendable_min) return;
108
+ domain1[0] = 0;
109
+ }
110
+ if (0 === positive1 && 0 === positive2) if (0 === domain1[1] && domain2[1] > 0) {
111
+ if (!s2Extendable_max) return;
112
+ domain2[1] = 0;
113
+ } else {
114
+ if (!(0 === domain2[1] && domain1[1] > 0)) return;
115
+ if (!s1Extendable_max) return;
116
+ domain1[1] = 0;
117
+ }
118
+ }
119
+ s1.domain(domain1), s2.domain(domain2);
120
+ };
121
+
122
+ exports.zeroAlign = zeroAlign;
123
+ //# sourceMappingURL=zero-align-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin/components/axis-sync-plugin/zero-align-transform.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AACjD,6CAAgD;AAchD,SAAgB,kBAAkB,CAAC,MAAgB;IACjD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAA,sBAAa,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,IAAA,sBAAa,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;AAC/G,CAAC;AAFD,gDAEC;AAED,SAAgB,YAAY,CAAC,IAAqB,EAAE,MAAgB;IAElE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,CAAC,EAAE;QACf,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;YACjB,QAAQ,GAAG,CAAC,CAAC;YACb,QAAQ,GAAG,CAAC,CAAC;SACd;aAAM,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;YACxB,QAAQ,GAAG,CAAC,CAAC;YACb,QAAQ,GAAG,CAAC,CAAC;SACd;KACF;SAAM;QACL,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;QAC5B,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;KAC7B;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IACxC,OAAO;QACL,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,MAAM;QACN,cAAc,EAAE,CAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,GAAG,CAAC;QAC9C,cAAc,EAAE,CAAC,IAAA,sBAAa,EAAC,UAAU,CAAC,GAAG,CAAC;KAC/C,CAAC;AACJ,CAAC;AA5BD,oCA4BC;AAED,SAAS,oBAAoB,CAAC,KAAgB,EAAE,KAAgB;IAC9D,MAAM,EACJ,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,SAAS,EACnB,cAAc,EAAE,gBAAgB,EAChC,cAAc,EAAE,gBAAgB,EAChC,MAAM,EAAE,OAAO,EAChB,GAAG,KAAK,CAAC;IACV,MAAM,EACJ,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,SAAS,EACnB,cAAc,EAAE,gBAAgB,EAChC,cAAc,EAAE,gBAAgB,EAChC,MAAM,EAAE,OAAO,EAChB,GAAG,KAAK,CAAC;IAEV,IAAI,SAAS,GAAG,CAAC,EAAE;QACjB,IAAI,CAAC,gBAAgB,EAAE;YACrB,OAAO,KAAK,CAAC;SACd;QACD,IAAI,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;QAGjC,IAAI,gBAAgB,EAAE;YAEpB,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;SACjC;QACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KACjC;SAAM,IAAI,SAAS,GAAG,CAAC,EAAE;QACxB,IAAI,CAAC,gBAAgB,EAAE;YACrB,OAAO,KAAK,CAAC;SACd;QACD,IAAI,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;QAGjC,IAAI,gBAAgB,EAAE;YAEpB,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;SACjC;QACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KACjC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAgB,EAAE,KAAgB;IAC1D,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACtG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE5E,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE;QACtC,OAAO,KAAK,CAAC;KACd;IAED,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACtC,OAAO,KAAK,CAAC;KACd;IAED,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACtC,OAAO,KAAK,CAAC;KACd;IAED,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,KAAgB,EAAE,KAAgB;IACxD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC9G,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC9G,IAAI,gBAAgB,IAAI,gBAAgB,EAAE;QAExC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAChC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KACjC;SAEI,IAAI,gBAAgB,EAAE;QACzB,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KACjC;SAAM,IAAI,gBAAgB,EAAE;QAC3B,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;QACnC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KACjC;SAAM;QAEL,OAAO,KAAK,CAAC;KACd;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAgB,EAAE,KAAgB;IAChE,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACpE,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEpE,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB,EAAE;QAC1C,OAAO,KAAK,CAAC;KACd;IACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,MAAM,SAAS,GAAG,CAAC,UAAyB,EAAE,WAA0B,EAAE,EAAE;IACjF,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;IACjC,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE;QACd,OAAO;KACR;IACD,IAAI,CAAC,IAAA,qBAAY,EAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAA,qBAAY,EAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QACpD,OAAO;KACR;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAChE,OAAO;KACR;IAED,MAAM,KAAK,GAAG,YAAY,CAA4B,UAAW,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,YAAY,CAA4B,WAAY,EAAE,OAAO,CAAC,CAAC;IAC7E,MAAM,EACJ,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,SAAS,EACnB,cAAc,EAAE,gBAAgB,EAChC,cAAc,EAAE,gBAAgB,EAChC,WAAW,EAAE,YAAY,EAC1B,GAAG,KAAK,CAAC;IACV,MAAM,EACJ,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,SAAS,EACnB,cAAc,EAAE,gBAAgB,EAChC,cAAc,EAAE,gBAAgB,EAChC,WAAW,EAAE,YAAY,EAC1B,GAAG,KAAK,CAAC;IAIV,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE;QACtC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACnC,OAAO;SACR;KACF;SAEI,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE;QAC3C,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACnC,OAAO;SACR;KACF;SAEI,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,EAAE;QAGvC,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE;YACtC,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;gBACzC,OAAO;aACR;SACF;aAEI,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE;YAC3C,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;gBACzC,OAAO;aACR;SACF;QAID,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE;YAEtC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;gBACtC,IAAI,CAAC,gBAAgB,EAAE;oBACrB,OAAO;iBACR;gBACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAChB;iBAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;gBAC7C,IAAI,CAAC,gBAAgB,EAAE;oBACrB,OAAO;iBACR;gBACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAChB;iBAAM;gBACL,OAAO;aACR;SACF;QAED,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE;YAEtC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;gBACtC,IAAI,CAAC,gBAAgB,EAAE;oBACrB,OAAO;iBACR;gBACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAChB;iBAEI,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;gBAC3C,IAAI,CAAC,gBAAgB,EAAE;oBACrB,OAAO;iBACR;gBACD,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aAChB;iBAAM;gBACL,OAAO;aACR;SACF;KACF;SAEI,IAAI,YAAY,IAAI,CAAC,YAAY,EAAE;QACtC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACvC,OAAO;SACR;KACF;SAEI,IAAI,YAAY,IAAI,CAAC,YAAY,EAAE;QACtC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;YACvC,OAAO;SACR;KACF;SAEI;QAEH,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,OAAO;SACR;aAEI,IAAI,SAAS,GAAG,SAAS,EAAE;YAC9B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;gBACjC,OAAO;aACR;SACF;aAEI;YACH,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE;gBACjC,OAAO;aACR;SACF;KACF;IACD,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC,CAAC;AApIW,QAAA,SAAS,aAoIpB","file":"zero-align-transform.js","sourcesContent":["import { isValidNumber } from '@visactor/vutils';\nimport { isContinuous } from '@visactor/vscale';\nimport type { CartesianAxis } from '../../../component';\nimport type { LinearAxisMixin } from '../../../component/axis/mixin/linear-axis-mixin';\n\ntype ScaleInfo = {\n total: number;\n negative: number;\n positive: number;\n includeZero: boolean;\n extendable_min: boolean;\n extendable_max: boolean;\n domain: number[];\n};\n\nexport function isValidAlignDomain(domain: number[]): boolean {\n return domain.length === 2 && isValidNumber(domain[0]) && isValidNumber(domain[1]) && domain[1] >= domain[0];\n}\n\nexport function getScaleInfo(axis: LinearAxisMixin, domain: number[]): ScaleInfo {\n // example: -10 -20 total = 10 negative = 10\n const total = domain[1] - domain[0];\n const includeZero = domain[1] * domain[0] < 0;\n let negative = domain[0] <= 0 ? 0 - domain[0] : 0;\n let positive = domain[1] > 0 ? domain[1] - 0 : 0;\n if (total === 0) {\n if (domain[0] < 0) {\n negative = 1;\n positive = 0;\n } else if (domain[0] > 0) {\n negative = 0;\n positive = 1;\n }\n } else {\n negative = negative / total;\n positive = positive / total;\n }\n const domainSpec = axis.getDomainSpec();\n return {\n total,\n negative,\n positive,\n includeZero,\n domain,\n extendable_min: !isValidNumber(domainSpec.min),\n extendable_max: !isValidNumber(domainSpec.max)\n };\n}\n\nfunction inDifferentCrossZero(info1: ScaleInfo, info2: ScaleInfo): boolean {\n const {\n positive: positive1,\n negative: negative1,\n extendable_min: s1Extendable_min,\n extendable_max: s1Extendable_max,\n domain: domain1\n } = info1;\n const {\n positive: positive2,\n negative: negative2,\n extendable_min: s2Extendable_min,\n extendable_max: s2Extendable_max,\n domain: domain2\n } = info2;\n // make s2 percent same as s1\n if (positive2 > 0) {\n if (!s2Extendable_min) {\n return false;\n }\n let comp = negative1 / positive1;\n // if s1 could extend max, then expand s1\n // example:【0.5,0.5】 + 【0,1】 = 【0.5,1】\n if (s1Extendable_max) {\n // change s1 percent\n comp = negative1 / Math.max(positive1, positive2);\n domain1[1] = -domain1[0] / comp;\n }\n domain2[0] = -domain2[1] * comp;\n } else if (negative2 > 0) {\n if (!s2Extendable_max) {\n return false;\n }\n let comp = positive1 / negative1;\n // if s1 could extend max, then expand s1\n // example:【0.5,0.5】 + 【1,0】 = 【1,0.5】\n if (s1Extendable_min) {\n // change s1 percent\n comp = positive1 / Math.max(negative1, negative1);\n domain1[0] = -domain1[1] / comp;\n }\n domain2[1] = -domain2[0] * comp;\n }\n return true;\n}\n\nfunction inOnlyZeroDomain(info1: ScaleInfo, info2: ScaleInfo): boolean {\n const { extendable_min: s1Extendable_min, extendable_max: s1Extendable_max, domain: domain1 } = info1;\n const { positive: positive2, negative: negative2, domain: domain2 } = info2;\n // both [0,0]\n if (positive2 === 0 && negative2 === 0) {\n return false;\n }\n // 如果副轴 有正值部分 主轴无法正值扩展,跳过\n if (positive2 > 0 && !s1Extendable_max) {\n return false;\n }\n // 如果副轴 有负值部分 主轴无法负值扩展,跳过\n if (negative2 > 0 && !s1Extendable_min) {\n return false;\n }\n // 其他场景,将主轴设置为与副轴相同\n domain1[0] = domain2[0];\n domain1[1] = domain2[1];\n return true;\n}\n\nfunction inAllCrossZero(info1: ScaleInfo, info2: ScaleInfo): boolean {\n const { positive: positive1, negative: negative1, extendable_max: s1Extendable_max, domain: domain1 } = info1;\n const { positive: positive2, negative: negative2, extendable_min: s2Extendable_min, domain: domain2 } = info2;\n if (s1Extendable_max && s2Extendable_min) {\n // percent\n const comp = Math.max(negative1, negative2) / Math.max(positive1, positive2);\n domain1[1] = -domain1[0] / comp;\n domain2[0] = -domain2[1] * comp;\n }\n // only on side extendable\n else if (s2Extendable_min) {\n const comp = negative1 / positive1;\n domain2[0] = -domain2[1] * comp;\n } else if (s1Extendable_max) {\n const comp = negative2 / positive2;\n domain1[1] = -domain1[0] / comp;\n } else {\n // skip\n return false;\n }\n return true;\n}\n\nfunction inNoCrossDifferentSide(info1: ScaleInfo, info2: ScaleInfo): boolean {\n const { extendable_min: s1Extendable_min, domain: domain1 } = info1;\n const { extendable_max: s2Extendable_max, domain: domain2 } = info2;\n // extendable\n if (!s1Extendable_min || !s2Extendable_max) {\n return false;\n }\n domain1[0] = -domain1[1];\n domain2[1] = -domain2[0];\n return true;\n}\n\nexport const zeroAlign = (targetAxis: CartesianAxis, currentAxis: CartesianAxis) => {\n const s1 = targetAxis.getScale();\n const s2 = currentAxis.getScale();\n if (!s1 || !s2) {\n return;\n }\n if (!isContinuous(s1.type) || !isContinuous(s2.type)) {\n return;\n }\n const domain1 = [...s1.domain()];\n const domain2 = [...s2.domain()];\n if (!isValidAlignDomain(domain1) || !isValidAlignDomain(domain2)) {\n return;\n }\n // 先分别获取正负比例\n const info1 = getScaleInfo(<LinearAxisMixin>(<unknown>targetAxis), domain1);\n const info2 = getScaleInfo(<LinearAxisMixin>(<unknown>currentAxis), domain2);\n const {\n positive: positive1,\n negative: negative1,\n extendable_min: s1Extendable_min,\n extendable_max: s1Extendable_max,\n includeZero: includeZero1\n } = info1;\n const {\n positive: positive2,\n negative: negative2,\n extendable_min: s2Extendable_min,\n extendable_max: s2Extendable_max,\n includeZero: includeZero2\n } = info2;\n\n // first check [0,0]\n // axis 1 in [0,0]\n if (positive1 === 0 && negative1 === 0) {\n if (!inOnlyZeroDomain(info1, info2)) {\n return;\n }\n }\n // axis 2 in [0,0]\n else if (positive2 === 0 && negative2 === 0) {\n if (!inOnlyZeroDomain(info2, info1)) {\n return;\n }\n }\n // check of both of axis are not cross zero\n else if (!includeZero1 && !includeZero2) {\n // if in different side s1 * s2 < 0\n // s1 > 0 s2 < 0\n if (negative1 === 0 && positive2 === 0) {\n if (!inNoCrossDifferentSide(info1, info2)) {\n return;\n }\n }\n // s1 < 0 s2 > 0\n else if (negative2 === 0 && positive1 === 0) {\n if (!inNoCrossDifferentSide(info2, info1)) {\n return;\n }\n }\n\n // if in same side s1 * s2 > 0\n // both positive\n if (negative1 === 0 && negative2 === 0) {\n // make sure has zero\n if (domain1[0] === 0 && domain2[0] > 0) {\n if (!s2Extendable_min) {\n return;\n }\n domain2[0] = 0;\n } else if (domain2[0] === 0 && domain1[0] > 0) {\n if (!s1Extendable_min) {\n return;\n }\n domain1[0] = 0;\n } else {\n return;\n }\n }\n // both negative1\n if (positive1 === 0 && positive2 === 0) {\n // s1 has 0 in domain & s2 has not\n if (domain1[1] === 0 && domain2[1] > 0) {\n if (!s2Extendable_max) {\n return;\n }\n domain2[1] = 0;\n }\n // s2 has 0 in domain & s1 has not\n else if (domain2[1] === 0 && domain1[1] > 0) {\n if (!s1Extendable_max) {\n return;\n }\n domain1[1] = 0;\n } else {\n return;\n }\n }\n }\n // check one axis cross zero axis1\n else if (includeZero1 && !includeZero2) {\n if (!inDifferentCrossZero(info1, info2)) {\n return;\n }\n }\n // check one axis cross zero axis2\n else if (includeZero2 && !includeZero1) {\n if (!inDifferentCrossZero(info2, info1)) {\n return;\n }\n }\n // check of both of axis are cross zero\n else {\n // same percent of negative\n if (negative1 === negative2) {\n return;\n }\n // negative percent s1 > s2\n else if (negative1 > negative2) {\n if (!inAllCrossZero(info1, info2)) {\n return;\n }\n }\n // negative percent s1 < s2\n else {\n if (!inAllCrossZero(info2, info1)) {\n return;\n }\n }\n }\n s1.domain(domain1);\n s2.domain(domain2);\n};\n"]}