diff --git a/browser/lib/date-formatter.js b/browser/lib/date-formatter.js index 4f6a4002a..8f74fe4d8 100644 --- a/browser/lib/date-formatter.js +++ b/browser/lib/date-formatter.js @@ -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.') diff --git a/browser/main/Detail/InfoButton.js b/browser/main/Detail/InfoButton.js new file mode 100644 index 000000000..ce9f35de2 --- /dev/null +++ b/browser/main/Detail/InfoButton.js @@ -0,0 +1,19 @@ +import React, { PropTypes } from 'react' +import CSSModules from 'browser/lib/CSSModules' +import styles from './InfoButton.styl' + +const InfoButton = ({ + onClick +}) => ( + +) + +InfoButton.propTypes = { + onClick: PropTypes.func.isRequired +} + +export default CSSModules(InfoButton, styles) diff --git a/browser/main/Detail/InfoButton.styl b/browser/main/Detail/InfoButton.styl new file mode 100644 index 000000000..41449cfb5 --- /dev/null +++ b/browser/main/Detail/InfoButton.styl @@ -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() diff --git a/browser/main/Detail/InfoPanel.js b/browser/main/Detail/InfoPanel.js new file mode 100644 index 000000000..5a1437f7d --- /dev/null +++ b/browser/main/Detail/InfoPanel.js @@ -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 +}) => ( +
+
+
+ Storage +
+
+ {storageName} +
+
+
+
+ Folder +
+
+ {folderName} +
+
+
+
+ CreatedAt +
+
+ {createdAt} +
+
+
+
+ UpdatedAt +
+
+ {updatedAt} +
+
+
+
+ Note Link +
+
+ { e.target.select() }} /> +
+
+ +
+
+) + +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) diff --git a/browser/main/Detail/InfoPanel.styl b/browser/main/Detail/InfoPanel.styl new file mode 100644 index 000000000..08b22bd4a --- /dev/null +++ b/browser/main/Detail/InfoPanel.styl @@ -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 diff --git a/browser/main/Detail/LastUpdatedString.js b/browser/main/Detail/LastUpdatedString.js index eb67fa80e..3eae431ff 100644 --- a/browser/main/Detail/LastUpdatedString.js +++ b/browser/main/Detail/LastUpdatedString.js @@ -2,7 +2,7 @@ * @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' @@ -10,7 +10,7 @@ const LastUpdatedString = ({ date }) => { let text = '' try { - text = `Last updated at ${getLastUpdated(date)}` + text = `Last updated at ${formatDate(date)}` } catch (e) { text = '' } diff --git a/browser/main/Detail/MarkdownNoteDetail.js b/browser/main/Detail/MarkdownNoteDetail.js index c8d9f8f46..e5d35a285 100644 --- a/browser/main/Detail/MarkdownNoteDetail.js +++ b/browser/main/Detail/MarkdownNoteDetail.js @@ -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 @@ -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 (
+ this.handleInfoButtonClick(e)} + /> +
diff --git a/browser/main/index.js b/browser/main/index.js index 455913281..c8a72e9c0 100644 --- a/browser/main/index.js +++ b/browser/main/index.js @@ -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) diff --git a/tests/date-formatter-test.js b/tests/date-formatter-test.js index cb8770a18..265ca4c4d 100644 --- a/tests/date-formatter-test.js +++ b/tests/date-formatter-test.js @@ -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.' ) })