@nokecy/qc-ui 1.1.84 → 1.1.86
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.
- package/dist/cjs/array-table/arrayAddBtn.js +2 -1
- package/dist/cjs/array-table/cellFocusScope.d.ts +8 -7
- package/dist/cjs/array-table/cellFocusScope.js +51 -15
- package/dist/cjs/array-table/index.js +40 -21
- package/dist/cjs/array-table/utils.js +27 -19
- package/dist/cjs/dialogSelect/index.less +11 -4
- package/dist/cjs/draggableModal/index.js +67 -29
- package/dist/cjs/draggableModal/style.less +6 -1
- package/dist/cjs/readPretty/controls.js +6 -2
- package/dist/cjs/readPretty/formily.js +6 -2
- package/dist/cjs/readPretty/selectNumberInputTextOnClick.d.ts +3 -0
- package/dist/cjs/readPretty/selectNumberInputTextOnClick.js +14 -0
- package/dist/esm/array-table/arrayAddBtn.js +2 -1
- package/dist/esm/array-table/cellFocusScope.d.ts +8 -7
- package/dist/esm/array-table/cellFocusScope.js +52 -16
- package/dist/esm/array-table/index.js +40 -21
- package/dist/esm/array-table/utils.js +27 -20
- package/dist/esm/dialogSelect/index.less +11 -4
- package/dist/esm/draggableModal/index.js +67 -29
- package/dist/esm/draggableModal/style.less +6 -1
- package/dist/esm/readPretty/controls.js +6 -2
- package/dist/esm/readPretty/formily.js +6 -2
- package/dist/esm/readPretty/selectNumberInputTextOnClick.d.ts +3 -0
- package/dist/esm/readPretty/selectNumberInputTextOnClick.js +8 -0
- package/dist/umd/qc-ui.min.css +1 -1
- package/dist/umd/qc-ui.min.js +1 -1
- package/package.json +1 -1
|
@@ -46,7 +46,8 @@ var ArrayAddBtn = function ArrayAddBtn(props) {
|
|
|
46
46
|
rest = _objectWithoutProperties(props, _excluded);
|
|
47
47
|
var prefixCls = (0, _builtins__.usePrefixCls)("formily-array-base");
|
|
48
48
|
if (!arrayField) return null;
|
|
49
|
-
|
|
49
|
+
// 明细处于只读或禁用状态时不显示新增入口,避免出现灰色的无效操作。
|
|
50
|
+
if (arrayField.pattern !== "editable") return null;
|
|
50
51
|
return /*#__PURE__*/_react.default.createElement(_antd.Button, _extends({
|
|
51
52
|
type: "primary"
|
|
52
53
|
}, rest, {
|
|
@@ -2,19 +2,20 @@ import React from 'react';
|
|
|
2
2
|
/**
|
|
3
3
|
* 判断「焦点离开了这个单元格」的作用域,给懒挂载格「用完卸回纯文本」用。
|
|
4
4
|
*
|
|
5
|
-
* 用 React 合成的 onFocus/onBlur
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* 用 React 合成的 onFocus/onBlur 判断焦点变化:合成事件会沿 React 树冒泡,穿过 portal。
|
|
6
|
+
* 下拉面板、日期面板、选择对话框这类渲染到 body 上的弹层,焦点进去时对本格仍是「格内」。
|
|
7
|
+
* 同时监听指针离开:点击到不可聚焦的文本格或页面空白不会触发 blur,需要按点击位置恢复展示态;
|
|
8
|
+
* portal 内的指针事件仍沿 React 树到达本作用域,不会被当作离开。
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
* blur 之后紧跟着 focus
|
|
11
|
-
* (
|
|
10
|
+
* 离开不立刻判定,而是推到下一个任务再看:焦点从输入框换到格内别的元素(或弹层)时,
|
|
11
|
+
* blur 之后紧跟着 focus,后者会作废这次判定。单纯 blur 时若 activeElement 仍在格内
|
|
12
|
+
* (如窗口切走),不算离开;指针明确点击到作用域外则按离开处理。
|
|
12
13
|
*
|
|
13
14
|
* 用 display: contents,不产生盒子,不改变单元格里原有的布局。
|
|
14
15
|
*
|
|
15
16
|
* @author nokecy
|
|
16
17
|
*/
|
|
17
|
-
export type CellLeaveHandler = (isStale: () => boolean) => void;
|
|
18
|
+
export type CellLeaveHandler = (isStale: () => boolean, hadFocus: boolean) => void;
|
|
18
19
|
export declare const CellFocusScope: ({ onLeave, children }: {
|
|
19
20
|
onLeave: CellLeaveHandler;
|
|
20
21
|
children: React.ReactNode;
|
|
@@ -11,13 +11,14 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
11
11
|
/**
|
|
12
12
|
* 判断「焦点离开了这个单元格」的作用域,给懒挂载格「用完卸回纯文本」用。
|
|
13
13
|
*
|
|
14
|
-
* 用 React 合成的 onFocus/onBlur
|
|
15
|
-
*
|
|
16
|
-
*
|
|
14
|
+
* 用 React 合成的 onFocus/onBlur 判断焦点变化:合成事件会沿 React 树冒泡,穿过 portal。
|
|
15
|
+
* 下拉面板、日期面板、选择对话框这类渲染到 body 上的弹层,焦点进去时对本格仍是「格内」。
|
|
16
|
+
* 同时监听指针离开:点击到不可聚焦的文本格或页面空白不会触发 blur,需要按点击位置恢复展示态;
|
|
17
|
+
* portal 内的指针事件仍沿 React 树到达本作用域,不会被当作离开。
|
|
17
18
|
*
|
|
18
|
-
*
|
|
19
|
-
* blur 之后紧跟着 focus
|
|
20
|
-
* (
|
|
19
|
+
* 离开不立刻判定,而是推到下一个任务再看:焦点从输入框换到格内别的元素(或弹层)时,
|
|
20
|
+
* blur 之后紧跟着 focus,后者会作废这次判定。单纯 blur 时若 activeElement 仍在格内
|
|
21
|
+
* (如窗口切走),不算离开;指针明确点击到作用域外则按离开处理。
|
|
21
22
|
*
|
|
22
23
|
* 用 display: contents,不产生盒子,不改变单元格里原有的布局。
|
|
23
24
|
*
|
|
@@ -29,34 +30,69 @@ var CellFocusScope = exports.CellFocusScope = function CellFocusScope(_ref) {
|
|
|
29
30
|
children = _ref.children;
|
|
30
31
|
var rootRef = (0, _react.useRef)(null);
|
|
31
32
|
var timerRef = (0, _react.useRef)();
|
|
33
|
+
// 通过 React portal 渲染到 body 的弹层仍属于当前格;记录经过本作用域的指针事件,
|
|
34
|
+
// 避免日期/下拉弹层中的点击被 document 级离开检测误判。@author nokecy
|
|
35
|
+
var pointerEventsInScopeRef = (0, _react.useRef)(new WeakSet());
|
|
36
|
+
var focusWithinRef = (0, _react.useRef)(false);
|
|
32
37
|
// 每次焦点回到格内、或卸载时递增;进行中的异步判定拿它判断自己是否已过期
|
|
33
38
|
var generationRef = (0, _react.useRef)(0);
|
|
34
39
|
var onLeaveRef = (0, _react.useRef)(onLeave);
|
|
35
40
|
onLeaveRef.current = onLeave;
|
|
36
|
-
var cancel = function
|
|
41
|
+
var cancel = (0, _react.useCallback)(function () {
|
|
37
42
|
generationRef.current += 1;
|
|
38
43
|
window.clearTimeout(timerRef.current);
|
|
39
|
-
};
|
|
40
|
-
(0, _react.useEffect)(function () {
|
|
41
|
-
return cancel;
|
|
42
44
|
}, []);
|
|
43
|
-
var
|
|
45
|
+
var scheduleLeave = (0, _react.useCallback)(function () {
|
|
46
|
+
var pointerLeftScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
47
|
+
var hadFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : focusWithinRef.current;
|
|
44
48
|
cancel();
|
|
45
49
|
var generation = generationRef.current;
|
|
46
50
|
timerRef.current = window.setTimeout(function () {
|
|
47
51
|
var _rootRef$current;
|
|
48
|
-
|
|
52
|
+
// blur 后 activeElement 仍在本格通常是窗口切走或格内弹层切焦点,不算离开。
|
|
53
|
+
// 指针明确点到本格/其弹层之外时,即使目标不可聚焦导致 activeElement 没变,也应离开。
|
|
54
|
+
if (!pointerLeftScope && (_rootRef$current = rootRef.current) !== null && _rootRef$current !== void 0 && _rootRef$current.contains(document.activeElement)) return;
|
|
49
55
|
onLeaveRef.current(function () {
|
|
50
56
|
return generation !== generationRef.current;
|
|
51
|
-
});
|
|
57
|
+
}, hadFocus);
|
|
52
58
|
}, 0);
|
|
59
|
+
}, [cancel]);
|
|
60
|
+
var handleFocus = function handleFocus() {
|
|
61
|
+
focusWithinRef.current = true;
|
|
62
|
+
cancel();
|
|
53
63
|
};
|
|
64
|
+
var handleBlur = function handleBlur() {
|
|
65
|
+
var hadFocus = focusWithinRef.current;
|
|
66
|
+
focusWithinRef.current = false;
|
|
67
|
+
scheduleLeave(false, hadFocus);
|
|
68
|
+
};
|
|
69
|
+
var handlePointerDownCapture = function handlePointerDownCapture(event) {
|
|
70
|
+
pointerEventsInScopeRef.current.add(event.nativeEvent);
|
|
71
|
+
};
|
|
72
|
+
(0, _react.useEffect)(function () {
|
|
73
|
+
var handleDocumentPointerDown = function handleDocumentPointerDown(event) {
|
|
74
|
+
var root = rootRef.current;
|
|
75
|
+
if (!root) return;
|
|
76
|
+
var target = event.target;
|
|
77
|
+
// DOM 内点击以及 React portal 子树内点击都属于当前格的交互。
|
|
78
|
+
if (target instanceof Node && root.contains(target) || pointerEventsInScopeRef.current.has(event)) return;
|
|
79
|
+
// 新增行的必填空格也会预先挂载控件,但可能从未获得焦点;同样需要响应离开,
|
|
80
|
+
// 由 onLeave 根据 hadFocus 决定是否校验未触碰的空必填格。@author nokecy
|
|
81
|
+
scheduleLeave(true, focusWithinRef.current);
|
|
82
|
+
};
|
|
83
|
+
document.addEventListener('pointerdown', handleDocumentPointerDown);
|
|
84
|
+
return function () {
|
|
85
|
+
document.removeEventListener('pointerdown', handleDocumentPointerDown);
|
|
86
|
+
cancel();
|
|
87
|
+
};
|
|
88
|
+
}, [cancel, scheduleLeave]);
|
|
54
89
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
55
90
|
ref: rootRef,
|
|
56
91
|
style: {
|
|
57
92
|
display: 'contents'
|
|
58
93
|
},
|
|
59
|
-
onFocus:
|
|
60
|
-
onBlur: handleBlur
|
|
94
|
+
onFocus: handleFocus,
|
|
95
|
+
onBlur: handleBlur,
|
|
96
|
+
onPointerDownCapture: handlePointerDownCapture
|
|
61
97
|
}, children);
|
|
62
98
|
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
3
|
Object.defineProperty(exports, "__esModule", {
|
|
5
4
|
value: true
|
|
6
5
|
});
|
|
@@ -9,6 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
9
8
|
var _agGridReact = require("ag-grid-react");
|
|
10
9
|
var _react2 = require("@formily/react");
|
|
11
10
|
var _uniqueId = _interopRequireDefault(require("lodash/uniqueId"));
|
|
11
|
+
var _locale = require("../ag-grid-plus/locale");
|
|
12
12
|
var _utils = require("./utils");
|
|
13
13
|
var _columnGroup = require("./columnGroup");
|
|
14
14
|
var _indexColumn = require("./indexColumn");
|
|
@@ -30,6 +30,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
30
30
|
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; }
|
|
31
31
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
32
32
|
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); }
|
|
33
|
+
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); }
|
|
33
34
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
34
35
|
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."); }
|
|
35
36
|
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); }
|
|
@@ -38,7 +39,6 @@ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" !=
|
|
|
38
39
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } // AG-Grid v33 主题:行高、单元格居中、去聚焦/选区视觉(编辑态与阅读态共用一份,见 theme.ts)
|
|
39
40
|
//@ts-ignore
|
|
40
41
|
var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
41
|
-
var _addition$props;
|
|
42
42
|
var height = props.height,
|
|
43
43
|
gridKey = props.gridKey;
|
|
44
44
|
var arrayTableTheme = (0, _theme.useArrayTableTheme)(true);
|
|
@@ -314,21 +314,39 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
314
314
|
style: {
|
|
315
315
|
marginBottom: 5
|
|
316
316
|
}
|
|
317
|
-
}, addition ?
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
317
|
+
}, addition ? function (_addition$props, _additionSchema$xCom, _ref, _additionProps$title, _additionProps$method) {
|
|
318
|
+
// addition 是 RecursionField 元素;业务配置在其 schema.x-component-props 中,
|
|
319
|
+
// 不能从 React 元素的 props 直接读取,否则默认值和标题会丢失。@author nokecy
|
|
320
|
+
var additionSchema = (_addition$props = addition.props) === null || _addition$props === void 0 ? void 0 : _addition$props.schema;
|
|
321
|
+
var additionProps = (_additionSchema$xCom = additionSchema === null || additionSchema === void 0 ? void 0 : additionSchema['x-component-props']) !== null && _additionSchema$xCom !== void 0 ? _additionSchema$xCom : {};
|
|
322
|
+
var configuredDefaults = additionProps.defaultValue;
|
|
323
|
+
var rowDefaults = configuredDefaults && _typeof(configuredDefaults) === 'object' && !Array.isArray(configuredDefaults) ? configuredDefaults : {};
|
|
324
|
+
return /*#__PURE__*/_react.default.createElement(_arrayAddBtn.default, _extends({}, additionProps, {
|
|
325
|
+
title: (_ref = (_additionProps$title = additionProps.title) !== null && _additionProps$title !== void 0 ? _additionProps$title : additionSchema === null || additionSchema === void 0 ? void 0 : additionSchema.title) !== null && _ref !== void 0 ? _ref : '新增'
|
|
326
|
+
// 新增行总是回到数组顺序,避免当前列排序把空白新行插到旧明细前面。
|
|
327
|
+
,
|
|
328
|
+
onAdd: function onAdd(index) {
|
|
329
|
+
var _apiRef$current;
|
|
330
|
+
setIsAdd(true);
|
|
331
|
+
(_apiRef$current = apiRef.current) === null || _apiRef$current === void 0 || _apiRef$current.applyColumnState({
|
|
332
|
+
defaultState: {
|
|
333
|
+
sort: null,
|
|
334
|
+
sortIndex: null
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
if (typeof additionProps.onAdd === 'function') additionProps.onAdd(index);
|
|
338
|
+
}
|
|
339
|
+
// 框架属性在业务配置之后设置;新行默认追加到明细末尾。@author nokecy
|
|
340
|
+
,
|
|
341
|
+
method: (_additionProps$method = additionProps.method) !== null && _additionProps$method !== void 0 ? _additionProps$method : 'push',
|
|
342
|
+
arrayField: field,
|
|
343
|
+
schema: schema,
|
|
344
|
+
defaultValue: _objectSpread({
|
|
345
|
+
_id: (0, _uniqueId.default)(),
|
|
346
|
+
_isNew: true
|
|
347
|
+
}, rowDefaults)
|
|
348
|
+
}));
|
|
349
|
+
}() : null, actions.map(function (column, key) {
|
|
332
350
|
return /*#__PURE__*/_react.default.createElement(_react2.RecursionField, {
|
|
333
351
|
schema: column.schema,
|
|
334
352
|
name: key,
|
|
@@ -347,6 +365,7 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
347
365
|
}
|
|
348
366
|
}, /*#__PURE__*/_react.default.createElement(_agGridReact.AgGridReact, {
|
|
349
367
|
theme: arrayTableTheme,
|
|
368
|
+
localeText: _locale.localeText,
|
|
350
369
|
context: gridContext,
|
|
351
370
|
onGridReady: function onGridReady(params) {
|
|
352
371
|
params.api.hidePopupMenu();
|
|
@@ -393,8 +412,8 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
393
412
|
});
|
|
394
413
|
}
|
|
395
414
|
if (isAdd) {
|
|
396
|
-
var _apiRef$
|
|
397
|
-
(_apiRef$
|
|
415
|
+
var _apiRef$current2;
|
|
416
|
+
(_apiRef$current2 = apiRef.current) === null || _apiRef$current2 === void 0 || _apiRef$current2.ensureIndexVisible(dataSource.length - 1, "bottom");
|
|
398
417
|
setIsAdd(false);
|
|
399
418
|
}
|
|
400
419
|
},
|
|
@@ -416,9 +435,9 @@ var ArrayTableInner = (0, _react2.observer)(function (props) {
|
|
|
416
435
|
' <span data-ref="eSortAsc" class="ag-header-icon ag-sort-ascending-icon"></span>' + ' <span data-ref="eSortDesc" class="ag-header-icon ag-sort-descending-icon"></span>' + ' <span data-ref="eSortNone" class="ag-header-icon ag-sort-none-icon"></span>' + " </div>" + "</div>"
|
|
417
436
|
}
|
|
418
437
|
},
|
|
419
|
-
getRowId: function getRowId(
|
|
438
|
+
getRowId: function getRowId(_ref2) {
|
|
420
439
|
var _data$_id;
|
|
421
|
-
var data =
|
|
440
|
+
var data = _ref2.data;
|
|
422
441
|
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;
|
|
423
442
|
if (id != null) return String(id);
|
|
424
443
|
// 既无 _id 也无 id 的外部数据:按对象引用从 WeakMap 取/分配稳定 id。
|
|
@@ -385,52 +385,60 @@ var LazyAgField = exports.LazyAgField = function LazyAgField(params) {
|
|
|
385
385
|
// 内层字段名:Column key 与它可能不一致(设计器形态),取值/找字段节点都按它
|
|
386
386
|
var dataKey = (_fieldSchema$name = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.name) !== null && _fieldSchema$name !== void 0 ? _fieldSchema$name : colDef === null || colDef === void 0 ? void 0 : colDef.field;
|
|
387
387
|
|
|
388
|
-
/**
|
|
388
|
+
/** 离开本格:校验通过才卸回懒挂载文本。未触碰的空必填格保留控件等待填写。@author nokecy */
|
|
389
389
|
var handleLeave = /*#__PURE__*/function () {
|
|
390
|
-
var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(isStale) {
|
|
390
|
+
var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(isStale, hadFocus) {
|
|
391
391
|
var _field$value$indexOf3, _field$value3, _field$value3$indexOf, _field$form;
|
|
392
|
-
var index, cellField;
|
|
392
|
+
var currentValue, index, cellField;
|
|
393
393
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
394
394
|
while (1) switch (_context.prev = _context.next) {
|
|
395
395
|
case 0:
|
|
396
|
+
currentValue = dataKey != null ? readByFieldPath(record, dataKey) : value; // 新增行的必填空格会预先挂载以参与提交校验;若用户从未进入该格,不在点击页面其他位置时
|
|
397
|
+
// 主动触发校验,但已带值的格子仍可恢复静默文本态。@author nokecy
|
|
398
|
+
if (!(required && isBlank(currentValue) && !hadFocus)) {
|
|
399
|
+
_context.next = 3;
|
|
400
|
+
break;
|
|
401
|
+
}
|
|
402
|
+
return _context.abrupt("return");
|
|
403
|
+
case 3:
|
|
396
404
|
index = (_field$value$indexOf3 = field === null || field === void 0 || (_field$value3 = field.value) === null || _field$value3 === void 0 || (_field$value3$indexOf = _field$value3.indexOf) === null || _field$value3$indexOf === void 0 ? void 0 : _field$value3$indexOf.call(_field$value3, record)) !== null && _field$value$indexOf3 !== void 0 ? _field$value$indexOf3 : -1; // 字段节点按数据路径找(不含 void 容器);从没挂载过就没有节点,无需校验
|
|
397
405
|
cellField = index >= 0 && dataKey ? (_field$form = field.form) === null || _field$form === void 0 ? void 0 : _field$form.query(field.path.concat(index).concat(dataKey)).take() : undefined;
|
|
398
406
|
if (!cellField) {
|
|
399
|
-
_context.next =
|
|
407
|
+
_context.next = 14;
|
|
400
408
|
break;
|
|
401
409
|
}
|
|
402
|
-
_context.prev =
|
|
403
|
-
_context.next =
|
|
410
|
+
_context.prev = 6;
|
|
411
|
+
_context.next = 9;
|
|
404
412
|
return cellField.validate();
|
|
405
|
-
case
|
|
406
|
-
_context.next =
|
|
413
|
+
case 9:
|
|
414
|
+
_context.next = 14;
|
|
407
415
|
break;
|
|
408
|
-
case 8:
|
|
409
|
-
_context.prev = 8;
|
|
410
|
-
_context.t0 = _context["catch"](3);
|
|
411
|
-
return _context.abrupt("return");
|
|
412
416
|
case 11:
|
|
417
|
+
_context.prev = 11;
|
|
418
|
+
_context.t0 = _context["catch"](6);
|
|
419
|
+
return _context.abrupt("return");
|
|
420
|
+
case 14:
|
|
413
421
|
if (!isStale()) {
|
|
414
|
-
_context.next =
|
|
422
|
+
_context.next = 16;
|
|
415
423
|
break;
|
|
416
424
|
}
|
|
417
425
|
return _context.abrupt("return");
|
|
418
|
-
case
|
|
426
|
+
case 16:
|
|
419
427
|
if (!(required && isBlank(dataKey != null ? readByFieldPath(record, dataKey) : undefined))) {
|
|
420
|
-
_context.next =
|
|
428
|
+
_context.next = 18;
|
|
421
429
|
break;
|
|
422
430
|
}
|
|
423
431
|
return _context.abrupt("return");
|
|
424
|
-
case
|
|
432
|
+
case 18:
|
|
425
433
|
activeCells.delete(key);
|
|
426
434
|
rerender();
|
|
427
|
-
case
|
|
435
|
+
case 20:
|
|
428
436
|
case "end":
|
|
429
437
|
return _context.stop();
|
|
430
438
|
}
|
|
431
|
-
}, _callee, null, [[
|
|
439
|
+
}, _callee, null, [[6, 11]]);
|
|
432
440
|
}));
|
|
433
|
-
return function handleLeave(_x) {
|
|
441
|
+
return function handleLeave(_x, _x2) {
|
|
434
442
|
return _ref5.apply(this, arguments);
|
|
435
443
|
};
|
|
436
444
|
}();
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
display: inline-flex;
|
|
8
8
|
align-items: center;
|
|
9
9
|
justify-content: center;
|
|
10
|
-
width:
|
|
11
|
-
height:
|
|
10
|
+
width: 24px;
|
|
11
|
+
height: 24px;
|
|
12
|
+
font-size: 16px;
|
|
12
13
|
cursor: pointer;
|
|
13
14
|
pointer-events: auto;
|
|
14
15
|
color: var(--qc-dialog-select-trigger-color, rgba(0, 0, 0, 0.45));
|
|
@@ -19,18 +20,24 @@
|
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
|
|
23
|
+
// 为放大后的入口预留文本空间,避免选中值与图标重叠。
|
|
24
|
+
&.ant-select-single:not(.ant-select-allow-clear) .ant-select-selection-item,
|
|
25
|
+
&.ant-select-single:not(.ant-select-allow-clear) .ant-select-selection-placeholder {
|
|
26
|
+
padding-inline-end: 24px;
|
|
27
|
+
}
|
|
28
|
+
|
|
22
29
|
// 悬停时 antd 会把后缀淡出、换成清除图标;这里让入口始终可见,清除图标左移一格并排。
|
|
23
30
|
&.ant-select.ant-select:hover .ant-select-arrow:not(:last-child) {
|
|
24
31
|
opacity: 1;
|
|
25
32
|
}
|
|
26
33
|
|
|
27
34
|
&.ant-select-allow-clear .ant-select-clear {
|
|
28
|
-
inset-inline-end:
|
|
35
|
+
inset-inline-end: 37px;
|
|
29
36
|
}
|
|
30
37
|
|
|
31
38
|
&.ant-select-allow-clear .ant-select-selection-item,
|
|
32
39
|
&.ant-select-allow-clear .ant-select-selection-placeholder {
|
|
33
|
-
padding-inline-end:
|
|
40
|
+
padding-inline-end: 42px;
|
|
34
41
|
}
|
|
35
42
|
|
|
36
43
|
&.ant-select-multiple .ant-select-selector {
|
|
@@ -48,24 +48,31 @@ var DraggableModal = function DraggableModal(props) {
|
|
|
48
48
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
49
49
|
isResizing = _useState6[0],
|
|
50
50
|
setIsResizing = _useState6[1];
|
|
51
|
-
var _useState7 = (0, _react.useState)(
|
|
52
|
-
_useState8 = _slicedToArray(_useState7, 2),
|
|
53
|
-
resizeDirection = _useState8[0],
|
|
54
|
-
setResizeDirection = _useState8[1];
|
|
55
|
-
var _useState9 = (0, _react.useState)({
|
|
51
|
+
var _useState7 = (0, _react.useState)({
|
|
56
52
|
width: 0,
|
|
57
53
|
height: 0
|
|
58
54
|
}),
|
|
59
|
-
|
|
60
|
-
modalSize =
|
|
61
|
-
setModalSize =
|
|
62
|
-
var
|
|
55
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
56
|
+
modalSize = _useState8[0],
|
|
57
|
+
setModalSize = _useState8[1];
|
|
58
|
+
var _useState9 = (0, _react.useState)({
|
|
63
59
|
x: 0,
|
|
64
60
|
y: 0
|
|
65
61
|
}),
|
|
62
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
63
|
+
modalPosition = _useState10[0],
|
|
64
|
+
setModalPosition = _useState10[1];
|
|
65
|
+
var _useState11 = (0, _react.useState)(false),
|
|
66
66
|
_useState12 = _slicedToArray(_useState11, 2),
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
hasResized = _useState12[0],
|
|
68
|
+
setHasResized = _useState12[1];
|
|
69
|
+
var _useState13 = (0, _react.useState)({
|
|
70
|
+
x: 0,
|
|
71
|
+
y: 0
|
|
72
|
+
}),
|
|
73
|
+
_useState14 = _slicedToArray(_useState13, 2),
|
|
74
|
+
dragPosition = _useState14[0],
|
|
75
|
+
setDragPosition = _useState14[1];
|
|
69
76
|
|
|
70
77
|
// 解构 props,分离出 wrapClassName 和 open
|
|
71
78
|
var propsWrapClassName = props.wrapClassName,
|
|
@@ -89,6 +96,25 @@ var DraggableModal = function DraggableModal(props) {
|
|
|
89
96
|
if (timer !== undefined) clearTimeout(timer);
|
|
90
97
|
};
|
|
91
98
|
}, [open]);
|
|
99
|
+
|
|
100
|
+
// 每次关闭后还原弹窗定位;下次打开仍按调用方传入的默认尺寸居中显示。@author nokecy
|
|
101
|
+
(0, _react.useEffect)(function () {
|
|
102
|
+
if (open) return;
|
|
103
|
+
setIsResizing(false);
|
|
104
|
+
setHasResized(false);
|
|
105
|
+
setModalSize({
|
|
106
|
+
width: 0,
|
|
107
|
+
height: 0
|
|
108
|
+
});
|
|
109
|
+
setModalPosition({
|
|
110
|
+
x: 0,
|
|
111
|
+
y: 0
|
|
112
|
+
});
|
|
113
|
+
setDragPosition({
|
|
114
|
+
x: 0,
|
|
115
|
+
y: 0
|
|
116
|
+
});
|
|
117
|
+
}, [open]);
|
|
92
118
|
var _onStart = function onStart(_event, uiData) {
|
|
93
119
|
var _draggleRef$current;
|
|
94
120
|
var _window$document$docu = window.document.documentElement,
|
|
@@ -126,7 +152,12 @@ var DraggableModal = function DraggableModal(props) {
|
|
|
126
152
|
x: rect.left,
|
|
127
153
|
y: rect.top
|
|
128
154
|
});
|
|
129
|
-
|
|
155
|
+
setHasResized(true);
|
|
156
|
+
// 将当前视觉位置作为新定位基点,避免弹窗自身和 react-draggable 位移重复叠加。@author nokecy
|
|
157
|
+
setDragPosition({
|
|
158
|
+
x: 0,
|
|
159
|
+
y: 0
|
|
160
|
+
});
|
|
130
161
|
setIsResizing(true);
|
|
131
162
|
var startX = e.clientX;
|
|
132
163
|
var startY = e.clientY;
|
|
@@ -139,30 +170,28 @@ var DraggableModal = function DraggableModal(props) {
|
|
|
139
170
|
var deltaY = moveEvent.clientY - startY;
|
|
140
171
|
var newWidth = startWidth;
|
|
141
172
|
var newHeight = startHeight;
|
|
142
|
-
var newLeft = startLeft;
|
|
143
|
-
var newTop = startTop;
|
|
144
173
|
|
|
145
174
|
// 根据方向计算新尺寸
|
|
146
175
|
if (direction.includes('e')) {
|
|
147
|
-
newWidth =
|
|
176
|
+
newWidth = startWidth + deltaX;
|
|
148
177
|
}
|
|
149
178
|
if (direction.includes('w')) {
|
|
150
|
-
newWidth =
|
|
151
|
-
newLeft = startLeft + (startWidth - newWidth);
|
|
179
|
+
newWidth = startWidth - deltaX;
|
|
152
180
|
}
|
|
153
181
|
if (direction.includes('s')) {
|
|
154
|
-
newHeight =
|
|
182
|
+
newHeight = startHeight + deltaY;
|
|
155
183
|
}
|
|
156
184
|
if (direction.includes('n')) {
|
|
157
|
-
newHeight =
|
|
158
|
-
newTop = startTop + (startHeight - newHeight);
|
|
185
|
+
newHeight = startHeight - deltaY;
|
|
159
186
|
}
|
|
160
187
|
|
|
161
|
-
//
|
|
188
|
+
// 限制最小与最大尺寸,再按固定边计算另一侧位置,确保拖哪条边就移动哪条边。@author nokecy
|
|
162
189
|
var maxWidth = window.innerWidth * 0.95;
|
|
163
190
|
var maxHeight = window.innerHeight * 0.95;
|
|
164
|
-
newWidth = Math.min(newWidth, maxWidth);
|
|
165
|
-
newHeight = Math.min(newHeight, maxHeight);
|
|
191
|
+
newWidth = Math.min(Math.max(400, newWidth), maxWidth);
|
|
192
|
+
newHeight = Math.min(Math.max(300, newHeight), maxHeight);
|
|
193
|
+
var newLeft = direction.includes('w') ? startLeft + startWidth - newWidth : startLeft;
|
|
194
|
+
var newTop = direction.includes('n') ? startTop + startHeight - newHeight : startTop;
|
|
166
195
|
|
|
167
196
|
// 直接更新DOM以实现实时效果
|
|
168
197
|
modal.style.width = "".concat(newWidth, "px");
|
|
@@ -191,7 +220,6 @@ var DraggableModal = function DraggableModal(props) {
|
|
|
191
220
|
};
|
|
192
221
|
var handleMouseUp = function handleMouseUp() {
|
|
193
222
|
setIsResizing(false);
|
|
194
|
-
setResizeDirection('');
|
|
195
223
|
document.removeEventListener('mousemove', handleMouseMove);
|
|
196
224
|
document.removeEventListener('mouseup', handleMouseUp);
|
|
197
225
|
|
|
@@ -206,7 +234,8 @@ var DraggableModal = function DraggableModal(props) {
|
|
|
206
234
|
|
|
207
235
|
// 合并类名
|
|
208
236
|
var resizingClass = isResizing ? 'modal-wrap-resizing' : '';
|
|
209
|
-
var
|
|
237
|
+
var resizedClass = hasResized ? 'modal-wrap-resized' : '';
|
|
238
|
+
var mergedWrapClassName = [propsWrapClassName, resizingClass, resizedClass].filter(Boolean).join(' ');
|
|
210
239
|
return /*#__PURE__*/_react.default.createElement(_antd.Modal, _extends({
|
|
211
240
|
maskClosable: false,
|
|
212
241
|
width: width,
|
|
@@ -232,18 +261,27 @@ var DraggableModal = function DraggableModal(props) {
|
|
|
232
261
|
}, props.title),
|
|
233
262
|
modalRender: function modalRender(modal) {
|
|
234
263
|
return /*#__PURE__*/_react.default.createElement(_reactDraggable.default, {
|
|
235
|
-
disabled: disabled,
|
|
264
|
+
disabled: disabled || isResizing,
|
|
236
265
|
bounds: bounds,
|
|
266
|
+
position: dragPosition,
|
|
237
267
|
nodeRef: draggleRef,
|
|
238
268
|
onStart: function onStart(event, uiData) {
|
|
239
269
|
return _onStart(event, uiData);
|
|
240
270
|
},
|
|
271
|
+
onDrag: function onDrag(_event, uiData) {
|
|
272
|
+
return setDragPosition({
|
|
273
|
+
x: uiData.x,
|
|
274
|
+
y: uiData.y
|
|
275
|
+
});
|
|
276
|
+
},
|
|
241
277
|
cancel: ".resize-handle"
|
|
242
278
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
243
279
|
ref: draggleRef,
|
|
244
|
-
style:
|
|
245
|
-
position: '
|
|
246
|
-
|
|
280
|
+
style: hasResized && modalSize.width > 0 ? {
|
|
281
|
+
position: 'fixed',
|
|
282
|
+
left: modalPosition.x,
|
|
283
|
+
top: modalPosition.y,
|
|
284
|
+
height: "".concat(modalSize.height, "px"),
|
|
247
285
|
width: "".concat(modalSize.width, "px"),
|
|
248
286
|
'--modal-width': "".concat(modalSize.width, "px"),
|
|
249
287
|
'--modal-height': "".concat(modalSize.height, "px")
|
|
@@ -8,6 +8,7 @@ var _antdV = require("@formily/antd-v5");
|
|
|
8
8
|
var _antd = require("antd");
|
|
9
9
|
var _react = _interopRequireDefault(require("react"));
|
|
10
10
|
var _hoistStatics = require("./hoistStatics");
|
|
11
|
+
var _selectNumberInputTextOnClick = require("./selectNumberInputTextOnClick");
|
|
11
12
|
var _values = require("./values");
|
|
12
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
14
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
@@ -16,6 +17,7 @@ var readingControl = function readingControl(Control, Preview) {
|
|
|
16
17
|
var map = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (props) {
|
|
17
18
|
return props;
|
|
18
19
|
};
|
|
20
|
+
var selectNumberOnClick = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
19
21
|
var Component = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
|
|
20
22
|
var _props$disabled;
|
|
21
23
|
var _ConfigProvider$useCo = _antd.ConfigProvider.useConfig(),
|
|
@@ -23,7 +25,9 @@ var readingControl = function readingControl(Control, Preview) {
|
|
|
23
25
|
var reading = props.readOnly || ((_props$disabled = props.disabled) !== null && _props$disabled !== void 0 ? _props$disabled : componentDisabled);
|
|
24
26
|
return reading ? /*#__PURE__*/_react.default.createElement(_antdV.PreviewText.Placeholder, {
|
|
25
27
|
value: "\u2014"
|
|
26
|
-
}, /*#__PURE__*/_react.default.createElement(Preview, map(props))) : /*#__PURE__*/_react.default.createElement(Control, _extends({}, props, {
|
|
28
|
+
}, /*#__PURE__*/_react.default.createElement(Preview, map(props))) : /*#__PURE__*/_react.default.createElement(Control, _extends({}, props, selectNumberOnClick ? {
|
|
29
|
+
onClick: (0, _selectNumberInputTextOnClick.selectNumberInputTextOnClick)(props.onClick)
|
|
30
|
+
} : {}, {
|
|
27
31
|
ref: ref
|
|
28
32
|
}));
|
|
29
33
|
});
|
|
@@ -53,7 +57,7 @@ var Input = exports.Input = readingControl(_antd.Input, _antdV.PreviewText.Input
|
|
|
53
57
|
Input.TextArea = readingControl(_antd.Input.TextArea, _antdV.PreviewText.Input);
|
|
54
58
|
Input.Password = readingControl(_antd.Input.Password, PasswordPreview);
|
|
55
59
|
Input.Search = readingControl(_antd.Input.Search, _antdV.PreviewText.Input);
|
|
56
|
-
var InputNumber = exports.InputNumber = readingControl(_antd.InputNumber, _antdV.PreviewText.NumberPicker);
|
|
60
|
+
var InputNumber = exports.InputNumber = readingControl(_antd.InputNumber, _antdV.PreviewText.NumberPicker, undefined, true);
|
|
57
61
|
var Select = exports.Select = readingControl(_antd.Select, ChoicePreview);
|
|
58
62
|
var Switch = exports.Switch = readingControl(_antd.Switch, BooleanPreview);
|
|
59
63
|
var Checkbox = exports.Checkbox = readingControl(_antd.Checkbox, BooleanPreview);
|
|
@@ -8,6 +8,7 @@ var _react = require("@formily/react");
|
|
|
8
8
|
var _react2 = _interopRequireDefault(require("react"));
|
|
9
9
|
var _hoistStatics = require("./hoistStatics");
|
|
10
10
|
var Reading = _interopRequireWildcard(require("./controls"));
|
|
11
|
+
var _selectNumberInputTextOnClick = require("./selectNumberInputTextOnClick");
|
|
11
12
|
var _arrayTable = require("./arrayTable");
|
|
12
13
|
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); }
|
|
13
14
|
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; }
|
|
@@ -30,6 +31,7 @@ function withReadingFields(components) {
|
|
|
30
31
|
Password: Reading.Input.Password
|
|
31
32
|
});
|
|
32
33
|
var wrap = function wrap(Control, Preview) {
|
|
34
|
+
var selectNumberOnClick = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
33
35
|
var Component = (0, _react.observer)(function (props) {
|
|
34
36
|
var field = (0, _react.useField)();
|
|
35
37
|
if (props.disabled || props.readOnly || field !== null && field !== void 0 && field.disabled || field !== null && field !== void 0 && field.readOnly) {
|
|
@@ -41,7 +43,9 @@ function withReadingFields(components) {
|
|
|
41
43
|
disabled: true
|
|
42
44
|
}));
|
|
43
45
|
}
|
|
44
|
-
return /*#__PURE__*/_react2.default.createElement(Control, props
|
|
46
|
+
return /*#__PURE__*/_react2.default.createElement(Control, _extends({}, props, selectNumberOnClick ? {
|
|
47
|
+
onClick: (0, _selectNumberInputTextOnClick.selectNumberInputTextOnClick)(props.onClick)
|
|
48
|
+
} : {}));
|
|
45
49
|
});
|
|
46
50
|
var Wrapped = (0, _hoistStatics.hoistStatics)(Component, Control);
|
|
47
51
|
// 嵌套控件同样按字段状态展示,例如Input.TextArea、DatePicker.RangePicker。
|
|
@@ -58,7 +62,7 @@ function withReadingFields(components) {
|
|
|
58
62
|
try {
|
|
59
63
|
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
60
64
|
var name = _step.value;
|
|
61
|
-
result[name] = wrap(components[name], previews[name]);
|
|
65
|
+
result[name] = wrap(components[name], previews[name], name === 'NumberPicker');
|
|
62
66
|
}
|
|
63
67
|
// ArrayTable 阅读态保留动态列的标题和显隐状态。@author nokecy
|
|
64
68
|
} catch (err) {
|