mirror of https://gitee.com/cf-fz/WebCAD.git
!1975 功能:模板导入导出
parent
0cee6cdd2e
commit
09ad246455
@ -0,0 +1,193 @@
|
||||
import { Button, Intent, ProgressBar } from "@blueprintjs/core";
|
||||
import { observable } from "mobx";
|
||||
import { observer } from "mobx-react";
|
||||
import pako from "pako";
|
||||
import React from "react";
|
||||
import { CADFiler } from "../../../api";
|
||||
import { app } from "../../../ApplicationServices/Application";
|
||||
import { FileSystem } from '../../../Common/FileSystem';
|
||||
import { TemplateUrls } from "../../../Common/HostUrl";
|
||||
import { PostJson } from "../../../Common/Request";
|
||||
import { StoreageKeys } from "../../../Common/StoreageKeys";
|
||||
import { FileServer } from "../../../DatabaseServices/FileServer";
|
||||
import { TopPanelStore } from "../../Store/TopPanelStore";
|
||||
import { AppToaster } from "../Toaster";
|
||||
import { CommonPanel } from "./CommonPanel";
|
||||
|
||||
@observer
|
||||
export class ImportFile extends React.Component<{ commonPanel: CommonPanel, type: "file" | "template"; }>{
|
||||
@observable private _isImporting = false;
|
||||
selectEl = React.createRef<HTMLInputElement>();
|
||||
|
||||
handleImportFile = async (files: FileList) =>
|
||||
{
|
||||
let key = AppToaster.show({
|
||||
message: <ProgressBar
|
||||
className="docs-toast-progress"
|
||||
intent={Intent.PRIMARY}
|
||||
value={0 / files.length}
|
||||
/>
|
||||
});
|
||||
this._isImporting = true;
|
||||
const shopId = TopPanelStore.GetInstance().shopId;
|
||||
const dir_id = this.props.commonPanel['currentDir'].id;
|
||||
|
||||
for (let i = 0, len = files.length; i < len; i++)
|
||||
{
|
||||
let f = files.item(i);
|
||||
if (f.type === "application/json")
|
||||
{
|
||||
let dataStr = await FileSystem.ReadFileAsText(f);
|
||||
|
||||
if (!dataStr)
|
||||
{
|
||||
AppToaster.show({
|
||||
message: f.name + "格式不正确",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
let { type } = JSON.parse(atob(dataStr));
|
||||
if (!type && this.props.type === "file")
|
||||
{
|
||||
let { file, id } = JSON.parse(atob(dataStr));
|
||||
if (!file || !id)
|
||||
{
|
||||
AppToaster.show({
|
||||
message: f.name + "格式不正确",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
}
|
||||
else if (shopId !== id && TopPanelStore.GetInstance().userName !== "cx")
|
||||
{
|
||||
AppToaster.show({
|
||||
message: f.name + "不属于您的店铺,鉴权失败",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
let fserver = FileServer.GetInstance() as FileServer;
|
||||
await fserver.UploadFile({
|
||||
dir_id,
|
||||
name: f.name.replace(".json", ""),
|
||||
file: file
|
||||
});
|
||||
}
|
||||
}
|
||||
else if (type && type === this.props.type)
|
||||
{
|
||||
let { file, id, logo, props } = JSON.parse(atob(dataStr));
|
||||
if (!file || !id || !logo || !props)
|
||||
{
|
||||
AppToaster.show({
|
||||
message: f.name + "格式不正确",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
}
|
||||
else if (shopId !== id && TopPanelStore.GetInstance().userName !== "cx")
|
||||
{
|
||||
AppToaster.show({
|
||||
message: f.name + "不属于您的店铺,鉴权失败",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
await PostJson(TemplateUrls.create, {
|
||||
name: f.name.replace(".json", ""),
|
||||
dir_id,
|
||||
logo,
|
||||
props,
|
||||
file,
|
||||
zip_type: "gzip",
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AppToaster.show({
|
||||
message: f.name + "格式不正确",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
}
|
||||
} catch (err)
|
||||
{
|
||||
AppToaster.show({
|
||||
message: f.name + "格式不正确",
|
||||
timeout: 3000,
|
||||
intent: Intent.DANGER
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
let userName = localStorage.getItem(StoreageKeys.UserName);
|
||||
if (userName === "cx")
|
||||
{
|
||||
let file = pako.inflate(new Uint8Array(await f.arrayBuffer()), { to: "string" });
|
||||
app.OpenFile(new CADFiler(JSON.parse(file)));
|
||||
}
|
||||
return;
|
||||
}
|
||||
catch (error)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
AppToaster.show({
|
||||
message: <ProgressBar
|
||||
stripes={i < len - 1}
|
||||
className="docs-toast-progress"
|
||||
intent={i === len - 1 ? Intent.SUCCESS : Intent.PRIMARY}
|
||||
value={(i + 1) / files.length}
|
||||
/>,
|
||||
timeout: i === len - 1 ? 500 : 0
|
||||
}, key);
|
||||
}
|
||||
await this.props.commonPanel.handleGetData();
|
||||
this._isImporting = false;
|
||||
this.selectEl.current.value = "";
|
||||
};
|
||||
|
||||
render()
|
||||
{
|
||||
return (
|
||||
<>
|
||||
<Button
|
||||
disabled={this._isImporting}
|
||||
icon="cloud-upload"
|
||||
style={{ marginRight: 10 }}
|
||||
text="导入"
|
||||
intent={Intent.SUCCESS}
|
||||
onClick={() =>
|
||||
{
|
||||
if (this.selectEl.current)
|
||||
this.selectEl.current.click();
|
||||
}}
|
||||
/>
|
||||
<input
|
||||
ref={this.selectEl}
|
||||
type="file"
|
||||
style={{ display: "none" }}
|
||||
multiple={true}
|
||||
accept=".json,.cad"
|
||||
onChange={(e) => this.handleImportFile(e.target.files)}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in new issue