1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-01-20 18:48:28 +02:00
joplin/ElectronClient/gui/ImportScreen.jsx

128 lines
3.4 KiB
React
Raw Normal View History

2017-11-11 17:36:47 +00:00
const React = require('react');
const { connect } = require('react-redux');
2017-12-14 18:12:14 +00:00
const Folder = require('lib/models/Folder.js');
const { themeStyle } = require('lib/theme');
const { _ } = require('lib/locale');
Plugins: Added support for content scripts - For now, supports Markdown-it plugins - Also fixed slow rendering of notes in some cases - Simplified how Markdown-It plugins are created and cleaned MdToHtml code commit 89576de2896c99134f25f2a2db25008514cb1315 Merge: c75aa21f 5292fc14 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:23:00 2020 +0100 Merge branch 'release-1.3' into plugin_content_scripts commit c75aa21ffdc42764d71dc9deadba7a7ef4233995 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:19:52 2020 +0100 Fixed tests commit 075187729d11a16d385b651cbf1ebb89f14935e0 Author: Laurent Cozic <laurent@cozic.net> Date: Wed Oct 21 00:11:53 2020 +0100 Fixed tests commit 14696b8c651e7afdaf71269bcdbadf0d58d3ef8a Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 23:27:58 2020 +0100 Fixed slow rendering of note commit 61c09f5bf856481f91b00cfe87ff05596c63d4bc Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 22:35:21 2020 +0100 Clean up commit 9f7ea7d865a990b3a21cc8c59093390d9db61653 Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 20:05:31 2020 +0100 Updated doc commit 98bf3bde8d6663f2f91ff965304b4aac00bdd98b Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 19:56:34 2020 +0100 Finished converting plugins commit fe90d92e01427bd2b38200393713ea28763507a9 Author: Laurent Cozic <laurent@cozic.net> Date: Tue Oct 20 17:52:02 2020 +0100 Simplified how Markdown-It plugins are created commit 47c7b864cbb864d5df79849f27625aecf312df4b Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 16:40:11 2020 +0100 Clean up rules commit d927a238bb635a4be45f9216d776f7d07cb0a584 Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 14:29:40 2020 +0100 Fixed tests commit 388a56c5dde4c382e3ee0035791137150adaba1b Author: Laurent Cozic <laurent@cozic.net> Date: Mon Oct 19 14:00:47 2020 +0100 Add support for content scripts
2020-10-21 00:23:55 +01:00
const { filename, basename } = require('lib/path-utils');
2017-11-11 17:36:47 +00:00
const { importEnex } = require('lib/import-enex');
class ImportScreenComponent extends React.Component {
UNSAFE_componentWillMount() {
2017-11-11 17:36:47 +00:00
this.setState({
doImport: true,
filePath: this.props.filePath,
messages: [],
});
}
UNSAFE_componentWillReceiveProps(newProps) {
2017-11-11 17:36:47 +00:00
if (newProps.filePath) {
this.setState(
{
doImport: true,
filePath: newProps.filePath,
messages: [],
},
() => {
this.doImport();
}
);
2017-11-11 17:36:47 +00:00
}
}
componentDidMount() {
if (this.state.filePath && this.state.doImport) {
this.doImport();
}
}
addMessage(key, text) {
const messages = this.state.messages.slice();
messages.push({ key: key, text: text });
2017-11-11 17:36:47 +00:00
this.setState({ messages: messages });
}
uniqueMessages() {
const output = [];
const messages = this.state.messages.slice();
const foundKeys = [];
for (let i = messages.length - 1; i >= 0; i--) {
const msg = messages[i];
if (foundKeys.indexOf(msg.key) >= 0) continue;
foundKeys.push(msg.key);
output.unshift(msg);
}
return output;
}
2017-11-11 17:36:47 +00:00
async doImport() {
const filePath = this.props.filePath;
const folderTitle = await Folder.findUniqueItemTitle(filename(filePath));
2017-11-11 17:36:47 +00:00
this.addMessage('start', _('New notebook "%s" will be created and file "%s" will be imported into it', folderTitle, basename(filePath)));
let lastProgress = '';
const options = {
onProgress: progressState => {
const line = [];
2017-11-11 17:36:47 +00:00
line.push(_('Found: %d.', progressState.loaded));
line.push(_('Created: %d.', progressState.created));
if (progressState.updated) line.push(_('Updated: %d.', progressState.updated));
if (progressState.skipped) line.push(_('Skipped: %d.', progressState.skipped));
if (progressState.resourcesCreated) line.push(_('Resources: %d.', progressState.resourcesCreated));
if (progressState.notesTagged) line.push(_('Tagged: %d.', progressState.notesTagged));
lastProgress = line.join(' ');
this.addMessage('progress', lastProgress);
},
onError: error => {
// Don't display the error directly because most of the time it doesn't matter
// (eg. for weird broken HTML, but the note is still imported)
console.warn('When importing ENEX file', error);
2017-11-11 17:36:47 +00:00
},
};
2017-11-11 17:36:47 +00:00
2017-11-11 23:13:14 +00:00
const folder = await Folder.save({ title: folderTitle });
2017-11-11 23:13:14 +00:00
await importEnex(folder.id, filePath, options);
2017-11-11 17:36:47 +00:00
this.addMessage('done', _('The notes have been imported: %s', lastProgress));
this.setState({ doImport: false });
}
render() {
2020-09-15 14:01:07 +01:00
const theme = themeStyle(this.props.themeId);
const messages = this.uniqueMessages();
2017-11-11 17:36:47 +00:00
const messagesStyle = {
padding: 10,
fontSize: theme.fontSize,
fontFamily: theme.fontFamily,
backgroundColor: theme.backgroundColor,
};
const messageComps = [];
for (let i = 0; i < messages.length; i++) {
messageComps.push(<div key={messages[i].key}>{messages[i].text}</div>);
}
return (
<div style={{}}>
<div style={messagesStyle}>{messageComps}</div>
2017-11-11 17:36:47 +00:00
</div>
);
}
}
const mapStateToProps = state => {
2017-11-11 17:36:47 +00:00
return {
2020-09-15 14:01:07 +01:00
themeId: state.settings.theme,
2017-11-11 17:36:47 +00:00
};
};
const ImportScreen = connect(mapStateToProps)(ImportScreenComponent);
module.exports = { ImportScreen };