@nokecy/qc-ui 1.1.41 → 1.1.43

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.
Files changed (41) hide show
  1. package/dist/cjs/ag-grid-plus/ag-gridPlus.js +84 -36
  2. package/dist/cjs/ag-grid-plus/interface.d.ts +17 -1
  3. package/dist/cjs/ag-grid-plus/queryForm/queryForm.js +1 -1
  4. package/dist/cjs/ag-grid-plus/shared/NoRowsOverlay.d.ts +22 -0
  5. package/dist/cjs/ag-grid-plus/shared/NoRowsOverlay.js +41 -0
  6. package/dist/cjs/ag-grid-plus/utils/columnProcessors.d.ts +16 -0
  7. package/dist/cjs/ag-grid-plus/utils/columnProcessors.js +26 -0
  8. package/dist/cjs/ag-grid-plus/utils/constants.d.ts +6 -0
  9. package/dist/cjs/ag-grid-plus/utils/constants.js +7 -1
  10. package/dist/cjs/ag-grid-plus/utils/emptyState.d.ts +42 -0
  11. package/dist/cjs/ag-grid-plus/utils/emptyState.js +75 -0
  12. package/dist/cjs/array-table/utils.d.ts +12 -1
  13. package/dist/cjs/array-table/utils.js +51 -1
  14. package/dist/cjs/deleteConfirm/index.d.ts +19 -2
  15. package/dist/cjs/deleteConfirm/index.js +34 -14
  16. package/dist/cjs/dialogSelect/index.js +23 -9
  17. package/dist/cjs/fullScreenAlert/index.d.ts +11 -0
  18. package/dist/cjs/fullScreenAlert/index.js +10 -3
  19. package/dist/cjs/fullScreenAlert/index.less +31 -0
  20. package/dist/esm/ag-grid-plus/ag-gridPlus.js +84 -36
  21. package/dist/esm/ag-grid-plus/interface.d.ts +17 -1
  22. package/dist/esm/ag-grid-plus/queryForm/queryForm.js +1 -1
  23. package/dist/esm/ag-grid-plus/shared/NoRowsOverlay.d.ts +22 -0
  24. package/dist/esm/ag-grid-plus/shared/NoRowsOverlay.js +35 -0
  25. package/dist/esm/ag-grid-plus/utils/columnProcessors.d.ts +16 -0
  26. package/dist/esm/ag-grid-plus/utils/columnProcessors.js +25 -0
  27. package/dist/esm/ag-grid-plus/utils/constants.d.ts +6 -0
  28. package/dist/esm/ag-grid-plus/utils/constants.js +7 -1
  29. package/dist/esm/ag-grid-plus/utils/emptyState.d.ts +42 -0
  30. package/dist/esm/ag-grid-plus/utils/emptyState.js +66 -0
  31. package/dist/esm/array-table/utils.d.ts +12 -1
  32. package/dist/esm/array-table/utils.js +51 -1
  33. package/dist/esm/deleteConfirm/index.d.ts +19 -2
  34. package/dist/esm/deleteConfirm/index.js +34 -14
  35. package/dist/esm/dialogSelect/index.js +23 -9
  36. package/dist/esm/fullScreenAlert/index.d.ts +11 -0
  37. package/dist/esm/fullScreenAlert/index.js +11 -4
  38. package/dist/esm/fullScreenAlert/index.less +31 -0
  39. package/dist/umd/qc-ui.min.css +1 -1
  40. package/dist/umd/qc-ui.min.js +1 -1
  41. package/package.json +1 -1
@@ -4,7 +4,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.useArrayTableSources = exports.useArrayTableActions = exports.useAddition = exports.isColumnComponent = exports.buildArrayTableColumns = exports.LazyAgField = void 0;
7
+ exports.useArrayTableSources = exports.useArrayTableActions = exports.useAddition = exports.isColumnComponent = exports.buildArrayTableColumns = exports.LazyReadOnlyText = exports.LazyAgField = void 0;
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
  var _react2 = require("@formily/react");
10
10
  var _shared = require("@formily/shared");
@@ -204,6 +204,41 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
204
204
  });
205
205
  };
206
206
 
