@nokecy/qc-ui 1.1.63 → 1.1.65

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,5 +1,6 @@
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); }
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
@@ -8,13 +9,20 @@ var _react = _interopRequireDefault(require("react"));
8
9
  var _antd = require("antd");
9
10
  var _icons = require("@ant-design/icons");
10
11
  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 _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; }
12
13
  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
14
  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
15
  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
16
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
16
17
  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); }
17
- var confirm = _antd.Modal.confirm;
18
+ 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); } }
19
+ 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); }); }; }
20
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
21
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
22
+ 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); }
23
+ 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; }
24
+ 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; } }
25
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
26
  /**
19
27
  * DeleteConfirm 删除确认组件
20
28
  *
@@ -41,44 +49,54 @@ var DeleteConfirm = function DeleteConfirm(props) {
41
49
  _props$danger = props.danger,
42
50
  danger = _props$danger === void 0 ? true : _props$danger,
43
51
  children = props.children;
44
- var showPromiseConfirm = function showPromiseConfirm(event) {
45
- // 智能转换 title:支持字符串、ReactNode 或使用默认值
46
- var titleText = title || '确认操作';
47
52
 
48
- // 正文要说清动的是哪条、几条,这只有调用方知道,所以 content 交给调用方。
49
- // 不传时的兜底只承诺「不可撤销」:原来的默认正文是把 title 拼进去,
50
- // 拼出来是一句病句,而且始终没告诉用户动的是哪条数据。@author nokecy
51
- var contentText = content || '该操作不可撤销,请确认后继续。';
52
- confirm(_objectSpread(_objectSpread({
53
- title: titleText,
54
- icon: /*#__PURE__*/_react.default.createElement(_icons.ExclamationCircleFilled, null),
55
- content: contentText,
56
- okButtonProps: {
57
- danger: danger
58
- }
59
- }, okText ? {
60
- okText: okText
61
- } : {}), {}, {
62
- onOk: function onOk() {
63
- return new Promise(function (resolve, reject) {
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
- }
74
- }).catch(function () {
75
- return undefined;
76
- });
77
- }
53
+ // 保留宿主主题,并让 antd 接管异步提交的加载与失败恢复。@author nokecy
54
+ var _Modal$useModal = _antd.Modal.useModal(),
55
+ _Modal$useModal2 = _slicedToArray(_Modal$useModal, 2),
56
+ modal = _Modal$useModal2[0],
57
+ contextHolder = _Modal$useModal2[1];
58
+ var showPromiseConfirm = /*#__PURE__*/function () {
59
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(event) {
60
+ var titleText, contentText;
61
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
62
+ while (1) switch (_context.prev = _context.next) {
63
+ case 0:
64
+ // 智能转换 title:支持字符串、ReactNode 或使用默认值
65
+ titleText = title || '确认操作'; // 正文要说清动的是哪条、几条,这只有调用方知道,所以 content 交给调用方。
66
+ // 不传时的兜底只承诺「不可撤销」:原来的默认正文是把 title 拼进去,
67
+ // 拼出来是一句病句,而且始终没告诉用户动的是哪条数据。@author nokecy
68
+ contentText = content || '该操作不可撤销,请确认后继续。';
69
+ _context.next = 4;
70
+ return modal.confirm(_objectSpread(_objectSpread({
71
+ title: titleText,
72
+ icon: /*#__PURE__*/_react.default.createElement(_icons.ExclamationCircleFilled, null),
73
+ content: contentText,
74
+ okButtonProps: {
75
+ danger: danger
76
+ }
77
+ }, okText ? {
78
+ okText: okText
79
+ } : {}), {}, {
80
+ onOk: function onOk() {
81
+ // 同步异常与异步失败均交回确认框,失败不关闭,可继续重试。
82
+ // @author nokecy
83
+ return Promise.resolve().then(function () {
84
+ return onConfirm(event);
85
+ });
86
+ }
87
+ }));
88
+ case 4:
89
+ case "end":
90
+ return _context.stop();
91
+ }
92
+ }, _callee);
78
93
  }));
79
- };
80
- return /*#__PURE__*/_react.default.createElement("span", {
94
+ return function showPromiseConfirm(_x) {
95
+ return _ref.apply(this, arguments);
96
+ };
97
+ }();
98
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, contextHolder, /*#__PURE__*/_react.default.createElement("span", {
81
99
  onClick: showPromiseConfirm
82
- }, children);
100
+ }, children));
83
101
  };
84
102
  var _default = exports.default = DeleteConfirm;
@@ -27,6 +27,8 @@ interface ConfigurableToolbarProps {
27
27
  import?: string;
28
28
  export?: string;
29
29
  };
