forked from enviPath/enviPy
Current Dev State
This commit is contained in:
109
static/js/ketcher2/script/ui/component/openbutton.jsx
Normal file
109
static/js/ketcher2/script/ui/component/openbutton.jsx
Normal file
@ -0,0 +1,109 @@
|
||||
/****************************************************************************
|
||||
* Copyright 2017 EPAM Systems
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
***************************************************************************/
|
||||
|
||||
import { h, Component } from 'preact';
|
||||
/** @jsx h */
|
||||
|
||||
class OpenButton extends Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
if (props.server) {
|
||||
fileOpener(props.server).then(opener => {
|
||||
this.setState({opener});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
open(ev) {
|
||||
const files = ev.target.files;
|
||||
const noop = () => null;
|
||||
const { onLoad = noop, onError = noop } = this.props;
|
||||
|
||||
if (this.state.opener && files.length) {
|
||||
this.state.opener(files[0]).then(onLoad, onError);
|
||||
} else if (files.length)
|
||||
onLoad(files[0]);
|
||||
ev.target.value = null;
|
||||
ev.preventDefault();
|
||||
}
|
||||
|
||||
render() {
|
||||
const { children, type, ...props } = this.props;
|
||||
|
||||
return (
|
||||
<div { ...props }>
|
||||
<input id="input-file" onChange={ ev => this.open(ev) }
|
||||
accept={ type } type="file"/>
|
||||
<label for="input-file">
|
||||
{ children }
|
||||
</label>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function fileOpener (server) {
|
||||
return new Promise((resolve, reject) => {
|
||||
// TODO: refactor return
|
||||
if (global.FileReader)
|
||||
resolve(throughFileReader);
|
||||
|
||||
else if (global.ActiveXObject) {
|
||||
try {
|
||||
const fso = new ActiveXObject('Scripting.FileSystemObject');
|
||||
resolve(file => Promise.resolve(throughFileSystemObject(fso, file)));
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
}
|
||||
} else if (server) {
|
||||
resolve(server.then(() => {
|
||||
throw "Server doesn't still support echo method";
|
||||
//return resolve(throughForm2IframePosting);
|
||||
}));
|
||||
} else
|
||||
reject(new Error("Your browser does not support " +
|
||||
"opening files locally"));
|
||||
});
|
||||
}
|
||||
|
||||
function throughFileReader(file) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const rd = new FileReader();
|
||||
|
||||
rd.onload = () => {
|
||||
const content = rd.result;
|
||||
if (file.msClose)
|
||||
file.msClose();
|
||||
resolve(content);
|
||||
};
|
||||
|
||||
rd.onerror = event => {
|
||||
reject(event);
|
||||
};
|
||||
|
||||
rd.readAsText(file, 'UTF-8');
|
||||
});
|
||||
}
|
||||
|
||||
function throughFileSystemObject(fso, file) {
|
||||
// IE9 and below
|
||||
const fd = fso.OpenTextFile(file.name, 1),
|
||||
content = fd.ReadAll();
|
||||
fd.Close();
|
||||
return content;
|
||||
}
|
||||
|
||||
export default OpenButton;
|
||||
Reference in New Issue
Block a user