207
+ /**
208
+ * 反应式只读文本渲染器(列级 readPretty 在「可编辑表」里的展示列)。
209
+ *
210
+ * 只读纯文本快路径(valueFormatter)经 AG-Grid 缓存 params.value 取值,setValuesIn 程序化原地改值
211
+ * 不会刷新该格 → 自动带出的外码/描述等只读展示列空白。本渲染器 Observer 读可观察 record[dataKey],
212
+ * 保持 readPretty 纯文本观感(不挂 Formily 树、不可点编辑),但能跟随 setValuesIn 即时刷新。
213
+ *
214
+ * 仅用于「可编辑表的列级 readPretty 展示列」;「整表 readPretty」(明细/详情页,数据经 setValues 整体
215
+ * 加载,行引用整体替换→AG-Grid 自然刷新)仍走更廉价的静态 valueFormatter 快路径。@author nokecy
216
+ */
217
+ var LazyReadOnlyText = exports.LazyReadOnlyText = function LazyReadOnlyText(params) {
218
+ var _fieldSchema$name2;
219
+ var value = params.value,
220
+ record = params.data,
221
+ colDef = params.colDef,
222
+ formatter = params.formatter,
223
+ columnProps = params.columnProps,
224
+ fieldSchema = params.fieldSchema;
225
+ var dataKey = (_fieldSchema$name2 = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.name) !== null && _fieldSchema$name2 !== void 0 ? _fieldSchema$name2 : colDef === null || colDef === void 0 ? void 0 : colDef.field;
226
+ return /*#__PURE__*/_react.default.createElement(_react2.Observer, null, function () {
227
+ var liveValue = dataKey != null && record ? record[dataKey] : value;
228
+ var text = formatter ? formatter(liveValue, {
229
+ columnProps: columnProps,
230
+ fieldSchema: fieldSchema
231
+ }) : liveValue == null ? '' : String(liveValue);
232
+ return /*#__PURE__*/_react.default.createElement("span", {
233
+ className: "ag-array-table-readonly-text",
234
+ style: {
235
+ display: 'inline-block',
236
+ width: '100%'
237
+ }
238
+ }, text);
239
+ });
240
+ };
241
+
207
242
  // 在 Column 的子 schema 里递归找到内层数据字段(可读 x-component / x-pattern / x-reactions / enum) @author nokecy
