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:
2026-01-07 02:12:12 +00:00
parent 4bc0fd203f
commit 97d2b66f02
33 changed files with 4394 additions and 1088 deletions

View File

@@ -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

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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"
}
}
]
},

View File

@@ -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;
};