30
+ /** 当前用户已授予的权限,见 GeneratedListPageConfig.access */
31
+ access?: Record<string, boolean>;
30
32
  }
31
33
  /**
32
34
  * 配置化工具栏组件
@@ -40,9 +40,10 @@ var ConfigurableToolbar = function ConfigurableToolbar(_ref) {
40
40
  _ref$exportFileName = _ref.exportFileName,
41
41
  exportFileName = _ref$exportFileName === void 0 ? 'export.xlsx' : _ref$exportFileName,
42
42
  filter = _ref.filter,
43
- permissions = _ref.permissions;
43
+ permissions = _ref.permissions,
44
+ access = _ref.access;
44
45
  // 使用统一的权限检查 Hook
45
- var _usePermissionCheck = (0, _usePermissionCheck2.usePermissionCheck)(permissions || {}),
46
+ var _usePermissionCheck = (0, _usePermissionCheck2.usePermissionCheck)(permissions || {}, access),
46
47
  canCreate = _usePermissionCheck.canCreate,
47
48
  canImport = _usePermissionCheck.canImport,
48
49
  canExport = _usePermissionCheck.canExport,
@@ -92,7 +92,11 @@ var GeneratedListPage = function GeneratedListPage(config) {
92
92
  } : _config$paginationCon,
93
93
  externalGridRef = config.gridRef,
94
94
  externalOnRefresh = config.onRefresh,
95
- pagedApiAdapter = config.pagedApiAdapter;
95
+ pagedApiAdapter = config.pagedApiAdapter,
96
+ gridComponent = config.gridComponent,
97
+ access = config.access,
98
+ deleteConfirm = config.deleteConfirm;
99
+ var Grid = gridComponent || _agGridPlus.AgGridPlus;
96
100
 
97
101
  // 内部Grid引用
98
102
  var internalGridRef = (0, _react.useRef)();
@@ -165,11 +169,13 @@ var GeneratedListPage = function GeneratedListPage(config) {
165
169
  permissions: permissions,
166
170
  formDialog: formDialog,
167
171
  deleteApi: apiConfig.delete,
168
- useErrorHandler: errorConfig.useErrorHandler
172
+ useErrorHandler: errorConfig.useErrorHandler,
173
+ access: access,
174
+ deleteConfirm: deleteConfirm
169
175
  }
170
176
  };
171
177
  return [].concat(_toConsumableArray(columnDefs), [operationColumn]);
172
- }, [columnDefs, formDialog, apiConfig.delete, permissions, onRefresh, OptionsColumnComponent, errorConfig.useErrorHandler]);
178
+ }, [columnDefs, formDialog, apiConfig.delete, permissions, onRefresh, OptionsColumnComponent, errorConfig.useErrorHandler, access, deleteConfirm]);
173
179
 
174
180
  /**
175
181
  * 从扁平数据构建树形结构
@@ -413,9 +419,10 @@ var GeneratedListPage = function GeneratedListPage(config) {
413
419
  importConfig: importConfig,
414
420
  exportFileName: exportFileName,
415
421
  filter: filter,
416
- permissions: permissions
422
+ permissions: permissions,
423
+ access: access
417
424
  }))];
418
- }, [enableImportExport, toolbarActions, formDialog, apiConfig, onRefresh, importConfig, exportFileName, permissions]);
425
+ }, [enableImportExport, toolbarActions, formDialog, apiConfig, onRefresh, importConfig, exportFileName, permissions, access]);
419
426
 
420
427
  // AgGridPlus属性配置
421
428
  var agGridProps = _objectSpread({
@@ -476,7 +483,7 @@ var GeneratedListPage = function GeneratedListPage(config) {
476
483
  position: 'relative',
477
484
  height: '100%'
478
485
  }
479
- }, /*#__PURE__*/_react.default.createElement(_agGridPlus.AgGridPlus, agGridProps), /*#__PURE__*/_react.default.createElement(_PerformanceMonitor.PerformanceDevTools, {
486
+ }, /*#__PURE__*/_react.default.createElement(Grid, agGridProps), /*#__PURE__*/_react.default.createElement(_PerformanceMonitor.PerformanceDevTools, {
480
487
  componentName: "GeneratedListPage-".concat(title),
481
488
  metrics: metrics,
482
489
  onGetReport: getPerformanceReport
@@ -32,10 +32,12 @@ var OptionsColumn = function OptionsColumn(props) {
32
32
  formDialog = props.formDialog,
33
33
  deleteApi = props.deleteApi,
34
34
  _props$useErrorHandle = props.useErrorHandler,
35
- useErrorHandler = _props$useErrorHandle === void 0 ? true : _props$useErrorHandle;
35
+ useErrorHandler = _props$useErrorHandle === void 0 ? true : _props$useErrorHandle,
36
+ access = props.access,
37
+ deleteConfirm = props.deleteConfirm;
36
38
 
37
39
  // 使用权限检查 Hook
38
- var _usePermissionCheck = (0, _usePermissionCheck2.usePermissionCheck)(permissions),
40
+ var _usePermissionCheck = (0, _usePermissionCheck2.usePermissionCheck)(permissions, access),
39
41
  canUpdate = _usePermissionCheck.canUpdate,
40
42
  canDelete = _usePermissionCheck.canDelete,
41
43
  hasPermission = _usePermissionCheck.hasPermission;
@@ -58,13 +60,15 @@ var OptionsColumn = function OptionsColumn(props) {
58
60
  _context.next = 6;
59
61
  return (0, _defaultHandlers.defaultHandleDelete)(deleteApi, id, refresh);
60
62
  case 6:
61
- _context.next = 11;
63
+ _context.next = 12;
62
64
  break;
63
65
  case 8:
64
66
  _context.prev = 8;
65
67
  _context.t0 = _context["catch"](3);
66
68
  console.error('删除失败:', _context.t0);
67
- case 11:
69
+ // 让确认框结束加载并保留失败状态,避免失败被当作成功关闭。@author nokecy
70
+ throw _context.t0;
71
+ case 12:
68
72
  case "end":
69
73
  return _context.stop();
70
74
  }
@@ -88,13 +92,24 @@ var OptionsColumn = function OptionsColumn(props) {
88
92
  return null;
89
93
  }
90
94
  var FormDialogComponent = formDialog === null || formDialog === void 0 ? void 0 : formDialog.component;
95
+
96
+ // 确认框要说清删的是哪一条:页面没给标题时取该行的名称或编码。@author nokecy
97
+ var record = data;
98
+ var recordLabel = (record === null || record === void 0 ? void 0 : record.name) || (record === null || record === void 0 ? void 0 : record.displayName) || (record === null || record === void 0 ? void 0 : record.code);
99
+ var resolveText = function resolveText(value, fallback) {
100
+ return typeof value === 'function' ? value(data) : value !== null && value !== void 0 ? value : fallback;
101
+ };
102
+ var deleteTitle = resolveText(deleteConfirm === null || deleteConfirm === void 0 ? void 0 : deleteConfirm.title, recordLabel ? "\u786E\u5B9A\u5220\u9664\u300C".concat(recordLabel, "\u300D\uFF1F") : '确定删除?');
103
+ var deleteContent = resolveText(deleteConfirm === null || deleteConfirm === void 0 ? void 0 : deleteConfirm.content, '删除后无法恢复。');
91
104
  return /*#__PURE__*/_react.default.createElement(_antd.Space, {
92
105
  onClick: function onClick(event) {
93
106
  event.stopPropagation();
94
107
  }
95
108
  }, showEditButton && FormDialogComponent && /*#__PURE__*/_react.default.createElement(Access, {
96
109
  accessible: canUpdate
97
- }, /*#__PURE__*/_react.default.createElement(FormDialogComponent, {
110
+ }, /*#__PURE__*/_react.default.createElement(_antd.Tooltip, {
111
+ title: "\u7F16\u8F91"
112
+ }, /*#__PURE__*/_react.default.createElement("span", null, /*#__PURE__*/_react.default.createElement(FormDialogComponent, {
98
113
  buttonProps: {
99
114
  size: "small",
100
115
  type: "link",
@@ -102,17 +117,19 @@ var OptionsColumn = function OptionsColumn(props) {
102
117
  style: {
103
118
  fontSize: 14
104
119
  }
105
- })
120
+ }),
121
+ 'aria-label': '编辑'
106
122
  },
107
123
  key: data.id,
108
124
  title: formDialog.editTitle || '编辑',
109
125
  entityId: data.id,
110
126
  onAfterSubmit: refresh
111
- })), showDeleteButton && /*#__PURE__*/_react.default.createElement(Access, {
127
+ })))), showDeleteButton && /*#__PURE__*/_react.default.createElement(Access, {
112
128
  accessible: canDelete
113
129
  }, /*#__PURE__*/_react.default.createElement(_deleteConfirm.default, {
114
- title: "\u786E\u5B9A\u5220\u9664?",
115
- content: "\u6B64\u64CD\u4F5C\u5C06\u6C38\u4E45\u5220\u9664\u8BE5\u6570\u636E\uFF0C\u4E14\u65E0\u6CD5\u6062\u590D",
130
+ title: deleteTitle,
131
+ content: deleteContent,
132
+ okText: "\u5220\u9664",
116
133
  onConfirm: /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
117
134
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
118
135
  while (1) switch (_context2.prev = _context2.next) {
@@ -125,11 +142,13 @@ var OptionsColumn = function OptionsColumn(props) {
125
142
  }
126
143
  }, _callee2);
127
144
  }))
145
+ }, /*#__PURE__*/_react.default.createElement(_antd.Tooltip, {
146
+ title: "\u5220\u9664"
128
147
  }, /*#__PURE__*/_react.default.createElement(_antd.Button, {
129
148
  size: "small",
130
149
  icon: /*#__PURE__*/_react.default.createElement(_icons.DeleteOutlined, null),
131
150
  type: "link",
132
- title: "\u5220\u9664"
133
- }))));
151
+ "aria-label": "\u5220\u9664"
152
+ })))));
134
153
  };