208
243
  var findDataFieldSchema = function findDataFieldSchema(columnSchema, name) {
209
244
  if (!columnSchema || !columnSchema.properties) return null;
@@ -306,6 +341,21 @@ var buildArrayTableColumns = exports.buildArrayTableColumns = function buildArra
306
341
 
307
342
  // ① 只读纯文本
308
343
  if (readOnly && formatter) {
344
+ // 列级 readPretty 在「可编辑表」里是展示列(值可能被 setValuesIn 自动带出),静态 valueFormatter
345
+ // 读 AG-Grid 缓存值不刷新 → 反应式只读渲染。整表 readPretty(明细/详情页,数据 setValues 整体加载、
346
+ // 行引用整体替换、AG-Grid 自然刷新)仍走更廉价的静态 valueFormatter 快路径。@author nokecy
347
+ if (arrayPattern !== 'readPretty') {
348
+ return buf.concat(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
349
+ valueGetter: valueGetter
350
+ } : {}), {}, {
351
+ cellRenderer: LazyReadOnlyText,
352
+ cellRendererParams: {
353
+ formatter: formatter,
354
+ columnProps: columnProps,
355
+ fieldSchema: dataField
356
+ }
357
+ }));
358
+ }
309
359
  return buf.concat(_objectSpread(_objectSpread(_objectSpread({}, base), valueGetter ? {
310
360
  valueGetter: valueGetter
311
361
  } : {}), {}, {
@@ -4,8 +4,25 @@ export interface DeleteConfirmProps {
4
4
  title?: React.ReactNode;
5
5
  /** 确认框内容,不提供时会使用默认内容 */
6
6
  content?: React.ReactNode;
7
- /** 确认回调函数 */
8
- onConfirm: () => Promise<any>;
7
+ /**
8
+ * 确认回调。
9
+ * 会收到触发按钮的原始点击事件;返回 Promise 时等待其完成,返回普通值时立即关闭。
10
+ */
11
+ onConfirm: (event?: React.MouseEvent<HTMLElement>) => Promise<any> | any;
12
+ /**
13
+ * 主按钮文案。不传就用 antd 默认的「确定」。
14
+ * 本组件在业务里被当成通用危险操作确认用,除删除外还有「重置密码」「取消审核」等场景,
15
+ * 所以这里不写死「删除」;确实是删除时由调用方显式传 okText="删除"。
16
+ * @author nokecy
17
+ */
18
+ okText?: string;
19
+ /**
20
+ * 主按钮是否用危险色,默认 true。
21
+ * 破坏性动作的主按钮不能跟着品牌主色走——「删除」和「编辑」长得一样,点错就是丢数据。
22
+ * 少数非破坏性场景(如「确定下载?」)显式传 danger={false}。
23
+ * @author nokecy
24
+ */
25
+ danger?: boolean;
9
26
  /** 子组件(触发按钮) */
10
27
  children: React.ReactNode;
11
28
  }
@@ -8,6 +8,12 @@ var _react = _interopRequireDefault(require("react"));
8
8
  var _antd = require("antd");
9
9
  var _icons = require("@ant-design/icons");
10
10
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
12
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
14
+ 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; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
+ 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); }
11
17
  var confirm = _antd.Modal.confirm;
12
18
  /**
13
19
  * DeleteConfirm 删除确认组件
@@ -31,31 +37,45 @@ var DeleteConfirm = function DeleteConfirm(props) {
31
37
  var onConfirm = props.onConfirm,
32
38
  title = props.title,
33
39
  content = props.content,
40
+ okText = props.okText,
41
+ _props$danger = props.danger,
42
+ danger = _props$danger === void 0 ? true : _props$danger,
34
43
  children = props.children;
35
- var showPromiseConfirm = function showPromiseConfirm() {
44
+ var showPromiseConfirm = function showPromiseConfirm(event) {
36
45
  // 智能转换 title:支持字符串、ReactNode 或使用默认值
37
46
  var titleText = title || '确认操作';
38
47
 
39
- // 如果没有提供 content,生成默认内容
40
- // 只有当 title 是字符串时才拼接,否则使用通用提示
41
- var defaultContent = typeof title === 'string' ? "\u5371\u9669\u64CD\u4F5C,\u4E3A\u9632\u6B62\u8BEF\u89E6\u53D1,".concat(title) : '危险操作,为防止误触发,请确认操作';
42
- var contentText = content || defaultContent;
43
- confirm({
48
+ // 正文要说清动的是哪条、几条,这只有调用方知道,所以 content 交给调用方。
49
+ // 不传时的兜底只承诺「不可撤销」:原来的默认正文是把 title 拼进去,
50
+ // 拼出来是一句病句,而且始终没告诉用户动的是哪条数据。@author nokecy
51
+ var contentText = content || '该操作不可撤销,请确认后继续。';
52
+ confirm(_objectSpread(_objectSpread({
44
53
  title: titleText,
45
54
  icon: /*#__PURE__*/_react.default.createElement(_icons.ExclamationCircleFilled, null),
46
55
  content: contentText,
56
+ okButtonProps: {
57
+ danger: danger
58
+ }
59
+ }, okText ? {
60
+ okText: okText
61
+ } : {}), {}, {
47
62
  onOk: function onOk() {
48
63
  return new Promise(function (resolve, reject) {
49
- onConfirm().then(resolve).catch(function (error) {
50
- console.error('Oops errors!', error);
51
- reject();
52
- });
64
+ // 回调既可能返回 Promise(异步删除),也可能是同步的普通值,两种都要接住。
65
+ var result = onConfirm(event);
66
+ if (result && typeof result.then === 'function') {
67
+ result.then(resolve).catch(function (error) {
68
+ console.error('Oops errors!', error);
69
+ reject();
70
+ });
71
+ } else {
72
+ resolve(result);
73
+ }
53
74
  }).catch(function () {
54
- return void 0;
75
+ return undefined;
55
76
  });
56
- },
57
- onCancel: function onCancel() {}
58
- });
77
+ }
78
+ }));
59
79
  };
