React Notepad App
Starting point for creating JSFiddles with React. This uses React with Addons.
by justindeal
HTML
<script src=" https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.3.0/lodash.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.12.2/JSXTransformer.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.12.2/react-with-addons.js"></script>
<script src="https://facebook.github.io/react/js/jsfiddle-integration.js"></script>
CSS
.note-list {
border-bottom: solid 1px gray;
}
.note-summary {
border-top: solid 1px gray;
}
.note-selected {
font-weight: bold;
}
JavaScript 1.7
var notepad = {
notes: [],
selectedId: null
};
var nextNodeId = 1;
var onAddNote = function () {
var note = {id: nextNodeId, content: ''};
nextNodeId++;
notepad.notes.push(note);
notepad.selectedId = note.id;
onChange();
};
var onChangeNote = function (id, value) {
var note = _.find(notepad.notes, function (note) {
return note.id === id;
});
if (note) {
note.content = value;
}
onChange();
};
var onDeleteNote = function (id) {
var note = _.find(notepad.notes, function (note) {
return note.id === id;
});
if (note) {
notepad.notes = notepad.notes.filter(function (note) {
return note.id !== id;
});
}
if (notepad.selectedId === id) {
notepad.selectedId = null;
}
onChange();
};
var onSelectNote = function (id) {
notepad.selectedId = id;
onChange();
};
var NoteSummary = React.createClass({
render: function () {
var note = this.props.note;
var title = note.content;
if (title.indexOf('\n') > 0) {
title = note.content.substring(0, note.content.indexOf('\n'));
}
if (!title) {
title = 'Untitled';
}
return (
<div className="note-summary">{title}</div>
);
}
});
var NotesList = React.createClass({
render: function () {
var notepad = this.props.notepad;
var notes = notepad.notes;
return (
<div className="note-list">
{
notes.map(function (note) {
return (
<div key={note.id} className={notepad.selectedId === note.id ? 'note-selected' : ''}>
<a href="#" onClick={this.props.onSelectNote.bind(null, note.id)}>
<NoteSummary note={note}/>
</a>
</div>
...