1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-21 09:38:01 +02:00

Chore: Desktop: Convert last JSX files to TSX

This commit is contained in:
Laurent Cozic 2023-01-19 17:19:06 +00:00
parent ff79ca8781
commit 27bec674a0
32 changed files with 468 additions and 1111 deletions

View File

@ -142,7 +142,12 @@ packages/app-desktop/gui/EditFolderDialog/IconSelector.js
packages/app-desktop/gui/EmojiBox.js packages/app-desktop/gui/EmojiBox.js
packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.js packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.js
packages/app-desktop/gui/ErrorBoundary.js packages/app-desktop/gui/ErrorBoundary.js
packages/app-desktop/gui/ExtensionBadge.js
packages/app-desktop/gui/FolderIconBox.js packages/app-desktop/gui/FolderIconBox.js
packages/app-desktop/gui/HelpButton.js
packages/app-desktop/gui/IconButton.js
packages/app-desktop/gui/ImportScreen.js
packages/app-desktop/gui/ItemList.js
packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js
packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js
packages/app-desktop/gui/KeymapConfig/styles/index.js packages/app-desktop/gui/KeymapConfig/styles/index.js
@ -193,6 +198,7 @@ packages/app-desktop/gui/MainScreen/commands/toggleVisiblePanes.js
packages/app-desktop/gui/MasterPasswordDialog/Dialog.js packages/app-desktop/gui/MasterPasswordDialog/Dialog.js
packages/app-desktop/gui/MenuBar.js packages/app-desktop/gui/MenuBar.js
packages/app-desktop/gui/MultiNoteActions.js packages/app-desktop/gui/MultiNoteActions.js
packages/app-desktop/gui/Navigator.js
packages/app-desktop/gui/NoteContentPropertiesDialog.js packages/app-desktop/gui/NoteContentPropertiesDialog.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Editor.js packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Editor.js
@ -252,6 +258,10 @@ packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
packages/app-desktop/gui/NoteListControls/commands/index.js packages/app-desktop/gui/NoteListControls/commands/index.js
packages/app-desktop/gui/NoteListItem.js packages/app-desktop/gui/NoteListItem.js
packages/app-desktop/gui/NoteListWrapper/NoteListWrapper.js packages/app-desktop/gui/NoteListWrapper/NoteListWrapper.js
packages/app-desktop/gui/NotePropertiesDialog.js
packages/app-desktop/gui/NoteRevisionViewer.js
packages/app-desktop/gui/NoteSearchBar.js
packages/app-desktop/gui/NoteStatusBar.js
packages/app-desktop/gui/NoteTextViewer.js packages/app-desktop/gui/NoteTextViewer.js
packages/app-desktop/gui/NoteToolbar/NoteToolbar.js packages/app-desktop/gui/NoteToolbar/NoteToolbar.js
packages/app-desktop/gui/OneDriveLoginScreen.js packages/app-desktop/gui/OneDriveLoginScreen.js
@ -290,12 +300,14 @@ packages/app-desktop/gui/Sidebar/styles/index.js
packages/app-desktop/gui/StatusScreen/StatusScreen.js packages/app-desktop/gui/StatusScreen/StatusScreen.js
packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js
packages/app-desktop/gui/SyncWizard/Dialog.js packages/app-desktop/gui/SyncWizard/Dialog.js
packages/app-desktop/gui/TagItem.js
packages/app-desktop/gui/TagList.js packages/app-desktop/gui/TagList.js
packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js
packages/app-desktop/gui/ToggleEditorsButton/styles/index.js packages/app-desktop/gui/ToggleEditorsButton/styles/index.js
packages/app-desktop/gui/ToolbarBase.js packages/app-desktop/gui/ToolbarBase.js
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
packages/app-desktop/gui/ToolbarButton/styles/index.js packages/app-desktop/gui/ToolbarButton/styles/index.js
packages/app-desktop/gui/ToolbarSpace.js
packages/app-desktop/gui/dialogs.js packages/app-desktop/gui/dialogs.js
packages/app-desktop/gui/hooks/useEffectDebugger.js packages/app-desktop/gui/hooks/useEffectDebugger.js
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js

12
.gitignore vendored
View File

@ -130,7 +130,12 @@ packages/app-desktop/gui/EditFolderDialog/IconSelector.js
packages/app-desktop/gui/EmojiBox.js packages/app-desktop/gui/EmojiBox.js
packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.js packages/app-desktop/gui/EncryptionConfigScreen/EncryptionConfigScreen.js
packages/app-desktop/gui/ErrorBoundary.js packages/app-desktop/gui/ErrorBoundary.js
packages/app-desktop/gui/ExtensionBadge.js
packages/app-desktop/gui/FolderIconBox.js packages/app-desktop/gui/FolderIconBox.js
packages/app-desktop/gui/HelpButton.js
packages/app-desktop/gui/IconButton.js
packages/app-desktop/gui/ImportScreen.js
packages/app-desktop/gui/ItemList.js
packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js packages/app-desktop/gui/KeymapConfig/KeymapConfigScreen.js
packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js packages/app-desktop/gui/KeymapConfig/ShortcutRecorder.js
packages/app-desktop/gui/KeymapConfig/styles/index.js packages/app-desktop/gui/KeymapConfig/styles/index.js
@ -181,6 +186,7 @@ packages/app-desktop/gui/MainScreen/commands/toggleVisiblePanes.js
packages/app-desktop/gui/MasterPasswordDialog/Dialog.js packages/app-desktop/gui/MasterPasswordDialog/Dialog.js
packages/app-desktop/gui/MenuBar.js packages/app-desktop/gui/MenuBar.js
packages/app-desktop/gui/MultiNoteActions.js packages/app-desktop/gui/MultiNoteActions.js
packages/app-desktop/gui/Navigator.js
packages/app-desktop/gui/NoteContentPropertiesDialog.js packages/app-desktop/gui/NoteContentPropertiesDialog.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/CodeMirror.js
packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Editor.js packages/app-desktop/gui/NoteEditor/NoteBody/CodeMirror/Editor.js
@ -240,6 +246,10 @@ packages/app-desktop/gui/NoteListControls/commands/focusSearch.js
packages/app-desktop/gui/NoteListControls/commands/index.js packages/app-desktop/gui/NoteListControls/commands/index.js
packages/app-desktop/gui/NoteListItem.js packages/app-desktop/gui/NoteListItem.js
packages/app-desktop/gui/NoteListWrapper/NoteListWrapper.js packages/app-desktop/gui/NoteListWrapper/NoteListWrapper.js
packages/app-desktop/gui/NotePropertiesDialog.js
packages/app-desktop/gui/NoteRevisionViewer.js
packages/app-desktop/gui/NoteSearchBar.js
packages/app-desktop/gui/NoteStatusBar.js
packages/app-desktop/gui/NoteTextViewer.js packages/app-desktop/gui/NoteTextViewer.js
packages/app-desktop/gui/NoteToolbar/NoteToolbar.js packages/app-desktop/gui/NoteToolbar/NoteToolbar.js
packages/app-desktop/gui/OneDriveLoginScreen.js packages/app-desktop/gui/OneDriveLoginScreen.js
@ -278,12 +288,14 @@ packages/app-desktop/gui/Sidebar/styles/index.js
packages/app-desktop/gui/StatusScreen/StatusScreen.js packages/app-desktop/gui/StatusScreen/StatusScreen.js
packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js packages/app-desktop/gui/StyleSheets/StyleSheetContainer.js
packages/app-desktop/gui/SyncWizard/Dialog.js packages/app-desktop/gui/SyncWizard/Dialog.js
packages/app-desktop/gui/TagItem.js
packages/app-desktop/gui/TagList.js packages/app-desktop/gui/TagList.js
packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js packages/app-desktop/gui/ToggleEditorsButton/ToggleEditorsButton.js
packages/app-desktop/gui/ToggleEditorsButton/styles/index.js packages/app-desktop/gui/ToggleEditorsButton/styles/index.js
packages/app-desktop/gui/ToolbarBase.js packages/app-desktop/gui/ToolbarBase.js
packages/app-desktop/gui/ToolbarButton/ToolbarButton.js packages/app-desktop/gui/ToolbarButton/ToolbarButton.js
packages/app-desktop/gui/ToolbarButton/styles/index.js packages/app-desktop/gui/ToolbarButton/styles/index.js
packages/app-desktop/gui/ToolbarSpace.js
packages/app-desktop/gui/dialogs.js packages/app-desktop/gui/dialogs.js
packages/app-desktop/gui/hooks/useEffectDebugger.js packages/app-desktop/gui/hooks/useEffectDebugger.js
packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js packages/app-desktop/gui/hooks/useImperativeHandlerDebugger.js

