@zhenliang/sheet 0.1.7-3.beta.9 → 0.1.7-4.beta.2
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/core/reducers/sideEffectReducer.js +5 -5
- package/dist/core/sheet/Remark.js +2 -2
- package/dist/core/sheet/index.js +32 -1
- package/dist/core/sheet/index.less +2 -0
- package/dist/core/sheet/useMouseEvent.js +4 -2
- package/dist/core/sheet/useRemarkContainer.js +30 -7
- package/dist/core/table/index.js +18 -11
- package/dist/type/sheet.d.ts +5 -3
- package/dist/type/sheetTable.d.ts +2 -1
- package/package.json +2 -2
|
@@ -35,7 +35,7 @@ export var sideEffectReducer = {
|
|
|
35
35
|
cell: cell
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
|
-
cellChangeHandler && cellChangeHandler([cell]);
|
|
38
|
+
cellChangeHandler && cellChangeHandler([cell], undefined, 'Edit');
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
41
|
eventBus.on('cell-create', function (_ref) {
|
|
@@ -307,7 +307,7 @@ export var sideEffectReducer = {
|
|
|
307
307
|
}
|
|
308
308
|
}
|
|
309
309
|
});
|
|
310
|
-
cellChangeHandler && cellChangeHandler(legalChanges, freePaste ? legalExtChanges : []);
|
|
310
|
+
cellChangeHandler && cellChangeHandler(legalChanges, freePaste ? legalExtChanges : [], 'Paste');
|
|
311
311
|
case 18:
|
|
312
312
|
case "end":
|
|
313
313
|
return _context.stop();
|
|
@@ -364,7 +364,7 @@ export var sideEffectReducer = {
|
|
|
364
364
|
history: newHistory
|
|
365
365
|
}
|
|
366
366
|
});
|
|
367
|
-
cellChangeHandler && cellChangeHandler(changes);
|
|
367
|
+
cellChangeHandler && cellChangeHandler(changes, undefined, 'Delete');
|
|
368
368
|
},
|
|
369
369
|
reverse: function reverse(dispatch, getState) {
|
|
370
370
|
var _getState10 = getState(),
|
|
@@ -391,7 +391,7 @@ export var sideEffectReducer = {
|
|
|
391
391
|
});
|
|
392
392
|
return;
|
|
393
393
|
}
|
|
394
|
-
cellChangeHandler && cellChangeHandler(change.changes);
|
|
394
|
+
cellChangeHandler && cellChangeHandler(change.changes, undefined, 'Reverse');
|
|
395
395
|
var recoverChange = _objectSpread(_objectSpread({}, change), {}, {
|
|
396
396
|
changes: change.changes.map(function (item) {
|
|
397
397
|
var _item$row, _item$col;
|
|
@@ -448,7 +448,7 @@ export var sideEffectReducer = {
|
|
|
448
448
|
});
|
|
449
449
|
})
|
|
450
450
|
});
|
|
451
|
-
cellChangeHandler && cellChangeHandler(change.changes);
|
|
451
|
+
cellChangeHandler && cellChangeHandler(change.changes, undefined, 'Recover');
|
|
452
452
|
dispatch({
|
|
453
453
|
type: 'changes',
|
|
454
454
|
payload: {
|
|
@@ -8,9 +8,9 @@ export var Remark = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
8
8
|
var rightOverflow = document.body.clientWidth - position.left < 400;
|
|
9
9
|
var bottomOverflow = document.body.clientHeight - position.top < 400;
|
|
10
10
|
if (rightOverflow && bottomOverflow) {
|
|
11
|
-
return "translate(-100
|
|
11
|
+
return "translate(calc(-100% - 4px), calc(-100% - 4px))";
|
|
12
12
|
} else if (rightOverflow && !bottomOverflow) {
|
|
13
|
-
return "translate(-100
|
|
13
|
+
return "translate(calc(-100% - 4px), 44px)";
|
|
14
14
|
} else if (!rightOverflow && bottomOverflow) {
|
|
15
15
|
return "translate(0, calc(40px - 100%))";
|
|
16
16
|
}
|
package/dist/core/sheet/index.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
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); }
|
|
2
|
+
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; }
|
|
3
|
+
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; }
|
|
4
|
+
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; }
|
|
5
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
6
|
+
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); }
|
|
1
7
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
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."); }
|
|
3
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); }
|
|
@@ -201,6 +207,16 @@ var Sheet = function Sheet(props) {
|
|
|
201
207
|
}
|
|
202
208
|
});
|
|
203
209
|
return history !== null && history !== void 0 ? history : [];
|
|
210
|
+
},
|
|
211
|
+
call: function call(caller) {
|
|
212
|
+
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
213
|
+
args[_key - 1] = arguments[_key];
|
|
214
|
+
}
|
|
215
|
+
return dispatch(function (d, getState) {
|
|
216
|
+
var _getState3 = getState(),
|
|
217
|
+
data = _getState3.data;
|
|
218
|
+
caller === null || caller === void 0 || caller.apply(void 0, args.concat([data]));
|
|
219
|
+
});
|
|
204
220
|
}
|
|
205
221
|
};
|
|
206
222
|
}, [state.history]);
|
|
@@ -221,6 +237,21 @@ var Sheet = function Sheet(props) {
|
|
|
221
237
|
useMouseEvent(dispatch, sheetWrapperRef);
|
|
222
238
|
useKeyBoardEvent(dispatch, sheetWrapperRef);
|
|
223
239
|
var menu = useContextMenu(dispatch, sheetWrapperRef, !!ContextMenu, contextMenuRef);
|
|
240
|
+
var menuCell = useMemo(function () {
|
|
241
|
+
var _data$cellPosition$ro, _data$cellPosition$ro2, _data$cellPosition$ro3;
|
|
242
|
+
var cellPosition = menu.cellPosition,
|
|
243
|
+
showMenu = menu.showMenu;
|
|
244
|
+
if (!showMenu) {
|
|
245
|
+
return cellPosition;
|
|
246
|
+
}
|
|
247
|
+
var _ref2 = (_data$cellPosition$ro = data === null || data === void 0 || (_data$cellPosition$ro2 = data[cellPosition.row]) === null || _data$cellPosition$ro2 === void 0 ? void 0 : _data$cellPosition$ro2[cellPosition.col - 1 - ((_data$cellPosition$ro3 = data[cellPosition.row][0].col) !== null && _data$cellPosition$ro3 !== void 0 ? _data$cellPosition$ro3 : 0)]) !== null && _data$cellPosition$ro !== void 0 ? _data$cellPosition$ro : {},
|
|
248
|
+
id = _ref2.id,
|
|
249
|
+
dataIndex = _ref2.dataIndex;
|
|
250
|
+
return _objectSpread(_objectSpread({}, cellPosition), {}, {
|
|
251
|
+
id: id,
|
|
252
|
+
key: dataIndex
|
|
253
|
+
});
|
|
254
|
+
}, [data, menu.cellPosition]);
|
|
224
255
|
var _useRemarkContainer = useRemarkContainer(sheetWrapperRef, state.start, state.editing, showRemark),
|
|
225
256
|
remarkInfo = _useRemarkContainer.remarkInfo;
|
|
226
257
|
|
|
@@ -383,7 +414,7 @@ var Sheet = function Sheet(props) {
|
|
|
383
414
|
}, "sheet"), /*#__PURE__*/_jsx(Menu, {
|
|
384
415
|
ref: contextMenuRef,
|
|
385
416
|
position: menu.position,
|
|
386
|
-
cell:
|
|
417
|
+
cell: menuCell,
|
|
387
418
|
showMenu: menu.showMenu,
|
|
388
419
|
contextMenu: ContextMenu,
|
|
389
420
|
onContextMenu: onContextMenu
|
|
@@ -386,9 +386,11 @@ span.harvest-sheet-container:focus {
|
|
|
386
386
|
z-index: 10;
|
|
387
387
|
margin-left: 5px;
|
|
388
388
|
overflow: auto;
|
|
389
|
+
scroll-behavior: smooth;
|
|
389
390
|
padding: 0;
|
|
390
391
|
background: rgb(255,255,255);
|
|
391
392
|
box-shadow: 0 4px 8px rgba(216,223,235,.5);
|
|
393
|
+
transition: top .1s linear,left .1s linear,transform .05s linear;
|
|
392
394
|
}
|
|
393
395
|
.harvest-remark-container::-webkit-scrollbar{
|
|
394
396
|
display: none;
|
|
@@ -188,7 +188,9 @@ export var useMouseEvent = function useMouseEvent(dispatch, elementRef) {
|
|
|
188
188
|
});
|
|
189
189
|
}, []);
|
|
190
190
|
var mouseUp = useCallback(function (e) {
|
|
191
|
-
|
|
191
|
+
// input select 问题
|
|
192
|
+
// e.preventDefault();
|
|
193
|
+
|
|
192
194
|
resetInterval();
|
|
193
195
|
var currentCell = findParentTd(e.target);
|
|
194
196
|
if (!currentCell || currentCell.classList.contains('fixed')) {
|
|
@@ -287,7 +289,7 @@ export var useMouseEvent = function useMouseEvent(dispatch, elementRef) {
|
|
|
287
289
|
}, []);
|
|
288
290
|
useEffect(function () {
|
|
289
291
|
if (elementRef.current) {
|
|
290
|
-
if (navigator.appVersion.indexOf(
|
|
292
|
+
if (navigator.appVersion.indexOf('Mac') !== -1) {
|
|
291
293
|
elementRef.current.style.setProperty('--arrow-down', 'var(--arrow-mac-down)');
|
|
292
294
|
elementRef.current.style.setProperty('--arrow-right', 'var(--arrow-mac-right)');
|
|
293
295
|
}
|
|
@@ -62,21 +62,44 @@ export var useRemarkContainer = function useRemarkContainer(elementRef, start, e
|
|
|
62
62
|
}, [showRemark, editing]);
|
|
63
63
|
useEffect(function () {
|
|
64
64
|
var _elementRef$current, _elementRef$current2;
|
|
65
|
-
var
|
|
66
|
-
setRemarkInfo({
|
|
67
|
-
show: false
|
|
68
|
-
});
|
|
69
|
-
}, 50);
|
|
65
|
+
var scrollTimer;
|
|
70
66
|
var remarkScrollEnd = function remarkScrollEnd() {
|
|
71
67
|
var position = calcPosition();
|
|
72
68
|
if (!position) {
|
|
73
69
|
return;
|
|
74
70
|
}
|
|
71
|
+
// end called
|
|
72
|
+
if (scrollTimer) {
|
|
73
|
+
clearTimeout(scrollTimer);
|
|
74
|
+
}
|
|
75
75
|
setRemarkInfo({
|
|
76
76
|
position: position,
|
|
77
77
|
show: position.visible && showRemark && !editing && position.left > 0 && position.top > 0
|
|
78
78
|
});
|
|
79
79
|
};
|
|
80
|
+
var remarkScroll = throttle(function () {
|
|
81
|
+
var _ref = elementRef.current || {},
|
|
82
|
+
_ref$scrollTop = _ref.scrollTop,
|
|
83
|
+
scrollTop = _ref$scrollTop === void 0 ? 0 : _ref$scrollTop,
|
|
84
|
+
_ref$scrollHeight = _ref.scrollHeight,
|
|
85
|
+
scrollHeight = _ref$scrollHeight === void 0 ? 0 : _ref$scrollHeight,
|
|
86
|
+
_ref$clientHeight = _ref.clientHeight,
|
|
87
|
+
clientHeight = _ref$clientHeight === void 0 ? 0 : _ref$clientHeight;
|
|
88
|
+
// 滚动条抖动导致的
|
|
89
|
+
if (Math.abs(clientHeight + scrollTop - scrollHeight) <= 1) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
setRemarkInfo({
|
|
93
|
+
show: false
|
|
94
|
+
});
|
|
95
|
+
if (scrollTimer) {
|
|
96
|
+
clearTimeout(scrollTimer);
|
|
97
|
+
}
|
|
98
|
+
scrollTimer = setTimeout(function () {
|
|
99
|
+
remarkScrollEnd();
|
|
100
|
+
clearTimeout(scrollTimer);
|
|
101
|
+
}, 100);
|
|
102
|
+
}, 50);
|
|
80
103
|
(_elementRef$current = elementRef.current) === null || _elementRef$current === void 0 || _elementRef$current.addEventListener('scroll', remarkScroll);
|
|
81
104
|
(_elementRef$current2 = elementRef.current) === null || _elementRef$current2 === void 0 || _elementRef$current2.addEventListener('scrollend', remarkScrollEnd);
|
|
82
105
|
return function () {
|
|
@@ -96,13 +119,13 @@ export var useRemarkContainer = function useRemarkContainer(elementRef, start, e
|
|
|
96
119
|
}
|
|
97
120
|
var io = new IntersectionObserver(function (entries) {
|
|
98
121
|
var ratio = entries[0].intersectionRatio;
|
|
99
|
-
if (ratio <
|
|
122
|
+
if (ratio < 0.5) {
|
|
100
123
|
setRemarkInfo({
|
|
101
124
|
show: false
|
|
102
125
|
});
|
|
103
126
|
}
|
|
104
127
|
}, {
|
|
105
|
-
threshold:
|
|
128
|
+
threshold: 0.5
|
|
106
129
|
});
|
|
107
130
|
io.observe(cell);
|
|
108
131
|
return function () {
|
package/dist/core/table/index.js
CHANGED
|
@@ -69,14 +69,14 @@ var Table = function Table(_ref) {
|
|
|
69
69
|
useImperativeHandle(sheetRef, function () {
|
|
70
70
|
return new Proxy({}, {
|
|
71
71
|
get: function get(target, property) {
|
|
72
|
-
var _sheetInstance$
|
|
72
|
+
var _sheetInstance$curren4;
|
|
73
73
|
if (property === 'goToByTable') {
|
|
74
|
-
|
|
75
|
-
var _sheetInstance$curren, _sheetInstance$curren2;
|
|
76
|
-
var toCol =
|
|
77
|
-
return
|
|
78
|
-
})
|
|
79
|
-
var toRow =
|
|
74
|
+
var goToByTable = function goToByTable(id, columnKey, currentData) {
|
|
75
|
+
var _currentData$, _sheetInstance$curren, _sheetInstance$curren2;
|
|
76
|
+
var toCol = currentData === null || currentData === void 0 || (_currentData$ = currentData[0]) === null || _currentData$ === void 0 ? void 0 : _currentData$.findIndex(function (d) {
|
|
77
|
+
return d.dataIndex === columnKey;
|
|
78
|
+
});
|
|
79
|
+
var toRow = currentData.findIndex(function (d) {
|
|
80
80
|
return String(d === null || d === void 0 ? void 0 : d[0].id) === String(id);
|
|
81
81
|
});
|
|
82
82
|
(_sheetInstance$curren = sheetInstance.current) === null || _sheetInstance$curren === void 0 || _sheetInstance$curren.goTo(toRow, toCol);
|
|
@@ -91,11 +91,18 @@ var Table = function Table(_ref) {
|
|
|
91
91
|
}
|
|
92
92
|
});
|
|
93
93
|
};
|
|
94
|
+
return function () {
|
|
95
|
+
var _sheetInstance$curren3;
|
|
96
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
97
|
+
args[_key] = arguments[_key];
|
|
98
|
+
}
|
|
99
|
+
(_sheetInstance$curren3 = sheetInstance.current) === null || _sheetInstance$curren3 === void 0 || _sheetInstance$curren3.call.apply(_sheetInstance$curren3, [goToByTable].concat(args));
|
|
100
|
+
};
|
|
94
101
|
}
|
|
95
|
-
return (_sheetInstance$
|
|
102
|
+
return (_sheetInstance$curren4 = sheetInstance.current) === null || _sheetInstance$curren4 === void 0 ? void 0 : _sheetInstance$curren4[property];
|
|
96
103
|
}
|
|
97
104
|
});
|
|
98
|
-
}, [columns,
|
|
105
|
+
}, [columns, dataSource, offset]);
|
|
99
106
|
var _useRowSelection = useRowSelection(dataSource, rowSelection, hasChildren),
|
|
100
107
|
_useRowSelection2 = _slicedToArray(_useRowSelection, 2),
|
|
101
108
|
checkedRow = _useRowSelection2[0],
|
|
@@ -133,7 +140,7 @@ var Table = function Table(_ref) {
|
|
|
133
140
|
setData([[]]);
|
|
134
141
|
}
|
|
135
142
|
}, [dataSource, columns]);
|
|
136
|
-
var handleChanges = useCallback(function (changes, extChange) {
|
|
143
|
+
var handleChanges = useCallback(function (changes, extChange, type) {
|
|
137
144
|
if (freeze) return;
|
|
138
145
|
onChange && onChange(changes.map(function (item) {
|
|
139
146
|
return {
|
|
@@ -151,7 +158,7 @@ var Table = function Table(_ref) {
|
|
|
151
158
|
key: item.key || columns[item.col - offset].dataIndex,
|
|
152
159
|
value: item.value
|
|
153
160
|
};
|
|
154
|
-
}));
|
|
161
|
+
}), type);
|
|
155
162
|
}, [columns, onChange, hasControl, freeze]);
|
|
156
163
|
var handleReverse = useCallback(function (value) {
|
|
157
164
|
var _ref2 = value,
|
package/dist/type/sheet.d.ts
CHANGED
|
@@ -69,8 +69,9 @@ export type CellData = {
|
|
|
69
69
|
key?: string;
|
|
70
70
|
value?: string;
|
|
71
71
|
};
|
|
72
|
+
export type ChangeType = 'Edit' | 'Paste' | 'Delete' | 'Reverse' | 'Recover';
|
|
72
73
|
export type CellNavigable = (cell?: Cell, row?: number, col?: number) => boolean;
|
|
73
|
-
export type CellChangeHandler = (cells: CellData[], additions
|
|
74
|
+
export type CellChangeHandler = (cells: CellData[], additions: CellData[] | undefined, type: ChangeType) => void;
|
|
74
75
|
export type RowGroup = {
|
|
75
76
|
groupName: string;
|
|
76
77
|
groupStart: number;
|
|
@@ -90,7 +91,7 @@ export type MenuRenderProps = {
|
|
|
90
91
|
top: number;
|
|
91
92
|
left: number;
|
|
92
93
|
};
|
|
93
|
-
cell?: CellPosition
|
|
94
|
+
cell?: CellPosition & Partial<Cell>;
|
|
94
95
|
onContextMenu?: (event: any) => void;
|
|
95
96
|
children?: ReactNode | ReactNode[];
|
|
96
97
|
target?: any;
|
|
@@ -106,6 +107,7 @@ export type SheetInstance = {
|
|
|
106
107
|
}) => void;
|
|
107
108
|
popHistory: () => OperateHistory;
|
|
108
109
|
dropHistory: () => OperateHistory[];
|
|
110
|
+
call: (caller: (...args: any) => void, ...args: any) => void;
|
|
109
111
|
};
|
|
110
112
|
export type SheetProps = {
|
|
111
113
|
sheetInstance?: React.MutableRefObject<SheetInstance | null>;
|
|
@@ -232,7 +234,7 @@ export type UpdateStateType = {
|
|
|
232
234
|
lastEditing: CellPosition & {
|
|
233
235
|
confirm?: boolean;
|
|
234
236
|
};
|
|
235
|
-
cellChangeHandler: (cells: CellData[], additions
|
|
237
|
+
cellChangeHandler: (cells: CellData[], additions: CellData[] | undefined, type: ChangeType) => void;
|
|
236
238
|
fixedInfo: SheetType.FixedInfo[];
|
|
237
239
|
} & SearchState;
|
|
238
240
|
export type UpdateFocus = (start: CellPosition, end: CellPosition) => void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CSSProperties, ReactNode } from 'react';
|
|
2
2
|
import { SheetType } from '.';
|
|
3
|
+
import { ChangeType } from './sheet';
|
|
3
4
|
export type refAssertion = {
|
|
4
5
|
contains?: (target: EventTarget | null) => boolean;
|
|
5
6
|
focus?: () => boolean;
|
|
@@ -100,7 +101,7 @@ export type TableProps = {
|
|
|
100
101
|
groupConfig?: TableGroupConfig;
|
|
101
102
|
menuRenderer?: React.FC<SheetType.MenuRenderProps>;
|
|
102
103
|
onContextMenu?: (event: any) => void;
|
|
103
|
-
onChange: (changes: TableChange[], extChanges
|
|
104
|
+
onChange: (changes: TableChange[], extChanges: TableChange[] | undefined, type: ChangeType) => void;
|
|
104
105
|
handleAdd?: () => void;
|
|
105
106
|
handleBatchAdd?: (value: number) => void;
|
|
106
107
|
eventHandler?: Record<'reverse' | 'btn-click' | 'cell-edit' | 'cell-switch' | string, undefined | EventHandler>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhenliang/sheet",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.74.beta.2",
|
|
4
4
|
"description": "A react library developed with dumi",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -85,4 +85,4 @@
|
|
|
85
85
|
"fizz.zhou@ap.jll.com"
|
|
86
86
|
],
|
|
87
87
|
"preid": "beta"
|
|
88
|
-
}
|
|
88
|
+
}
|