Update package version to 0.0.1-beta, add new dependencies including ExcelJS, and refactor export utilities to utilize ExcelJS for Excel file generation. Enhance component JSON files with vendor information for improved asset management.
This commit is contained in:
@@ -2,7 +2,6 @@ import { useState } from 'react';
|
||||
import partsData from '../data/index.js';
|
||||
import { formatPrice, getNumericPrice } from '../utils/priceFormat';
|
||||
import JSZip from 'jszip';
|
||||
import * as XLSX from 'xlsx';
|
||||
import { createShareLink } from '../utils/shareService';
|
||||
import { generateMarkdownOverview, generateExcelBOM, generateExcelPrintList } from '../utils/exportUtils';
|
||||
|
||||
@@ -1411,13 +1410,13 @@ export default function BOMSummary({ config }) {
|
||||
// 2. Generate and add Excel BOM
|
||||
setZipProgress({ current: 20, total: 100, currentFile: 'Generating BOM...' });
|
||||
const bomWorkbook = generateExcelBOM(hardwareParts, printedParts, config);
|
||||
const bomBuffer = XLSX.write(bomWorkbook, { type: 'array', bookType: 'xlsx' });
|
||||
const bomBuffer = await bomWorkbook.xlsx.writeBuffer();
|
||||
zip.file('BOM.xlsx', bomBuffer);
|
||||
|
||||
// 3. Generate and add Excel Print List
|
||||
setZipProgress({ current: 40, total: 100, currentFile: 'Generating print list...' });
|
||||
const printListWorkbook = generateExcelPrintList(printedParts, filamentTotals);
|
||||
const printListBuffer = XLSX.write(printListWorkbook, { type: 'array', bookType: 'xlsx' });
|
||||
const printListBuffer = await printListWorkbook.xlsx.writeBuffer();
|
||||
zip.file('Print_List.xlsx', printListBuffer);
|
||||
|
||||
// 4. Download and organize print files by component and colors
|
||||
|
||||
@@ -12,7 +12,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Actuator Body Bottom.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Actuator%20-%20Body%20-%20Bottom.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Actuator%20-%20Body%20-%20Bottom.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-actuator-body-bottom",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/OSSM - Actuator - Body - Bottom.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Actuator/OSSM - Actuator - Body - Bottom.stl",
|
||||
"checksum_sha256": "e7abdb99a7e9b9e7408a7b04a7dd50e42cc74510ea2969016a45a2a1387dcde3",
|
||||
"last_checked": "2026-01-07T01:21:02.027595+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-actuator-body-middle",
|
||||
@@ -23,7 +32,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Actuator Body Middle.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Actuator%20-%20Body%20-%20Middle.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Actuator%20-%20Body%20-%20Middle.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-actuator-body-middle",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/OSSM - Actuator - Body - Middle.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Actuator/OSSM - Actuator - Body - Middle.stl",
|
||||
"checksum_sha256": "ce6fb769378636c287af788ce42bdab1f2185dcffba929a0c72598742793b48a",
|
||||
"last_checked": "2026-01-07T01:21:03.531342+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-actuator-body-cover",
|
||||
@@ -34,7 +52,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Actuator Body Cover.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Actuator%20-%20Body%20-%20Cover.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Actuator%20-%20Body%20-%20Cover.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-actuator-body-cover",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/OSSM - Actuator - Body - Cover.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Actuator/OSSM - Actuator - Body - Cover.stl",
|
||||
"checksum_sha256": "bbabc742d2f1753d1b4e21e42c197aec31a4a083b5c634e6e825cec69d4e3258",
|
||||
"last_checked": "2026-01-07T01:21:02.767604+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-belt-tensioner",
|
||||
@@ -45,7 +72,16 @@
|
||||
"colour": "secondary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Belt Tensioner.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Belt%20Tensioner.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%20Belt%20Tensioner.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-belt-tensioner",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/OSSM - Belt Tensioner.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Actuator/OSSM - Belt Tensioner.stl",
|
||||
"checksum_sha256": "31c74250c237763b0013ff42cc714ce14c293382a726de363f1686a7559f525f",
|
||||
"last_checked": "2026-01-07T01:21:05.499523+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-24mm-clamping-thread-belt-clamp",
|
||||
@@ -56,7 +92,16 @@
|
||||
"colour": "secondary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - 24mm Clamping Thread Belt Clamp.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%2024mm%20Clamping%20Thread%20-%20Belt%20Clamp.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%2024mm%20Clamping%20Thread%20-%20Belt%20Clamp.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-24mm-clamping-thread-belt-clamp",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/OSSM - 24mm Clamping Thread - Belt Clamp.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Actuator/OSSM - 24mm Clamping Thread - Belt Clamp.stl",
|
||||
"checksum_sha256": "457a71bc09cb53f12026fd829bec8fa5b04fdead0788822935780f42c90b9a7a",
|
||||
"last_checked": "2026-01-07T01:20:58.945151+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-24mm-clamping-thread-end-effector",
|
||||
@@ -67,7 +112,16 @@
|
||||
"colour": "secondary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - 24mm Clamping Thread End Effector.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%2024mm%20Clamping%20Thread%20-%20End%20Effector.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%2024mm%20Clamping%20Thread%20-%20End%20Effector.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-24mm-clamping-thread-end-effector",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/OSSM - 24mm Clamping Thread - End Effector.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Actuator/OSSM - 24mm Clamping Thread - End Effector.stl",
|
||||
"checksum_sha256": "4860947b201e2e773b295d33bba09423ae40b4adeef3605d62687f2d40277de1",
|
||||
"last_checked": "2026-01-07T01:20:59.854476+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-24mm-nut-5-sided",
|
||||
@@ -78,7 +132,16 @@
|
||||
"colour": "secondary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - 24mm Nut 5 Sided.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%2024mm%20Nut%20-%205%20Sided.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/OSSM%20-%2024mm%20Nut%20-%205%20Sided.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-24mm-nut-5-sided",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/OSSM - 24mm Nut - 5 Sided.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Actuator/OSSM - 24mm Nut - 5 Sided.stl",
|
||||
"checksum_sha256": "38630c70b2fb929bba9a705dabf5bbd7b49ec882963e042b7108dc74284dd6ff",
|
||||
"last_checked": "2026-01-07T01:21:00.555525+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
}
|
||||
],
|
||||
"hardwareParts": [
|
||||
|
||||
@@ -12,7 +12,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Base - PitClamp Mini - Lower V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Lower%20V1.1.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Lower%20V1.1.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-lower",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/OSSM - Base - PitClamp Mini - Lower V1.1.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pitclamp-mini-upper",
|
||||
@@ -23,7 +32,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Base - PitClamp Mini - Upper V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Upper%20V1.1.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Upper%20V1.1.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-upper",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/OSSM - Base - PitClamp Mini - Upper V1.1.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pitclamp-mini-57AIM30",
|
||||
@@ -34,7 +52,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Base - PitClamp Mini - 57AIM30 V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Mounting%20Ring%20-%20PitClamp%20Mini%20-%2057AIM%20V1.1.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Mounting%20Ring%20-%20PitClamp%20Mini%20-%2057AIM%20V1.1.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-57AIM30",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/OSSM - Mounting Ring - PitClamp Mini - 57AIM V1.1.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pitclamp-mini-42AIM30",
|
||||
@@ -45,7 +72,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Base - PitClamp Mini - 42AIM30 V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/Non-standard/OSSM%20-%20Mounting%20Ring%20-%20PitClamp%20Mini%20-%2042AIM%20V1.1.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/Non-standard/OSSM%20-%20Mounting%20Ring%20-%20PitClamp%20Mini%20-%2042AIM%20V1.1.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-42AIM30",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/Non-standard/OSSM - Mounting Ring - PitClamp Mini - 42AIM V1.1.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pitclamp-mini-iHSV57",
|
||||
@@ -56,7 +92,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Base - PitClamp Mini - iHSV57 V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/Non-standard/OSSM%20-%20Mounting%20Ring%20-%20PitClamp%20Mini%20-%20iHSV57.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/Non-standard/OSSM%20-%20Mounting%20Ring%20-%20PitClamp%20Mini%20-%20iHSV57.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-iHSV57",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/Non-standard/OSSM - Mounting Ring - PitClamp Mini - iHSV57.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pitclamp-mini-handle",
|
||||
@@ -67,7 +112,16 @@
|
||||
"colour": "secondary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Handle - PitClamp Mini V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Handle.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Handle.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-handle",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/OSSM - Base - PitClamp Mini - Handle.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pitclamp-mini-dogbone-nuts",
|
||||
@@ -79,7 +133,16 @@
|
||||
"required": true,
|
||||
"quantity": 2,
|
||||
"filePath": "OSSM - Dogbone Nuts - PitClamp Mini V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Dogbone%20Nuts.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Dogbone%20Nuts.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-dogbone-nuts",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/OSSM - Base - PitClamp Mini - Dogbone Nuts.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pitclamp-mini-dogbone-bolts ",
|
||||
@@ -91,7 +154,16 @@
|
||||
"required": true,
|
||||
"quantity": 2,
|
||||
"filePath": "OSSM - Dogbone Bolts - PitClamp Mini V1.1.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Dogbone%20Bolts.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Mounting/OSSM%20-%20Base%20-%20PitClamp%20Mini%20-%20Dogbone%20Bolts.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pitclamp-mini-dogbone-bolts ",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Mounting/OSSM - Base - PitClamp Mini - Dogbone Bolts.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
}
|
||||
],
|
||||
"hardwareParts": [
|
||||
@@ -114,7 +186,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - Actuator Body Middle Pivot.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/Non-standard/OSSM%20-%20Actuator%20-%20Body%20-%20Middle%20Pivot.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Actuator/Non-standard/OSSM%20-%20Actuator%20-%20Body%20-%20Middle%20Pivot.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-actuator-body-middle-pivot",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Actuator/Non-standard/OSSM - Actuator - Body - Middle Pivot.stl",
|
||||
"pinned_sha": "ad39a03b628b8e38549b99036c8dfd4131948545",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/ad39a03b628b8e38549b99036c8dfd4131948545/Printed Parts/Actuator/Non-standard/OSSM - Actuator - Body - Middle Pivot.stl",
|
||||
"checksum_sha256": "f6403a3c53e0d8c8e63d48bf853ab17c9f283421b1665b5503dbb04d59d0f52d",
|
||||
"last_checked": "2026-01-07T01:21:04.528132+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-handle-spacer",
|
||||
@@ -125,7 +206,16 @@
|
||||
"required": true,
|
||||
"quantity": 2,
|
||||
"filePath": "OSSM - Handle Spacer.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Stand/OSSM%20-%20Stand%20-%203030%20Extrusion%20Base%20-%20Handle%20Spacer.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Stand/OSSM%20-%20Stand%20-%203030%20Extrusion%20Base%20-%20Handle%20Spacer.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-handle-spacer",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Stand/OSSM - Stand - 3030 Extrusion Base - Handle Spacer.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
}
|
||||
],
|
||||
"hardwareParts": [
|
||||
|
||||
@@ -12,7 +12,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - PCB - 3030 Mount.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/PCB/OSSM%20-%20PCB%20-%203030%20Mount.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/PCB/OSSM%20-%20PCB%20-%203030%20Mount.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pcb-3030-mount",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/PCB/OSSM - PCB - 3030 Mount.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-pcb-3030-mount-cover",
|
||||
@@ -23,7 +32,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - PCB - 3030 Mount Cover.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/PCB/OSSM%20-%20PCB%20-%203030%20Mount%20Cover.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/PCB/OSSM%20-%20PCB%20-%203030%20Mount%20Cover.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pcb-3030-mount-cover",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/PCB/OSSM - PCB - 3030 Mount Cover.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
}
|
||||
],
|
||||
"hardwareParts": [
|
||||
@@ -58,7 +76,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "OSSM - PCB - AIO Cover Mount.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/PCB/OSSM%20-%20PCB%20-%20AIO%20Cover%20Mount.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/PCB/OSSM%20-%20PCB%20-%20AIO%20Cover%20Mount.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-pcb-aio-cover-mount",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/PCB/OSSM - PCB - AIO Cover Mount.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
}
|
||||
],
|
||||
"hardwareParts": [
|
||||
|
||||
@@ -17,7 +17,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "ossm-remote-body.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/OSSM%20-%20Remote%20-%20Body.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/OSSM%20-%20Remote%20-%20Body.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-remote-body",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Remote/OSSM - Remote - Body.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-remote-top-cover",
|
||||
@@ -28,7 +37,16 @@
|
||||
"colour": "secondary",
|
||||
"required": true,
|
||||
"filePath": "ossm-remote-top-cover.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/OSSM%20-%20Remote%20-%20Top%20Cover.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/OSSM%20-%20Remote%20-%20Top%20Cover.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-remote-top-cover",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Remote/OSSM - Remote - Top Cover.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
}
|
||||
],
|
||||
"knobs": [
|
||||
@@ -41,7 +59,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "ossm-remote-knob.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/OSSM%20-%20Remote%20-%20Knob%20-%20Rounded.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/OSSM%20-%20Remote%20-%20Knob%20-%20Rounded.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-remote-knob",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Remote/OSSM - Remote - Knob - Rounded.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-remote-knob-simple",
|
||||
@@ -52,7 +79,16 @@
|
||||
"colour": "primary",
|
||||
"required": true,
|
||||
"filePath": "ossm-remote-knob-simple.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/tree/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Simple.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/tree/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Simple.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-remote-knob-simple",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Remote/Non-standard/OSSM - Remote - Knob - Simple.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-remote-knob-simple-with-position-indicator",
|
||||
@@ -62,7 +98,16 @@
|
||||
"colour": "primary",
|
||||
"required": false,
|
||||
"filePath": "ossm-remote-knob-simple-with-position-indicator.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Simple%20With%20Position%20Indicator.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Simple%20With%20Position%20Indicator.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-remote-knob-simple-with-position-indicator",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Remote/Non-standard/OSSM - Remote - Knob - Simple With Position Indicator.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-remote-knob-knurled",
|
||||
@@ -72,7 +117,16 @@
|
||||
"colour": "primary",
|
||||
"required": false,
|
||||
"filePath": "ossm-remote-knob-knurled.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Knurled.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Knurled.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-remote-knob-knurled",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Remote/Non-standard/OSSM - Remote - Knob - Knurled.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "ossm-remote-knob-knurled-with-position-indicator",
|
||||
@@ -82,7 +136,16 @@
|
||||
"colour": "primary",
|
||||
"required": false,
|
||||
"filePath": "ossm-remote-knob-knurled-with-position-indicator.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Knurled%20With%20Position%20Indicator.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Remote/Non-standard/OSSM%20-%20Remote%20-%20Knob%20-%20Knurled%20With%20Position%20Indicator.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-remote-knob-knurled-with-position-indicator",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Remote/Non-standard/OSSM - Remote - Knob - Knurled With Position Indicator.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
}
|
||||
],
|
||||
"hardwareParts": [
|
||||
|
||||
@@ -19,7 +19,16 @@
|
||||
"required": true,
|
||||
"filePath": "OSSM - Stand - Pivot Plate.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Stand/OSSM%20-%20Stand%20-%203030%20Extrusion%20Base%20-%20Pivot%20Plate%20Left.stl?raw=true",
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"vendor": {
|
||||
"manifest_id": "pivot-plate",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Stand/OSSM - Stand - 3030 Extrusion Base - Pivot Plate Left.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "pivot-plate-right",
|
||||
@@ -30,7 +39,16 @@
|
||||
"required": true,
|
||||
"filePath": "OSSM - Stand - Pivot Plate.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Stand/OSSM%20-%20Stand%20-%203030%20Extrusion%20Base%20-%20Pivot%20Plate%20Right.stl?raw=true",
|
||||
"quantity": 1
|
||||
"quantity": 1,
|
||||
"vendor": {
|
||||
"manifest_id": "pivot-plate-right",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Stand/OSSM - Stand - 3030 Extrusion Base - Pivot Plate Right.stl",
|
||||
"pinned_sha": null,
|
||||
"pinned_raw_url": null,
|
||||
"checksum_sha256": null,
|
||||
"last_checked": null,
|
||||
"status": "error"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "handle-spacer",
|
||||
@@ -41,7 +59,16 @@
|
||||
"required": true,
|
||||
"filePath": "OSSM - Stand - Pivot Spacer.stl",
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Stand/OSSM%20-%20Stand%20-%203030%20Extrusion%20Base%20-%20Handle%20Spacer.stl?raw=true",
|
||||
"quantity": 8
|
||||
"quantity": 8,
|
||||
"vendor": {
|
||||
"manifest_id": "handle-spacer",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Stand/OSSM - Stand - 3030 Extrusion Base - Handle Spacer.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Stand/OSSM - Stand - 3030 Extrusion Base - Handle Spacer.stl",
|
||||
"checksum_sha256": "55ede7dff60a31d68159b352b5f2c63792b7a0dbe9d543a43681c3e52d229115",
|
||||
"last_checked": "2026-01-07T01:20:58.324330+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
}
|
||||
],
|
||||
"hardwareParts": [
|
||||
@@ -153,7 +180,16 @@
|
||||
"required": true,
|
||||
"filePath": "OSSM - 3030 Cap.stl",
|
||||
"quantity": 6,
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Stand/OSSM%20-%20Stand%20-%203030%20Extrusion%20Base%20-%20Extrusion%20Cap.stl?raw=true"
|
||||
"url": "https://github.com/KinkyMakers/OSSM-hardware/blob/main/Printed%20Parts/Stand/OSSM%20-%20Stand%20-%203030%20Extrusion%20Base%20-%20Extrusion%20Cap.stl?raw=true",
|
||||
"vendor": {
|
||||
"manifest_id": "ossm-3030-cap",
|
||||
"local_path": "vendor/KinkyMakers-OSSM-hardware/Printed Parts/Stand/OSSM - Stand - 3030 Extrusion Base - Extrusion Cap.stl",
|
||||
"pinned_sha": "52537c0896eaef83fd9771dcc633903c7aa6a8ab",
|
||||
"pinned_raw_url": "https://raw.githubusercontent.com/KinkyMakers/OSSM-hardware/52537c0896eaef83fd9771dcc633903c7aa6a8ab/Printed Parts/Stand/OSSM - Stand - 3030 Extrusion Base - Extrusion Cap.stl",
|
||||
"checksum_sha256": "56fa9bb318cdeadc6d1698a1e6cef9371e58b0bc9c7729985bf639d8da2f25da",
|
||||
"last_checked": "2026-01-07T01:21:01.205246+00:00",
|
||||
"status": "up-to-date"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import * as XLSX from 'xlsx';
|
||||
import ExcelJS from 'exceljs';
|
||||
|
||||
// Generate markdown overview
|
||||
export const generateMarkdownOverview = (config, printedParts, hardwareParts, filamentTotals, totalTime, total) => {
|
||||
@@ -183,23 +183,24 @@ export const generateExcelBOM = (hardwareParts, printedParts, config) => {
|
||||
});
|
||||
|
||||
// Create workbook and worksheet
|
||||
const wb = XLSX.utils.book_new();
|
||||
const ws = XLSX.utils.aoa_to_sheet(rows);
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('BOM');
|
||||
|
||||
// Add rows
|
||||
worksheet.addRows(rows);
|
||||
|
||||
// Set column widths
|
||||
ws['!cols'] = [
|
||||
{ wch: 30 }, // Item
|
||||
{ wch: 40 }, // Name
|
||||
{ wch: 10 }, // Quantity
|
||||
{ wch: 12 }, // Price
|
||||
{ wch: 50 }, // Link
|
||||
{ wch: 20 }, // Category
|
||||
{ wch: 15 } // Type
|
||||
worksheet.columns = [
|
||||
{ width: 30 }, // Item
|
||||
{ width: 40 }, // Name
|
||||
{ width: 10 }, // Quantity
|
||||
{ width: 12 }, // Price
|
||||
{ width: 50 }, // Link
|
||||
{ width: 20 }, // Category
|
||||
{ width: 15 } // Type
|
||||
];
|
||||
|
||||
XLSX.utils.book_append_sheet(wb, ws, 'BOM');
|
||||
|
||||
return wb;
|
||||
return workbook;
|
||||
};
|
||||
|
||||
// Generate Excel Print List with completion tracker
|
||||
@@ -252,44 +253,48 @@ export const generateExcelPrintList = (printedParts, filamentTotals) => {
|
||||
rows.push(['TOTAL', '', '', printedParts.length, filamentTotals.total.toFixed(2), '', '', '']);
|
||||
|
||||
// Create workbook and worksheet
|
||||
const wb = XLSX.utils.book_new();
|
||||
const ws = XLSX.utils.aoa_to_sheet(rows);
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Print List');
|
||||
|
||||
// Add rows
|
||||
worksheet.addRows(rows);
|
||||
|
||||
// Set column widths
|
||||
ws['!cols'] = [
|
||||
{ wch: 40 }, // Part Name
|
||||
{ wch: 20 }, // Category
|
||||
{ wch: 12 }, // Color
|
||||
{ wch: 10 }, // Quantity
|
||||
{ wch: 15 }, // Filament
|
||||
{ wch: 15 }, // Print Time
|
||||
{ wch: 15 }, // Status
|
||||
{ wch: 12 } // Completed
|
||||
worksheet.columns = [
|
||||
{ width: 40 }, // Part Name
|
||||
{ width: 20 }, // Category
|
||||
{ width: 12 }, // Color
|
||||
{ width: 10 }, // Quantity
|
||||
{ width: 15 }, // Filament
|
||||
{ width: 15 }, // Print Time
|
||||
{ width: 15 }, // Status
|
||||
{ width: 12 } // Completed
|
||||
];
|
||||
|
||||
XLSX.utils.book_append_sheet(wb, ws, 'Print List');
|
||||
|
||||
// Create a summary sheet with progress calculation
|
||||
// Note: Excel formulas need to reference cells properly
|
||||
const summaryRows = [
|
||||
['Print Progress Summary'],
|
||||
[],
|
||||
['Total Parts', printedParts.length],
|
||||
['Completed Parts', { f: `COUNTIF('Print List'.H:H,"✓")` }],
|
||||
['Progress %', { f: `IF(B3>0, (B4/B3)*100, 0)` }],
|
||||
[],
|
||||
['Filament Summary'],
|
||||
['Total Filament (g)', filamentTotals.total.toFixed(2)],
|
||||
['Primary Color (g)', filamentTotals.primary.toFixed(2)],
|
||||
['Accent Color (g)', (filamentTotals.secondary || 0).toFixed(2)]
|
||||
const summaryWorksheet = workbook.addWorksheet('Summary');
|
||||
|
||||
// Add summary rows
|
||||
summaryWorksheet.getCell('A1').value = 'Print Progress Summary';
|
||||
summaryWorksheet.getCell('A3').value = 'Total Parts';
|
||||
summaryWorksheet.getCell('B3').value = printedParts.length;
|
||||
summaryWorksheet.getCell('A4').value = 'Completed Parts';
|
||||
summaryWorksheet.getCell('B4').formula = `COUNTIF('Print List'.H:H,"✓")`;
|
||||
summaryWorksheet.getCell('A5').value = 'Progress %';
|
||||
summaryWorksheet.getCell('B5').formula = `IF(B3>0, (B4/B3)*100, 0)`;
|
||||
summaryWorksheet.getCell('A7').value = 'Filament Summary';
|
||||
summaryWorksheet.getCell('A8').value = 'Total Filament (g)';
|
||||
summaryWorksheet.getCell('B8').value = filamentTotals.total.toFixed(2);
|
||||
summaryWorksheet.getCell('A9').value = 'Primary Color (g)';
|
||||
summaryWorksheet.getCell('B9').value = filamentTotals.primary.toFixed(2);
|
||||
summaryWorksheet.getCell('A10').value = 'Accent Color (g)';
|
||||
summaryWorksheet.getCell('B10').value = (filamentTotals.secondary || 0).toFixed(2);
|
||||
|
||||
// Set column widths for summary sheet
|
||||
summaryWorksheet.columns = [
|
||||
{ width: 25 },
|
||||
{ width: 15 }
|
||||
];
|
||||
|
||||
const summaryWs = XLSX.utils.aoa_to_sheet(summaryRows);
|
||||
summaryWs['!cols'] = [
|
||||
{ wch: 25 },
|
||||
{ wch: 15 }
|
||||
];
|
||||
XLSX.utils.book_append_sheet(wb, summaryWs, 'Summary');
|
||||
|
||||
return wb;
|
||||
return workbook;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user