View File

@ -1,7 +1,7 @@
const React = require('react'); const React = require('react');
const { connect } = require('react-redux'); const { connect } = require('react-redux');
const { clipboard } = require('electron'); const { clipboard } = require('electron');
const ExtensionBadge = require('./ExtensionBadge.min'); import ExtensionBadge from './ExtensionBadge';
import bridge from '../services/bridge'; import bridge from '../services/bridge';
import { themeStyle } from '@joplin/lib/theme'; import { themeStyle } from '@joplin/lib/theme';
import { _ } from '@joplin/lib/locale'; import { _ } from '@joplin/lib/locale';

View File

@ -1,45 +0,0 @@
const React = require('react');
const bridge = require('@electron/remote').require('./bridge').default;
const styleSelector = require('./style/ExtensionBadge');
const { _ } = require('@joplin/lib/locale');
function platformAssets(type) {
if (type === 'firefox') {
return {
logoImage: `${bridge().buildDir()}/images/firefox-logo.svg`,
locationLabel: _('Firefox Extension'),
};
}
if (type === 'chrome') {
return {
logoImage: `${bridge().buildDir()}/images/chrome-logo.svg`,
locationLabel: _('Chrome Web Store'),
};
}
throw new Error(`Invalid type:${type}`);
}
function ExtensionBadge(props) {
const style = styleSelector(null, props);
const assets = platformAssets(props.type);
const onClick = () => {
bridge().openExternal(props.url);
};
const rootStyle = props.style ? Object.assign({}, style.root, props.style) : style.root;
return (
<a style={rootStyle} onClick={onClick} href="#">
<img style={style.logo} src={assets.logoImage}/>
<div style={style.labelGroup} >
<div>{_('Get it now:')}</div>
<div style={style.locationLabel}>{assets.locationLabel}</div>
</div>
</a>
);
}
module.exports = ExtensionBadge;

View File

@ -0,0 +1,98 @@
import * as React from 'react';
import bridge from '../services/bridge';
import { _ } from '@joplin/lib/locale';
import { themeStyle } from '@joplin/lib/theme';
const { createSelector } = require('reselect');
interface Props {
themeId: number;
type: string;
url: string;
style?: any;
}
const themeSelector = (_state: any, props: any) => themeStyle(props.themeId);
const styleSelector = createSelector(
themeSelector,
(theme: any) => {
const output = {
root: {
width: 220,
height: 60,
borderRadius: 4,
border: '1px solid',
borderColor: theme.dividerColor,
backgroundColor: theme.backgroundColor,
paddingLeft: 14,
paddingRight: 14,
paddingTop: 8,
paddingBottom: 8,
boxSizing: 'border-box',
display: 'flex',
flexDirection: 'row',
boxShadow: '0px 1px 1px rgba(0,0,0,0.3)',
},
logo: {
width: 42,
height: 42,
},
labelGroup: {
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
marginLeft: 14,
fontFamily: theme.fontFamily,
color: theme.color,
fontSize: theme.fontSize,
},
locationLabel: {
fontSize: theme.fontSize * 1.2,
fontWeight: 'bold',
},
};
return output;
}
);
function platformAssets(type: string) {
if (type === 'firefox') {
return {
logoImage: `${bridge().buildDir()}/images/firefox-logo.svg`,
locationLabel: _('Firefox Extension'),
};
}
if (type === 'chrome') {
return {
logoImage: `${bridge().buildDir()}/images/chrome-logo.svg`,
locationLabel: _('Chrome Web Store'),
};
}
throw new Error(`Invalid type:${type}`);
}
function ExtensionBadge(props: Props) {
const style = styleSelector(null, props);
const assets = platformAssets(props.type);
const onClick = () => {
void bridge().openExternal(props.url);
};
const rootStyle = props.style ? Object.assign({}, style.root, props.style) : style.root;
return (
<a style={rootStyle} onClick={onClick} href="#">
<img style={style.logo} src={assets.logoImage}/>
<div style={style.labelGroup} >
<div>{_('Get it now:')}</div>
<div style={style.locationLabel}>{assets.locationLabel}</div>
</div>
</a>
);
}
export default ExtensionBadge;

View File

