mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-16 03:06:27 +00:00
Merge branch 'master' into crossplatform_fullscreen_shortcuts
This commit is contained in:
@@ -28,6 +28,7 @@ import InfoPanelTrashed from './InfoPanelTrashed'
|
||||
import { formatDate } from 'browser/lib/date-formatter'
|
||||
import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoStatus'
|
||||
import striptags from 'striptags'
|
||||
import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote'
|
||||
|
||||
class MarkdownNoteDetail extends React.Component {
|
||||
constructor (props) {
|
||||
@@ -181,10 +182,10 @@ class MarkdownNoteDetail extends React.Component {
|
||||
handleTrashButtonClick (e) {
|
||||
const { note } = this.state
|
||||
const { isTrashed } = note
|
||||
const { confirmDeletion } = this.props
|
||||
const { confirmDeletion } = this.props.config.ui
|
||||
|
||||
if (isTrashed) {
|
||||
if (confirmDeletion(true)) {
|
||||
if (confirmDeleteNote(confirmDeletion, true)) {
|
||||
const {note, dispatch} = this.props
|
||||
dataApi
|
||||
.deleteNote(note.storage, note.key)
|
||||
@@ -201,7 +202,7 @@ class MarkdownNoteDetail extends React.Component {
|
||||
.then(() => ee.emit('list:next'))
|
||||
}
|
||||
} else {
|
||||
if (confirmDeletion()) {
|
||||
if (confirmDeleteNote(confirmDeletion, false)) {
|
||||
note.isTrashed = true
|
||||
|
||||
this.setState({
|
||||
@@ -437,8 +438,7 @@ MarkdownNoteDetail.propTypes = {
|
||||
style: PropTypes.shape({
|
||||
left: PropTypes.number
|
||||
}),
|
||||
ignorePreviewPointerEvents: PropTypes.bool,
|
||||
confirmDeletion: PropTypes.bool.isRequired
|
||||
ignorePreviewPointerEvents: PropTypes.bool
|
||||
}
|
||||
|
||||
export default CSSModules(MarkdownNoteDetail, styles)
|
||||
|
||||
@@ -27,6 +27,7 @@ import InfoPanel from './InfoPanel'
|
||||
import InfoPanelTrashed from './InfoPanelTrashed'
|
||||
import { formatDate } from 'browser/lib/date-formatter'
|
||||
import i18n from 'browser/lib/i18n'
|
||||
import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote'
|
||||
|
||||
function pass (name) {
|
||||
switch (name) {
|
||||
@@ -197,10 +198,10 @@ class SnippetNoteDetail extends React.Component {
|
||||
handleTrashButtonClick (e) {
|
||||
const { note } = this.state
|
||||
const { isTrashed } = note
|
||||
const { confirmDeletion } = this.props
|
||||
const { confirmDeletion } = this.props.config.ui
|
||||
|
||||
if (isTrashed) {
|
||||
if (confirmDeletion(true)) {
|
||||
if (confirmDeleteNote(confirmDeletion, true)) {
|
||||
const {note, dispatch} = this.props
|
||||
dataApi
|
||||
.deleteNote(note.storage, note.key)
|
||||
@@ -217,7 +218,7 @@ class SnippetNoteDetail extends React.Component {
|
||||
.then(() => ee.emit('list:next'))
|
||||
}
|
||||
} else {
|
||||
if (confirmDeletion()) {
|
||||
if (confirmDeleteNote(confirmDeletion, false)) {
|
||||
note.isTrashed = true
|
||||
|
||||
this.setState({
|
||||
@@ -883,8 +884,7 @@ SnippetNoteDetail.propTypes = {
|
||||
style: PropTypes.shape({
|
||||
left: PropTypes.number
|
||||
}),
|
||||
ignorePreviewPointerEvents: PropTypes.bool,
|
||||
confirmDeletion: PropTypes.bool.isRequired
|
||||
ignorePreviewPointerEvents: PropTypes.bool
|
||||
}
|
||||
|
||||
export default CSSModules(SnippetNoteDetail, styles)
|
||||
|
||||
@@ -33,26 +33,6 @@ class Detail extends React.Component {
|
||||
ee.off('detail:delete', this.deleteHandler)
|
||||
}
|
||||
|
||||
confirmDeletion (permanent) {
|
||||
if (this.props.config.ui.confirmDeletion || permanent) {
|
||||
const electron = require('electron')
|
||||
const { remote } = electron
|
||||
const { dialog } = remote
|
||||
|
||||
const alertConfig = {
|
||||
type: 'warning',
|
||||
message: i18n.__('Confirm note deletion'),
|
||||
detail: i18n.__('This will permanently remove this note.'),
|
||||
buttons: [i18n.__('Confirm'), i18n.__('Cancel')]
|
||||
}
|
||||
|
||||
const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), alertConfig)
|
||||
return dialogueButtonIndex === 0
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
render () {
|
||||
const { location, data, config } = this.props
|
||||
let note = null
|
||||
@@ -82,7 +62,6 @@ class Detail extends React.Component {
|
||||
<SnippetNoteDetail
|
||||
note={note}
|
||||
config={config}
|
||||
confirmDeletion={(permanent) => this.confirmDeletion(permanent)}
|
||||
ref='root'
|
||||
{..._.pick(this.props, [
|
||||
'dispatch',
|
||||
@@ -99,7 +78,6 @@ class Detail extends React.Component {
|
||||
<MarkdownNoteDetail
|
||||
note={note}
|
||||
config={config}
|
||||
confirmDeletion={(permanent) => this.confirmDeletion(permanent)}
|
||||
ref='root'
|
||||
{..._.pick(this.props, [
|
||||
'dispatch',
|
||||
|
||||
@@ -140,43 +140,37 @@ class Main extends React.Component {
|
||||
componentDidMount () {
|
||||
const { dispatch, config } = this.props
|
||||
|
||||
if (config.ui.theme === 'dark') {
|
||||
document.body.setAttribute('data-theme', 'dark')
|
||||
} else if (config.ui.theme === 'white') {
|
||||
document.body.setAttribute('data-theme', 'white')
|
||||
} else if (config.ui.theme === 'solarized-dark') {
|
||||
document.body.setAttribute('data-theme', 'solarized-dark')
|
||||
const supportedThemes = [
|
||||
'dark',
|
||||
'white',
|
||||
'solarized-dark'
|
||||
]
|
||||
|
||||
if (supportedThemes.indexOf(config.ui.theme) !== -1) {
|
||||
document.body.setAttribute('data-theme', config.ui.theme)
|
||||
} else {
|
||||
document.body.setAttribute('data-theme', 'default')
|
||||
}
|
||||
if (config.ui.language === 'sq') {
|
||||
i18n.setLocale('sq')
|
||||
} else if (config.ui.language === 'zh-CN') {
|
||||
i18n.setLocale('zh-CN')
|
||||
} else if (config.ui.language === 'zh-TW') {
|
||||
i18n.setLocale('zh-TW')
|
||||
} else if (config.ui.language === 'da') {
|
||||
i18n.setLocale('da')
|
||||
} else if (config.ui.language === 'fr') {
|
||||
i18n.setLocale('fr')
|
||||
} else if (config.ui.language === 'de') {
|
||||
i18n.setLocale('de')
|
||||
} else if (config.ui.language === 'hu') {
|
||||
i18n.setLocale('hu')
|
||||
} else if (config.ui.language === 'ja') {
|
||||
i18n.setLocale('ja')
|
||||
} else if (config.ui.language === 'ko') {
|
||||
i18n.setLocale('ko')
|
||||
} else if (config.ui.language === 'no') {
|
||||
i18n.setLocale('no')
|
||||
} else if (config.ui.language === 'pl') {
|
||||
i18n.setLocale('pl')
|
||||
} else if (config.ui.language === 'pt') {
|
||||
i18n.setLocale('pt')
|
||||
} else if (config.ui.language === 'ru') {
|
||||
i18n.setLocale('ru')
|
||||
} else if (config.ui.language === 'es-ES') {
|
||||
i18n.setLocale('es-ES')
|
||||
|
||||
const supportedLanguages = [
|
||||
'sq',
|
||||
'zh-CN',
|
||||
'zh-TW',
|
||||
'da',
|
||||
'fr',
|
||||
'de',
|
||||
'hu',
|
||||
'ja',
|
||||
'ko',
|
||||
'no',
|
||||
'pl',
|
||||
'pt',
|
||||
'ru',
|
||||
'es-ES'
|
||||
]
|
||||
|
||||
if (supportedLanguages.indexOf(config.ui.language) !== -1) {
|
||||
i18n.setLocale(config.ui.language)
|
||||
} else {
|
||||
i18n.setLocale('en')
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import copy from 'copy-to-clipboard'
|
||||
import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig'
|
||||
import Markdown from '../../lib/markdown'
|
||||
import i18n from 'browser/lib/i18n'
|
||||
import { confirmDeleteNote } from 'browser/lib/confirmDeleteNote'
|
||||
|
||||
const { remote } = require('electron')
|
||||
const { Menu, MenuItem, dialog } = remote
|
||||
@@ -326,8 +327,10 @@ class NoteList extends React.Component {
|
||||
}
|
||||
|
||||
if (location.pathname.match(/\/searched/)) {
|
||||
const searchInputText = document.getElementsByClassName('searchInput')[0].value
|
||||
if (searchInputText === '') {
|
||||
const searchInputText = params.searchword
|
||||
const allNotes = data.noteMap.map((note) => note)
|
||||
this.contextNotes = allNotes
|
||||
if (searchInputText === undefined || searchInputText === '') {
|
||||
return this.sortByPin(this.contextNotes)
|
||||
}
|
||||
return searchFromNotes(this.contextNotes, searchInputText)
|
||||
@@ -481,50 +484,53 @@ class NoteList extends React.Component {
|
||||
const openBlogLabel = i18n.__('Open Blog')
|
||||
|
||||
const menu = new Menu()
|
||||
if (!location.pathname.match(/\/starred|\/trash/)) {
|
||||
menu.append(new MenuItem({
|
||||
label: pinLabel,
|
||||
click: this.pinToTop
|
||||
}))
|
||||
}
|
||||
|
||||
if (location.pathname.match(/\/trash/)) {
|
||||
menu.append(new MenuItem({
|
||||
label: restoreNote,
|
||||
click: this.restoreNote
|
||||
}))
|
||||
}
|
||||
|
||||
menu.append(new MenuItem({
|
||||
label: deleteLabel,
|
||||
click: this.deleteNote
|
||||
}))
|
||||
menu.append(new MenuItem({
|
||||
label: cloneNote,
|
||||
click: this.cloneNote.bind(this)
|
||||
}))
|
||||
menu.append(new MenuItem({
|
||||
label: copyNoteLink,
|
||||
click: this.copyNoteLink(note)
|
||||
}))
|
||||
if (note.type === 'MARKDOWN_NOTE') {
|
||||
if (note.blog && note.blog.blogLink && note.blog.blogId) {
|
||||
menu.append(new MenuItem({
|
||||
label: deleteLabel,
|
||||
click: this.deleteNote
|
||||
}))
|
||||
} else {
|
||||
if (!location.pathname.match(/\/starred/)) {
|
||||
menu.append(new MenuItem({
|
||||
label: updateLabel,
|
||||
click: this.publishMarkdown.bind(this)
|
||||
}))
|
||||
menu.append(new MenuItem({
|
||||
label: openBlogLabel,
|
||||
click: () => this.openBlog.bind(this)(note)
|
||||
}))
|
||||
} else {
|
||||
menu.append(new MenuItem({
|
||||
label: publishLabel,
|
||||
click: this.publishMarkdown.bind(this)
|
||||
label: pinLabel,
|
||||
click: this.pinToTop
|
||||
}))
|
||||
}
|
||||
menu.append(new MenuItem({
|
||||
label: deleteLabel,
|
||||
click: this.deleteNote
|
||||
}))
|
||||
menu.append(new MenuItem({
|
||||
label: cloneNote,
|
||||
click: this.cloneNote.bind(this)
|
||||
}))
|
||||
menu.append(new MenuItem({
|
||||
label: copyNoteLink,
|
||||
click: this.copyNoteLink(note)
|
||||
}))
|
||||
if (note.type === 'MARKDOWN_NOTE') {
|
||||
if (note.blog && note.blog.blogLink && note.blog.blogId) {
|
||||
menu.append(new MenuItem({
|
||||
label: updateLabel,
|
||||
click: this.publishMarkdown.bind(this)
|
||||
}))
|
||||
menu.append(new MenuItem({
|
||||
label: openBlogLabel,
|
||||
click: () => this.openBlog.bind(this)(note)
|
||||
}))
|
||||
} else {
|
||||
menu.append(new MenuItem({
|
||||
label: publishLabel,
|
||||
click: this.publishMarkdown.bind(this)
|
||||
}))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
menu.popup()
|
||||
}
|
||||
|
||||
@@ -580,16 +586,11 @@ class NoteList extends React.Component {
|
||||
const notes = this.notes.map((note) => Object.assign({}, note))
|
||||
const selectedNotes = findNotesByKeys(notes, selectedNoteKeys)
|
||||
const firstNote = selectedNotes[0]
|
||||
const { confirmDeletion } = this.props.config.ui
|
||||
|
||||
if (firstNote.isTrashed) {
|
||||
const noteExp = selectedNotes.length > 1 ? 'notes' : 'note'
|
||||
const dialogueButtonIndex = dialog.showMessageBox(remote.getCurrentWindow(), {
|
||||
type: 'warning',
|
||||
message: i18n.__('Confirm note deletion'),
|
||||
detail: `This will permanently remove ${selectedNotes.length} ${noteExp}.`,
|
||||
buttons: [i18n.__('Confirm'), i18n.__('Cancel')]
|
||||
})
|
||||
if (dialogueButtonIndex === 1) return
|
||||
if (!confirmDeleteNote(confirmDeletion, true)) return
|
||||
|
||||
Promise.all(
|
||||
selectedNotes.map((note) => {
|
||||
return dataApi
|
||||
@@ -610,6 +611,8 @@ class NoteList extends React.Component {
|
||||
})
|
||||
console.log('Notes were all deleted')
|
||||
} else {
|
||||
if (!confirmDeleteNote(confirmDeletion, false)) return
|
||||
|
||||
Promise.all(
|
||||
selectedNotes.map((note) => {
|
||||
note.isTrashed = true
|
||||
|
||||
@@ -30,11 +30,33 @@
|
||||
display flex
|
||||
flex-direction column
|
||||
|
||||
.tag-title
|
||||
padding-left 15px
|
||||
padding-bottom 13px
|
||||
p
|
||||
color $ui-button-default-color
|
||||
.tag-control
|
||||
display flex
|
||||
height 30px
|
||||
line-height 25px
|
||||
overflow hidden
|
||||
.tag-control-title
|
||||
padding-left 15px
|
||||
padding-bottom 13px
|
||||
flex 1
|
||||
p
|
||||
color $ui-button-default-color
|
||||
.tag-control-sortTagsBy
|
||||
user-select none
|
||||
font-size 12px
|
||||
color $ui-inactive-text-color
|
||||
margin-left 12px
|
||||
margin-right 12px
|
||||
.tag-control-sortTagsBy-select
|
||||
appearance: none;
|
||||
margin-left 5px
|
||||
color $ui-inactive-text-color
|
||||
padding 0
|
||||
border none
|
||||
background-color transparent
|
||||
outline none
|
||||
cursor pointer
|
||||
font-size 12px
|
||||
|
||||
.tagList
|
||||
overflow-y auto
|
||||
|
||||
@@ -82,7 +82,7 @@ class SideNav extends React.Component {
|
||||
}
|
||||
|
||||
SideNavComponent (isFolded, storageList) {
|
||||
const { location, data } = this.props
|
||||
const { location, data, config } = this.props
|
||||
|
||||
const isHomeActive = !!location.pathname.match(/^\/home$/)
|
||||
const isStarredActive = !!location.pathname.match(/^\/starred$/)
|
||||
@@ -108,15 +108,30 @@ class SideNav extends React.Component {
|
||||
handleFilterButtonContextMenu={this.handleFilterButtonContextMenu.bind(this)}
|
||||
/>
|
||||
|
||||
<StorageList storageList={storageList} />
|
||||
<StorageList storageList={storageList} isFolded={isFolded} />
|
||||
<NavToggleButton isFolded={isFolded} handleToggleButtonClick={this.handleToggleButtonClick.bind(this)} />
|
||||
</div>
|
||||
)
|
||||
} else {
|
||||
component = (
|
||||
<div styleName='tabBody'>
|
||||
<div styleName='tag-title'>
|
||||
<p>{i18n.__('Tags')}</p>
|
||||
<div styleName='tag-control'>
|
||||
<div styleName='tag-control-title'>
|
||||
<p>{i18n.__('Tags')}</p>
|
||||
</div>
|
||||
<div styleName='tag-control-sortTagsBy'>
|
||||
<i className='fa fa-angle-down' />
|
||||
<select styleName='tag-control-sortTagsBy-select'
|
||||
title={i18n.__('Select filter mode')}
|
||||
value={config.sortTagsBy}
|
||||
onChange={(e) => this.handleSortTagsByChange(e)}
|
||||
>
|
||||
<option title='Sort alphabetically'
|
||||
value='ALPHABETICAL'>{i18n.__('Alphabetically')}</option>
|
||||
<option title='Sort by update time'
|
||||
value='COUNTER'>{i18n.__('Counter')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div styleName='tagList'>
|
||||
{this.tagListComponent(data)}
|
||||
@@ -129,17 +144,21 @@ class SideNav extends React.Component {
|
||||
}
|
||||
|
||||
tagListComponent () {
|
||||
const { data, location } = this.props
|
||||
const tagList = _.sortBy(data.tagNoteMap.map((tag, name) => {
|
||||
return { name, size: tag.size }
|
||||
}), ['name'])
|
||||
const { data, location, config } = this.props
|
||||
let tagList = _.sortBy(data.tagNoteMap.map(
|
||||
(tag, name) => ({name, size: tag.size})),
|
||||
['name']
|
||||
)
|
||||
if (config.sortTagsBy === 'COUNTER') {
|
||||
tagList = _.sortBy(tagList, item => (0 - item.size))
|
||||
}
|
||||
return (
|
||||
tagList.map(tag => {
|
||||
return (
|
||||
<TagListItem
|
||||
name={tag.name}
|
||||
handleClickTagListItem={this.handleClickTagListItem.bind(this)}
|
||||
isActive={this.getTagActive(location.pathname, tag)}
|
||||
isActive={this.getTagActive(location.pathname, tag.name)}
|
||||
key={tag.name}
|
||||
count={tag.size}
|
||||
/>
|
||||
@@ -159,6 +178,20 @@ class SideNav extends React.Component {
|
||||
router.push(`/tags/${name}`)
|
||||
}
|
||||
|
||||
handleSortTagsByChange (e) {
|
||||
const { dispatch } = this.props
|
||||
|
||||
const config = {
|
||||
sortTagsBy: e.target.value
|
||||
}
|
||||
|
||||
ConfigManager.set(config)
|
||||
dispatch({
|
||||
type: 'SET_CONFIG',
|
||||
config
|
||||
})
|
||||
}
|
||||
|
||||
emptyTrash (entries) {
|
||||
const { dispatch } = this.props
|
||||
const deletionPromises = entries.map((note) => {
|
||||
|
||||
@@ -28,6 +28,14 @@ class TopBar extends React.Component {
|
||||
}
|
||||
|
||||
componentDidMount () {
|
||||
const { params } = this.props
|
||||
const searchWord = params.searchword
|
||||
if (searchWord !== undefined) {
|
||||
this.setState({
|
||||
search: searchWord,
|
||||
isSearching: true
|
||||
})
|
||||
}
|
||||
ee.on('top:focus-search', this.focusSearchHandler)
|
||||
ee.on('code:init', this.codeInitHandler)
|
||||
}
|
||||
@@ -97,9 +105,10 @@ class TopBar extends React.Component {
|
||||
this.setState({
|
||||
isConfirmTranslation: true
|
||||
})
|
||||
router.push('/searched')
|
||||
const keyword = this.refs.searchInput.value
|
||||
router.push(`/searched/${encodeURIComponent(keyword)}`)
|
||||
this.setState({
|
||||
search: this.refs.searchInput.value
|
||||
search: keyword
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -108,7 +117,7 @@ class TopBar extends React.Component {
|
||||
const { router } = this.context
|
||||
const keyword = this.refs.searchInput.value
|
||||
if (this.state.isAlphabet || this.state.isConfirmTranslation) {
|
||||
router.push('/searched')
|
||||
router.push(`/searched/${encodeURIComponent(keyword)}`)
|
||||
} else {
|
||||
e.preventDefault()
|
||||
}
|
||||
|
||||
@@ -108,6 +108,21 @@ body[data-theme="dark"]
|
||||
background #B1D7FE
|
||||
::selection
|
||||
background #B1D7FE
|
||||
.CodeMirror-foldmarker
|
||||
font-family: arial
|
||||
|
||||
.CodeMirror-foldgutter
|
||||
width: .7em
|
||||
|
||||
.CodeMirror-foldgutter-open,
|
||||
.CodeMirror-foldgutter-folded
|
||||
cursor: pointer
|
||||
|
||||
.CodeMirror-foldgutter-open:after
|
||||
content: "\25BE"
|
||||
|
||||
.CodeMirror-foldgutter-folded:after
|
||||
content: "\25B8"
|
||||
|
||||
.sortableItemHelper
|
||||
z-index modalZIndex + 5
|
||||
|
||||
@@ -24,6 +24,45 @@ document.addEventListener('dragover', function (e) {
|
||||
e.stopPropagation()
|
||||
})
|
||||
|
||||
// prevent menu from popup when alt pressed
|
||||
// but still able to toggle menu when only alt is pressed
|
||||
let isAltPressing = false
|
||||
let isAltWithMouse = false
|
||||
let isAltWithOtherKey = false
|
||||
let isOtherKey = false
|
||||
|
||||
document.addEventListener('keydown', function (e) {
|
||||
if (e.key === 'Alt') {
|
||||
isAltPressing = true
|
||||
if (isOtherKey) {
|
||||
isAltWithOtherKey = true
|
||||
}
|
||||
} else {
|
||||
if (isAltPressing) {
|
||||
isAltWithOtherKey = true
|
||||
}
|
||||
isOtherKey = true
|
||||
}
|
||||
})
|
||||
|
||||
document.addEventListener('mousedown', function (e) {
|
||||
if (isAltPressing) {
|
||||
isAltWithMouse = true
|
||||
}
|
||||
})
|
||||
|
||||
document.addEventListener('keyup', function (e) {
|
||||
if (e.key === 'Alt') {
|
||||
if (isAltWithMouse || isAltWithOtherKey) {
|
||||
e.preventDefault()
|
||||
}
|
||||
isAltWithMouse = false
|
||||
isAltWithOtherKey = false
|
||||
isAltPressing = false
|
||||
isOtherKey = false
|
||||
}
|
||||
})
|
||||
|
||||
document.addEventListener('click', function (e) {
|
||||
const className = e.target.className
|
||||
if (!className && typeof (className) !== 'string') return
|
||||
@@ -64,7 +103,9 @@ ReactDOM.render((
|
||||
<IndexRedirect to='/home' />
|
||||
<Route path='home' />
|
||||
<Route path='starred' />
|
||||
<Route path='searched' />
|
||||
<Route path='searched'>
|
||||
<Route path=':searchword' />
|
||||
</Route>
|
||||
<Route path='trashed' />
|
||||
<Route path='alltags' />
|
||||
<Route path='tags'>
|
||||
|
||||
@@ -16,6 +16,7 @@ export const DEFAULT_CONFIG = {
|
||||
listWidth: 280,
|
||||
navWidth: 200,
|
||||
sortBy: 'UPDATED_AT', // 'CREATED_AT', 'UPDATED_AT', 'APLHABETICAL'
|
||||
sortTagsBy: 'ALPHABETICAL', // 'ALPHABETICAL', 'COUNTER'
|
||||
listStyle: 'DEFAULT', // 'DEFAULT', 'SMALL'
|
||||
amaEnabled: true,
|
||||
hotkey: {
|
||||
@@ -138,37 +139,7 @@ function set (updates) {
|
||||
document.body.setAttribute('data-theme', 'default')
|
||||
}
|
||||
|
||||
if (newConfig.ui.language === 'sq') {
|
||||
i18n.setLocale('sq')
|
||||
} else if (newConfig.ui.language === 'zh-CN') {
|
||||
i18n.setLocale('zh-CN')
|
||||
} else if (newConfig.ui.language === 'zh-TW') {
|
||||
i18n.setLocale('zh-TW')
|
||||
} else if (newConfig.ui.language === 'da') {
|
||||
i18n.setLocale('da')
|
||||
} else if (newConfig.ui.language === 'fr') {
|
||||
i18n.setLocale('fr')
|
||||
} else if (newConfig.ui.language === 'de') {
|
||||
i18n.setLocale('de')
|
||||
} else if (newConfig.ui.language === 'hu') {
|
||||
i18n.setLocale('hu')
|
||||
} else if (newConfig.ui.language === 'ja') {
|
||||
i18n.setLocale('ja')
|
||||
} else if (newConfig.ui.language === 'ko') {
|
||||
i18n.setLocale('ko')
|
||||
} else if (newConfig.ui.language === 'no') {
|
||||
i18n.setLocale('no')
|
||||
} else if (newConfig.ui.language === 'pl') {
|
||||
i18n.setLocale('pl')
|
||||
} else if (newConfig.ui.language === 'pt') {
|
||||
i18n.setLocale('pt')
|
||||
} else if (newConfig.ui.language === 'ru') {
|
||||
i18n.setLocale('ru')
|
||||
} else if (newConfig.ui.language === 'es-ES') {
|
||||
i18n.setLocale('es-ES')
|
||||
} else {
|
||||
i18n.setLocale('en')
|
||||
}
|
||||
i18n.setLocale(newConfig.ui.language)
|
||||
|
||||
let editorTheme = document.getElementById('editorTheme')
|
||||
if (editorTheme == null) {
|
||||
|
||||
@@ -27,9 +27,12 @@ function resolveStorageNotes (storage) {
|
||||
data.storage = storage.key
|
||||
return data
|
||||
} catch (err) {
|
||||
console.error(notePath)
|
||||
console.error(`error on note path: ${notePath}, error: ${err}`)
|
||||
}
|
||||
})
|
||||
.filter(function filterOnlyNoteObject (noteObj) {
|
||||
return typeof noteObj === 'object'
|
||||
})
|
||||
|
||||
return Promise.resolve(notes)
|
||||
}
|
||||
|
||||
@@ -194,9 +194,10 @@ class UiTab extends React.Component {
|
||||
<option value='ko'>{i18n.__('Korean')}</option>
|
||||
<option value='no'>{i18n.__('Norwegian')}</option>
|
||||
<option value='pl'>{i18n.__('Polish')}</option>
|
||||
<option value='pt'>{i18n.__('Portuguese')}</option>
|
||||
<option value='pt-BR'>{i18n.__('Portuguese (Brazil)')}</option>
|
||||
<option value='pt-PT'>{i18n.__('Portuguese (Portugal)')}</option>
|
||||
<option value='ru'>{i18n.__('Russian')}</option>
|
||||
<option value='es'>{i18n.__('Spanish')}</option>
|
||||
<option value='es-ES'>{i18n.__('Spanish')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user