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 (first 10 rows)
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 = `The data starting at <strong>row ${headerRow}</strong> will be used as column headers. ` +
547
- `Rows before it will be skipped. The preview below shows the row index as the first column.`;
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
- const sheets = await this._driver.streamFileMultiSheet(this._rawFileData.file, {
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 + 20
564
+ maxSheetSize: headerRow + 15
556
565
  });
557
- const firstSheet = Object.values(sheets)[0];
558
- if (!firstSheet) {
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 headerLine = 'Idx'.padEnd(idxWidth) + firstSheet.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
567
- const separator = '─'.repeat(Math.min(headerLine.length, 140));
568
- const preview = dataRows.map((row, i) => {
569
- const rowIdx = String(headerRow + 1 + i).padEnd(idxWidth);
570
- const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
571
- return `${rowIdx}${cols}`;
572
- }).join('\n');
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 = `${headerLine}\n${separator}\n${preview}`;
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
- hintDiv.innerHTML = `Using <strong>row ${headerRow}</strong> as column headers` +
682
- (skipRows > 0 ? ` (skipping ${skipRows} rows before it)` : '') +
683
- `. The Idx column shows the file row index.`;
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: 10
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
- const idxWidth = 6;
702
- const colWidth = 22;
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
- return `${rowIdx}${cols}`;
709
- }).join('\n');
766
+ lines.push(`${rowIdx}${cols}`);
767
+ });
710
768
  if (previewDiv) {
711
- previewDiv.textContent = `${headerLine}\n${separator}\n${preview}`;
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 (first 10 rows)
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 = `The data starting at <strong>row ${headerRow}</strong> will be used as column headers. ` +
672
- `Rows before it will be skipped. The preview below shows the row index as the first column.`;
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
- const sheets = await this._driver.streamFileMultiSheet(this._rawFileData!.file, {
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 + 20
692
+ maxSheetSize: headerRow + 15
684
693
  });
694
+ const parsedSheet = Object.values(parsedSheets)[0];
685
695
 
686
- const firstSheet = Object.values(sheets)[0];
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
- const headerLine = 'Idx'.padEnd(idxWidth) + firstSheet.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
697
- const separator = '─'.repeat(Math.min(headerLine.length, 140));
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
- const preview = dataRows.map((row, i) => {
700
- const rowIdx = String(headerRow + 1 + i).padEnd(idxWidth);
701
- const cols = Object.values(row).map(v => String(v ?? '').substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
702
- return `${rowIdx}${cols}`;
703
- }).join('\n');
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 = `${headerLine}\n${separator}\n${preview}`;
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
- hintDiv.innerHTML = `Using <strong>row ${headerRow}</strong> as column headers` +
823
- (skipRows > 0 ? ` (skipping ${skipRows} rows before it)` : '') +
824
- `. The Idx column shows the file row index.`;
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: 10
909
+ maxRows: 8
843
910
  });
844
911
 
845
- const dataRows = df.toRows();
846
- const idxWidth = 6;
847
- const colWidth = 22;
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 headerLine = 'Idx'.padEnd(idxWidth) + df.columns.map(c => String(c).substring(0, colWidth - 2).padEnd(colWidth)).join('| ');
850
- const separator = '─'.repeat(Math.min(headerLine.length, 140));
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
- return `${rowIdx}${cols}`;
856
- }).join('\n');
920
+ lines.push(`${rowIdx}${cols}`);
921
+ });
857
922
 
858
923
  if (previewDiv) {
859
- previewDiv.textContent = `${headerLine}\n${separator}\n${preview}`;
924
+ previewDiv.textContent = lines.join('\n');
860
925
  }
861
926
  } catch (err: any) {
862
927
  if (previewDiv) previewDiv.textContent = `Error: ${err.message}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.193",
3
+ "version": "1.1.194",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",