135
154
  var _default = exports.default = OptionsColumn;
@@ -12,7 +12,7 @@ export { default } from './GeneratedListPage';
12
12
  export { default as GeneratedListPage } from './GeneratedListPage';
13
13
  export { default as ConfigurableToolbar } from './ConfigurableToolbar';
14
14
  export { default as OptionsColumn } from './OptionsColumn';
15
- export type { GeneratedListPageConfig, PermissionConfig, ApiConfig, ListParams, PagedResult, DeleteParams, ExportParams, ToolbarActionConfig, FormDialogConfig, TreeDataConfig, OptionsComponentProps } from './types';
15
+ export type { GeneratedListPageConfig, PermissionConfig, ApiConfig, ListParams, PagedResult, DeleteParams, ExportParams, ToolbarActionConfig, FormDialogConfig, TreeDataConfig, OptionsComponentProps, DeleteConfirmConfig } from './types';
16
16
  export { usePermissionCheck, PermissionChecker } from './usePermissionCheck';
17
17
  export { usePerformanceMonitor, PerformanceDevTools } from './PerformanceMonitor';
18
18
  export { useRequestManager } from './useRequestManager';
@@ -1,7 +1,7 @@
1
- /// <reference types="react" />
2
1
  import { GridRef } from "../ag-grid-plus/interface";
