Skip to content

Commit

Permalink
Merge pull request #2497 from daiyam/delete-tag
Browse files Browse the repository at this point in the history
delete tag through context menu
  • Loading branch information
Rokt33r authored Oct 23, 2018
2 parents 1ecf1e0 + 7484f6e commit 6e8b370
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 4 deletions.
4 changes: 2 additions & 2 deletions browser/components/TagListItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import CSSModules from 'browser/lib/CSSModules'
* @param {bool} isRelated
*/

const TagListItem = ({name, handleClickTagListItem, handleClickNarrowToTag, isActive, isRelated, count}) => (
<div styleName='tagList-itemContainer'>
const TagListItem = ({name, handleClickTagListItem, handleClickNarrowToTag, handleContextMenu, isActive, isRelated, count}) => (
<div styleName='tagList-itemContainer' onContextMenu={e => handleContextMenu(e, name)}>
{isRelated
? <button styleName={isActive ? 'tagList-itemNarrow-active' : 'tagList-itemNarrow'} onClick={() => handleClickNarrowToTag(name)}>
<i className={isActive ? 'fa fa-minus-circle' : 'fa fa-plus-circle'} />
Expand Down
4 changes: 3 additions & 1 deletion browser/main/Detail/MarkdownNoteDetail.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ class MarkdownNoteDetail extends React.Component {
}

componentWillReceiveProps (nextProps) {
if (nextProps.note.key !== this.props.note.key && !this.state.isMovingNote) {
const isNewNote = nextProps.note.key !== this.props.note.key
const hasDeletedTags = nextProps.note.tags.length < this.props.note.tags.length
if (!this.state.isMovingNote && (isNewNote || hasDeletedTags)) {
if (this.saveQueue != null) this.saveNow()
this.setState({
note: Object.assign({}, nextProps.note)
Expand Down
2 changes: 1 addition & 1 deletion browser/main/Main.js
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ class Main extends React.Component {
onMouseUp={e => this.handleMouseUp(e)}
>
<SideNav
{..._.pick(this.props, ['dispatch', 'data', 'config', 'location'])}
{..._.pick(this.props, ['dispatch', 'data', 'config', 'params', 'location'])}
width={this.state.navWidth}
/>
{!config.isSideNavFolded &&
Expand Down
59 changes: 59 additions & 0 deletions browser/main/SideNav/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import TagButton from './TagButton'
import {SortableContainer} from 'react-sortable-hoc'
import i18n from 'browser/lib/i18n'
import context from 'browser/lib/context'
import { remote } from 'electron'

class SideNav extends React.Component {
// TODO: should not use electron stuff v0.7
Expand All @@ -30,6 +31,52 @@ class SideNav extends React.Component {
EventEmitter.off('side:preferences', this.handleMenuButtonClick)
}

deleteTag (tag) {
const selectedButton = remote.dialog.showMessageBox(remote.getCurrentWindow(), {
ype: 'warning',
message: i18n.__('Confirm tag deletion'),
detail: i18n.__('This will permanently remove this tag.'),
buttons: [i18n.__('Confirm'), i18n.__('Cancel')]
})

if (selectedButton === 0) {
const { data, dispatch, location, params } = this.props

const notes = data.noteMap
.map(note => note)
.filter(note => note.tags.indexOf(tag) !== -1)
.map(note => {
note = Object.assign({}, note)
note.tags = note.tags.slice()

note.tags.splice(note.tags.indexOf(tag), 1)

return note
})

Promise
.all(notes.map(note => dataApi.updateNote(note.storage, note.key, note)))
.then(updatedNotes => {
updatedNotes.forEach(note => {
dispatch({
type: 'UPDATE_NOTE',
note
})
})

if (location.pathname.match('/tags')) {
const tags = params.tagname.split(' ')
const index = tags.indexOf(tag)
if (index !== -1) {
tags.splice(index, 1)

this.context.router.push(`/tags/${tags.map(tag => encodeURIComponent(tag)).join(' ')}`)
}
}
})
}
}

handleMenuButtonClick (e) {
openModal(PreferencesModal)
}
Expand All @@ -44,6 +91,17 @@ class SideNav extends React.Component {
router.push('/starred')
}

handleTagContextMenu (e, tag) {
const menu = []

menu.push({
label: i18n.__('Delete Tag'),
click: this.deleteTag.bind(this, tag)
})

context.popup(menu)
}

handleToggleButtonClick (e) {
const { dispatch, config } = this.props

Expand Down Expand Up @@ -165,6 +223,7 @@ class SideNav extends React.Component {
name={tag.name}
handleClickTagListItem={this.handleClickTagListItem.bind(this)}
handleClickNarrowToTag={this.handleClickNarrowToTag.bind(this)}
handleContextMenu={this.handleTagContextMenu.bind(this)}
isActive={this.getTagActive(location.pathname, tag.name)}
isRelated={tag.related}
key={tag.name}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
exports[`TagListItem renders correctly 1`] = `
<div
className="tagList-itemContainer"
onContextMenu={[Function]}
>
<div
className="tagList-itemNarrow"
Expand Down

0 comments on commit 6e8b370

Please sign in to comment.