").append(
"
No tasks matching the criteria were found!
"));
return;
}
// filename -> Array[Notes.Task]
var taskMap = _.groupBy(tasks, function(t) { return t.get('filename'); });
for (filename in taskMap) {
collection = new Notes.TasksCollection(taskMap[filename]);
collection.filename = filename;
collectionView = new Notes.TaskCollectionView({ collection: collection })
$container.append(collectionView.render().el);
}
}
Notes.addProgress = function() {
$('.loading-container').find('p').append('.');
}
// Check if a set of tasks can be filtered based on flags we've already searched for
// This allows us to avoid hitting the server when we don't need to
//
// flags - Array[String]
Notes.isSubsetQuery = function(flags) {
return Notes.isSubset(flags, Notes.lastQueryFlags);
}
// Find a subset of locally-cached tasks that match a set of search flags
// Returns Array[Notes.Task]
//
// TODO: this behaves weirdly if a task has multiple flags, punting for now
Notes.filterTasks = function(queryFlags) {
if (queryFlags.length === 0) { return []; }
return Notes.tasks.filter(function(task) {
var taskFlags = task.get('flags');
return (Notes.isSubset(taskFlags, queryFlags) ||
Notes.isSubset(queryFlags, taskFlags));
});
}
// Returns the URL to query the server at
Notes.queryPath = function() {
var path = window.location.pathname;
return (path === '/' ? '' : path) + "/tasks.json"
}
// Fetch tasks from the server and re-render
Notes.queryTasks = function(queryFlags) {
if (!Notes.colorMap) { Notes.buildColorMap(queryFlags); }
if (Notes.lastQueryFlags && Notes.isSubsetQuery(queryFlags)) {
// Subset query - don't need to hit server
var tasks = Notes.filterTasks(queryFlags);
Notes.renderTasks(tasks);
return;
}
// Can't filter client-side - need to hit server
$('.main-content-container').html("
");
var progressInterval = setInterval(Notes.addProgress, 175);
if (!Notes.sidebarView) { Notes.buildSidebar(queryFlags); }
$.getJSON(Notes.queryPath(), { flags: queryFlags }, function(json) {
var stats = json.stats,
tasks = json.tasks.map(function(attrs) { return new Notes.Task(attrs) });
Notes.tasks = tasks;
Notes.lastQueryFlags = queryFlags; // Save the most recent search terms for checking subsets
clearInterval(progressInterval);
Notes.renderStats(stats);
Notes.renderTasks(tasks);
});
}
// Page Load
// ----------------------------------
Notes.queryTasks(Notes.defaultFlags);
$(function() {
var $doc = $(document);
$doc.on('keyup', '.add-flag', function(e) {
if (e.keyCode === 13) {
var $input = $(this);
Notes.addFlag($input.val());
$input.val('');
}
});
$doc.on('click', '.add-flag-btn', function() {
var $input = $('.add-flag');
Notes.addFlag($input.val());
$input.val('');
return false;
});
$doc.on('click', '.filter-btn', function() {
Notes.queryTasks(Notes.getSelectedFlags());
return false;
});
$doc.on('click', '.restore-defaults-btn', function() {
Notes.queryTasks(Notes.defaultFlags);
return false;
});
$doc.on('click', '.toggle-all-context-btn', function() {
var $toggle = $('.task-toggle'),
$ctx = $('.task-context');
if ($ctx.is(':visible')) {
$(this).html("Show all context
");
$toggle.removeClass('fa-angle-up').addClass('fa-angle-down');
$ctx.slideUp();
} else {
$(this).html("Hide all context
");
$toggle.removeClass('fa-angle-down').addClass('fa-angle-up');
$ctx.slideDown();
}
return false;
});
});