@nokecy/qc-ui 1.1.74 → 1.1.76

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 (62) hide show
  1. package/dist/cjs/dialogSelect/index.d.ts +2 -2
  2. package/dist/cjs/dialogSelect/index.js +65 -10
  3. package/dist/cjs/entitySelect/index.d.ts +57 -0
  4. package/dist/cjs/entitySelect/index.js +172 -0
  5. package/dist/cjs/exportButton/exportAction.d.ts +74 -0
  6. package/dist/cjs/exportButton/exportAction.js +199 -0
  7. package/dist/cjs/exportButton/index.d.ts +39 -0
  8. package/dist/cjs/exportButton/index.js +295 -0
  9. package/dist/cjs/importModal/index.d.ts +9 -0
  10. package/dist/cjs/importModal/index.js +46 -8
  11. package/dist/cjs/index.d.ts +6 -0
  12. package/dist/cjs/index.js +74 -0
  13. package/dist/cjs/readPretty/arrayTable.d.ts +6 -0
  14. package/dist/cjs/readPretty/arrayTable.js +156 -0
  15. package/dist/cjs/readPretty/controls.d.ts +11 -0
  16. package/dist/cjs/readPretty/controls.js +68 -0
  17. package/dist/cjs/readPretty/decimal.d.ts +4 -0
  18. package/dist/cjs/readPretty/decimal.js +28 -0
  19. package/dist/cjs/readPretty/formily.d.ts +2 -0
  20. package/dist/cjs/readPretty/formily.js +71 -0
  21. package/dist/cjs/readPretty/hoistStatics.d.ts +1 -0
  22. package/dist/cjs/readPretty/hoistStatics.js +37 -0
  23. package/dist/cjs/readPretty/index.d.ts +11 -0
  24. package/dist/cjs/readPretty/index.js +70 -0
  25. package/dist/cjs/readPretty/selectValue.d.ts +7 -0
  26. package/dist/cjs/readPretty/selectValue.js +60 -0
  27. package/dist/cjs/readPretty/values.d.ts +4 -0
  28. package/dist/cjs/readPretty/values.js +49 -0
  29. package/dist/cjs/utils/download.d.ts +6 -0
  30. package/dist/cjs/utils/download.js +23 -0
  31. package/dist/esm/dialogSelect/index.d.ts +2 -2
  32. package/dist/esm/dialogSelect/index.js +59 -4
  33. package/dist/esm/entitySelect/index.d.ts +57 -0
  34. package/dist/esm/entitySelect/index.js +164 -0
  35. package/dist/esm/exportButton/exportAction.d.ts +74 -0
  36. package/dist/esm/exportButton/exportAction.js +193 -0
  37. package/dist/esm/exportButton/index.d.ts +39 -0
  38. package/dist/esm/exportButton/index.js +259 -0
  39. package/dist/esm/importModal/index.d.ts +9 -0
  40. package/dist/esm/importModal/index.js +46 -8
  41. package/dist/esm/index.d.ts +6 -0
  42. package/dist/esm/index.js +4 -0
  43. package/dist/esm/readPretty/arrayTable.d.ts +6 -0
  44. package/dist/esm/readPretty/arrayTable.js +147 -0
  45. package/dist/esm/readPretty/controls.d.ts +11 -0
  46. package/dist/esm/readPretty/controls.js +62 -0
  47. package/dist/esm/readPretty/decimal.d.ts +4 -0
  48. package/dist/esm/readPretty/decimal.js +22 -0
  49. package/dist/esm/readPretty/formily.d.ts +2 -0
  50. package/dist/esm/readPretty/formily.js +63 -0
  51. package/dist/esm/readPretty/hoistStatics.d.ts +1 -0
  52. package/dist/esm/readPretty/hoistStatics.js +31 -0
  53. package/dist/esm/readPretty/index.d.ts +11 -0
  54. package/dist/esm/readPretty/index.js +12 -0
  55. package/dist/esm/readPretty/selectValue.d.ts +7 -0
  56. package/dist/esm/readPretty/selectValue.js +53 -0
  57. package/dist/esm/readPretty/values.d.ts +4 -0
  58. package/dist/esm/readPretty/values.js +43 -0
  59. package/dist/esm/utils/download.d.ts +6 -0
  60. package/dist/esm/utils/download.js +17 -0
  61. package/dist/umd/qc-ui.min.js +1 -1
  62. package/package.json +1 -1
