juxscript 1.1.193 → 1.1.194
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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"}
|
|
@@ -491,7 +491,7 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
491
491
|
</div>
|
|
492
492
|
<div class="jux-reshape-preview-container">
|
|
493
493
|
<div style="font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
|
|
494
|
-
Preview
|
|
494
|
+
Preview
|
|
495
495
|
</div>
|
|
496
496
|
<div id="${this._id}-preview" class="jux-reshape-preview"></div>
|
|
497
497
|
</div>
|
|
@@ -543,35 +543,66 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
543
543
|
const updateHint = (headerRow) => {
|
|
544
544
|
if (!hintDiv)
|
|
545
545
|
return;
|
|
546
|
-
hintDiv.innerHTML =
|
|
547
|
-
`
|
|
546
|
+
hintDiv.innerHTML = headerRow > 0
|
|
547
|
+
? `Row <strong>${headerRow}</strong> will be used as column headers. ` +
|
|
548
|
+
`The <strong>${headerRow}</strong> row${headerRow > 1 ? 's' : ''} above will be skipped.`
|
|
549
|
+
: `Row <strong>0</strong> (first row) will be used as column headers.`;
|
|
548
550
|
};
|
|
549
551
|
const updatePreview = async () => {
|
|
550
552
|
const headerRow = parseInt(headerRowInput?.value) || 0;
|
|
551
553
|
updateHint(headerRow);
|
|
552
554
|
try {
|
|
553
|
-
|
|
555
|
+
// First, get raw data (headerRow=0) to show skipped rows
|
|
556
|
+
const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
|
|
557
|
+
headerRow: 0,
|
|
558
|
+
maxSheetSize: headerRow + 15
|
|
559
|
+
});
|
|
560
|
+
const rawSheet = Object.values(rawSheets)[0];
|
|
561
|
+
// Then, get parsed data with the chosen header row
|
|
562
|
+
const parsedSheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
|
|
554
563
|
headerRow,
|
|
555
|
-
maxSheetSize: headerRow +
|
|
564
|
+
maxSheetSize: headerRow + 15
|
|
556
565
|
});
|
|
557
|
-
const
|
|
558
|
-
if (!
|
|
566
|
+
const parsedSheet = Object.values(parsedSheets)[0];
|
|
567
|
+
if (!rawSheet && !parsedSheet) {
|
|
559
568
|
if (previewDiv)
|
|
560
569
|
previewDiv.textContent = 'No data found';
|
|
561
570
|
return;
|
|
562
571
|
}
|
|
563
|
-
const dataRows = firstSheet.toRows().slice(0, 10);
|
|
564
|
-
const idxWidth = 6;
|
|
565
572
|
const colWidth = 22;
|
|
566
|
-
const
|
|
567
|
-
const
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
const
|
|
571
|
-
|
|
572
|
-
|
|
573
|
+
const idxWidth = 6;
|
|
574
|
+
const lines = [];
|
|
575
|
+
// Show skipped rows (rows before the header)
|
|
576
|
+
if (rawSheet && headerRow > 0) {
|
|
577
|
+
const rawRows = rawSheet.toRows();
|
|
578
|
+
// Row 0 in raw parse is the raw header, rows after are data
|
|
579
|
+
// Show raw header as row 0
|
|
580
|
+
const rawCols = rawSheet.columns;
|
|
581
|
+
lines.push(`${'Idx'.padEnd(idxWidth)}${rawCols.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`);
|
|
582
|
+
const skippedCount = Math.min(headerRow - 1, rawRows.length);
|
|
583
|
+
for (let i = 0; i < skippedCount; i++) {
|
|
584
|
+
const row = rawRows[i];
|
|
585
|
+
const rowIdx = String(i + 1).padEnd(idxWidth);
|
|
586
|
+
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
587
|
+
lines.push(`${rowIdx}${cols}`);
|
|
588
|
+
}
|
|
589
|
+
// Separator: everything above is skipped
|
|
590
|
+
lines.push(`${'─'.repeat(6)}${'── skipped '.padEnd(colWidth * Math.min(rawCols.length, 5), '─')}`);
|
|
591
|
+
}
|
|
592
|
+
// Show header row and data rows from parsed result
|
|
593
|
+
if (parsedSheet) {
|
|
594
|
+
const headerLine = `${'▶'.padEnd(idxWidth)}${parsedSheet.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`;
|
|
595
|
+
lines.push(headerLine);
|
|
596
|
+
lines.push('═'.repeat(Math.min(headerLine.length, 140)));
|
|
597
|
+
const dataRows = parsedSheet.toRows().slice(0, 8);
|
|
598
|
+
dataRows.forEach((row, i) => {
|
|
599
|
+
const rowIdx = String(headerRow + 1 + i).padEnd(idxWidth);
|
|
600
|
+
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
601
|
+
lines.push(`${rowIdx}${cols}`);
|
|
602
|
+
});
|
|
603
|
+
}
|
|
573
604
|
if (previewDiv) {
|
|
574
|
-
previewDiv.textContent =
|
|
605
|
+
previewDiv.textContent = lines.join('\n');
|
|
575
606
|
}
|
|
576
607
|
}
|
|
577
608
|
catch (err) {
|
|
@@ -678,9 +709,11 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
678
709
|
return;
|
|
679
710
|
const headerRow = parseInt(headerRowInput?.value) || 0;
|
|
680
711
|
const skipRows = parseInt(skipRowsInput?.value) || 0;
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
712
|
+
const totalSkipped = headerRow + skipRows;
|
|
713
|
+
hintDiv.innerHTML = totalSkipped > 0
|
|
714
|
+
? `Row <strong>${headerRow + skipRows}</strong> will be used as column headers. ` +
|
|
715
|
+
`<strong>${totalSkipped}</strong> row${totalSkipped > 1 ? 's' : ''} above will be skipped.`
|
|
716
|
+
: `Row <strong>0</strong> (first row) will be used as column headers.`;
|
|
684
717
|
};
|
|
685
718
|
const updatePreview = () => {
|
|
686
719
|
if (!this._rawFileData?.text)
|
|
@@ -690,25 +723,50 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
690
723
|
const skipRows = parseInt(skipRowsInput?.value) || 0;
|
|
691
724
|
updateHint();
|
|
692
725
|
try {
|
|
726
|
+
const colWidth = 22;
|
|
727
|
+
const idxWidth = 6;
|
|
728
|
+
const lines = [];
|
|
729
|
+
const totalOffset = headerRow + skipRows;
|
|
730
|
+
// Parse raw (no header offset) to show skipped rows
|
|
731
|
+
if (totalOffset > 0) {
|
|
732
|
+
const rawDf = this._driver.parseCSV(this._rawFileData.text, {
|
|
733
|
+
delimiter: delim,
|
|
734
|
+
headerRow: 0,
|
|
735
|
+
skipRows: 0,
|
|
736
|
+
hasHeader: true,
|
|
737
|
+
maxRows: totalOffset + 1
|
|
738
|
+
});
|
|
739
|
+
const rawCols = rawDf.columns;
|
|
740
|
+
lines.push(`${'Idx'.padEnd(idxWidth)}${rawCols.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`);
|
|
741
|
+
const rawRows = rawDf.toRows();
|
|
742
|
+
const skippedCount = Math.min(totalOffset - 1, rawRows.length);
|
|
743
|
+
for (let i = 0; i < skippedCount; i++) {
|
|
744
|
+
const row = rawRows[i];
|
|
745
|
+
const rowIdx = String(i + 1).padEnd(idxWidth);
|
|
746
|
+
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
747
|
+
lines.push(`${rowIdx}${cols}`);
|
|
748
|
+
}
|
|
749
|
+
lines.push(`${'─'.repeat(6)}${'── skipped '.padEnd(colWidth * Math.min(rawCols.length, 5), '─')}`);
|
|
750
|
+
}
|
|
751
|
+
// Parse with actual settings for header + data rows
|
|
693
752
|
const df = this._driver.parseCSV(this._rawFileData.text, {
|
|
694
753
|
delimiter: delim,
|
|
695
754
|
headerRow,
|
|
696
755
|
skipRows,
|
|
697
756
|
hasHeader: true,
|
|
698
|
-
maxRows:
|
|
757
|
+
maxRows: 8
|
|
699
758
|
});
|
|
759
|
+
const headerLine = `${'▶'.padEnd(idxWidth)}${df.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`;
|
|
760
|
+
lines.push(headerLine);
|
|
761
|
+
lines.push('═'.repeat(Math.min(headerLine.length, 140)));
|
|
700
762
|
const dataRows = df.toRows();
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
const headerLine = 'Idx'.padEnd(idxWidth) + df.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
704
|
-
const separator = '─'.repeat(Math.min(headerLine.length, 140));
|
|
705
|
-
const preview = dataRows.map((row, i) => {
|
|
706
|
-
const rowIdx = String(headerRow + skipRows + 1 + i).padEnd(idxWidth);
|
|
763
|
+
dataRows.forEach((row, i) => {
|
|
764
|
+
const rowIdx = String(totalOffset + 1 + i).padEnd(idxWidth);
|
|
707
765
|
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
708
|
-
|
|
709
|
-
})
|
|
766
|
+
lines.push(`${rowIdx}${cols}`);
|
|
767
|
+
});
|
|
710
768
|
if (previewDiv) {
|
|
711
|
-
previewDiv.textContent =
|
|
769
|
+
previewDiv.textContent = lines.join('\n');
|
|
712
770
|
}
|
|
713
771
|
}
|
|
714
772
|
catch (err) {
|
|
@@ -609,7 +609,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
609
609
|
</div>
|
|
610
610
|
<div class="jux-reshape-preview-container">
|
|
611
611
|
<div style="font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
|
|
612
|
-
Preview
|
|
612
|
+
Preview
|
|
613
613
|
</div>
|
|
614
614
|
<div id="${this._id}-preview" class="jux-reshape-preview"></div>
|
|
615
615
|
</div>
|
|
@@ -668,42 +668,76 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
668
668
|
|
|
669
669
|
const updateHint = (headerRow: number) => {
|
|
670
670
|
if (!hintDiv) return;
|
|
671
|
-
hintDiv.innerHTML =
|
|
672
|
-
`
|
|
671
|
+
hintDiv.innerHTML = headerRow > 0
|
|
672
|
+
? `Row <strong>${headerRow}</strong> will be used as column headers. ` +
|
|
673
|
+
`The <strong>${headerRow}</strong> row${headerRow > 1 ? 's' : ''} above will be skipped.`
|
|
674
|
+
: `Row <strong>0</strong> (first row) will be used as column headers.`;
|
|
673
675
|
};
|
|
674
676
|
|
|
675
677
|
const updatePreview = async () => {
|
|
676
678
|
const headerRow = parseInt(headerRowInput?.value) || 0;
|
|
677
|
-
|
|
678
679
|
updateHint(headerRow);
|
|
679
680
|
|
|
680
681
|
try {
|
|
681
|
-
|
|
682
|
+
// First, get raw data (headerRow=0) to show skipped rows
|
|
683
|
+
const rawSheets = await this._driver.streamFileMultiSheet(this._rawFileData!.file, {
|
|
684
|
+
headerRow: 0,
|
|
685
|
+
maxSheetSize: headerRow + 15
|
|
686
|
+
});
|
|
687
|
+
const rawSheet = Object.values(rawSheets)[0];
|
|
688
|
+
|
|
689
|
+
// Then, get parsed data with the chosen header row
|
|
690
|
+
const parsedSheets = await this._driver.streamFileMultiSheet(this._rawFileData!.file, {
|
|
682
691
|
headerRow,
|
|
683
|
-
maxSheetSize: headerRow +
|
|
692
|
+
maxSheetSize: headerRow + 15
|
|
684
693
|
});
|
|
694
|
+
const parsedSheet = Object.values(parsedSheets)[0];
|
|
685
695
|
|
|
686
|
-
|
|
687
|
-
if (!firstSheet) {
|
|
696
|
+
if (!rawSheet && !parsedSheet) {
|
|
688
697
|
if (previewDiv) previewDiv.textContent = 'No data found';
|
|
689
698
|
return;
|
|
690
699
|
}
|
|
691
700
|
|
|
692
|
-
const dataRows = firstSheet.toRows().slice(0, 10);
|
|
693
|
-
const idxWidth = 6;
|
|
694
701
|
const colWidth = 22;
|
|
702
|
+
const idxWidth = 6;
|
|
703
|
+
const lines: string[] = [];
|
|
704
|
+
|
|
705
|
+
// Show skipped rows (rows before the header)
|
|
706
|
+
if (rawSheet && headerRow > 0) {
|
|
707
|
+
const rawRows = rawSheet.toRows();
|
|
708
|
+
// Row 0 in raw parse is the raw header, rows after are data
|
|
709
|
+
// Show raw header as row 0
|
|
710
|
+
const rawCols = rawSheet.columns;
|
|
711
|
+
lines.push(`${'Idx'.padEnd(idxWidth)}${rawCols.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`);
|
|
712
|
+
|
|
713
|
+
const skippedCount = Math.min(headerRow - 1, rawRows.length);
|
|
714
|
+
for (let i = 0; i < skippedCount; i++) {
|
|
715
|
+
const row = rawRows[i];
|
|
716
|
+
const rowIdx = String(i + 1).padEnd(idxWidth);
|
|
717
|
+
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
718
|
+
lines.push(`${rowIdx}${cols}`);
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
// Separator: everything above is skipped
|
|
722
|
+
lines.push(`${'─'.repeat(6)}${'── skipped '.padEnd(colWidth * Math.min(rawCols.length, 5), '─')}`);
|
|
723
|
+
}
|
|
695
724
|
|
|
696
|
-
|
|
697
|
-
|
|
725
|
+
// Show header row and data rows from parsed result
|
|
726
|
+
if (parsedSheet) {
|
|
727
|
+
const headerLine = `${'▶'.padEnd(idxWidth)}${parsedSheet.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`;
|
|
728
|
+
lines.push(headerLine);
|
|
729
|
+
lines.push('═'.repeat(Math.min(headerLine.length, 140)));
|
|
698
730
|
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
731
|
+
const dataRows = parsedSheet.toRows().slice(0, 8);
|
|
732
|
+
dataRows.forEach((row, i) => {
|
|
733
|
+
const rowIdx = String(headerRow + 1 + i).padEnd(idxWidth);
|
|
734
|
+
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
735
|
+
lines.push(`${rowIdx}${cols}`);
|
|
736
|
+
});
|
|
737
|
+
}
|
|
704
738
|
|
|
705
739
|
if (previewDiv) {
|
|
706
|
-
previewDiv.textContent =
|
|
740
|
+
previewDiv.textContent = lines.join('\n');
|
|
707
741
|
}
|
|
708
742
|
} catch (err: any) {
|
|
709
743
|
if (previewDiv) previewDiv.textContent = `Error: ${err.message}`;
|
|
@@ -819,9 +853,11 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
819
853
|
if (!hintDiv) return;
|
|
820
854
|
const headerRow = parseInt(headerRowInput?.value) || 0;
|
|
821
855
|
const skipRows = parseInt(skipRowsInput?.value) || 0;
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
856
|
+
const totalSkipped = headerRow + skipRows;
|
|
857
|
+
hintDiv.innerHTML = totalSkipped > 0
|
|
858
|
+
? `Row <strong>${headerRow + skipRows}</strong> will be used as column headers. ` +
|
|
859
|
+
`<strong>${totalSkipped}</strong> row${totalSkipped > 1 ? 's' : ''} above will be skipped.`
|
|
860
|
+
: `Row <strong>0</strong> (first row) will be used as column headers.`;
|
|
825
861
|
};
|
|
826
862
|
|
|
827
863
|
const updatePreview = () => {
|
|
@@ -834,29 +870,58 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
834
870
|
updateHint();
|
|
835
871
|
|
|
836
872
|
try {
|
|
873
|
+
const colWidth = 22;
|
|
874
|
+
const idxWidth = 6;
|
|
875
|
+
const lines: string[] = [];
|
|
876
|
+
const totalOffset = headerRow + skipRows;
|
|
877
|
+
|
|
878
|
+
// Parse raw (no header offset) to show skipped rows
|
|
879
|
+
if (totalOffset > 0) {
|
|
880
|
+
const rawDf = this._driver.parseCSV(this._rawFileData.text, {
|
|
881
|
+
delimiter: delim,
|
|
882
|
+
headerRow: 0,
|
|
883
|
+
skipRows: 0,
|
|
884
|
+
hasHeader: true,
|
|
885
|
+
maxRows: totalOffset + 1
|
|
886
|
+
});
|
|
887
|
+
|
|
888
|
+
const rawCols = rawDf.columns;
|
|
889
|
+
lines.push(`${'Idx'.padEnd(idxWidth)}${rawCols.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`);
|
|
890
|
+
|
|
891
|
+
const rawRows = rawDf.toRows();
|
|
892
|
+
const skippedCount = Math.min(totalOffset - 1, rawRows.length);
|
|
893
|
+
for (let i = 0; i < skippedCount; i++) {
|
|
894
|
+
const row = rawRows[i];
|
|
895
|
+
const rowIdx = String(i + 1).padEnd(idxWidth);
|
|
896
|
+
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
897
|
+
lines.push(`${rowIdx}${cols}`);
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
lines.push(`${'─'.repeat(6)}${'── skipped '.padEnd(colWidth * Math.min(rawCols.length, 5), '─')}`);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
// Parse with actual settings for header + data rows
|
|
837
904
|
const df = this._driver.parseCSV(this._rawFileData.text, {
|
|
838
905
|
delimiter: delim,
|
|
839
906
|
headerRow,
|
|
840
907
|
skipRows,
|
|
841
908
|
hasHeader: true,
|
|
842
|
-
maxRows:
|
|
909
|
+
maxRows: 8
|
|
843
910
|
});
|
|
844
911
|
|
|
845
|
-
const
|
|
846
|
-
|
|
847
|
-
|
|
912
|
+
const headerLine = `${'▶'.padEnd(idxWidth)}${df.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ')}`;
|
|
913
|
+
lines.push(headerLine);
|
|
914
|
+
lines.push('═'.repeat(Math.min(headerLine.length, 140)));
|
|
848
915
|
|
|
849
|
-
const
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
const preview = dataRows.map((row, i) => {
|
|
853
|
-
const rowIdx = String(headerRow + skipRows + 1 + i).padEnd(idxWidth);
|
|
916
|
+
const dataRows = df.toRows();
|
|
917
|
+
dataRows.forEach((row, i) => {
|
|
918
|
+
const rowIdx = String(totalOffset + 1 + i).padEnd(idxWidth);
|
|
854
919
|
const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
|
|
855
|
-
|
|
856
|
-
})
|
|
920
|
+
lines.push(`${rowIdx}${cols}`);
|
|
921
|
+
});
|
|
857
922
|
|
|
858
923
|
if (previewDiv) {
|
|
859
|
-
previewDiv.textContent =
|
|
924
|
+
previewDiv.textContent = lines.join('\n');
|
|
860
925
|
}
|
|
861
926
|
} catch (err: any) {
|
|
862
927
|
if (previewDiv) previewDiv.textContent = `Error: ${err.message}`;
|