diff --git a/src/components/mulSelectDropdown/__tests__/mulSelectDropdown.test.tsx b/src/components/mulSelectDropdown/__tests__/mulSelectDropdown.test.tsx
index 0d523c025..4ab2fb807 100644
--- a/src/components/mulSelectDropdown/__tests__/mulSelectDropdown.test.tsx
+++ b/src/components/mulSelectDropdown/__tests__/mulSelectDropdown.test.tsx
@@ -25,10 +25,7 @@ describe('mulSelectDropdown Component test', () => {
),
};
const { getByTestId } = render(
-
+
);
fireEvent.click(getByTestId('drop_down_btn'));
diff --git a/src/components/mxGraph/factory.tsx b/src/components/mxGraph/factory.tsx
index b0a5d6b91..50ca39ab5 100644
--- a/src/components/mxGraph/factory.tsx
+++ b/src/components/mxGraph/factory.tsx
@@ -113,16 +113,11 @@ class MxFactory {
this.node.setAttribute(
'stroke',
// Prevent transform css constiables into lower case
- strokeColor.startsWith('const')
- ? strokeColor
- : strokeColor.toLowerCase()
+ strokeColor.startsWith('const') ? strokeColor : strokeColor.toLowerCase()
);
if (s.alpha < 1 || s.strokeAlpha < 1) {
- this.node.setAttribute(
- 'stroke-opacity',
- s.alpha * s.strokeAlpha
- );
+ this.node.setAttribute('stroke-opacity', s.alpha * s.strokeAlpha);
}
const sw = this.getCurrentStrokeWidth();
@@ -138,9 +133,7 @@ class MxFactory {
if (s.dashed) {
this.node.setAttribute(
'stroke-dasharray',
- this.createDashPattern(
- (s.fixDash ? 1 : s.strokeWidth) * s.scale
- )
+ this.createDashPattern((s.fixDash ? 1 : s.strokeWidth) * s.scale)
);
}
};
@@ -175,10 +168,7 @@ class MxFactory {
this.root.ownerDocument === document
) {
// Workaround for potential base tag and brackets must be escaped
- const base = this.getBaseUrl().replace(
- /([()])/g,
- '\\$1'
- );
+ const base = this.getBaseUrl().replace(/([()])/g, '\\$1');
this.node.setAttribute('fill', `url(${base}#${id})`);
} else {
this.node.setAttribute('fill', `url(#${id})`);
@@ -188,9 +178,7 @@ class MxFactory {
this.node.setAttribute(
'fill',
// Prevent transform css constiables into lower case
- fillColor.startsWith('const')
- ? fillColor
- : fillColor.toLowerCase()
+ fillColor.startsWith('const') ? fillColor : fillColor.toLowerCase()
);
}
}
@@ -252,12 +240,7 @@ class MxFactory {
...(userEdgeStyle || {}),
});
- mxGraphView.prototype.updateFloatingTerminalPoint = function (
- edge,
- start,
- end,
- source
- ) {
+ mxGraphView.prototype.updateFloatingTerminalPoint = function (edge, start, end, source) {
if (config?.getPortOffset) {
const next = this.getNextPoint(edge, end, source);
if (!start.text) return;
@@ -287,7 +270,10 @@ class MxFactory {
edge.setAbsoluteTerminalPoint(new MxPoint(x, y), source);
} else {
- edge.setAbsoluteTerminalPoint(this.getFloatingTerminalPoint(edge, start, end, source), source);
+ edge.setAbsoluteTerminalPoint(
+ this.getFloatingTerminalPoint(edge, start, end, source),
+ source
+ );
}
};
@@ -361,11 +347,7 @@ class MxFactory {
* 初始化 graph 相关配置
*/
public initContainerScroll = () => {
- const {
- mxRectangle: MxRectangle,
- mxPoint: MxPoint,
- mxUtils,
- } = this.mxInstance;
+ const { mxRectangle: MxRectangle, mxPoint: MxPoint, mxUtils } = this.mxInstance;
if (this.mxGraph) {
const graph = this.mxGraph;
/**
@@ -393,11 +375,11 @@ class MxFactory {
graph.getPageSize = function (this: mxGraph & { scrollTileSize: mxRectangle }) {
return this.pageVisible
? new MxRectangle(
- 0,
- 0,
- this.pageFormat.width * this.pageScale,
- this.pageFormat.height * this.pageScale
- )
+ 0,
+ 0,
+ this.pageFormat.width * this.pageScale,
+ this.pageFormat.height * this.pageScale
+ )
: this.scrollTileSize!;
};
@@ -408,9 +390,7 @@ class MxFactory {
* page count.
*/
graph.getPageLayout = function () {
- const size = this.pageVisible
- ? this.getPageSize!()
- : this.scrollTileSize!;
+ const size = this.pageVisible ? this.getPageSize!() : this.scrollTileSize!;
const bounds = this.getGraphBounds();
if (bounds.width === 0 || bounds.height === 0) {
@@ -418,12 +398,8 @@ class MxFactory {
}
// Computes untransformed graph bounds
- const x = Math.ceil(
- bounds.x / this.view.scale - this.view.translate.x
- );
- const y = Math.ceil(
- bounds.y / this.view.scale - this.view.translate.y
- );
+ const x = Math.ceil(bounds.x / this.view.scale - this.view.translate.x);
+ const y = Math.ceil(bounds.y / this.view.scale - this.view.translate.y);
const w = Math.floor(bounds.width / this.view.scale);
const h = Math.floor(bounds.height / this.view.scale);
@@ -452,12 +428,7 @@ class MxFactory {
const pages = this.getPageLayout!();
const size = this.getPageSize!();
- return new MxRectangle(
- 0,
- 0,
- pages.width * size.width,
- pages.height * size.height
- );
+ return new MxRectangle(0, 0, pages.width * size.width, pages.height * size.height);
};
/**
@@ -474,19 +445,14 @@ class MxFactory {
x0: number;
y0: number;
}) {
- if (
- this.graph.container != null &&
- mxUtils.hasScrollbars(this.graph.container)
- ) {
+ if (this.graph.container != null && mxUtils.hasScrollbars(this.graph.container)) {
const pad = this.graph.getPagePadding!();
const size = this.graph.getPageSize!();
// Updating scrollbars here causes flickering in quirks and is not needed
// if zoom method is always used to set the current scale on the graph.
- this.translate.x =
- pad.x / this.scale - (this.x0 || 0) * size.width;
- this.translate.y =
- pad.y / this.scale - (this.y0 || 0) * size.height;
+ this.translate.x = pad.x / this.scale - (this.x0 || 0) * size.width;
+ this.translate.y = pad.y / this.scale - (this.y0 || 0) * size.height;
}
graphViewValidate.apply(this, arguments as any);
@@ -500,10 +466,7 @@ class MxFactory {
view: mxGraphView & { x0: number; y0: number };
}
) {
- if (
- this.container != null &&
- mxUtils.hasScrollbars(this.container)
- ) {
+ if (this.container != null && mxUtils.hasScrollbars(this.container)) {
const pages = this.getPageLayout!();
const pad = this.getPagePadding!();
const size = this.getPageSize!();
@@ -513,25 +476,15 @@ class MxFactory {
(2 * pad.x) / this.view.scale + pages.width * size.width
);
const minh = Math.ceil(
- (2 * pad.y) / this.view.scale +
- pages.height * size.height
+ (2 * pad.y) / this.view.scale + pages.height * size.height
);
const min = graph.minimumGraphSize;
// LATER: Fix flicker of scrollbar size in IE quirks mode
// after delayed call in window.resize event handler
- if (
- min === null ||
- min.width !== minw ||
- min.height !== minh
- ) {
- graph.minimumGraphSize = new MxRectangle(
- 0,
- 0,
- minw,
- minh
- );
+ if (min === null || min.width !== minw || min.height !== minh) {
+ graph.minimumGraphSize = new MxRectangle(0, 0, minw, minh);
}
// Updates auto-translate to include padding and graph size
@@ -540,8 +493,7 @@ class MxFactory {
if (
!this.autoTranslate &&
- (this.view.translate.x !== dx ||
- this.view.translate.y !== dy)
+ (this.view.translate.x !== dx || this.view.translate.y !== dy)
) {
this.autoTranslate = true;
this.view.x0 = pages.x;
@@ -554,10 +506,8 @@ class MxFactory {
const ty = graph.view.translate.y;
graph.view.setTranslate(dx, dy);
- graph.container.scrollLeft +=
- (dx - tx) * graph.view.scale;
- graph.container.scrollTop +=
- (dy - ty) * graph.view.scale;
+ graph.container.scrollLeft += (dx - tx) * graph.view.scale;
+ graph.container.scrollTop += (dy - ty) * graph.view.scale;
this.autoTranslate = false;
}
@@ -590,22 +540,11 @@ class MxFactory {
graph.container.scrollTop = Math.floor(
Math.max(
0,
- bounds.y -
- Math.max(
- 20,
- (graph.container.clientHeight - boundsHeight) / 2
- )
+ bounds.y - Math.max(20, (graph.container.clientHeight - boundsHeight) / 2)
)
);
graph.container.scrollLeft = Math.floor(
- Math.max(
- 0,
- bounds.x -
- Math.max(
- 0,
- (graph.container.clientWidth - boundsWidth) / 2
- )
- )
+ Math.max(0, bounds.x - Math.max(0, (graph.container.clientWidth - boundsWidth) / 2))
);
}
}
diff --git a/src/components/statusTag/index.tsx b/src/components/statusTag/index.tsx
index c79036475..958c2c784 100644
--- a/src/components/statusTag/index.tsx
+++ b/src/components/statusTag/index.tsx
@@ -3,7 +3,7 @@ import classNames from 'classnames';
export type StatusTagType = 'warning' | 'error' | 'success' | 'run' | 'stopped';
-export interface StatusTagProps extends React.HTMLAttributes
{
+export interface StatusTagProps extends React.HTMLAttributes {
type?: StatusTagType;
className?: string;
showBorder?: boolean;
diff --git a/src/stories/components/blockHeader/index.tsx b/src/stories/components/blockHeader/index.tsx
index 7bee9c30b..f95bcebfc 100644
--- a/src/stories/components/blockHeader/index.tsx
+++ b/src/stories/components/blockHeader/index.tsx
@@ -68,11 +68,7 @@ export default function BlockHeaderRender() {
5、简洁版
6、展开/收起内容
- console.log(expand)}
- >
+ console.log(expand)}>
Hello World!
小标题 + 无背景
diff --git a/src/stories/mxGraph.stories.tsx b/src/stories/mxGraph.stories.tsx
index b4d5066a6..c6151403a 100644
--- a/src/stories/mxGraph.stories.tsx
+++ b/src/stories/mxGraph.stories.tsx
@@ -1409,9 +1409,8 @@ stories.add('mxGraph 实现血缘相关展示', () => {
From 2eee583a5373e49b98c099eb98441e03e3c5eaa9 Mon Sep 17 00:00:00 2001
From: liuyi
Date: Sun, 25 Jun 2023 14:56:12 +0800
Subject: [PATCH 17/31] chore(release): 3.0.9
---
CHANGELOG.md | 14 ++++++++++++++
package.json | 2 +-
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4bc03dd0d..f29c2991c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,20 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+### [3.0.9](https://github.com/DTStack/dt-react-component/compare/v3.0.7...v3.0.9) (2023-06-25)
+
+
+### Features
+
+* add copyWithHeader item to spreadSheet context menu ([#287](https://github.com/DTStack/dt-react-component/issues/287)) ([ee6ee5c](https://github.com/DTStack/dt-react-component/commit/ee6ee5c5bfcf6f95007f4a376709d3a04d17f714))
+* update blockHeader margin-bottom ([#281](https://github.com/DTStack/dt-react-component/issues/281)) ([2962911](https://github.com/DTStack/dt-react-component/commit/29629111840bd68a142b4f49e083ba2a23e97355))
+
+
+### Bug Fixes
+
+* [#82926](https://github.com/DTStack/dt-react-component/issues/82926) handsontable trimWhitespace should be false ([#358](https://github.com/DTStack/dt-react-component/issues/358)) ([24d145d](https://github.com/DTStack/dt-react-component/commit/24d145da94cc6820c819eff8fe227a1c616411a5))
+* fix ModalProps for modalWithForm ([#283](https://github.com/DTStack/dt-react-component/issues/283)) ([f0c813a](https://github.com/DTStack/dt-react-component/commit/f0c813a306dc2cadd495ce15cae7b4328b155ad4))
+
### [3.0.8](https://github.com/DTStack/dt-react-component/compare/v3.0.7...v3.0.8) (2023-01-11)
diff --git a/package.json b/package.json
index 5a9347dbe..63cc63fe2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "dt-react-component",
- "version": "3.0.8",
+ "version": "3.0.9",
"description": "react-component",
"repository": "https://github.com/DTStack/dt-react-component",
"sideEffects": [
From 5ed063adad1c4468ad75114318f2484302f74585 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=90=89=E6=98=93?=
Date: Sun, 25 Jun 2023 16:52:46 +0800
Subject: [PATCH 18/31] docs: deploy different version docs (#360)
Co-authored-by: liuyi
---
README-zh_CN.md | 3 ---
README.md | 3 ---
scripts/const.sh | 4 ++--
scripts/deploy.sh | 3 ++-
4 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/README-zh_CN.md b/README-zh_CN.md
index 9add186ed..e19f4d950 100644
--- a/README-zh_CN.md
+++ b/README-zh_CN.md
@@ -10,9 +10,6 @@
[English](./README.md) | 简体中文
-## 文档
-- [v3.x](https://dtstack.github.io/dt-react-component/)
-- [v2.x](https://liuxy0551.github.io/dt-react-component/)
基于 [ant-design](https://github.com/ant-design/ant-design) 的 React UI 组件库。 主要用于中,后台产品。我们的目标是**满足更具体的业务场景组件**。 当然,我们也有基于原生 javascript 实现的业务组件,例如**ContextMenu**,**KeyEventListener**等。
diff --git a/README.md b/README.md
index 6e02379e6..15ecda884 100755
--- a/README.md
+++ b/README.md
@@ -10,9 +10,6 @@
English | [简体中文](./README-zh_CN.md)
-## Docs
-- [v3.x](https://dtstack.github.io/dt-react-component/)
-- [v2.x](https://liuxy0551.github.io/dt-react-component/)
React UI component library based on [ant-design](https://github.com/ant-design/ant-design). Mainly used for middle and back-end products. Our goal is to **meet more specific and more specific business scenario components**. Of course, we also have excellent business components based on native javascript, such as **ContextMenu**, **KeyEventListener** and so on.
diff --git a/scripts/const.sh b/scripts/const.sh
index 37c4bf559..01eece088 100755
--- a/scripts/const.sh
+++ b/scripts/const.sh
@@ -1,13 +1,13 @@
#!/bin/bash
# Project name
-export project_name="dt-react-component";
+export project_name="dt-react-component-v3";
# Temporary store project
export temp_path="/home/temp/$project_name";
# Server nginx root path
export server_root_path="/home/app/$project_name";
-# 3.10.x testing enviroment
export server="*****";
+# 3.x testing enviroment
echo "project name: $project_name"
echo "temp path: $temp_path"
diff --git a/scripts/deploy.sh b/scripts/deploy.sh
index e045c33ed..fd3eab359 100755
--- a/scripts/deploy.sh
+++ b/scripts/deploy.sh
@@ -1,5 +1,6 @@
#!/bin/bash
-#
+
+# 部署文档执行 `yarn deploy`,需要先将 `const.sh` 里的 server 改为 225 的机器 ip
# 1. Build project locally;
# 2. Upload dist to the temp path of target server ;
# 3. Login remote ssh server;
From b2a5786cac3fa5768729da3f0856586025d6ff97 Mon Sep 17 00:00:00 2001
From: LuckyFBB <38368040+LuckyFBB@users.noreply.github.com>
Date: Mon, 26 Jun 2023 18:44:39 +0800
Subject: [PATCH 19/31] feat: add afterClose for ModalWithform (#357)
* feat: add afterClose for ModalWithform
* fix: fix prettier
---
src/components/modalWithForm/index.tsx | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/components/modalWithForm/index.tsx b/src/components/modalWithForm/index.tsx
index 3cda8151b..ae0941176 100644
--- a/src/components/modalWithForm/index.tsx
+++ b/src/components/modalWithForm/index.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { Modal, Form, FormProps } from 'antd';
+import { Form, FormProps, Modal } from 'antd';
import { ButtonProps, ButtonType } from 'antd/es/button';
export interface IProps {
@@ -82,6 +82,7 @@ const ModalForm = (props: ModalProps) => {
children,
okButtonProps,
maskClosable = false,
+ afterClose,
} = props;
const formProps = useFilterFormProps();
@@ -100,6 +101,11 @@ const ModalForm = (props: ModalProps) => {
form.resetFields();
};
+ const handleAfterClose = () => {
+ afterClose?.();
+ form.resetFields();
+ };
+
return (
{
confirmLoading={confirmLoading}
okButtonProps={okButtonProps}
maskClosable={maskClosable}
+ afterClose={handleAfterClose}
>
+
小标题
小标题 + 有背景
1、默认
@@ -183,6 +188,8 @@ stories.add(
>
Hello World!
+
+
小标题 + 无背景
1、默认
diff --git a/src/stories/components/blockHeader/index.tsx b/src/stories/components/blockHeader/index.tsx
index f95bcebfc..7c16f472c 100644
--- a/src/stories/components/blockHeader/index.tsx
+++ b/src/stories/components/blockHeader/index.tsx
@@ -1,6 +1,7 @@
import React from 'react';
import { PieChartOutlined } from '@ant-design/icons';
import BlockHeader from '../../../components/blockHeader';
+import EllipsisText from '../../../components/ellipsisText';
export default function BlockHeaderRender() {
const style = {
@@ -28,6 +29,10 @@ export default function BlockHeaderRender() {
console.log(expand)}>
Hello World!
+ 7、标题超长
+ } />
+
+
大标题 + 无背景
1、默认
@@ -51,6 +56,7 @@ export default function BlockHeaderRender() {
>
Hello World!
+
小标题
小标题 + 有背景
1、默认
@@ -71,6 +77,8 @@ export default function BlockHeaderRender() {
console.log(expand)}>
Hello World!
+
+
小标题 + 无背景
1、默认
diff --git a/yarn.lock b/yarn.lock
index 686d3b0b5..34ff61ecb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -12820,10 +12820,10 @@ known-css-properties@^0.25.0:
resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776"
integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==
-ko-lint-config@^2.2.18:
- version "2.2.18"
- resolved "https://registry.yarnpkg.com/ko-lint-config/-/ko-lint-config-2.2.18.tgz#ea61ef0a89a4e23b478b0390e69a715cdf08280a"
- integrity sha512-ls5jymX9GjE8atROtwyoIpsOvjYSlXvHwoHH1sZqvJfrS5xHiy+zBe2KP67O1VNudRnIGyJb9J2QqkRdZyCSXA==
+ko-lint-config@2.2.19:
+ version "2.2.19"
+ resolved "https://registry.npmmirror.com/ko-lint-config/-/ko-lint-config-2.2.19.tgz#23141b8d8bbbb155b4f6113f894df5e5ea9a0741"
+ integrity sha512-EMdRaxNXXFe90Q2JQNIJeHSRMn1y5LKNrrGVTwRVWvk/jnP3UQ411K4petpATbgkjU36YEDBa6Y3LVXk8asB+Q==
dependencies:
"@typescript-eslint/eslint-plugin" "5.30.0"
"@typescript-eslint/parser" "5.30.0"
From 334d5f09eaf1dfb6f22938951fb2ef688f5289bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=90=89=E6=98=93?=
Date: Fri, 9 Aug 2024 17:07:50 +0800
Subject: [PATCH 25/31] fix: #98034 SpreadSheet props support
hotTableInstanceRef (#464)
---
src/components/spreadSheet/index.tsx | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/components/spreadSheet/index.tsx b/src/components/spreadSheet/index.tsx
index 67011c77d..ac8569b03 100644
--- a/src/components/spreadSheet/index.tsx
+++ b/src/components/spreadSheet/index.tsx
@@ -24,6 +24,7 @@ export interface SpreadSheetProps {
/** 字段类型 */
type: string;
}>;
+ hotTableInstanceRef?: (instance: any) => void;
}
class SpreadSheet extends React.PureComponent {
@@ -31,12 +32,15 @@ class SpreadSheet extends React.PureComponent {
copyUtils = new CopyUtils();
_renderTimer: any;
+ componentDidMount() {
+ this.props.hotTableInstanceRef?.(this.tableRef.current);
+ }
+
componentDidUpdate(prevProps: any, _prevState: any) {
if (prevProps != this.props) {
if (this.tableRef) {
this.removeRenderClock();
this._renderTimer = setTimeout(() => {
- console.log('render sheet');
this.tableRef.current.hotInstance.render();
}, 100);
}
From 50990ab5699f34a2a5793e31584502d2c98e9312 Mon Sep 17 00:00:00 2001
From: haiminovo <85284863+haiminovo@users.noreply.github.com>
Date: Fri, 9 Aug 2024 17:19:16 +0800
Subject: [PATCH 26/31] feat:fix style and change image(#429) (#430)
---
src/components/chromeDownload/index.tsx | 7 ++++---
src/components/chromeDownload/style.scss | 9 ++++-----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/components/chromeDownload/index.tsx b/src/components/chromeDownload/index.tsx
index af1806b86..66e23dc28 100644
--- a/src/components/chromeDownload/index.tsx
+++ b/src/components/chromeDownload/index.tsx
@@ -1,6 +1,7 @@
import React from 'react';
-import utils from '../utils';
import classNames from 'classnames';
+
+import utils from '../utils';
const prefixCls = 'dtc-chrome';
interface ChromeDownloadProps {
@@ -34,10 +35,10 @@ export default class ChromeDownload extends React.Component
-
+
本产品当前可兼容Chrome66以及以上版本,请您更换至最新的谷歌(Chrome)浏览器
diff --git a/src/components/chromeDownload/style.scss b/src/components/chromeDownload/style.scss
index a6fc8160a..2cf1d3c3f 100644
--- a/src/components/chromeDownload/style.scss
+++ b/src/components/chromeDownload/style.scss
@@ -1,12 +1,11 @@
$prefix: "dtc-chrome";
.#{$prefix}-chrome-download {
background: #F2F7FA;
- margin-top: 50px;
text-align: center;
- overflow-y: auto;
+ overflow: auto;
.#{$prefix}-pic-update {
- width: 182px;
- margin: 148px 0 17.5px;
+ width: 250px;
+ margin: 160px 0 8px;
}
.#{$prefix}-divide {
margin: 80.5px 0 60px;
@@ -18,7 +17,7 @@ $prefix: "dtc-chrome";
}
.#{$prefix}-download {
width: 160px;
- margin: 0 auto;
+ margin: 0 auto 24px;
cursor: pointer;
.#{$prefix}-chrome-version {
margin-top: 16.5px;
From 8a6720d27e6c47b8f21e22f6ab13c8e944a6370e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=9C=9C=E5=BA=8F?= <976060700@qq.com>
Date: Tue, 20 Aug 2024 16:07:12 +0800
Subject: [PATCH 27/31] fix(blockheader): #471, add tooltip icon size 16 and
change color (#473)
---
src/components/blockHeader/index.tsx | 2 +-
src/components/blockHeader/style.scss | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/components/blockHeader/index.tsx b/src/components/blockHeader/index.tsx
index ad141b273..d23fac43b 100644
--- a/src/components/blockHeader/index.tsx
+++ b/src/components/blockHeader/index.tsx
@@ -53,7 +53,7 @@ const BlockHeader: React.FC
= function (props) {
const { beforeTitle = } = props;
const questionTooltip = tooltip && (
-
+
);
const newAfterTitle = afterTitle || questionTooltip;
diff --git a/src/components/blockHeader/style.scss b/src/components/blockHeader/style.scss
index 9753147d2..d8c02f9f6 100644
--- a/src/components/blockHeader/style.scss
+++ b/src/components/blockHeader/style.scss
@@ -57,8 +57,14 @@ $card_prefix: "dtc-block-header";
margin-right: 4px;
}
.#{$card_prefix}-after-title {
+ display: flex;
+ align-items: center;
color: #8B8FA8;
font-size: 12px;
+ &-icon {
+ font-size: 16px;
+ color: #B1B4C5;
+ }
}
}
From 33f10c777fda73fb9373f40987e89b8d5f467d08 Mon Sep 17 00:00:00 2001
From: Hayden
Date: Fri, 23 Aug 2024 15:22:56 +0800
Subject: [PATCH 28/31] feat: import highlight core only (#455)
---
src/components/markdownRender/index.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/markdownRender/index.tsx b/src/components/markdownRender/index.tsx
index 275d76ba9..3f1b0434e 100644
--- a/src/components/markdownRender/index.tsx
+++ b/src/components/markdownRender/index.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import showdown from 'showdown';
-import hljs from 'highlight.js';
+import hljs from 'highlight.js/lib/core';
import sql from 'highlight.js/lib/languages/sql';
import classNames from 'classnames';
From e94b30746c44377fa7e769a2b1eb764c00232a30 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=9C=9C=E5=BA=8F?= <976060700@qq.com>
Date: Thu, 23 Jan 2025 10:52:21 +0800
Subject: [PATCH 29/31] fix(blockheader): add min-width for title (#533)
* fix(blockheader): add min-width for title
* fix: remove sass_binary_site
---
.yarnrc | 1 -
src/components/blockHeader/style.scss | 3 +++
src/stories/components/blockHeader/index.tsx | 23 +++++++++++++++++++-
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/.yarnrc b/.yarnrc
index cbdd124a4..57f8c2eb2 100644
--- a/.yarnrc
+++ b/.yarnrc
@@ -1,3 +1,2 @@
registry "https://registry.yarnpkg.com"
-sass_binary_site "https://npm.taobao.org/mirrors/node-sass/"
diff --git a/src/components/blockHeader/style.scss b/src/components/blockHeader/style.scss
index d8c02f9f6..fbe94762c 100644
--- a/src/components/blockHeader/style.scss
+++ b/src/components/blockHeader/style.scss
@@ -40,6 +40,7 @@ $card_prefix: "dtc-block-header";
flex: 1;
display: flex;
align-items: center;
+ min-width: 0;
.#{$card_prefix}-before-title {
margin-right: 8px;
.default {
@@ -55,6 +56,8 @@ $card_prefix: "dtc-block-header";
color: #3D446E;
font-weight: 500;
margin-right: 4px;
+ flex: 1;
+ min-width: 0;
}
.#{$card_prefix}-after-title {
display: flex;
diff --git a/src/stories/components/blockHeader/index.tsx b/src/stories/components/blockHeader/index.tsx
index 7c16f472c..53f53db59 100644
--- a/src/stories/components/blockHeader/index.tsx
+++ b/src/stories/components/blockHeader/index.tsx
@@ -2,6 +2,7 @@ import React from 'react';
import { PieChartOutlined } from '@ant-design/icons';
import BlockHeader from '../../../components/blockHeader';
import EllipsisText from '../../../components/ellipsisText';
+import { Button } from 'antd';
export default function BlockHeaderRender() {
const style = {
@@ -30,7 +31,27 @@ export default function BlockHeaderRender() {
Hello World!
7、标题超长
- } />
+
+ }
+ />
+ 8、标题超长且有 afterTitle
+
+
+ }
+ afterTitle="这是 afterTitle"
+ addonAfter={}
+ />
+
大标题 + 无背景
From 798e6625031959199a713c05761d2f1fe2d7662f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=90=89=E6=98=93?=
Date: Thu, 8 May 2025 09:33:51 +0800
Subject: [PATCH 30/31] ci: upgrade github actions use dependencies (#559)
---
.github/workflows/CD.yml | 12 ++++++------
.github/workflows/CI.yml | 36 ++++++++++++++++++------------------
2 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml
index f7a4af35f..4280ad7ce 100644
--- a/.github/workflows/CD.yml
+++ b/.github/workflows/CD.yml
@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v3
@@ -22,7 +22,7 @@ jobs:
cache: yarn
- name: Cache yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
@@ -38,7 +38,7 @@ jobs:
cp yarn.lock package-temp-dir
- name: Cache node_modules
id: node_modules_cache_id
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
@@ -51,7 +51,7 @@ jobs:
runs-on: ubuntu-latest
needs: [setup]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v3
@@ -59,13 +59,13 @@ jobs:
node-version: 14.x
- name: Restore cache from yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
- name: Restore cache from node_modules
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 8d3f03139..888bbeb50 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Setup node
uses: actions/setup-node@v3
@@ -24,7 +24,7 @@ jobs:
cache: yarn
- name: Cache yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
@@ -40,7 +40,7 @@ jobs:
cp yarn.lock package-temp-dir
- name: Cache node_modules
id: node_modules_cache_id
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
@@ -53,16 +53,16 @@ jobs:
needs: [setup]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Restore cache from yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
- name: Restore cache from node_modules
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
@@ -74,16 +74,16 @@ jobs:
needs: [setup]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Restore cache from yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
- name: Restore cache from node_modules
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
@@ -95,16 +95,16 @@ jobs:
needs: [setup]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Restore cache from yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
- name: Restore cache from node_modules
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
@@ -116,16 +116,16 @@ jobs:
needs: [setup]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Restore cache from yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
- name: Restore cache from node_modules
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
@@ -137,16 +137,16 @@ jobs:
runs-on: ubuntu-latest
needs: [setup]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v4
- name: Restore cache from yarn.lock
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: package-temp-dir
key: lock-${{ github.sha }}
- name: Restore cache from node_modules
- uses: actions/cache@v2
+ uses: actions/cache@v4
with:
path: node_modules
key: node_modules-${{ hashFiles('**/package.json') }}-${{ hashFiles('**/package-temp-dir/yarn.lock') }}
From 013ddfbc7bd10da1217077503def177069056837 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=9C=9C=E5=BA=8F?= <976060700@qq.com>
Date: Wed, 25 Jun 2025 14:32:19 +0800
Subject: [PATCH 31/31] feat(configprovider): 3.x support locale provider for
RC (#528)
* feat(configprovider): support provider for RC
* feat(configprovider): migrate locale type to useLocale
* fix(configprovider): change Locale path and remove sass_binary_site
* fix: change jest.config.js transform
* fix(configprovider): remove all cn add locale
* fix(configprovider): fix check-type error
* fix(configprovider): update en locale text
* feat(configprovider): change ConfigProvider value and getLocale return value
---
jest.config.js | 2 +-
src/components/blockHeader/index.tsx | 6 +-
src/components/chromeDownload/index.tsx | 21 +++--
src/components/configProvider/index.tsx | 9 ++
src/components/copyIcon/index.tsx | 20 +++--
src/components/editCell/index.tsx | 19 +++--
.../editInput/__tests__/editInput.test.tsx | 2 +-
src/components/editInput/index.tsx | 14 ++-
src/components/fullscreen/index.tsx | 15 +++-
src/components/globalLoading/index.tsx | 18 +++-
src/components/goBack/goBackButton.tsx | 14 ++-
src/components/goBack/index.tsx | 2 +
src/components/index.tsx | 3 +
src/components/loadError/index.tsx | 11 +--
src/components/locale/en-US.ts | 82 ++++++++++++++++++
src/components/locale/useLocale.tsx | 85 +++++++++++++++++++
src/components/locale/zh-CN.ts | 81 ++++++++++++++++++
src/components/modalWithForm/index.tsx | 7 +-
src/components/mulSelectDropdown/index.tsx | 28 ++++--
src/components/multiSearchInput/index.tsx | 61 +++++++------
src/components/mxGraph/index.tsx | 5 +-
src/components/notFound/index.tsx | 24 +++---
src/components/progressLine/index.tsx | 6 +-
src/components/renderFormItem/index.tsx | 5 +-
src/components/searchModal/index.tsx | 26 ++++--
src/components/spreadSheet/index.tsx | 24 ++++--
26 files changed, 493 insertions(+), 97 deletions(-)
create mode 100644 src/components/configProvider/index.tsx
create mode 100644 src/components/locale/en-US.ts
create mode 100644 src/components/locale/useLocale.tsx
create mode 100644 src/components/locale/zh-CN.ts
diff --git a/jest.config.js b/jest.config.js
index 0391a1d18..ef0f4228d 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -5,7 +5,7 @@ module.exports = {
transformIgnorePatterns: ['/node_modules/', 'lib', 'dist'],
testPathIgnorePatterns: ['/node_modules/'],
transform: {
- '^.+\\.[jt]s?(x)$': 'babel-jest',
+ '^.+\\.(ts|tsx|js|jsx)$': 'babel-jest',
},
testMatch: [
'**/__tests__/**/(*.)+(spec|test).[jt]s?(x)',
diff --git a/src/components/blockHeader/index.tsx b/src/components/blockHeader/index.tsx
index d23fac43b..ac41e5fda 100644
--- a/src/components/blockHeader/index.tsx
+++ b/src/components/blockHeader/index.tsx
@@ -1,6 +1,7 @@
import React, { useState } from 'react';
import { QuestionCircleOutlined, UpOutlined } from '@ant-design/icons';
import { Tooltip } from 'antd';
+import useLocale from '../locale/useLocale';
export interface BlockHeaderProps {
// 标题
@@ -60,6 +61,9 @@ const BlockHeader: React.FC = function (props) {
let bottomStyle;
if (hasBottom) bottomStyle = { marginBottom: 16 };
if (spaceBottom) bottomStyle = { marginBottom: spaceBottom };
+
+ const locale = useLocale('BlockHeader');
+
const [expand, setExpand] = useState(defaultExpand);
const handleExpand = (expand) => {
@@ -87,7 +91,7 @@ const BlockHeader: React.FC = function (props) {
{addonAfter && {addonAfter}
}
{children && (
-
{expand ? '收起' : '展开'}
+
{expand ? locale.collapse : locale.expand}
)}
diff --git a/src/components/chromeDownload/index.tsx b/src/components/chromeDownload/index.tsx
index 66e23dc28..015236e9a 100644
--- a/src/components/chromeDownload/index.tsx
+++ b/src/components/chromeDownload/index.tsx
@@ -2,14 +2,17 @@ import React from 'react';
import classNames from 'classnames';
import utils from '../utils';
+import useLocale, { Locale } from '../locale/useLocale';
+
const prefixCls = 'dtc-chrome';
interface ChromeDownloadProps {
downloadChrome?: (chromeOfOsType?: 'macChrome' | 'windowsChrome' | 'others') => void;
className?: string;
style?: React.CSSProperties;
+ locale?: Locale['ChromeDownload'];
}
-export default class ChromeDownload extends React.Component {
+class ChromeDownload extends React.Component {
constructor(props: ChromeDownloadProps) {
super(props);
}
@@ -29,6 +32,7 @@ export default class ChromeDownload extends React.Component
-
- 本产品当前可兼容Chrome66以及以上版本,请您更换至最新的谷歌(Chrome)浏览器
-
-
- {this.renderDivide('点击即可下载,更新即刻搞定')}
-
+ {locale.description}
+ {this.renderDivide(locale.download)}
) => {
+ const locale = useLocale('ChromeDownload');
+ return ;
+};
+
+export default ChromeDownloadWrapper;
diff --git a/src/components/configProvider/index.tsx b/src/components/configProvider/index.tsx
new file mode 100644
index 000000000..1b6749637
--- /dev/null
+++ b/src/components/configProvider/index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+import { LocaleContext } from '../locale/useLocale';
+
+const ConfigProvider = ({ locale, children }) => {
+ return {children};
+};
+
+export default ConfigProvider;
diff --git a/src/components/copyIcon/index.tsx b/src/components/copyIcon/index.tsx
index a86a5a1ef..6fc624fb9 100644
--- a/src/components/copyIcon/index.tsx
+++ b/src/components/copyIcon/index.tsx
@@ -1,15 +1,17 @@
import * as React from 'react';
import { Tooltip, message } from 'antd';
import { CopyOutlined } from '@ant-design/icons';
+import useLocale, { Locale } from '../locale/useLocale';
export interface CopyIconProps {
text: string;
style?: React.CSSProperties;
title?: string;
customRender?: React.ReactNode;
+ locale?: Locale['CopyIcon'];
}
-export default class CopyIcon extends React.Component {
+class CopyIcon extends React.Component {
fakeHandlerCallback: () => void;
fakeHandler: EventListener | void;
fakeElem: HTMLTextAreaElement;
@@ -82,15 +84,16 @@ export default class CopyIcon extends React.Component {
}
handleResult(succeeded: any) {
+ const { locale } = this.props;
if (succeeded) {
- message.success('复制成功');
+ message.success(locale.copied);
} else {
- message.error('不支持');
+ message.error(locale.notSupport);
}
}
render() {
- let { customRender, text, style, title, ...rest } = this.props;
+ let { customRender, text, style, title, locale, ...rest } = this.props;
style = {
cursor: 'pointer',
@@ -101,7 +104,7 @@ export default class CopyIcon extends React.Component {
return customRender ? (
{customRender}
) : (
-
+
{
);
}
}
+
+const CopyIconWrapper = (props: Omit) => {
+ const locale = useLocale('CopyIcon');
+ return ;
+};
+
+export default CopyIconWrapper;
diff --git a/src/components/editCell/index.tsx b/src/components/editCell/index.tsx
index 2ff2f8687..e2b7ffd27 100644
--- a/src/components/editCell/index.tsx
+++ b/src/components/editCell/index.tsx
@@ -2,6 +2,7 @@ import React from 'react';
import { Input } from 'antd';
import EllipsisText from '../ellipsisText';
import classNames from 'classnames';
+import useLocale, { Locale } from '../locale/useLocale';
type EditType = string | number;
export interface EditCellProps {
@@ -9,6 +10,7 @@ export interface EditCellProps {
value: string;
keyField: string;
isView?: boolean;
+ locale?: Locale['EditCell'];
onHandleEdit: (keyField: string, editValue: EditType) => void;
}
export interface EditCellStates {
@@ -16,7 +18,7 @@ export interface EditCellStates {
editValue: EditType;
}
-export default class EditCell extends React.PureComponent {
+class EditCell extends React.PureComponent {
state: EditCellStates = {
isEdit: false,
editValue: '',
@@ -47,7 +49,7 @@ export default class EditCell extends React.PureComponent
{isEdit ? (
@@ -57,16 +59,23 @@ export default class EditCell extends React.PureComponent
- 完成
- 取消
+ {locale.complete}
+ {locale.cancel}
) : (
<>
- {!isView && 修改}
+ {!isView && {locale.modify}}
>
)}
);
}
}
+
+const EditCellWrapper = (props: Omit
) => {
+ const locale = useLocale('EditCell');
+ return ;
+};
+
+export default EditCellWrapper;
diff --git a/src/components/editInput/__tests__/editInput.test.tsx b/src/components/editInput/__tests__/editInput.test.tsx
index 65178ef9f..42eaa6cd1 100644
--- a/src/components/editInput/__tests__/editInput.test.tsx
+++ b/src/components/editInput/__tests__/editInput.test.tsx
@@ -33,7 +33,7 @@ describe('test edit input', () => {
});
test('should render message when length more then max', () => {
fireEvent.change(element, { target: { value: '12345678910' } });
- expect(wrapper.getByText('字符长度不可超过10')).toBeInTheDocument();
+ expect(wrapper.getByText('字符长度不可超过${max}')).toBeInTheDocument();
expect(element.value).toEqual('1234567891');
});
diff --git a/src/components/editInput/index.tsx b/src/components/editInput/index.tsx
index 4c1384103..58afb3afc 100644
--- a/src/components/editInput/index.tsx
+++ b/src/components/editInput/index.tsx
@@ -1,16 +1,18 @@
import React from 'react';
import { Input, message } from 'antd';
+import useLocale, { Locale } from '../locale/useLocale';
export interface EditInputProps {
value?: string | number;
onChange?: (e) => void;
max?: number;
+ locale?: Locale['EditInput'];
[propName: string]: any;
}
export interface EditInputPropsStates {
value: string | number;
}
-export default class EditInput extends React.PureComponent {
+class EditInput extends React.PureComponent {
constructor(props: EditInputProps) {
super(props);
this.state = {
@@ -34,10 +36,11 @@ export default class EditInput extends React.PureComponent) => {
+ const { locale } = this.props;
const value = e.target.value;
const { max = 64 } = this.props;
if (value && max && value.length > max) {
- message.warning(`字符长度不可超过${max}`);
+ message.warning(locale.description);
this.setState({
value: value.substring(0, max),
});
@@ -61,3 +64,10 @@ export default class EditInput extends React.PureComponent) => {
+ const locale = useLocale('EditInput');
+ return ;
+};
+
+export default EditInputWrapper;
diff --git a/src/components/fullscreen/index.tsx b/src/components/fullscreen/index.tsx
index 68d52fd2a..4e6a2a34d 100644
--- a/src/components/fullscreen/index.tsx
+++ b/src/components/fullscreen/index.tsx
@@ -3,6 +3,7 @@ import { Button } from 'antd';
import MyIcon from './icon';
import KeyEventListener from '../keyEventListener';
+import useLocale, { Locale } from '../locale/useLocale';
const { KeyCombiner } = KeyEventListener;
declare let document: any;
@@ -14,12 +15,13 @@ export interface FullscreenProps {
iconStyle?: object;
fullIcon?: React.ReactNode;
exitFullIcon?: React.ReactNode;
+ locale?: Locale['Fullscreen'];
[propName: string]: any;
}
export interface FullscreenState {
isFullScreen: boolean;
}
-export default class Fullscreen extends React.Component {
+class Fullscreen extends React.Component {
state: FullscreenState = {
isFullScreen: false,
};
@@ -136,8 +138,8 @@ export default class Fullscreen extends React.Component) => {
+ const locale = useLocale('Fullscreen');
+ return ;
+};
+
+export default FullscreenWrapper;
diff --git a/src/components/globalLoading/index.tsx b/src/components/globalLoading/index.tsx
index e18faa65c..eb5d085a1 100644
--- a/src/components/globalLoading/index.tsx
+++ b/src/components/globalLoading/index.tsx
@@ -1,5 +1,6 @@
import classNames from 'classnames';
import React from 'react';
+import useLocale, { Locale } from '../locale/useLocale';
export interface GlobalLoadingProps {
className?: string;
@@ -8,19 +9,23 @@ export interface GlobalLoadingProps {
mainBackground?: string;
circleBackground?: string;
titleColor?: string;
+ locale?: Locale['GlobalLoading'];
}
-export default class GlobalLoading extends React.Component {
+class GlobalLoading extends React.Component {
render() {
const {
prefix = '',
- loadingTitle = '应用加载中,请等候~',
+ loadingTitle,
mainBackground = '#F2F7FA',
circleBackground = '#1D78FF',
titleColor = '#3D446E',
className = '',
+ locale,
} = this.props;
+ const newLoadingTitle = loadingTitle || locale.loading;
+
return (
{`${prefix} ${loadingTitle}`}
+ >{`${prefix} ${newLoadingTitle}`}
@@ -48,3 +53,10 @@ export default class GlobalLoading extends React.Component
) => {
+ const locale = useLocale('GlobalLoading');
+ return ;
+};
+
+export default GlobalLoadingWrapper;
diff --git a/src/components/goBack/goBackButton.tsx b/src/components/goBack/goBackButton.tsx
index 7b4dc93e4..09017df5d 100644
--- a/src/components/goBack/goBackButton.tsx
+++ b/src/components/goBack/goBackButton.tsx
@@ -2,8 +2,9 @@ import * as React from 'react';
import { Button } from 'antd';
import { browserHistory, hashHistory } from 'react-router';
import { GoBackButtonProps } from './index';
+import useLocale from '../locale/useLocale';
-export default class GoBackButton extends React.Component {
+class GoBackButton extends React.Component {
go = () => {
const { url, history, autoClose } = this.props;
@@ -25,11 +26,18 @@ export default class GoBackButton extends React.Component
- {title || '返回'}
+ {title || locale.back}
);
}
}
+
+const GoBackButtonWrapper = (props: Omit) => {
+ const locale = useLocale('GoBack');
+ return ;
+};
+
+export default GoBackButtonWrapper;
diff --git a/src/components/goBack/index.tsx b/src/components/goBack/index.tsx
index 3faf3f58c..add1228dc 100644
--- a/src/components/goBack/index.tsx
+++ b/src/components/goBack/index.tsx
@@ -1,3 +1,4 @@
+import { Locale } from '../locale/useLocale';
import GoBack from './goBack';
import GoBackButton from './goBackButton';
@@ -9,6 +10,7 @@ export interface GoBackProps {
}
export interface GoBackButtonProps extends GoBackProps {
title?: string;
+ locale?: Locale['GoBack'];
}
GoBack.GoBackButton = GoBackButton;
diff --git a/src/components/index.tsx b/src/components/index.tsx
index 6c2d6d68b..4c53105a1 100644
--- a/src/components/index.tsx
+++ b/src/components/index.tsx
@@ -34,3 +34,6 @@ export { default as TextMark } from './textMark';
export { default as ToolModal } from './toolModal';
export { default as ProgressLine } from './progressLine';
export { default as Empty } from './empty';
+export { default as ConfigProvider } from './configProvider';
+export { default as zhCN } from './locale/zh-CN';
+export { default as enUS } from './locale/en-US';
diff --git a/src/components/loadError/index.tsx b/src/components/loadError/index.tsx
index 4768004c6..fd43bf13f 100644
--- a/src/components/loadError/index.tsx
+++ b/src/components/loadError/index.tsx
@@ -1,22 +1,23 @@
import React from 'react';
+import useLocale from '../locale/useLocale';
const LoadError: React.FC = function () {
+ const locale = useLocale('LoadError');
return (
-
-
若该提示长时间存在,请联系管理员。
+
{locale.title}
);
diff --git a/src/components/locale/en-US.ts b/src/components/locale/en-US.ts
new file mode 100644
index 000000000..fc7b74352
--- /dev/null
+++ b/src/components/locale/en-US.ts
@@ -0,0 +1,82 @@
+import { Locale } from './useLocale';
+
+const localeValues: Locale = {
+ locale: 'en-US',
+ BlockHeader: {
+ expand: 'Expand',
+ collapse: 'Collapse',
+ },
+ ChromeDownload: {
+ description:
+ 'This product is currently compatible with Chrome 66 and above. Please switch to the latest Google (Chrome) browser.',
+ download: 'Click to download, update instantly.',
+ },
+ CopyIcon: {
+ copied: 'Copied',
+ notSupport: 'Not Support',
+ copy: 'Copy',
+ },
+ EditCell: {
+ complete: 'Complete',
+ cancel: 'Cancel',
+ modify: 'Modify',
+ },
+ EditInput: {
+ description: 'The character length cannot exceed ${max}',
+ },
+ Fullscreen: {
+ exitFull: 'Exit Full Screen',
+ full: 'Full Screen',
+ },
+ GlobalLoading: {
+ loading: 'The application is loading, please wait~',
+ },
+ GoBack: {
+ back: 'GoBack',
+ },
+ LoadError: {
+ please: 'A new version has been found. Please',
+ get: 'to get the new version.',
+ refresh: ' refresh ',
+ title: 'If this prompt persists for a long time, please contact the administrator.',
+ },
+ ModalWithForm: {
+ okText: 'Ok',
+ cancelText: 'Cancel',
+ },
+ MulSelectDropdown: {
+ open: 'Open',
+ cancelText: 'Cancel',
+ okText: 'Ok',
+ selectAll: 'Select All',
+ },
+ MultiSearchInput: {
+ case: 'Case-sensitive match',
+ precise: 'Exact match',
+ front: 'Head match',
+ tail: 'Tail match',
+ },
+ MxGraph: {
+ newNode: 'New node',
+ },
+ NotFound: {
+ description: 'Dear, did you go to the wrong place?',
+ },
+ ProgressLine: {
+ description: 'No description yet',
+ },
+ RenderFormItem: {
+ description: '${label} is empty',
+ },
+ SearchModal: {
+ title: 'Search and open',
+ placeholder: 'Please enter',
+ },
+ SpreadSheet: {
+ description: 'No Data',
+ copy: 'Copy',
+ copyAll: 'Copy values and column names',
+ },
+};
+
+export default localeValues;
diff --git a/src/components/locale/useLocale.tsx b/src/components/locale/useLocale.tsx
new file mode 100644
index 000000000..5ceb4159a
--- /dev/null
+++ b/src/components/locale/useLocale.tsx
@@ -0,0 +1,85 @@
+import { createContext, useContext, useMemo } from 'react';
+
+import defaultLocaleData from './zh-CN';
+
+export interface Locale {
+ locale: string;
+ BlockHeader?: { expand: string; collapse: string };
+ ChromeDownload?: { description: string; download: string };
+ CopyIcon?: { copied: string; notSupport: string; copy: string };
+ EditCell?: { complete: string; cancel: string; modify: string };
+ EditInput?: { description: string };
+ Fullscreen?: { exitFull: string; full: string };
+ GlobalLoading?: {
+ loading: string;
+ };
+ GoBack?: {
+ back: string;
+ };
+ LoadError?: {
+ please: string;
+ get: string;
+ refresh: string;
+ title: string;
+ };
+ ModalWithForm?: {
+ okText: string;
+ cancelText: string;
+ };
+ MulSelectDropdown?: {
+ open: string;
+ cancelText: string;
+ okText: string;
+ selectAll: string;
+ };
+ MultiSearchInput?: {
+ case: string;
+ precise: string;
+ front: string;
+ tail: string;
+ };
+ MxGraph?: { newNode: string };
+ NotFound?: {
+ description: string;
+ };
+ ProgressLine?: {
+ description: string;
+ };
+ RenderFormItem?: {
+ description: string;
+ };
+ SearchModal?: {
+ title: string;
+ placeholder: string;
+ };
+ SpreadSheet?: {
+ description: string;
+ copy: string;
+ copyAll: string;
+ };
+}
+
+export interface LocaleContextProps {
+ locale: Locale;
+}
+
+export const LocaleContext = createContext(undefined);
+
+export type LocaleComponentName = keyof Locale;
+
+const useLocale = (
+ componentName: C
+): NonNullable => {
+ const fullLocale = useContext(LocaleContext);
+
+ const getLocale = useMemo(() => {
+ const locale = defaultLocaleData[componentName] ?? {};
+ const localeFromContext = fullLocale?.locale[componentName] ?? {};
+
+ return Object.assign({}, locale, localeFromContext) as NonNullable;
+ }, [componentName, fullLocale]);
+
+ return getLocale;
+};
+
+export default useLocale;
diff --git a/src/components/locale/zh-CN.ts b/src/components/locale/zh-CN.ts
new file mode 100644
index 000000000..5967d76ec
--- /dev/null
+++ b/src/components/locale/zh-CN.ts
@@ -0,0 +1,81 @@
+import { Locale } from './useLocale';
+
+const localeValues: Locale = {
+ locale: 'zh-CN',
+ BlockHeader: {
+ expand: '展开',
+ collapse: '收起',
+ },
+ ChromeDownload: {
+ description: '本产品当前可兼容Chrome66以及以上版本,请您更换至最新的谷歌(Chrome)浏览器',
+ download: '点击即可下载,更新即刻搞定',
+ },
+ CopyIcon: {
+ copied: '复制成功',
+ notSupport: '不支持',
+ copy: '复制',
+ },
+ EditCell: {
+ complete: '完成',
+ cancel: '取消',
+ modify: '修改',
+ },
+ EditInput: {
+ description: '字符长度不可超过${max}',
+ },
+ Fullscreen: {
+ exitFull: '退出全屏',
+ full: '全屏',
+ },
+ GlobalLoading: {
+ loading: '应用加载中,请等候~',
+ },
+ GoBack: {
+ back: '返回',
+ },
+ LoadError: {
+ please: '发现新版本,请',
+ get: '获取新版本。',
+ refresh: '刷新',
+ title: '若该提示长时间存在,请联系管理员。',
+ },
+ ModalWithForm: {
+ okText: '确定',
+ cancelText: '取消',
+ },
+ MulSelectDropdown: {
+ open: '打开',
+ cancelText: '取消',
+ okText: '确定',
+ selectAll: '全选',
+ },
+ MultiSearchInput: {
+ case: '区分大小写匹配',
+ precise: '精确匹配',
+ front: '头部匹配',
+ tail: '尾部匹配',
+ },
+ MxGraph: {
+ newNode: '新节点',
+ },
+ NotFound: {
+ description: '亲,是不是走错地方了?',
+ },
+ ProgressLine: {
+ description: '暂无描述',
+ },
+ RenderFormItem: {
+ description: '${label}为空',
+ },
+ SearchModal: {
+ title: '搜索并打开',
+ placeholder: '请输入',
+ },
+ SpreadSheet: {
+ description: '暂无数据',
+ copy: '复制',
+ copyAll: '复制值以及列名',
+ },
+};
+
+export default localeValues;
diff --git a/src/components/modalWithForm/index.tsx b/src/components/modalWithForm/index.tsx
index ae0941176..95bc98081 100644
--- a/src/components/modalWithForm/index.tsx
+++ b/src/components/modalWithForm/index.tsx
@@ -1,6 +1,7 @@
import React from 'react';
import { Form, FormProps, Modal } from 'antd';
import { ButtonProps, ButtonType } from 'antd/es/button';
+import useLocale from '../locale/useLocale';
export interface IProps {
confirmLoading?: boolean;
@@ -63,12 +64,14 @@ export const useFilterFormProps = (props = {}) => {
};
const ModalForm = (props: ModalProps) => {
+ const locale = useLocale('ModalWithForm');
+
const {
title,
visible,
record,
- okText = '确定',
- cancelText = '取消',
+ okText = locale.okText,
+ cancelText = locale.cancelText,
modelClass,
okType,
width,
diff --git a/src/components/mulSelectDropdown/index.tsx b/src/components/mulSelectDropdown/index.tsx
index 1e4aace28..275e90b0b 100644
--- a/src/components/mulSelectDropdown/index.tsx
+++ b/src/components/mulSelectDropdown/index.tsx
@@ -2,6 +2,7 @@ import React from 'react';
import { Checkbox, Dropdown, Button, Divider } from 'antd';
import { isEqual } from 'lodash';
import classNames from 'classnames';
+import useLocale, { Locale } from '../locale/useLocale';
interface Opts {
label?: string;
@@ -18,6 +19,7 @@ interface MulSelectDropdownProps {
renderNode: Function;
cancelText?: string;
okText?: string;
+ locale?: Locale['MulSelectDropdown'];
}
interface MulSelectDropdownStates {
@@ -28,7 +30,7 @@ interface MulSelectDropdownStates {
indeterminate: boolean;
}
-export default class MulSelectDropdown extends React.Component<
+class MulSelectDropdown extends React.Component<
MulSelectDropdownProps,
MulSelectDropdownStates
> {
@@ -108,11 +110,15 @@ export default class MulSelectDropdown extends React.Component<
popupContainer = () => document.body,
options = [],
className = '',
- renderNode = (openFun) => 打开,
- cancelText = '取消',
- okText = '确定',
+ locale,
+ renderNode:propRenderNode,
+ cancelText,
+ okText,
} = this.props;
const { visible, selectVal, indeterminate, allKeys } = this.state;
+ const defaultRenderNode = (openFun) => {locale.open};
+ const renderNode = propRenderNode || defaultRenderNode;
+
const overlay = (
@@ -133,7 +139,7 @@ export default class MulSelectDropdown extends React.Component<
checked={selectVal.length === allKeys.length}
indeterminate={indeterminate}
>
- 全选
+ {locale.selectAll}
@@ -172,3 +178,11 @@ export default class MulSelectDropdown extends React.Component<
);
}
}
+
+
+const MulSelectDropdownWrapper = (props: Omit) => {
+ const locale = useLocale("MulSelectDropdown");
+ return ;
+};
+
+export default MulSelectDropdownWrapper;
diff --git a/src/components/multiSearchInput/index.tsx b/src/components/multiSearchInput/index.tsx
index df16a6b84..22dfd263b 100644
--- a/src/components/multiSearchInput/index.tsx
+++ b/src/components/multiSearchInput/index.tsx
@@ -1,29 +1,7 @@
import _ from 'lodash';
import { Input, Tooltip } from 'antd';
import React from 'react';
-
-const searchTypeList: any = [
- {
- key: 'caseSensitive',
- imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAABhElEQVRYhe2VPUvDQByHf5cmrRolQyHtYJ18gy4O4qSDg64i2II4SAvFNoWgX8ShQ64RBxFd6hdwc1QXQRCEirgo7WAXhxJJ079LC+LiRQWH3jPey8PD3cEBEolEMugw0YWc8zqAqRDuh1KpNB0+adAQvoI+nPM9APuMsblisXj72wD1B3vyRHQOIAdg90ucGQTBsGmaz9lsNhCRhToBzvkCgFNVVVc7nc617/sp27bfe3MHAJaJqMkYM3zfX7Rt++07pxImAEAewHGhUHgCcK9p2hoA1Gq1KBE9xuPxtGVZS4yxV03TVkSEwgGu644A2AQwX61WXQB6LwiZTMYHYLRarUvHca6IKA1gTMQr/AaIaANAnYhOiAiMsQsiOnRdd8JxnHFFUbYURZlsNBpBIpG4EfWGCcgTkWtZ1ll/jHO+3u12twEcARgNgoAnk8kUAJWI/jZAVdWcYRgvn8c8z9uJRqND5XK5WalUZmOx2Ey73b6LRCKaruueqPtfkX+BRCKRfAAM043+Rp32BgAAAABJRU5ErkJggg==',
- tip: '区分大小写匹配',
- },
- {
- key: 'precise',
- imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAwFBMVEUAAAD///+AgICioqKSkpKcnJyUlJSbm5uVlZWXl5eWlpaWlpaYmJiZmZmWlpaVlZWVlZWWlpaVlZWYmJiWlpaYmJiWlpaXl5eYmJiXl5eXl5eWlpaYmJiYmJiXl5eYmJiYmJiWlpaXl5eXl5eWlpaWlpaXl5eWlpaWlpaYmJiXl5eXl5eYmJiYmJiXl5eYmJiXl5eWlpaXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eIXQHmAAAAP3RSTlMAAQILDhITFxggIi4vMjM1Oj9BQ0RISVFUXWBmam9zdHmBhIWGjZaXoaOkp6qvvL7EyMzR2t3g4eTn6erz+PmloSGXAAAAAWJLR0QB/wIt3gAAAJlJREFUOMtjYBgF1AUqdvYowE4ZTYEdK4QW1oPQbLZoCuyhNJ82mgCKAh1TRgwdyHw2M31BIMUtxo5DgayqpAYDg5yBsjknFgX2JgzGPMxWLAxcAuL6kpb2WEzgtzEyspZmUNOVMZDCaoW6PAODiCGDqSi/BXYFChwMDExKzEJaihJ8OLwJBLyaOLxpx0YgJJXR40JpNH2SBgAKqha54oD4rgAAAABJRU5ErkJggg==',
- tip: '精确匹配',
- },
- {
- key: 'front',
- imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAB20lEQVRYhe2QPYgTURSFz33zJtkogrI6hcUqIm5pobiVVlsq6SwEmyQwZMCfThYRXiXYSZjMzdOwYVER0gsWay2ynYiFICgoGIw2oilm8q7NBpYVMkEN28xX3nM553CAgoKCgoIpMPPLOI4X55mhcvSjvu/v38sCc2emAsYY1ev1Fnbfmfk1M2/NtYCIlIMgeDYaja7tCj8HoCQii51O5/ROrd/ve0mSnLDWHv4fBZ4qpcae5/WSJDlkjNHbUo2INgA8EpHa5D+O42PD4fAtgA3n3CtmNv9UAMAZEbngnHtHRO+DILhnrd0H4DIRPVFKPQZwpdVqlQFAa30EwK0ois5rrVcB3JxmrqeJACAiz5VSZSK6GIbhLwBg5qsAlIjc3n5b8H2/CqCfZdlXz/PuMvNalmUZgAPT/HMXIKImgA8isrbjXCeiB865TefcJoB1IqoDgFLqDoCtZrO5QkQ38vxzF1BKuTAMa8YYBQDtdvukiJwtlUqX6vX6DwDodrsv0jT9ZK1dGo/Hb0TkOjMfFJHjANxU/7wCE4wxE6MvRLQ8CQeARqPx3Tm3XKlUvkVRdN/zvKpz7uFgMKhqrU/NmvEHzPzRWrv01wYzkLfA5zRNf86zQEFBQcGe8xvNVbTHyF7uqwAAAABJRU5ErkJggg==',
- tip: '头部匹配',
- },
- {
- key: 'tail',
- imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAB9klEQVRYhe2UP4gTQRjF37fJJqcRDw0kEUTwDygIIgh2NoIoWFwjKU5QDIRjJhxoddptY32wxcyuWEi4QnK1eJ1a2HqNIAh3V6jkApcyISCzz0YhitmcSqz2B9PM+2bem2+GATIyMjIyZkwURctRFC1P0vOzDkCynKZ7sw4wjakBrLUPrLU0xlz4k43b7XZpP3X7uYIGyQ0RaQC4/0u4inPuQKVS+Vyv192P+TiOjw0Gg01jzM1pm6d2wFp7GcCc7/sawGIYhsUx7QmAt57nrfX7/c0wDA8DgDHmiHNuRHJFRDYAXPzrAAAaANrNZnMHwAff9xcAoNPpFEhulcvl81rrKyKy5/v+NWPMoohsfR+rAI4CWEgzkElCHMcHkyTpAngtIrskLwHYU0rdICnW2scicp3kVxE5CWBFKfVsrENLAB6RfCMiO0qp4Hc+E98AyVsAPpJcIwkReUXyaRzHJ4wxxz3Pu+153plut+uq1eq78bXGmFMAHpK8KiJ30jow8QpINkjGWut1rfW6Uuq5iLxIkuQugE8ADjnnbK1WeykiPx1Ea73d6/VOa62308xTO5DP5+/Nz89/GZ8bjUZLhUJhrtVq7YZheK5YLJ4dDofvc7mcXyqVRuO1QRAk08z/C9bawFobTNJn/hWLSH/WHhkZGRn/xDfA/cJ9mTtA3QAAAABJRU5ErkJggg==',
- tip: '尾部匹配',
- },
-];
+import useLocale, { Locale } from '../locale/useLocale';
export type SearchType = 'fuzzy' | 'precise' | 'front' | 'tail';
@@ -37,6 +15,7 @@ export interface MultiSearchInputProps {
searchType?: SearchType; // input框中选中的筛选方式
filterOptions?: SearchType[]; // 数组
className?: string;
+ locale?: Locale['MultiSearchInput'];
[propName: string]: any;
}
@@ -74,9 +53,36 @@ class MultiSearchInput extends React.Component<
render() {
const { placeholder, style, value, onChange, onSearch, onTypeChange, filterOptions } =
this.state;
- const { className = '', value: propsValue, searchType: propsSearchType } = this.props;
+ const {
+ className = '',
+ value: propsValue,
+ searchType: propsSearchType,
+ locale,
+ } = this.props;
let searchType = this.state.searchType;
searchType = propsSearchType != null ? propsSearchType : searchType;
+ const searchTypeList: any = [
+ {
+ key: 'caseSensitive',
+ imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAABhElEQVRYhe2VPUvDQByHf5cmrRolQyHtYJ18gy4O4qSDg64i2II4SAvFNoWgX8ShQ64RBxFd6hdwc1QXQRCEirgo7WAXhxJJ079LC+LiRQWH3jPey8PD3cEBEolEMugw0YWc8zqAqRDuh1KpNB0+adAQvoI+nPM9APuMsblisXj72wD1B3vyRHQOIAdg90ucGQTBsGmaz9lsNhCRhToBzvkCgFNVVVc7nc617/sp27bfe3MHAJaJqMkYM3zfX7Rt++07pxImAEAewHGhUHgCcK9p2hoA1Gq1KBE9xuPxtGVZS4yxV03TVkSEwgGu644A2AQwX61WXQB6LwiZTMYHYLRarUvHca6IKA1gTMQr/AaIaANAnYhOiAiMsQsiOnRdd8JxnHFFUbYURZlsNBpBIpG4EfWGCcgTkWtZ1ll/jHO+3u12twEcARgNgoAnk8kUAJWI/jZAVdWcYRgvn8c8z9uJRqND5XK5WalUZmOx2Ey73b6LRCKaruueqPtfkX+BRCKRfAAM043+Rp32BgAAAABJRU5ErkJggg==',
+ tip: locale.case,
+ },
+ {
+ key: 'precise',
+ imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAwFBMVEUAAAD///+AgICioqKSkpKcnJyUlJSbm5uVlZWXl5eWlpaWlpaYmJiZmZmWlpaVlZWVlZWWlpaVlZWYmJiWlpaYmJiWlpaXl5eYmJiXl5eXl5eWlpaYmJiYmJiXl5eYmJiYmJiWlpaXl5eXl5eWlpaWlpaXl5eWlpaWlpaYmJiXl5eXl5eYmJiYmJiXl5eYmJiXl5eWlpaXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eIXQHmAAAAP3RSTlMAAQILDhITFxggIi4vMjM1Oj9BQ0RISVFUXWBmam9zdHmBhIWGjZaXoaOkp6qvvL7EyMzR2t3g4eTn6erz+PmloSGXAAAAAWJLR0QB/wIt3gAAAJlJREFUOMtjYBgF1AUqdvYowE4ZTYEdK4QW1oPQbLZoCuyhNJ82mgCKAh1TRgwdyHw2M31BIMUtxo5DgayqpAYDg5yBsjknFgX2JgzGPMxWLAxcAuL6kpb2WEzgtzEyspZmUNOVMZDCaoW6PAODiCGDqSi/BXYFChwMDExKzEJaihJ8OLwJBLyaOLxpx0YgJJXR40JpNH2SBgAKqha54oD4rgAAAABJRU5ErkJggg==',
+ tip: locale.precise,
+ },
+ {
+ key: 'front',
+ imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAB20lEQVRYhe2QPYgTURSFz33zJtkogrI6hcUqIm5pobiVVlsq6SwEmyQwZMCfThYRXiXYSZjMzdOwYVER0gsWay2ynYiFICgoGIw2oilm8q7NBpYVMkEN28xX3nM553CAgoKCgoIpMPPLOI4X55mhcvSjvu/v38sCc2emAsYY1ev1Fnbfmfk1M2/NtYCIlIMgeDYaja7tCj8HoCQii51O5/ROrd/ve0mSnLDWHv4fBZ4qpcae5/WSJDlkjNHbUo2INgA8EpHa5D+O42PD4fAtgA3n3CtmNv9UAMAZEbngnHtHRO+DILhnrd0H4DIRPVFKPQZwpdVqlQFAa30EwK0ois5rrVcB3JxmrqeJACAiz5VSZSK6GIbhLwBg5qsAlIjc3n5b8H2/CqCfZdlXz/PuMvNalmUZgAPT/HMXIKImgA8isrbjXCeiB865TefcJoB1IqoDgFLqDoCtZrO5QkQ38vxzF1BKuTAMa8YYBQDtdvukiJwtlUqX6vX6DwDodrsv0jT9ZK1dGo/Hb0TkOjMfFJHjANxU/7wCE4wxE6MvRLQ8CQeARqPx3Tm3XKlUvkVRdN/zvKpz7uFgMKhqrU/NmvEHzPzRWrv01wYzkLfA5zRNf86zQEFBQcGe8xvNVbTHyF7uqwAAAABJRU5ErkJggg==',
+ tip: locale.front,
+ },
+ {
+ key: 'tail',
+ imgSrc: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAB9klEQVRYhe2UP4gTQRjF37fJJqcRDw0kEUTwDygIIgh2NoIoWFwjKU5QDIRjJhxoddptY32wxcyuWEi4QnK1eJ1a2HqNIAh3V6jkApcyISCzz0YhitmcSqz2B9PM+2bem2+GATIyMjIyZkwURctRFC1P0vOzDkCynKZ7sw4wjakBrLUPrLU0xlz4k43b7XZpP3X7uYIGyQ0RaQC4/0u4inPuQKVS+Vyv192P+TiOjw0Gg01jzM1pm6d2wFp7GcCc7/sawGIYhsUx7QmAt57nrfX7/c0wDA8DgDHmiHNuRHJFRDYAXPzrAAAaANrNZnMHwAff9xcAoNPpFEhulcvl81rrKyKy5/v+NWPMoohsfR+rAI4CWEgzkElCHMcHkyTpAngtIrskLwHYU0rdICnW2scicp3kVxE5CWBFKfVsrENLAB6RfCMiO0qp4Hc+E98AyVsAPpJcIwkReUXyaRzHJ4wxxz3Pu+153plut+uq1eq78bXGmFMAHpK8KiJ30jow8QpINkjGWut1rfW6Uuq5iLxIkuQugE8ADjnnbK1WeykiPx1Ea73d6/VOa62308xTO5DP5+/Nz89/GZ8bjUZLhUJhrtVq7YZheK5YLJ4dDofvc7mcXyqVRuO1QRAk08z/C9bawFobTNJn/hWLSH/WHhkZGRn/xDfA/cJ9mTtA3QAAAABJRU5ErkJggg==',
+ tip: locale.tail,
+ },
+ ];
const filterList = _.filter(searchTypeList, (item: any) => {
return _.includes(filterOptions, item.key);
});
@@ -157,4 +163,9 @@ class MultiSearchInput extends React.Component<
}
}
-export default MultiSearchInput;
+const MultiSearchInputWrapper = (props) => {
+ const locale = useLocale('MultiSearchInput');
+ return ;
+};
+
+export default MultiSearchInputWrapper;
diff --git a/src/components/mxGraph/index.tsx b/src/components/mxGraph/index.tsx
index bf021dc41..84911a91b 100644
--- a/src/components/mxGraph/index.tsx
+++ b/src/components/mxGraph/index.tsx
@@ -21,6 +21,7 @@ import {
mxPopupMenuHandler,
} from 'mxgraph';
import MxFactory from './factory';
+import useLocale from '../locale/useLocale';
const Mx = new MxFactory();
@@ -292,6 +293,8 @@ function MxGraphContainer(
const keybindingsRef = useRef([]);
const [current, setCurrent] = useState(null);
+ const locale = useLocale('MxGraph');
+
useImperativeHandle(ref, () => ({
/**
* 在某一位置插入节点
@@ -426,7 +429,7 @@ function MxGraphContainer(
onGetPreview?.(node) ||
(() => {
const dom = document.createElement('div');
- dom.innerHTML = `新节点`;
+ dom.innerHTML = `${locale.newNode}`;
return dom;
})();
diff --git a/src/components/notFound/index.tsx b/src/components/notFound/index.tsx
index 97e9b9dc1..d920b7c12 100644
--- a/src/components/notFound/index.tsx
+++ b/src/components/notFound/index.tsx
@@ -1,15 +1,17 @@
import React from 'react';
import { FrownOutlined } from '@ant-design/icons';
+import useLocale from '../locale/useLocale';
-export default class NotFound extends React.Component {
- render() {
- return (
-
-
- 亲,是不是走错地方了?
-
-
- );
- }
-}
+const NotFound = () => {
+ const locale = useLocale('NotFound');
+ return (
+
+
+ {locale.description}
+
+
+ );
+};
+
+export default NotFound;
diff --git a/src/components/progressLine/index.tsx b/src/components/progressLine/index.tsx
index f2318d554..736967fdd 100644
--- a/src/components/progressLine/index.tsx
+++ b/src/components/progressLine/index.tsx
@@ -1,5 +1,6 @@
import * as React from 'react';
import { Tooltip } from 'antd';
+import useLocale from '../locale/useLocale';
interface IProps {
title?: string;
@@ -12,7 +13,7 @@ interface IProps {
}
const ProgressLine = ({
- title = '暂无描述',
+ title,
num = 0,
percent = '0%',
color = '#3BCEFF',
@@ -21,7 +22,8 @@ const ProgressLine = ({
width = '280px',
}: IProps) => {
const slidePrefixCls = 'dtc-progress-line';
- const label = `${title}: ${num}`;
+ const locale = useLocale('ProgressLine');
+ const label = `${title || locale.description}: ${num}`;
return (
{needTitle && (
diff --git a/src/components/renderFormItem/index.tsx b/src/components/renderFormItem/index.tsx
index 02e8c26a8..1bdb48e1d 100644
--- a/src/components/renderFormItem/index.tsx
+++ b/src/components/renderFormItem/index.tsx
@@ -1,6 +1,7 @@
import React from 'react';
import { Form, Input } from 'antd';
import { Rule } from 'antd/lib/form';
+import useLocale from '../locale/useLocale';
const FormItem = Form.Item;
@@ -43,6 +44,8 @@ export default function RenderFormItem({ item, layout }: ItemType) {
valuePropName,
normalize,
} = options;
+ const locale = useLocale('RenderFormItem');
+
return (
void;
onSelect?: (value: string, option: Object) => void;
onCancel?: () => void;
@@ -30,15 +32,22 @@ class SearchModal extends React.Component {
render() {
const {
visible,
- title = '搜索并打开',
+ title,
prefixRender,
dataSource = [],
// bodyStyle,
- placeholder = '请输入',
+ placeholder,
+ locale,
...rest
} = this.props;
return (
-
+
{prefixRender && (
@@ -52,7 +61,7 @@ class SearchModal extends React.Component {
onSelect={this.onSelect}
onSearch={this.onChange}
>
-
+
@@ -60,4 +69,11 @@ class SearchModal extends React.Component {
);
}
}
-export default SearchModal;
+
+const SearchModalWrapper = (props: Omit) => {
+ const locale = useLocale('SearchModal');
+ const { visible, dataSource, ...reset } = props;
+ return ;
+};
+
+export default SearchModalWrapper;
diff --git a/src/components/spreadSheet/index.tsx b/src/components/spreadSheet/index.tsx
index ac8569b03..cdb5b1128 100644
--- a/src/components/spreadSheet/index.tsx
+++ b/src/components/spreadSheet/index.tsx
@@ -6,6 +6,7 @@ import type { HotTableProps } from '@handsontable/react';
import classNames from 'classnames';
import 'handsontable/dist/handsontable.full.css';
import 'handsontable/languages/zh-CN.js';
+import useLocale, { Locale } from '../locale/useLocale';
type IOptions = HotTableProps & {
/** 是否展示复制值以及列名 */
@@ -24,6 +25,7 @@ export interface SpreadSheetProps {
/** 字段类型 */
type: string;
}>;
+ locale?: Locale['SpreadSheet'];
hotTableInstanceRef?: (instance: any) => void;
}
@@ -55,11 +57,11 @@ class SpreadSheet extends React.PureComponent {
this.removeRenderClock();
}
getData() {
- const { data, columns = [] } = this.props;
+ const { data, columns = [], locale } = this.props;
let showData = data;
if (!showData || !showData.length) {
const emptyArr = new Array(columns.length).fill('', 0, columns.length);
- emptyArr[0] = '暂无数据';
+ emptyArr[0] = locale.description;
showData = [emptyArr];
}
return showData;
@@ -92,10 +94,10 @@ class SpreadSheet extends React.PureComponent {
}
getContextMenu() {
const that = this;
- const { columns = [], options } = this.props;
+ const { columns = [], options, locale } = this.props;
const items = {
copy: {
- name: '复制',
+ name: locale.copy,
callback: function (_key) {
const indexArr = this.getSelected();
// eslint-disable-next-line prefer-spread
@@ -106,7 +108,7 @@ class SpreadSheet extends React.PureComponent {
};
if (options?.showCopyWithHeader) {
const copyWithHeaderItem = {
- name: '复制值以及列名',
+ name: locale.copyAll,
callback: function (_key, selection) {
const indexArr = this.getSelected();
// eslint-disable-next-line prefer-spread
@@ -153,7 +155,9 @@ class SpreadSheet extends React.PureComponent {
if (!isShowColHeaders) return false;
// handsontable 不支持 renderCustomHeader,所以只能用 html string 实现 tooltip
const fieldTypeStr = columnTypes?.[index]?.type;
- const title = fieldTypeStr ? `${columns?.[index]}: ${fieldTypeStr}` : columns?.[index];
+ const title = fieldTypeStr
+ ? `${columns?.[index]}: ${fieldTypeStr}`
+ : columns?.[index];
return `${title}`;
}}
data={showData}
@@ -176,4 +180,10 @@ class SpreadSheet extends React.PureComponent {
);
}
}
-export default SpreadSheet;
+
+const SpreadSheetWrapper = (props: Omit) => {
+ const locale = useLocale('SpreadSheet');
+ return ;
+};
+
+export default SpreadSheetWrapper;