3
2
  import { ColDef } from "ag-grid-community";
4
3
  import { ButtonProps } from "antd";
4
+ import { ReactNode } from "react";
5
5
  import { PagedApiAdapter } from '../adapters';
6
6
  /**
7
7
  * 权限配置接口
@@ -203,6 +203,27 @@ export interface GeneratedListPageConfig<T = any> {
203
203
  onRefresh?: () => void;
204
204
  /** 分页 API 适配器(默认 ABP);非 ABP 后端可注入。@author nokecy */
205
205
  pagedApiAdapter?: PagedApiAdapter;
206
+ /**
207
+ * 表格组件,默认用包内 AgGridPlus。
208
+ * 宿主可注入自己的表格基座(属性与 AgGridPlus 相同),让序号、默认复选、编码列收起、
209
+ * 内部字段隐藏等列表规范在通用列表页上同样生效。@author nokecy
210
+ */
211
+ gridComponent?: React.ComponentType<any>;
212
+ /**
213
+ * 当前用户已授予的权限(权限名 → 是否授予),通常传 umi 的 useAccess()。
214
+ * 不传时工具栏与操作列不做权限过滤——没有权限的人也会看到新建、编辑、删除,点了才报 403。@author nokecy
215
+ */
216
+ access?: Record<string, boolean>;
217
+ /** 删除确认框;title、content 可按行生成 */
218
+ deleteConfirm?: DeleteConfirmConfig<T>;
219
+ }
220
+ /**
221
+ * 删除确认框配置。
222
+ * 不传 title 时标题带上该行的名称或编码,让用户看清删的是哪一条;不传 content 时说明删除后无法恢复。@author nokecy
223
+ */
224
+ export interface DeleteConfirmConfig<T = any> {
225
+ title?: ReactNode | ((record: T) => ReactNode);
226
+ content?: ReactNode | ((record: T) => ReactNode);
206
227
  }
207
228
  /**
208
229
  * 操作列组件属性接口
@@ -221,4 +242,8 @@ export interface OptionsComponentProps<T = any> {
221
242
  deleteApi?: (params: DeleteParams) => Promise<void>;
222
243
  /** 是否使用统一错误处理 */
223
244
  useErrorHandler?: boolean;
245
+ /** 当前用户已授予的权限,见 GeneratedListPageConfig.access */
246
+ access?: Record<string, boolean>;
247
+ /** 删除确认框配置 */
248
+ deleteConfirm?: DeleteConfirmConfig<T>;
224
249
  }