src/controller/parameters.js
- import { downloadBlob } from "../view/download.js";
- export function importParameters(file) {
- return new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.onload = (e) => {
- try {
- resolve(JSON.parse(e.target.result));
- } catch {
- reject(new Error("Could not parse the JSON file."));
- }
- };
- reader.onerror = () => reject(new Error("Could not read the file."));
- reader.readAsText(file);
- });
- }
- export function exportParameters(parameters) {
- const blob = new Blob([JSON.stringify(parameters, null, 2)], {
- type: "application/json",
- });
- downloadBlob(blob, "parameters.json");
- }
- export async function buildParameters(steps) {
- const schemas = {};
- const parameters = {};
- for (const step of steps) {
- const schema = await step.schema();
- schemas[step.id] = schema;
- parameters[step.id] = {};
- const filled = parameters[step.id];
- for (const param of schema) {
- if (param.type === "checkboxes") {
- for (const cb of param.items) {
- filled[cb.name] = cb.default;
- }
- } else if (param.type !== "nested") {
- filled[param.name] = param.default;
- } else {
- const count = resolveNestedCount(param, schema, parameters);
- filled[param.name] = Array.from({ length: count }, (_, i) =>
- buildNestedItem(param, i),
- );
- }
- }
- }
- return { steps, schemas, parameters };
- }
- function resolveNestedCount(param, schema, parameters) {
- if (param.defaults?.length) {
- return param.defaults.length;
- }
- if (param.counter.includes(".")) {
- const [stepId, paramName] = param.counter.split(".");
- return parameters[stepId]?.[paramName] || 1;
- }
- return schema.find((p) => p.name === param.counter)?.max || 1;
- }
- function buildNestedItem(param, i) {
- const perItem = param.defaults?.[i];
- const item = perItem ? { ...perItem } : {};
- for (const sub of param.template) {
- const fields = sub.type === "checkboxes" ? sub.items : [sub];
- for (const f of fields) {
- item[f.name] = perItem?.[f.name] ?? f.default;
- }
- }
- return item;
- }