juxscript 1.1.177 → 1.1.178

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.
@@ -1 +1 @@
1
- {"version":3,"file":"dataframe.d.ts","sourceRoot":"","sources":["dataframe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dataframe.d.ts","sourceRoot":"","sources":["dataframe.ts"],"names":[],"mappings":"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"}
@@ -86,7 +86,7 @@ export class DataFrameComponent extends BaseComponent {
86
86
  this.state.loading = true;
87
87
  this._updateStatus('⏳ Parsing ' + file.name + '...', 'loading');
88
88
  try {
89
- // ✅ FIX: Check if multi-sheet Excel
89
+ // ✅ Check if multi-sheet Excel
90
90
  const isExcel = file.name.toLowerCase().endsWith('.xlsx') ||
91
91
  file.name.toLowerCase().endsWith('.xls');
92
92
  if (isExcel) {
@@ -95,7 +95,7 @@ export class DataFrameComponent extends BaseComponent {
95
95
  // Store first sheet to IndexedDB
96
96
  await this._driver.store(file.name, sheets[sheetNames[0]], { source: file.name });
97
97
  if (sheetNames.length > 1) {
98
- // Multi-sheet: render tabs
98
+ // Multi-sheet: render tabs
99
99
  this._renderMultiSheet(sheets, file.name);
100
100
  }
101
101
  else {
@@ -352,19 +352,19 @@ export class DataFrameComponent extends BaseComponent {
352
352
  _updateTable() {
353
353
  if (!this._table || !this._df)
354
354
  return;
355
- // ✅ FIX: Convert string[] columns to ColumnDef[] with labels
355
+ // ✅ Convert string[] columns to ColumnDef[] with labels
356
356
  const columnDefs = this._df.columns.map(col => ({
357
357
  key: col,
358
- label: col // Use column name as label
358
+ label: col
359
359
  }));
360
- // ✅ Update both columns AND rows (force table rebuild)
360
+ // ✅ Update columns and rows
361
361
  this._table.columns(columnDefs).rows(this._df.toRows());
362
- // ✅ Force table to re-render header and body
363
- const tableElement = this._table['_tableElement']; // Access private property
362
+ // ✅ FIX: Force full table rebuild (including pagination)
363
+ const tableElement = this._table['_tableElement'];
364
364
  if (tableElement) {
365
365
  const wrapper = tableElement.closest('.jux-table-wrapper');
366
366
  if (wrapper) {
367
- // Clear and rebuild the entire table
367
+ // Clear table content
368
368
  tableElement.innerHTML = '';
369
369
  // Rebuild header
370
370
  const thead = this._table._buildTableHeader();
@@ -375,6 +375,10 @@ export class DataFrameComponent extends BaseComponent {
375
375
  tableElement.appendChild(tbody);
376
376
  // Re-wire events
377
377
  this._table._wireTriggerEvents(tbody);
378
+ // ✅ FIX: Re-build pagination controls
379
+ if (this._tableOptions.paginated) {
380
+ this._table._updatePagination(wrapper, tbody);
381
+ }
378
382
  }
379
383
  }
380
384
  }
@@ -443,6 +447,7 @@ export class DataFrameComponent extends BaseComponent {
443
447
  }
444
448
  const upload = new FileUpload(`${this._id}-upload`, uploadOpts);
445
449
  this._uploadRef = upload;
450
+ // ✅ FIX: Use the SAME logic as fromUpload() to handle multi-sheet
446
451
  this._pendingSource = async () => {
447
452
  upload.bind('change', async (files) => {
448
453
  if (!files || files.length === 0)
@@ -451,9 +456,29 @@ export class DataFrameComponent extends BaseComponent {
451
456
  this.state.loading = true;
452
457
  this._updateStatus('⏳ Parsing ' + file.name + '...', 'loading');
453
458
  try {
454
- const df = await this._driver.streamFile(file);
455
- await this._driver.store(file.name, df, { source: file.name });
456
- this._setDataFrame(df, file.name);
459
+ // Check if multi-sheet Excel
460
+ const isExcel = file.name.toLowerCase().endsWith('.xlsx') ||
461
+ file.name.toLowerCase().endsWith('.xls');
462
+ if (isExcel) {
463
+ const sheets = await this._driver.streamFileMultiSheet(file);
464
+ const sheetNames = Object.keys(sheets);
465
+ // Store first sheet to IndexedDB
466
+ await this._driver.store(file.name, sheets[sheetNames[0]], { source: file.name });
467
+ if (sheetNames.length > 1) {
468
+ // ✅ Multi-sheet: render tabs
469
+ this._renderMultiSheet(sheets, file.name);
470
+ }
471
+ else {
472
+ // Single sheet: render normally
473
+ this._setDataFrame(sheets[sheetNames[0]], file.name);
474
+ }
475
+ }
476
+ else {
477
+ // CSV/TSV: single sheet
478
+ const df = await this._driver.streamFile(file);
479
+ await this._driver.store(file.name, df, { source: file.name });
480
+ this._setDataFrame(df, file.name);
481
+ }
457
482
  }
458
483
  catch (err) {
459
484
  this._triggerCallback('error', err.message, null, this);
@@ -124,7 +124,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
124
124
  this._updateStatus('⏳ Parsing ' + file.name + '...', 'loading');
125
125
 
126
126
  try {
127
- // ✅ FIX: Check if multi-sheet Excel
127
+ // ✅ Check if multi-sheet Excel
128
128
  const isExcel = file.name.toLowerCase().endsWith('.xlsx') ||
129
129
  file.name.toLowerCase().endsWith('.xls');
130
130
 
@@ -136,7 +136,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
136
136
  await this._driver.store(file.name, sheets[sheetNames[0]], { source: file.name });
137
137
 
138
138
  if (sheetNames.length > 1) {
139
- // Multi-sheet: render tabs
139
+ // Multi-sheet: render tabs
140
140
  this._renderMultiSheet(sheets, file.name);
141
141
  } else {
142
142
  // Single sheet: render normally
@@ -438,21 +438,21 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
438
438
  private _updateTable(): void {
439
439
  if (!this._table || !this._df) return;
440
440
 
441
- // ✅ FIX: Convert string[] columns to ColumnDef[] with labels
441
+ // ✅ Convert string[] columns to ColumnDef[] with labels
442
442
  const columnDefs = this._df.columns.map(col => ({
443
443
  key: col,
444
- label: col // Use column name as label
444
+ label: col
445
445
  }));
446
446
 
447
- // ✅ Update both columns AND rows (force table rebuild)
447
+ // ✅ Update columns and rows
448
448
  this._table.columns(columnDefs).rows(this._df.toRows());
449
449
 
450
- // ✅ Force table to re-render header and body
451
- const tableElement = this._table['_tableElement']; // Access private property
450
+ // ✅ FIX: Force full table rebuild (including pagination)
451
+ const tableElement = this._table['_tableElement'];
452
452
  if (tableElement) {
453
- const wrapper = tableElement.closest('.jux-table-wrapper');
453
+ const wrapper = tableElement.closest('.jux-table-wrapper') as HTMLElement;
454
454
  if (wrapper) {
455
- // Clear and rebuild the entire table
455
+ // Clear table content
456
456
  tableElement.innerHTML = '';
457
457
 
458
458
  // Rebuild header
@@ -466,6 +466,11 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
466
466
 
467
467
  // Re-wire events
468
468
  (this._table as any)._wireTriggerEvents(tbody);
469
+
470
+ // ✅ FIX: Re-build pagination controls
471
+ if (this._tableOptions.paginated) {
472
+ (this._table as any)._updatePagination(wrapper, tbody);
473
+ }
469
474
  }
470
475
  }
471
476
  }
@@ -545,6 +550,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
545
550
  const upload = new FileUpload(`${this._id}-upload`, uploadOpts);
546
551
 
547
552
  this._uploadRef = upload;
553
+ // ✅ FIX: Use the SAME logic as fromUpload() to handle multi-sheet
548
554
  this._pendingSource = async () => {
549
555
  upload.bind('change', async (files: File[]) => {
550
556
  if (!files || files.length === 0) return;
@@ -553,9 +559,30 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
553
559
  this._updateStatus('⏳ Parsing ' + file.name + '...', 'loading');
554
560
 
555
561
  try {
556
- const df = await this._driver.streamFile(file);
557
- await this._driver.store(file.name, df, { source: file.name });
558
- this._setDataFrame(df, file.name);
562
+ // Check if multi-sheet Excel
563
+ const isExcel = file.name.toLowerCase().endsWith('.xlsx') ||
564
+ file.name.toLowerCase().endsWith('.xls');
565
+
566
+ if (isExcel) {
567
+ const sheets = await this._driver.streamFileMultiSheet(file);
568
+ const sheetNames = Object.keys(sheets);
569
+
570
+ // Store first sheet to IndexedDB
571
+ await this._driver.store(file.name, sheets[sheetNames[0]], { source: file.name });
572
+
573
+ if (sheetNames.length > 1) {
574
+ // ✅ Multi-sheet: render tabs
575
+ this._renderMultiSheet(sheets, file.name);
576
+ } else {
577
+ // Single sheet: render normally
578
+ this._setDataFrame(sheets[sheetNames[0]], file.name);
579
+ }
580
+ } else {
581
+ // CSV/TSV: single sheet
582
+ const df = await this._driver.streamFile(file);
583
+ await this._driver.store(file.name, df, { source: file.name });
584
+ this._setDataFrame(df, file.name);
585
+ }
559
586
  } catch (err: any) {
560
587
  this._triggerCallback('error', err.message, null, this);
561
588
  this.state.loading = false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.177",
3
+ "version": "1.1.178",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",