@tsingroc/tsingroc-components 3.13.4 → 3.14.1

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 (39) hide show
  1. package/dist/components/TsingrocTheme.js +1 -1
  2. package/dist/components/TsingrocTheme.js.map +1 -1
  3. package/dist/deckgl/TiandituLayer.js +6 -17
  4. package/dist/deckgl/TiandituLayer.js.map +1 -1
  5. package/dist/deckgl/WeatherData.d.ts +3 -3
  6. package/dist/echarts/index.js +1 -1
  7. package/dist/echarts/index.js.map +1 -1
  8. package/dist/echarts/series.d.ts +44 -0
  9. package/dist/echarts/series.js +54 -1
  10. package/dist/echarts/series.js.map +1 -1
  11. package/package.json +3 -3
  12. package/src/components/Auth.tsx +389 -0
  13. package/src/components/Calendar.tsx +182 -0
  14. package/src/components/CircularProgress.tsx +38 -0
  15. package/src/components/Header.tsx +136 -0
  16. package/src/components/ImageBackground.tsx +58 -0
  17. package/src/components/IndicatorLight.tsx +106 -0
  18. package/src/components/LineChartEditor.tsx +558 -0
  19. package/src/components/LineChartTable.tsx +285 -0
  20. package/src/components/LinkedLineChart.tsx +223 -0
  21. package/src/components/QuickDateRangePicker.tsx +84 -0
  22. package/src/components/SegmentedButtons.tsx +46 -0
  23. package/src/components/Sidebar.tsx +250 -0
  24. package/src/components/TsingrocDatePicker.tsx +103 -0
  25. package/src/components/TsingrocTheme.tsx +47 -0
  26. package/src/components/UserButton.tsx +152 -0
  27. package/src/components/VerticalColorLegend.tsx +73 -0
  28. package/src/components/WeatherMap.tsx +521 -0
  29. package/src/deckgl/TiandituLayer.ts +56 -0
  30. package/src/deckgl/WeatherData.ts +157 -0
  31. package/src/deckgl/index.ts +4 -0
  32. package/src/echarts/coordinateSystem.ts +132 -0
  33. package/src/echarts/gl.ts +158 -0
  34. package/src/echarts/index.ts +120 -0
  35. package/src/echarts/legend.ts +36 -0
  36. package/src/echarts/radar.ts +46 -0
  37. package/src/echarts/series.ts +441 -0
  38. package/src/echarts/tooltip.ts +17 -0
  39. package/src/index.ts +79 -0
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { ConfigProvider, theme } from "antd";
3
3
  import dayjs from "dayjs";
4
- import zhCN from "antd/locale/zh_CN";
4
+ import zhCN from "antd/es/locale/zh_CN";
5
5
  import "dayjs/locale/zh-cn";