@@ -43,6 +43,6 @@ interface IDialogSelectProps extends SelectProps<any> {
43
43
  /** 选择窗口里使用的表格组件,默认 `AgGridPlus`;宿主可注入自己封装过的表格基座。 */
44
44
  gridComponent?: React.ComponentType<any>;
45
45
  }
46
- declare const DialogSelect: (props: IDialogSelectProps) => React.JSX.Element;
47
46
  export { IDialogSelectProps };
48
- export default DialogSelect;
47
+ declare const _default: (props: IDialogSelectProps) => React.ReactElement;
48
+ export default _default;
@@ -5,15 +5,19 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _antd = require("antd");
8
+ var _react = require("@formily/react");
8
9
  var _antdV = require("@formily/antd-v5");
9
10
  var _icons = require("@ant-design/icons");
10
- var _react = _interopRequireWildcard(require("react"));
11
+ var _react2 = _interopRequireWildcard(require("react"));
11
12
  var _agGridPlus = require("../ag-grid-plus");
12
13
  var _ahooks = require("ahooks");
13
14
  var _draggableModal = _interopRequireDefault(require("../draggableModal"));
14
15
  var _adapters = require("../adapters");
16
+ var _controls = require("../readPretty/controls");
17
+ var _selectValue = require("../readPretty/selectValue");
15
18
  require("./index.less");
16
- var _excluded = ["request", "columnDefs", "value", "labelField", "valueField", "onChangeItem", "hideBtn", "useAutoComplete", "queryFun", "pagedApiAdapter", "modalWidth", "dialogZIndex", "dialogMode", "dialogPageSize", "dialogPageSizeOptions", "dialogGridKey", "dialogDataSource", "dialogIsRowSelectable", "dialogRenderer", "gridComponent"];
19
+ var _excluded = ["request", "columnDefs", "value", "labelField", "valueField", "onChangeItem", "hideBtn", "useAutoComplete", "queryFun", "pagedApiAdapter", "modalWidth", "dialogZIndex", "dialogMode", "dialogPageSize", "dialogPageSizeOptions", "dialogGridKey", "dialogDataSource", "dialogIsRowSelectable", "dialogRenderer", "gridComponent"],
20
+ _excluded2 = ["request", "columnDefs", "labelField", "valueField", "onChangeItem", "hideBtn", "useAutoComplete", "queryFun", "pagedApiAdapter", "modalWidth", "dialogZIndex", "dialogMode", "dialogPageSize", "dialogPageSizeOptions", "dialogGridKey", "dialogDataSource", "dialogIsRowSelectable", "dialogRenderer", "gridComponent"];
17
21
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
22
  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); }
19
23
  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; }
@@ -37,7 +41,7 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
37
41
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
38
42
  /** 选择窗口的行选择模式。 */
39
43
 
