@nokecy/qc-ui 1.1.74 → 1.1.75

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 (46) 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/index.d.ts +3 -0
  6. package/dist/cjs/index.js +20 -0
  7. package/dist/cjs/readPretty/arrayTable.d.ts +6 -0
  8. package/dist/cjs/readPretty/arrayTable.js +156 -0
  9. package/dist/cjs/readPretty/controls.d.ts +11 -0
  10. package/dist/cjs/readPretty/controls.js +68 -0
  11. package/dist/cjs/readPretty/decimal.d.ts +4 -0
  12. package/dist/cjs/readPretty/decimal.js +28 -0
  13. package/dist/cjs/readPretty/formily.d.ts +2 -0
  14. package/dist/cjs/readPretty/formily.js +71 -0
  15. package/dist/cjs/readPretty/hoistStatics.d.ts +1 -0
  16. package/dist/cjs/readPretty/hoistStatics.js +37 -0
  17. package/dist/cjs/readPretty/index.d.ts +11 -0
  18. package/dist/cjs/readPretty/index.js +70 -0
  19. package/dist/cjs/readPretty/selectValue.d.ts +7 -0
  20. package/dist/cjs/readPretty/selectValue.js +60 -0
  21. package/dist/cjs/readPretty/values.d.ts +4 -0
  22. package/dist/cjs/readPretty/values.js +49 -0
  23. package/dist/esm/dialogSelect/index.d.ts +2 -2
  24. package/dist/esm/dialogSelect/index.js +59 -4
  25. package/dist/esm/entitySelect/index.d.ts +57 -0
  26. package/dist/esm/entitySelect/index.js +164 -0
  27. package/dist/esm/index.d.ts +3 -0
  28. package/dist/esm/index.js +2 -0
  29. package/dist/esm/readPretty/arrayTable.d.ts +6 -0
  30. package/dist/esm/readPretty/arrayTable.js +147 -0
  31. package/dist/esm/readPretty/controls.d.ts +11 -0
  32. package/dist/esm/readPretty/controls.js +62 -0
  33. package/dist/esm/readPretty/decimal.d.ts +4 -0
  34. package/dist/esm/readPretty/decimal.js +22 -0
  35. package/dist/esm/readPretty/formily.d.ts +2 -0
  36. package/dist/esm/readPretty/formily.js +63 -0
  37. package/dist/esm/readPretty/hoistStatics.d.ts +1 -0
  38. package/dist/esm/readPretty/hoistStatics.js +31 -0
  39. package/dist/esm/readPretty/index.d.ts +11 -0
  40. package/dist/esm/readPretty/index.js +12 -0
  41. package/dist/esm/readPretty/selectValue.d.ts +7 -0
  42. package/dist/esm/readPretty/selectValue.js +53 -0
  43. package/dist/esm/readPretty/values.d.ts +4 -0
  44. package/dist/esm/readPretty/values.js +43 -0
  45. package/dist/umd/qc-ui.min.js +1 -1
  46. 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;
@@ -31,6 +31,9 @@ export type * from "./RuleBuilder";
31
31
  export type { ColumnConfig } from "./array-table/columnHelper";
32
32
  export type { CentralizedColumnScheme, QueryScheme, SchemeStorageAdapter, SchemeSyncDataDto, CurrentSchemeDto, SchemeStorageConfig, LocalStorageAdapterConfig, BackendApiAdapterConfig, UseSchemeManagerConfig, GridPlusContextValue, GlobalConfigPermissions, } from "./ag-grid-plus";
33
33
  export * from './adapters';
34
+ export * from "./readPretty";
35
+ export { createEntitySelect } from "./entitySelect";
36
+ export type { EntitySelectConfig, EntitySelectProps, EntitySelectQuery } from "./entitySelect";
34
37
  export { semanticTextColors, toGridTextColor, gridValueEnum } from "./ag-grid-plus/utils/valueEnumColor";
35
38
  export type { SemanticPreset } from "./ag-grid-plus/utils/valueEnumColor";
36
39
  export { contrastRatio, relativeLuminance, darkenUntilContrast, lightenUntilContrast, toRgb, toHsl, fromHsl } from "./utils/contrast";
package/dist/cjs/index.js CHANGED
@@ -47,6 +47,7 @@ var _exportNames = {
47
47
  FlagsSelector: true,
48
48
  MatchItem: true,
49
49
  RegexRailroadDiagram: true,
50
+ createEntitySelect: true,
50
51
  semanticTextColors: true,
51
52
  toGridTextColor: true,
52
53
  gridValueEnum: true,
@@ -287,6 +288,12 @@ Object.defineProperty(exports, "createCascaderField", {
287
288
  return _standardFormDialog.createCascaderField;
288
289
  }
289
290
  });
291
+ Object.defineProperty(exports, "createEntitySelect", {
292
+ enumerable: true,
293
+ get: function get() {
294
+ return _entitySelect.createEntitySelect;
295
+ }
296
+ });
290
297
  Object.defineProperty(exports, "createSelectField", {
291
298
  enumerable: true,
292
299
  get: function get() {
@@ -460,6 +467,19 @@ Object.keys(_adapters).forEach(function (key) {
460
467
  }
461
468
  });
462
469
  });
