From 1c7cba295173864593944dd781dc86ef6e67619d Mon Sep 17 00:00:00 2001 From: XGHeaven Date: Wed, 9 Aug 2017 10:50:54 +0800 Subject: [PATCH] add todo percentage in item list --- browser/components/NoteItem.js | 6 ++++ browser/components/NoteItem.styl | 1 + browser/components/NoteItemSimple.styl | 1 + browser/components/TodoProcess.js | 33 +++++++++++++++++++++ browser/components/TodoProcess.styl | 35 +++++++++++++++++++++++ browser/lib/getTodoState.js | 25 ++++++++++++++++ browser/main/Detail/MarkdownNoteDetail.js | 21 ++------------ 7 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 browser/components/TodoProcess.js create mode 100644 browser/components/TodoProcess.styl create mode 100644 browser/lib/getTodoState.js diff --git a/browser/components/NoteItem.js b/browser/components/NoteItem.js index a4e9ca48..b102d6f7 100644 --- a/browser/components/NoteItem.js +++ b/browser/components/NoteItem.js @@ -4,7 +4,9 @@ import React, { PropTypes } from 'react' import { isArray } from 'lodash' import CSSModules from 'browser/lib/CSSModules' +import { getTodoState } from 'browser/lib/getTodoState' import styles from './NoteItem.styl' +import TodoProcess from './TodoProcess' /** * @description Tag element component. @@ -76,6 +78,10 @@ const NoteItem = ({ isActive, note, dateDisplay, handleNoteClick, handleDragStar } + {note.type === 'MARKDOWN_NOTE' + ? + : '' + } ) diff --git a/browser/components/NoteItem.styl b/browser/components/NoteItem.styl index 12f8b193..ea84f7f4 100644 --- a/browser/components/NoteItem.styl +++ b/browser/components/NoteItem.styl @@ -39,6 +39,7 @@ $control-height = 30px .item-wrapper padding 15px 0 border-bottom $ui-border + position relative .item--active @extend .item diff --git a/browser/components/NoteItemSimple.styl b/browser/components/NoteItemSimple.styl index 15504384..2333353e 100644 --- a/browser/components/NoteItemSimple.styl +++ b/browser/components/NoteItemSimple.styl @@ -48,6 +48,7 @@ $control-height = 30px overflow ellipsis color $ui-inactive-text-color border-bottom $ui-border + position relative .item-simple-title-icon font-size 12px diff --git a/browser/components/TodoProcess.js b/browser/components/TodoProcess.js new file mode 100644 index 00000000..0d545948 --- /dev/null +++ b/browser/components/TodoProcess.js @@ -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 = ({ + todoState: { + total: totalTodo, + completed: completedTodo + } +}) => ( +
0 ? '' : 'none'}}> +
+ + {completedTodo} of {totalTodo} +
+
+
+
+
+) + +TodoProcess.propTypes = { + todoState: { + total: PropTypes.number.isRequired, + completed: PropTypes.number.isRequired + } +} + +export default CSSModules(TodoProcess, styles) diff --git a/browser/components/TodoProcess.styl b/browser/components/TodoProcess.styl new file mode 100644 index 00000000..a95fe422 --- /dev/null +++ b/browser/components/TodoProcess.styl @@ -0,0 +1,35 @@ +.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 + + +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%) diff --git a/browser/lib/getTodoState.js b/browser/lib/getTodoState.js new file mode 100644 index 00000000..f1b35232 --- /dev/null +++ b/browser/lib/getTodoState.js @@ -0,0 +1,25 @@ +export function getTodoState (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 = getTodoState(content) + return Math.floor(state.completed / state.total * 100) +} diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index 62114476..37452639 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -18,6 +18,7 @@ import TrashButton from './TrashButton' import InfoButton from './InfoButton' import InfoPanel from './InfoPanel' import { formatDate } from 'browser/lib/date-formatter' +import { getTodoPercentageOfCompleted } from 'browser/lib/getTodoState' const electron = require('electron') const { remote } = electron @@ -69,24 +70,6 @@ class MarkdownNoteDetail extends React.Component { 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) { let { note } = this.state @@ -321,7 +304,7 @@ class MarkdownNoteDetail extends React.Component { onChange={(e) => this.handleChange(e)} />