49 lines
1.9 KiB
JavaScript
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 };
|
|
})();
|