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
|
-
// ✅
|
|
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
|
-
// ✅
|
|
355
|
+
// ✅ Convert string[] columns to ColumnDef[] with labels
|
|
356
356
|
const columnDefs = this._df.columns.map(col => ({
|
|
357
357
|
key: col,
|
|
358
|
-
label: col
|
|
358
|
+
label: col
|
|
359
359
|
}));
|
|
360
|
-
// ✅ Update
|
|
360
|
+
// ✅ Update columns and rows
|
|
361
361
|
this._table.columns(columnDefs).rows(this._df.toRows());
|
|
362
|
-
// ✅ Force table
|
|
363
|
-
const tableElement = this._table['_tableElement'];
|
|
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
|
|
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
|
-
|
|
455
|
-
|
|
456
|
-
|
|
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
|
-
// ✅
|
|
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
|
-
// ✅
|
|
441
|
+
// ✅ Convert string[] columns to ColumnDef[] with labels
|
|
442
442
|
const columnDefs = this._df.columns.map(col => ({
|
|
443
443
|
key: col,
|
|
444
|
-
label: col
|
|
444
|
+
label: col
|
|
445
445
|
}));
|
|
446
446
|
|
|
447
|
-
// ✅ Update
|
|
447
|
+
// ✅ Update columns and rows
|
|
448
448
|
this._table.columns(columnDefs).rows(this._df.toRows());
|
|
449
449
|
|
|
450
|
-
// ✅ Force table
|
|
451
|
-
const tableElement = this._table['_tableElement'];
|
|
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
|
|
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
|
-
|
|
557
|
-
|
|
558
|
-
|
|
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;
|