60
80
  return /*#__PURE__*/_react.default.createElement("span", {
61
81
  onClick: showPromiseConfirm
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
@@ -20,6 +19,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
20
19
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
21
20
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
22
21
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
22
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
23
23
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
24
24
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
25
25
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -142,22 +142,36 @@ var DialogSelect = function DialogSelect(props) {
142
142
  onGridReady: function onGridReady(gridReadEvent) {
143
143
  setGridApi(gridReadEvent.api);
144
144
  },
145
+ onFirstDataRendered: function onFirstDataRendered(_ref) {
146
+ var api = _ref.api;
147
+ // 多选时重开弹窗要把已经选中的行勾回来,否则用户会以为之前的选择丢了。
148
+ // 放在首屏数据渲染完成时做:弹窗是 destroyOnClose,打开的那一刻表格还没有数据。@author nokecy
149
+ if (!Array.isArray(state) || state.length === 0) return;
150
+ var key = valueField !== null && valueField !== void 0 ? valueField : 'id';
151
+ var selected = state.map(function (it) {
152
+ return it && _typeof(it) === 'object' ? it.value : it;
153
+ });
154
+ api.forEachNode(function (node) {
155
+ if (node.data && selected.includes(node.data[key])) {
156
+ node.setSelected(true);
157
+ }
158
+ });
159
+ },
145
160
  search: (columnDefs === null || columnDefs === void 0 ? void 0 : columnDefs.filter(function (i) {
146
161
  return !i.hideInSearch;
147
162
  }).length) !== 0,
148
163
  onSelectionChanged: onSelectionChanged,
149
164
  rowSelection: props.mode === 'multiple' ? props.mode : 'single',
150
- onRowDoubleClicked: function onRowDoubleClicked(_ref) {
151
- var data = _ref.data;
165
+ onRowDoubleClicked: function onRowDoubleClicked(_ref2) {
166
+ var data = _ref2.data;
152
167
  setFalse();
153
168
  setState(getValue([data]));
154
- if (onChangeItem) onChangeItem(props.mode === 'multiple' ? [data] : {
155
- label: data.name,
156
- value: data.code
157
- });
169
+ // 回传完整数据行:原来这里硬编码成 { label: data.name, value: data.code },
170
+ // 与「确定」按钮走的 handleOk 口径不一致,且对没有 name/code 字段的实体直接取到 undefined。@author nokecy
171
+ if (onChangeItem) onChangeItem(props.mode === 'multiple' ? [data] : data);
158
172
  },
159
173
  request: ( /*#__PURE__*/function () {
160
- var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, _, record) {
174
+ var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(params, _, record) {
161
175
  var _props$pagedApiAdapte;
162
176
  var adapter, data, requestData;
163
177
  return _regeneratorRuntime().wrap(function _callee$(_context) {
@@ -187,7 +201,7 @@ var DialogSelect = function DialogSelect(props) {
187
201
  }, _callee);
188
202
  }));
189
203
  return function (_x, _x2, _x3) {
190
- return _ref2.apply(this, arguments);
204
+ return _ref3.apply(this, arguments);
191
205
  };
192
206
  }()),
193
207
  columnDefs: columnDefs
@@ -9,6 +9,17 @@ export interface FullScreenAlertProps {
9
9
  onChange?: (active: boolean) => void;
10
10
  /** 自动关闭时间(毫秒),默认3000ms */
11
11
  duration?: number;
12
+ /**
13
+ * 中央提示语。不传时按 type 给「成功」/「失败」。
14
+ * @author nokecy
15
+ */
16
+ message?: React.ReactNode;
17
+ /**
18
+ * 是否显示中央的图标与文字,默认 true。
19
+ * 只靠边框颜色区分成功与失败,对色觉障碍者等于零反馈;这一层是给状态加的第二种编码。
20
+ * @author nokecy
21
+ */
22
+ showIcon?: boolean;
12
23
  /** 其他 HTML div 属性 */
13
24
  [key: string]: any;
14
25
  }
@@ -5,9 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
+ var _icons = require("@ant-design/icons");
8
9
  var _react = _interopRequireWildcard(require("react"));
9
10
  require("./index.less");
10
- var _excluded = ["active", "type", "onChange", "duration"];
11
+ var _excluded = ["active", "type", "onChange", "duration", "message", "showIcon"];
11
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
12
13
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
14
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -41,6 +42,9 @@ var FullScreenAlert = function FullScreenAlert(props) {
41
42
  onChange = props.onChange,
42
43
  _props$duration = props.duration,
43
44
  duration = _props$duration === void 0 ? 3000 : _props$duration,
45
+ message = props.message,
46
+ _props$showIcon = props.showIcon,
47
+ showIcon = _props$showIcon === void 0 ? true : _props$showIcon,
44
48
  restProps = _objectWithoutProperties(props, _excluded);
45
49
  var timerRef = (0, _react.useRef)();
46
50
  var _useState = (0, _react.useState)(activeProps),
@@ -75,8 +79,11 @@ var FullScreenAlert = function FullScreenAlert(props) {
75
79
  return null;
76
80
  }
77
81
  var className = ['alertOverlay', 'alert-active', type === 'error' ? 'errorOverlay' : 'successOverlay'].join(' ');
78
- return /*#__PURE__*/_react.default.createElement("div", _extends({
82
+ var isError = type === 'error';
83
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", _extends({
79
84
  className: className
80
- }, restProps), /*#__PURE__*/_react.default.createElement("div", null));
85
+ }, restProps), /*#__PURE__*/_react.default.createElement("div", null)), showIcon ? /*#__PURE__*/_react.default.createElement("div", {
86
+ className: "alertBadge ".concat(isError ? 'alertBadge-error' : 'alertBadge-success')
87
+ }, isError ? /*#__PURE__*/_react.default.createElement(_icons.CloseCircleFilled, null) : /*#__PURE__*/_react.default.createElement(_icons.CheckCircleFilled, null), /*#__PURE__*/_react.default.createElement("span", null, message !== null && message !== void 0 ? message : isError ? '失败' : '成功')) : null);
81
88
  };
