import React from 'react' import ReactDOM from 'react-dom' import mui from 'material-ui' import getMuiTheme from 'material-ui/lib/styles/getMuiTheme' import styles from 'material-ui/lib/styles' import List from 'material-ui/lib/lists/list' import ListItem from 'material-ui/lib/lists/list-item' import ActionGrade from 'material-ui/lib/svg-icons/action/grade' import NoteBook from 'material-ui/lib/svg-icons/action/class' import History from 'material-ui/lib/svg-icons/action/history' import AddCircleOutline from 'material-ui/lib/svg-icons/content/add-circle-outline' import Folder from 'material-ui/lib/svg-icons/file/folder' import Edit from 'material-ui/lib/svg-icons/editor/mode-edit' import Delete from 'material-ui/lib/svg-icons/action/delete' import Divider from 'material-ui/lib/divider' import SelectableList from 'SelectableList' import uuid from 'node-uuid' import path from 'path-extra' import * as utils from 'utils' import glob from 'glob' import fs from 'fs' import mkdirp from 'mkdirp' import jsfile from 'jsonfile' import rmdir from 'rimraf' const colors = styles.Colors String.prototype.trunc = String.prototype.trunc || function(n){ return (this.length > n) ? this.substr(0, n-1)+'...' : this; }; const { AppBar, AppCanvas, FontIcon, IconButton, EnhancedButton, NavigationClose, FloatingActionButton, Menu, MenuItem, Mixins, RaisedButton, FlatButton, Popover, Badge, TextField, Dialog, Styles, LeftNav, Paper} = mui const DefaultRawTheme = Styles.LightRawTheme export default class LibraryNav extends React.Component { constructor(props, context){ super(props, context) this.state = { open: true, navItems: [ { 'name': 'Entries', 'icon': , 'notes': 10, 'clicked': this.props.entriesTapped || this.entriesTapped }, { 'name': 'Starred', 'icon': , 'notes': 1, 'clicked': this.props.starredTapped || this.starredTapped }, { 'name': 'Recents', 'icon': , 'notes': 10, 'clicked': this.props.recentsTapped || this.recentsTapped }, { 'name': 'Trash', 'icon': , 'notes': 0, 'clicked': this.props.trashTapped || this.trashTapped }, { 'name': 'All Notes', 'icon': , 'notes': 0, 'clicked': this.props.allNotesTapped || this.allNotesTapped }, ], notebooks: [ ] } this.getNotebooks() } getNotebooks = () => { var dataPath = utils.getAppDataPath() var notebooks = glob.sync(path.join(dataPath, '*.qvnotebook')) for(var i=0; i { let atitle = a.title.toLowerCase() let btitle = b.title.toLowerCase() if(atitle > btitle) return 1 if(atitle < btitle) return -1 return 0 }; sortNotebooks = (dontSet, func) => { this.state.notebooks.sort(this.compareNotebooks) if (!dontSet){ this.setState({notebooks: this.state.notebooks}, func) } }; static get childContextTypes(){ return {muiTheme: React.PropTypes.object} } getChildContext() { return { muiTheme: getMuiTheme(DefaultRawTheme) } } entriesTapped = (i, item, type, ev) => { }; starredTapped = (i, item, type, ev) => { }; recentsTapped = (i, item, type, ev) => { }; trashTapped = (i, item, type, ev) => { }; allNotesTapped = (i, item, type, ev) => { }; blank(){ } scrollToRenamedNotebook = (original) => { var newIndex = 0 for (var j = 0; j < this.state.notebooks.length; j++){ var n = this.state.notebooks[j] if (n == original){ newIndex = j this.refs.notebookList.setIndex(j, () => { var nbitem = $(ReactDOM.findDOMNode(this.refs[n.title+newIndex])) var cont = $('#notebook-list') var newPos = nbitem.offset().top - cont.offset().top + cont.scrollTop() - cont.height()/2; $('#notebook-list').animate({ scrollTop: newPos }) }) } } }; createNewNotebook = (callback) => { var nbUuid = uuid.v4().toUpperCase() var nbPath = utils.getNotebookPathFromUUID(nbUuid) var nb = { 'state': 'editing', 'title': '', 'uuid': nbUuid, 'path': nbPath, 'notes': 0 } mkdirp(nbPath, (err) => { if (callback){ callback(nb, err) } if(err){ console.log('There was an error creating the directory '+notePath) console.log(err) } else{ this.createNotebookMeta(notebook) } }) }; createNotebookMeta = (notebook) => { var notePath = utils.getNotebookPath(notebook) var meta = { 'name': notebook.title, 'uuid': notebook.uuid } var metaPath = path.join(notePath, 'meta.json') jsfile.writeFile(metaPath, meta, (err) => { if(err){ console.log(err) } }) }; newNotebookUnfocus = (i) => { var nb = this.state.notebooks[i] var tf = this.refs["textField"+i] var notebookName = tf.getValue() if (notebookName){ nb.title = notebookName nb.state = 'displaying' this.setState({notebooks: this.state.notebooks}) this.sortNotebooks(false, ()=>{ this.scrollToRenamedNotebook(nb) }) this.createNotebookMeta(nb) } else if(nb.title){ nb.state = 'displaying' this.setState({notebooks: this.state.notebooks}) } }; addNotebookTapped = () => { this.createNewNotebook((nb, err) => { var nbs = this.state.notebooks nbs.splice(0, 0, nb) this.setState({notebooks: nbs}, () => { this.refs['textField0'].focus() }) }) }; newNotebookTyped = (i) => { }; menuItemClicked = (i, ev) => { this.refs.notebookList.setIndex(-1) var item = this.state.navItems[i] var type = 'leftClick' var nativeEvent = ev.nativeEvent if(nativeEvent.button == 2){ //Right click type = 'rightClick' } item.clicked(i, item, type, ev) }; renameTapped = (i) => { var nbs = this.state.notebooks nbs[i].state = 'editing' this.setState({notebooks: nbs}, () => { this.refs['textField'+i].focus() }) this.props.closeContextMenu() } deleteTapped = (i) => { var nbs = this.state.notebooks var nb = nbs.splice(i, 1)[0] rmdir(nb.path, (err)=>{if(err){console.log(err)}}) this.setState({notebooks: nbs}) this.props.closeContextMenu() } contextMenuItems = (i) => { return [ } onTouchTap={this.renameTapped.bind(this, i)}/>, , } /> ] }; noteBookTapped = (i, ev) => { var nativeEvent = ev.nativeEvent if(nativeEvent.button == 2){ //Right click var x = nativeEvent.pageX var y = nativeEvent.pageY this.props.updateContextMenu(this.contextMenuItems(i)) this.props.openContextMenu(x, y) } this.refs.mainList.setIndex(-1) }; preventEventProp = (ev) => { ev.stopPropagation(); }; notebookList = () => { return (
{this.state.notebooks.map((notebook, i) =>{ var l = null if (notebook.state == 'editing'){ l = } rightIcon={}> } else{ l = } rightIcon={} /> } return l })}
) }; notebookIconTapped = (i, ev) => { ev.stopPropagation() }; render(){ return (
{this.state.navItems.map((item, i) => { return } value={i} onTouchTap={this.menuItemClicked.bind(this, i)} className="noselect"/>; })}
NoteBooks
}> {this.notebookList()} ) } }