@seafile/sdoc-editor 1.0.35 → 1.0.36

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.
@@ -0,0 +1,7 @@
1
+ .seatable-column-draggable {
2
+ cursor: col-resize;
3
+ }
4
+
5
+ .seatable-column-draggable:hover {
6
+ background-color: #2d7ff9;
7
+ }
@@ -0,0 +1,75 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import React from 'react';
3
+ import { eventStopPropagation, createObjectWithProperties } from '../../../../../basic-sdk/utils/mouse-event';
4
+ import './index.css';
5
+
6
+ // The list of the propTypes that we want to include in the Draggable div
7
+ const knownDivPropertyKeys = ['onDragStart', 'onDragEnd', 'onDrag', 'style'];
8
+ class Draggable extends React.Component {
9
+ constructor() {
10
+ super(...arguments);
11
+ _defineProperty(this, "state", {
12
+ drag: null
13
+ });
14
+ _defineProperty(this, "onMouseDown", e => {
15
+ const drag = this.props.onDragStart(e);
16
+ if (e.preventDefault) {
17
+ e.preventDefault();
18
+ }
19
+ eventStopPropagation(e);
20
+ if (drag === null && e.button !== 0) {
21
+ return;
22
+ }
23
+ window.addEventListener('mouseup', this.onMouseUp);
24
+ window.addEventListener('mousemove', this.onMouseMove);
25
+ window.addEventListener('touchend', this.onMouseUp);
26
+ window.addEventListener('touchmove', this.onMouseMove);
27
+ this.setState({
28
+ drag
29
+ });
30
+ });
31
+ _defineProperty(this, "onMouseMove", e => {
32
+ if (this.state.drag === null) {
33
+ return;
34
+ }
35
+ if (e.preventDefault) {
36
+ e.preventDefault();
37
+ }
38
+ eventStopPropagation(e);
39
+ this.props.onDrag(e);
40
+ });
41
+ _defineProperty(this, "onMouseUp", e => {
42
+ eventStopPropagation(e);
43
+ this.cleanUp();
44
+ this.props.onDragEnd(e, this.state.drag);
45
+ this.setState({
46
+ drag: null
47
+ });
48
+ });
49
+ _defineProperty(this, "cleanUp", () => {
50
+ window.removeEventListener('mouseup', this.onMouseUp);
51
+ window.removeEventListener('mousemove', this.onMouseMove);
52
+ window.removeEventListener('touchend', this.onMouseUp);
53
+ window.removeEventListener('touchmove', this.onMouseMove);
54
+ });
55
+ _defineProperty(this, "getKnownDivProps", () => {
56
+ return createObjectWithProperties(this.props, knownDivPropertyKeys);
57
+ });
58
+ }
59
+ componentWillUnmount() {
60
+ this.cleanUp();
61
+ }
62
+ render() {
63
+ return /*#__PURE__*/React.createElement("div", Object.assign({}, this.getKnownDivProps(), {
64
+ onMouseDown: this.onMouseDown,
65
+ onTouchStart: this.onMouseDown,
66
+ className: "seatable-column-draggable"
67
+ }));
68
+ }
69
+ }
70
+ _defineProperty(Draggable, "defaultProps", {
71
+ onDragStart: () => true,
72
+ onDragEnd: () => {},
73
+ onDrag: () => {}
74
+ });
75
+ export default Draggable;
@@ -2,6 +2,7 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import { Editor, Transforms } from '@seafile/slate';
3
3
  import slugId from 'slugid';
4
4
  import { getNodeType, isTextNode, getParentNode, generateDefaultText } from '../../core';
5
+ import { getColumnWidth } from '../seatable-column/helpers';
5
6
  import { ELEMENT_TYPE, SEATABLE_TABLE, INSERT_POSITION } from '../../constants';