82
89
  var _default = exports.default = FullScreenAlert;
@@ -131,3 +131,34 @@
131
131
  opacity: 0;
132
132
  }
133
133
  }
134
+
135
+ /* 中央状态徽标:给成功/失败加上颜色之外的第二种编码(图标 + 文字)。
136
+ 只靠绿边框/红边框区分,对色觉障碍者等于没有反馈;车间侧光屏上也常常看不出色差。
137
+ 放在闪烁层之外,所以它不跟着 blink 一起忽明忽暗。@author nokecy */
138
+ .alertBadge {
139
+ position: absolute;
140
+ top: 50%;
141
+ left: 50%;
142
+ z-index: 2;
143
+ display: flex;
144
+ flex-direction: column;
145
+ align-items: center;
146
+ gap: 12px;
147
+ font-size: 28px;
148
+ font-weight: 700;
149
+ text-shadow: 0 1px 2px rgb(255 255 255 / 80%);
150
+ transform: translate(-50%, -50%);
151
+ pointer-events: none;
152
+
153
+ .anticon {
154
+ font-size: 128px;
155
+ }
156
+ }
157
+
158
+ .alertBadge-success {
159
+ color: green;
160
+ }
161
+
162
+ .alertBadge-error {
163
+ color: red;
164
+ }
@@ -1,4 +1,4 @@
1
- var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "enableClickSelection", "rowSelection", "useNativeTreeFilter", "entityType"];
1
+ var _excluded = ["style", "loading", "params", "request", "dataSource", "treeKeyName", "treeParentName", "rowData", "gridRef", "headerTitle", "toolBarRender", "search", "hideTool", "onGridReady", "gridKey", "children", "defaultSearchExpand", "overlayNoRowsTemplateText", "queryDefaultRows", "onSelectedRowsChange", "emptyState", "accessible", "enableClickSelection", "rowSelection", "useNativeTreeFilter", "entityType"];
2
2
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
3
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
4
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
@@ -35,6 +35,7 @@ import ToolBar from "./toolBar";
35
35
  import SettingItem from "./settingItem";
36
36
  import { RedoOutlined, FilterOutlined } from '@ant-design/icons';
37
37
  import { convertFilterModel, dateTimeValueFormatter, dateValueFormatter, flatten, toTree } from "./utils";
38
+ import { toColumnType } from "./utils/columnProcessors";
38
39
  import AdvancedQueryBuilder from "./queryForm/AdvancedQueryBuilder";
39
40
  import { v4 as uuidv4 } from 'uuid';
40
41
  import Setting from "./setting";
@@ -42,6 +43,9 @@ import { useGridPlusColumnState } from '.';
42
43
  import { useRowId } from "./hooks/useRowId";
43
44
  import _, { isArray } from 'lodash';
44
45
  import CustomGroupCellRenderer from "./_utils/customGroupCellRenderer";
46
+ import NoRowsOverlay from "./shared/NoRowsOverlay";
47
+ import { DEFAULT_PAGE_SIZE_OPTIONS } from "./utils/constants";
48
+ import { hasEffectiveFilter, resolveEmptyBranch, resolveEmptyText } from "./utils/emptyState";
45
49
  import processColumnGroups from "./_utils/processColumnGroups";
46
50
  import flattenColumnState from "./_utils/processFormColumnState";
47
51
  import { Select } from '@formily/antd-v5';
@@ -51,7 +55,6 @@ import { QueryFormContext } from "./context/queryFormContext";
51
55
  import { useGridSchemes } from "./context/useSchemeManager";
52
56
  import { useSchemeDataFlow } from "./context/useSchemeDataFlow";
53
57
  import { extractItemsOrder, extractHiddenFields } from "./shared/utils/schemeDataMigration";
54
- import { createSafeHtmlTemplate } from "./utils/sanitize";
55
58
  import { computeAggregationRow } from "./utils/aggregation";
56
59
  import { sortFormItemsByOrder, filterHiddenFormItems } from "./utils/queryFormDerivation";
57
60
  import { filterVisibleSelectedRows } from "./utils/rowSelection";
