@zat-design/sisyphus-react 4.5.6-beta.1 → 4.5.6-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -85,6 +85,68 @@ const TabsManager = /*#__PURE__*/forwardRef(({
85
85
  }
86
86
  }, [state.activeKey]);
87
87
 
88
+ // tab 内子视图栈:按 tabId 隔离。栈底→栈顶顺序,入口页不在其中。
89
+ // 只活在内存、不进缓存(详情/工作流是运行态 ReactNode,无法 JSON 序列化)。
90
+ const [viewStacks, setViewStacks] = useState({});
91
+
92
+ // 用 ref 持有 activeKey,供稳定的 pushView/back 读取当前激活 tab,避免因 activeKey 变化重建实例
93
+ const activeKeyRef = useRef(state.activeKey);
94
+ activeKeyRef.current = state.activeKey;
95
+
96
+ // 同步持有最新 viewStacks,使 getViewStack 成为稳定引用且读取不受渲染时序影响
97
+ const viewStacksRef = useRef(viewStacks);
98
+ viewStacksRef.current = viewStacks;
99
+
100
+ // 在当前激活 tab 内压入一层子视图(入口页/下层随之隐藏但不卸载)
101
+ const pushView = useCallback(node => {
102
+ const tabId = activeKeyRef.current;
103
+ if (!tabId) return;
104
+ setViewStacks(prev => ({
105
+ ...prev,
106
+ [tabId]: [...(prev[tabId] || []), node]
107
+ }));
108
+ }, []);
109
+
110
+ // 返回:销毁当前激活 tab 的栈顶子视图(栈空时 no-op)
111
+ const back = useCallback(() => {
112
+ const tabId = activeKeyRef.current;
113
+ if (!tabId) return;
114
+ setViewStacks(prev => {
115
+ const stack = prev[tabId];
116
+ if (!stack || stack.length === 0) return prev;
117
+ const nextStack = stack.slice(0, -1);
118
+ const next = {
119
+ ...prev
120
+ };
121
+ if (nextStack.length === 0) {
122
+ delete next[tabId];
123
+ } else {
124
+ next[tabId] = nextStack;
125
+ }
126
+ return next;
127
+ });
128
+ }, []);
129
+
130
+ // 获取当前激活 tab 的子视图栈(从 ref 读最新值,稳定引用)
131
+ const getViewStack = useCallback(() => viewStacksRef.current[activeKeyRef.current] || [], []);
132
+
133
+ // 子视图栈与 tabsList 对账:任何关闭路径(removeTab / closeOthers / closeRight /
134
+ // closeAll)导致某 tab 消失后,清除其残留子视图栈,避免关闭后 node 仍驻留内存。
135
+ useEffect(() => {
136
+ setViewStacks(prev => {
137
+ const keys = Object.keys(prev);
138
+ if (keys.length === 0) return prev;
139
+ const aliveIds = new Set(state.tabsList.map(tab => tab.id));
140
+ const staleKeys = keys.filter(id => !aliveIds.has(id));
141
+ if (staleKeys.length === 0) return prev;
142
+ const next = {
143
+ ...prev
144
+ };
145
+ staleKeys.forEach(id => delete next[id]);
146
+ return next;
147
+ });
148
+ }, [state.tabsList]);
149
+
88
150
  // 通知父级(ProLayout)当前是否有 Tab
89
151
  useEffect(() => {
90
152
  onTabsChange?.(state.tabsList.length > 0);
@@ -169,8 +231,11 @@ const TabsManager = /*#__PURE__*/forwardRef(({
169
231
  tabsList: state.tabsList,
170
232
  activeTabInfo: state.tabsList.find(tab => tab.id === state.activeKey),
171
233
  activeComponent: state.activeComponent
172
- })
173
- }), [addTab, removeTab, updateTab, state.tabsList, state.activeKey, state.activeComponent, dataSource]);
234
+ }),
235
+ pushView,
236
+ back,
237
+ getViewStack
238
+ }), [addTab, removeTab, updateTab, state.tabsList, state.activeKey, state.activeComponent, dataSource, pushView, back, getViewStack]);
174
239
  const handleTabChange = useCallback(activeKey => {
175
240
  switchTab(activeKey);
176
241
  }, [switchTab]);
