px-jspreadsheet-ce 0.0.5 → 0.0.7

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/index.d.ts CHANGED
@@ -1503,6 +1503,8 @@ declare namespace jspreadsheet {
1503
1503
  */
1504
1504
  deleteWorksheet: (position: number) => void;
1505
1505
 
1506
+ updateWorksheet: (options: WorksheetOptions) => void;
1507
+
1506
1508
  /**
1507
1509
  * Remove all merged cells.
1508
1510
  */
package/dist/index.js CHANGED
@@ -1773,7 +1773,10 @@ const createCell = function (i, j, value) {
1773
1773
  td.innerHTML = value;
1774
1774
  }
1775
1775
  if (typeof config.type.createCell == 'function') {
1776
- config.type.createCell(td, value, parseInt(i), parseInt(j), obj, config);
1776
+ const result = config.type.createCell(td, value, parseInt(i), parseInt(j), obj, config);
1777
+ if (result && typeof result.mount === 'function' && typeof result.unmount === 'function') {
1778
+ obj.vueApps.push(result);
1779
+ }
1777
1780
  }
1778
1781
  }
1779
1782
 
@@ -1784,12 +1787,12 @@ const createCell = function (i, j, value) {
1784
1787
 
1785
1788
  if (obj.options.freezeRows > j) {
1786
1789
  td.classList.add('jss_frozen_row');
1787
- td.style.top = (0,_internalHelpers_js__WEBPACK_IMPORTED_MODULE_7__/* .getFreezeRowTop */ .bI)(j, obj.options.rows);
1790
+ td.style.top = (0,_internalHelpers_js__WEBPACK_IMPORTED_MODULE_7__/* .getFreezeRowTop */ .bI)(j, obj.options.rows, obj.options.defaultRowHeight);
1788
1791
  }
1789
1792
 
1790
1793
  if (obj.options.freezeColumns > i) {
1791
1794
  td.classList.add('jss_frozen');
1792
- td.style.left = (0,_internalHelpers_js__WEBPACK_IMPORTED_MODULE_7__/* .getFreezeColumnLeft */ .FD)(i, obj.options.columns);
1795
+ td.style.left = (0,_internalHelpers_js__WEBPACK_IMPORTED_MODULE_7__/* .getFreezeColumnLeft */ .FD)(i, obj.options.columns, obj.options.defaultColWidth);
1793
1796
  }
1794
1797
 
1795
1798
  // Text align
@@ -3538,23 +3541,23 @@ const getColumnNameFromId = function (cellId) {
3538
3541
  * 获取静态的左侧距离
3539
3542
  *
3540
3543
  */
3541
- const getFreezeColumnLeft = function (colNumber, columns) {
3544
+ const getFreezeColumnLeft = function (colNumber, columns, defaultWidth) {
3542
3545
  let left = 50; // 距离左侧的位置
3543
3546
  while (colNumber > 0) {
3544
3547
  const obj = columns[colNumber - 1]; // 左侧单元格
3545
3548
  if (obj.type !== 'hidden') {
3546
- left += parseInt(obj.width);
3549
+ left += parseInt(obj.width || defaultWidth);
3547
3550
  }
3548
3551
  colNumber -= 1;
3549
3552
  }
3550
3553
  return left + 'px';
3551
3554
  };
3552
3555
 
3553
- const getFreezeRowTop = function (rowNumber, rows) {
3556
+ const getFreezeRowTop = function (rowNumber, rows, defaultHeight) {
3554
3557
  let top = 30; // 距离顶部的位置
3555
3558
  while (rowNumber > 0) {
3556
3559
  const obj = rows[rowNumber - 1]; // 左侧单元格
3557
- top += parseInt(obj.height);
3560
+ top += parseInt(obj.height || defaultHeight);
3558
3561
  rowNumber -= 1;
3559
3562
  }
3560
3563
  return top + 'px';
@@ -10280,6 +10283,7 @@ const isReadOnly = function (x, y) {
10280
10283
 
10281
10284
 
10282
10285
 
10286
+
10283
10287
 
10284
10288
 
10285
10289
  const setWorksheetFunctions = function (worksheet) {
@@ -10293,7 +10297,7 @@ const setWorksheetFunctions = function (worksheet) {
10293
10297
  const createTable = function () {
10294
10298
  let obj = this;
10295
10299
 
10296
- setWorksheetFunctions(obj);
10300
+ setWorksheetFunctions(obj); // ??
10297
10301
 
10298
10302
  // Elements
10299
10303
  obj.table = document.createElement('table');
@@ -10555,6 +10559,57 @@ const createTable = function () {
10555
10559
  }
10556
10560
  };
10557
10561
 
10562
+ // check scope
10563
+ const isCellRange = (str) => /\w+:[\w-]/.test(str);
10564
+ const getCellRange = (str, size = 1) => {
10565
+ // 'A3:-'
10566
+ if (str.endsWith(':-')) {
10567
+ const [start] = str.split(':');
10568
+ const startCoord = (0,helpers.getCoordsFromCellName)(start);
10569
+ return [...startCoord, size - 1, startCoord[1]];
10570
+ }
10571
+
10572
+ return (0,helpers.getCoordsFromRange)(str);
10573
+ };
10574
+
10575
+ /**
10576
+ * 将对象中的范围键(如 "A1:C1")展开为独立单元格键
10577
+ * @param {Object} targetMap - 需要处理的目标对象 (如 obj.options.cells 或 obj.options.style)
10578
+ * @param {Object} size - 表格尺寸数据 (getCellRange 需要用到)
10579
+ */
10580
+ const expandRangeProperties = (targetMap, size) => {
10581
+ // 1. 边界检查:如果对象为空,直接返回
10582
+ if (!targetMap) return;
10583
+
10584
+ // 2. 获取所有键并筛选出是范围格式的键
10585
+ const rangeKeys = Object.keys(targetMap).filter(isCellRange);
10586
+
10587
+ rangeKeys.forEach((key) => {
10588
+ const val = targetMap[key]; // 获取该范围对应的值 (样式或数据)
10589
+ const range = getCellRange(key, size); // 解析范围 [sx, sy, ex, ey]
10590
+
10591
+ const [sx, sy, ex, ey] = range;
10592
+
10593
+ // 3. 优化逻辑:使用双重循环。
10594
+ // 原代码分别处理行和列,双重循环可以同时涵盖:
10595
+ // - 单行 (sy === ey)
10596
+ // - 单列 (sx === ex)
10597
+ // - 矩形区域 (既跨行也跨列,如 A1:B2)
10598
+ for (let x = sx; x <= ex; x++) {
10599
+ for (let y = sy; y <= ey; y++) {
10600
+ const cellName = (0,helpers.getCellNameFromCoords)(x, y);
10601
+ // 只有当目标单元格不存在或是为了覆盖时赋值
10602
+ // 这里直接赋值,保留原值引用的逻辑
10603
+ targetMap[cellName] = val;
10604
+ }
10605
+ }
10606
+
10607
+ // 可选:展开后是否需要删除原始的范围 key?
10608
+ // 如果不需要保留 "A1:B1" 这种键,可以解开下面这行的注释
10609
+ delete targetMap[key];
10610
+ });
10611
+ };
10612
+
10558
10613
  /**
10559
10614
  * Prepare the jspreadsheet table
10560
10615
  *
@@ -10639,6 +10694,10 @@ const prepareTable = function () {
10639
10694
  }
10640
10695
  }
10641
10696
 
10697
+ // cells
10698
+ expandRangeProperties(obj.options.cells, size);
10699
+ // style
10700
+ expandRangeProperties(obj.options.style, size);
10642
10701
  // Create the table when is ready
10643
10702
  if (!multiple.length) {
10644
10703
  createTable.call(obj);
@@ -10679,7 +10738,7 @@ const buildWorksheet = async function () {
10679
10738
  }
10680
10739
 
10681
10740
  libraryBase.jspreadsheet.current = obj;
10682
-
10741
+ // prepareTable
10683
10742
  const promises = [];
10684
10743
 
10685
10744
  // Load the table data based on an CSV file
@@ -10808,8 +10867,62 @@ const deleteWorksheet = function (position) {
10808
10867
  obj.parent.element.tabs.remove(position);
10809
10868
 
10810
10869
  const removedWorksheet = obj.parent.worksheets.splice(position, 1)[0];
10811
-
10812
10870
  dispatch/* default */.A.call(obj.parent, 'ondeleteworksheet', removedWorksheet, position);
10871
+
10872
+ // 卸载vue实例
10873
+ obj.vueApps.forEach(function (app) {
10874
+ app.unmount();
10875
+ });
10876
+
10877
+ obj.content.onscroll = null;
10878
+ obj.content.onwheel = null;
10879
+ obj.searchInput.onfocus = null;
10880
+ if (obj.paginationDropdown) {
10881
+ obj.paginationDropdown.onchange = null;
10882
+ }
10883
+
10884
+ obj.textarea.remove();
10885
+ obj.textarea = null;
10886
+
10887
+ if (obj.element) {
10888
+ delete obj.element.jssWorksheet;
10889
+ delete obj.element.jspreadsheet;
10890
+ obj.element = null;
10891
+ }
10892
+
10893
+ obj.headers = null;
10894
+ obj.cols = null;
10895
+ obj.records = null;
10896
+ obj.options = null;
10897
+
10898
+ Object.keys(obj).forEach((key) => {
10899
+ if (Object.hasOwn(obj, key)) {
10900
+ obj[key] = null;
10901
+ }
10902
+ });
10903
+ };
10904
+
10905
+ const updateWorksheet = function (options) {
10906
+ const obj = this;
10907
+
10908
+ // Reset selection
10909
+ obj.resetSelection();
10910
+
10911
+ // 卸载vue实例
10912
+ obj.vueApps.forEach(function (app) {
10913
+ app.unmount();
10914
+ });
10915
+ obj.vueApps = [];
10916
+
10917
+ obj.element.removeChild(obj.content);
10918
+ obj.element.removeChild(obj.pagination);
10919
+ obj.element.removeChild(obj.ads);
10920
+
10921
+ obj.options = options;
10922
+ obj.history = [];
10923
+ obj.historyIndex = -1;
10924
+ // Prepare table
10925
+ prepareTable.call(obj);
10813
10926
  };
10814
10927
 
10815
10928
  const worksheetPublicMethods = [
@@ -10929,6 +11042,7 @@ const worksheetPublicMethods = [
10929
11042
  ['createWorksheet', createWorksheet],
10930
11043
  ['openWorksheet', openWorksheet],
10931
11044
  ['deleteWorksheet', deleteWorksheet],
11045
+ ['updateWorksheet', updateWorksheet],
10932
11046
  [
10933
11047
  'copy',
10934
11048
  function (cut) {
@@ -11027,6 +11141,7 @@ const createWorksheets = async function (spreadsheet, options, el) {
11027
11141
 
11028
11142
  let sheetNumber = 1;
11029
11143
 
11144
+ // worksheetName
11030
11145
  for (let i = 0; i < o.length; i++) {
11031
11146
  if (!o[i].worksheetName) {
11032
11147
  o[i].worksheetName = 'Sheet' + sheetNumber++;
@@ -11043,10 +11158,12 @@ const createWorksheets = async function (spreadsheet, options, el) {
11043
11158
 
11044
11159
  const tabs = jSuites.tabs(el, tabsOptions);
11045
11160
 
11161
+ // global style
11046
11162
  const spreadsheetStyles = options.style;
11047
11163
  delete options.style;
11048
11164
 
11049
11165
  for (let i = 0; i < o.length; i++) {
11166
+ // handle global style
11050
11167
  if (o[i].style) {
11051
11168
  Object.entries(o[i].style).forEach(function ([cellName, value]) {
11052
11169
  if (typeof value === 'number') {
@@ -11063,6 +11180,7 @@ const createWorksheets = async function (spreadsheet, options, el) {
11063
11180
  formula: [],
11064
11181
  history: [],
11065
11182
  selection: [],
11183
+ vueApps: [],
11066
11184
  historyIndex: -1,
11067
11185
  });
11068
11186
 
@@ -11074,6 +11192,7 @@ const createWorksheets = async function (spreadsheet, options, el) {
11074
11192
  };
11075
11193
 
11076
11194
  factory.spreadsheet = async function (el, options, worksheets) {
11195
+ // html table
11077
11196
  if (el.tagName == 'TABLE') {
11078
11197
  if (!options) {
11079
11198
  options = {};
@@ -11181,7 +11300,6 @@ factory.worksheet = function (spreadsheet, options, position) {
11181
11300
 
11182
11301
  ;// ./src/index.js
11183
11302
 
11184
- // import './jspreadsheet.css';
11185
11303
 
11186
11304
 
11187
11305
 
@@ -11241,6 +11359,8 @@ libraryBase.jspreadsheet.destroy = function (element, destroyEventHandlers) {
11241
11359
  if (element.spreadsheet) {
11242
11360
  const spreadsheetIndex = libraryBase.jspreadsheet.spreadsheet.indexOf(element.spreadsheet);
11243
11361
  libraryBase.jspreadsheet.spreadsheet.splice(spreadsheetIndex, 1);
11362
+ element.spreadsheet.worksheets.forEach((sheet, idx) => sheet.deleteWorksheet(idx));
11363
+ element.spreadsheet.worksheets = null;
11244
11364
 
11245
11365
  const root = element.spreadsheet.config.root || document;
11246
11366
 
@@ -11259,6 +11379,8 @@ libraryBase.jspreadsheet.destroyAll = function () {
11259
11379
 
11260
11380
  libraryBase.jspreadsheet.destroy(spreadsheet.element);
11261
11381
  }
11382
+ libraryBase.jspreadsheet.current = null;
11383
+ libraryBase.jspreadsheet.spreadsheet = [];
11262
11384
  };
11263
11385
 
11264
11386
  libraryBase.jspreadsheet.current = null;