@nokecy/qc-ui 1.1.76 → 1.1.78
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/index.d.ts +1 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/standardList/StandardAgGridPlus.d.ts +58 -0
- package/dist/cjs/standardList/StandardAgGridPlus.js +698 -0
- package/dist/cjs/standardList/dateFormat.d.ts +16 -0
- package/dist/cjs/standardList/dateFormat.js +56 -0
- package/dist/cjs/standardList/emptyState.d.ts +36 -0
- package/dist/cjs/standardList/emptyState.js +89 -0
- package/dist/cjs/standardList/enumColumns.d.ts +31 -0
- package/dist/cjs/standardList/enumColumns.js +87 -0
- package/dist/cjs/standardList/gridColumnDefs.d.ts +33 -0
- package/dist/cjs/standardList/gridColumnDefs.js +61 -0
- package/dist/cjs/standardList/groupedHeaders.d.ts +28 -0
- package/dist/cjs/standardList/groupedHeaders.js +84 -0
- package/dist/cjs/standardList/groupedHeaders.less +29 -0
- package/dist/cjs/standardList/index.d.ts +20 -0
- package/dist/cjs/standardList/index.js +176 -0
- package/dist/cjs/standardList/listDateDisplay.d.ts +9 -0
- package/dist/cjs/standardList/listDateDisplay.js +64 -0
- package/dist/cjs/standardList/listDefaultSort.d.ts +38 -0
- package/dist/cjs/standardList/listDefaultSort.js +139 -0
- package/dist/cjs/standardList/listRefresh.d.ts +25 -0
- package/dist/cjs/standardList/listRefresh.js +53 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/standardList/StandardAgGridPlus.d.ts +58 -0
- package/dist/esm/standardList/StandardAgGridPlus.js +691 -0
- package/dist/esm/standardList/dateFormat.d.ts +16 -0
- package/dist/esm/standardList/dateFormat.js +50 -0
- package/dist/esm/standardList/emptyState.d.ts +36 -0
- package/dist/esm/standardList/emptyState.js +83 -0
- package/dist/esm/standardList/enumColumns.d.ts +31 -0
- package/dist/esm/standardList/enumColumns.js +82 -0
- package/dist/esm/standardList/gridColumnDefs.d.ts +33 -0
- package/dist/esm/standardList/gridColumnDefs.js +55 -0
- package/dist/esm/standardList/groupedHeaders.d.ts +28 -0
- package/dist/esm/standardList/groupedHeaders.js +78 -0
- package/dist/esm/standardList/groupedHeaders.less +29 -0
- package/dist/esm/standardList/index.d.ts +20 -0
- package/dist/esm/standardList/index.js +15 -0
- package/dist/esm/standardList/listDateDisplay.d.ts +9 -0
- package/dist/esm/standardList/listDateDisplay.js +58 -0
- package/dist/esm/standardList/listDefaultSort.d.ts +38 -0
- package/dist/esm/standardList/listDefaultSort.js +133 -0
- package/dist/esm/standardList/listRefresh.d.ts +25 -0
- package/dist/esm/standardList/listRefresh.js +47 -0
- package/dist/umd/qc-ui.min.css +1 -1
- package/dist/umd/qc-ui.min.js +1 -1
- 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
|
+
};
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ 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
34
|
export * from "./readPretty";
|
|
35
|
+
export * from "./standardList";
|
|
35
36
|
export { createEntitySelect } from "./entitySelect";
|
|
36
37
|
export { default as ExportButton, buildExportUrl, DEFAULT_EXPORT_TEMPLATE_API, resolveExportAction, resolveExportError, resolveFileName } from "./exportButton";
|
|
37
38
|
export type { ExportButtonProps, ExportTemplateApi, ExportTemplateOption } from "./exportButton";
|
package/dist/esm/index.js
CHANGED
|
@@ -43,6 +43,7 @@ useSchemeManager, useGridSchemes, LocalStorageSchemeAdapter, BackendApiSchemeAda
|
|
|
43
43
|
// 分页适配器:值 + 类型一并导出,支持非 ABP 后端注入
|
|
44
44
|
export * from "./adapters";
|
|
45
45
|
export * from "./readPretty";
|
|
46
|
+
export * from "./standardList";
|
|
46
47
|
export { createEntitySelect } from "./entitySelect";
|
|
47
48
|
export { default as ExportButton, buildExportUrl, DEFAULT_EXPORT_TEMPLATE_API, resolveExportAction, resolveExportError, resolveFileName } from "./exportButton";
|
|
48
49
|
export { saveAs } from "./utils/download";
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { AgGridColumnPropsClone, GridRef } from '../ag-grid-plus/interface';
|
|
3
|
+
import { type EnumFallbackRenderer } from './enumColumns';
|
|
4
|
+
import './groupedHeaders.less';
|
|
5
|
+
import { type ListSortPolicy } from './listDefaultSort';
|
|
6
|
+
/**
|
|
7
|
+
* 标准列表的宿主口径。
|
|
8
|
+
* - `enumFallbackRenderer`:枚举列未命中时的显示(如「未知(原码)」);不传则显示原码。
|
|
9
|
+
* - `sortPolicy`:默认排序识别的状态字段与记录时间字段。
|
|
10
|
+
*/
|
|
11
|
+
export interface StandardListPolicy {
|
|
12
|
+
enumFallbackRenderer?: EnumFallbackRenderer;
|
|
13
|
+
sortPolicy?: ListSortPolicy;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 标准列表列定义:在表格列定义上补 businessKey。
|
|
17
|
+
* businessKey 为 true 表示该列是业务单号(如 mrpID、mpsID),不按「ID 结尾」当内部键隐藏。
|
|
18
|
+
* @author nokecy
|
|
19
|
+
*/
|
|
20
|
+
export type AppGridColumn = AgGridColumnPropsClone & {
|
|
21
|
+
businessKey?: boolean;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* 标准列表基座:在 AgGridPlus 外面包一层公司列表规范(序号、内部字段隐藏、日期显示、分组表头、空态四分支、
|
|
25
|
+
* 默认排序、枚举回退等)。宿主的页面一律经宿主自己的薄封装导入它,这里加一次,等于所有列表页都有了。
|
|
26
|
+
* 与路由相关的刷新令牌和宿主口径(未知值文案、排序字段)由宿主通过属性传入。
|
|
27
|
+
*
|
|
28
|
+
* 这层目前做三件事:
|
|
29
|
+
*
|
|
30
|
+
* 1. **从表单页保存返回时,把列表刷新一遍**。
|
|
31
|
+
* 起因是 `pubGoBack()` 只 push 回父路径再关掉表单页标签,而列表页在 KeepAlive 缓存里,
|
|
32
|
+
* push 回去是直接复原缓存的那棵树,不会重新请求——用户刚保存的记录不在列表里,
|
|
33
|
+
* 于是以为没存上,再存一遍。全仓 196 处返回都是这个行为。
|
|
34
|
+
* 为什么不直接 `dropByCacheKey(列表路径)` 把缓存丢掉:那样确实会重新加载,
|
|
35
|
+
* 但连筛选条件、滚动位置、分页和列宽一起丢了。用户进表单前设的筛选,回来就没了。
|
|
36
|
+
* 走 URL 上的 refresh 标记只重新取数,页面状态原样保留。
|
|
37
|
+
*
|
|
38
|
+
* 2. **空态四分支(U2)**:无数据 / 筛选无结果 / 无权限(403) / 加载失败。
|
|
39
|
+
* qc-ui 只支持一句空数据文字(overlayNoRowsTemplateText),分不出四种情况。
|
|
40
|
+
* 这里用 AG-Grid 原生的 `noRowsOverlayComponent`(优先级高于 overlayNoRowsTemplate)
|
|
41
|
+
* 挂 `GridEmptyState`,请求成败与是否带筛选经 context 传给 overlay 组件。
|
|
42
|
+
* 业务页可通过 `emptyActions` 注入「无数据」分支的操作(通常是 Access 包裹的新建按钮),
|
|
43
|
+
* 或用自己的 `noRowsOverlayComponent` 整体覆盖。
|
|
44
|
+
*
|
|
45
|
+
* 3. **valueEnum 文字对比度**:qc-ui 把 `valueEnum.color` 当 CSS 文字色,缺 color 时写成
|
|
46
|
+
* `#ffffff`(销售跟踪「类型」列「普通订单」白底白字就是这条)。封装层给 columnDefs
|
|
47
|
+
* 和 AgGridColumn 统一套 `gridValueEnum()`:缺色用 inherit,浅色 / 预设名收成白底 ≥4.5:1。
|
|
48
|
+
*
|
|
49
|
+
* 4. **列定义上的 live `sort`**:AG Grid 把 `ColDef.sort` 当受控属性,每次 columnDefs 引用变化
|
|
50
|
+
* 都会强制写回。送货单点「送货日期」降序后再点单元格,选中态 setState 重建列定义,
|
|
51
|
+
* 默认「单号升序」被重新套上,排序就自己变了。封装层把 `sort` 收成只用于建列的 `initialSort`。
|
|
52
|
+
*
|
|
53
|
+
* @author nokecy
|
|
54
|
+
*/
|
|
55
|
+
declare const StandardAgGridColumn: React.FC<any>;
|
|
56
|
+
declare const StandardAgGridPlus: React.FC<any>;
|
|
57
|
+
export { StandardAgGridColumn, StandardAgGridPlus };
|
|
58
|
+
export type { GridRef };
|