@ -1,10 +1,18 @@
const React = require('react'); import * as React from 'react';
const { connect } = require('react-redux'); const { connect } = require('react-redux');
const { themeStyle } = require('@joplin/lib/theme'); import { themeStyle } from '@joplin/lib/theme';
import { AppState } from '../app.reducer';
class HelpButtonComponent extends React.Component { interface Props {
constructor() { tip: string;
super(); onClick: Function;
themeId: number;
style: any;
}
class HelpButtonComponent extends React.Component<Props> {
constructor(props: Props) {
super(props);
this.onClick = this.onClick.bind(this); this.onClick = this.onClick.bind(this);
} }
@ -17,7 +25,7 @@ class HelpButtonComponent extends React.Component {
const theme = themeStyle(this.props.themeId); const theme = themeStyle(this.props.themeId);
const style = Object.assign({}, this.props.style, { color: theme.color, textDecoration: 'none' }); const style = Object.assign({}, this.props.style, { color: theme.color, textDecoration: 'none' });
const helpIconStyle = { flex: 0, width: 16, height: 16, marginLeft: 10 }; const helpIconStyle = { flex: 0, width: 16, height: 16, marginLeft: 10 };
const extraProps = {}; const extraProps: any = {};
if (this.props.tip) extraProps['data-tip'] = this.props.tip; if (this.props.tip) extraProps['data-tip'] = this.props.tip;
return ( return (
<a href="#" style={style} onClick={this.onClick} {...extraProps}> <a href="#" style={style} onClick={this.onClick} {...extraProps}>
@ -27,7 +35,7 @@ class HelpButtonComponent extends React.Component {
} }
} }
const mapStateToProps = state => { const mapStateToProps = (state: AppState) => {
return { return {
themeId: state.settings.theme, themeId: state.settings.theme,
}; };
@ -35,4 +43,4 @@ const mapStateToProps = state => {
const HelpButton = connect(mapStateToProps)(HelpButtonComponent); const HelpButton = connect(mapStateToProps)(HelpButtonComponent);
module.exports = HelpButton; export default HelpButton;

View File

@ -1,7 +1,14 @@
const React = require('react'); import * as React from 'react';
const { themeStyle } = require('@joplin/lib/theme'); import { themeStyle } from '@joplin/lib/theme';
class IconButton extends React.Component { interface Props {
themeId: number;
style: any;
iconName: string;
onClick: Function;
}
class IconButton extends React.Component<Props> {
render() { render() {
const style = this.props.style; const style = this.props.style;
const theme = themeStyle(this.props.themeId); const theme = themeStyle(this.props.themeId);
@ -42,4 +49,4 @@ class IconButton extends React.Component {
} }
} }
module.exports = { IconButton }; export default IconButton;

View File

@ -1,12 +1,29 @@
const React = require('react'); import * as React from 'react';
import Folder from '@joplin/lib/models/Folder';
import { themeStyle } from '@joplin/lib/theme';
import { _ } from '@joplin/lib/locale';
import { filename, basename } from '@joplin/lib/path-utils';
import importEnex from '@joplin/lib/import-enex';
import { AppState } from '../app.reducer';
const { connect } = require('react-redux'); const { connect } = require('react-redux');
const Folder = require('@joplin/lib/models/Folder').default;
const { themeStyle } = require('@joplin/lib/theme');
const { _ } = require('@joplin/lib/locale');
const { filename, basename } = require('@joplin/lib/path-utils');
const importEnex = require('@joplin/lib/import-enex').default;
class ImportScreenComponent extends React.Component { interface Props {
filePath: string;
themeId: number;
}
interface Message {
key: string;
text: string;
}
interface State {
filePath: string;
doImport: boolean;
messages: Message[];
}
class ImportScreenComponent extends React.Component<Props, State> {
UNSAFE_componentWillMount() { UNSAFE_componentWillMount() {
this.setState({ this.setState({
doImport: true, doImport: true,
@ -15,7 +32,7 @@ class ImportScreenComponent extends React.Component {
}); });
} }
UNSAFE_componentWillReceiveProps(newProps) { UNSAFE_componentWillReceiveProps(newProps: Props) {
if (newProps.filePath) { if (newProps.filePath) {
this.setState( this.setState(
{ {
@ -24,7 +41,7 @@ class ImportScreenComponent extends React.Component {
messages: [], messages: [],
}, },
() => { () => {
this.doImport(); void this.doImport();
} }
); );
} }
@ -32,11 +49,11 @@ class ImportScreenComponent extends React.Component {
componentDidMount() { componentDidMount() {
if (this.state.filePath && this.state.doImport) { if (this.state.filePath && this.state.doImport) {
this.doImport(); void this.doImport();
} }
} }
addMessage(key, text) { addMessage(key: string, text: string) {
const messages = this.state.messages.slice(); const messages = this.state.messages.slice();
messages.push({ key: key, text: text }); messages.push({ key: key, text: text });
@ -66,7 +83,7 @@ class ImportScreenComponent extends React.Component {
let lastProgress = ''; let lastProgress = '';
const options = { const options = {
onProgress: progressState => { onProgress: (progressState: any) => {
const line = []; const line = [];
line.push(_('Found: %d.', progressState.loaded)); line.push(_('Found: %d.', progressState.loaded));
line.push(_('Created: %d.', progressState.created)); line.push(_('Created: %d.', progressState.created));
@ -77,7 +94,7 @@ class ImportScreenComponent extends React.Component {
lastProgress = line.join(' '); lastProgress = line.join(' ');
this.addMessage('progress', lastProgress); this.addMessage('progress', lastProgress);
}, },
onError: error => { onError: (error: any) => {
// Don't display the error directly because most of the time it doesn't matter // 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) // (eg. for weird broken HTML, but the note is still imported)
console.warn('When importing ENEX file', error); console.warn('When importing ENEX file', error);
@ -116,7 +133,7 @@ class ImportScreenComponent extends React.Component {
} }
} }
const mapStateToProps = state => { const mapStateToProps = (state: AppState) => {
return { return {
themeId: state.settings.theme, themeId: state.settings.theme,
}; };
@ -124,4 +141,5 @@ const mapStateToProps = state => {
const ImportScreen = connect(mapStateToProps)(ImportScreenComponent); const ImportScreen = connect(mapStateToProps)(ImportScreenComponent);
module.exports = { ImportScreen }; export default ImportScreen;

View File

@ -1,8 +1,27 @@
const React = require('react'); import * as React from 'react';
class ItemList extends React.Component { interface Props {
constructor() { style: any;
super(); itemHeight: number;
items: any[];
disabled: boolean;
onKeyDown: Function;
itemRenderer: Function;
className: string;
}
interface State {
topItemIndex: number;
bottomItemIndex: number;
}
class ItemList extends React.Component<Props, State> {
private scrollTop_: number;
private listRef: any;
constructor(props: Props) {
super(props);
this.scrollTop_ = 0; this.scrollTop_ = 0;
@ -12,12 +31,12 @@ class ItemList extends React.Component {
this.onKeyDown = this.onKeyDown.bind(this); this.onKeyDown = this.onKeyDown.bind(this);
} }
visibleItemCount(props) { visibleItemCount(props: Props = undefined) {
if (typeof props === 'undefined') props = this.props; if (typeof props === 'undefined') props = this.props;
return Math.ceil(props.style.height / props.itemHeight); return Math.ceil(props.style.height / props.itemHeight);
} }
updateStateItemIndexes(props) { updateStateItemIndexes(props: Props = undefined) {
if (typeof props === 'undefined') props = this.props; if (typeof props === 'undefined') props = this.props;
const topItemIndex = Math.floor(this.scrollTop_ / props.itemHeight); const topItemIndex = Math.floor(this.scrollTop_ / props.itemHeight);
@ -44,20 +63,20 @@ class ItemList extends React.Component {
this.updateStateItemIndexes(); this.updateStateItemIndexes();
} }
UNSAFE_componentWillReceiveProps(newProps) { UNSAFE_componentWillReceiveProps(newProps: Props) {
this.updateStateItemIndexes(newProps); this.updateStateItemIndexes(newProps);
} }
onScroll(event) { onScroll(event: any) {
this.scrollTop_ = event.target.scrollTop; this.scrollTop_ = event.target.scrollTop;
this.updateStateItemIndexes(); this.updateStateItemIndexes();
} }
onKeyDown(event) { onKeyDown(event: any) {
if (this.props.onKeyDown) this.props.onKeyDown(event); if (this.props.onKeyDown) this.props.onKeyDown(event);
} }
makeItemIndexVisible(itemIndex) { makeItemIndexVisible(itemIndex: number) {
const top = Math.min(this.props.items.length - 1, this.state.topItemIndex); const top = Math.min(this.props.items.length - 1, this.state.topItemIndex);
const bottom = Math.max(0, this.state.bottomItemIndex); const bottom = Math.max(0, this.state.bottomItemIndex);
@ -105,7 +124,7 @@ class ItemList extends React.Component {
if (!this.props.itemHeight) throw new Error('itemHeight is required'); if (!this.props.itemHeight) throw new Error('itemHeight is required');
const blankItem = function(key, height) { const blankItem = function(key: string, height: number) {
return <div key={key} style={{ height: height }}></div>; return <div key={key} style={{ height: height }}></div>;
}; };
@ -129,4 +148,4 @@ class ItemList extends React.Component {
} }
} }
module.exports = { ItemList }; export default ItemList;

View File

@ -43,7 +43,7 @@ import invitationRespond from '../../services/share/invitationRespond';
import restart from '../../services/restart'; import restart from '../../services/restart';
const { connect } = require('react-redux'); const { connect } = require('react-redux');
import PromptDialog from '../PromptDialog'; import PromptDialog from '../PromptDialog';
const NotePropertiesDialog = require('../NotePropertiesDialog.min.js'); import NotePropertiesDialog from '../NotePropertiesDialog';
const PluginManager = require('@joplin/lib/services/PluginManager'); const PluginManager = require('@joplin/lib/services/PluginManager');
const ipcRenderer = require('electron').ipcRenderer; const ipcRenderer = require('electron').ipcRenderer;

View File

@ -1,11 +1,15 @@
const React = require('react'); const React = require('react');
const Component = React.Component;
const Setting = require('@joplin/lib/models/Setting').default;
const { connect } = require('react-redux'); const { connect } = require('react-redux');
import Setting from '@joplin/lib/models/Setting';
import { AppState } from '../app.reducer';
const bridge = require('@electron/remote').require('./bridge').default; const bridge = require('@electron/remote').require('./bridge').default;
class NavigatorComponent extends Component { interface Props {
UNSAFE_componentWillReceiveProps(newProps) { route: any;
}
class NavigatorComponent extends React.Component<Props> {
UNSAFE_componentWillReceiveProps(newProps: Props) {
if (newProps.route) { if (newProps.route) {
const screenInfo = this.props.screens[newProps.route.routeName]; const screenInfo = this.props.screens[newProps.route.routeName];
const devMarker = Setting.value('env') === 'dev' ? ` (DEV - ${Setting.value('profileDir')})` : ''; const devMarker = Setting.value('env') === 'dev' ? ` (DEV - ${Setting.value('profileDir')})` : '';
@ -17,7 +21,7 @@ class NavigatorComponent extends Component {
} }
} }
updateWindowTitle(title) { updateWindowTitle(title: string) {
try { try {
if (bridge().window()) bridge().window().setTitle(title); if (bridge().window()) bridge().window().setTitle(title);
} catch (error) { } catch (error) {
@ -46,10 +50,10 @@ class NavigatorComponent extends Component {
} }
} }
const Navigator = connect(state => { const Navigator = connect((state: AppState) => {
return { return {
route: state.route, route: state.route,
}; };
})(NavigatorComponent); })(NavigatorComponent);
module.exports = { Navigator }; export default Navigator;

View File

@ -882,6 +882,7 @@ function CodeMirror(props: NoteBodyEditorProps, ref: any) {
<div style={cellViewerStyle}> <div style={cellViewerStyle}>
<NoteTextViewer <NoteTextViewer
ref={webviewRef} ref={webviewRef}
themeId={props.themeId}
viewerStyle={styles.viewer} viewerStyle={styles.viewer}
onIpcMessage={webview_ipcMessage} onIpcMessage={webview_ipcMessage}
onDomReady={webview_domReady} onDomReady={webview_domReady}

View File

@ -34,12 +34,12 @@ import ExternalEditWatcher from '@joplin/lib/services/ExternalEditWatcher';
const { themeStyle } = require('@joplin/lib/theme'); const { themeStyle } = require('@joplin/lib/theme');
const { substrWithEllipsis } = require('@joplin/lib/string-utils'); const { substrWithEllipsis } = require('@joplin/lib/string-utils');
const NoteSearchBar = require('../NoteSearchBar.min.js'); import NoteSearchBar from '../NoteSearchBar';
import { reg } from '@joplin/lib/registry'; import { reg } from '@joplin/lib/registry';
import Note from '@joplin/lib/models/Note'; import Note from '@joplin/lib/models/Note';
import Folder from '@joplin/lib/models/Folder'; import Folder from '@joplin/lib/models/Folder';
const bridge = require('@electron/remote').require('./bridge').default; const bridge = require('@electron/remote').require('./bridge').default;
const NoteRevisionViewer = require('../NoteRevisionViewer.min'); import NoteRevisionViewer from '../NoteRevisionViewer';
const commands = [ const commands = [
require('./commands/showRevisions'), require('./commands/showRevisions'),

View File

@ -13,7 +13,7 @@ import CommandService from '@joplin/lib/services/CommandService';
import shim from '@joplin/lib/shim'; import shim from '@joplin/lib/shim';
import styled from 'styled-components'; import styled from 'styled-components';
import { themeStyle } from '@joplin/lib/theme'; import { themeStyle } from '@joplin/lib/theme';
const { ItemList } = require('../ItemList.min.js'); import ItemList from '../ItemList';
const { connect } = require('react-redux'); const { connect } = require('react-redux');
import Note from '@joplin/lib/models/Note'; import Note from '@joplin/lib/models/Note';
import Folder from '@joplin/lib/models/Folder'; import Folder from '@joplin/lib/models/Folder';

View File

@ -1,18 +1,38 @@
const React = require('react'); import * as React from 'react';
const { _ } = require('@joplin/lib/locale'); import { _ } from '@joplin/lib/locale';
const { themeStyle } = require('@joplin/lib/theme'); import { themeStyle } from '@joplin/lib/theme';
const time = require('@joplin/lib/time').default; import time from '@joplin/lib/time';
const DialogButtonRow = require('./DialogButtonRow').default; import DialogButtonRow from './DialogButtonRow';
import Note from '@joplin/lib/models/Note';
import bridge from '../services/bridge';
import shim from '@joplin/lib/shim';
import { NoteEntity } from '@joplin/lib/services/database/types';
const Datetime = require('react-datetime').default; const Datetime = require('react-datetime').default;
const Note = require('@joplin/lib/models/Note').default;
const formatcoords = require('formatcoords');
const bridge = require('@electron/remote').require('./bridge').default;
const shim = require('@joplin/lib/shim').default;
const { clipboard } = require('electron'); const { clipboard } = require('electron');
const formatcoords = require('formatcoords');
class NotePropertiesDialog extends React.Component { interface Props {
constructor() { noteId: string;
super(); onClose: Function;
onRevisionLinkClick: Function;
themeId: number;
}
interface State {
editedKey: string;
formNote: any;
editedValue: any;
}
class NotePropertiesDialog extends React.Component<Props, State> {
private okButton: any;
private keyToLabel_: Record<string, string>;
private styleKey_: number;
private styles_: any;
constructor(props: Props) {
super(props);
this.revisionsLink_click = this.revisionsLink_click.bind(this); this.revisionsLink_click = this.revisionsLink_click.bind(this);
this.buttonRow_click = this.buttonRow_click.bind(this); this.buttonRow_click = this.buttonRow_click.bind(this);
@ -37,7 +57,7 @@ class NotePropertiesDialog extends React.Component {
} }
componentDidMount() { componentDidMount() {
this.loadNote(this.props.noteId); void this.loadNote(this.props.noteId);
} }
componentDidUpdate() { componentDidUpdate() {
@ -46,7 +66,7 @@ class NotePropertiesDialog extends React.Component {
} }
} }
async loadNote(noteId) { async loadNote(noteId: string) {
if (!noteId) { if (!noteId) {
this.setState({ formNote: null }); this.setState({ formNote: null });
} else { } else {
@ -56,8 +76,8 @@ class NotePropertiesDialog extends React.Component {
} }
} }
latLongFromLocation(location) { latLongFromLocation(location: string) {
const o = {}; const o: any = {};
const l = location.split(','); const l = location.split(',');
if (l.length === 2) { if (l.length === 2) {
o.latitude = l[0].trim(); o.latitude = l[0].trim();
@ -69,8 +89,8 @@ class NotePropertiesDialog extends React.Component {
return o; return o;
} }
noteToFormNote(note) { noteToFormNote(note: NoteEntity) {
const formNote = {}; const formNote: any = {};
formNote.user_updated_time = time.formatMsToLocal(note.user_updated_time); formNote.user_updated_time = time.formatMsToLocal(note.user_updated_time);
formNote.user_created_time = time.formatMsToLocal(note.user_created_time); formNote.user_created_time = time.formatMsToLocal(note.user_created_time);
@ -93,7 +113,7 @@ class NotePropertiesDialog extends React.Component {
return formNote; return formNote;
} }
formNoteToNote(formNote) { formNoteToNote(formNote: any) {
const note = Object.assign({ id: formNote.id }, this.latLongFromLocation(formNote.location)); const note = Object.assign({ id: formNote.id }, this.latLongFromLocation(formNote.location));
note.user_created_time = time.formatLocalToMs(formNote.user_created_time); note.user_created_time = time.formatLocalToMs(formNote.user_created_time);
note.user_updated_time = time.formatLocalToMs(formNote.user_updated_time); note.user_updated_time = time.formatLocalToMs(formNote.user_updated_time);
@ -107,7 +127,7 @@ class NotePropertiesDialog extends React.Component {
return note; return note;
} }
styles(themeId) { styles(themeId: number) {
const styleKey = themeId; const styleKey = themeId;
if (styleKey === this.styleKey_) return this.styles_; if (styleKey === this.styleKey_) return this.styles_;
@ -148,7 +168,7 @@ class NotePropertiesDialog extends React.Component {
return this.styles_; return this.styles_;
} }
async closeDialog(applyChanges) { async closeDialog(applyChanges: boolean) {
if (applyChanges) { if (applyChanges) {
await this.saveProperty(); await this.saveProperty();
const note = this.formNoteToNote(this.state.formNote); const note = this.formNoteToNote(this.state.formNote);
@ -163,26 +183,26 @@ class NotePropertiesDialog extends React.Component {
} }
} }
buttonRow_click(event) { buttonRow_click(event: any) {
this.closeDialog(event.buttonName === 'ok'); void this.closeDialog(event.buttonName === 'ok');
} }
revisionsLink_click() { revisionsLink_click() {
this.closeDialog(false); void this.closeDialog(false);
if (this.props.onRevisionLinkClick) this.props.onRevisionLinkClick(); if (this.props.onRevisionLinkClick) this.props.onRevisionLinkClick();
} }
editPropertyButtonClick(key, initialValue) { editPropertyButtonClick(key: string, initialValue: any) {
this.setState({ this.setState({
editedKey: key, editedKey: key,
editedValue: initialValue, editedValue: initialValue,
}); });
shim.setTimeout(() => { shim.setTimeout(() => {
if (this.refs.editField.openCalendar) { if ((this.refs.editField as any).openCalendar) {
this.refs.editField.openCalendar(); (this.refs.editField as any).openCalendar();
} else { } else {
this.refs.editField.focus(); (this.refs.editField as any).focus();
} }
}, 100); }, 100);
} }
@ -190,7 +210,7 @@ class NotePropertiesDialog extends React.Component {
async saveProperty() { async saveProperty() {
if (!this.state.editedKey) return; if (!this.state.editedKey) return;
return new Promise((resolve) => { return new Promise((resolve: Function) => {
const newFormNote = Object.assign({}, this.state.formNote); const newFormNote = Object.assign({}, this.state.formNote);
if (this.state.editedKey.indexOf('_time') >= 0) { if (this.state.editedKey.indexOf('_time') >= 0) {
@ -214,7 +234,7 @@ class NotePropertiesDialog extends React.Component {
} }
async cancelProperty() { async cancelProperty() {
return new Promise((resolve) => { return new Promise((resolve: Function) => {
this.okButton.current.focus(); this.okButton.current.focus();
this.setState({ this.setState({
editedKey: null, editedKey: null,
@ -225,7 +245,7 @@ class NotePropertiesDialog extends React.Component {
}); });
} }
createNoteField(key, value) { createNoteField(key: string, value: any) {
const styles = this.styles(this.props.themeId); const styles = this.styles(this.props.themeId);
const theme = themeStyle(this.props.themeId); const theme = themeStyle(this.props.themeId);
const labelComp = <label style={Object.assign({}, theme.textStyle, theme.controlBoxLabel)}>{this.formatLabel(key)}</label>; const labelComp = <label style={Object.assign({}, theme.textStyle, theme.controlBoxLabel)}>{this.formatLabel(key)}</label>;
@ -234,11 +254,11 @@ class NotePropertiesDialog extends React.Component {
let editCompHandler = null; let editCompHandler = null;
let editCompIcon = null; let editCompIcon = null;
const onKeyDown = event => { const onKeyDown = (event: any) => {
if (event.keyCode === 13) { if (event.keyCode === 13) {
this.saveProperty(); void this.saveProperty();
} else if (event.keyCode === 27) { } else if (event.keyCode === 27) {
this.cancelProperty(); void this.cancelProperty();
} }
}; };
@ -251,17 +271,17 @@ class NotePropertiesDialog extends React.Component {
dateFormat={time.dateFormat()} dateFormat={time.dateFormat()}
timeFormat={time.timeFormat()} timeFormat={time.timeFormat()}
inputProps={{ inputProps={{
onKeyDown: event => onKeyDown(event, key), onKeyDown: (event: any) => onKeyDown(event),
style: styles.input, style: styles.input,
}} }}
onChange={momentObject => { onChange={(momentObject: any) => {
this.setState({ editedValue: momentObject }); this.setState({ editedValue: momentObject });
}} }}
/> />
); );
editCompHandler = () => { editCompHandler = () => {
this.saveProperty(); void this.saveProperty();
}; };
editCompIcon = 'fa-save'; editCompIcon = 'fa-save';
} else { } else {
@ -344,12 +364,12 @@ class NotePropertiesDialog extends React.Component {
); );
} }
formatLabel(key) { formatLabel(key: string) {
if (this.keyToLabel_[key]) return this.keyToLabel_[key]; if (this.keyToLabel_[key]) return this.keyToLabel_[key];
return key; return key;
} }
formatValue(key, note) { formatValue(key: string, note: NoteEntity) {
if (key === 'location') { if (key === 'location') {
if (!Number(note.latitude) && !Number(note.longitude)) return null; if (!Number(note.latitude) && !Number(note.longitude)) return null;
const dms = formatcoords(Number(note.latitude), Number(note.longitude)); const dms = formatcoords(Number(note.latitude), Number(note.longitude));
@ -357,10 +377,10 @@ class NotePropertiesDialog extends React.Component {
} }
if (['user_updated_time', 'user_created_time', 'todo_completed'].indexOf(key) >= 0) { if (['user_updated_time', 'user_created_time', 'todo_completed'].indexOf(key) >= 0) {
return time.formatMsToLocal(note[key]); return time.formatMsToLocal((note as any)[key]);
} }
return note[key]; return (note as any)[key];
} }
render() { render() {
@ -389,4 +409,4 @@ class NotePropertiesDialog extends React.Component {
} }
} }
module.exports = NotePropertiesDialog; export default NotePropertiesDialog;

View File

@ -1,25 +1,45 @@
const React = require('react'); import * as React from 'react';
const { connect } = require('react-redux'); import { themeStyle } from '@joplin/lib/theme';
const { themeStyle } = require('@joplin/lib/theme'); import { _ } from '@joplin/lib/locale';
const { _ } = require('@joplin/lib/locale'); import NoteTextViewer from './NoteTextViewer';
const NoteTextViewer = require('./NoteTextViewer').default; import HelpButton from './HelpButton';
const HelpButton = require('./HelpButton.min'); import BaseModel from '@joplin/lib/BaseModel';
const BaseModel = require('@joplin/lib/BaseModel').default; import Revision from '@joplin/lib/models/Revision';
const Revision = require('@joplin/lib/models/Revision').default; import Setting from '@joplin/lib/models/Setting';
import RevisionService from '@joplin/lib/services/RevisionService';
import { MarkupToHtml } from '@joplin/renderer';
import time from '@joplin/lib/time';
import bridge from '../services/bridge';
import markupLanguageUtils from '../utils/markupLanguageUtils';
import { NoteEntity, RevisionEntity } from '@joplin/lib/services/database/types';
import { AppState } from '../app.reducer';
const urlUtils = require('@joplin/lib/urlUtils'); const urlUtils = require('@joplin/lib/urlUtils');
const Setting = require('@joplin/lib/models/Setting').default;
const RevisionService = require('@joplin/lib/services/RevisionService').default;
const shared = require('@joplin/lib/components/shared/note-screen-shared.js');
const { MarkupToHtml } = require('@joplin/renderer');
const time = require('@joplin/lib/time').default;
const ReactTooltip = require('react-tooltip'); const ReactTooltip = require('react-tooltip');
const { urlDecode } = require('@joplin/lib/string-utils'); const { urlDecode } = require('@joplin/lib/string-utils');
const bridge = require('@electron/remote').require('./bridge').default; const { connect } = require('react-redux');
const markupLanguageUtils = require('../utils/markupLanguageUtils').default; const shared = require('@joplin/lib/components/shared/note-screen-shared.js');
class NoteRevisionViewerComponent extends React.PureComponent { interface Props {
constructor() { themeId: number;
super(); noteId: string;
onBack: Function;
customCss: string;
}
interface State {
note: NoteEntity;
revisions: RevisionEntity[];
currentRevId: string;
restoring: boolean;
}
class NoteRevisionViewerComponent extends React.PureComponent<Props, State> {
private viewerRef_: any;
private helpButton_onClick: Function;
constructor(props: Props) {
super(props);
this.state = { this.state = {
revisions: [], revisions: [],
@ -65,7 +85,7 @@ class NoteRevisionViewerComponent extends React.PureComponent {
currentRevId: revisions.length ? revisions[revisions.length - 1].id : '', currentRevId: revisions.length ? revisions[revisions.length - 1].id : '',
}, },
() => { () => {
this.reloadNote(); void this.reloadNote();
} }
); );
} }
@ -82,7 +102,7 @@ class NoteRevisionViewerComponent extends React.PureComponent {
if (this.props.onBack) this.props.onBack(); if (this.props.onBack) this.props.onBack();
} }
revisionList_onChange(event) { revisionList_onChange(event: any) {
const value = event.target.value; const value = event.target.value;
if (!value) { if (!value) {
@ -93,7 +113,7 @@ class NoteRevisionViewerComponent extends React.PureComponent {
currentRevId: value, currentRevId: value,
}, },
() => { () => {
this.reloadNote(); void this.reloadNote();
} }
); );
} }
@ -128,12 +148,12 @@ class NoteRevisionViewerComponent extends React.PureComponent {
}); });
this.viewerRef_.current.send('setHtml', result.html, { this.viewerRef_.current.send('setHtml', result.html, {
cssFiles: result.cssFiles, // cssFiles: result.cssFiles,
pluginAssets: result.pluginAssets, pluginAssets: result.pluginAssets,
}); });
} }
async webview_ipcMessage(event) { async webview_ipcMessage(event: any) {
// For the revision view, we only suppport a minimal subset of the IPC messages. // For the revision view, we only suppport a minimal subset of the IPC messages.
// For example, we don't need interactive checkboxes or sync between viewer and editor view. // For example, we don't need interactive checkboxes or sync between viewer and editor view.
// We try to get most links work though, except for internal (joplin://) links. // We try to get most links work though, except for internal (joplin://) links.
@ -148,9 +168,9 @@ class NoteRevisionViewerComponent extends React.PureComponent {
throw new Error(_('Unsupported link or message: %s', msg)); throw new Error(_('Unsupported link or message: %s', msg));
} else if (urlUtils.urlProtocol(msg)) { } else if (urlUtils.urlProtocol(msg)) {
if (msg.indexOf('file://') === 0) { if (msg.indexOf('file://') === 0) {
require('electron').shell.openExternal(urlDecode(msg)); void require('electron').shell.openExternal(urlDecode(msg));
} else { } else {
require('electron').shell.openExternal(msg); void require('electron').shell.openExternal(msg);
} }
} else if (msg.indexOf('#') === 0) { } else if (msg.indexOf('#') === 0) {
// This is an internal anchor, which is handled by the WebView so skip this case // This is an internal anchor, which is handled by the WebView so skip this case
@ -202,7 +222,7 @@ class NoteRevisionViewerComponent extends React.PureComponent {
const viewer = <NoteTextViewer themeId={this.props.themeId} viewerStyle={{ display: 'flex', flex: 1, borderLeft: 'none' }} ref={this.viewerRef_} onDomReady={this.viewer_domReady} onIpcMessage={this.webview_ipcMessage} />; const viewer = <NoteTextViewer themeId={this.props.themeId} viewerStyle={{ display: 'flex', flex: 1, borderLeft: 'none' }} ref={this.viewerRef_} onDomReady={this.viewer_domReady} onIpcMessage={this.webview_ipcMessage} />;
return ( return (
<div style={style.root}> <div style={style.root as any}>
{titleInput} {titleInput}
{viewer} {viewer}
<ReactTooltip place="bottom" delayShow={300} className="help-tooltip" /> <ReactTooltip place="bottom" delayShow={300} className="help-tooltip" />
@ -211,7 +231,7 @@ class NoteRevisionViewerComponent extends React.PureComponent {
} }
} }
const mapStateToProps = state => { const mapStateToProps = (state: AppState) => {
return { return {
themeId: state.settings.theme, themeId: state.settings.theme,
}; };
@ -219,4 +239,4 @@ const mapStateToProps = state => {
const NoteRevisionViewer = connect(mapStateToProps)(NoteRevisionViewerComponent); const NoteRevisionViewer = connect(mapStateToProps)(NoteRevisionViewerComponent);
module.exports = NoteRevisionViewer; export default NoteRevisionViewer;

View File

@ -1,10 +1,27 @@
const React = require('react'); import * as React from 'react';
const { themeStyle } = require('@joplin/lib/theme'); import { themeStyle } from '@joplin/lib/theme';
const { _ } = require('@joplin/lib/locale'); import { _ } from '@joplin/lib/locale';
class NoteSearchBar extends React.Component { interface Props {
constructor() { themeId: number;
super(); onNext: Function;
onPrevious: Function;
onClose: Function;
onChange: Function;
query: string;
searching: boolean;
resultCount: number;
selectedIndex: number;
visiblePanes: string[];
style: any;
}
class NoteSearchBar extends React.Component<Props> {
private backgroundColor: any;
constructor(props: Props) {
super(props);
this.searchInput_change = this.searchInput_change.bind(this); this.searchInput_change = this.searchInput_change.bind(this);
this.searchInput_keyDown = this.searchInput_keyDown.bind(this); this.searchInput_keyDown = this.searchInput_keyDown.bind(this);
@ -29,7 +46,7 @@ class NoteSearchBar extends React.Component {
return style; return style;
} }
buttonIconComponent(iconName, clickHandler, isEnabled) { buttonIconComponent(iconName: string, clickHandler: any, isEnabled: boolean) {
const theme = themeStyle(this.props.themeId); const theme = themeStyle(this.props.themeId);
const searchButton = { const searchButton = {
@ -57,12 +74,12 @@ class NoteSearchBar extends React.Component {
); );
} }
searchInput_change(event) { searchInput_change(event: any) {
const query = event.currentTarget.value; const query = event.currentTarget.value;
this.triggerOnChange(query); this.triggerOnChange(query);
} }
searchInput_keyDown(event) { searchInput_keyDown(event: any) {
if (event.keyCode === 13) { if (event.keyCode === 13) {
// ENTER // ENTER
event.preventDefault(); event.preventDefault();
@ -101,13 +118,13 @@ class NoteSearchBar extends React.Component {
if (this.props.onClose) this.props.onClose(); if (this.props.onClose) this.props.onClose();
} }
triggerOnChange(query) { triggerOnChange(query: string) {
if (this.props.onChange) this.props.onChange(query); if (this.props.onChange) this.props.onChange(query);
} }
focus() { focus() {
this.refs.searchInput.focus(); (this.refs.searchInput as any).focus();
this.refs.searchInput.select(); (this.refs.searchInput as any).select();
} }
render() { render() {
@ -177,4 +194,4 @@ class NoteSearchBar extends React.Component {
} }
} }
module.exports = NoteSearchBar; export default NoteSearchBar;

View File

@ -1,9 +1,16 @@
const React = require('react'); import * as React from 'react';
import time from '@joplin/lib/time';
import { themeStyle } from '@joplin/lib/theme';
import { NoteEntity } from '@joplin/lib/services/database/types';
import { AppState } from '../app.reducer';
const { connect } = require('react-redux'); const { connect } = require('react-redux');
const time = require('@joplin/lib/time').default;
const { themeStyle } = require('@joplin/lib/theme');
class NoteStatusBarComponent extends React.Component { interface Props {
themeId: number;
note: NoteEntity;
}
class NoteStatusBarComponent extends React.Component<Props> {
style() { style() {
const theme = themeStyle(this.props.themeId); const theme = themeStyle(this.props.themeId);
@ -23,7 +30,7 @@ class NoteStatusBarComponent extends React.Component {
} }
} }
const mapStateToProps = state => { const mapStateToProps = (state: AppState) => {
return { return {
// notes: state.notes, // notes: state.notes,
// folders: state.folders, // folders: state.folders,
@ -34,4 +41,4 @@ const mapStateToProps = state => {
const NoteStatusBar = connect(mapStateToProps)(NoteStatusBarComponent); const NoteStatusBar = connect(mapStateToProps)(NoteStatusBarComponent);
module.exports = { NoteStatusBar }; export default NoteStatusBar;

View File

@ -6,7 +6,8 @@ interface Props {
onDomReady: Function; onDomReady: Function;
onIpcMessage: Function; onIpcMessage: Function;
viewerStyle: any; viewerStyle: any;
contentMaxWidth: number; contentMaxWidth?: number;
themeId: number;
} }
export default class NoteTextViewerComponent extends React.Component<Props, any> { export default class NoteTextViewerComponent extends React.Component<Props, any> {

View File

@ -24,9 +24,9 @@ import MasterPasswordDialog from './MasterPasswordDialog/Dialog';
import EditFolderDialog from './EditFolderDialog/Dialog'; import EditFolderDialog from './EditFolderDialog/Dialog';
import PdfViewer from './PdfViewer'; import PdfViewer from './PdfViewer';
import StyleSheetContainer from './StyleSheets/StyleSheetContainer'; import StyleSheetContainer from './StyleSheets/StyleSheetContainer';
const { ImportScreen } = require('./ImportScreen.min.js'); import ImportScreen from './ImportScreen';
const { ResourceScreen } = require('./ResourceScreen.js'); const { ResourceScreen } = require('./ResourceScreen.js');
const { Navigator } = require('./Navigator.min.js'); import Navigator from './Navigator';
const WelcomeUtils = require('@joplin/lib/WelcomeUtils'); const WelcomeUtils = require('@joplin/lib/WelcomeUtils');
const { ThemeProvider, StyleSheetManager, createGlobalStyle } = require('styled-components'); const { ThemeProvider, StyleSheetManager, createGlobalStyle } = require('styled-components');
const bridge = require('@electron/remote').require('./bridge').default; const bridge = require('@electron/remote').require('./bridge').default;

View File

@ -1,7 +1,8 @@
const React = require('react'); const React = require('react');
const { connect } = require('react-redux'); const { connect } = require('react-redux');
const { themeStyle } = require('@joplin/lib/theme'); import { themeStyle } from '@joplin/lib/theme';
const CommandService = require('@joplin/lib/services/CommandService').default; import CommandService from '@joplin/lib/services/CommandService';
import { AppState } from '../app.reducer';
class TagItemComponent extends React.Component { class TagItemComponent extends React.Component {
render() { render() {
@ -13,10 +14,8 @@ class TagItemComponent extends React.Component {
} }
} }
const mapStateToProps = state => { const mapStateToProps = (state: AppState) => {
return { themeId: state.settings.theme }; return { themeId: state.settings.theme };
}; };
const TagItem = connect(mapStateToProps)(TagItemComponent); export default connect(mapStateToProps)(TagItemComponent);
module.exports = TagItem;

View File

@ -1,10 +1,10 @@
import * as React from 'react'; import * as React from 'react';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { AppState } from '../app.reducer'; import { AppState } from '../app.reducer';
import TagItem from './TagItem';
const { connect } = require('react-redux'); const { connect } = require('react-redux');
const { themeStyle } = require('@joplin/lib/theme'); const { themeStyle } = require('@joplin/lib/theme');
const TagItem = require('./TagItem.min.js');
interface Props { interface Props {
themeId: number; themeId: number;

View File

@ -1,9 +1,9 @@
import * as React from 'react';
import ToolbarButton from './ToolbarButton/ToolbarButton'; import ToolbarButton from './ToolbarButton/ToolbarButton';
import ToggleEditorsButton, { Value } from './ToggleEditorsButton/ToggleEditorsButton'; import ToggleEditorsButton, { Value } from './ToggleEditorsButton/ToggleEditorsButton';
const React = require('react'); import ToolbarSpace from './ToolbarSpace';
const { connect } = require('react-redux'); const { connect } = require('react-redux');
const { themeStyle } = require('@joplin/lib/theme'); const { themeStyle } = require('@joplin/lib/theme');
const ToolbarSpace = require('./ToolbarSpace.min.js');
interface Props { interface Props {
themeId: number; themeId: number;

View File

@ -1,14 +0,0 @@
const React = require('react');
const { themeStyle } = require('@joplin/lib/theme');
class ToolbarSpace extends React.Component {
render() {
const theme = themeStyle(this.props.themeId);
const style = Object.assign({}, theme.toolbarStyle);
style.minWidth = style.height / 2;
return <span style={style}></span>;
}
}
module.exports = ToolbarSpace;

View File

@ -0,0 +1,18 @@
import * as React from 'react';
import { themeStyle } from '@joplin/lib/theme';
interface Props {
themeId: number;
}
class ToolbarSpace extends React.Component<Props> {
render() {
const theme = themeStyle(this.props.themeId);
const style = Object.assign({}, theme.toolbarStyle);
style.minWidth = style.height / 2;
return <span style={style}></span>;
}
}
export default ToolbarSpace;

View File

@ -1,100 +0,0 @@
const React = require('react');
const bridge = require('@electron/remote').require('./bridge').default;
class VerticalResizer extends React.PureComponent {
constructor() {
super();
this.state = {
parentRight: 0,
parentHeight: 0,
parentWidth: 0,
drag: {
startX: 0,
lastX: 0,
},
};
this.onDragStart = this.onDragStart.bind(this);
this.onDrag = this.onDrag.bind(this);
this.onDragEnd = this.onDragEnd.bind(this);
this.document_onDragOver = this.document_onDragOver.bind(this);
}
document_onDragOver(event) {
// This is just to prevent the cursor from changing to a "+" as it's dragged
// over other elements. With this it stays a normal cursor.
event.dataTransfer.dropEffect = 'none';
}
onDragStart(event) {
document.addEventListener('dragover', this.document_onDragOver);
event.dataTransfer.dropEffect = 'none';
const cursor = bridge().screen().getCursorScreenPoint();
this.setState({
drag: {
startX: cursor.x,
lastX: cursor.x,
},
});
if (this.props.onDragStart) this.props.onDragStart({});
}
onDrag() {
// If we got a drag event with no buttons pressed, it's the last drag event
// that we should ignore, because it's sometimes use to put the dragged element
// back to its original position (if there was no valid drop target), which we don't want.
// Also if clientX, screenX, etc. are 0, it's also the last event and we want to ignore these buggy values.
// const e = event.nativeEvent;
// if (!e.buttons || (!e.clientX && !e.clientY && !e.screenX && !e.screenY)) return;
const cursor = bridge().screen().getCursorScreenPoint();
const newX = cursor.x;
const delta = newX - this.state.drag.lastX;
if (!delta) return;
this.setState(
{
drag: Object.assign({}, this.state.drag, { lastX: newX }),
},
() => {
this.props.onDrag({ deltaX: delta });
}
);
}
onDragEnd() {
document.removeEventListener('dragover', this.document_onDragOver);
}
componentWillUnmount() {
document.removeEventListener('dragover', this.document_onDragOver);
}
render() {
const debug = false;
const rootStyle = Object.assign(
{},
{
height: '100%',
width: 5,
borderColor: 'red',
borderWidth: debug ? 1 : 0,
borderStyle: 'solid',
cursor: 'col-resize',
boxSizing: 'border-box',
opacity: 0,
},
this.props.style
);
return <div style={rootStyle} draggable={true} onDragStart={this.onDragStart} onDrag={this.onDrag} onDragEnd={this.onDragEnd} />;
}
}
module.exports = VerticalResizer;

View File

@ -1,11 +1,8 @@
'use strict';
const { createSelector } = require('reselect'); const { createSelector } = require('reselect');
const { themeStyle } = require('@joplin/lib/theme'); const { themeStyle } = require('@joplin/lib/theme');
const themeSelector = (state, props) => themeStyle(props.themeId); const themeSelector = (state, props) => themeStyle(props.themeId);
const style = createSelector(themeSelector, (theme) => {
const style = createSelector(
themeSelector,
(theme) => {
const output = { const output = {
root: { root: {
width: 220, width: 220,
@ -41,9 +38,7 @@ const style = createSelector(
fontWeight: 'bold', fontWeight: 'bold',
}, },
}; };
return output; return output;
} });
);
module.exports = style; module.exports = style;
// # sourceMappingURL=ExtensionBadge.js.map

View File

@ -113,8 +113,6 @@
"@types/react": "16.14.34", "@types/react": "16.14.34",
"@types/react-redux": "7.1.25", "@types/react-redux": "7.1.25",
"@types/styled-components": "5.1.26", "@types/styled-components": "5.1.26",
"babel-cli": "6.26.0",
"babel-preset-react": "6.24.1",
"electron": "19.1.4", "electron": "19.1.4",
"electron-builder": "23.6.0", "electron-builder": "23.6.0",
"electron-notarize": "1.2.2", "electron-notarize": "1.2.2",

View File

@ -14,7 +14,7 @@ import Tag from '@joplin/lib/models/Tag';
import Folder from '@joplin/lib/models/Folder'; import Folder from '@joplin/lib/models/Folder';
import Note from '@joplin/lib/models/Note'; import Note from '@joplin/lib/models/Note';
const { ItemList } = require('../gui/ItemList.min'); const { ItemList } = require('../gui/ItemList.min');
const HelpButton = require('../gui/HelpButton.min'); import HelpButton from '../gui/HelpButton';
const { surroundKeywords, nextWhitespaceIndex, removeDiacritics } = require('@joplin/lib/string-utils.js'); const { surroundKeywords, nextWhitespaceIndex, removeDiacritics } = require('@joplin/lib/string-utils.js');
import { mergeOverlappingIntervals } from '@joplin/lib/ArrayUtils'; import { mergeOverlappingIntervals } from '@joplin/lib/ArrayUtils';
import markupLanguageUtils from '../utils/markupLanguageUtils'; import markupLanguageUtils from '../utils/markupLanguageUtils';

View File

@ -1,61 +1,8 @@
const fs = require('fs-extra'); const fs = require('fs-extra');
const spawnSync = require('child_process').spawnSync;
const { chdir } = require('process');
const basePath = `${__dirname}/../../..`; const basePath = `${__dirname}/../../..`;
function fileIsNewerThan(path1, path2) {
if (!fs.existsSync(path2)) return true;
const stat1 = fs.statSync(path1);
const stat2 = fs.statSync(path2);
return stat1.mtime > stat2.mtime;
}
function convertJsx(paths) {
chdir(`${__dirname}/..`);
paths.forEach(path => {
fs.readdirSync(path).forEach((filename) => {
const jsxPath = `${path}/${filename}`;
const p = jsxPath.split('.');
if (p.length <= 1) return;
const ext = p[p.length - 1];
if (ext !== 'jsx') return;
p.pop();
const basePath = p.join('.');
const jsPath = `${basePath}.min.js`;
if (fileIsNewerThan(jsxPath, jsPath)) {
console.info(`Compiling ${jsxPath}...`);
// { shell: true } is needed to get it working on Windows:
// https://discourse.joplinapp.org/t/attempting-to-build-on-windows/22559/12
const result = spawnSync('yarn', ['run', 'babel', '--presets', 'react', '--out-file', jsPath, jsxPath], { shell: true });
if (result.status !== 0) {
const msg = [];
if (result.stdout) msg.push(result.stdout.toString());
if (result.stderr) msg.push(result.stderr.toString());
console.error(msg.join('\n'));
if (result.error) console.error(result.error);
process.exit(result.status);
}
}
});
});
}
module.exports = function() { module.exports = function() {
convertJsx([
`${__dirname}/../gui`,
`${__dirname}/../gui/MainScreen`,
`${__dirname}/../gui/NoteList`,
`${__dirname}/../plugins`,
]);
const libContent = [ const libContent = [
fs.readFileSync(`${basePath}/packages/lib/string-utils-common.js`, 'utf8'), fs.readFileSync(`${basePath}/packages/lib/string-utils-common.js`, 'utf8'),
fs.readFileSync(`${basePath}/packages/lib/markJsUtils.js`, 'utf8'), fs.readFileSync(`${basePath}/packages/lib/markJsUtils.js`, 'utf8'),

View File

@ -3,7 +3,6 @@ import { _ } from '../../locale';
import BaseItem, { EncryptedItemsStats } from '../../models/BaseItem'; import BaseItem, { EncryptedItemsStats } from '../../models/BaseItem';
import useAsyncEffect, { AsyncEffectEvent } from '../../hooks/useAsyncEffect'; import useAsyncEffect, { AsyncEffectEvent } from '../../hooks/useAsyncEffect';
import { MasterKeyEntity } from '../../services/e2ee/types'; import { MasterKeyEntity } from '../../services/e2ee/types';
// import time from '../../time';
import { findMasterKeyPassword, getMasterPasswordStatus, masterPasswordIsValid, MasterPasswordStatus } from '../../services/e2ee/utils'; import { findMasterKeyPassword, getMasterPasswordStatus, masterPasswordIsValid, MasterPasswordStatus } from '../../services/e2ee/utils';
import EncryptionService from '../../services/e2ee/EncryptionService'; import EncryptionService from '../../services/e2ee/EncryptionService';
import { masterKeyEnabled, setMasterKeyEnabled } from '../../services/synchronizer/syncInfoUtils'; import { masterKeyEnabled, setMasterKeyEnabled } from '../../services/synchronizer/syncInfoUtils';

712
yarn.lock

File diff suppressed because it is too large Load Diff