@lemon-fe/components 1.5.6 → 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;
@@ -57,6 +57,7 @@ import CellRenderer from "./renderer/cell-renderer";
57
57
  import DetailCellRenderer from "./renderer/detali-cell-renderer";
58
58
  import HeaderRenderer from "./renderer/header-renderer";
59
59
  import { prefix, getColField, isColumn, withSyncRender, Store, Selection, getDefaultColumnTypes } from "./utils";
60
+ import { getTextWidth } from "./utils/text-width";
60
61
  import { GridApi, ColumnApi } from 'ag-grid-community';
61
62
  import 'ag-grid-enterprise';
62
63
  import { AgGridReact } from 'ag-grid-react';
@@ -1052,7 +1053,9 @@ var InternalDataGrid = /*#__PURE__*/function (_Component) {
1052
1053
  columns = _this$props8$columns === void 0 ? [] : _this$props8$columns,
1053
1054
  rowActions = _this$props8.rowActions,
1054
1055
  rowSelection = _this$props8.rowSelection,
1055
- locale = _this$props8.locale;
1056
+ locale = _this$props8.locale,
1057
+ enableEstimateInitialColumnWidth = _this$props8.enableEstimateInitialColumnWidth,
1058
+ keepInitialWidthWhenEstimate = _this$props8.keepInitialWidthWhenEstimate;
1056
1059
  var leafColIds = [];
1057
1060
  var groups = new Map();
1058
1061
  var map = function map(cols) {
@@ -1090,6 +1093,9 @@ var InternalDataGrid = /*#__PURE__*/function (_Component) {
1090
1093
  } else if (title !== undefined) {
1091
1094
  opts.headerName = title.toString();
1092
1095
  }
1096
+ if (enableEstimateInitialColumnWidth && opts.headerName && !keepInitialWidthWhenEstimate) {
1097
+ opts.initialWidth = getTextWidth(opts.headerName) * 14 + 36 + (opts.headerComponentParams !== undefined ? 24 : 0);
1098
+ }
1093
1099
 
1094
1100
  // render
1095
1101
  if (render !== undefined) {
@@ -1856,7 +1862,8 @@ var InternalDataGrid = /*#__PURE__*/function (_Component) {
1856
1862
  footer.push( /*#__PURE__*/React.createElement(Selected, {
1857
1863
  selection: this.selected,
1858
1864
  onClear: this.handleClearSelected,
1859
- key: "selection"
1865
+ key: "selection",
1866
+ renderSelected: rowSelection.renderSelected
1860
1867
  }));
1861
1868
  }
1862
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;
@@ -282,4 +296,12 @@ export interface DataGridProps<TData> extends Omit<AgGridReactProps<TData>, 'row
282
296
  defaultColDef?: ColDef<TData> & {
283
297
  useValueFormatterForExport?: boolean;
284
298
  };
299
+ /**
300
+ * @depscription 启用预估初始列宽 启用后根据字符长度计算宽度
301
+ */
302
+ enableEstimateInitialColumnWidth?: boolean;
303
+ /**
304
+ * @depscription 与enableEstimateInitialColumnWidth搭配使用,如果col传入了initialWidth,则不会进行预估初始列宽设置
305
+ */
306
+ keepInitialWidthWhenEstimate?: boolean;
285
307
  }
@@ -1,5 +1,5 @@
1
- import type { DataGridLocale } from './locale/locale';
2
- import type { ColType, ColGroupType, PathType } from './typings';
1
+ import type { DataGridLocale } from '../locale/locale';
2
+ import type { ColType, ColGroupType, PathType } from '../typings';
3
3
  import { Subject } from '@lemon-fe/utils';
4
4
  import type { ColDef, ColGroupDef } from 'ag-grid-community';
5
5
  export declare const prefix: (val?: string | undefined) => string;
@@ -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>>;
@@ -13,9 +13,9 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
13
13
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
14
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
15
15
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
16
- import { prefixClassName } from "../utils";
17
- import CellDeleteRender from "./renderer/cell-delete-renderer";
18
- import CellIndexRender from "./renderer/cell-index-renderer";
16
+ import { prefixClassName } from "../../utils";
17
+ import CellDeleteRender from "../renderer/cell-delete-renderer";
18
+ import CellIndexRender from "../renderer/cell-index-renderer";
19
19
  import { Subject } from '@lemon-fe/utils';
20
20
  import { get as _get, set as _set } from 'lodash';
21
21
  import moment from 'moment';
@@ -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
  }]);
