@lemon-fe/components 1.5.7-alpha.0 → 1.5.7-alpha.2

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.
@@ -1,7 +1,13 @@
1
- import React from 'react';
1
+ import { type ReactNode, type ReactElement } from 'react';
2
2
  import { type Selection } from '../utils';
3
- declare const _default: React.NamedExoticComponent<{
4
- selection: Selection<any>;
3
+ declare type SelectedProps<T> = {
4
+ selection: Selection<T>;
5
5
  onClear: () => void;
6
- }>;
7
- export default _default;
6
+ renderSelected?: (params: {
7
+ selectedKeys: string[];
8
+ selectedRows: T[];
9
+ clearNode: ReactElement;
10
+ }) => ReactNode;
11
+ };
12
+ declare const Selected: <T = unknown>(props: SelectedProps<T>) => ReactElement | null;
13
+ export default Selected;
@@ -4,28 +4,54 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
4
4
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
5
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
6
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
- import React, { useEffect, useState, memo } from 'react';
7
+ import React, { useEffect, useState, memo, useMemo } from 'react';
8
8
  import { useLocaleReceiver } from "../../locale-receiver";
9
9
  import { parseLocalTemplate } from "../../locale/locale";
10
10
  import { prefix } from "../utils";
11
- export default /*#__PURE__*/memo(function Selected(props) {
11
+ function SelectedImpl(props) {
12
12
  var selection = props.selection,
13
- onClear = props.onClear;
14
- var _useState = useState(selection.getKeys()),
13
+ onClear = props.onClear,
14
+ renderSelected = props.renderSelected;
15
+ var _useState = useState(function () {
16
+ return selection.getSelected();
17
+ }),
15
18
  _useState2 = _slicedToArray(_useState, 2),
16
- keys = _useState2[0],
17
- setKeys = _useState2[1];
19
+ selected = _useState2[0],
20
+ setSelected = _useState2[1];
18
21
  var _useLocaleReceiver = useLocaleReceiver('DataGrid'),
19
22
  _useLocaleReceiver2 = _slicedToArray(_useLocaleReceiver, 1),
20
23
  dataGridLocale = _useLocaleReceiver2[0];
21
24
  useEffect(function () {
22
- return selection.listen(setKeys);
23
- }, []);
24
- return keys.length > 0 ? /*#__PURE__*/React.createElement("span", {
25
- className: prefix('selected')
26
- }, parseLocalTemplate(dataGridLocale.selectedTipText, {
27
- length: keys.length
28
- }), /*#__PURE__*/React.createElement("a", {
25
+ return selection.listen(function () {
26
+ setSelected(new Map(selection.getSelected()));
27
+ });
28
+ }, [selection]);
29
+ var _useMemo = useMemo(function () {
30
+ var keys = [];
31
+ var rows = [];
32
+ selected.forEach(function (val, key) {
33
+ if (val) {
34
+ rows.push(val);
35
+ }
36
+ keys.push(key);
37
+ });
38
+ return [keys, rows];
39
+ }, [selected]),
40
+ _useMemo2 = _slicedToArray(_useMemo, 2),
41
+ selectedKeys = _useMemo2[0],
42
+ selectedRows = _useMemo2[1];
43
+ var clearNode = /*#__PURE__*/React.createElement("a", {
29
44
  onClick: onClear
30
- }, dataGridLocale.clearSelectedText)) : null;
31
- });
45
+ }, dataGridLocale.clearSelectedText);
46
+ return selected.size > 0 ? /*#__PURE__*/React.createElement("span", {
47
+ className: prefix('selected')
48
+ }, renderSelected ? renderSelected({
49
+ clearNode: clearNode,
50
+ selectedKeys: selectedKeys,
51
+ selectedRows: selectedRows
52
+ }) : /*#__PURE__*/React.createElement(React.Fragment, null, clearNode, parseLocalTemplate(dataGridLocale.selectedTipText, {
53
+ length: selected.size
54
+ }))) : null;
55
+ }
56
+ var Selected = /*#__PURE__*/memo(SelectedImpl);
57
+ export default Selected;
@@ -114,6 +114,7 @@ var defaultColDef = {
114
114
  initialWidth: 140,
115
115
  suppressMenu: true
116
116
  };
