Stackedit/js/extensions/document-selector.js

176 lines
5.9 KiB
JavaScript
Raw Normal View History

2013-05-27 19:45:33 +00:00
define([
"jquery",
2013-05-28 23:41:09 +00:00
"underscore",
2013-06-09 09:49:19 +00:00
"file-system",
"libs/mousetrap",
2013-05-28 23:41:09 +00:00
], function($, _, fileSystem) {
2013-05-26 22:59:17 +00:00
2013-05-29 19:55:23 +00:00
var documentSelector = {
extensionId: "documentSelector",
extensionName: "Document selector",
2013-06-03 22:19:52 +00:00
defaultConfig: {
2013-06-09 09:49:19 +00:00
sortBy: "mru",
keyPrevious: "[",
keyNext: "]"
2013-06-03 22:19:52 +00:00
},
2013-05-29 19:55:23 +00:00
settingsBloc: '<p>Builds the "Open document" dropdown menu.</p>'
};
var fileMgr = undefined;
documentSelector.onFileMgrCreated = function(fileMgrParameter) {
fileMgr = fileMgrParameter;
};
var liMap = undefined;
2013-06-09 09:49:19 +00:00
var liArray = undefined;
var sortFunction = undefined;
2013-05-29 19:55:23 +00:00
var buildSelector = function() {
function composeTitle(fileDesc) {
var result = [];
var syncAttributesList = _.values(fileDesc.syncLocations);
var publishAttributesList = _.values(fileDesc.publishLocations);
var attributesList = syncAttributesList.concat(publishAttributesList);
_.chain(attributesList).sortBy(function(attributes) {
return attributes.provider.providerId;
}).each(function(attributes) {
result.push('<i class="icon-' + attributes.provider.providerId + '"></i>');
});
result.push(" ");
result.push(fileDesc.title);
return result.join("");
}
liMap = {};
$("#file-selector li:not(.stick)").empty();
2013-06-09 09:49:19 +00:00
_.chain(fileSystem).sortBy(sortFunction).each(function(fileDesc) {
2013-05-29 19:55:23 +00:00
var a = $('<a href="#">').html(composeTitle(fileDesc)).click(function() {
if(!liMap[fileDesc.fileIndex].is(".disabled")) {
fileMgr.selectFile(fileDesc);
}
});
var li = $("<li>").append(a);
liMap[fileDesc.fileIndex] = li;
$("#file-selector").append(li);
});
2013-06-09 09:49:19 +00:00
liArray = _.values(liMap);
2013-05-29 19:55:23 +00:00
};
2013-06-09 09:49:19 +00:00
var selectFileDesc = undefined;
2013-05-29 19:55:23 +00:00
documentSelector.onFileSelected = function(fileDesc) {
2013-06-09 09:49:19 +00:00
selectFileDesc = fileDesc;
buildSelector();
2013-05-29 19:55:23 +00:00
$("#file-selector li:not(.stick)").removeClass("disabled");
2013-05-29 23:04:52 +00:00
var li = liMap[fileDesc.fileIndex];
if(li === undefined) {
2013-06-03 22:19:52 +00:00
// It means that we are showing a temporary file (not in the
// selector)
2013-05-29 23:04:52 +00:00
return;
}
2013-06-09 09:49:19 +00:00
li.addClass("disabled");
2013-05-29 19:55:23 +00:00
};
documentSelector.onFileCreated = buildSelector;
documentSelector.onFileDeleted = buildSelector;
documentSelector.onTitleChanged = buildSelector;
documentSelector.onSyncExportSuccess = buildSelector;
documentSelector.onSyncRemoved = buildSelector;
documentSelector.onNewPublishSuccess = buildSelector;
documentSelector.onPublishRemoved = buildSelector;
2013-06-03 22:19:52 +00:00
2013-05-29 19:55:23 +00:00
// Filter for search input in file selector
function filterFileSelector(filter) {
var liList = $("#file-selector li:not(.stick)");
liList.show();
if(filter) {
var words = filter.toLowerCase().split(/\s+/);
liList.each(function() {
var fileTitle = $(this).text().toLowerCase();
if(_.some(words, function(word) {
return fileTitle.indexOf(word) === -1;
})) {
$(this).hide();
}
});
}
}
documentSelector.onReady = function() {
2013-06-09 09:49:19 +00:00
if(documentSelector.config.sortBy == "title") {
sortFunction = function(fileDesc) {
return fileDesc.title.toLowerCase();
};
}
else if(documentSelector.config.sortBy == "mru") {
sortFunction = function(fileDesc) {
return -fileDesc.selectTime;
};
}
var shortcutClick = false;
2013-05-29 19:55:23 +00:00
$(".action-open-file").click(function() {
2013-06-09 09:49:19 +00:00
if($("#file-selector:parent").is(".open")) {
return;
}
2013-05-29 19:55:23 +00:00
filterFileSelector();
2013-06-09 09:49:19 +00:00
if(shortcutClick === true) {
return;
}
2013-05-29 19:55:23 +00:00
_.defer(function() {
$("#file-search").val("").focus();
});
});
2013-06-02 00:38:23 +00:00
$("#file-search").keyup(function(e) {
if(e.which == 13 || e.which == 27) {
$(this).parent().click();
}
else {
filterFileSelector($(this).val());
}
2013-05-29 19:55:23 +00:00
}).click(function(event) {
event.stopPropagation();
});
2013-06-09 09:49:19 +00:00
// Handle key shortcut
var shortcutLi = undefined;
Mousetrap.bind('ctrl+' + documentSelector.config.keyPrevious, function() {
shortcutClick = true;
if(shortcutLi === undefined) {
$(".action-open-file").click();
shortcutLi = liMap[selectFileDesc.fileIndex];
}
var liIndex = _.indexOf(liArray, shortcutLi) - 1;
if(liIndex === -2) {
liIndex = -1;
}
shortcutLi = liArray[(liIndex + liArray.length) % liArray.length];
_.defer(function() {
shortcutLi.find("a").focus();
});
return false;
});
Mousetrap.bind('ctrl+' + documentSelector.config.keyNext, function() {
shortcutClick = true;
if(shortcutLi === undefined) {
$(".action-open-file").click();
shortcutLi = liMap[selectFileDesc.fileIndex];
}
var liIndex = _.indexOf(liArray, shortcutLi) + 1;
shortcutLi = liArray[liIndex % liArray.length];
_.defer(function() {
shortcutLi.find("a").focus();
});
return false;
});
Mousetrap.bind('ctrl', function() {
shortcutClick = false;
if(shortcutLi !== undefined) {
shortcutLi.find("a").click();
shortcutLi = undefined;
2013-06-03 22:19:52 +00:00
}
2013-06-09 09:49:19 +00:00
}, "keyup");
2013-05-29 19:55:23 +00:00
};
return documentSelector;
2013-05-26 22:59:17 +00:00
});