1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 17:56:25 +00:00

Merge pull request #776 from XGHeaven/master

add todo percentage in item list
This commit is contained in:
SuenagaRyota
2017-08-10 23:39:12 +09:00
committed by GitHub
7 changed files with 104 additions and 19 deletions

View File

@@ -4,7 +4,9 @@
import React, { PropTypes } from 'react' import React, { PropTypes } from 'react'
import { isArray } from 'lodash' import { isArray } from 'lodash'
import CSSModules from 'browser/lib/CSSModules' import CSSModules from 'browser/lib/CSSModules'
import { getTodoStatus } from 'browser/lib/getTodoStatus'
import styles from './NoteItem.styl' import styles from './NoteItem.styl'
import TodoProcess from './TodoProcess'
/** /**
* @description Tag element component. * @description Tag element component.
@@ -76,6 +78,10 @@ const NoteItem = ({ isActive, note, dateDisplay, handleNoteClick, handleDragStar
} }
</div> </div>
</div> </div>
{note.type === 'MARKDOWN_NOTE'
? <TodoProcess todoStatus={getTodoStatus(note.content)} />
: ''
}
</div> </div>
</div> </div>
) )

View File

@@ -39,6 +39,7 @@ $control-height = 30px
.item-wrapper .item-wrapper
padding 15px 0 padding 15px 0
border-bottom $ui-border border-bottom $ui-border
position relative
.item--active .item--active
@extend .item @extend .item

View File

@@ -48,6 +48,7 @@ $control-height = 30px
overflow ellipsis overflow ellipsis
color $ui-inactive-text-color color $ui-inactive-text-color
border-bottom $ui-border border-bottom $ui-border
position relative
.item-simple-title-icon .item-simple-title-icon
font-size 12px font-size 12px

View File

@@ -0,0 +1,33 @@
/**
* @fileoverview Percentage of todo achievement.
*/
import React, { PropTypes } from 'react'
import CSSModules from 'browser/lib/CSSModules'
import styles from './TodoProcess.styl'
const TodoProcess = ({
todoStatus: {
total: totalTodo,
completed: completedTodo
}
}) => (
<div styleName='todo-process' style={{display: totalTodo > 0 ? '' : 'none'}}>
<div styleName='todo-process-text'>
<i className='fa fa-fw fa-tasks' />
{completedTodo} of {totalTodo}
</div>
<div styleName='todo-process-bar'>
<div styleName='todo-process-bar--inner' style={{width: parseInt(completedTodo / totalTodo * 100) + '%'}} />
</div>
</div>
)
TodoProcess.propTypes = {
todoStatus: {
total: PropTypes.number.isRequired,
completed: PropTypes.number.isRequired
}
}
export default CSSModules(TodoProcess, styles)

View File

@@ -0,0 +1,36 @@
.todo-process
font-size 12px
display flex
.todo-process-text
display inline-block
padding-right 10px
white-space nowrap
text-overflow ellipsis
i
color grey
padding-right 5px
.todo-process-bar
display inline-block
margin auto
width 150px
height 5px
background-color #DADFE1
border-radius 2px
flex-grow 1
.todo-process-bar--inner
height 100%
background-color #6C7A89
transition 0.3s
body[data-theme="dark"]
.todo-process
color $ui-dark-text-color
.todo-process-bar
background-color #363A3D
.todo-process-bar--inner
background-color: alpha(#939395, 50%)

View File

@@ -0,0 +1,25 @@
export function getTodoStatus (content) {
let splitted = content.split('\n')
let numberOfTodo = 0
let numberOfCompletedTodo = 0
splitted.forEach((line) => {
let trimmedLine = line.trim()
if (trimmedLine.match(/^[\+\-\*] \[\s|x\] ./)) {
numberOfTodo++
}
if (trimmedLine.match(/^[\+\-\*] \[x\] ./)) {
numberOfCompletedTodo++
}
})
return {
total: numberOfTodo,
completed: numberOfCompletedTodo
}
}
export function getTodoPercentageOfCompleted (content) {
const state = getTodoStatus(content)
return Math.floor(state.completed / state.total * 100)
}

View File

@@ -19,6 +19,7 @@ import InfoButton from './InfoButton'
import InfoPanel from './InfoPanel' import InfoPanel from './InfoPanel'
import InfoPanelTrashed from './InfoPanelTrashed' import InfoPanelTrashed from './InfoPanelTrashed'
import { formatDate } from 'browser/lib/date-formatter' import { formatDate } from 'browser/lib/date-formatter'
import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoStatus'
const electron = require('electron') const electron = require('electron')
const { remote } = electron const { remote } = electron
@@ -70,24 +71,6 @@ class MarkdownNoteDetail extends React.Component {
ee.off('topbar:togglelockbutton', this.toggleLockButton) ee.off('topbar:togglelockbutton', this.toggleLockButton)
} }
getPercentageOfCompleteTodo (noteContent) {
let splitted = noteContent.split('\n')
let numberOfTodo = 0
let numberOfCompletedTodo = 0
splitted.forEach((line) => {
let trimmedLine = line.trim()
if (trimmedLine.match(/^[\+\-\*] \[\s|x\] ./)) {
numberOfTodo++
}
if (trimmedLine.match(/^[\+\-\*] \[x\] ./)) {
numberOfCompletedTodo++
}
})
return Math.floor(numberOfCompletedTodo / numberOfTodo * 100)
}
handleChange (e) { handleChange (e) {
let { note } = this.state let { note } = this.state
@@ -333,7 +316,7 @@ class MarkdownNoteDetail extends React.Component {
onChange={(e) => this.handleChange(e)} onChange={(e) => this.handleChange(e)}
/> />
<TodoListPercentage <TodoListPercentage
percentageOfTodo={this.getPercentageOfCompleteTodo(note.content)} percentageOfTodo={getTodoPercentageOfCompleted(note.content)}
/> />
</div> </div>
<div styleName='info-right'> <div styleName='info-right'>