117
+ var ESTIMATE_INITIAL_COLUMN_MAX_WIDTH = 400;
117
118
  var defaultComponents = {
118
119
  agColumnHeader: HeaderRenderer,
119
120
  agColumnGroupHeader: HeaderRenderer,
@@ -1094,7 +1095,7 @@ var InternalDataGrid = /*#__PURE__*/function (_Component) {
1094
1095
  opts.headerName = title.toString();
1095
1096
  }
1096
1097
  if (enableEstimateInitialColumnWidth && opts.headerName && !keepInitialWidthWhenEstimate) {
1097
- opts.initialWidth = getTextWidth(opts.headerName) * 14 + 36 + (opts.headerComponentParams !== undefined ? 24 : 0);
1098
+ opts.initialWidth = Math.min(getTextWidth(opts.headerName) * 14 + 36 + (opts.headerComponentParams !== undefined ? 24 : 0), ESTIMATE_INITIAL_COLUMN_MAX_WIDTH);
1098
1099
  }
1099
1100
 
1100
1101
  // render
@@ -1862,7 +1863,8 @@ var InternalDataGrid = /*#__PURE__*/function (_Component) {
1862
1863
  footer.push( /*#__PURE__*/React.createElement(Selected, {
1863
1864
  selection: this.selected,
1864
1865
  onClear: this.handleClearSelected,
1865
- key: "selection"
1866
+ key: "selection",
1867
+ renderSelected: rowSelection.renderSelected
1866
1868
  }));
1867
1869
  }
1868
1870
  } else {
@@ -340,7 +340,7 @@
340
340
  color: #333;
341
341
 
342
342
  a {
343
- margin-left: @space-h;
343
+ margin-right: @space-h;
344
344
  }
345
345
  }
346
346
 
@@ -87,6 +87,20 @@ export declare type RowSelectionType<T = any> = {
87
87
  * @description 是否按页面显示的数据进行全选
88
88
  */
89
89
  headerCheckboxSelectionFilteredOnly?: boolean;
90
+ /**
91
+ * @description 自定义已选结果显示
92
+ * @param params.selectedKeys 当前选中的行 key 列表(包含没有加载数据的 key)
93
+ * @param params.selectedRows 当前已有数据的选中行列表(已过滤掉为 null 的项)
94
+ * @param params.clearNode 触发清空选中项的交互节点
95
+ * 为什么选择 keys 和 rows 分成两个属性:
96
+ * 因为 rowSelection 的初始 selectedRowKeys 可能会被赋值,此时部分已选择项由于没有数据都是 null,
97
+ * 为了便于外部处理,selectedRows 中已经过滤掉了这些项。
98
+ */
99
+ renderSelected?: (params: {
100
+ selectedKeys: string[];
101
+ selectedRows: T[];
102
+ clearNode: ReactElement;
103
+ }) => ReactNode;
90
104
  };
