juxscript 1.1.190 → 1.1.191
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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"}
|
|
@@ -430,12 +430,13 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
430
430
|
return isNaN(Number(str)) && str !== '';
|
|
431
431
|
}).length;
|
|
432
432
|
if (nonNumericCount >= nonEmpty.length * 0.7 && i > 0) {
|
|
433
|
+
// Return 1-based row number for the UI
|
|
433
434
|
// i is index in toRows() but row 0 of the file was consumed as header,
|
|
434
|
-
// so the actual file row
|
|
435
|
-
return i +
|
|
435
|
+
// so the actual file row is i + 1, and 1-based display is i + 2
|
|
436
|
+
return i + 2;
|
|
436
437
|
}
|
|
437
438
|
}
|
|
438
|
-
return
|
|
439
|
+
return 1; // Default to row 1 (1-based)
|
|
439
440
|
}
|
|
440
441
|
/* ═══════════════════════════════════════════════════
|
|
441
442
|
* RESHAPE MODAL
|
|
@@ -463,7 +464,7 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
463
464
|
if (!this._rawFileData?.file)
|
|
464
465
|
return;
|
|
465
466
|
this._cleanupReshapeModal();
|
|
466
|
-
const suggestedRow = this._df ? this._detectLikelyHeaderRow(this._df) :
|
|
467
|
+
const suggestedRow = this._df ? this._detectLikelyHeaderRow(this._df) : 1;
|
|
467
468
|
this._reshapeModal = new Modal(`${this._id}-reshape-modal`, {
|
|
468
469
|
title: 'Excel Import Settings',
|
|
469
470
|
size: 'large',
|
|
@@ -473,14 +474,14 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
473
474
|
const modalContentHTML = `
|
|
474
475
|
<div style="margin-bottom: 1rem;">
|
|
475
476
|
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
|
|
476
|
-
Header Row
|
|
477
|
+
Header Row
|
|
477
478
|
</label>
|
|
478
479
|
<input
|
|
479
480
|
type="number"
|
|
480
481
|
id="${this._id}-header-row"
|
|
481
482
|
class="jux-input-element"
|
|
482
483
|
value="${suggestedRow}"
|
|
483
|
-
min="
|
|
484
|
+
min="1"
|
|
484
485
|
max="50"
|
|
485
486
|
style="width: 100%;"
|
|
486
487
|
/>
|
|
@@ -510,7 +511,8 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
510
511
|
variant: 'primary',
|
|
511
512
|
click: async () => {
|
|
512
513
|
const input = document.getElementById(`${this._id}-header-row`);
|
|
513
|
-
const
|
|
514
|
+
const headerRowOneBased = parseInt(input.value) || 1;
|
|
515
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based for driver
|
|
514
516
|
this.state.loading = true;
|
|
515
517
|
this._updateStatus('Re-parsing with new settings...', 'loading');
|
|
516
518
|
try {
|
|
@@ -542,7 +544,8 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
542
544
|
const headerRowInput = document.getElementById(`${this._id}-header-row`);
|
|
543
545
|
const previewDiv = document.getElementById(`${this._id}-preview`);
|
|
544
546
|
const updatePreview = async () => {
|
|
545
|
-
const
|
|
547
|
+
const headerRowOneBased = parseInt(headerRowInput?.value) || 1;
|
|
548
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based for driver
|
|
546
549
|
try {
|
|
547
550
|
const sheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
|
|
548
551
|
headerRow,
|
|
@@ -593,8 +596,8 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
593
596
|
</select>
|
|
594
597
|
</div>
|
|
595
598
|
<div style="margin-bottom: 1rem;">
|
|
596
|
-
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem;">Header Row
|
|
597
|
-
<input type="number" id="${this._id}-header-row" class="jux-input-element" value="
|
|
599
|
+
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem;">Header Row</label>
|
|
600
|
+
<input type="number" id="${this._id}-header-row" class="jux-input-element" value="1" min="1" max="50" style="width: 100%;" />
|
|
598
601
|
</div>
|
|
599
602
|
<div style="margin-bottom: 1rem;">
|
|
600
603
|
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem;">Skip Rows Before Header</label>
|
|
@@ -623,7 +626,8 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
623
626
|
const headerRowInput = document.getElementById(`${this._id}-header-row`);
|
|
624
627
|
const skipRowsInput = document.getElementById(`${this._id}-skip-rows`);
|
|
625
628
|
const delim = delimiterSelect.value;
|
|
626
|
-
const
|
|
629
|
+
const headerRowOneBased = parseInt(headerRowInput.value) || 1;
|
|
630
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based
|
|
627
631
|
const skipRows = parseInt(skipRowsInput.value) || 0;
|
|
628
632
|
this.state.loading = true;
|
|
629
633
|
this._updateStatus('Re-parsing with new settings...', 'loading');
|
|
@@ -632,7 +636,8 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
632
636
|
delimiter: delim,
|
|
633
637
|
headerRow,
|
|
634
638
|
skipRows,
|
|
635
|
-
hasHeader: true
|
|
639
|
+
hasHeader: true,
|
|
640
|
+
maxRows: 10
|
|
636
641
|
});
|
|
637
642
|
await this._driver.store(this._rawFileData.file.name, df, { source: this._rawFileData.file.name });
|
|
638
643
|
this._showReshapeWarning = false;
|
|
@@ -658,13 +663,14 @@ export class DataFrameComponent extends BaseComponent {
|
|
|
658
663
|
delimiterSelect.value = detected;
|
|
659
664
|
const detectedHeaderRow = this._driver._detectHeaderRow(this._rawFileData.text, detected);
|
|
660
665
|
if (headerRowInput)
|
|
661
|
-
headerRowInput.value = String(detectedHeaderRow);
|
|
666
|
+
headerRowInput.value = String(detectedHeaderRow + 1); // Convert 0-based to 1-based for display
|
|
662
667
|
}
|
|
663
668
|
const updatePreview = () => {
|
|
664
669
|
if (!this._rawFileData?.text)
|
|
665
670
|
return;
|
|
666
671
|
const delim = delimiterSelect?.value || ',';
|
|
667
|
-
const
|
|
672
|
+
const headerRowOneBased = parseInt(headerRowInput?.value) || 1;
|
|
673
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based
|
|
668
674
|
const skipRows = parseInt(skipRowsInput?.value) || 0;
|
|
669
675
|
try {
|
|
670
676
|
const df = this._driver.parseCSV(this._rawFileData.text, {
|
|
@@ -542,13 +542,14 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
542
542
|
}).length;
|
|
543
543
|
|
|
544
544
|
if (nonNumericCount >= nonEmpty.length * 0.7 && i > 0) {
|
|
545
|
+
// Return 1-based row number for the UI
|
|
545
546
|
// i is index in toRows() but row 0 of the file was consumed as header,
|
|
546
|
-
// so the actual file row
|
|
547
|
-
return i +
|
|
547
|
+
// so the actual file row is i + 1, and 1-based display is i + 2
|
|
548
|
+
return i + 2;
|
|
548
549
|
}
|
|
549
550
|
}
|
|
550
551
|
|
|
551
|
-
return
|
|
552
|
+
return 1; // Default to row 1 (1-based)
|
|
552
553
|
}
|
|
553
554
|
|
|
554
555
|
/* ═══════════════════════════════════════════════════
|
|
@@ -579,7 +580,7 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
579
580
|
|
|
580
581
|
this._cleanupReshapeModal();
|
|
581
582
|
|
|
582
|
-
const suggestedRow = this._df ? this._detectLikelyHeaderRow(this._df) :
|
|
583
|
+
const suggestedRow = this._df ? this._detectLikelyHeaderRow(this._df) : 1;
|
|
583
584
|
|
|
584
585
|
this._reshapeModal = new Modal(`${this._id}-reshape-modal`, {
|
|
585
586
|
title: 'Excel Import Settings',
|
|
@@ -591,14 +592,14 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
591
592
|
const modalContentHTML = `
|
|
592
593
|
<div style="margin-bottom: 1rem;">
|
|
593
594
|
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem; color: hsl(var(--foreground));">
|
|
594
|
-
Header Row
|
|
595
|
+
Header Row
|
|
595
596
|
</label>
|
|
596
597
|
<input
|
|
597
598
|
type="number"
|
|
598
599
|
id="${this._id}-header-row"
|
|
599
600
|
class="jux-input-element"
|
|
600
601
|
value="${suggestedRow}"
|
|
601
|
-
min="
|
|
602
|
+
min="1"
|
|
602
603
|
max="50"
|
|
603
604
|
style="width: 100%;"
|
|
604
605
|
/>
|
|
@@ -629,7 +630,8 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
629
630
|
variant: 'primary',
|
|
630
631
|
click: async () => {
|
|
631
632
|
const input = document.getElementById(`${this._id}-header-row`) as HTMLInputElement;
|
|
632
|
-
const
|
|
633
|
+
const headerRowOneBased = parseInt(input.value) || 1;
|
|
634
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based for driver
|
|
633
635
|
|
|
634
636
|
this.state.loading = true;
|
|
635
637
|
this._updateStatus('Re-parsing with new settings...', 'loading');
|
|
@@ -668,7 +670,8 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
668
670
|
const previewDiv = document.getElementById(`${this._id}-preview`)!;
|
|
669
671
|
|
|
670
672
|
const updatePreview = async () => {
|
|
671
|
-
const
|
|
673
|
+
const headerRowOneBased = parseInt(headerRowInput?.value) || 1;
|
|
674
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based for driver
|
|
672
675
|
try {
|
|
673
676
|
const sheets = await this._driver.streamFileMultiSheet(this._rawFileData!.file, {
|
|
674
677
|
headerRow,
|
|
@@ -723,8 +726,8 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
723
726
|
</select>
|
|
724
727
|
</div>
|
|
725
728
|
<div style="margin-bottom: 1rem;">
|
|
726
|
-
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem;">Header Row
|
|
727
|
-
<input type="number" id="${this._id}-header-row" class="jux-input-element" value="
|
|
729
|
+
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem;">Header Row</label>
|
|
730
|
+
<input type="number" id="${this._id}-header-row" class="jux-input-element" value="1" min="1" max="50" style="width: 100%;" />
|
|
728
731
|
</div>
|
|
729
732
|
<div style="margin-bottom: 1rem;">
|
|
730
733
|
<label style="display: block; font-weight: 600; margin-bottom: 0.5rem;">Skip Rows Before Header</label>
|
|
@@ -755,7 +758,8 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
755
758
|
const skipRowsInput = document.getElementById(`${this._id}-skip-rows`) as HTMLInputElement;
|
|
756
759
|
|
|
757
760
|
const delim = delimiterSelect.value;
|
|
758
|
-
const
|
|
761
|
+
const headerRowOneBased = parseInt(headerRowInput.value) || 1;
|
|
762
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based
|
|
759
763
|
const skipRows = parseInt(skipRowsInput.value) || 0;
|
|
760
764
|
|
|
761
765
|
this.state.loading = true;
|
|
@@ -766,7 +770,8 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
766
770
|
delimiter: delim,
|
|
767
771
|
headerRow,
|
|
768
772
|
skipRows,
|
|
769
|
-
hasHeader: true
|
|
773
|
+
hasHeader: true,
|
|
774
|
+
maxRows: 10
|
|
770
775
|
});
|
|
771
776
|
|
|
772
777
|
await this._driver.store(this._rawFileData.file.name, df, { source: this._rawFileData.file.name });
|
|
@@ -795,14 +800,15 @@ export class DataFrameComponent extends BaseComponent<DataFrameState> {
|
|
|
795
800
|
if (delimiterSelect) delimiterSelect.value = detected;
|
|
796
801
|
|
|
797
802
|
const detectedHeaderRow = (this._driver as any)._detectHeaderRow(this._rawFileData.text, detected);
|
|
798
|
-
if (headerRowInput) headerRowInput.value = String(detectedHeaderRow);
|
|
803
|
+
if (headerRowInput) headerRowInput.value = String(detectedHeaderRow + 1); // Convert 0-based to 1-based for display
|
|
799
804
|
}
|
|
800
805
|
|
|
801
806
|
const updatePreview = () => {
|
|
802
807
|
if (!this._rawFileData?.text) return;
|
|
803
808
|
|
|
804
809
|
const delim = delimiterSelect?.value || ',';
|
|
805
|
-
const
|
|
810
|
+
const headerRowOneBased = parseInt(headerRowInput?.value) || 1;
|
|
811
|
+
const headerRow = headerRowOneBased - 1; // Convert to 0-based
|
|
806
812
|
const skipRows = parseInt(skipRowsInput?.value) || 0;
|
|
807
813
|
|
|
808
814
|
try {
|