470
+ var _readPretty = require("./readPretty");
471
+ Object.keys(_readPretty).forEach(function (key) {
472
+ if (key === "default" || key === "__esModule") return;
473
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
474
+ if (key in exports && exports[key] === _readPretty[key]) return;
475
+ Object.defineProperty(exports, key, {
476
+ enumerable: true,
477
+ get: function get() {
478
+ return _readPretty[key];
479
+ }
480
+ });
481
+ });
482
+ var _entitySelect = require("./entitySelect");
463
483
  var _valueEnumColor = require("./ag-grid-plus/utils/valueEnumColor");
464
484
  var _contrast = require("./utils/contrast");
465
485
  var _businessDecimal = require("./utils/businessDecimal");
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 阅读态也创建列的 void 字段,让 Formily 求值标题、显隐与 reactions;
3
+ * qc-ui 的阅读视图只读取列状态,未像编辑视图一样挂载这些字段。
4
+ * @author nokecy
5
+ */
6
+ export declare const withReadingArrayTable: (Control: any) => any;
@@ -0,0 +1,156 @@
1
+ "use strict";
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
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.withReadingArrayTable = void 0;
8
+ var _react = require("@formily/react");
9
+ var _agGridReact = require("ag-grid-react");
10
+ var _utils = require("../array-table/utils");
11
+ var _columnGroup = require("../array-table/columnGroup");
12
+ var _indexColumn = require("../array-table/indexColumn");
13
+ var _theme = require("../array-table/theme");
14
+ var _hoistStatics = require("./hoistStatics");
15
+ var _react2 = _interopRequireWildcard(require("react"));
16
+ 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); }
17
+ 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; }
18
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
19
+ 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); }
20
+ 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; }
21
+ /** 阅读态直接使用 ArrayTable 的列定义,避免 AgGridPlus 的原值渲染器覆盖格式化结果。@author nokecy */
22
+ var ReadingArrayTable = (0, _react.observer)(function (_ref) {
23
+ var _buildArrayTableColum;
24
+ var height = _ref.height;
25
+ var field = (0, _react.useField)();
26
+ var sources = (0, _utils.useArrayTableSources)();
27
+ var rows = Array.isArray(field.value) ? field.value.slice() : [];
28
+ var generatedRowIds = (0, _react2.useRef)(new WeakMap());
29
+ var generatedRowIdSequence = (0, _react2.useRef)(0);
30
+ var columns = (_buildArrayTableColum = (0, _utils.buildArrayTableColumns)(rows, field, sources)) !== null && _buildArrayTableColum !== void 0 ? _buildArrayTableColum : [];
31
+ var showIndex = columns.length > 0 && !(0, _indexColumn.hasOwnIndexColumn)(sources);
32
+ if (showIndex) columns.unshift((0, _indexColumn.makeIndexColumn)());
33
+ var theme = (0, _theme.useArrayTableTheme)();
34
+ return /*#__PURE__*/_react2.default.createElement("div", {
35
+ style: {
36
+ height: height !== null && height !== void 0 ? height : 400
37
+ }
38
+ }, /*#__PURE__*/_react2.default.createElement(_agGridReact.AgGridReact, {
39
+ theme: theme,
40
+ rowHeight: _theme.ARRAY_TABLE_ROW_HEIGHT,
41
+ enableCellTextSelection: true,
42
+ ensureDomOrder: true,
43
+ defaultColDef: {
44
+ resizable: true,
45
+ sortable: true,
46
+ filter: true
47
+ },
48
+ rowSelection: {
49
+ mode: 'singleRow',
50
+ enableClickSelection: true
51
+ },
52
+ selectionColumnDef: {
53
+ pinned: 'left',
54
+ lockPosition: true,
55
+ width: 50,
56
+ suppressHeaderMenuButton: true
57
+ },
58
+ columnDefs: (0, _columnGroup.groupColumnDefs)(columns),
59
+ rowData: rows,
60
+ getRowId: function getRowId(_ref2) {
61
+ var _data$_id;
62
+ var data = _ref2.data;
63
+ var id = (_data$_id = data === null || data === void 0 ? void 0 : data._id) !== null && _data$_id !== void 0 ? _data$_id : data === null || data === void 0 ? void 0 : data.id;
64
+ if (id != null) return "data:".concat(String(id));
65
+
66
+ // 阅读态明细常用旧表行号等字段,不一定有 id/_id。给无 ID 的对象分配稳定行键,
67
+ // 否则多行都会返回 "undefined",AG Grid 在数据更新后会合并掉重复行。@author nokecy
68
+ var row = data;
69
+ var rowId = generatedRowIds.current.get(row);
70
+ if (!rowId) {
71
+ rowId = "generated:".concat(++generatedRowIdSequence.current);
72
+ generatedRowIds.current.set(row, rowId);
73
+ }
74
+ return rowId;
75
+ },
76
+ onRowDataUpdated: function onRowDataUpdated(_ref3) {
77
+ var api = _ref3.api;
78
+ if (showIndex) api.refreshCells({
79
+ columns: [_indexColumn.ARRAY_TABLE_INDEX_FIELD],
80
+ force: true
81
+ });
82
+ }
83
+ }));
84
+ });
85
+
86
+ /** 按 ArrayTable 的列提取规则收集列节点,不挂载明细数据字段。@author nokecy */
87
+ var columnsOf = function columnsOf(schema) {
88
+ var columns = [];
89
+ var visit = function visit(node) {
90
+ if (typeof node['x-component'] === 'string' && node['x-component'].includes('Column')) {
91
+ var _node$xComponentPro, _node$xComponentPro2;
92
+ var name = (_node$xComponentPro = (_node$xComponentPro2 = node['x-component-props']) === null || _node$xComponentPro2 === void 0 ? void 0 : _node$xComponentPro2.dataIndex) !== null && _node$xComponentPro !== void 0 ? _node$xComponentPro : node.name;
93
+ if (name !== undefined) columns.push({
94
+ name: name,
95
+ schema: node
96
+ });
97
+ } else {
98
+ Object.values(node.properties || {}).forEach(visit);
99
+ }
100
+ };
101
+ var items = Array.isArray(schema.items) ? schema.items : schema.items ? [schema.items] : [];
102
+ items.forEach(visit);
103
+ return columns;
104
+ };
105
+
106
+ /**
107
+ * 阅读态也创建列的 void 字段,让 Formily 求值标题、显隐与 reactions;
108
+ * qc-ui 的阅读视图只读取列状态,未像编辑视图一样挂载这些字段。
109
+ * @author nokecy
110
+ */
111
+ var withReadingArrayTable = exports.withReadingArrayTable = function withReadingArrayTable(Control) {
112
+ var ReactiveTable = (0, _react.observer)(function (_ref4) {
113
+ var columns = _ref4.columns,
114
+ tableProps = _ref4.tableProps;
115
+ var field = (0, _react.useField)();
116
+ // 阅读视图本身未订阅列状态,在此建立依赖,条件变化后重新提取表头。@author nokecy
117
+ var _iterator = _createForOfIteratorHelper(columns),
118
+ _step;
119
+ try {
120
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
121
+ var _column$componentProp, _column$componentProp2, _column$componentProp3;
122
+ var name = _step.value.name;
123
+ var column = field.query(field.address.concat(name)).take();
124
+ void (column === null || column === void 0 ? void 0 : column.display);
125
+ void (column === null || column === void 0 || (_column$componentProp = column.componentProps) === null || _column$componentProp === void 0 ? void 0 : _column$componentProp.title);
126
+ void (column === null || column === void 0 || (_column$componentProp2 = column.componentProps) === null || _column$componentProp2 === void 0 ? void 0 : _column$componentProp2.headerName);
127
+ void (column === null || column === void 0 || (_column$componentProp3 = column.componentProps) === null || _column$componentProp3 === void 0 ? void 0 : _column$componentProp3.headerGroup);
128
+ }
129
+ } catch (err) {
130
+ _iterator.e(err);
131
+ } finally {
132
+ _iterator.f();
133
+ }
134
+ return /*#__PURE__*/_react2.default.createElement(ReadingArrayTable, tableProps);
135
+ });
136
+ var Table = (0, _react.observer)(function (props) {
137
+ var field = (0, _react.useField)();
138
+ var schema = (0, _react.useFieldSchema)();
139
+ var columns = (0, _react2.useMemo)(function () {
140
+ return columnsOf(schema);
141
+ }, [schema]);
142
+ if (field.pattern !== 'readPretty') return /*#__PURE__*/_react2.default.createElement(Control, props);
143
+ return /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, columns.map(function (column) {
144
+ return /*#__PURE__*/_react2.default.createElement(_react.RecursionField, {
145
+ key: column.name,
146
+ name: column.name,
147
+ schema: column.schema,
148
+ onlyRenderSelf: true
149
+ });
150
+ }), /*#__PURE__*/_react2.default.createElement(ReactiveTable, {
151
+ columns: columns,
152
+ tableProps: props
153
+ }));
154
+ });
155
+ return (0, _hoistStatics.hoistStatics)(Table, Control);
156
+ };
@@ -0,0 +1,11 @@
1
+ import { Input as AntInput, InputNumber as AntInputNumber, Select as AntSelect, Switch as AntSwitch, Checkbox as AntCheckbox, Radio as AntRadio, DatePicker as AntDatePicker, TimePicker as AntTimePicker, TreeSelect as AntTreeSelect, Cascader as AntCascader } from 'antd';
2
+ export declare const Input: typeof AntInput;
3
+ export declare const InputNumber: typeof AntInputNumber;
4
+ export declare const Select: typeof AntSelect;
5
+ export declare const Switch: typeof AntSwitch;
6
+ export declare const Checkbox: typeof AntCheckbox;
7
+ export declare const Radio: typeof AntRadio;
8
+ export declare const DatePicker: typeof AntDatePicker;
9
+ export declare const TimePicker: typeof AntTimePicker;
10
+ export declare const TreeSelect: typeof AntTreeSelect;
11
+ export declare const Cascader: typeof AntCascader;