Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion browser/lib/date-formatter.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import moment from 'moment'
* @param {mixed}
* @return {string}
*/
export function getLastUpdated (date) {
export function formatDate (date) {
const m = moment(date)
if (!m.isValid()) {
throw Error('Invalid argument.')
Expand Down
19 changes: 19 additions & 0 deletions browser/main/Detail/InfoButton.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import React, { PropTypes } from 'react'
import CSSModules from 'browser/lib/CSSModules'
import styles from './InfoButton.styl'

const InfoButton = ({
onClick
}) => (
<button styleName='control-infoButton'
onClick={onClick}
>
<i className='fa fa-info-circle infoButton' styleName='info-button' />
</button>
)

InfoButton.propTypes = {
onClick: PropTypes.func.isRequired
}

export default CSSModules(InfoButton, styles)
18 changes: 18 additions & 0 deletions browser/main/Detail/InfoButton.styl
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.control-infoButton
float right
topBarButtonLight()

.control-infoPanel
position fixed
pointer-events none
top 50px
z-index 200
padding 5px
line-height normal
border-radius 2px
opacity 0
transition 0.1s

body[data-theme="dark"]
.control-infoButton
topBarButtonDark()
62 changes: 62 additions & 0 deletions browser/main/Detail/InfoPanel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import React, { PropTypes } from 'react'
import CSSModules from 'browser/lib/CSSModules'
import styles from './InfoPanel.styl'

const InfoPanel = ({
storageName, folderName, noteKey, updatedAt, createdAt
}) => (
<div className='infoPanel' styleName='control-infoButton-panel' style={{display: 'none'}}>
<div styleName='group-section'>
<div styleName='group-section-label'>
Storage
</div>
<div styleName='group-section-control'>
{storageName}
</div>
</div>
<div styleName='group-section'>
<div styleName='group-section-label'>
Folder
</div>
<div styleName='group-section-control'>
{folderName}
</div>
</div>
<div styleName='group-section'>
<div styleName='group-section-label'>
CreatedAt
</div>
<div styleName='group-section-control'>
{createdAt}
</div>
</div>
<div styleName='group-section'>
<div styleName='group-section-label'>
UpdatedAt
</div>
<div styleName='group-section-control'>
{updatedAt}
</div>
</div>
<div styleName='group-section'>
<div styleName='group-section-label'>
Note Link
</div>
<div styleName='group-section-control'>
<input value={noteKey} onClick={(e) => { e.target.select() }} />
</div>
</div>

<div styleName='group-export' />
</div>
)

InfoPanel.propTypes = {
storageName: PropTypes.string.isRequired,
folderName: PropTypes.string.isRequired,
noteKey: PropTypes.string.isRequired,
updatedAt: PropTypes.string.isRequired,
createdAt: PropTypes.string.isRequired
}

export default CSSModules(InfoPanel, styles)
44 changes: 44 additions & 0 deletions browser/main/Detail/InfoPanel.styl
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
.control-infoPanel
position fixed
pointer-events none
top 50px
z-index 200
padding 5px
line-height normal
border-radius 2px
opacity 0
transition 0.1s

.control-infoButton-panel
z-index 200
margin-top 60px
margin-left -160px
position absolute
padding 10px
padding-left 15px
width 300px
background-color #EAEAEA
border 1px solid #d0d0d0
box-shadow 0 0 1px rgba(76,86,103,0.15), 0 2px 18px rgba(31,37,50,0.22)

.group-section
display flex
line-height 30px
font-size 12px

.group-section-label
width 70px
height 20px
text-align left
margin-right 30px
font-size 11px
color #939395

.group-section-control
flex 1

body[data-theme="dark"]
.control-infoButton-panel
background-color #3a404c
border 1px solid #474f5c
color #ffffff
4 changes: 2 additions & 2 deletions browser/main/Detail/LastUpdatedString.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@
* @fileoverview Component for show updated date of the detail.
*/
import React, { PropTypes } from 'react'
import { getLastUpdated } from 'browser/lib/date-formatter'
import { formatDate } from 'browser/lib/date-formatter'
import CSSModules from 'browser/lib/CSSModules'
import styles from './LastUpdatedString.styl'

const LastUpdatedString = ({ date }) => {
let text = ''

try {
text = `Last updated at ${getLastUpdated(date)}`
text = `Last updated at ${formatDate(date)}`
} catch (e) {
text = ''
}
Expand Down
33 changes: 32 additions & 1 deletion browser/main/Detail/MarkdownNoteDetail.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ import _ from 'lodash'
import { findNoteTitle } from 'browser/lib/findNoteTitle'
import AwsMobileAnalyticsConfig from 'browser/main/lib/AwsMobileAnalyticsConfig'
import TrashButton from './TrashButton'
import InfoButton from './InfoButton'
import InfoPanel from './InfoPanel'
import { formatDate } from 'browser/lib/date-formatter'

const electron = require('electron')
const { remote } = electron
Expand Down Expand Up @@ -229,9 +232,27 @@ class MarkdownNoteDetail extends React.Component {
this.focus()
}

handleInfoButtonClick (e) {
const infoPanel = document.querySelector('.infoPanel')
if (infoPanel.style) infoPanel.style.display = infoPanel.style.display === 'none' ? 'inline' : 'none'
}

render () {
let { data, config } = this.props
let { data, config, location } = this.props
let { note } = this.state
let storageKey = note.storage
let folderKey = note.folder

let options = []
data.storageMap.forEach((storage, index) => {
storage.folders.forEach((folder) => {
options.push({
storage: storage,
folder: folder
})
})
})
let currentOption = options.filter((option) => option.storage.key === storageKey && option.folder.key === folderKey)[0]

return (
<div className='NoteDetail'
Expand Down Expand Up @@ -287,6 +308,16 @@ class MarkdownNoteDetail extends React.Component {
>
<i className='fa fa-arrows-alt' styleName='fullScreen-button' />
</button>
<InfoButton
onClick={(e) => this.handleInfoButtonClick(e)}
/>
<InfoPanel
storageName={currentOption.storage.name}
folderName={currentOption.folder.name}
noteKey={location.query.key}
updatedAt={formatDate(note.updatedAt)}
createdAt={formatDate(note.createdAt)}
/>
</div>
</div>

Expand Down
8 changes: 8 additions & 0 deletions browser/main/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ document.addEventListener('dragover', function (e) {
e.stopPropagation()
})

document.addEventListener('click', function (e) {
const isInfoButton = e.target.className.includes('infoButton')
const isInfoPanel = e.target.offsetParent.className.includes('infoPanel')
if (isInfoButton || isInfoPanel) return
const infoPanel = document.querySelector('.infoPanel')
if (infoPanel) infoPanel.style.display = 'none'
})

let el = document.getElementById('content')
const history = syncHistoryWithStore(hashHistory, store)

Expand Down
4 changes: 2 additions & 2 deletions tests/date-formatter-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
* @fileoverview Unit test for browser/lib/date-formatter.js
*/
const test = require('ava')
const { getLastUpdated } = require('browser/lib/date-formatter')
const { formatDate } = require('browser/lib/date-formatter')

test(t => {
t.throws(
() => getLastUpdated('invalid argument'),
() => formatDate('invalid argument'),
'Invalid argument.'
)
})