@nokecy/qc-ui 1.1.76 → 1.1.79

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 (85) hide show
  1. package/dist/cjs/attachment/AttachmentFileButton.d.ts +4 -0
  2. package/dist/cjs/attachment/AttachmentFileButton.js +86 -0
  3. package/dist/cjs/attachment/AttachmentImageUpload.d.ts +16 -0
  4. package/dist/cjs/attachment/AttachmentImageUpload.js +206 -0
  5. package/dist/cjs/attachment/AttachmentPanel.d.ts +8 -0
  6. package/dist/cjs/attachment/AttachmentPanel.js +63 -0
  7. package/dist/cjs/attachment/AttachmentVideoUpload.d.ts +13 -0
  8. package/dist/cjs/attachment/AttachmentVideoUpload.js +88 -0
  9. package/dist/cjs/attachment/ChunkedDragger.d.ts +14 -0
  10. package/dist/cjs/attachment/ChunkedDragger.js +160 -0
  11. package/dist/cjs/attachment/attachmentList.d.ts +91 -0
  12. package/dist/cjs/attachment/attachmentList.js +214 -0
  13. package/dist/cjs/attachment/chunkUpload.d.ts +26 -0
  14. package/dist/cjs/attachment/chunkUpload.js +276 -0
  15. package/dist/cjs/attachment/env.d.ts +41 -0
  16. package/dist/cjs/attachment/env.js +41 -0
  17. package/dist/cjs/attachment/index.d.ts +20 -0
  18. package/dist/cjs/attachment/index.js +92 -0
  19. package/dist/cjs/index.d.ts +2 -0
  20. package/dist/cjs/index.js +24 -0
  21. package/dist/cjs/standardList/StandardAgGridPlus.d.ts +58 -0
  22. package/dist/cjs/standardList/StandardAgGridPlus.js +698 -0
  23. package/dist/cjs/standardList/dateFormat.d.ts +16 -0
  24. package/dist/cjs/standardList/dateFormat.js +56 -0
  25. package/dist/cjs/standardList/emptyState.d.ts +36 -0
  26. package/dist/cjs/standardList/emptyState.js +89 -0
  27. package/dist/cjs/standardList/enumColumns.d.ts +31 -0
  28. package/dist/cjs/standardList/enumColumns.js +87 -0
  29. package/dist/cjs/standardList/gridColumnDefs.d.ts +33 -0
  30. package/dist/cjs/standardList/gridColumnDefs.js +61 -0
  31. package/dist/cjs/standardList/groupedHeaders.d.ts +28 -0
  32. package/dist/cjs/standardList/groupedHeaders.js +84 -0
  33. package/dist/cjs/standardList/groupedHeaders.less +29 -0
  34. package/dist/cjs/standardList/index.d.ts +20 -0
  35. package/dist/cjs/standardList/index.js +176 -0
  36. package/dist/cjs/standardList/listDateDisplay.d.ts +9 -0
  37. package/dist/cjs/standardList/listDateDisplay.js +64 -0
  38. package/dist/cjs/standardList/listDefaultSort.d.ts +38 -0
  39. package/dist/cjs/standardList/listDefaultSort.js +139 -0
  40. package/dist/cjs/standardList/listRefresh.d.ts +25 -0
  41. package/dist/cjs/standardList/listRefresh.js +53 -0
  42. package/dist/esm/attachment/AttachmentFileButton.d.ts +4 -0
  43. package/dist/esm/attachment/AttachmentFileButton.js +77 -0
  44. package/dist/esm/attachment/AttachmentImageUpload.d.ts +16 -0
  45. package/dist/esm/attachment/AttachmentImageUpload.js +199 -0
  46. package/dist/esm/attachment/AttachmentPanel.d.ts +8 -0
  47. package/dist/esm/attachment/AttachmentPanel.js +52 -0
  48. package/dist/esm/attachment/AttachmentVideoUpload.d.ts +13 -0
  49. package/dist/esm/attachment/AttachmentVideoUpload.js +82 -0
  50. package/dist/esm/attachment/ChunkedDragger.d.ts +14 -0
  51. package/dist/esm/attachment/ChunkedDragger.js +153 -0
  52. package/dist/esm/attachment/attachmentList.d.ts +91 -0
  53. package/dist/esm/attachment/attachmentList.js +207 -0
  54. package/dist/esm/attachment/chunkUpload.d.ts +26 -0
  55. package/dist/esm/attachment/chunkUpload.js +272 -0
  56. package/dist/esm/attachment/env.d.ts +41 -0
  57. package/dist/esm/attachment/env.js +35 -0
  58. package/dist/esm/attachment/index.d.ts +20 -0
  59. package/dist/esm/attachment/index.js +14 -0
  60. package/dist/esm/index.d.ts +2 -0
  61. package/dist/esm/index.js +2 -0
  62. package/dist/esm/standardList/StandardAgGridPlus.d.ts +58 -0
  63. package/dist/esm/standardList/StandardAgGridPlus.js +691 -0
  64. package/dist/esm/standardList/dateFormat.d.ts +16 -0
  65. package/dist/esm/standardList/dateFormat.js +50 -0
  66. package/dist/esm/standardList/emptyState.d.ts +36 -0
  67. package/dist/esm/standardList/emptyState.js +83 -0
  68. package/dist/esm/standardList/enumColumns.d.ts +31 -0
  69. package/dist/esm/standardList/enumColumns.js +82 -0
  70. package/dist/esm/standardList/gridColumnDefs.d.ts +33 -0
  71. package/dist/esm/standardList/gridColumnDefs.js +55 -0
  72. package/dist/esm/standardList/groupedHeaders.d.ts +28 -0
  73. package/dist/esm/standardList/groupedHeaders.js +78 -0
  74. package/dist/esm/standardList/groupedHeaders.less +29 -0
  75. package/dist/esm/standardList/index.d.ts +20 -0
  76. package/dist/esm/standardList/index.js +15 -0
  77. package/dist/esm/standardList/listDateDisplay.d.ts +9 -0
  78. package/dist/esm/standardList/listDateDisplay.js +58 -0
  79. package/dist/esm/standardList/listDefaultSort.d.ts +38 -0
  80. package/dist/esm/standardList/listDefaultSort.js +133 -0
  81. package/dist/esm/standardList/listRefresh.d.ts +25 -0
  82. package/dist/esm/standardList/listRefresh.js +47 -0
  83. package/dist/umd/qc-ui.min.css +1 -1
  84. package/dist/umd/qc-ui.min.js +1 -1
  85. package/package.json +1 -1
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "GridEmptyContext", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _emptyState.GridEmptyContext;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "GridEmptyState", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _emptyState.GridEmptyState;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "StandardAgGridColumn", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _StandardAgGridPlus.StandardAgGridColumn;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "StandardAgGridPlus", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _StandardAgGridPlus.StandardAgGridPlus;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "applyColDefSort", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _gridColumnDefs.applyColDefSort;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "applyGridValueEnumToColumns", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _enumColumns.applyGridValueEnumToColumns;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "applyNormalizedEnumFallbacksToColumns", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _enumColumns.applyNormalizedEnumFallbacksToColumns;
46
+ }
47
+ });
48
+ Object.defineProperty(exports, "compositeClasses", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _groupedHeaders.compositeClasses;
52
+ }
53
+ });
54
+ Object.defineProperty(exports, "createNormalizedEnumFallbackRenderer", {
55
+ enumerable: true,
56
+ get: function get() {
57
+ return _enumColumns.createNormalizedEnumFallbackRenderer;
58
+ }
59
+ });
60
+ Object.defineProperty(exports, "detachLiveSortFromColumnDefs", {
61
+ enumerable: true,
62
+ get: function get() {
63
+ return _gridColumnDefs.detachLiveSortFromColumnDefs;
64
+ }
65
+ });
66
+ Object.defineProperty(exports, "firstGridSorter", {
67
+ enumerable: true,
68
+ get: function get() {
69
+ return _gridColumnDefs.firstGridSorter;
70
+ }
71
+ });
72
+ Object.defineProperty(exports, "flattenColumnDefs", {
73
+ enumerable: true,
74
+ get: function get() {
75
+ return _listDefaultSort.flattenColumnDefs;
76
+ }
77
+ });
78
+ Object.defineProperty(exports, "formatDate", {
79
+ enumerable: true,
80
+ get: function get() {
81
+ return _dateFormat.formatDate;
82
+ }
83
+ });
84
+ Object.defineProperty(exports, "formatDateTime", {
85
+ enumerable: true,
86
+ get: function get() {
87
+ return _dateFormat.formatDateTime;
88
+ }
89
+ });
90
+ Object.defineProperty(exports, "getCompositeColumnEdges", {
91
+ enumerable: true,
92
+ get: function get() {
93
+ return _groupedHeaders.getCompositeColumnEdges;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "getListDateType", {
97
+ enumerable: true,
98
+ get: function get() {
99
+ return _listDateDisplay.getListDateType;
100
+ }
101
+ });
102
+ Object.defineProperty(exports, "hasActiveFilter", {
103
+ enumerable: true,
104
+ get: function get() {
105
+ return _emptyState.hasActiveFilter;
106
+ }
107
+ });
108
+ Object.defineProperty(exports, "inferListDefaultSort", {
109
+ enumerable: true,
110
+ get: function get() {
111
+ return _listDefaultSort.inferListDefaultSort;
112
+ }
113
+ });
114
+ Object.defineProperty(exports, "normalizeExtendedDateColumn", {
115
+ enumerable: true,
116
+ get: function get() {
117
+ return _listDateDisplay.normalizeExtendedDateColumn;
118
+ }
119
+ });
120
+ Object.defineProperty(exports, "normalizeListDateColumn", {
121
+ enumerable: true,
122
+ get: function get() {
123
+ return _listDateDisplay.normalizeListDateColumn;
124
+ }
125
+ });
126
+ Object.defineProperty(exports, "readRefreshToken", {
127
+ enumerable: true,
128
+ get: function get() {
129
+ return _listRefresh.readRefreshToken;
130
+ }
131
+ });
132
+ Object.defineProperty(exports, "resolveListSortPolicy", {
133
+ enumerable: true,
134
+ get: function get() {
135
+ return _listDefaultSort.resolveListSortPolicy;
136
+ }
137
+ });
138
+ Object.defineProperty(exports, "shouldRefresh", {
139
+ enumerable: true,
140
+ get: function get() {
141
+ return _listRefresh.shouldRefresh;
142
+ }
143
+ });
144
+ Object.defineProperty(exports, "sortingText", {
145
+ enumerable: true,
146
+ get: function get() {
147
+ return _listDefaultSort.sortingText;
148
+ }
149
+ });
150
+ Object.defineProperty(exports, "withCompositeGroupHeader", {
151
+ enumerable: true,
152
+ get: function get() {
153
+ return _groupedHeaders.withCompositeGroupHeader;
154
+ }
155
+ });
156
+ Object.defineProperty(exports, "withCompositeLeafHeader", {
157
+ enumerable: true,
158
+ get: function get() {
159
+ return _groupedHeaders.withCompositeLeafHeader;
160
+ }
161
+ });
162
+ Object.defineProperty(exports, "withRefreshToken", {
163
+ enumerable: true,
164
+ get: function get() {
165
+ return _listRefresh.withRefreshToken;
166
+ }
167
+ });
168
+ var _StandardAgGridPlus = require("./StandardAgGridPlus");
169
+ var _emptyState = require("./emptyState");
170
+ var _gridColumnDefs = require("./gridColumnDefs");
171
+ var _groupedHeaders = require("./groupedHeaders");
172
+ var _listDateDisplay = require("./listDateDisplay");
173
+ var _dateFormat = require("./dateFormat");
174
+ var _listDefaultSort = require("./listDefaultSort");
175
+ var _listRefresh = require("./listRefresh");
176
+ var _enumColumns = require("./enumColumns");
@@ -0,0 +1,9 @@
1
+ type DateColumn = Record<string, any>;
2
+ type ListDateType = 'dateColumn' | 'dateTimeColumn';
3
+ /** 从日期类型、字段及标题识别日历日期与操作时间,排除耗时和工时。@author nokecy */
4
+ export declare const getListDateType: (column: DateColumn) => ListDateType | undefined;
5
+ /** 列表只格式化展示值,保留数据源中的日期供排序、筛选及提交使用。@author nokecy */
6
+ export declare const normalizeListDateColumn: <T extends DateColumn>(column: T) => T;
7
+ /** 配置扩展列由表格内部追加,必须在注入前配置日期渲染器。@author nokecy */
8
+ export declare const normalizeExtendedDateColumn: <T extends DateColumn>(column: T) => T;
9
+ export {};
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.normalizeListDateColumn = exports.normalizeExtendedDateColumn = exports.getListDateType = void 0;
7
+ var _dateFormat = require("./dateFormat");
8
+ 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); }
9
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
10
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
11
+ 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; }
12
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
13
+ 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); }
14
+ /** 从日期类型、字段及标题识别日历日期与操作时间,排除耗时和工时。@author nokecy */
15
+ var getListDateType = exports.getListDateType = function getListDateType(column) {
16
+ var _column$field, _column$headerName;
17
+ var types = (Array.isArray(column.type) ? column.type : [column.type]).map(String);
18
+ var field = String((_column$field = column.field) !== null && _column$field !== void 0 ? _column$field : '');
19
+ var title = String((_column$headerName = column.headerName) !== null && _column$headerName !== void 0 ? _column$headerName : '');
20
+ if (types.some(function (type) {
21
+ return /^(?:dateTimeColumn|dateTime|DateTimeOffset|System\.DateTime(?:Offset)?)$/i.test(type);
22
+ })) return 'dateTimeColumn';
23
+ if (types.some(function (type) {
24
+ return /^(?:numericColumn|numberColumn|number|rightAligned|bool|boolean)$/i.test(type);
25
+ }) || /耗时|时长|工时|天数|毫秒|秒数|分钟数|星期/.test(title) || /(?:Duration|Days|TimeMs|TimeSeconds|TimeMinutes)$/.test(field)) return undefined;
26
+ if (/时间/.test(title)) return 'dateTimeColumn';
27
+ if (types.some(function (type) {
28
+ return /^(?:dateColumn|date|DateOnly|System\.DateOnly)$/i.test(type);
29
+ })) return 'dateColumn';
30
+ if (/(?:Time|At)$/.test(field) || /^(?:time|createdAt|updatedAt|occurredAt)$/i.test(field) || /(?:Create|Creation|Submit|Submitted|Check|Audit|Approve|Approval|Edit|Editor|Modify|Modified|Change|Update|Confirm|Review)Date$/.test(field) || /^(?:create|creation|submit|check|audit|edit|editor|modify|modified|change|update|confirm|review)Date$/i.test(field)) return 'dateTimeColumn';
31
+ if (/(?:Date)$/.test(field) || /^date$/i.test(field) || /日期|交期|开始日|结束日|截止日/.test(title)) return 'dateColumn';
32
+ return undefined;
33
+ };
34
+
35
+ /** 列表只格式化展示值,保留数据源中的日期供排序、筛选及提交使用。@author nokecy */
36
+ var normalizeListDateColumn = exports.normalizeListDateColumn = function normalizeListDateColumn(column) {
37
+ var _column$type, _column$cellRenderer;
38
+ var dateType = getListDateType(column);
39
+ if (!dateType) return column;
40
+ var formatter = function formatter(_ref) {
41
+ var value = _ref.value;
42
+ return dateType === 'dateTimeColumn' ? (0, _dateFormat.formatDateTime)(value) : (0, _dateFormat.formatDate)(value);
43
+ };
44
+ return _objectSpread(_objectSpread({}, column), {}, {
45
+ type: (_column$type = column.type) !== null && _column$type !== void 0 ? _column$type : dateType,
46
+ valueFormatter: formatter,
47
+ // 某些表格包装层默认渲染原值;显式渲染保证页面列也使用格式化结果。
48
+ cellRenderer: (_column$cellRenderer = column.cellRenderer) !== null && _column$cellRenderer !== void 0 ? _column$cellRenderer : formatter
49
+ });
50
+ };
51
+
52
+ /** 配置扩展列由表格内部追加,必须在注入前配置日期渲染器。@author nokecy */
53
+ var normalizeExtendedDateColumn = exports.normalizeExtendedDateColumn = function normalizeExtendedDateColumn(column) {
54
+ var normalized = normalizeListDateColumn(_objectSpread(_objectSpread({}, column), {}, {
55
+ field: column.name,
56
+ headerName: column.displayName,
57
+ type: column.propertyType
58
+ }));
59
+ if (!getListDateType(normalized)) return column;
60
+ return _objectSpread(_objectSpread({}, column), {}, {
61
+ propertyType: getListDateType(normalized),
62
+ cellRenderer: normalized.cellRenderer
63
+ });
64
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 列表默认排序的纯逻辑:由列定义推断(状态优先、再按记录时间),或由页面显式指定。@author nokecy
3
+ */
4
+ /** 列表默认排序;exclusive 表示由页面显式指定,取代状态/时间推断,其他列的初始排序一并清掉。 */
5
+ export type ListDefaultSort = {
6
+ field: string;
7
+ sort: 'asc' | 'desc';
8
+ sortIndex: number;
9
+ }[] & {
10
+ exclusive?: boolean;
11
+ };
12
+ /** 页面显式指定的默认排序(AgGridPlus 的 defaultSort 属性)。 */
13
+ export type ListDefaultSortOverride = {
14
+ field: string;
15
+ sort: 'asc' | 'desc';
16
+ }[];
17
+ /**
18
+ * 默认排序的字段口径,由宿主提供:
19
+ * `statusFields` 按优先级列出「状态」字段(有状态的单据先按状态升序);
20
+ * `timestampFields` 按优先级列出「记录时间」字段(其次按它倒序)。
21
+ * 不传则不识别状态,只按列名/标题规则推断记录时间。
22
+ */
23
+ export type ListSortPolicy = {
24
+ statusFields?: readonly string[];
25
+ timestampFields?: readonly string[];
26
+ };
27
+ export declare const resolveListSortPolicy: (policy?: ListSortPolicy) => {
28
+ statusFields: string[];
29
+ statusFieldSet: Set<string>;
30
+ timestampFields: string[];
31
+ timestampFieldSet: Set<string>;
32
+ };
33
+ type ResolvedSortPolicy = ReturnType<typeof resolveListSortPolicy>;
34
+ export declare const flattenColumnDefs: (columns: any[] | undefined, result?: Record<string, any>[]) => Record<string, any>[];
35
+ /** 有状态的单据按状态、再按真实记录时间排序;无状态页保留显式业务排序,否则采用实际时间字段。@author nokecy */
36
+ export declare const inferListDefaultSort: (columns: Record<string, any>[], override?: ListDefaultSortOverride, policy?: ListSortPolicy | ResolvedSortPolicy) => ListDefaultSort;
37
+ export declare const sortingText: (sorting: ListDefaultSort) => string;
38
+ export {};
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.sortingText = exports.resolveListSortPolicy = exports.inferListDefaultSort = exports.flattenColumnDefs = void 0;
7
+ 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; } } }; }
8
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
9
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
+ 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); }
11
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
12
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
13
+ 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; }
14
+ /**
15
+ * 列表默认排序的纯逻辑:由列定义推断(状态优先、再按记录时间),或由页面显式指定。@author nokecy
16
+ */
17
+ /** 列表默认排序;exclusive 表示由页面显式指定,取代状态/时间推断,其他列的初始排序一并清掉。 */
18
+
19
+ /** 页面显式指定的默认排序(AgGridPlus 的 defaultSort 属性)。 */
20
+
21
+ /**
22
+ * 默认排序的字段口径,由宿主提供:
23
+ * `statusFields` 按优先级列出「状态」字段(有状态的单据先按状态升序);
24
+ * `timestampFields` 按优先级列出「记录时间」字段(其次按它倒序)。
25
+ * 不传则不识别状态,只按列名/标题规则推断记录时间。
26
+ */
27
+
28
+ var resolveListSortPolicy = exports.resolveListSortPolicy = function resolveListSortPolicy(policy) {
29
+ var _policy$statusFields, _policy$timestampFiel;
30
+ var statusFields = _toConsumableArray((_policy$statusFields = policy === null || policy === void 0 ? void 0 : policy.statusFields) !== null && _policy$statusFields !== void 0 ? _policy$statusFields : []);
31
+ var timestampFields = _toConsumableArray((_policy$timestampFiel = policy === null || policy === void 0 ? void 0 : policy.timestampFields) !== null && _policy$timestampFiel !== void 0 ? _policy$timestampFiel : []);
32
+ return {
33
+ statusFields: statusFields,
34
+ statusFieldSet: new Set(statusFields.map(function (field) {
35
+ return field.toLowerCase();
36
+ })),
37
+ timestampFields: timestampFields,
38
+ timestampFieldSet: new Set(timestampFields.map(function (field) {
39
+ return field.toLowerCase();
40
+ }))
41
+ };
42
+ };
43
+ var isRecordTimestamp = function isRecordTimestamp(column, recordTimestampFieldSet) {
44
+ var _column$field, _column$headerName;
45
+ var field = String((_column$field = column.field) !== null && _column$field !== void 0 ? _column$field : '').toLowerCase();
46
+ var title = String((_column$headerName = column.headerName) !== null && _column$headerName !== void 0 ? _column$headerName : '');
47
+ if (/(?:expiry|expiration|production|manufactur|delivery|required|need|effective|valid|shelf)/i.test(field) || /有效期|生产日期|交货日期|需求日期|要求日期|保质期/.test(title)) return false;
48
+ if (recordTimestampFieldSet.has(field)) return true;
49
+ if (/(?:create|creation|submit|submitted|audit|check|approve|review|modif|update|change|document|order|bill|invoice|statement|receipt|record|business|make|confirm|transfer|occurred).*(?:time|date)$/i.test(field)) return true;
50
+ return (column.type === 'dateColumn' || column.type === 'dateTimeColumn' || /日期|时间/.test(title)) && /创建|制单|单据|开单|录入|发生|提交|审核|修改|更改|业务|对账|开票|确认|转移/.test(title);
51
+ };
52
+ var flattenColumnDefs = exports.flattenColumnDefs = function flattenColumnDefs(columns) {
53
+ var result = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
54
+ var _iterator = _createForOfIteratorHelper(columns !== null && columns !== void 0 ? columns : []),
55
+ _step;
56
+ try {
57
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
58
+ var column = _step.value;
59
+ if (Array.isArray(column === null || column === void 0 ? void 0 : column.children) && column.children.length) flattenColumnDefs(column.children, result);else result.push(column !== null && column !== void 0 ? column : {});
60
+ }
61
+ } catch (err) {
62
+ _iterator.e(err);
63
+ } finally {
64
+ _iterator.f();
65
+ }
66
+ return result;
67
+ };
68
+
69
+ /** 有状态的单据按状态、再按真实记录时间排序;无状态页保留显式业务排序,否则采用实际时间字段。@author nokecy */
70
+ var inferListDefaultSort = exports.inferListDefaultSort = function inferListDefaultSort(columns, override, policy) {
71
+ var _ref = 'statusFieldSet' in (policy !== null && policy !== void 0 ? policy : {}) ? policy : resolveListSortPolicy(policy),
72
+ documentStatusFields = _ref.statusFields,
73
+ recordTimestampFields = _ref.timestampFields,
74
+ timestampFieldSet = _ref.timestampFieldSet;
75
+ if (override !== null && override !== void 0 && override.length) {
76
+ return Object.assign(override.map(function (item, index) {
77
+ return {
78
+ field: item.field,
79
+ sort: item.sort,
80
+ sortIndex: index
81
+ };
82
+ }), {
83
+ exclusive: true
84
+ });
85
+ }
86
+ var leaves = columns.filter(function (column) {
87
+ return column.field && column.sortable !== false;
88
+ });
89
+ var statusColumn = documentStatusFields.map(function (field) {
90
+ return leaves.find(function (column) {
91
+ return String(column.field).toLowerCase() === field.toLowerCase();
92
+ });
93
+ }).find(Boolean);
94
+ var timestamps = leaves.filter(function (column) {
95
+ return isRecordTimestamp(column, timestampFieldSet);
96
+ });
97
+ var timestampColumn = recordTimestampFields.map(function (field) {
98
+ return timestamps.find(function (column) {
99
+ return String(column.field).toLowerCase() === field.toLowerCase();
100
+ });
101
+ }).find(Boolean);
102
+ if (statusColumn) {
103
+ return [{
104
+ field: String(statusColumn.field),
105
+ sort: 'asc',
106
+ sortIndex: 0
107
+ }].concat(_toConsumableArray(timestampColumn ? [{
108
+ field: String(timestampColumn.field),
109
+ sort: 'desc',
110
+ sortIndex: 1
111
+ }] : []));
112
+ }
113
+ var explicitSorts = leaves.filter(function (column) {
114
+ return column.initialSort === 'asc' || column.initialSort === 'desc' || column.sort === 'asc' || column.sort === 'desc';
115
+ }).sort(function (left, right) {
116
+ var _left$sortIndex, _right$sortIndex;
117
+ return Number((_left$sortIndex = left.sortIndex) !== null && _left$sortIndex !== void 0 ? _left$sortIndex : 0) - Number((_right$sortIndex = right.sortIndex) !== null && _right$sortIndex !== void 0 ? _right$sortIndex : 0);
118
+ });
119
+ if (explicitSorts.length) {
120
+ return explicitSorts.map(function (column, index) {
121
+ var _column$initialSort;
122
+ return {
123
+ field: String(column.field),
124
+ sort: (_column$initialSort = column.initialSort) !== null && _column$initialSort !== void 0 ? _column$initialSort : column.sort,
125
+ sortIndex: Number.isFinite(Number(column.sortIndex)) ? Number(column.sortIndex) : index
126
+ };
127
+ });
128
+ }
129
+ return timestampColumn ? [{
130
+ field: String(timestampColumn.field),
131
+ sort: 'desc',
132
+ sortIndex: 0
133
+ }] : [];
134
+ };
135
+ var sortingText = exports.sortingText = function sortingText(sorting) {
136
+ return sorting.map(function (item) {
137
+ return "".concat(item.field, " ").concat(item.sort);
138
+ }).join(', ');
139
+ };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 「保存后回列表,列表要是新的」这件事的判定逻辑。
3
+ *
4
+ * 为什么需要它:`pubGoBack()` 只是 push 回父路径再关掉表单页的标签,
5
+ * 而列表页在 KeepAlive 缓存里,push 回去是**直接复原缓存的那棵树,不会重新拉数据**——
6
+ * 用户刚保存的记录不在列表里,于是以为没存上,再存一遍。全仓有 196 处这样的返回。
7
+ *
8
+ * 判定单独拆出来是因为它有三个都会出错的边界:缓存页不活跃时不能刷、同一个 refresh 值不能重复刷、
9
+ * 挂载时 URL 上已有的 refresh 值不算(那是别人触发的,自己刚加载完,再刷一次纯属浪费)。
10
+ *
11
+ * @author nokecy
12
+ */
13
+ export type RefreshDecisionInput = {
14
+ /** 当前页面是否是活跃页面。KeepAlive 缓存的页面 useEffect 照样在跑,不判这个会串台 */
15
+ isActive: boolean;
16
+ /** URL 上的 refresh 值 */
17
+ refresh?: string | null;
18
+ /** 上一次已经响应过的 refresh 值 */
19
+ lastHandled?: string | null;
20
+ };
21
+ export declare const shouldRefresh: ({ isActive, refresh, lastHandled }: RefreshDecisionInput) => boolean;
22
+ /** 从 location.search 里取 refresh。 */
23
+ export declare const readRefreshToken: (search?: string | null) => string | null;
24
+ /** 给列表路径带上刷新标记;已有 refresh 的会被替换而不是叠加。 */
25
+ export declare const withRefreshToken: (listPath: string, token: string | number) => string;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.withRefreshToken = exports.shouldRefresh = exports.readRefreshToken = void 0;
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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); }
10
+ 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; }
11
+ 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; } }
12
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
+ /**
14
+ * 「保存后回列表,列表要是新的」这件事的判定逻辑。
15
+ *
16
+ * 为什么需要它:`pubGoBack()` 只是 push 回父路径再关掉表单页的标签,
17
+ * 而列表页在 KeepAlive 缓存里,push 回去是**直接复原缓存的那棵树,不会重新拉数据**——
18
+ * 用户刚保存的记录不在列表里,于是以为没存上,再存一遍。全仓有 196 处这样的返回。
19
+ *
20
+ * 判定单独拆出来是因为它有三个都会出错的边界:缓存页不活跃时不能刷、同一个 refresh 值不能重复刷、
21
+ * 挂载时 URL 上已有的 refresh 值不算(那是别人触发的,自己刚加载完,再刷一次纯属浪费)。
22
+ *
23
+ * @author nokecy
24
+ */
25
+
26
+ var shouldRefresh = exports.shouldRefresh = function shouldRefresh(_ref) {
27
+ var isActive = _ref.isActive,
28
+ refresh = _ref.refresh,
29
+ lastHandled = _ref.lastHandled;
30
+ return Boolean(isActive && refresh && refresh !== lastHandled);
31
+ };
32
+
33
+ /** 从 location.search 里取 refresh。 */
34
+ var readRefreshToken = exports.readRefreshToken = function readRefreshToken(search) {
35
+ if (!search) return null;
36
+ try {
37
+ return new URLSearchParams(search).get('refresh');
38
+ } catch (_unused) {
39
+ return null;
40
+ }
41
+ };
42
+
43
+ /** 给列表路径带上刷新标记;已有 refresh 的会被替换而不是叠加。 */
44
+ var withRefreshToken = exports.withRefreshToken = function withRefreshToken(listPath, token) {
45
+ var _listPath$split = listPath.split('?'),
46
+ _listPath$split2 = _slicedToArray(_listPath$split, 2),
47
+ path = _listPath$split2[0],
48
+ _listPath$split2$ = _listPath$split2[1],
49
+ search = _listPath$split2$ === void 0 ? '' : _listPath$split2$;
50
+ var params = new URLSearchParams(search);
51
+ params.set('refresh', String(token));
52
+ return "".concat(path, "?").concat(params.toString());
53
+ };
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import { type AttachmentListProps } from './attachmentList';
3
+ declare const _default: React.ForwardRefExoticComponent<Omit<AttachmentListProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
4
+ export default _default;
@@ -0,0 +1,77 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ 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."); }
3
+ 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); }
4
+ 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; }
5
+ 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; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ /**
8
+ * 附件按钮:点击弹出「文件列表」窗口,窗口内是拖拽上传区和已上传文件列表。
9
+ *
10
+ * @author nokecy
11
+ */
12
+ import { CloudUploadOutlined, InboxOutlined } from '@ant-design/icons';
13
+ import { Button, Modal } from 'antd';
14
+ import React, { useRef, useState } from 'react';
15
+ import { AgGridPlus } from "../ag-grid-plus";
16
+ import { useAttachmentFiles } from "./attachmentList";
17
+ import ChunkedDragger from "./ChunkedDragger";
18
+ var AttachmentFileButton = function AttachmentFileButton(props, ref) {
19
+ var env = props.env,
20
+ gridComponent = props.gridComponent,
21
+ disabled = props.disabled;
22
+ var Grid = gridComponent !== null && gridComponent !== void 0 ? gridComponent : AgGridPlus;
23
+ var tableRef = useRef();
24
+ var _useState = useState(false),
25
+ _useState2 = _slicedToArray(_useState, 2),
26
+ open = _useState2[0],
27
+ setOpen = _useState2[1];
28
+ var _useAttachmentFiles = useAttachmentFiles(props),
29
+ state = _useAttachmentFiles.state,
30
+ onFileChange = _useAttachmentFiles.onFileChange,
31
+ chongfuVerify = _useAttachmentFiles.chongfuVerify,
32
+ columnDefs = _useAttachmentFiles.columnDefs;
33
+ return /*#__PURE__*/React.createElement("span", {
34
+ ref: ref
35
+ }, /*#__PURE__*/React.createElement(Button, {
36
+ type: "primary",
37
+ onClick: function onClick() {
38
+ return setOpen(true);
39
+ }
40
+ }, state && state.length > 0 ? '已上传文件' : '上传'), /*#__PURE__*/React.createElement(Modal, {
41
+ title: "\u6587\u4EF6\u5217\u8868",
42
+ open: open,
43
+ width: 1160,
44
+ onOk: function onOk() {
45
+ return setOpen(false);
46
+ },
47
+ onCancel: function onCancel() {
48
+ return setOpen(false);
49
+ }
50
+ }, /*#__PURE__*/React.createElement(ChunkedDragger, {
51
+ env: env,
52
+ fileList: state,
53
+ disabled: disabled,
54
+ onChange: onFileChange,
55
+ showUploadList: false,
56
+ multiple: true,
57
+ chongfuVerify: chongfuVerify
58
+ }, disabled || state && state.length > 0 ? /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Grid, {
59
+ pagination: false,
60
+ style: {
61
+ minHeight: 130,
62
+ overflowY: 'auto',
63
+ textAlign: 'left',
64
+ height: state ? state.length * 40 : undefined
65
+ },
66
+ hideTool: true,
67
+ search: false,
68
+ gridRef: tableRef,
69
+ dataSource: state || [],
70
+ columnDefs: columnDefs
71
+ }), /*#__PURE__*/React.createElement("p", {
72
+ className: "ant-upload-drag-icon"
73
+ }, /*#__PURE__*/React.createElement(CloudUploadOutlined, null))) : /*#__PURE__*/React.createElement("p", {
74
+ className: "ant-upload-drag-icon"
75
+ }, /*#__PURE__*/React.createElement(InboxOutlined, null)))));
76
+ };
77
+ export default /*#__PURE__*/React.forwardRef(AttachmentFileButton);
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { type AttachmentEnv } from './env';
3
+ export interface AttachmentImageUploadProps {
4
+ /** 宿主环境(用于拼图片地址) */
5
+ env: AttachmentEnv;
6
+ /** 上传一批图片,返回已入库的文件信息(含 blobName、fileName) */
7
+ uploadImages: (files: File[]) => Promise<any[] | undefined>;
8
+ /** 允许的图片数量,大于 1 时值是对象数组,否则是单个 blobName */
9
+ quantity?: number;
10
+ readOnly?: boolean;
11
+ value?: any;
12
+ defaultValue?: any;
13
+ onChange?: (value: any) => void;
14
+ }
15
+ declare const _default: React.ForwardRefExoticComponent<AttachmentImageUploadProps & React.RefAttributes<HTMLDivElement>>;
16
+ export default _default;