1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-15 09:04:04 +02:00
joplin/ElectronClient/gui/NoteToolbar/NoteToolbar.tsx
Laurent Cozic b7f5f848f2 All: Refactored themes to allow using the same ones in both desktop and mobile version
Will also allow using them when exporting HTML or PDF from CLI.
2020-06-10 22:08:59 +01:00

163 lines
3.8 KiB
TypeScript

import * as React from 'react';
const { connect } = require('react-redux');
const { buildStyle } = require('lib/theme');
const Toolbar = require('../Toolbar.min.js');
const Note = require('lib/models/Note');
const Folder = require('lib/models/Folder');
const { time } = require('lib/time-utils.js');
const { _ } = require('lib/locale');
const { substrWithEllipsis } = require('lib/string-utils');
interface ButtonClickEvent {
name: string,
}
interface NoteToolbarProps {
theme: number,
style: any,
folders: any[],
watchedNoteFiles: string[],
backwardHistoryNotes: any[],
forwardHistoryNotes: any[],
notesParentType: string,
note: any,
dispatch: Function,
onButtonClick(event:ButtonClickEvent):void,
}
function styles_(props:NoteToolbarProps) {
return buildStyle('NoteToolbar', props.theme, (/* theme:any*/) => {
return {
root: {
...props.style,
borderBottom: 'none',
},
};
});
}
function useToolbarItems(props:NoteToolbarProps) {
const { note, folders, watchedNoteFiles, notesParentType, dispatch
, onButtonClick, backwardHistoryNotes, forwardHistoryNotes } = props;
const toolbarItems = [];
const selectedNoteFolder = Folder.byId(folders, note.parent_id);
toolbarItems.push({
tooltip: _('Back'),
iconName: 'fa-arrow-left',
enabled: (backwardHistoryNotes.length > 0),
onClick: () => {
if (!backwardHistoryNotes.length) return;
props.dispatch({
type: 'HISTORY_BACKWARD',
});
},
});
toolbarItems.push({
tooltip: _('Forward'),
iconName: 'fa-arrow-right',
enabled: (forwardHistoryNotes.length > 0),
onClick: () => {
if (!forwardHistoryNotes.length) return;
props.dispatch({
type: 'HISTORY_FORWARD',
});
},
});
if (selectedNoteFolder && ['Search', 'Tag', 'SmartFilter'].includes(notesParentType)) {
toolbarItems.push({
title: _('In: %s', substrWithEllipsis(selectedNoteFolder.title, 0, 16)),
iconName: 'fa-book',
onClick: () => {
props.dispatch({
type: 'FOLDER_AND_NOTE_SELECT',
folderId: selectedNoteFolder.id,
noteId: note.id,
});
},
});
}
toolbarItems.push({
tooltip: _('Note properties'),
iconName: 'fa-info-circle',
onClick: () => {
dispatch({
type: 'WINDOW_COMMAND',
name: 'commandNoteProperties',
noteId: note.id,
onRevisionLinkClick: () => {
onButtonClick({ name: 'showRevisions' });
},
});
},
});
if (watchedNoteFiles.indexOf(note.id) >= 0) {
toolbarItems.push({
tooltip: _('Click to stop external editing'),
title: _('Watching...'),
iconName: 'fa-share-square',
onClick: () => {
onButtonClick({ name: 'stopExternalEditing' });
},
});
} else {
toolbarItems.push({
tooltip: _('Edit in external editor'),
iconName: 'fa-share-square',
onClick: () => {
onButtonClick({ name: 'startExternalEditing' });
},
});
}
if (note.is_todo) {
const item:any = {
iconName: 'fa-clock',
enabled: !note.todo_completed,
onClick: () => {
onButtonClick({ name: 'setAlarm' });
},
};
if (Note.needAlarm(note)) {
item.title = time.formatMsToLocal(note.todo_due);
} else {
item.tooltip = _('Set alarm');
}
toolbarItems.push(item);
}
toolbarItems.push({
tooltip: _('Tags'),
iconName: 'fa-tags',
onClick: () => {
onButtonClick({ name: 'setTags' });
},
});
return toolbarItems;
}
function NoteToolbar(props:NoteToolbarProps) {
const styles = styles_(props);
const toolbarItems = useToolbarItems(props);
return <Toolbar style={styles.root} items={toolbarItems} />;
}
const mapStateToProps = (state:any) => {
return {
folders: state.folders,
watchedNoteFiles: state.watchedNoteFiles,
backwardHistoryNotes: state.backwardHistoryNotes,
forwardHistoryNotes: state.forwardHistoryNotes,
notesParentType: state.notesParentType,
};
};
export default connect(mapStateToProps)(NoteToolbar);