juxscript 1.1.189 → 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 index is i + 1
435
- return i + 1;
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 0;
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) : 0;
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 (0-based)
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="0"
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 headerRow = parseInt(input.value) || 0;
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 headerRow = parseInt(headerRowInput?.value) || 0;
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 (0-based)</label>
597
- <input type="number" id="${this._id}-header-row" class="jux-input-element" value="0" min="0" max="50" style="width: 100%;" />
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 headerRow = parseInt(headerRowInput.value) || 0;
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 headerRow = parseInt(headerRowInput?.value) || 0;
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 index is i + 1
547
- return i + 1;
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 0;
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) : 0;
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 (0-based)
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="0"
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 headerRow = parseInt(input.value) || 0;
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 headerRow = parseInt(headerRowInput?.value) || 0;
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 (0-based)</label>
727
- <input type="number" id="${this._id}-header-row" class="jux-input-element" value="0" min="0" max="50" style="width: 100%;" />
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 headerRow = parseInt(headerRowInput.value) || 0;
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 headerRow = parseInt(headerRowInput?.value) || 0;
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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.189",
3
+ "version": "1.1.191",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",