@@ -227,11 +292,30 @@ const TabsManager = /*#__PURE__*/forwardRef(({
227
292
  });
228
293
  }
229
294
  }
295
+
296
+ // 该 tab 的子视图栈:栈底→栈顶。只有「当前激活 tab 的栈顶层」可见,
297
+ // 入口页与下层子视图 display:none 但保持挂载 → 返回秒回、状态不丢。
298
+ const stack = viewStacks[tab.id] || [];
299
+ // 入口页可见条件:该 tab 激活 且 无子视图
300
+ const entryVisible = isActive && stack.length === 0;
230
301
  return /*#__PURE__*/_jsx("div", {
231
- className: `tab-pane ${isActive ? '' : 'hidden'}`,
302
+ className: `tab-pane ${entryVisible ? '' : 'hidden'}`,
232
303
  "data-testid": `tab-pane-${tab.id}`,
233
304
  children: content
234
305
  }, tab.id);
306
+ }), state.tabsList.map(tab => {
307
+ const isActive = tab.id === state.activeKey;
308
+ const stack = viewStacks[tab.id] || [];
309
+ if (stack.length === 0) return null;
310
+ const topIndex = stack.length - 1;
311
+ return stack.map((node, index) => {
312
+ const layerVisible = isActive && index === topIndex;
313
+ return /*#__PURE__*/_jsx("div", {
314
+ className: `tab-pane ${layerVisible ? '' : 'hidden'}`,
315
+ "data-testid": `tab-subview-${tab.id}-${index}`,
316
+ children: node
317
+ }, `${tab.id}-subview-${index}`);
318
+ });
235
319
  }), state.tabsList.length === 0 && /*#__PURE__*/_jsx("div", {
236
320
  className: "tab-pane",
237
321
  "data-testid": "default-content",
@@ -84,10 +84,13 @@
84
84
  margin: 0;
85
85
  padding: 0;
86
86
  border-bottom: none;
87
+ }
87
88
 
88
- &::before {
89
- display: none; // 隐藏底部边框
90
- }
89
+ // 横线右端缩短,空出圆角半径,让横线在圆弧起点处结束
90
+ // 用属性选择器提升权重,确保覆盖 antd :where() 规则
91
+ .@{ant-prefix}-tabs-nav[class]::before {
92
+ right: var(--zaui-border-radius, 8px) !important;
93
+ left: 0 !important;
91
94
  }
92
95
 
93
96
  // 覆盖 nav-list 样式,使其匹配 pro-layout-tab-list
@@ -1,8 +1,8 @@
1
1
  /* eslint-disable func-call-spacing */
2
2
  /* eslint-disable no-spaced-func */
3
- import { createContext, useMemo, useRef, useCallback, useState } from 'react';
3
+ import { createContext, useMemo, useRef, useCallback } from 'react';
4
4
  import classNames from 'classnames';
5
- import { useSetState, useToggle, useDeepCompareEffect } from 'ahooks';
5
+ import { useSetState, useToggle, useDeepCompareEffect, useScroll } from 'ahooks';
6
6
  import { ProWaterMark } from "../index";
7
7
  import { ProCollapse, ProFooter, ProHeader } from "./components";
8
8
  import { Header, Notice, Menu } from "./components/Layout/index";
@@ -53,10 +53,24 @@ const ProLayout = props => {
53
53
  const tabsManagerRef = useRef(null);
54
54
 
55
55
  // Tab 栏 Portal 挂载目标及动画状态
56
- const [tabsBarEl, setTabsBarEl] = useState(null);
57
- const [hasTabs, setHasTabs] = useState(false);
58
- // TabsManager 通过 onIframePureChange 报告的 pure 状态(iframe 嵌入 + 默认纯净渲染)
59
- const [isIframePure, setIsIframePure] = useState(false);
56
+ const [{
57
+ tabsBarEl,
58
+ hasTabs,
59
+ isIframePure
60
+ }, setTabsState] = useSetState({
61
+ tabsBarEl: null,
62
+ hasTabs: false,
63
+ isIframePure: false
64
+ });
65
+ // 稳定的 ref 回调,避免内联函数每次渲染都触发 setState 导致无限循环
66
+ const setTabsBarElRef = useCallback(el => setTabsState({
67
+ tabsBarEl: el
68
+ }), []);
69
+
70
+ // 仅 tabs 模式需要感知滚动位置(用于控制右上角圆弧伪元素的显隐)
71
+ // 非 tabs 模式传 null,useScroll 不挂载监听器
72
+ const scrollPos = useScroll(isTabsLayout ? document : null);
73
+ const isAtTop = (scrollPos?.top ?? 0) === 0;
60
74
  const [{
61
75
  notice,
62
76
  menus,
@@ -136,8 +150,12 @@ const ProLayout = props => {
136
150
  dataSource: menuDataSource,
137
151
  originalOnMenuClick: onMenuClick,
138
152
  tabsBarContainer: tabsBarEl,
139
- onTabsChange: setHasTabs,
140
- onIframePureChange: setIsIframePure,
153
+ onTabsChange: v => setTabsState({
154
+ hasTabs: v
155
+ }),
156
+ onIframePureChange: v => setTabsState({
157
+ isIframePure: v
158
+ }),
141
159
  children: children
142
160
  });
143
161
  };
@@ -263,8 +281,8 @@ const ProLayout = props => {
263
281
  }), /*#__PURE__*/_jsx(Notice, {
264
282
  ...noticeProps
265
283
  }), /*#__PURE__*/_jsx("div", {
266
- ref: setTabsBarEl,
267
- className: `pro-layout-tabs-bar-wrapper${hasTabs ? ' tabs-visible' : ''}${collapsed ? ' tabs-menu-open' : ''}`,
284
+ ref: setTabsBarElRef,
285
+ className: `pro-layout-tabs-bar-wrapper${hasTabs ? ' tabs-visible' : ''}${collapsed ? ' tabs-menu-open' : ''}${isAtTop ? ' tabs-at-top' : ''}`,
268
286
  style: {
269
287
  marginTop: effectiveHeaderHeight + noticeHeight
270
288
  }
@@ -431,6 +431,23 @@ export interface ProLayoutTabsInstance {
431
431
  * @description 获取标签页信息
432
432
  */
433
433
  getTabInfo: () => TabsInfoResult;
434
+ /**
435
+ * @description 在当前激活标签页内压入一个子视图(如详情页),入口页会被隐藏但不卸载
436
+ * @param node 要展示的子视图 React 节点
437
+ * @example
438
+ * ```tsx
439
+ * layoutTabs.pushView(<ProductDetail id={record.id} />);
440
+ * ```
441
+ */
442
+ pushView: (node: ReactNode) => void;
443
+ /**
444
+ * @description 返回上一层:销毁当前激活标签页的栈顶子视图,露出下一层(栈空时露出入口页)
445
+ */
446
+ back: () => void;
447
+ /**
448
+ * @description 获取当前激活标签页的子视图栈(栈底→栈顶顺序),入口页不在其中
449
+ */
450
+ getViewStack: () => ReactNode[];
434
451
  }
435
452
  /**
436
453
  * @description iframe 路由表配置项
@@ -325,6 +325,38 @@
325
325
  overflow: hidden;
326
326
  min-height: 0;
327
327
  }
328
+
329
+ // 右下角圆弧 + 横线截断:仅在页面顶部(tabs-at-top)时显示
330
+ // 滚动后 sticky 偏移导致背景错位,此时隐藏伪元素避免视觉异常
331
+ &.tabs-visible.tabs-at-top::after {
332
+ content: '';
333
+ position: absolute;
334
+ bottom: calc(-1 * var(--zaui-border-radius, 8px));
335
+ right: 0;
336
+ width: var(--zaui-border-radius, 8px);
337
+ height: var(--zaui-border-radius, 8px);
338
+ border-right: 1px solid rgb(235 236 238);
339
+ border-top-right-radius: var(--zaui-border-radius, 8px);
340
+ pointer-events: none;
341
+ }
342
+
343
+ // 遮住 ant-tabs-nav::before 横线的右端(圆角半径宽度),使其在圆弧起点处截止
344
+ &.tabs-visible.tabs-at-top::before {
345
+ content: '';
346
+ position: absolute;
347
+ bottom: 0;
348
+ right: 0;
349
+ width: var(--zaui-border-radius, 8px);
350
+ height: 2px;
351
+ background-color: #f7f9fd;
352
+ background-image: var(--header-bg-image);
353
+ background-repeat: no-repeat;
354
+ background-position: top center;
355
+ background-size: 100% auto;
356
+ background-attachment: fixed;
357
+ z-index: 1;
358
+ pointer-events: none;
359
+ }
328
360
  }
329
361
 
330
362
  /** 内容区 */
@@ -7,6 +7,7 @@ import { CheckOutlined } from '@ant-design/icons';
7
7
  import { ReactSVG } from 'react-svg';
8
8
  import { isEmpty, isEllipsisActive } from "../../../utils";
9
9
  import copySvg from "../../../assets/copy.svg";
10
+ import locale from "../../../locale";
10
11
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
11
12
  const {
12
13
  Paragraph,
@@ -198,7 +199,7 @@ const RenderColumn = props => {
198
199
  className: "drag-icon",
199
200
  src: copySvg
200
201
  }, "copy-icon"), /*#__PURE__*/_jsx(CheckOutlined, {}, "copied-icon")],
201
- tooltips: ['复制', '复制成功']
202
+ tooltips: locale.ProHeader.copyTooltips
202
203
  },
203
204
  children: node
204
205
  })
