Files
Aislo/tools/est-test/native-block-file.js
T

49 lines
1.9 KiB
JavaScript

// 원본 「블럭 파일로 저장하기」(mnuBlockSaveToFile)·「블럭 파일에서 붙여넣기」(mnuLoadFromFile) — 복사·잘라낸 행 묶음을
// 파일(.estblock.json)로 내려받고, 파일을 읽어 복사판에 올린 뒤 현재 화면에 붙여넣는다(같은 종류 자료만).
const EstBlockFile = (() => {
const KIND = "est-web-block-1";
function save() {
const { table, rows } = EstActions.clip();
if (!rows.length) throw Error("먼저 행을 복사하거나 잘라내세요.");
EstApp.download(
`${EstApp.state.project.name || "블럭"}.${table}.estblock.json`,
JSON.stringify({ kind: KIND, table, rows }, null, 1),
);
}
function parse(text) {
const data = JSON.parse(text);
if (data?.kind !== KIND || !Array.isArray(data.rows) || !data.rows.length || !data.table)
throw Error("블럭 파일이 아닙니다.");
if (data.rows.some((r) => !r || typeof r !== "object" || Array.isArray(r)))
throw Error("블럭 파일 행이 올바르지 않습니다.");
return data;
}
function load(state) {
const picker = document.createElement("input");
picker.type = "file";
picker.accept = ".json";
picker.addEventListener("change", async () => {
try {
const file = picker.files[0];
if (!file) return;
const data = parse(await file.text());
if (data.table !== state.view)
throw Error("블럭 파일과 같은 종류의 자료 화면에서 붙여넣으세요.");
EstActions.setClip(data.table, data.rows);
document.querySelector('[data-action="paste-row"]')?.click();
} catch (error) {
state.notice = error.message;
EstApp.render();
}
});
picker.click();
}
function handle(name, state) {
if (name === "block-save-file") save();
else if (name === "block-load-file") load(state);
else return false;
return true;
}
return { parse, handle };
})();