91
105
  export declare type PaginationType = {
92
106
  current?: number;
@@ -36,18 +36,18 @@ export declare class Selection<T> {
36
36
  private dirty;
37
37
  private observers;
38
38
  constructor(keys?: string[]);
39
- flush(): readonly [string[], T[]];
40
- get(id: string): T | undefined;
39
+ flush(): readonly [string[], (T | null)[]];
40
+ get(id: string): T | null | undefined;
41
41
  has(id: string): boolean;
42
- set(id: string, data: T): void;
42
+ set(id: string, data: T | null): void;
43
43
  delete(id: string): void;
44
44
  clear(): void;
45
- clone(data: Map<string, T>): void;
45
+ clone(data: Map<string, T | null>): void;
46
46
  isSameKeys(keys: string[]): boolean;
47
47
  isDirty(): boolean;
48
- getKeys(): string[];
48
+ getSelected(): Map<string, T | null>;
49
49
  forEach(cb: (key: string) => void): void;
50
- listen(cb: (keys: string[]) => void): () => void;
50
+ listen(cb: () => void): () => void;
51
51
  }
52
52
  export declare const columnTypes: Record<string, ColDef>;
53
53
  export declare function getDefaultColumnTypes(locale: DataGridLocale): Record<string, ColDef<any>>;
@@ -116,21 +116,20 @@ export var Store = /*#__PURE__*/function () {
116
116
  }();
117
117
  export var Selection = /*#__PURE__*/function () {
118
118
  function Selection() {
119
- var _keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
119
+ var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
120
120
  _classCallCheck(this, Selection);
121
121
  _defineProperty(this, "record", void 0);
122
122
  _defineProperty(this, "keys", void 0);
123
123
  _defineProperty(this, "dirty", false);
124
124
  _defineProperty(this, "observers", new Set());
125
- this.record = new Map(_keys.map(function (key) {
125
+ this.record = new Map(keys.map(function (key) {
126
126
  return [key, null];
127
127
  }));
128
- this.keys = _keys;
128
+ this.keys = keys;
129
129
  }
130
130
  _createClass(Selection, [{
131
131
  key: "flush",
132
132
  value: function flush() {
133
- var _this2 = this;
134
133
  var result = _toConsumableArray(this.record);
135
134
  var keys = [];
136
135
  var values = [];
@@ -141,7 +140,7 @@ export var Selection = /*#__PURE__*/function () {
141
140
  this.keys = keys;
142
141
  this.dirty = false;
143
142
  _toConsumableArray(this.observers).forEach(function (cb) {
144
- return cb(_this2.keys);
143
+ return cb();
145
144
  });
146
145
  return [keys, values];
147
146
  }
@@ -185,6 +184,8 @@ export var Selection = /*#__PURE__*/function () {
185
184
  if (this.dirty) {
186
185
  this.flush();
187
186
  }
187
+
188
+ /** 提高比较的效率,浅比较虽然比较安全,但是大部分场景这样足矣 */
188
189
  return this.keys === keys;
189
190
  }
190
191
  }, {
@@ -193,22 +194,24 @@ export var Selection = /*#__PURE__*/function () {
193
194
  return this.dirty;
194
195
  }
195
196
  }, {
196
- key: "getKeys",
197
- value: function getKeys() {
198
- return this.keys;
197
+ key: "getSelected",
198
+ value: function getSelected() {
199
+ return this.record;
199
200
  }
200
201
  }, {
201
202
  key: "forEach",
202
203
  value: function forEach(cb) {
203
- this.keys.forEach(cb);
204
+ this.record.forEach(function (val, key) {
205
+ return cb(key);
206
+ });
204
207
  }
205
208
  }, {
206
209
  key: "listen",
207
210
  value: function listen(cb) {
208
- var _this3 = this;
211
+ var _this2 = this;
209
212
  this.observers.add(cb);
210
213
  return function () {
211
- _this3.observers.delete(cb);
214
+ _this2.observers.delete(cb);
212
215
  };
213
216
  }
214
217
  }]);
@@ -21,13 +21,13 @@ export function getTextWidth(text) {
21
21
  continue;
22
22
  }
23
23
 
24
- // 泰文、高棉文、缅甸文、老挝文;马来文 / 英文使用拉丁字符规则
24
+ // 泰文、高棉文、缅甸文、老挝文;马来文 / 越南语 / 英文使用拉丁字符规则
25
25
  if (isSEAComplexScript(code)) {
26
26
  width += 1;
27
27
  continue;
28
28
  }
29
29
 
30
- // 拉丁字母、数字、标点
30
+ // 拉丁字母、数字、标点;覆盖英文、马来文、越南语预组合字符
31
31
  width += 0.6;
32
32
  }
33
33
  } catch (err) {
@@ -64,7 +64,7 @@ function isSEAComplexScript(code) {
64
64
  }
65
65
  function isCombiningMark(code) {
66
66
  return code >= 0x0300 && code <= 0x036f ||
67
- // Combining Diacritical Marks
67
+ // Vietnamese and other Latin combining marks
68
68
  code === 0x0e31 || code >= 0x0e34 && code <= 0x0e3a || code >= 0x0e47 && code <= 0x0e4e ||
69
69
  // Thai vowels and tones
70
70
  code === 0x0eb1 || code >= 0x0eb4 && code <= 0x0ebc || code >= 0x0ec8 && code <= 0x0ece ||
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemon-fe/components",
3
- "version": "1.5.7-alpha.0",
3
+ "version": "1.5.7-alpha.2",
4
4
  "description": "> TODO: description",
5
5
  "homepage": "",
6
6
  "license": "MIT",
@@ -58,5 +58,5 @@
58
58
  "publishConfig": {
59
59
  "registry": "https://registry.npmjs.org"
60
60
  },
61
- "gitHead": "f9d9bc687268ce21388513f69bda29c79f7aa6b6"
61
+ "gitHead": "f4344479e739f297b7901b3ed3f3d91e45b5074a"
62
62
  }