jQuery: Filter notes on search input
by Peter Jang
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Notes</title>
<link rel="stylesheet" href="css/notes.css"></link>
<script
src="https://code.jquery.com/jquery-3.2.1.js"
integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE="
crossorigin="anonymous"></script>
<script src="js/notes.js" defer></script>
</head>
<body>
<div id="app">
<div class="toolbar">
<button class="toolbar-button toolbar-button-new">New</button>
<button class="toolbar-button toolbar-button-delete">Delete</button>
<input class="toolbar-search" type="text" placeholder="Search...">
</div>
<div class="note-container">
<div class="note-selectors">
</div>
<div class="note-editor">
<p class="note-editor-info">Timestamp here...</p>
<textarea class="note-editor-input">
First note...
Note text here...
</textarea>
</div>
</div>
</div>
</body>
</html>
CSS
/* RESET */
* {
margin: 0;
padding: 0;
border: 0;
outline: none;
box-sizing: border-box;
}
/* LAYOUT */
#app {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.toolbar {
padding: 0.5em;
}
.toolbar-button, .toolbar-search {
padding: inherit;
border-radius: 0.3em;
}
.toolbar-search {
float: right;
}
.note-container {
display: flex;
flex: 1;
}
.note-selectors {
flex: 0 0 13em;
}
.note-selector {
padding: 1em;
}
.note-selector p {
margin: 0;
}
.note-editor {
display: flex;
flex: 1;
flex-direction: column;
}
.note-editor-info {
padding: 0.5em;
text-align: center;
}
.note-editor-input {
display: flex;
flex: 1;
width: 100%;
padding: 0 2em 0 2em;
}
/* COLORS */
* {
color: #454545;
background-color: #FAFAF8;
}
.toolbar {
background-color: #DCDADC;
}
.toolbar-button {
background-color: #FFFFFF;
}
.toolbar-button:active {
background-color: #AAAAAA;
}
.note-selectors {
border-right: 1px solid #DCDADC;
}
.note-selector {
border-bottom: 1px solid #DCDADC;
}
.note-selector.active {
background-color: #FCE18D;
}
.note-selector-title {
background-color: inherit;
}
.note-selector-timestamp {
color: #626262;
background-color: inherit;
}
.note-editor-info {
color: #DCDADC;
}
/* TYPOGRAPHY */
body {
font-family: sans-serif;
}
.note-selector-title {
font-weight: bold;
}
.note-selector-timestamp {
font-size: 0.7em;
}
.note-editor, .note-editor-input {
font-size: 0.9em;
}
JavaScript
function transformNotes(notes) {
return notes.slice().sort(function(a, b) {
return b.timestamp - a.timestamp;
});
}
function formatTitle(body) {
var maxLength = 20;
if (body.length > maxLength) {
return body.substring(0, maxLength - 3) + '...';
} else if (body.length === 0) {
return "New note";
} else {
return body;
}
}
function formatTimestamp(timestamp) {
return new Date(timestamp).toUTCString();
}
function domCreateNoteSelector(note, selectedNote) {
var $noteSelector = $(
'<div class="note-selector' + (note === selectedNote ? ' active' : '') + '">' +
'<p class="note-selector-title">' + formatTitle(note.body) + '</p>' +
'<p class="note-selector-timestamp">' + formatTimestamp(note.timestamp) + '</p>' +
'</div>'
);
$noteSelector.data(note);
return $noteSelector;
}
function domCreateNoteSelectors(notes, selectedNote) {
transformNotes(notes).forEach(function(note) {
var $noteSelector = domCreateNoteSelector(note, selectedNote);
$noteSelector.data(note);
$('.note-selectors').append($noteSelector);
});
}
function domUpdateNoteEditor(selectedNote) {
$('.note-editor-info').html(formatTimestamp(selectedNote.timestamp));
$('.note-editor-input').val(selectedNote.body);
}
function domSelectDefaultChild() {
var children = $('.note-selector:visible');
if (children.length > 0) {
var $noteSelector = $(children[0]);
if ($('.note-selector.active').length === 0) {
$noteSelector.addClass('active');
domUpdateNoteEditor($noteSelector.data());
}
} else {
$('.note-editor').hide();
}
}
$('.note-selectors').on('click', '.note-selector', function() {
$('.note-selector').removeClass('active');
$(this).addClass('active');
domUpdateNoteEditor($(this).data());
});
$('.note-editor-input').on('input propertychange', function(event) {
// Update the note data
var body = $(this).val();
var timestamp = Date.now();
$('.note-selector.active').data('body', body);
...