@@ -0,0 +1 @@
1
+ export declare function getTextWidth(text: string): number;
@@ -0,0 +1,79 @@
1
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
2
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
3
+ 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; }
4
+ export function getTextWidth(text) {
5
+ var width = 0;
6
+ var _iterator = _createForOfIteratorHelper(text),
7
+ _step;
8
+ try {
9
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
10
+ var char = _step.value;
11
+ var code = char.codePointAt(0);
12
+
13
+ // 东南亚文字中的组合音标 / 附加符号不单独占宽
14
+ if (isCombiningMark(code)) {
15
+ continue;
16
+ }
17
+
18
+ // CJK 中文、日文、韩文及其全角标点 / 符号
19
+ if (isCJK(code) || isCJKSymbol(code) || isFullWidthSymbol(code)) {
20
+ width += 1;
21
+ continue;
22
+ }
23
+
24
+ // 泰文、高棉文、缅甸文、老挝文;马来文 / 越南语 / 英文使用拉丁字符规则
25
+ if (isSEAComplexScript(code)) {
26
+ width += 1;
27
+ continue;
28
+ }
29
+
30
+ // 拉丁字母、数字、标点;覆盖英文、马来文、越南语预组合字符
31
+ width += 0.6;
32
+ }
33
+ } catch (err) {
34
+ _iterator.e(err);
35
+ } finally {
36
+ _iterator.f();
37
+ }
38
+ return width;
39
+ }
40
+ function isCJK(code) {
41
+ return code >= 0x3400 && code <= 0x4dbf ||
42
+ // CJK扩展
43
+ code >= 0x4e00 && code <= 0x9fff ||
44
+ // 中文
45
+ code >= 0x20000 && code <= 0x2ebef ||
46
+ // CJK扩展B-I
47
+ code >= 0x3040 && code <= 0x30ff ||
48
+ // 日文
49
+ code >= 0xac00 && code <= 0xd7af // 韩文
50
+ ;
51
+ }
52
+ function isCJKSymbol(code) {
53
+ return code >= 0x3000 && code <= 0x303f;
54
+ }
55
+ function isSEAComplexScript(code) {
56
+ return code >= 0x0e00 && code <= 0x0e7f ||
57
+ // Thai
58
+ code >= 0x1780 && code <= 0x17ff ||
59
+ // Khmer
60
+ code >= 0x1000 && code <= 0x109f ||
61
+ // Myanmar
62
+ code >= 0x0e80 && code <= 0x0eff // Lao
63
+ ;
64
+ }
65
+ function isCombiningMark(code) {
66
+ return code >= 0x0300 && code <= 0x036f ||
67
+ // Vietnamese and other Latin combining marks
68
+ code === 0x0e31 || code >= 0x0e34 && code <= 0x0e3a || code >= 0x0e47 && code <= 0x0e4e ||
69
+ // Thai vowels and tones
70
+ code === 0x0eb1 || code >= 0x0eb4 && code <= 0x0ebc || code >= 0x0ec8 && code <= 0x0ece ||
71
+ // Lao vowels and tones
72
+ code >= 0x102b && code <= 0x103e ||
73
+ // Myanmar vowel signs and marks
74
+ code >= 0x17b4 && code <= 0x17d3 // Khmer vowel signs and signs
75
+ ;
76
+ }
77
+ function isFullWidthSymbol(code) {
78
+ return code >= 0xff01 && code <= 0xff60;
79
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lemon-fe/components",
3
- "version": "1.5.6",
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": "1098e017cce5db0a5353967a7deac0b690f37572"
61
+ "gitHead": "71b81afd6fac9ca7e66b3f527c9e6f104e9e30bd"
62
62
  }