@@ -95,6 +98,9 @@ function AgGridPlus(props) {
95
98
  overlayNoRowsTemplateText = props.overlayNoRowsTemplateText,
96
99
  queryDefaultRows = props.queryDefaultRows,
97
100
  onSelectedRowsChange = props.onSelectedRowsChange,
101
+ emptyState = props.emptyState,
102
+ _props$accessible = props.accessible,
103
+ accessible = _props$accessible === void 0 ? true : _props$accessible,
98
104
  _props$enableClickSel = props.enableClickSelection,
99
105
  enableClickSelection = _props$enableClickSel === void 0 ? true : _props$enableClickSel,
100
106
  propsRowSelection = props.rowSelection,
@@ -141,35 +147,44 @@ function AgGridPlus(props) {
141
147
  _useState6 = _slicedToArray(_useState5, 2),
142
148
  loading = _useState6[0],
143
149
  setLoading = _useState6[1];
144
- var _useState7 = useState(),
150
+ // 空态四分需要的两个事实:这次请求是不是失败了、用户有没有施加筛选。@author nokecy
151
+ var _useState7 = useState(null),
145
152
  _useState8 = _slicedToArray(_useState7, 2),
146
- columnState = _useState8[0],
147
- setColumnState = _useState8[1];
148
- var _useState9 = useState({}),
153
+ loadError = _useState8[0],
154
+ setLoadError = _useState8[1];
155
+ var _useState9 = useState(false),
149
156
  _useState10 = _slicedToArray(_useState9, 2),
150
- columnCellClass = _useState10[0],
151
- setColumnCellClass = _useState10[1];
152
- var _useState11 = useState([]),
157
+ filtered = _useState10[0],
158
+ setFiltered = _useState10[1];
159
+ var _useState11 = useState(),
153
160
  _useState12 = _slicedToArray(_useState11, 2),
154
- rowData = _useState12[0],
155
- setRowData = _useState12[1];
161
+ columnState = _useState12[0],
162
+ setColumnState = _useState12[1];
156
163
  var _useState13 = useState({}),
157
164
  _useState14 = _slicedToArray(_useState13, 2),
158
- queryFilter = _useState14[0],
159
- setQueryFilter = _useState14[1];
160
- var _useState15 = useState(),
165
+ columnCellClass = _useState14[0],
166
+ setColumnCellClass = _useState14[1];
167
+ var _useState15 = useState([]),
161
168
  _useState16 = _slicedToArray(_useState15, 2),
162
- sortColumn = _useState16[0],
163
- setSortColumn = _useState16[1];
169
+ rowData = _useState16[0],
170
+ setRowData = _useState16[1];
171
+ var _useState17 = useState({}),
172
+ _useState18 = _slicedToArray(_useState17, 2),
173
+ queryFilter = _useState18[0],
174
+ setQueryFilter = _useState18[1];
175
+ var _useState19 = useState(),
176
+ _useState20 = _slicedToArray(_useState19, 2),
177
+ sortColumn = _useState20[0],
178
+ setSortColumn = _useState20[1];
164
179
  // 初始化分页参数,支持外部传入的pageSize
165
- var _useState17 = useState({
180
+ var _useState21 = useState({
166
181
  pageSize: props.pageSize !== undefined ? props.pageSize : props.hidePagination ? 10000 : 200,
167
182
  current: 1,
168
183
  total: dataSource ? dataSource.length : 0
169
184
  }),
170
- _useState18 = _slicedToArray(_useState17, 2),
171
- pagination = _useState18[0],
172
- setPagination = _useState18[1];
185
+ _useState22 = _slicedToArray(_useState21, 2),
186
+ pagination = _useState22[0],
187
+ setPagination = _useState22[1];
173
188
 
174
189
  // ============ 方案管理 - 使用集中式 Context ============
175
190
  var _useGridSchemes = useGridSchemes(),
@@ -188,16 +203,16 @@ function AgGridPlus(props) {
188
203
  getColumnSchemes = _useGridSchemes.getColumnSchemes,
189
204
  getQuerySchemes = _useGridSchemes.getQuerySchemes,
190
205
  getCurrentScheme = _useGridSchemes.getCurrentScheme;
191
- var _useState19 = useState([]),
192
- _useState20 = _slicedToArray(_useState19, 2),
193
- queryItemsOrder = _useState20[0],
194
- setQueryItemsOrder = _useState20[1];
206
+ var _useState23 = useState([]),
207
+ _useState24 = _slicedToArray(_useState23, 2),
208
+ queryItemsOrder = _useState24[0],
209
+ setQueryItemsOrder = _useState24[1];
195
210
 
196
211
  // 高级查询状态
197
- var _useState21 = useState(false),
198
- _useState22 = _slicedToArray(_useState21, 2),
199
- advancedPopoverOpen = _useState22[0],
200
- setAdvancedPopoverOpen = _useState22[1];
212
+ var _useState25 = useState(false),
213
+ _useState26 = _slicedToArray(_useState25, 2),
214
+ advancedPopoverOpen = _useState26[0],
215
+ setAdvancedPopoverOpen = _useState26[1];
201
216
  var createEmptyRuleGroup = function createEmptyRuleGroup() {
202
217
  return {
203
218
  id: uuidv4(),
@@ -205,10 +220,10 @@ function AgGridPlus(props) {
205
220
  children: []
206
221
  };
207
222
  };
208
- var _useState23 = useState(createEmptyRuleGroup),
209
- _useState24 = _slicedToArray(_useState23, 2),
210
- advancedQueryRules = _useState24[0],
211
- setAdvancedQueryRules = _useState24[1];
223
+ var _useState27 = useState(createEmptyRuleGroup),
224
+ _useState28 = _slicedToArray(_useState27, 2),
225
+ advancedQueryRules = _useState28[0],
226
+ setAdvancedQueryRules = _useState28[1];
212
227
 
213
228
  /**
214
229
  * 【P1 架构优化】使用单向数据流架构
@@ -468,7 +483,7 @@ function AgGridPlus(props) {
468
483
  });
469
484
  return match ? match.label : params.value;
470
485
  };
471
- return _objectSpread(_objectSpread(_objectSpread({}, dataType), col), {}, {
486
+ return _objectSpread(_objectSpread(_objectSpread({}, toColumnType(dataType)), col), {}, {
472
487
  cellRenderer: function cellRenderer(params) {
473
488
  var match = valueEnum.find(function (item) {
474
489
  return item.value == params.value;
@@ -528,7 +543,7 @@ function AgGridPlus(props) {
528
543
  cellRenderer: cellRenderer
529
544
  });
530
545
  }
531
- return _objectSpread(_objectSpread(_objectSpread({}, dataType), col), {}, {
546
+ return _objectSpread(_objectSpread(_objectSpread({}, toColumnType(dataType)), col), {}, {
532
547
  customCellRenderer: col.cellRenderer,
533
548
  cellRenderer: cellRenderer
534
549
  });
@@ -689,6 +704,8 @@ function AgGridPlus(props) {
689
704
  try {
690
705
  // 处理高级查询模式 / 简单模式的过滤字符串构建
691
706
  var filter = buildFilterString(queryFilter, allColDefsRef.current);
707
+ // 空结果要不要说「换个筛选条件试试」,取决于用户这次到底有没有筛。@author nokecy
708
+ setFiltered(hasEffectiveFilter(filter, queryFilter));
692
709
  var params = _objectSpread(_objectSpread({
693
710
  filter: filter
694
711
  }, stableGridParams), {}, {
@@ -726,6 +743,7 @@ function AgGridPlus(props) {
726
743
  });
727
744
  });
728
745
  setLoading(false);
746
+ setLoadError(null);
729
747
  logger.info('数据请求成功', {
730
748
  rowCount: rowCount
731
749
  });
@@ -788,6 +806,9 @@ function AgGridPlus(props) {
788
806
  originalError: error
789
807
  }, error);
790
808
 
809
+ // 失败必须留痕:不留痕的话表格只会显示「没有找到数据」,把接口故障说成没数据。@author nokecy
810
+ setLoadError(gridError);
811
+
791
812
  // 记录错误
792
813
  logger.error('数据请求失败', gridError.getDetails());
793
814
 
@@ -807,6 +828,7 @@ function AgGridPlus(props) {
807
828
  queryFilter: queryFilter,
808
829
  allColDefs: allColDefsRef.current
809
830
  }, error instanceof Error ? error : undefined);
831
+ setLoadError(gridError);
810
832
  logger.error('数据请求处理失败', gridError.getDetails());
811
833
  message.error(gridError.getUserMessage());
812
834
  if (onErrorRef.current) {
@@ -887,6 +909,27 @@ function AgGridPlus(props) {
887
909
  onRequest(stableQueryFilter);
888
910
  }
889
911
  }, [onRequest, stableQueryFilter]);
912
+
913
+ // 空态四分:加载失败 / 无权限 / 筛选无结果 / 无数据,各说各的,失败那支还给出「重试」。
914
+ // 以前四种情况共用一句「没有找到数据,试试调整筛选条件吧!」,接口挂了也这么说,
915
+ // 用户按提示去调筛选,越调越没有。@author nokecy
916
+ var noRowsOverlayParams = useMemo(function () {
917
+ return {
918
+ branch: resolveEmptyBranch({
919
+ hasError: !!loadError,
920
+ accessible: accessible,
921
+ filtered: filtered
922
+ }),
923
+ text: resolveEmptyText({
924
+ hasError: !!loadError,
925
+ accessible: accessible,
926
+ filtered: filtered,
927
+ override: overlayNoRowsTemplateText,
928
+ texts: emptyState
929
+ }),
930
+ onRetry: onRefresh
931
+ };
932
+ }, [loadError, accessible, filtered, overlayNoRowsTemplateText, emptyState, onRefresh]);
890
933
  useEffect(function () {
891
934
  gridRef.current = {
892
935
  onRefresh: onRefresh
@@ -1328,7 +1371,12 @@ function AgGridPlus(props) {
1328
1371
  ensureDomOrder: true,
1329
1372
  columnHoverHighlight: true
1330
1373
  },
1331
- overlayNoRowsTemplate: createSafeHtmlTemplate(overlayNoRowsTemplateText || '没有找到数据,试试调整筛选条件吧!'),
1374
+ noRowsOverlayComponent: NoRowsOverlay,
1375
+ noRowsOverlayComponentParams: noRowsOverlayParams
1376
+ // 加载中不显示空态:外层 Spin 已经在转,再叠一句「暂无数据」会让用户
1377
+ // 以为真的没数据(冒烟截图里这两者确实同时出现过)。@author nokecy
1378
+ ,
1379
+ suppressNoRowsOverlay: loading,
1332
1380
  enableRangeSelection: true,
1333
1381
  suppressCopyRowsToClipboard: true,
1334
1382
  autoGroupColumnDef: autoGroupColumnDef
@@ -1408,7 +1456,7 @@ function AgGridPlus(props) {
1408
1456
  showTotal: function showTotal(total, range) {
1409
1457
  return "\u7B2C ".concat(range[0], "-").concat(range[1], " \u6761/\u603B\u5171 ").concat(total, " \u6761");
1410
1458
  },
1411
- pageSizeOptions: props.pageSizeOptions || [10, 20, 50, 100, 200, 500, 1000, 10000],
1459
+ pageSizeOptions: props.pageSizeOptions || DEFAULT_PAGE_SIZE_OPTIONS,
1412
1460
  hideOnSinglePage: false,
1413
1461
  showQuickJumper: false
1414
1462
  })))))));
@@ -2,6 +2,7 @@ import { GridApi, ColDef, ColGroupDef } from "ag-grid-community";
2
2
  import { AgGridReactProps } from "ag-grid-react";
3
3
  import React, { CSSProperties, ReactNode } from "react";
4
4
  import type { GridPlusError } from "./errors";
5
+ import type { EmptyStateTexts } from "./utils/emptyState";
5
6
  interface GridRef {
6
7
  onRefresh: () => void;
7
8
  }
@@ -42,9 +43,24 @@ interface GridProps extends AgGridReactProps {
42
43
  */
43
44
  gridColumnState?: any[];
44
45
  /**
45
- * 列表空数据文字提示
46
+ * 列表空数据文字提示。
47
+ * 传了它就一律用它(最高优先级),保持既有调用点行为不变;
48
+ * 想按「无数据 / 筛选无结果 / 无权限 / 加载失败」分别给文案,用 `emptyState`。
46
49
  */
47
50
  overlayNoRowsTemplateText?: string;
51
+ /**
52
+ * 空态四分文案覆盖:{ noData, noResult, noPermission, error }。
53
+ * 不传就用内置默认:加载失败说加载失败并给「重试」,没筛选就说「暂无数据」,
54
+ * 不再一律引导用户去调筛选条件。
55
+ * @author nokecy
56
+ */
57
+ emptyState?: EmptyStateTexts;
58
+ /**
59
+ * 当前用户是否有权查看该列表。传 false 时空态说「没有权限」而不是「暂无数据」,
60
+ * 免得用户以为是数据还没录进来。
61
+ * @author nokecy
62
+ */
63
+ accessible?: boolean;
48
64
  /**
49
65
  * 查询Form默认展示行数
50
66
  */
@@ -74,7 +74,7 @@ var QueryForm = observer(function (props) {
74
74
 
75
75
  var renderActions = function renderActions() {
76
76
  return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(Submit, {
77
- type: "default",
77
+ type: "primary",
78
78
  icon: /*#__PURE__*/React.createElement(SearchOutlined, null)
79
79
  }, "\u67E5\u8BE2"), /*#__PURE__*/React.createElement(Button, {
80
80
  icon: /*#__PURE__*/React.createElement(ClearOutlined, null),