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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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;
@@ -1862,7 +1862,8 @@ var InternalDataGrid = /*#__PURE__*/function (_Component) {
1862
1862
  footer.push( /*#__PURE__*/React.createElement(Selected, {
1863
1863
  selection: this.selected,
1864
1864
  onClear: this.handleClearSelected,
1865
- key: "selection"
1865
+ key: "selection",
1866
+ renderSelected: rowSelection.renderSelected
1866
1867
  }));
1867
1868
  }
1868
1869
  } 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.1",
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": "71b81afd6fac9ca7e66b3f527c9e6f104e9e30bd"
62
62
  }