@univerjs/core 1.2.0 → 1.3.0
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/lib/cjs/index.js +126 -84
- package/lib/es/index.js +124 -85
- package/lib/index.js +124 -85
- package/lib/types/docs/data-model/text-x/utils.d.ts +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/sheets/sheet-dimensions.d.ts +21 -0
- package/lib/umd/index.js +7 -7
- package/package.json +4 -4
package/lib/cjs/index.js
CHANGED
|
@@ -1699,7 +1699,7 @@ let ThemeColors = /* @__PURE__ */ function(ThemeColors) {
|
|
|
1699
1699
|
//#endregion
|
|
1700
1700
|
//#region package.json
|
|
1701
1701
|
var name = "@univerjs/core";
|
|
1702
|
-
var version = "1.
|
|
1702
|
+
var version = "1.3.0";
|
|
1703
1703
|
|
|
1704
1704
|
//#endregion
|
|
1705
1705
|
//#region src/common/array.ts
|
|
@@ -15723,10 +15723,10 @@ function getBlockRangeSlice(body, startOffset, endOffset, mode = 0) {
|
|
|
15723
15723
|
const { blockRanges = [] } = body;
|
|
15724
15724
|
const newBlockRanges = [];
|
|
15725
15725
|
for (const blockRange of blockRanges) {
|
|
15726
|
-
const
|
|
15727
|
-
|
|
15728
|
-
|
|
15729
|
-
...
|
|
15726
|
+
const { startIndex, endIndex } = blockRange;
|
|
15727
|
+
if (!(mode === 1 ? startIndex >= startOffset && endIndex < endOffset : hasStructuralRangeInSlice(startIndex, endIndex, startOffset, endOffset, mode))) continue;
|
|
15728
|
+
newBlockRanges.push({
|
|
15729
|
+
...blockRange,
|
|
15730
15730
|
...getSlicedStructuralRange(startIndex, endIndex, startOffset, endOffset, mode)
|
|
15731
15731
|
});
|
|
15732
15732
|
}
|
|
@@ -20183,6 +20183,7 @@ var RichTextBuilder = class RichTextBuilder extends RichTextValue {
|
|
|
20183
20183
|
_defineProperty(this, "_trackedRanges", /* @__PURE__ */ new Set());
|
|
20184
20184
|
_defineProperty(this, "_childHandleRevision", 0);
|
|
20185
20185
|
this._doc = new DocumentDataModel(data);
|
|
20186
|
+
this._data.body = this._doc.getBody();
|
|
20186
20187
|
}
|
|
20187
20188
|
/**
|
|
20188
20189
|
* Returns editable paragraph handles backed by this detached rich-text builder.
|
|
@@ -22514,6 +22515,96 @@ function convertTextRotation(textRotation) {
|
|
|
22514
22515
|
};
|
|
22515
22516
|
}
|
|
22516
22517
|
|
|
22518
|
+
//#endregion
|
|
22519
|
+
//#region src/sheets/sheet-dimensions.ts
|
|
22520
|
+
function isValidSheetDimension(value, allowZero = true) {
|
|
22521
|
+
return typeof value === "number" && Number.isFinite(value) && (allowZero ? value >= 0 : value > 0);
|
|
22522
|
+
}
|
|
22523
|
+
function normalizeSheetDimension(value, fallback, allowZero = true) {
|
|
22524
|
+
return isValidSheetDimension(value, allowZero) ? value : fallback;
|
|
22525
|
+
}
|
|
22526
|
+
function isValidColumnDimensions(data) {
|
|
22527
|
+
return (data === null || data === void 0 ? void 0 : data.w) == null || isValidSheetDimension(data.w);
|
|
22528
|
+
}
|
|
22529
|
+
function isValidRowDimensions(data) {
|
|
22530
|
+
return ((data === null || data === void 0 ? void 0 : data.h) == null || isValidSheetDimension(data.h)) && ((data === null || data === void 0 ? void 0 : data.ah) == null || isValidSheetDimension(data.ah));
|
|
22531
|
+
}
|
|
22532
|
+
|
|
22533
|
+
//#endregion
|
|
22534
|
+
//#region src/sheets/sheet-snapshot-utils.ts
|
|
22535
|
+
const DEFAULT_WORKSHEET_ROW_COUNT_KEY = "DEFAULT_WORKSHEET_ROW_COUNT";
|
|
22536
|
+
const DEFAULT_WORKSHEET_ROW_COUNT = 1e3;
|
|
22537
|
+
const DEFAULT_WORKSHEET_COLUMN_COUNT_KEY = "DEFAULT_WORKSHEET_COLUMN_COUNT";
|
|
22538
|
+
const DEFAULT_WORKSHEET_COLUMN_COUNT = 20;
|
|
22539
|
+
const DEFAULT_WORKSHEET_ROW_HEIGHT_KEY = "DEFAULT_WORKSHEET_ROW_HEIGHT";
|
|
22540
|
+
const DEFAULT_WORKSHEET_ROW_HEIGHT = 24;
|
|
22541
|
+
const DEFAULT_WORKSHEET_COLUMN_WIDTH_KEY = "DEFAULT_WORKSHEET_COLUMN_WIDTH";
|
|
22542
|
+
const DEFAULT_WORKSHEET_COLUMN_WIDTH = 88;
|
|
22543
|
+
const DEFAULT_WORKSHEET_ROW_TITLE_WIDTH_KEY = "DEFAULT_WORKSHEET_ROW_TITLE_WIDTH";
|
|
22544
|
+
const DEFAULT_WORKSHEET_ROW_TITLE_WIDTH = 46;
|
|
22545
|
+
const DEFAULT_WORKSHEET_COLUMN_TITLE_HEIGHT_KEY = "DEFAULT_WORKSHEET_COLUMN_TITLE_HEIGHT";
|
|
22546
|
+
const DEFAULT_WORKSHEET_COLUMN_TITLE_HEIGHT = 20;
|
|
22547
|
+
/**
|
|
22548
|
+
* This function is used to merge the user passed in snapshot with the default snapshot
|
|
22549
|
+
* without changing the user's snapshot's reference.
|
|
22550
|
+
*
|
|
22551
|
+
* @param snapshot user passed in snapshot
|
|
22552
|
+
* @returns merged snapshot
|
|
22553
|
+
*/
|
|
22554
|
+
function mergeWorksheetSnapshotWithDefault(snapshot) {
|
|
22555
|
+
const defaultSnapshot = {
|
|
22556
|
+
name: "Sheet1",
|
|
22557
|
+
id: "sheet-01",
|
|
22558
|
+
tabColor: "",
|
|
22559
|
+
hidden: 0,
|
|
22560
|
+
rowCount: DEFAULT_WORKSHEET_ROW_COUNT,
|
|
22561
|
+
columnCount: 20,
|
|
22562
|
+
zoomRatio: 1,
|
|
22563
|
+
freeze: {
|
|
22564
|
+
xSplit: 0,
|
|
22565
|
+
ySplit: 0,
|
|
22566
|
+
startRow: -1,
|
|
22567
|
+
startColumn: -1
|
|
22568
|
+
},
|
|
22569
|
+
scrollTop: 0,
|
|
22570
|
+
scrollLeft: 0,
|
|
22571
|
+
defaultColumnWidth: 88,
|
|
22572
|
+
defaultRowHeight: 24,
|
|
22573
|
+
mergeData: [],
|
|
22574
|
+
cellData: {},
|
|
22575
|
+
rowData: {},
|
|
22576
|
+
columnData: {},
|
|
22577
|
+
showGridlines: 1,
|
|
22578
|
+
rowHeader: {
|
|
22579
|
+
width: 46,
|
|
22580
|
+
hidden: 0
|
|
22581
|
+
},
|
|
22582
|
+
columnHeader: {
|
|
22583
|
+
height: 20,
|
|
22584
|
+
hidden: 0
|
|
22585
|
+
},
|
|
22586
|
+
rightToLeft: 0
|
|
22587
|
+
};
|
|
22588
|
+
Object.keys(defaultSnapshot).forEach((_key) => {
|
|
22589
|
+
const key = _key;
|
|
22590
|
+
if (typeof snapshot[key] === "undefined") snapshot[key] = defaultSnapshot[key];
|
|
22591
|
+
});
|
|
22592
|
+
const freeze = snapshot.freeze;
|
|
22593
|
+
freeze.xSplit = freeze.xSplit ?? defaultSnapshot.freeze.xSplit;
|
|
22594
|
+
freeze.ySplit = freeze.ySplit ?? defaultSnapshot.freeze.ySplit;
|
|
22595
|
+
freeze.startRow = freeze.ySplit === 0 ? defaultSnapshot.freeze.startRow : freeze.startRow ?? defaultSnapshot.freeze.startRow;
|
|
22596
|
+
freeze.startColumn = freeze.xSplit === 0 ? defaultSnapshot.freeze.startColumn : freeze.startColumn ?? defaultSnapshot.freeze.startColumn;
|
|
22597
|
+
snapshot.defaultColumnWidth = normalizeSheetDimension(snapshot.defaultColumnWidth, 88, false);
|
|
22598
|
+
snapshot.defaultRowHeight = normalizeSheetDimension(snapshot.defaultRowHeight, 24, false);
|
|
22599
|
+
for (const column of Object.values(snapshot.columnData)) if (column && column.w !== void 0 && !isValidSheetDimension(column.w)) column.w = 0;
|
|
22600
|
+
for (const row of Object.values(snapshot.rowData)) {
|
|
22601
|
+
if (!row) continue;
|
|
22602
|
+
if (row.h !== void 0 && !isValidSheetDimension(row.h)) row.h = 0;
|
|
22603
|
+
if (row.ah !== void 0 && !isValidSheetDimension(row.ah)) delete row.ah;
|
|
22604
|
+
}
|
|
22605
|
+
return snapshot;
|
|
22606
|
+
}
|
|
22607
|
+
|
|
22517
22608
|
//#endregion
|
|
22518
22609
|
//#region src/sheets/column-manager.ts
|
|
22519
22610
|
/**
|
|
@@ -22653,7 +22744,9 @@ var ColumnManager = class {
|
|
|
22653
22744
|
*/
|
|
22654
22745
|
getColumnWidth(columnPos) {
|
|
22655
22746
|
var _this$_columnData$col2;
|
|
22656
|
-
|
|
22747
|
+
const defaultWidth = normalizeSheetDimension(this._config.defaultColumnWidth, 88, false);
|
|
22748
|
+
const width = (_this$_columnData$col2 = this._columnData[columnPos]) === null || _this$_columnData$col2 === void 0 ? void 0 : _this$_columnData$col2.w;
|
|
22749
|
+
return width === void 0 ? defaultWidth : normalizeSheetDimension(width, 0);
|
|
22657
22750
|
}
|
|
22658
22751
|
/**
|
|
22659
22752
|
* Set the width of column
|
|
@@ -22661,6 +22754,7 @@ var ColumnManager = class {
|
|
|
22661
22754
|
* @param width width of column
|
|
22662
22755
|
*/
|
|
22663
22756
|
setColumnWidth(columnPos, width) {
|
|
22757
|
+
if (!isValidSheetDimension(width)) return;
|
|
22664
22758
|
const column = this._columnData[columnPos];
|
|
22665
22759
|
if (width === this._config.defaultColumnWidth) {
|
|
22666
22760
|
if (column) {
|
|
@@ -22697,7 +22791,10 @@ var ColumnManager = class {
|
|
|
22697
22791
|
}
|
|
22698
22792
|
for (let c = startColumn; c <= endColumn; c++) {
|
|
22699
22793
|
const columnData = columnDataInfo === null || columnDataInfo === void 0 ? void 0 : columnDataInfo[c - startColumn];
|
|
22700
|
-
if (columnData !== void 0 && columnData !== null && Object.keys(columnData).length > 0)
|
|
22794
|
+
if (columnData !== void 0 && columnData !== null && Object.keys(columnData).length > 0) {
|
|
22795
|
+
this._columnData[c] = { ...columnData };
|
|
22796
|
+
if (columnData.w !== void 0 && !isValidSheetDimension(columnData.w)) this._columnData[c].w = 0;
|
|
22797
|
+
}
|
|
22701
22798
|
}
|
|
22702
22799
|
}
|
|
22703
22800
|
/**
|
|
@@ -23325,13 +23422,14 @@ var RowManager = class {
|
|
|
23325
23422
|
getRowHeight(rowPos, count = 1) {
|
|
23326
23423
|
const { _rowData } = this;
|
|
23327
23424
|
const config = this._config;
|
|
23425
|
+
const defaultHeight = normalizeSheetDimension(config.defaultRowHeight, 24, false);
|
|
23328
23426
|
let height = 0;
|
|
23329
23427
|
for (let i = 0; i < count; i++) {
|
|
23330
|
-
const { ia, ah, h =
|
|
23428
|
+
const { ia, ah, h = defaultHeight } = _rowData[i + rowPos] || {
|
|
23331
23429
|
hd: 0,
|
|
23332
|
-
h:
|
|
23430
|
+
h: defaultHeight
|
|
23333
23431
|
};
|
|
23334
|
-
height += (ia == null || ia === 1) &&
|
|
23432
|
+
height += (ia == null || ia === 1) && isValidSheetDimension(ah, false) ? ah : normalizeSheetDimension(h, 0);
|
|
23335
23433
|
}
|
|
23336
23434
|
return height;
|
|
23337
23435
|
}
|
|
@@ -23341,6 +23439,7 @@ var RowManager = class {
|
|
|
23341
23439
|
* @param height row height
|
|
23342
23440
|
*/
|
|
23343
23441
|
setRowHeight(rowPos, height) {
|
|
23442
|
+
if (!isValidSheetDimension(height)) return;
|
|
23344
23443
|
const row = this._rowData[rowPos];
|
|
23345
23444
|
if (height === this._config.defaultRowHeight) {
|
|
23346
23445
|
if (row) {
|
|
@@ -23381,7 +23480,12 @@ var RowManager = class {
|
|
|
23381
23480
|
}
|
|
23382
23481
|
for (let r = startRow; r <= endRow; r++) {
|
|
23383
23482
|
const rowData = rowDataInfo === null || rowDataInfo === void 0 ? void 0 : rowDataInfo[r - startRow];
|
|
23384
|
-
if (rowData !== void 0 && rowData !== null && Object.keys(rowData).length > 0)
|
|
23483
|
+
if (rowData !== void 0 && rowData !== null && Object.keys(rowData).length > 0) {
|
|
23484
|
+
this._rowData[r] = { ...rowData };
|
|
23485
|
+
const row = this._rowData[r];
|
|
23486
|
+
if (row.h !== void 0 && !isValidSheetDimension(row.h)) row.h = 0;
|
|
23487
|
+
if (row.ah !== void 0 && !isValidSheetDimension(row.ah)) delete row.ah;
|
|
23488
|
+
}
|
|
23385
23489
|
}
|
|
23386
23490
|
}
|
|
23387
23491
|
/**
|
|
@@ -23498,73 +23602,6 @@ var RowManager = class {
|
|
|
23498
23602
|
}
|
|
23499
23603
|
};
|
|
23500
23604
|
|
|
23501
|
-
//#endregion
|
|
23502
|
-
//#region src/sheets/sheet-snapshot-utils.ts
|
|
23503
|
-
const DEFAULT_WORKSHEET_ROW_COUNT_KEY = "DEFAULT_WORKSHEET_ROW_COUNT";
|
|
23504
|
-
const DEFAULT_WORKSHEET_ROW_COUNT = 1e3;
|
|
23505
|
-
const DEFAULT_WORKSHEET_COLUMN_COUNT_KEY = "DEFAULT_WORKSHEET_COLUMN_COUNT";
|
|
23506
|
-
const DEFAULT_WORKSHEET_COLUMN_COUNT = 20;
|
|
23507
|
-
const DEFAULT_WORKSHEET_ROW_HEIGHT_KEY = "DEFAULT_WORKSHEET_ROW_HEIGHT";
|
|
23508
|
-
const DEFAULT_WORKSHEET_ROW_HEIGHT = 24;
|
|
23509
|
-
const DEFAULT_WORKSHEET_COLUMN_WIDTH_KEY = "DEFAULT_WORKSHEET_COLUMN_WIDTH";
|
|
23510
|
-
const DEFAULT_WORKSHEET_COLUMN_WIDTH = 88;
|
|
23511
|
-
const DEFAULT_WORKSHEET_ROW_TITLE_WIDTH_KEY = "DEFAULT_WORKSHEET_ROW_TITLE_WIDTH";
|
|
23512
|
-
const DEFAULT_WORKSHEET_ROW_TITLE_WIDTH = 46;
|
|
23513
|
-
const DEFAULT_WORKSHEET_COLUMN_TITLE_HEIGHT_KEY = "DEFAULT_WORKSHEET_COLUMN_TITLE_HEIGHT";
|
|
23514
|
-
const DEFAULT_WORKSHEET_COLUMN_TITLE_HEIGHT = 20;
|
|
23515
|
-
/**
|
|
23516
|
-
* This function is used to merge the user passed in snapshot with the default snapshot
|
|
23517
|
-
* without changing the user's snapshot's reference.
|
|
23518
|
-
*
|
|
23519
|
-
* @param snapshot user passed in snapshot
|
|
23520
|
-
* @returns merged snapshot
|
|
23521
|
-
*/
|
|
23522
|
-
function mergeWorksheetSnapshotWithDefault(snapshot) {
|
|
23523
|
-
const defaultSnapshot = {
|
|
23524
|
-
name: "Sheet1",
|
|
23525
|
-
id: "sheet-01",
|
|
23526
|
-
tabColor: "",
|
|
23527
|
-
hidden: 0,
|
|
23528
|
-
rowCount: DEFAULT_WORKSHEET_ROW_COUNT,
|
|
23529
|
-
columnCount: 20,
|
|
23530
|
-
zoomRatio: 1,
|
|
23531
|
-
freeze: {
|
|
23532
|
-
xSplit: 0,
|
|
23533
|
-
ySplit: 0,
|
|
23534
|
-
startRow: -1,
|
|
23535
|
-
startColumn: -1
|
|
23536
|
-
},
|
|
23537
|
-
scrollTop: 0,
|
|
23538
|
-
scrollLeft: 0,
|
|
23539
|
-
defaultColumnWidth: 88,
|
|
23540
|
-
defaultRowHeight: 24,
|
|
23541
|
-
mergeData: [],
|
|
23542
|
-
cellData: {},
|
|
23543
|
-
rowData: {},
|
|
23544
|
-
columnData: {},
|
|
23545
|
-
showGridlines: 1,
|
|
23546
|
-
rowHeader: {
|
|
23547
|
-
width: 46,
|
|
23548
|
-
hidden: 0
|
|
23549
|
-
},
|
|
23550
|
-
columnHeader: {
|
|
23551
|
-
height: 20,
|
|
23552
|
-
hidden: 0
|
|
23553
|
-
},
|
|
23554
|
-
rightToLeft: 0
|
|
23555
|
-
};
|
|
23556
|
-
Object.keys(defaultSnapshot).forEach((_key) => {
|
|
23557
|
-
const key = _key;
|
|
23558
|
-
if (typeof snapshot[key] === "undefined") snapshot[key] = defaultSnapshot[key];
|
|
23559
|
-
});
|
|
23560
|
-
const freeze = snapshot.freeze;
|
|
23561
|
-
freeze.xSplit = freeze.xSplit ?? defaultSnapshot.freeze.xSplit;
|
|
23562
|
-
freeze.ySplit = freeze.ySplit ?? defaultSnapshot.freeze.ySplit;
|
|
23563
|
-
freeze.startRow = freeze.ySplit === 0 ? defaultSnapshot.freeze.startRow : freeze.startRow ?? defaultSnapshot.freeze.startRow;
|
|
23564
|
-
freeze.startColumn = freeze.xSplit === 0 ? defaultSnapshot.freeze.startColumn : freeze.startColumn ?? defaultSnapshot.freeze.startColumn;
|
|
23565
|
-
return snapshot;
|
|
23566
|
-
}
|
|
23567
|
-
|
|
23568
23605
|
//#endregion
|
|
23569
23606
|
//#region src/sheets/span-model.ts
|
|
23570
23607
|
var SpanModel = class extends Disposable {
|
|
@@ -27833,17 +27870,18 @@ let SheetSkeleton = class SheetSkeleton extends Skeleton {
|
|
|
27833
27870
|
_generateRowMatrixCache(rowCount, rowData, defaultRowHeight) {
|
|
27834
27871
|
let rowTotalHeight = 0;
|
|
27835
27872
|
const rowHeightAccumulation = [];
|
|
27873
|
+
const fallbackHeight = normalizeSheetDimension(defaultRowHeight, 24, false);
|
|
27836
27874
|
const data = rowData;
|
|
27837
27875
|
for (let r = 0; r < rowCount; r++) {
|
|
27838
27876
|
var _this$_gapConfig$rowG2;
|
|
27839
|
-
let rowHeight =
|
|
27877
|
+
let rowHeight = fallbackHeight;
|
|
27840
27878
|
if (this.worksheet.getRowFiltered(r)) rowHeight = 0;
|
|
27841
27879
|
else if (data[r] != null) {
|
|
27842
27880
|
const rowDataItem = data[r];
|
|
27843
27881
|
if (!rowDataItem) continue;
|
|
27844
|
-
const { h =
|
|
27845
|
-
if ((ia == null || ia === 1) &&
|
|
27846
|
-
else rowHeight = h;
|
|
27882
|
+
const { h = fallbackHeight, ah, ia } = rowDataItem;
|
|
27883
|
+
if ((ia == null || ia === 1) && isValidSheetDimension(ah, false)) rowHeight = ah;
|
|
27884
|
+
else rowHeight = normalizeSheetDimension(h, 0);
|
|
27847
27885
|
if (rowDataItem.hd === 1) rowHeight = 0;
|
|
27848
27886
|
}
|
|
27849
27887
|
const gapSize = ((_this$_gapConfig$rowG2 = this._gapConfig.rowGaps) === null || _this$_gapConfig$rowG2 === void 0 || (_this$_gapConfig$rowG2 = _this$_gapConfig$rowG2[r]) === null || _this$_gapConfig$rowG2 === void 0 ? void 0 : _this$_gapConfig$rowG2.size) ?? 0;
|
|
@@ -27862,14 +27900,15 @@ let SheetSkeleton = class SheetSkeleton extends Skeleton {
|
|
|
27862
27900
|
_generateColumnMatrixCache(colCount, columnData, defaultColumnWidth) {
|
|
27863
27901
|
let columnTotalWidth = 0;
|
|
27864
27902
|
const columnWidthAccumulation = [];
|
|
27903
|
+
const fallbackWidth = normalizeSheetDimension(defaultColumnWidth, 88, false);
|
|
27865
27904
|
const data = columnData;
|
|
27866
27905
|
for (let c = 0; c < colCount; c++) {
|
|
27867
27906
|
var _this$_gapConfig$colG2;
|
|
27868
|
-
let columnWidth =
|
|
27907
|
+
let columnWidth = fallbackWidth;
|
|
27869
27908
|
if (data[c] != null) {
|
|
27870
27909
|
const columnDataItem = data[c];
|
|
27871
27910
|
if (!columnDataItem) continue;
|
|
27872
|
-
if (columnDataItem.w
|
|
27911
|
+
if (columnDataItem.w !== void 0) columnWidth = normalizeSheetDimension(columnDataItem.w, 0);
|
|
27873
27912
|
if (columnDataItem.hd === 1) columnWidth = 0;
|
|
27874
27913
|
}
|
|
27875
27914
|
const gapSize = ((_this$_gapConfig$colG2 = this._gapConfig.colGaps) === null || _this$_gapConfig$colG2 === void 0 || (_this$_gapConfig$colG2 = _this$_gapConfig$colG2[c]) === null || _this$_gapConfig$colG2 === void 0 ? void 0 : _this$_gapConfig$colG2.size) ?? 0;
|
|
@@ -29538,7 +29577,10 @@ exports.isSameStyleTextRun = isSameStyleTextRun;
|
|
|
29538
29577
|
exports.isTextFormat = isTextFormat;
|
|
29539
29578
|
exports.isUnitRangesEqual = isUnitRangesEqual;
|
|
29540
29579
|
exports.isValidBaseRecordId = isValidBaseRecordId;
|
|
29580
|
+
exports.isValidColumnDimensions = isValidColumnDimensions;
|
|
29541
29581
|
exports.isValidRange = isValidRange;
|
|
29582
|
+
exports.isValidRowDimensions = isValidRowDimensions;
|
|
29583
|
+
exports.isValidSheetDimension = isValidSheetDimension;
|
|
29542
29584
|
Object.defineProperty(exports, "isValueDependencyItem", {
|
|
29543
29585
|
enumerable: true,
|
|
29544
29586
|
get: function () {
|