6
7
  export const isInsertSeaTableTableDisabled = (editor, readonly) => {
7
8
  if (readonly) return true;
@@ -37,6 +38,10 @@ export const isInsertSeaTableTableDisabled = (editor, readonly) => {
37
38
  export const generateSeaTableTable = (table_id, editor) => {
38
39
  const table = editor.getTableById(table_id);
39
40
  const columnKeys = table.columns.map(item => item.key) || [];
41
+ const columnWidth = {};
42
+ table.columns.forEach(item => {
43
+ columnWidth[item.key] = getColumnWidth(item);
44
+ });
40
45
  return {
41
46
  id: slugId.nice(),
42
47
  type: SEATABLE_TABLE,
@@ -48,6 +53,7 @@ export const generateSeaTableTable = (table_id, editor) => {
48
53
  show_record_numbers: false,
49
54
  alternate_color: true,
50
55
  select_column_display_option_color: true,
56
+ column_width: columnWidth,
51
57
  children: [generateDefaultText()]
52
58
  };
53
59
  };
@@ -8,6 +8,7 @@ import SortSetter from '../seatable-settings/sort-setter';
8
8
  import HideColumnSetter from '../seatable-settings/hide-column-setter';
9
9
  import { useScrollContext } from '../../../../hooks/use-scroll-context';
10
10
  import { updateSeaTableTable } from '../helpers';
11
+ import { getColumnWidth } from '../../seatable-column/helpers';
11
12
  import './index.css';
12
13
  const TablesList = _ref => {
13
14
  let {
@@ -156,6 +157,10 @@ export default function OpMenu(_ref3) {
156
157
  } = item;
157
158
  setSelectedTableText(name);
158
159
  const table = editor.tables.find(item => item._id === _id);
160
+ const columnWidth = {};
161
+ table.columns.forEach(item => {
162
+ columnWidth[item.key] = getColumnWidth(item);
163
+ });
159
164
  updatePageSettings({
160
165
  table_id: _id,
161
166
  filters: [],
@@ -164,6 +169,7 @@ export default function OpMenu(_ref3) {
164
169
  shown_column_keys: table.columns.map(item => item.key),
165
170
  show_record_numbers: false,
166
171
  alternate_color: true,
172
+ column_width: columnWidth,
167
173
  select_column_display_option_color: true
168
174
  });
169
175
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -3,6 +3,7 @@
3
3
  overflow: auto;
4
4
  border: 2px solid transparent;
5
5
  position: relative;
6
+ user-select: none;
6
7
  }
7
8
 
8
9
  .seatable-view-container.selected {
@@ -13,10 +14,39 @@
13
14
  margin: 0;
14
15
  }
15
16
 
17
+ .seatable-view-container .seatable-column-editor-wrapper {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ position: absolute;
22
+ left: 0;
23
+ bottom: 0;
24
+ width: 100%;
25
+ height: 30px;
26
+ }
27
+ .seatable-view-container .seatable-column-editor-wrapper .seatable-column-width-tip {
28
+ background-color: #0009;
29
+ border-radius: 3px;
30
+ color: #fff;
31
+ font-size: 13px;
32
+ line-height: 20px;
33
+ padding: 2px 8px;
34
+ }
35
+
16
36
  .seatable-view-column-header-row th {
17
37
  display: inline-flex;
18
38
  align-items: center;
19
39
  justify-content: flex-start;
40
+ flex: unset !important;
41
+ }
42
+
43
+ .seatable-view-column-header-row .seatable-view-column-header-cell {
44
+ position: relative;
45
+ }
46
+
47
+ .seatable-view-column-header-row .seatable-view-column-header-cell span:first-child {
48
+ white-space: nowrap;
49
+ overflow: hidden;
20
50
  }
21
51
 
22
52
  .seatable-view-body-column-cell {
@@ -27,6 +57,7 @@
27
57
  text-overflow: ellipsis;
28
58
  overflow: hidden;
29
59
  word-break: break-all;
60
+ flex: unset !important
30
61
  }
31
62
 
32
63
  .seatable-view-column-header-row .first-cell,
@@ -1,22 +1,76 @@
1
- import React from 'react';
2
- import { getColumnWidth } from '../../seatable-column/helpers';
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
+ import React, { useEffect, useRef, useState } from 'react';
3
+ import { ReactEditor } from '@seafile/slate-react';
4
+ import { Transforms } from '@seafile/slate';
5
+ import Draggable from '../draggable';
6
+ const dragAbleStyle = {
7
+ position: 'absolute',
8
+ top: 0,
9
+ right: -3,
10
+ width: 5,
11
+ borderRadius: '3px',
12
+ zIndex: 2,
13
+ margin: '3px 0',
14
+ height: 'calc(100% - 6px)'
15
+ };
3
16
  export default function RecordHeader(_ref) {
4
17
  let {
18
+ editor,
5
19
  element,
6
- columns
20
+ columns,
21
+ isCanModifyColumnWidth
7
22
  } = _ref;
23
+ const headerCellRef = useRef({});
24
+ const {
25
+ column_width = {}
26
+ } = element;
27
+ const [columnWidthMap, setColumnWidthMap] = useState(column_width);
28
+ useEffect(() => {
29
+ setColumnWidthMap(column_width);
30
+ }, [column_width]);
31
+ const getWidthFromMouseEvent = (e, currentCell) => {
32
+ const right = e.pageX || e.touches && e.touches[0] && e.touches[0].pageX || e.changedTouches && e.changedTouches[e.changedTouches.length - 1].pageX;
33
+ const left = currentCell.getBoundingClientRect().left;
34
+ return right - left;
35
+ };
36
+ const onDrag = (e, currentCell, currentColumnKey) => {
37
+ const width = getWidthFromMouseEvent(e, currentCell);
38
+ if (width >= 80) {
39
+ const newColumnWidthMap = _objectSpread(_objectSpread({}, columnWidthMap), {}, {
40
+ [currentColumnKey]: width
41
+ });
42
+ setColumnWidthMap(newColumnWidthMap);
43
+ }
44
+ };
45
+ const onDragEnd = () => {
46
+ const path = ReactEditor.findPath(editor, element);
47
+ Transforms.setNodes(editor, {
48
+ column_width: columnWidthMap
49
+ }, {
50
+ at: [path[0]]
51
+ });
52
+ };
8
53
  return /*#__PURE__*/React.createElement("tr", {
9
54
  className: "seatable-view-column-header-row"
10
55
  }, element.show_record_numbers && /*#__PURE__*/React.createElement("th", {
11
56
  className: "seatable-view-column-header-cell first-cell"
12
57
  }), columns.map(column => {
13
- const width = getColumnWidth(column);
58
+ const width = columnWidthMap[column.key];
14
59
  return /*#__PURE__*/React.createElement("th", {
60
+ ref: ref => {
61
+ headerCellRef.current[column.key] = ref;
62
+ },
15
63
  className: "seatable-view-column-header-cell",
16
64
  key: column.key,
17
65
  style: {
18
66
  width
19
67
  }
20
- }, column.name);
68
+ }, /*#__PURE__*/React.createElement("span", null, column.name), isCanModifyColumnWidth && /*#__PURE__*/React.createElement(Draggable, {
69
+ style: dragAbleStyle,
70
+ onDrag: e => {
71
+ onDrag(e, headerCellRef.current[column.key], column.key);
72
+ },
73
+ onDragEnd: onDragEnd
74
+ }));
21
75
  }));
22
76
  }
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
2
  import { CellType } from 'dtable-utils';
3
- import { getColumnWidth } from '../../seatable-column/helpers';
4
3
  import Formatter from '../formatter';
5
4
  export default function RecordItem(_ref) {
6
5
  let {
@@ -11,12 +10,15 @@ export default function RecordItem(_ref) {
11
10
  columns,
12
11
  editor
13
12
  } = _ref;
13
+ const {
14
+ column_width = {}
15
+ } = element;
14
16
  return /*#__PURE__*/React.createElement("tr", {
15
17
  className: "seatable-view-body-column-row"
16
18
  }, element.show_record_numbers && /*#__PURE__*/React.createElement("th", {
17
19
  className: "seatable-view-body-column-cell first-cell"
18
20
  }, index), columns.map(column => {
19
- const width = getColumnWidth(column);
21
+ const width = column_width[column.key];
20
22
  let cellValue = record[column.key];
21
23
  if ([CellType.LINK, CellType.LINK_FORMULA, CellType.FORMULA].includes(column.type)) {
22
24
  cellValue = formulaRow[column.key];
@@ -6,7 +6,7 @@ export default function RecordList(_ref) {
6
6
  records,
7
7
  columns,
8
8
  element,
9
- formulaRows
9
+ formulaRows = {}
10
10
  } = _ref;
11
11
  return /*#__PURE__*/React.createElement(React.Fragment, null, records.map((record, index) => {
12
12
  const formulaRow = formulaRows[record._id] || {};
@@ -2,13 +2,15 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import React, { useCallback, useEffect, useRef, useState } from 'react';
3
3
  import classNames from 'classnames';
4
4
  import { useTranslation } from 'react-i18next';
5
- import { useReadOnly, useSelected } from '@seafile/slate-react';
5
+ import { Transforms } from '@seafile/slate';
6
+ import { useReadOnly, useSelected, ReactEditor } from '@seafile/slate-react';
6
7
  import { CellType, getFilteredRowsWithoutFormulaCalculation, sortTableRows } from 'dtable-utils';
7
8
  import Loading from '../../../../../components/loading';
8
9
  import RecordHeader from './record-header';
9
10
  import RecordList from './record-list';
10
11
  import OpMenu from '../op-menu';
11
12
  import { useScrollContext } from '../../../../hooks/use-scroll-context';
13
+ import { getColumnWidth } from '../../seatable-column/helpers';
12
14
  import './index.css';
13
15
  function SeaTableTable(_ref) {
14
16
  var _tableInfoRef$current, _tableInfoRef$current2;
@@ -19,6 +21,10 @@ function SeaTableTable(_ref) {
19
21
  children,
20
22
  editor
21
23
  } = _ref;
24
+ const {
25
+ column_width,
26
+ table_id
27
+ } = element;
22
28
  const scrollRef = useScrollContext();
23
29
  const isSelected = useSelected();
24
30
  const readOnly = useReadOnly();
@@ -27,6 +33,8 @@ function SeaTableTable(_ref) {
27
33
  const [records, setRecords] = useState([]);
28
34
  const [shownRecords, setShownRecords] = useState([]);
29
35
  const [isShowTipMessage, setIsShowTipMessage] = useState(false);
36
+ const [isShowColumnWidth, setIsShowColumnWidth] = useState(false);
37
+ const [isCanModifyColumnWidth, setIsCanModifyColumnWidth] = useState(false);
30
38
  const tableInfoRef = useRef(null);
31
39
  const {
32
40
  t
@@ -39,6 +47,23 @@ function SeaTableTable(_ref) {
39
47
  top: '',
40
48
  left: ''
41
49
  });
50
+ useEffect(() => {
51
+ // Compatible with old element data structures
52
+ if (!column_width) {
53
+ const table = editor.getTableById(table_id);
54
+ const columnWidth = {};
55
+ table.columns.forEach(item => {
56
+ columnWidth[item.key] = getColumnWidth(item);
57
+ });
58
+ const path = ReactEditor.findPath(editor, element);
59
+ Transforms.setNodes(editor, {
60
+ column_width: columnWidth
61
+ }, {
62
+ at: [path[0]]
63
+ });
64
+ }
65
+ // eslint-disable-next-line react-hooks/exhaustive-deps
66
+ }, [column_width]);
42
67
  useEffect(() => {
43
68
  const {
44
69
  table_id
@@ -184,6 +209,8 @@ function SeaTableTable(_ref) {
184
209
  useEffect(() => {
185
210
  if (!isSelected) {
186
211
  setIsShowMenu(false);
212
+ setIsShowColumnWidth(false);
213
+ setIsCanModifyColumnWidth(false);
187
214
  }
188
215
  }, [isSelected]);
189
216
  const onTableClick = useCallback(event => {
@@ -203,6 +230,12 @@ function SeaTableTable(_ref) {
203
230
  }
204
231
  setMenuPosition(newMenuPosition);
205
232
  setIsShowMenu(true);
233
+ setIsShowColumnWidth(true);
234
+ }, [readOnly]);
235
+ const onTableDoubleClick = useCallback(event => {
236
+ if (readOnly) return;
237
+ setIsShowColumnWidth(false);
238
+ setIsCanModifyColumnWidth(true);
206
239
  }, [readOnly]);
207
240
  const containerClass = classNames('seatable-view-container', {
208
241
  selected: isSelected
@@ -213,7 +246,8 @@ function SeaTableTable(_ref) {
213
246
  }), /*#__PURE__*/React.createElement("div", {
214
247
  ref: seaTableRef,
215
248
  className: containerClass,
216
- onClick: onTableClick
249
+ onClick: onTableClick,
250
+ onDoubleClick: onTableDoubleClick
217
251
  }, isShowMenu && /*#__PURE__*/React.createElement(OpMenu, {
218
252
  editor: editor,
219
253
  element: element,
@@ -224,8 +258,10 @@ function SeaTableTable(_ref) {
224
258
  'no_alternate_color': !element.alternate_color
225
259
  })
226
260
  }, /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement(RecordHeader, {
261
+ editor: editor,
227
262
  element: element,
228
- columns: columns
263
+ columns: columns,
264
+ isCanModifyColumnWidth: isCanModifyColumnWidth
229
265
  }), /*#__PURE__*/React.createElement(RecordList, {
230
266
  element: element,
231
267
  editor: editor,
@@ -238,6 +274,10 @@ function SeaTableTable(_ref) {
238
274
  count: records.length - 10
239
275
  })), readOnly && isShowTipMessage && /*#__PURE__*/React.createElement("div", {
240
276
  className: "d-print-none ml-2 m-2"
241
- }, t('Print_limit_exceeded'))), children));
277
+ }, t('Print_limit_exceeded')), !readOnly && isShowColumnWidth && !isCanModifyColumnWidth && /*#__PURE__*/React.createElement("div", {
278
+ className: "seatable-column-editor-wrapper"
279
+ }, /*#__PURE__*/React.createElement("div", {
280
+ className: "seatable-column-width-tip"
281
+ }, t('Double_click_to_enter_edit_mode_and_adjust_field_width')))), children));
242
282
  }
243
283
  export default SeaTableTable;
@@ -61,10 +61,12 @@ export default function ArticleContainer(_ref) {
61
61
  style: containerStyle
62
62
  }, React.Children.count(children) === 1 && /*#__PURE__*/React.createElement("div", {
63
63
  className: "article",
64
+ id: "sdoc-editor-print-wrapper",
64
65
  ref: articleRef,
65
66
  onClick: handelArticleClick
66
67
  }, children), React.Children.count(children) > 1 && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
67
68
  className: "article",
69
+ id: "sdoc-editor-print-wrapper",
68
70
  ref: articleRef,
69
71
  onClick: handelArticleClick
70
72
  }, children[0]), [...children.slice(1)]));
@@ -58,4 +58,12 @@ export const getMouseMoveInfo = (event, mouseDownInfo, scrollContainer) => {
58
58
  displacementX,
59
59
  displacementY
60
60
  };
61
+ };
62
+ export const createObjectWithProperties = (originalObj, properties) => {
63
+ return properties.reduce((result, property) => {
64
+ if (property in originalObj) {
65
+ result[property] = originalObj[property];
66
+ }
67
+ return result;
68
+ }, {});
61
69
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.35",
3
+ "version": "1.0.36",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "last month",
562
562
  "the_past_year": "last year",
563
563
  "the_next_numbers_of_days": "the next numbers of days",
564
- "the_past_numbers_of_days": "the past numbers of days"
564
+ "the_past_numbers_of_days": "the past numbers of days",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "в прошлом месяце",
562
562
  "the_past_year": "в прошлом году",
563
563
  "the_next_numbers_of_days": "ближайшее количество дней",
564
- "the_past_numbers_of_days": "прошедшее количество дней"
564
+ "the_past_numbers_of_days": "прошедшее количество дней",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "Double click to enter edit mode and adjust field width"
565
566
  }
@@ -561,5 +561,6 @@
561
561
  "the_past_month": "上个月",
562
562
  "the_past_year": "去年",
563
563
  "the_next_numbers_of_days": "今天之后的指定天数",
564
- "the_past_numbers_of_days": "今天之前的指定天数"
564
+ "the_past_numbers_of_days": "今天之前的指定天数",
565
+ "Double_click_to_enter_edit_mode_and_adjust_field_width" : "双击可进入编辑模式并调整字段宽度"
565
566
  }