juxscript 1.1.197 → 1.1.198
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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"}
|
|
@@ -486,7 +486,21 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
486
486
|
if (!this._rawFileData?.file)
|
|
487
487
|
return;
|
|
488
488
|
this._cleanupReshapeModal();
|
|
489
|
-
|
|
489
|
+
// Always detect from a fresh raw parse, not from current _df
|
|
490
|
+
let suggestedRow = 0;
|
|
491
|
+
try {
|
|
492
|
+
const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
|
|
493
|
+
headerRow: 0,
|
|
494
|
+
maxSheetSize: 20
|
|
495
|
+
});
|
|
496
|
+
const rawSheet = Object.values(rawSheets)[0];
|
|
497
|
+
if (rawSheet) {
|
|
498
|
+
suggestedRow = this._detectLikelyHeaderRow(rawSheet);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
suggestedRow = 0;
|
|
503
|
+
}
|
|
490
504
|
this._reshapeModal = new Modal(`${this._id}-reshape-modal`, {
|
|
491
505
|
title: 'Excel Import Settings',
|
|
492
506
|
size: 'large',
|
|
@@ -514,7 +528,7 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
514
528
|
<div style="font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
|
|
515
529
|
Preview
|
|
516
530
|
</div>
|
|
517
|
-
<div id="${this._id}-preview" style="font-family: monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
|
|
531
|
+
<div id="${this._id}-preview" style="font-family: ui-monospace, monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
|
|
518
532
|
</div>
|
|
519
533
|
`;
|
|
520
534
|
this._reshapeModal
|
|
@@ -576,10 +590,10 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
576
590
|
const headerRow = parseInt(headerRowInput?.value) || 0;
|
|
577
591
|
updateHint(headerRow);
|
|
578
592
|
try {
|
|
579
|
-
//
|
|
593
|
+
// ALWAYS parse with headerRow=0 to get raw file structure
|
|
580
594
|
const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
|
|
581
595
|
headerRow: 0,
|
|
582
|
-
maxSheetSize: headerRow + 12
|
|
596
|
+
maxSheetSize: Math.max(headerRow + 12, 15)
|
|
583
597
|
});
|
|
584
598
|
const rawSheet = Object.values(rawSheets)[0];
|
|
585
599
|
if (!rawSheet) {
|
|
@@ -587,63 +601,65 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
587
601
|
previewDiv.textContent = 'No data found';
|
|
588
602
|
return;
|
|
589
603
|
}
|
|
604
|
+
// rawSheet.columns = row 0 values (when parsed with headerRow=0)
|
|
605
|
+
// rawSheet.toRows() = rows 1+ (data rows when parsed with headerRow=0)
|
|
590
606
|
const rawCols = rawSheet.columns;
|
|
591
607
|
const rawRows = rawSheet.toRows();
|
|
592
|
-
// Build
|
|
593
|
-
let html = '<table style="width: 100%; border-collapse: collapse; font-size:
|
|
594
|
-
//
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
const
|
|
608
|
+
// Build HTML table showing raw file structure
|
|
609
|
+
let html = '<table style="width: 100%; border-collapse: collapse; font-size: 12px;">';
|
|
610
|
+
// We need to show rows 0 through headerRow+7 (or so)
|
|
611
|
+
// Row 0 = rawCols, Row 1+ = rawRows[i-1]
|
|
612
|
+
const totalRowsToShow = Math.min(headerRow + 8, rawRows.length + 1);
|
|
613
|
+
for (let fileRow = 0; fileRow < totalRowsToShow; fileRow++) {
|
|
614
|
+
const isHeader = (fileRow === headerRow);
|
|
615
|
+
const isSkipped = (fileRow < headerRow);
|
|
599
616
|
let rowStyle = 'border-bottom: 1px solid hsl(var(--border));';
|
|
600
|
-
let cellStyle = 'padding: 6px 8px; text-align: left;';
|
|
601
617
|
if (isHeader) {
|
|
602
|
-
rowStyle += 'background: hsl(
|
|
618
|
+
rowStyle += 'background: hsl(142 71% 45% / 0.15); font-weight: 600;';
|
|
603
619
|
}
|
|
604
620
|
else if (isSkipped) {
|
|
605
|
-
rowStyle += 'background: hsl(var(--muted) / 0.
|
|
621
|
+
rowStyle += 'background: hsl(var(--muted) / 0.4); color: hsl(var(--muted-foreground)); font-style: italic; opacity: 0.7;';
|
|
606
622
|
}
|
|
607
623
|
html += `<tr style="${rowStyle}">`;
|
|
608
624
|
// Row index cell
|
|
609
|
-
html += `<td style="
|
|
625
|
+
html += `<td style="padding: 8px 12px; width: 60px; font-weight: 600; color: hsl(var(--muted-foreground)); border-right: 1px solid hsl(var(--border)); text-align: center;">`;
|
|
610
626
|
if (isHeader) {
|
|
611
|
-
html += `<
|
|
627
|
+
html += `<span style="color: hsl(142 71% 45%);">▶ ${fileRow}</span>`;
|
|
612
628
|
}
|
|
613
629
|
else {
|
|
614
|
-
html += `${
|
|
630
|
+
html += `${fileRow}`;
|
|
615
631
|
}
|
|
616
632
|
html += '</td>';
|
|
617
|
-
//
|
|
633
|
+
// Get values for this file row
|
|
618
634
|
let values;
|
|
619
|
-
if (
|
|
635
|
+
if (fileRow === 0) {
|
|
620
636
|
values = rawCols;
|
|
621
637
|
}
|
|
622
|
-
else if (i - 1 < rawRows.length) {
|
|
623
|
-
values = Object.values(rawRows[i - 1]);
|
|
624
|
-
}
|
|
625
638
|
else {
|
|
626
|
-
values = [];
|
|
639
|
+
values = rawRows[fileRow - 1] ? Object.values(rawRows[fileRow - 1]) : [];
|
|
627
640
|
}
|
|
628
641
|
// Show first 6 columns
|
|
629
642
|
const displayCols = values.slice(0, 6);
|
|
630
643
|
displayCols.forEach(val => {
|
|
631
|
-
const displayVal = val != null ? String(val).substring(0,
|
|
644
|
+
const displayVal = val != null ? String(val).substring(0, 20) : '';
|
|
645
|
+
const cellStyle = isHeader
|
|
646
|
+
? 'padding: 8px 12px; font-weight: 600; color: hsl(var(--foreground));'
|
|
647
|
+
: 'padding: 8px 12px;';
|
|
632
648
|
html += `<td style="${cellStyle}">${this._escapeHtml(displayVal)}</td>`;
|
|
633
649
|
});
|
|
634
650
|
if (values.length > 6) {
|
|
635
|
-
html += `<td style="
|
|
651
|
+
html += `<td style="padding: 8px 12px; color: hsl(var(--muted-foreground));">…</td>`;
|
|
636
652
|
}
|
|
637
|
-
// Status cell
|
|
638
|
-
html += `<td style="
|
|
653
|
+
// Status badge cell
|
|
654
|
+
html += `<td style="padding: 8px 12px; text-align: right; white-space: nowrap;">`;
|
|
639
655
|
if (isHeader) {
|
|
640
|
-
html += '<span style="background: hsl(
|
|
656
|
+
html += '<span style="background: hsl(142 71% 45%); color: white; padding: 3px 8px; border-radius: 4px; font-size: 10px; font-weight: 600;">HEADER</span>';
|
|
641
657
|
}
|
|
642
658
|
else if (isSkipped) {
|
|
643
|
-
html += '<span style="color: hsl(var(--muted-foreground));">skipped</span>';
|
|
659
|
+
html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">skipped</span>';
|
|
644
660
|
}
|
|
645
661
|
else {
|
|
646
|
-
html += '<span style="color: hsl(var(--
|
|
662
|
+
html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">data</span>';
|
|
647
663
|
}
|
|
648
664
|
html += '</td>';
|
|
649
665
|
html += '</tr>';
|
|
@@ -604,7 +604,20 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
604
604
|
|
|
605
605
|
this._cleanupReshapeModal();
|
|
606
606
|
|
|
607
|
-
|
|
607
|
+
// Always detect from a fresh raw parse, not from current _df
|
|
608
|
+
let suggestedRow = 0;
|
|
609
|
+
try {
|
|
610
|
+
const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
|
|
611
|
+
headerRow: 0,
|
|
612
|
+
maxSheetSize: 20
|
|
613
|
+
});
|
|
614
|
+
const rawSheet = Object.values(rawSheets)[0];
|
|
615
|
+
if (rawSheet) {
|
|
616
|
+
suggestedRow = this._detectLikelyHeaderRow(rawSheet);
|
|
617
|
+
}
|
|
618
|
+
} catch {
|
|
619
|
+
suggestedRow = 0;
|
|
620
|
+
}
|
|
608
621
|
|
|
609
622
|
this._reshapeModal = new Modal(`${this._id}-reshape-modal`, {
|
|
610
623
|
title: 'Excel Import Settings',
|
|
@@ -634,7 +647,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
634
647
|
<div style="font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
|
|
635
648
|
Preview
|
|
636
649
|
</div>
|
|
637
|
-
<div id="${this._id}-preview" style="font-family: monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
|
|
650
|
+
<div id="${this._id}-preview" style="font-family: ui-monospace, monospace; font-size: 12px; background: hsl(var(--muted) / 0.3); border: 1px solid hsl(var(--border)); border-radius: var(--radius); padding: 0; overflow: hidden; max-height: 400px; overflow-y: auto;"></div>
|
|
638
651
|
</div>
|
|
639
652
|
`;
|
|
640
653
|
|
|
@@ -704,10 +717,10 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
704
717
|
updateHint(headerRow);
|
|
705
718
|
|
|
706
719
|
try {
|
|
707
|
-
//
|
|
720
|
+
// ALWAYS parse with headerRow=0 to get raw file structure
|
|
708
721
|
const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData!.file, {
|
|
709
722
|
headerRow: 0,
|
|
710
|
-
maxSheetSize: headerRow + 12
|
|
723
|
+
maxSheetSize: Math.max(headerRow + 12, 15)
|
|
711
724
|
});
|
|
712
725
|
const rawSheet = Object.values(rawSheets)[0];
|
|
713
726
|
|
|
@@ -716,68 +729,71 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
716
729
|
return;
|
|
717
730
|
}
|
|
718
731
|
|
|
732
|
+
// rawSheet.columns = row 0 values (when parsed with headerRow=0)
|
|
733
|
+
// rawSheet.toRows() = rows 1+ (data rows when parsed with headerRow=0)
|
|
719
734
|
const rawCols = rawSheet.columns;
|
|
720
735
|
const rawRows = rawSheet.toRows();
|
|
721
736
|
|
|
722
|
-
// Build
|
|
723
|
-
let html = '<table style="width: 100%; border-collapse: collapse; font-size:
|
|
737
|
+
// Build HTML table showing raw file structure
|
|
738
|
+
let html = '<table style="width: 100%; border-collapse: collapse; font-size: 12px;">';
|
|
724
739
|
|
|
725
|
-
//
|
|
726
|
-
|
|
740
|
+
// We need to show rows 0 through headerRow+7 (or so)
|
|
741
|
+
// Row 0 = rawCols, Row 1+ = rawRows[i-1]
|
|
742
|
+
const totalRowsToShow = Math.min(headerRow + 8, rawRows.length + 1);
|
|
727
743
|
|
|
728
|
-
for (let
|
|
729
|
-
const isHeader = (
|
|
730
|
-
const isSkipped = (
|
|
744
|
+
for (let fileRow = 0; fileRow < totalRowsToShow; fileRow++) {
|
|
745
|
+
const isHeader = (fileRow === headerRow);
|
|
746
|
+
const isSkipped = (fileRow < headerRow);
|
|
731
747
|
|
|
732
748
|
let rowStyle = 'border-bottom: 1px solid hsl(var(--border));';
|
|
733
|
-
let cellStyle = 'padding: 6px 8px; text-align: left;';
|
|
734
749
|
|
|
735
750
|
if (isHeader) {
|
|
736
|
-
rowStyle += 'background: hsl(
|
|
751
|
+
rowStyle += 'background: hsl(142 71% 45% / 0.15); font-weight: 600;';
|
|
737
752
|
} else if (isSkipped) {
|
|
738
|
-
rowStyle += 'background: hsl(var(--muted) / 0.
|
|
753
|
+
rowStyle += 'background: hsl(var(--muted) / 0.4); color: hsl(var(--muted-foreground)); font-style: italic; opacity: 0.7;';
|
|
739
754
|
}
|
|
740
755
|
|
|
741
756
|
html += `<tr style="${rowStyle}">`;
|
|
742
757
|
|
|
743
758
|
// Row index cell
|
|
744
|
-
html += `<td style="
|
|
759
|
+
html += `<td style="padding: 8px 12px; width: 60px; font-weight: 600; color: hsl(var(--muted-foreground)); border-right: 1px solid hsl(var(--border)); text-align: center;">`;
|
|
745
760
|
if (isHeader) {
|
|
746
|
-
html += `<
|
|
761
|
+
html += `<span style="color: hsl(142 71% 45%);">▶ ${fileRow}</span>`;
|
|
747
762
|
} else {
|
|
748
|
-
html += `${
|
|
763
|
+
html += `${fileRow}`;
|
|
749
764
|
}
|
|
750
765
|
html += '</td>';
|
|
751
766
|
|
|
752
|
-
//
|
|
767
|
+
// Get values for this file row
|
|
753
768
|
let values: any[];
|
|
754
|
-
if (
|
|
769
|
+
if (fileRow === 0) {
|
|
755
770
|
values = rawCols;
|
|
756
|
-
} else if (i - 1 < rawRows.length) {
|
|
757
|
-
values = Object.values(rawRows[i - 1]);
|
|
758
771
|
} else {
|
|
759
|
-
values = [];
|
|
772
|
+
values = rawRows[fileRow - 1] ? Object.values(rawRows[fileRow - 1]) : [];
|
|
760
773
|
}
|
|
761
774
|
|
|
762
775
|
// Show first 6 columns
|
|
763
776
|
const displayCols = values.slice(0, 6);
|
|
764
777
|
displayCols.forEach(val => {
|
|
765
|
-
const displayVal = val != null ? String(val).substring(0,
|
|
778
|
+
const displayVal = val != null ? String(val).substring(0, 20) : '';
|
|
779
|
+
const cellStyle = isHeader
|
|
780
|
+
? 'padding: 8px 12px; font-weight: 600; color: hsl(var(--foreground));'
|
|
781
|
+
: 'padding: 8px 12px;';
|
|
766
782
|
html += `<td style="${cellStyle}">${this._escapeHtml(displayVal)}</td>`;
|
|
767
783
|
});
|
|
768
784
|
|
|
769
785
|
if (values.length > 6) {
|
|
770
|
-
html += `<td style="
|
|
786
|
+
html += `<td style="padding: 8px 12px; color: hsl(var(--muted-foreground));">…</td>`;
|
|
771
787
|
}
|
|
772
788
|
|
|
773
|
-
// Status cell
|
|
774
|
-
html += `<td style="
|
|
789
|
+
// Status badge cell
|
|
790
|
+
html += `<td style="padding: 8px 12px; text-align: right; white-space: nowrap;">`;
|
|
775
791
|
if (isHeader) {
|
|
776
|
-
html += '<span style="background: hsl(
|
|
792
|
+
html += '<span style="background: hsl(142 71% 45%); color: white; padding: 3px 8px; border-radius: 4px; font-size: 10px; font-weight: 600;">HEADER</span>';
|
|
777
793
|
} else if (isSkipped) {
|
|
778
|
-
html += '<span style="color: hsl(var(--muted-foreground));">skipped</span>';
|
|
794
|
+
html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">skipped</span>';
|
|
779
795
|
} else {
|
|
780
|
-
html += '<span style="color: hsl(var(--
|
|
796
|
+
html += '<span style="color: hsl(var(--muted-foreground)); font-size: 10px;">data</span>';
|
|
781
797
|
}
|
|
782
798
|
html += '</td>';
|
|
783
799
|
|