@@ -9,6 +9,7 @@ import WORD from "../style/icon-word.png";
9
9
  import lookSvg from "../../assets/look.svg";
10
10
  import deleteSvg from "../../assets/delete.svg";
11
11
  import downloadSvg from "../../assets/download.svg";
12
+ import locale from "../../locale";
12
13
 
13
14
  /**
14
15
  * @description: b 转成 Kb
@@ -119,10 +120,10 @@ const FileItem = props => {
119
120
  src: lookSvg
120
121
  })
121
122
  }), _showRemoveIcon && !disabled && (isConfirmDelete ? /*#__PURE__*/_jsx(Popconfirm, {
122
- title: "\u786E\u5B9A\u5220\u9664?",
123
+ title: locale.ProUpload.deleteConfirmTitle,
123
124
  onConfirm: _onRemove,
124
- okText: "\u786E\u8BA4",
125
- cancelText: "\u53D6\u6D88",
125
+ okText: locale.ProDrawerForm.confirm,
126
+ cancelText: locale.ProDrawerForm.cancel,
126
127
  children: /*#__PURE__*/_jsx(Button, {
127
128
  type: "link",
128
129
  className: "file-action-item",
@@ -10,6 +10,10 @@ declare const _default: {
10
10
  tipAlt: string;
11
11
  closeAlt: string;
12
12
  tabMaxLimitMessage: string;
13
+ tabMenuClose: string;
14
+ tabMenuCloseOthers: string;
15
+ tabMenuCloseRight: string;
16
+ tabMenuCloseAll: string;
13
17
  };
14
18
  ProHeader: {
15
19
  versionTitle: string;
@@ -18,6 +22,8 @@ declare const _default: {
18
22
  confirmTitle: string;
19
23
  backText: string;
20
24
  copyTooltips: string[];
25
+ itemsCountPrefix: string;
26
+ itemsSeparator: string;
21
27
  };
22
28
  ProDownload: {
23
29
  errorMessage: string;
@@ -39,6 +45,8 @@ declare const _default: {
39
45
  formListConfirmMessage: string;
40
46
  noData: string;
41
47
  moreItems: string;
48
+ confirmTitle: string;
49
+ confirmContent: string;
42
50
  };
43
51
  ProAction: {
44
52
  errorMessage: string;
@@ -80,6 +88,7 @@ declare const _default: {
80
88
  view: string;
81
89
  delete: string;
82
90
  download: string;
91
+ deleteConfirmTitle: string;
83
92
  };
84
93
  ProStep: {
85
94
  catalogue: string;
@@ -4,45 +4,53 @@ export default {
4
4
  confirm: 'Confirm',
5
5
  cancel: 'Cancel',
6
6
  isSureClose: 'Confirm to close the current page',
7
- secondTipsWhenSave: 'Close the current page content will not be saved, need to click the Save button to save'
7
+ secondTipsWhenSave: 'Unsaved changes will be lost. Click Save to keep your changes.'
8
8
  },
9
9
  ProLayout: {
10
10
  tipAlt: 'Tips',
11
11
  closeAlt: 'Close',
12
- tabMaxLimitMessage: 'Menu tabs cannot exceed the maximum limit of {max}'
12
+ tabMaxLimitMessage: 'Menu tabs cannot exceed the maximum limit of {max}',
13
+ tabMenuClose: 'Close',
14
+ tabMenuCloseOthers: 'Close others',
15
+ tabMenuCloseRight: 'Close tabs to the right',
16
+ tabMenuCloseAll: 'Close all'
13
17
  },
14
18
  ProHeader: {
15
19
  versionTitle: 'Version number',
16
20
  confirm: 'Confirm',
17
21
  cancel: 'Cancel',
18
22
  confirmTitle: 'Confirm return?',
19
- backText: 'Return',
20
- copyTooltips: ['Copy', 'Copy successfully']
23
+ backText: 'Back',
24
+ copyTooltips: ['Copy', 'Copied successfully'],
25
+ itemsCountPrefix: '{count} items in total, ',
26
+ itemsSeparator: ', '
21
27
  },
22
28
  ProDownload: {
23
29
  errorMessage: 'Request failed!'
24
30
  },
25
31
  ProForm: {
26
32
  unfold: 'Unfold',
27
- packUp: 'PackUp',
33
+ packUp: 'Collapse',
28
34
  inputPlaceholder: 'Please enter',
29
35
  treeSelectPlaceholder: 'Please select',
30
36
  selectPlaceHolder: 'Please select',
31
37
  switchText: ['Yes', 'No'],
32
- ruleStartEndText: ['start value', 'end value'],
38
+ ruleStartEndText: ['Start value', 'End value'],
33
39
  search: 'Search',
34
40
  reset: 'Reset',
35
- ruleText: 'correct',
36
- completeText: 'enter in full',
41
+ ruleText: 'valid',
42
+ completeText: 'Please complete all fields',
37
43
  halfRuleText: 'Enter the value of ({total})',
38
44
  formListActions: ['Add', 'Delete', 'Copy', 'Move up', 'Move down', 'Add a new line', 'Click add'],
39
- formListConfirmMessage: 'Are you sure delete it?',
45
+ formListConfirmMessage: 'Are you sure you want to delete?',
40
46
  noData: 'No data',
41
- moreItems: '{count} more...'
47
+ moreItems: '{count} more...',
48
+ confirmTitle: 'Confirm action',
49
+ confirmContent: 'Are you sure you want to modify this field?'
42
50
  },
43
51
  ProAction: {
44
52
  errorMessage: 'The configuration config for ProAction must be data',
45
- defaultTitle: 'Are you sure delete it?'
53
+ defaultTitle: 'Are you sure you want to delete?'
46
54
  },
47
55
  ProTable: {
48
56
  noData: 'No data',
@@ -51,7 +59,7 @@ export default {
51
59
  transformResponseMsg: 'Please return the correct data type',
52
60
  deselect: 'Deselect',
53
61
  selectCurPage: 'Select the current page ({total} items)',
54
- selectAll: 'Select All ({total} items)',
62
+ selectAll: 'Select all ({total} items)',
55
63
  hasSelected: '{selectedNum} items selected',
56
64
  total: '{total} items in total'
57
65
  },
@@ -61,25 +69,26 @@ export default {
61
69
  },
62
70
  ProTree: {
63
71
  inputPlaceholder: 'Please enter',
64
- unExpand: 'Put it all away',
72
+ unExpand: 'Collapse all',
65
73
  expand: 'Expand all',
66
74
  all: 'Select all',
67
- emptyTips: "what you were looking for couldn't be found"
75
+ emptyTips: 'No results found'
68
76
  },
69
77
  ProUpload: {
70
78
  exampleTitle: 'View sample',
71
- errorInfoExt: 'Only {} format files are supported',
79
+ errorInfoExt: 'Supported file formats:',
72
80
  errorInfoSize: 'File size cannot exceed ',
73
81
  buttonText: 'Upload',
74
82
  draggerSelect: 'Select file',
75
83
  draggerDelete: 'Delete',
76
- draggerTips: 'Click or drag file to this area to upload',
77
- draggerBtnTxt: 'Click to upload',
78
- draggerFileExt: 'Support for extensions',
79
- draggerLimitless: 'Limitless',
84
+ draggerTips: 'Click or drag file to this area to ',
85
+ draggerBtnTxt: 'upload',
86
+ draggerFileExt: 'Supported extensions',
87
+ draggerLimitless: 'No limit',
80
88
  view: 'View',
81
89
  delete: 'Delete',
82
- download: 'Download'
90
+ download: 'Download',
91
+ deleteConfirmTitle: 'Are you sure you want to delete?'
83
92
  },
84
93
  ProStep: {
85
94
  catalogue: 'Catalogue'
@@ -138,27 +147,27 @@ export default {
138
147
  clearAll: 'Clear all',
139
148
  checkNumber: '{num} items selected',
140
149
  noFinal: 'Oops, the content you are looking for is not found.',
141
- specifyMode: ['all', 'specify']
150
+ specifyMode: ['All', 'Specify']
142
151
  },
143
152
  ProTimeLimit: {
144
- foreverText: 'long term'
153
+ foreverText: 'Permanent'
145
154
  },
146
155
  ProThemeTools: {
147
- title: 'Global style customization ',
148
- copySuccess: 'Copy success! ',
156
+ title: 'Global style customization',
157
+ copySuccess: 'Copied successfully!',
149
158
  layout: 'Layout',
150
- layoutMode: ['Compact ', 'Regular', 'Loose'],
159
+ layoutMode: ['Compact', 'Regular', 'Loose'],
151
160
  themeColor: 'Theme color',
152
161
  formLabel: 'Form label',
153
162
  bigText: 'Large text mode',
154
- flex: ['Left align ', 'Right align'],
155
- switchText: ['on', 'off'],
163
+ flex: ['Left align', 'Right align'],
164
+ switchText: ['On', 'Off'],
156
165
  tableBorder: 'Table border',
157
- tableStripe: 'Table zebra',
166
+ tableStripe: 'Table zebra stripe',
158
167
  reset: 'Reset'
159
168
  },
160
169
  ProViewer: {
161
- preview: 'preview'
170
+ preview: 'Preview'
162
171
  },
163
172
  ProIcon: {
164
173
  language: 'en'
@@ -166,10 +175,10 @@ export default {
166
175
  RangePicker: {
167
176
  ranges: {
168
177
  today: 'Today',
169
- lastWeek: 'Last Week',
170
- lastMonth: 'Last Month',
171
- last3Months: 'Last 3 Months',
172
- lastYear: 'Last Year'
178
+ lastWeek: 'Last week',
179
+ lastMonth: 'Last month',
180
+ last3Months: 'Last 3 months',
181
+ lastYear: 'Last year'
173
182
  }
174
183
  }
175
184
  };
@@ -10,6 +10,10 @@ declare const _default: {
10
10
  tipAlt: string;
11
11
  closeAlt: string;
12
12
  tabMaxLimitMessage: string;
13
+ tabMenuClose: string;
14
+ tabMenuCloseOthers: string;
15
+ tabMenuCloseRight: string;
16
+ tabMenuCloseAll: string;
13
17
  };
14
18
  ProHeader: {
15
19
  versionTitle: string;
@@ -18,6 +22,8 @@ declare const _default: {
18
22
  cancel: string;
19
23
  backText: string;
20
24
  copyTooltips: string[];
25
+ itemsCountPrefix: string;
26
+ itemsSeparator: string;
21
27
  };
22
28
  ProDownload: {
23
29
  errorMessage: string;
@@ -39,6 +45,8 @@ declare const _default: {
39
45
  formListConfirmMessage: string;
40
46
  noData: string;
41
47
  moreItems: string;
48
+ confirmTitle: string;
49
+ confirmContent: string;
42
50
  };
43
51
  ProAction: {
44
52
  errorMessage: string;
@@ -80,6 +88,7 @@ declare const _default: {
80
88
  view: string;
81
89
  delete: string;
82
90
  download: string;
91
+ deleteConfirmTitle: string;
83
92
  };
84
93
  ProStep: {
85
94
  catalogue: string;
@@ -9,7 +9,11 @@ export default {
9
9
  ProLayout: {
10
10
  tipAlt: '提示',
11
11
  closeAlt: '关闭',
12
- tabMaxLimitMessage: '菜单tab不能超过上限{max}'
12
+ tabMaxLimitMessage: '菜单tab不能超过上限{max}',
13
+ tabMenuClose: '关闭',
14
+ tabMenuCloseOthers: '关闭其他',
15
+ tabMenuCloseRight: '关闭右侧标签页',
16
+ tabMenuCloseAll: '关闭全部'
13
17
  },
14
18
  ProHeader: {
15
19
  versionTitle: '版本号',
@@ -17,7 +21,9 @@ export default {
17
21
  confirm: '确定',
18
22
  cancel: '取消',
19
23
  backText: '返回',
20
- copyTooltips: ['复制', '复制成功']
24
+ copyTooltips: ['复制', '复制成功'],
25
+ itemsCountPrefix: '共{count}个,',
26
+ itemsSeparator: ' 、'
21
27
  },
22
28
  ProDownload: {
23
29
  errorMessage: '请求失败!'
@@ -38,7 +44,9 @@ export default {
38
44
  formListActions: ['新增', '删除', '复制', '上移', '下移', '新增一行', '点击添加'],
39
45
  formListConfirmMessage: '确认删除吗?',
40
46
  noData: '暂无数据',
41
- moreItems: '更多{count}项...'
47
+ moreItems: '更多{count}项...',
48
+ confirmTitle: '操作提示',
49
+ confirmContent: '确定要修改该字段吗?'
42
50
  },
43
51
  ProAction: {
44
52
  errorMessage: 'ProAction 配置 config 必须为数据',
@@ -79,7 +87,8 @@ export default {
79
87
  draggerLimitless: '无限制',
80
88
  view: '查看',
81
89
  delete: '删除',
82
- download: '下载'
90
+ download: '下载',
91
+ deleteConfirmTitle: '确定删除?'
83
92
  },
84
93
  ProStep: {
85
94
  catalogue: '目录'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zat-design/sisyphus-react",
3
- "version": "4.5.6-beta.1",
3
+ "version": "4.5.6-beta.3",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "es",
@@ -66,6 +66,7 @@
66
66
  "lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx --ignore-pattern '**/__tests__/**' --ignore-pattern '**/*.test.*' --ignore-pattern '**/*.spec.*'",
67
67
  "code-standards:check": "node ./scripts/code-standards-check.mjs",
68
68
  "check:types": "node ./scripts/check-public-types.mjs",
69
+ "check:locale": "node ./scripts/check-locale.mjs",
69
70
  "commit-msg:format": "node ./scripts/format-commit-msg.mjs",
70
71
  "lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src",
71
72
  "lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src",
@@ -122,7 +123,7 @@
122
123
  "lodash": "^4.17.21",
123
124
  "react-intersection-observer": "^9.13.0",
124
125
  "react-resizable": "^3.0.5",
125
- "react-svg": "^15.1.7"
126
+ "react-svg": "^17.2.4"
126
127
  },
127
128
  "peerDependencies": {
128
129
  "@ant-design/icons": ">=6.0.0",