40
- var DialogSelect = function DialogSelect(props) {
44
+ var DialogSelectInner = function DialogSelectInner(props) {
41
45
  var _selectRows$length;
42
46
  // 这些是本组件自己的属性,不能透传给 Select(否则会落到 DOM 上触发未知属性告警)。
43
47
  var request = props.request,
@@ -74,7 +78,7 @@ var DialogSelect = function DialogSelect(props) {
74
78
  _useBoolean2$ = _useBoolean2[1],
75
79
  setTrue = _useBoolean2$.setTrue,
76
80
  setFalse = _useBoolean2$.setFalse;
77
- var _useState = (0, _react.useState)(undefined),
81
+ var _useState = (0, _react2.useState)(undefined),
78
82
  _useState2 = _slicedToArray(_useState, 2),
79
83
  selectRows = _useState2[0],
80
84
  setSelectRows = _useState2[1];
@@ -123,7 +127,7 @@ var DialogSelect = function DialogSelect(props) {
123
127
 
124
128
  // 入口做成输入框内的后缀图标:不占右侧宽度,禁用/只读时不出现。@author nokecy
125
129
  var canOpen = !props.disabled && !hideBtn;
126
- var trigger = canOpen ? /*#__PURE__*/_react.default.createElement("span", {
130
+ var trigger = canOpen ? /*#__PURE__*/_react2.default.createElement("span", {
127
131
  className: "qc-dialog-select-trigger",
128
132
  role: "button",
129
133
  "aria-label": "\u6253\u5F00\u9009\u62E9\u7A97\u53E3",
@@ -139,7 +143,7 @@ var DialogSelect = function DialogSelect(props) {
139
143
  setSelectRows(undefined);
140
144
  setTrue();
141
145
  }
142
- }, /*#__PURE__*/_react.default.createElement(_icons.SearchOutlined, null)) : undefined;
146
+ }, /*#__PURE__*/_react2.default.createElement(_icons.SearchOutlined, null)) : undefined;
143
147
  var mergedClassName = ['qc-dialog-select', rest.className].filter(Boolean).join(' ');
144
148
  var triggerStyle = {
145
149
  '--qc-dialog-select-trigger-color': token.colorTextTertiary,
@@ -152,7 +156,7 @@ var DialogSelect = function DialogSelect(props) {
152
156
  }, trigger ? {
153
157
  suffixIcon: trigger
154
158
  } : {});
155
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, useAutoComplete && !props.labelInValue ? /*#__PURE__*/_react.default.createElement(_antd.AutoComplete, commonProps) : /*#__PURE__*/_react.default.createElement(_antdV.Select, _extends({
159
+ return /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, useAutoComplete && !props.labelInValue ? /*#__PURE__*/_react2.default.createElement(_antd.AutoComplete, commonProps) : /*#__PURE__*/_react2.default.createElement(_antdV.Select, _extends({
156
160
  maxTagCount: 'responsive',
157
161
  filterOption: false
158
162
  }, commonProps)), dialogRenderer ? dialogRenderer({
@@ -160,7 +164,7 @@ var DialogSelect = function DialogSelect(props) {
160
164
  mode: selectionMode,
161
165
  onCancel: close,
162
166
  onConfirm: confirmRows
163
- }) : /*#__PURE__*/_react.default.createElement(_draggableModal.default, {
167
+ }) : /*#__PURE__*/_react2.default.createElement(_draggableModal.default, {
164
168
  width: modalWidth,
165
169
  title: "\u9009\u62E9",
166
170
  zIndex: dialogZIndex,
@@ -173,12 +177,14 @@ var DialogSelect = function DialogSelect(props) {
173
177
  okButtonProps: {
174
178
  disabled: !(selectRows !== null && selectRows !== void 0 && selectRows.length)
175
179
  }
176
- }, selectionMode === 'multiple' && /*#__PURE__*/_react.default.createElement("div", {
180
+ }, selectionMode === 'multiple' && /*#__PURE__*/_react2.default.createElement("div", {
177
181
  style: {
178
182
  marginBottom: 8,
179
183
  textAlign: 'right'
180
184
  }
181
- }, "\u5DF2\u9009 ", (_selectRows$length = selectRows === null || selectRows === void 0 ? void 0 : selectRows.length) !== null && _selectRows$length !== void 0 ? _selectRows$length : 0, " \u9879"), /*#__PURE__*/_react.default.createElement(Grid, _extends({
185
+ }, "\u5DF2\u9009 ", (_selectRows$length = selectRows === null || selectRows === void 0 ? void 0 : selectRows.length) !== null && _selectRows$length !== void 0 ? _selectRows$length : 0, " \u9879"), /*#__PURE__*/_react2.default.createElement(Grid, _extends({}, gridComponent ? {} : {
186
+ valueEnumContrast: true
187
+ }, {
182
188
  gridKey: dialogGridKey,
183
189
  dataSource: dialogDataSource,
184
190
  hidePagination: localData
@@ -256,4 +262,53 @@ var DialogSelect = function DialogSelect(props) {
256
262
  columnDefs: columnDefs
257
263
  }))));
258
264
  };
265
+
266
+ /**
267
+ * 选择字段。
268
+ *
269
+ * 不可编辑(自身 disabled、外层 ConfigProvider 禁用,或 Formily 字段 disabled / readOnly / readPretty)时
270
+ * 只显示名称,不保留输入框和弹窗入口;`value` / `defaultValue` 统一规范成 Select 能识别的形状
271
+ * (含 `{ value, label }` 嵌套对象),仅在调用方传了对应属性时才下发,以保持受控/非受控语义。
272
+ *
273
+ * @author nokecy
274
+ */
275
+ var DialogSelect = (0, _react.observer)(function (props) {
276
+ var _props$disabled;
277
+ var field = (0, _react.useField)();
278
+ var _ConfigProvider$useCo = _antd.ConfigProvider.useConfig(),
279
+ componentDisabled = _ConfigProvider$useCo.componentDisabled;
280
+ var reading = (_props$disabled = props.disabled) !== null && _props$disabled !== void 0 ? _props$disabled : componentDisabled;
281
+ var safeProps = _objectSpread(_objectSpread(_objectSpread({}, props), 'value' in props ? {
282
+ value: (0, _selectValue.normalizeSelectValue)(props.value, props.labelInValue)
283
+ } : {}), 'defaultValue' in props ? {
284
+ defaultValue: (0, _selectValue.normalizeSelectValue)(props.defaultValue, props.labelInValue)
285
+ } : {});
286
+ if (reading || field !== null && field !== void 0 && field.disabled || field !== null && field !== void 0 && field.readOnly || field !== null && field !== void 0 && field.readPretty) {
287
+ // 阅读态只需要选项与值;弹窗、取数等属性不下发。
288
+ var request = safeProps.request,
289
+ columnDefs = safeProps.columnDefs,
290
+ labelField = safeProps.labelField,
291
+ valueField = safeProps.valueField,
292
+ onChangeItem = safeProps.onChangeItem,
293
+ hideBtn = safeProps.hideBtn,
294
+ useAutoComplete = safeProps.useAutoComplete,
295
+ queryFun = safeProps.queryFun,
296
+ pagedApiAdapter = safeProps.pagedApiAdapter,
297
+ modalWidth = safeProps.modalWidth,
298
+ dialogZIndex = safeProps.dialogZIndex,
299
+ dialogMode = safeProps.dialogMode,
300
+ dialogPageSize = safeProps.dialogPageSize,
301
+ dialogPageSizeOptions = safeProps.dialogPageSizeOptions,
302
+ dialogGridKey = safeProps.dialogGridKey,
303
+ dialogDataSource = safeProps.dialogDataSource,
304
+ dialogIsRowSelectable = safeProps.dialogIsRowSelectable,
305
+ dialogRenderer = safeProps.dialogRenderer,
306
+ gridComponent = safeProps.gridComponent,
307
+ selectProps = _objectWithoutProperties(safeProps, _excluded2);
308
+ return /*#__PURE__*/_react2.default.createElement(_controls.Select, _extends({}, selectProps, {
309
+ disabled: true
310
+ }));
311
+ }
312
+ return /*#__PURE__*/_react2.default.createElement(DialogSelectInner, safeProps);
313
+ });
259
314
  var _default = exports.default = DialogSelect;
@@ -0,0 +1,57 @@
1
+ import type { SelectProps } from 'antd/lib/select';
2
+ import React from 'react';
3
+ /**
4
+ * 实体选择器的骨架。
5
+ *
6
+ * 各业务模块的实体选择器(线体、车间、物料、供应商……)此前是逐个复制出来的:
7
+ * 取数、防抖、受控值、下拉即查、labelInValue、弹窗表格列,每份各写一遍,
8
+ * 真正不同的只有请求函数、提示语和表格列。骨架收在这里,各模块只填自己的那几项。
9
+ *
10
+ * 骨架不认识任何业务契约:请求函数由调用方传入,不引用任何生成服务客户端。
11
+ *
12
+ * @author nokecy
13
+ */
14
+ /** 取数入参:与后端分页查询约定一致。 */
15
+ export interface EntitySelectQuery {
16
+ Filter?: string;
17
+ SkipCount?: number;
18
+ MaxResultCount?: number;
19
+ Sorting?: string;
20
+ }
21
+ export interface EntitySelectConfig {
22
+ /** 取数函数,通常是生成服务客户端里的 XxxGetListAsync。 */
23
+ request: (query: EntitySelectQuery) => Promise<any>;
24
+ /** 未选择时的提示语。 */
25
+ placeholder: string;
26
+ /** 弹窗内表格的列定义。 */
27
+ columnDefs: any[];
28
+ /** 下拉项与回填值取哪个字段。传字符串则固定;不传则由 useCode 在 code 与 id 之间切换。 */
29
+ valueField?: string;
30
+ /** 回填标签取哪个字段。不传则不向 DialogSelect 声明,沿用其自身默认。 */
31
+ labelField?: string;
32
+ /** 弹窗宽度,不传则用 DialogSelect 的默认值。 */
33
+ modalWidth?: number;
34
+ /** 单页取数条数,默认 300。 */
35
+ pageSize?: number;
36
+ /** useCode 的默认值,默认 true(以编码而非主键作为值)。 */
37
+ useCodeByDefault?: boolean;
38
+ /** 搜索关键字如何拼成后端过滤表达式,默认按 name 或 code 模糊匹配。返回 undefined 表示不带过滤条件。 */
39
+ buildFilter?: (keyword: string) => string | undefined;
40
+ /** 下拉项显示文本,默认「编码 - 名称」。 */
41
+ renderOptionLabel?: (item: any) => React.ReactNode;
42
+ /** 下拉项需要额外属性时的逃生舱:整项自渲染,优先于 renderOptionLabel。 */
43
+ renderOption?: (item: any, valueField: string) => React.ReactNode;
44
+ /** 联动回调的 prop 名,如 onWorkLineSelect。声明后组件支持 enableLinkage。 */
45
+ linkagePropName?: string;
46
+ /** 选择窗口里使用的表格组件,不传则用 AgGridPlus;宿主可注入自己封装过的表格基座。 */
47
+ gridComponent?: React.ComponentType<any>;
48
+ }
49
+ export interface EntitySelectProps extends SelectProps<any> {
50
+ /** 以编码而非主键作为选中值。 */
51
+ useCode?: boolean;
52
+ /** 选中后把整条记录回调给使用方,需配置 linkagePropName。 */
53
+ enableLinkage?: boolean;
54
+ }
55
+ declare const createEntitySelect: (config: EntitySelectConfig) => React.ForwardRefExoticComponent<Omit<any, "ref"> & React.RefAttributes<any>>;
56
+ export { createEntitySelect };
57
+ export default createEntitySelect;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.createEntitySelect = void 0;
7
+ var _dialogSelect = _interopRequireDefault(require("../dialogSelect"));
8
+ var _ahooks = require("ahooks");
9
+ var _antd = require("antd");
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ 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
+ 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
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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); }
15
+ 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); }
16
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
17
+ 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."); }
18
+ 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); }
19
+ 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; }
20
+ 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; } }
21
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
22
+ var Option = _antd.Select.Option;
23
+
24
+ /**
25
+ * 实体选择器的骨架。
26
+ *
27
+ * 各业务模块的实体选择器(线体、车间、物料、供应商……)此前是逐个复制出来的:
28
+ * 取数、防抖、受控值、下拉即查、labelInValue、弹窗表格列,每份各写一遍,
29
+ * 真正不同的只有请求函数、提示语和表格列。骨架收在这里,各模块只填自己的那几项。
30
+ *
31
+ * 骨架不认识任何业务契约:请求函数由调用方传入,不引用任何生成服务客户端。
32
+ *
33
+ * @author nokecy
34
+ */
35
+
36
+ /** 取数入参:与后端分页查询约定一致。 */
37
+
38
+ var createEntitySelect = exports.createEntitySelect = function createEntitySelect(config) {
39
+ var request = config.request,
40
+ placeholder = config.placeholder,
41
+ columnDefs = config.columnDefs,
42
+ valueField = config.valueField,
43
+ labelField = config.labelField,
44
+ modalWidth = config.modalWidth,
45
+ _config$pageSize = config.pageSize,
46
+ pageSize = _config$pageSize === void 0 ? 300 : _config$pageSize,
47
+ _config$useCodeByDefa = config.useCodeByDefault,
48
+ useCodeByDefault = _config$useCodeByDefa === void 0 ? true : _config$useCodeByDefa,
49
+ _config$buildFilter = config.buildFilter,
50
+ buildFilter = _config$buildFilter === void 0 ? function (keyword) {
51
+ return "(name =* ".concat(keyword, ") | (code =* ").concat(keyword, ")");
52
+ } : _config$buildFilter,
53
+ _config$renderOptionL = config.renderOptionLabel,
54
+ renderOptionLabel = _config$renderOptionL === void 0 ? function (item) {
55
+ return "".concat(item.code, " - ").concat(item.name);
56
+ } : _config$renderOptionL,
57
+ renderOption = config.renderOption,
58
+ linkagePropName = config.linkagePropName,
59
+ gridComponent = config.gridComponent;
60
+ var getData = function getData(_ref) {
61
+ var Filter = _ref.Filter,
62
+ SkipCount = _ref.SkipCount,
63
+ MaxResultCount = _ref.MaxResultCount,
64
+ Sorting = _ref.Sorting;
65
+ return request({
66
+ Filter: Filter ? Filter : undefined,
67
+ SkipCount: SkipCount ? SkipCount : 0,
68
+ MaxResultCount: MaxResultCount ? MaxResultCount : pageSize,
69
+ Sorting: Sorting ? Sorting : undefined
70
+ });
71
+ };
72
+
73
+ // props 上不加索引签名、ref 不收窄:这些选择器会被当作 AgGridColumn 的 searchComponent 传递,
74
+ // 任一处收紧都会让 forwardRef 的推断结果与那处的 prop 类型不兼容。
75
+ var EntitySelect = function EntitySelect(props, ref) {
76
+ var _data$items2;
77
+ var _props$useCode = props.useCode,
78
+ useCode = _props$useCode === void 0 ? useCodeByDefault : _props$useCode,
79
+ _props$enableLinkage = props.enableLinkage,
80
+ enableLinkage = _props$enableLinkage === void 0 ? false : _props$enableLinkage;
81
+ var resolvedValueField = valueField !== null && valueField !== void 0 ? valueField : useCode ? 'code' : 'id';
82
+ var onLinkage = linkagePropName ? props[linkagePropName] : undefined;
83
+ var lastLinkedValueRef = (0, _react.useRef)();
84
+ var _useControllableValue = (0, _ahooks.useControllableValue)(props),
85
+ _useControllableValue2 = _slicedToArray(_useControllableValue, 2),
86
+ state = _useControllableValue2[0],
87
+ setState = _useControllableValue2[1];
88
+ var _useRequest = (0, _ahooks.useRequest)(getData, {
89
+ debounceMaxWait: 500,
90
+ manual: true
91
+ }),
92
+ data = _useRequest.data,
93
+ loading = _useRequest.loading,
94
+ run = _useRequest.run,
95
+ cancel = _useRequest.cancel;
96
+ var handleChange = function handleChange(value) {
97
+ var _data$items;
98
+ setState(value);
99
+ if (!value) {
100
+ lastLinkedValueRef.current = undefined;
101
+ return;
102
+ }
103
+ if (!enableLinkage || !onLinkage) return;
104
+ var picked = _typeof(value) === 'object' ? value.value : value;
105
+ var matched = data === null || data === void 0 || (_data$items = data.items) === null || _data$items === void 0 ? void 0 : _data$items.find(function (item) {
106
+ return item[resolvedValueField] === picked;
107
+ });
108
+ if (matched && lastLinkedValueRef.current !== picked) {
109
+ lastLinkedValueRef.current = picked;
110
+ onLinkage(matched);
111
+ }
112
+ };
113
+ return /*#__PURE__*/_react.default.createElement("span", {
114
+ ref: ref,
115
+ style: {
116
+ display: 'block',
117
+ width: '100%',
118
+ minWidth: 0,
119
+ maxWidth: '100%'
120
+ }
121
+ }, /*#__PURE__*/_react.default.createElement(_dialogSelect.default, _extends({
122
+ placeholder: placeholder,
123
+ style: {
124
+ width: '100%',
125
+ maxWidth: '100%'
126
+ },
127
+ showSearch: true,
128
+ labelInValue: true,
129
+ filterOption: false
130
+ }, modalWidth ? {
131
+ modalWidth: modalWidth
132
+ } : {}, gridComponent ? {
133
+ gridComponent: gridComponent
134
+ } : {}, props, {
135
+ onSearch: function onSearch(value) {
136
+ run({
137
+ Filter: buildFilter(value)
138
+ });
139
+ },
140
+ onDropdownVisibleChange: function onDropdownVisibleChange(visible) {
141
+ visible && run({});
142
+ },
143
+ loading: loading,
144
+ onBlur: cancel,
145
+ value: JSON.stringify(state) === '{}' ? undefined : state,
146
+ onChange: handleChange,
147
+ valueField: resolvedValueField
148
+ }, labelField ? {
149
+ labelField: labelField
150
+ } : {}, {
151
+ request: getData,
152
+ columnDefs: columnDefs,
153
+ onChangeItem: function onChangeItem(item) {
154
+ if (!enableLinkage || !onLinkage || !item) return;
155
+ var selected = Array.isArray(item) ? item[0] : item;
156
+ if (!selected) return;
157
+ var picked = selected[resolvedValueField];
158
+ if (lastLinkedValueRef.current === picked) return;
159
+ lastLinkedValueRef.current = picked;
160
+ onLinkage(selected);
161
+ }
162
+ }), data === null || data === void 0 || (_data$items2 = data.items) === null || _data$items2 === void 0 ? void 0 : _data$items2.map(function (item) {
163
+ var _item$id;
164
+ return renderOption ? renderOption(item, resolvedValueField) : /*#__PURE__*/_react.default.createElement(Option, {
165
+ key: (_item$id = item.id) !== null && _item$id !== void 0 ? _item$id : item[resolvedValueField],
166
+ value: item[resolvedValueField]
167
+ }, renderOptionLabel(item));
168
+ })));
169
+ };
170
+ return /*#__PURE__*/_react.default.forwardRef(EntitySelect);
171
+ };
172
+ var _default = exports.default = createEntitySelect;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * 导出按钮的行为决策与地址构造。
3
+ *
4
+ * 抽成纯函数是为了能直接测:这里的分支决定了「现场点导出会发生什么」,
5
+ * 而它最容易出问题的两个场景——模板没配、模板接口挂了——在页面里很难复现。
6
+ *
7
+ * @author nokecy
8
+ */
9
+ /** 导出模板服务的接口地址:可用模板列表与按模板渲染文件。默认指向 MES 后端的 export-template 服务,其他后端可在 ExportButton 上覆盖。 */
10
+ export interface ExportTemplateApi {
11
+ /** 按页面标识取可用模板(GET,参数 gridKey) */
12
+ options: string;
13
+ /** 按模板渲染并下载(GET,参数 TemplateId、Filter) */
14
+ render: string;
15
+ }
16
+ /** 默认的导出模板服务地址。 */
17
+ export declare const DEFAULT_EXPORT_TEMPLATE_API: ExportTemplateApi;
18
+ /** 后端 `export-template/options` 返回的模板项 */
19
+ export interface ExportTemplateOption {
20
+ id: string;
21
+ name: string;
22
+ isDefault: boolean;
23
+ }
24
+ /** 导出按钮该以什么形态出现 */
25
+ export type ExportAction =
26
+ /** 没有可用模板:走页面自带的旧导出入口 */
27
+ {
28
+ kind: 'legacy';
29
+ }
30
+ /** 只有一个模板:按钮直接导 */
31
+ | {
32
+ kind: 'single';
33
+ template: ExportTemplateOption;
34
+ }
35
+ /** 多个模板:下拉选择 */
36
+ | {
37
+ kind: 'menu';
38
+ templates: ExportTemplateOption[];
39
+ defaultTemplate: ExportTemplateOption;
40
+ };
41
+ /**
42
+ * 根据可用模板决定导出按钮的行为。
43
+ *
44
+ * 传 null / undefined 表示「没拿到模板列表」(接口失败或还没加载),
45
+ * 与「确实一个模板都没配」一样回落到旧导出——模板服务出问题不该让现场导不出数据。
46
+ */
47
+ export declare const resolveExportAction: (templates: ExportTemplateOption[] | null | undefined) => ExportAction;
48
+ /**
49
+ * 导出接口地址。这里已经把参数百分号编码好了(Gridify 的值里可能有 `&` `#` `+`,不编会截断 query string)。
50
+ *
51
+ * <b>因此下载不能走 `downloadBlob`</b>:它内部还会 `encodeURI(url)` 再编一次,
52
+ * `%` 被转义成 `%25`(`boxCode%3D*BOX001` → `boxCode%253D*BOX001`),
53
+ * 后端解析不出筛选串——现场表现是「在列表上筛完点导出,导出的是全量」。
54
+ * 见本目录 index.tsx 里的 `download`。
55
+ */
56
+ export declare const buildExportUrl: (templateId: string, filter?: string | null, renderUrl?: string) => string;
57
+ /**
58
+ * 从响应头取导出文件名。
59
+ *
60
+ * 文件名是运维在模板上配的(可带 {date} 之类的占位),只有服务端知道最终值;
61
+ * 客户端自己起名会让那项配置永远不生效。头里取不到就用兜底名。
62
+ *
63
+ * 后端用 `filename*=UTF-8''xxx`(RFC 5987)传中文名,老式 `filename="xxx"` 也认。
64
+ */
65
+ export declare const resolveFileName: (contentDisposition: string | undefined | null, fallback: string) => string;
66
+ /**
67
+ * 从导出失败的异常里取出给人看的错误信息。
68
+ *
69
+ * 导出请求是 `responseType: 'blob'`,后端返回的 JSON 错误体也会被 axios 当成 blob 收下,
70
+ * `e.response.data.error.message` 这条路永远取不到东西——现场看到的是 axios 自己的
71
+ * "Request failed with status code 500",既不知道是数据太多超时还是模板配错。
72
+ * 所以先把 blob 读回来解析一次。
73
+ */
74
+ export declare const resolveExportError: (error: any) => Promise<string>;