6
6
  /**
7
7
  * 清鹏智能的公共 Ant Design 主题,会影响内部的所有 Ant Design 组件的样式。
@@ -1 +1 @@
1
- {"version":3,"file":"TsingrocTheme.js","sourceRoot":"","sources":["../../src/components/TsingrocTheme.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,IAAI,MAAM,mBAAmB,CAAC;AACrC,OAAO,oBAAoB,CAAC;AAS5B;;;GAGG;AACH,SAAS,aAAa,CAAC,KAAyB;IAC9C,sBAAsB;IACtB,kDAAkD;IAClD,YAAY;IACZ,oeAAoe;IACpe,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,CACL,KAAC,cAAc,IACb,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE;YACL,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB;YACpE,KAAK,EAAE,KAAK,CAAC,IAAI;gBACf,CAAC,CAAC;oBACE,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,SAAS;oBACpB,YAAY,EAAE,SAAS;iBACxB;gBACH,CAAC,CAAC;oBACE,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,SAAS;oBACpB,YAAY,EAAE,SAAS;iBACxB;SACN,YAEA,KAAK,CAAC,QAAQ,GACA,CAClB,CAAC;AACJ,CAAC;AAED,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"TsingrocTheme.js","sourceRoot":"","sources":["../../src/components/TsingrocTheme.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,OAAO,oBAAoB,CAAC;AAS5B;;;GAGG;AACH,SAAS,aAAa,CAAC,KAAyB;IAC9C,sBAAsB;IACtB,kDAAkD;IAClD,YAAY;IACZ,oeAAoe;IACpe,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,CACL,KAAC,cAAc,IACb,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE;YACL,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB;YACpE,KAAK,EAAE,KAAK,CAAC,IAAI;gBACf,CAAC,CAAC;oBACE,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,SAAS;oBACpB,YAAY,EAAE,SAAS;iBACxB;gBACH,CAAC,CAAC;oBACE,YAAY,EAAE,SAAS;oBACvB,SAAS,EAAE,SAAS;oBACpB,YAAY,EAAE,SAAS;iBACxB;SACN,YAEA,KAAK,CAAC,QAAQ,GACA,CAClB,CAAC;AACJ,CAAC;AAED,eAAe,aAAa,CAAC"}
@@ -1,6 +1,11 @@
1
1
  import { BitmapLayer, CompositeLayer } from "deck.gl";
2
2
  import { TileLayer } from "@deck.gl/geo-layers";
3
- class TiandituLayer extends CompositeLayer {
3
+ export default class TiandituLayer extends CompositeLayer {
4
+ static layerName = "TiandituLayer";
5
+ static defaultProps = {
6
+ type: { type: "object", value: "vec" },
7
+ layer: { type: "object", value: "base" },
8
+ };
4
9
  renderLayers() {
5
10
  const { tiandituTk, type, layer } = this.props;
6
11
  const actualType = layer === "base" ? type : "c" + type[0] + "a";
@@ -13,22 +18,6 @@ class TiandituLayer extends CompositeLayer {
13
18
  }));
14
19
  }
15
20
  }
16
- Object.defineProperty(TiandituLayer, "layerName", {
17
- enumerable: true,
18
- configurable: true,
19
- writable: true,
20
- value: "TiandituLayer"
21
- });
22
- Object.defineProperty(TiandituLayer, "defaultProps", {
23
- enumerable: true,
24
- configurable: true,
25
- writable: true,
26
- value: {
27
- type: { type: "object", value: "vec" },
28
- layer: { type: "object", value: "base" },
29
- }
30
- });
31
- export default TiandituLayer;
32
21
  const makeUrlTemplate = (tiandituTk, type) => Array.from({ length: 8 }, (_, i) => `https://t${i}.tianditu.gov.cn/${type}_w/wmts` +
33
22
  `?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0` +
34
23
  `&LAYER=${type}&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles` +
@@ -1 +1 @@
1
- {"version":3,"file":"TiandituLayer.js","sourceRoot":"","sources":["../../src/deckgl/TiandituLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,SAAS,EAAuB,MAAM,qBAAqB,CAAC;AASrE,MAAqB,aAAc,SAAQ,cAAkC;IAM3E,YAAY;QACV,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC/C,MAAM,UAAU,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACjE,OAAO,IAAI,SAAS,CAClB,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC;YAC7C,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,CAAC;YACb,eAAe;SAChB,CAAC,CACH,CAAC;IACJ,CAAC;;AAjBe;;;;WAAY,eAAe;GAAC;AAC5B;;;;WAAiD;QAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;KACzC;GAAC;eALiB,aAAa;AAqBlC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,IAAY,EAAE,EAAE,CAC3D,KAAK,CAAC,IAAI,CACR,EAAE,MAAM,EAAE,CAAC,EAAE,EACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,YAAY,CAAC,oBAAoB,IAAI,SAAS;IAC9C,6CAA6C;IAC7C,UAAU,IAAI,6CAA6C;IAC3D,yCAAyC;IACzC,OAAO,UAAU,EAAE,CACtB,CAAC;AAEJ,MAAM,eAAe,GAAsC,CAAC,KAAK,EAAE,EAAE;IACnE,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;IACnC,OAAO,IAAI,WAAW,CAAC;QACrB,GAAG,KAAK;QACR,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,MAAM,EAAE;YACN,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAClB;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
1
+ {"version":3,"file":"TiandituLayer.js","sourceRoot":"","sources":["../../src/deckgl/TiandituLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,SAAS,EAAuB,MAAM,qBAAqB,CAAC;AASrE,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,cAAkC;IAC3E,MAAM,CAAU,SAAS,GAAG,eAAe,CAAC;IAC5C,MAAM,CAAU,YAAY,GAAqC;QAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;QACtC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;KACzC,CAAC;IACF,YAAY;QACV,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC/C,MAAM,UAAU,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACjE,OAAO,IAAI,SAAS,CAClB,IAAI,CAAC,gBAAgB,CAAC;YACpB,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC;YAC7C,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,CAAC;YACb,eAAe;SAChB,CAAC,CACH,CAAC;IACJ,CAAC;;AAGH,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,IAAY,EAAE,EAAE,CAC3D,KAAK,CAAC,IAAI,CACR,EAAE,MAAM,EAAE,CAAC,EAAE,EACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,YAAY,CAAC,oBAAoB,IAAI,SAAS;IAC9C,6CAA6C;IAC7C,UAAU,IAAI,6CAA6C;IAC3D,yCAAyC;IACzC,OAAO,UAAU,EAAE,CACtB,CAAC;AAEJ,MAAM,eAAe,GAAsC,CAAC,KAAK,EAAE,EAAE;IACnE,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;IACnC,OAAO,IAAI,WAAW,CAAC;QACrB,GAAG,KAAK;QACR,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,KAAK,CAAC,IAAI;QACjB,MAAM,EAAE;YACN,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAClB;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -25,13 +25,13 @@ export interface WeatherData {
25
25
  dew_point_2m?: number[][][];
26
26
  /** % */
