diff --git a/browser/components/CodeEditor.js b/browser/components/CodeEditor.js index 304171ba..c36a50c1 100644 --- a/browser/components/CodeEditor.js +++ b/browser/components/CodeEditor.js @@ -292,6 +292,10 @@ export default class CodeEditor extends React.Component { this.editor.on('cursorActivity', this.editorActivityHandler) this.editor.on('changes', this.editorActivityHandler) } + + this.setState({ + clientWidth: this.refs.root.clientWidth + }) } expandSnippet (line, cursor, cm, snippets) { @@ -441,6 +445,14 @@ export default class CodeEditor extends React.Component { this.editor.setOption('extraKeys', this.defaultKeyMap) } + if (this.state.clientWidth !== this.refs.root.clientWidth) { + this.setState({ + clientWidth: this.refs.root.clientWidth + }) + + needRefresh = true + } + if (needRefresh) { this.editor.refresh() } diff --git a/browser/components/MarkdownPreview.js b/browser/components/MarkdownPreview.js index 5376a773..b3d59b47 100755 --- a/browser/components/MarkdownPreview.js +++ b/browser/components/MarkdownPreview.js @@ -17,8 +17,11 @@ import copy from 'copy-to-clipboard' import mdurl from 'mdurl' import exportNote from 'browser/main/lib/dataApi/exportNote' import { escapeHtmlCharacters } from 'browser/lib/utils' +import context from 'browser/lib/context' +import i18n from 'browser/lib/i18n' +import fs from 'fs' -const { remote } = require('electron') +const { remote, shell } = require('electron') const attachmentManagement = require('../main/lib/dataApi/attachmentManagement') const { app } = remote @@ -27,6 +30,8 @@ const fileUrl = require('file-url') const dialog = remote.dialog +const uri2path = require('file-uri-to-path') + const markdownStyle = require('!!css!stylus?sourceMap!./markdown.styl')[0][1] const appPath = fileUrl( process.env.NODE_ENV === 'production' ? app.getAppPath() : path.resolve() @@ -161,7 +166,6 @@ const scrollBarDarkStyle = ` } ` -const { shell } = require('electron') const OSX = global.process.platform === 'darwin' const defaultFontFamily = ['helvetica', 'arial', 'sans-serif'] @@ -219,8 +223,32 @@ export default class MarkdownPreview extends React.Component { } } - handleContextMenu (e) { - this.props.onContextMenu(e) + handleContextMenu (event) { + // If a contextMenu handler was passed to us, use it instead of the self-defined one -> return + if (_.isFunction(this.props.onContextMenu)) { + this.props.onContextMenu(event) + return + } + // No contextMenu was passed to us -> execute our own link-opener + if (event.target.tagName.toLowerCase() === 'a') { + const href = event.target.href + const isLocalFile = href.startsWith('file:') + if (isLocalFile) { + const absPath = uri2path(href) + try { + if (fs.lstatSync(absPath).isFile()) { + context.popup([ + { + label: i18n.__('Show in explorer'), + click: (e) => shell.showItemInFolder(absPath) + } + ]) + } + } catch (e) { + console.log('Error while evaluating if the file is locally available', e) + } + } + } } handleDoubleClick (e) { diff --git a/browser/components/NoteItem.js b/browser/components/NoteItem.js index b0731eca..2fc70a39 100644 --- a/browser/components/NoteItem.js +++ b/browser/components/NoteItem.js @@ -78,24 +78,22 @@ const NoteItem = ({ ? note.title : {i18n.__('Empty note')}} - {['ALL', 'STORAGE'].includes(viewType) && -
-
{dateDisplay}
-
-
- {viewType === 'ALL' && storageName} - {viewType === 'STORAGE' && folderName} -
+
+
{dateDisplay}
+
+
+ {viewType === 'ALL' && storageName} + {viewType === 'STORAGE' && folderName}
-
} - +
+
{note.tags.length > 0 diff --git a/browser/components/NoteItem.styl b/browser/components/NoteItem.styl index 017ef6d0..e545ed99 100644 --- a/browser/components/NoteItem.styl +++ b/browser/components/NoteItem.styl @@ -368,13 +368,13 @@ body[data-theme="monokai"] .item-title .item-title-icon .item-bottom-time - color $ui-monokai-text-color + color $ui-monokai-active-color .item-bottom-tagList-item background-color alpha(white, 10%) color $ui-monokai-text-color &:hover // background-color alpha($ui-monokai-button--active-backgroundColor, 60%) - color #c0392b + color #f92672 .item-bottom-tagList-item background-color alpha(#fff, 20%) diff --git a/browser/components/NoteItemSimple.styl b/browser/components/NoteItemSimple.styl index 04f57fdc..4bb6f2b1 100644 --- a/browser/components/NoteItemSimple.styl +++ b/browser/components/NoteItemSimple.styl @@ -240,7 +240,7 @@ body[data-theme="monokai"] .item-simple-title-icon .item-simple-bottom-time transition 0.15s - color $ui-solarized-dark-text-color + color $ui-monokai-text-color .item-simple-bottom-tagList-item transition 0.15s background-color alpha(#fff, 20%) diff --git a/browser/components/TodoListPercentage.styl b/browser/components/TodoListPercentage.styl index 6116cd58..94e75599 100644 --- a/browser/components/TodoListPercentage.styl +++ b/browser/components/TodoListPercentage.styl @@ -39,7 +39,7 @@ body[data-theme="dark"] .percentageText color $ui-dark-text-color - + body[data-theme="solarized-dark"] .percentageBar background-color #002b36 @@ -52,10 +52,10 @@ body[data-theme="solarized-dark"] body[data-theme="monokai"] .percentageBar - background-color #f92672 + background-color: $ui-monokai-borderColor .progressBar - background-color: #373831 + background-color $ui-monokai-active-color .percentageText - color #fdf6e3 \ No newline at end of file + color $ui-monokai-text-color \ No newline at end of file diff --git a/browser/lib/markdown.js b/browser/lib/markdown.js index ba57ec6b..ed4fbca1 100644 --- a/browser/lib/markdown.js +++ b/browser/lib/markdown.js @@ -148,7 +148,8 @@ class Markdown { } }) this.md.use(require('markdown-it-kbd')) - this.md.use(require('markdown-it-admonition')) + + this.md.use(require('markdown-it-admonition'), {types: ['note', 'hint', 'attention', 'caution', 'danger', 'error']}) this.md.use(require('./markdown-it-frontmatter')) const deflate = require('markdown-it-plantuml/lib/deflate') diff --git a/browser/main/Detail/SnippetNoteDetail.js b/browser/main/Detail/SnippetNoteDetail.js index 5bd45861..8919e3b0 100644 --- a/browser/main/Detail/SnippetNoteDetail.js +++ b/browser/main/Detail/SnippetNoteDetail.js @@ -761,6 +761,7 @@ class SnippetNoteDetail extends React.Component { value={this.state.note.tags} saveTagsAlphabetically={config.ui.saveTagsAlphabetically} showTagsAlphabetically={config.ui.showTagsAlphabetically} + data={data} onChange={(e) => this.handleChange(e)} />
diff --git a/browser/main/Detail/TagSelect.js b/browser/main/Detail/TagSelect.js index ffa98786..6ced475b 100644 --- a/browser/main/Detail/TagSelect.js +++ b/browser/main/Detail/TagSelect.js @@ -88,6 +88,11 @@ class TagSelect extends React.Component { this.refs.newTag.input.focus() } + handleTagLabelClick (tag) { + const { router } = this.context + router.push(`/tags/${tag}`) + } + handleTagRemoveButtonClick (tag) { this.removeTagByCallback((value, tag) => { value.splice(value.indexOf(tag), 1) @@ -182,7 +187,7 @@ class TagSelect extends React.Component { - #{tag} + this.handleTagLabelClick(tag)}>#{tag}
-
{i18n.__('Toggle editor mode')}
+
{i18n.__('Toggle Editor Mode')}
this.handleHotkeyChange(e)} diff --git a/browser/main/modals/PreferencesModal/StorageItem.styl b/browser/main/modals/PreferencesModal/StorageItem.styl index 29dfbd0b..adcc483e 100644 --- a/browser/main/modals/PreferencesModal/StorageItem.styl +++ b/browser/main/modals/PreferencesModal/StorageItem.styl @@ -9,13 +9,17 @@ box-sizing border-box border-bottom $default-border margin-bottom 5px + display flex .header-label - float left cursor pointer &:hover .header-label-editButton opacity 1 + flex 1 + white-space nowrap + text-overflow ellipsis + overflow hidden .header-label-path color $ui-inactive-text-color @@ -38,8 +42,8 @@ outline none .header-control - float right - + -webkit-box-flex: 1 + white-space nowrap .header-control-button width 30px height 25px diff --git a/browser/main/modals/PreferencesModal/StoragesTab.js b/browser/main/modals/PreferencesModal/StoragesTab.js index ad7472d2..046b24e6 100644 --- a/browser/main/modals/PreferencesModal/StoragesTab.js +++ b/browser/main/modals/PreferencesModal/StoragesTab.js @@ -70,7 +70,7 @@ class StoragesTab extends React.Component { }) return (
-
{i18n.__('Storages')}
+
{i18n.__('Storage Locations')}
{storageList.length > 0 ? storageList :
{i18n.__('No storage found.')}
diff --git a/browser/main/modals/PreferencesModal/UiTab.js b/browser/main/modals/PreferencesModal/UiTab.js index 00a79958..4f3fc7bb 100644 --- a/browser/main/modals/PreferencesModal/UiTab.js +++ b/browser/main/modals/PreferencesModal/UiTab.js @@ -40,7 +40,7 @@ class UiTab extends React.Component { this.handleSettingError = (err) => { this.setState({UiAlert: { type: 'error', - message: err.message != null ? err.message : i18n.__('Error occurs!') + message: err.message != null ? err.message : i18n.__('An error occurred!') }}) } ipc.addListener('APP_SETTING_DONE', this.handleSettingDone) @@ -128,7 +128,7 @@ class UiTab extends React.Component { this.props.haveToSave({ tab: 'UI', type: 'warning', - message: i18n.__('You have to save!') + message: i18n.__('Unsaved Changes!') }) } }) @@ -537,7 +537,7 @@ class UiTab extends React.Component {
-
{i18n.__('Code block Theme')}
+
{i18n.__('Code Block Theme')}