px-jspreadsheet-ce 0.0.3 → 0.0.4

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/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "main": "dist/index.js",
7
7
  "module": "src/index.js",
8
8
  "types": "dist/index.d.ts",
9
- "version": "0.0.3",
9
+ "version": "0.0.4",
10
10
  "exports": {
11
11
  ".": {
12
12
  "import": "./src/index.js",
package/src/index.js CHANGED
@@ -58,6 +58,8 @@ libraryBase.jspreadsheet.destroy = function (element, destroyEventHandlers) {
58
58
  if (element.spreadsheet) {
59
59
  const spreadsheetIndex = libraryBase.jspreadsheet.spreadsheet.indexOf(element.spreadsheet);
60
60
  libraryBase.jspreadsheet.spreadsheet.splice(spreadsheetIndex, 1);
61
+ element.spreadsheet.worksheets.forEach((sheet, idx) => sheet.deleteWorksheet(idx));
62
+ element.spreadsheet.worksheets = null;
61
63
 
62
64
  const root = element.spreadsheet.config.root || document;
63
65
 
@@ -63,6 +63,7 @@ const createWorksheets = async function (spreadsheet, options, el) {
63
63
 
64
64
  let sheetNumber = 1;
65
65
 
66
+ // worksheetName
66
67
  for (let i = 0; i < o.length; i++) {
67
68
  if (!o[i].worksheetName) {
68
69
  o[i].worksheetName = 'Sheet' + sheetNumber++;
@@ -79,10 +80,12 @@ const createWorksheets = async function (spreadsheet, options, el) {
79
80
 
80
81
  const tabs = jSuites.tabs(el, tabsOptions);
81
82
 
83
+ // global style
82
84
  const spreadsheetStyles = options.style;
83
85
  delete options.style;
84
86
 
85
87
  for (let i = 0; i < o.length; i++) {
88
+ // handle global style
86
89
  if (o[i].style) {
87
90
  Object.entries(o[i].style).forEach(function ([cellName, value]) {
88
91
  if (typeof value === 'number') {
@@ -110,6 +113,7 @@ const createWorksheets = async function (spreadsheet, options, el) {
110
113
  };
111
114
 
112
115
  factory.spreadsheet = async function (el, options, worksheets) {
116
+ // html table
113
117
  if (el.tagName == 'TABLE') {
114
118
  if (!options) {
115
119
  options = {};
@@ -50,6 +50,7 @@ import { copy, paste } from './copyPaste.js';
50
50
  import { isReadOnly, setReadOnly } from './cells.js';
51
51
  import { openFilter, resetFilters } from './filter.js';
52
52
  import { redo, undo } from './history.js';
53
+ import { getCoordsFromRange, getCoordsFromCellName, getCellNameFromCoords } from './helpers.js';
53
54
 
54
55
  const setWorksheetFunctions = function (worksheet) {
55
56
  for (let i = 0; i < worksheetPublicMethodsLength; i++) {
@@ -62,7 +63,7 @@ const setWorksheetFunctions = function (worksheet) {
62
63
  const createTable = function () {
63
64
  let obj = this;
64
65
 
65
- setWorksheetFunctions(obj);
66
+ setWorksheetFunctions(obj); // ??
66
67
 
67
68
  // Elements
68
69
  obj.table = document.createElement('table');
@@ -324,6 +325,57 @@ const createTable = function () {
324
325
  }
325
326
  };
326
327
 
328
+ // check scope
329
+ const isCellRange = (str) => /\w+:[\w-]/.test(str);
330
+ const getCellRange = (str, size = 1) => {
331
+ // 'A3:-'
332
+ if (str.endsWith(':-')) {
333
+ const [start] = str.split(':');
334
+ const startCoord = getCoordsFromCellName(start);
335
+ return [...startCoord, size - 1, startCoord[1]];
336
+ }
337
+
338
+ return getCoordsFromRange(str);
339
+ };
340
+
341
+ /**
342
+ * 将对象中的范围键(如 "A1:C1")展开为独立单元格键
343
+ * @param {Object} targetMap - 需要处理的目标对象 (如 obj.options.cells 或 obj.options.style)
344
+ * @param {Object} size - 表格尺寸数据 (getCellRange 需要用到)
345
+ */
346
+ const expandRangeProperties = (targetMap, size) => {
347
+ // 1. 边界检查:如果对象为空,直接返回
348
+ if (!targetMap) return;
349
+
350
+ // 2. 获取所有键并筛选出是范围格式的键
351
+ const rangeKeys = Object.keys(targetMap).filter(isCellRange);
352
+
353
+ rangeKeys.forEach((key) => {
354
+ const val = targetMap[key]; // 获取该范围对应的值 (样式或数据)
355
+ const range = getCellRange(key, size); // 解析范围 [sx, sy, ex, ey]
356
+
357
+ const [sx, sy, ex, ey] = range;
358
+
359
+ // 3. 优化逻辑:使用双重循环。
360
+ // 原代码分别处理行和列,双重循环可以同时涵盖:
361
+ // - 单行 (sy === ey)
362
+ // - 单列 (sx === ex)
363
+ // - 矩形区域 (既跨行也跨列,如 A1:B2)
364
+ for (let x = sx; x <= ex; x++) {
365
+ for (let y = sy; y <= ey; y++) {
366
+ const cellName = getCellNameFromCoords(x, y);
367
+ // 只有当目标单元格不存在或是为了覆盖时赋值
368
+ // 这里直接赋值,保留原值引用的逻辑
369
+ targetMap[cellName] = val;
370
+ }
371
+ }
372
+
373
+ // 可选:展开后是否需要删除原始的范围 key?
374
+ // 如果不需要保留 "A1:B1" 这种键,可以解开下面这行的注释
375
+ delete targetMap[key];
376
+ });
377
+ };
378
+
327
379
  /**
328
380
  * Prepare the jspreadsheet table
329
381
  *
@@ -408,6 +460,10 @@ const prepareTable = function () {
408
460
  }
409
461
  }
410
462
 
463
+ // cells
464
+ expandRangeProperties(obj.options.cells, size);
465
+ // style
466
+ expandRangeProperties(obj.options.style, size);
411
467
  // Create the table when is ready
412
468
  if (!multiple.length) {
413
469
  createTable.call(obj);
@@ -448,7 +504,7 @@ export const buildWorksheet = async function () {
448
504
  }
449
505
 
450
506
  libraryBase.jspreadsheet.current = obj;
451
-
507
+ // prepareTable
452
508
  const promises = [];
453
509
 
454
510
  // Load the table data based on an CSV file
@@ -577,8 +633,31 @@ export const deleteWorksheet = function (position) {
577
633
  obj.parent.element.tabs.remove(position);
578
634
 
579
635
  const removedWorksheet = obj.parent.worksheets.splice(position, 1)[0];
580
-
581
636
  dispatch.call(obj.parent, 'ondeleteworksheet', removedWorksheet, position);
637
+
638
+ removedWorksheet.content.onscroll = null;
639
+ removedWorksheet.content.onwheel = null;
640
+ removedWorksheet.searchInput.onfocus = null;
641
+ removedWorksheet.paginationDropdown && (removedWorksheet.paginationDropdown.onchange = null);
642
+
643
+ removedWorksheet.textarea.remove();
644
+ removedWorksheet.textarea = null;
645
+
646
+ if (removedWorksheet.element) {
647
+ delete removedWorksheet.element.jssWorksheet;
648
+ delete removedWorksheet.element.jspreadsheet;
649
+ }
650
+
651
+ removedWorksheet.headers = null;
652
+ removedWorksheet.cols = null;
653
+ removedWorksheet.records = null;
654
+ removedWorksheet.options = null;
655
+
656
+ Object.keys(removedWorksheet).forEach((key) => {
657
+ if (Object.hasOwn(removedWorksheet, key)) {
658
+ removedWorksheet[key] = null;
659
+ }
660
+ });
582
661
  };
583
662
 
584
663
  const worksheetPublicMethods = [