27
27
  relative_humidity_2m?: number[][][];
28
- /** m/s */
28
+ /** 风速沿纬线向**东**吹(西风)的分量,m/s */
29
29
  wind_component_u_10m?: number[][][];
30
- /** m/s */
30
+ /** 风速沿经线向**北**吹(南风)的分量,m/s */
31
31
  wind_component_v_10m?: number[][][];
32
32
  /** m/s */
33
33
  wind_speed_10m?: number[][][];
34
- /** deg,`0` 表示**东风**,随着角度增大,风向**顺时针**旋转。*/
34
+ /** deg,`0` 表示**北风**(往南吹),随着角度增大,风向**顺时针**旋转。*/
35
35
  wind_direction_10m?: number[][][];
36
36
  /** mm */
37
37
  rain?: number[][][];
@@ -13,7 +13,7 @@ export function buildEChartsOption(base, ...components) {
13
13
  for (const component of components) {
14
14
  Object.entries(component).forEach(([k, value]) => {
15
15
  const key = k;
16
- (option[key] ?? (option[key] = [])).push(...(value ?? []));
16
+ (option[key] ??= []).push(...(value ?? []));
17
17
  });
18
18
  }
19
19
  return option;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/echarts/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AA2BzB;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAgC,EAChC,GAAG,UAA8B;IAEjC,MAAM,MAAM,GAAkD,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/C,MAAM,GAAG,GAAG,CAA2B,CAAC;YACxC,CAAC,MAAM,CAAC,GAAG,MAAV,MAAM,CAAC,GAAG,IAAM,EAAE,EAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAgC,EAChC,GAAG,UAA8B;IAEjC,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,EAC7C,UAAU,CACX,CAAC;AACJ,CAAC;AAED,SAAS;AAET,6CAA6C;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CACpC,EAAE,MAAM,EAAE,EAAE,EAAE,EACd,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAC9D,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,WAAW,GACtB,gaAAga,CAAC;AAEna,cAAc;AACd,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/echarts/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AA2BzB;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAgC,EAChC,GAAG,UAA8B;IAEjC,MAAM,MAAM,GAAkD,EAAE,GAAG,IAAI,EAAE,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/C,MAAM,GAAG,GAAG,CAA2B,CAAC;YACxC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAuB,CAAC;AACjC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAgC,EAChC,GAAG,UAA8B;IAEjC,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,EAC7C,UAAU,CACX,CAAC;AACJ,CAAC;AAED,SAAS;AAET,6CAA6C;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CACpC,EAAE,MAAM,EAAE,EAAE,EAAE,EACd,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAC9D,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,WAAW,GACtB,gaAAga,CAAC;AAEna,cAAc;AACd,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC"}
@@ -65,6 +65,50 @@ export interface IntervalSeriesOption {
65
65
  }
66
66
  /** 绘制一个从下边界到上边界的带状区间。*/
67
67
  export declare function intervalSeries(option: IntervalSeriesOption): EChartsSeries<OrigLineSeriesOption>;
68
+ export interface WindLineSeriesOption {
69
+ /** 系列名称,不可与其他系列重名。*/
70
+ name: string;
71
+ /**
72
+ * 风力数据,支持两种形式:
73
+ *
74
+ * - `type: "cartesian"`,用沿经线和沿纬线的风速分量表示风力;
75
+ * - `type: "polar"`,用风速和风向表示风力。
76
+ */
77
+ data: {
78
+ type: "cartesian";
79
+ /** 沿纬线向**东**吹(西风)的风速分量,单位 m/s。*/
80
+ u: number[];
81
+ /** 沿经线向**北**吹(南风)的风速分量,单位 m/s。*/
82
+ v: number[];
83
+ } | {
84
+ type: "polar";
85
+ /** 风速,单位 m/s。*/
86
+ speed: number[];
87
+ /** 风向,单位是角度(deg),`0` 表示**北风**(往南吹),随着角度增大,风向**顺时针**旋转。*/
88
+ direction: number[];
89
+ };
90
+ /**
91
+ * 风向标的宽度和长度。
92
+ * @default [10, 20]
93
+ */
94
+ symbolSize?: [number, number];
95
+ /**
96
+ * 其它需要添加到系列上的选项,参见 [ECharts 文档][1]。优先级**低于**预设 `presets`。
97
+ *
98
+ * [1]: https://echarts.apache.org/zh/option.html#series-line
99
+ */
100
+ option?: OrigLineSeriesOption;
101
+ /**
102
+ * 需要应用的配置预设。预设的优先级**高于** `option`。
103
+ *
104
+ * 可用的预设:{@linkcode gradientArea}
105
+ */
106
+ presets?: LineSeriesPreset[];
107
+ }
108
+ /**
109
+ * 风速风向折线图。
110
+ */
111
+ export declare function windLineSeries(option: WindLineSeriesOption): EChartsSeries<OrigLineSeriesOption>;
68
112
  export interface MaxBarSeriesOption {
69
113
  /** 系列名称,不可与其他系列重名。*/
70
114
  name: string;
@@ -21,7 +21,7 @@ export function lineSeries(option) {
21
21
  */
22
22
  export function gradientArea(top, bottom = "transparent") {
23
23
  return (option) => {
24
- (option.areaStyle ?? (option.areaStyle = {})).color = {
24
+ (option.areaStyle ??= {}).color = {
25
25
  type: "linear",
26
26
  x: 0,
27
27
  y: 0,
@@ -77,6 +77,59 @@ export function intervalSeries(option) {
77
77
  };
78
78
  return { series: [min, interval, max] };
79
79
  }
80
+ /**
81
+ * 风速风向折线图。
82
+ */
83
+ export function windLineSeries(option) {
84
+ const data = option.data;
85
+ const { speed, direction } = data.type === "polar"
86
+ ? data
87
+ : {
88
+ speed: data.u.map((u, i) => Math.sqrt(u * u + data.v[i] * data.v[i])),
89
+ direction: data.u.map((u, i) => (Math.atan2(-u, -data.v[i]) / Math.PI) * 180),
90
+ };
91
+ const symbolSize = option.symbolSize ?? [10, 20];
92
+ const series = {
93
+ type: "line",
94
+ id: option.name,
95
+ name: option.name,
96
+ data: speed,
97
+ smooth: true,
98
+ symbol: "arrow",
99
+ symbolSize: symbolSize,
100
+ symbolOffset: (data, param) => {
101
+ const rad = (direction[param.dataIndex] / 180) * Math.PI;
102
+ const halfSize = symbolSize[1] / 2;
103
+ return [-halfSize * Math.sin(rad), halfSize * Math.cos(rad)];
104
+ },
105
+ symbolRotate: (data, param) => 180 - direction[param.dataIndex],
106
+ ...option.option,
107
+ itemStyle: {
108
+ borderWidth: 1,
109
+ borderColor: "#fff",
110
+ ...option.option?.itemStyle,
111
+ },
112
+ tooltip: {
113
+ valueFormatter: (value, index) => value.toFixed(2) +
114
+ " m/s," +
115
+ WIND_DIRECTIONS[(Math.round(direction[index] / 45) + 8) % 8] +
116
+ "风",
117
+ ...option.option?.tooltip,
118
+ },
119
+ };
120
+ option.presets?.forEach((preset) => preset(series));
121
+ return { series: [series] };
122
+ }
123
+ const WIND_DIRECTIONS = [
124
+ "北",
125
+ "东北",
126
+ "东",
127
+ "东南",
128
+ "南",
129
+ "西南",
130
+ "西",
131
+ "西北",
132
+ ];
80
133
  /** 求出多个系列的最大值,显示为条形图。*/
81
134
  export function maxBarSeries(option) {
82
135
  const series = {
@@ -1 +1 @@
1
- {"version":3,"file":"series.js","sourceRoot":"","sources":["../../src/echarts/series.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"series.js","sourceRoot":"","sources":["../../src/echarts/series.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "@tsingroc/tsingroc-components",
3
- "version": "3.13.4",
3
+ "version": "3.14.1",
4
4
  "author": "",
5
5
  "license": "ISC",
6
6
  "description": "",
7
7
  "keywords": [],
8
8
  "type": "module",
9
9
  "main": "dist/index.js",
10
- "types": "dist/index.d.ts",
11
10
  "sideEffects": [
12
11
  "**/*.css"
13
12
  ],
@@ -17,7 +16,8 @@
17
16
  "./echarts/gl": "./dist/echarts/gl.js"
18
17
  },
19
18
  "files": [
20
- "dist"
19
+ "dist",
20
+ "src"
21
21
  ],
22
22
  "scripts": {
23
23
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -0,0 +1,389 @@
1
+ import {
2
+ createContext,
3
+ type ReactNode,
4
+ useContext,
5
+ useEffect,
6
+ useMemo,
7
+ useRef,
8
+ useState,
9
+ } from "react";
10
+ import { jwtDecode, type JwtPayload } from "jwt-decode";
11
+ import Sdk from "casdoor-js-sdk";
12
+ import type { SdkConfig } from "casdoor-js-sdk/lib/esm/sdk";
13
+
14
+ export interface AccessTokenPayload extends JwtPayload {
15
+ /**
16
+ * Token 的发布者。见 [JWT 标准][1]。
17
+ *
18
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
19
+ */
20
+ iss: string;
21
+ /**
22
+ * Token 的主题。见 [JWT 标准][1]。
23
+ *
24
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
25
+ */
26
+ sub: string;
27
+ /**
28
+ * Token 的目标应用 ID。见 [JWT 标准][1]。
29
+ *
30
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
31
+ */
32
+ aud: string[];
33
+ /**
34
+ * 使用 Token 的应用 ID。见 [JWT 标准][1]。
35
+ *
36
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
37
+ */
38
+ azp: string;
39
+ /**
40
+ * Token 的唯一标识符。见 [JWT 标准][1]。
41
+ *
42
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
43
+ */
44
+ jti: string;
45
+ /** Token 的过期时间(Unix 时间戳)。*/
46
+ exp: number;
47
+ /** Token 的生效时间(Unix 时间戳)。*/
48
+ nbf: number;
49
+ /** Token 的签发时间(Unix 时间戳)。*/
50
+ iat: number;
51
+
52
+ /** 用户的登录名。*/
53
+ name: string;
54
+ /** 用户的 UUID。*/
55
+ id: string;
56
+ /** 用户的显示名。*/
57
+ displayName: string;
58
+ /** 用户的头像 URL。*/
59
+ avatar: string;
60
+ /** 用户的邮件地址。*/
61
+ email: string;
62
+ /** 用户的手机号。*/
63
+ phone: string;
64
+
65
+ owner: "tsingroc";
66
+ tokenType: "access-token";
67
+ scope: "profile";
68
+ }
69
+
70
+ export interface UserInfo {
71
+ /**
72
+ * Token 的发布者。见 [JWT 标准][1]。
73
+ *
74
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
75
+ */
76
+ iss: string;
77
+ /**
78
+ * Token 的主题。见 [JWT 标准][1]。
79
+ *
80
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
81
+ */
82
+ sub: string;
83
+ /**
84
+ * Token 的目标应用 ID。见 [JWT 标准][1]。
85
+ *
86
+ * [1]: https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
87
+ */
88
+ aud: string;
89
+ /** 用户的全名(显示名)。*/
90
+ name: string;
91
+ /** 短用户名(登录名)。*/
92
+ prefered_username?: string;
93
+ /** 用户的邮件地址。*/
94
+ email?: string;
95
+ /** 用户的邮件地址是否已确认。*/
96
+ email_verified?: boolean;
97
+ /** 用户的手机号。*/
98
+ phone?: string;
99
+ /** 用户的头像 URL。*/
100
+ picture: string;
101
+ /** 用户的地址。*/
102
+ address?: string;
103
+ /** 用户所属的用户组。*/
104
+ groups: string[];
105
+ /** 用户的角色。*/
106
+ roles: string[];
107
+ }
108
+
109
+ interface User {
110
+ /** 用户的个人信息,未经过 {@linkcode AuthCheck} 验证时为空。*/
111
+ userInfo?: UserInfo;
112
+ /** Access Token,未登录时为空。*/
113
+ accessToken?: string;
114
+ /** 解码后的 Access Token,未登录时为空。这里也会有一些用户的个人信息。*/
115
+ decodedAccessToken?: AccessTokenPayload;
116
+ }
117
+
118
+ export interface Auth extends User {
119
+ /** 全局的 Casdoor SDK 对象。*/
120
+ sdk: Sdk;
121
+ /**
122
+ * 跳转到登录。
123
+ *
124
+ * 参数 `redirect` 可以填入登录完成后要跳转到的地址。如果省略,那么跳转目标将由
125
+ * {@linkcode AuthCallback} 的 {@linkcode AuthCallbackProps.onRedirect | onRedirect}
126
+ * 属性决定,默认为跳转到主页。
127
+ */
128
+ login(redirect?: string): void;
129
+ /** 从登录页面返回时应该调用的回调。当登录状态无效时会**抛出异常**。*/
130
+ callback(): Promise<void>;
131
+ /** 在线检查用户是否登录。用户未登录时会**抛出异常**。*/
132
+ validate(): Promise<void>;
133
+ /**
134
+ * 登出。
135
+ *
136
+ * 参数 `redirect` 可以填入登出后跳转到的地址。如果省略,默认为**不做任何跳转**。
137
+ * 你也可以在登出后手动加一行跳转操作,比如使用 React Router 的 `navigate`。
138
+ */
139
+ logout(redirect?: string): void;
140
+ /**
141
+ * 以当前用户的 access token 作为 bearer token 发起请求。
142
+ * 用法与正常的 {@linkcode fetch} 完全一致。未登录时,返回的 Promise 会立即失败。
143
+ */
144
+ fetchWithAuth(
145
+ resource: RequestInfo | URL,
146
+ options?: RequestInit,
147
+ ): Promise<Response>;
148
+ }
149
+
150
+ const AuthContext = createContext<Auth | undefined>(undefined);
151
+
152
+ /**
153
+ * 获取登录鉴权相关的工具函数和全局状态。必须在 {@linkcode AuthProvider} 内部才能使用。
154
+ *
155
+ * 参数 `user` 仅供组件库内部使用,编写项目代码时可以忽略。
156
+ */
157
+ export function useAuth(user: string = "useAuth") {
158
+ const auth = useContext(AuthContext);
159
+ if (auth === undefined) {
160
+ throw new Error(user + " 必须在 AuthProvider 内部使用!");
161
+ }
162
+ return auth;
163
+ }
164
+
165
+ export interface AuthProviderProps {
166
+ /**
167
+ * 用于初始化 Casdoor SDK 的配置对象。
168
+ * {@linkcode SdkConfig.redirectPath | sdkConfig.redirectPath} 应该指向一个包含
169
+ * {@linkcode AuthCallback} 组件的路径。
170
+ */
171
+ sdkConfig: SdkConfig;
172
+ /**
173
+ * 登录 API 的源点,末尾不带 `/`。
174
+ * @default location.origin
175
+ */
176
+ signinOrigin?: string;
177
+ /**
178
+ * 登陆 API 的路径。
179
+ * @default "/api/signin"
180
+ */
181
+ signinPath?: string;
182
+ /** 需要管理登录状态的内容。*/
183
+ children: ReactNode;
184
+ }
185
+
186
+ /**
187
+ * 为包裹的内容提供登陆状态管理服务,通常应该包裹在整个 App 组件外部。
188
+ *
189
+ * 使用时至少需要提供 {@linkcode AuthProviderProps.sdkConfig | sdkConfig} 和
190
+ * {@linkcode AuthProviderProps.signinOrigin | signinOrigin} 两个属性。
191
+ * 其中,{@linkcode SdkConfig.redirectPath | sdkConfig.redirectPath} 应该指向一个包含
192
+ * {@linkcode AuthCallback} 组件的路径。
193
+ *
194
+ * 在 {@linkcode AuthProvider} 的内部,
195
+ * 可以使用 {@linkcode useAuth} 来获取登录鉴权相关的工具函数和全局状态,
196
+ * 也可以使用 {@linkcode AuthCheck} 来确保某个页面或内容只有已登录用户可以访问。
197
+ */
198
+ export function AuthProvider(props: AuthProviderProps): ReactNode {
199
+ const [user, setUser] = useState<User>(() => {
200
+ const token = localStorage.getItem("access_token");
201
+ if (!token) {
202
+ return {};
203
+ } else {
204
+ return {
205
+ accessToken: token,
206
+ get decodedAccessToken() {
207
+ return jwtDecode<AccessTokenPayload>(token);
208
+ },
209
+ };
210
+ }
211
+ });
212
+ const auth = useMemo<Auth>(() => {
213
+ const sdk = new Sdk(props.sdkConfig);
214
+ return {
215
+ sdk,
216
+ login(redirect) {
217
+ location.href = sdk.getSigninUrl();
218
+ if (redirect) {
219
+ sessionStorage.setItem("login_redirect", redirect);
220
+ }
221
+ },
222
+ async callback() {
223
+ // sdk 的类型声明有误
224
+ const resp = (await sdk.signin(
225
+ props.signinOrigin ?? location.origin,
226
+ props.signinPath,
227
+ )) as unknown as { token?: string };
228
+ const token = resp.token;
229
+ if (!token) {
230
+ throw new Error("登录 API 返回了异常的结果:" + JSON.stringify(resp));
231
+ }
232
+ localStorage.setItem("access_token", token);
233
+ setUser({
234
+ accessToken: token,
235
+ get decodedAccessToken() {
236
+ return jwtDecode<AccessTokenPayload>(token);
237
+ },
238
+ });
239
+ },
240
+ async validate() {
241
+ const token = user.accessToken;
242
+ if (!token) {
243
+ throw new Error("未登录!");
244
+ }
245
+ // sdk 的类型声明有误
246
+ const resp = (await sdk.getUserInfo(token)) as unknown as
247
+ | UserInfo
248
+ | { status: "error" };
249
+ if ("status" in resp) {
250
+ localStorage.removeItem("access_token");
251
+ setUser({});
252
+ throw new Error("登陆状态无效!");
253
+ } else {
254
+ setUser({ ...user, userInfo: resp });
255
+ }
256
+ },
257
+ logout(redirect) {
258
+ localStorage.removeItem("access_token");
259
+ setUser({});
260
+ if (redirect) {
261
+ location.href = redirect;
262
+ }
263
+ },
264
+ async fetchWithAuth(resource, options) {
265
+ const token = user.accessToken;
266
+ if (!token) {
267
+ throw new Error("未登录时无法使用 fetchWithAuth");
268
+ }
269
+ return await fetch(resource, {
270
+ ...options,
271
+ headers: {
272
+ Authorization: `Bearer ${token}`,
273
+ ...options?.headers,
274
+ },
275
+ });
276
+ },
277
+ ...user,
278
+ };
279
+ }, [props.sdkConfig, props.signinOrigin, props.signinPath, user]);
280
+ return (
281
+ <AuthContext.Provider value={auth}>{props.children}</AuthContext.Provider>
282
+ );
283
+ }
284
+
285
+ export interface AuthCheckProps {
286
+ /**
287
+ * 用户必须拥有的角色。用户必须拥有这里列出的所有角色才能访问被保护的内容。
288
+ * 如果省略,则只需要登录即可访问。
289
+ */
290
+ roles?: string[];
291
+ /**
292
+ * 在检查过程中时向用户显示的加载界面。
293
+ * @default "正在登录……"
294
+ */
295
+ loading?: ReactNode;
296
+ /**
297
+ * 当用户未登录或登录状态验证失败时的回调。默认会跳转到登录。
298
+ * @default () => auth.login(location.href) // auth = useAuth()
299
+ */
300
+ onFail?: (err: unknown) => void;
301
+ /**
302
+ * 用户已登录,但不满足权限要求时显示的内容。
303
+ * @default "您无权访问此页面!"
304
+ */
305
+ forbidden?: ReactNode;
306
+ /** 用户登录后显示的内容。*/
307
+ children: ReactNode;
308
+ }
309
+
310
+ /**
311
+ * 在线检查用户是否登录、是否满足权限要求。
312
+ * 未登录的用户会被跳转到登录,不满足权限要求的用户会见到警告信息,只有检验通过的用户才能访问内部的内容。
313
+ *
314
+ * 该组件必须在 {@linkcode AuthProvider} 内部才能使用。
315
+ */
316
+ export function AuthCheck(props: AuthCheckProps): ReactNode {
317
+ const auth = useAuth("AuthCheck");
318
+ const userInfo = auth.userInfo;
319
+ // 用于确保在 Strict Mode 下副作用也只执行一次
320
+ const effectDone = useRef(false);
321
+ useEffect(() => {
322
+ if (effectDone.current) return;
323
+ effectDone.current = true;
324
+ if (!auth.userInfo) {
325
+ auth.validate().catch(props.onFail ?? (() => auth.login(location.href)));
326
+ }
327
+ // 这个副作用只在首次渲染时执行
328
+ // eslint-disable-next-line react-hooks/exhaustive-deps
329
+ }, []);
330
+ if (userInfo) {
331
+ if ((props.roles ?? []).every((role) => userInfo.roles.includes(role))) {
332
+ return props.children;
333
+ } else {
334
+ return props.forbidden ?? "您无权访问此页面!";
335
+ }
336
+ } else {
337
+ return props.loading ?? "正在登录……";
338
+ }
339
+ }
340
+
341
+ export interface AuthCallbackProps {
342
+ /**
343
+ * 跳转时的回调。传入的 `redirect` 参数就是 {@linkcode Auth.login | login} 函数的参数。
344
+ * @default (redirect) => { location.href = redirect ?? "/"; }
345
+ */
346
+ onRedirect?: (redirect?: string) => void;
347
+ /**
348
+ * 发生错误时显示的内容。
349
+ * @default (err) => err.toString()
350
+ */
351
+ error?: (err: unknown) => ReactNode;
352
+ /**
353
+ * 跳转前显示的内容。
354
+ * @default "正在跳转……"
355
+ */
356
+ children?: ReactNode;
357
+ }
358
+
359
+ /**
360
+ * 从登录页面返回到的回调页面。
361
+ *
362
+ * 该组件必须在 {@linkcode AuthProvider} 内部才能使用。
363
+ */
364
+ export function AuthCallback(props: AuthCallbackProps): ReactNode {
365
+ const auth = useAuth("AuthCallback");
366
+ const [error, setError] = useState<unknown>();
367
+ // 用于确保在 Strict Mode 下副作用也只执行一次
368
+ const effectDone = useRef(false);
369
+ useEffect(() => {
370
+ if (effectDone.current) return;
371
+ effectDone.current = true;
372
+ const redirect = sessionStorage.getItem("login_redirect");
373
+ sessionStorage.removeItem("login_redirect");
374
+ auth.callback().then(() => {
375
+ if (props.onRedirect) {
376
+ props.onRedirect(redirect ?? undefined);
377
+ } else {
378
+ location.href = redirect ?? "/";
379
+ }
380
+ }, setError);
381
+ // 这个副作用只在首次渲染时执行
382
+ // eslint-disable-next-line react-hooks/exhaustive-deps
383
+ }, []);
384
+ if (error) {
385
+ return props.error ? props.error(error) : (error as object).toString();
386
+ } else {
387
+ return props.children ?? "正在跳转……";
388
+ }
389
+ }