Stackedit/public/res/extensions/documentSelector.js

171 lines
6.4 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-08-18 00:02:23 +00:00
"crel",
2013-06-10 21:22:32 +00:00
"utils",
2013-06-22 23:48:57 +00:00
"classes/Extension",
2013-06-10 21:22:32 +00:00
"mousetrap",
"fileSystem",
2013-06-22 23:48:57 +00:00
"text!html/documentSelectorSettingsBlock.html",
2013-08-18 00:02:23 +00:00
], function($, _, crel, utils, Extension, mousetrap, fileSystem, documentSelectorSettingsBlockHTML) {
2013-05-26 22:59:17 +00:00
var documentSelector = new Extension("documentSelector", 'Document Selector', true);
2013-06-22 23:48:57 +00:00
documentSelector.settingsBlock = documentSelectorSettingsBlockHTML;
documentSelector.defaultConfig = {
2013-08-22 19:10:57 +00:00
orderBy: "mru",
2013-06-22 23:48:57 +00:00
shortcutPrevious: "Ctrl+[",
shortcutNext: "Ctrl+]"
2013-06-10 21:22:32 +00:00
};
documentSelector.onLoadSettings = function() {
2013-07-24 23:20:56 +00:00
utils.setInputValue("#select-document-selector-orderby", documentSelector.config.orderBy);
2013-06-10 21:22:32 +00:00
utils.setInputValue("#input-document-selector-shortcut-previous", documentSelector.config.shortcutPrevious);
utils.setInputValue("#input-document-selector-shortcut-next", documentSelector.config.shortcutNext);
};
documentSelector.onSaveSettings = function(newConfig, event) {
newConfig.orderBy = utils.getInputValue("#select-document-selector-orderby");
newConfig.shortcutPrevious = utils.getInputTextValue("#input-document-selector-shortcut-previous", event);
newConfig.shortcutNext = utils.getInputTextValue("#input-document-selector-shortcut-next", event);
2013-05-29 19:55:23 +00:00
};
2013-11-07 23:10:38 +00:00
var fileMgr;
2013-05-29 19:55:23 +00:00
documentSelector.onFileMgrCreated = function(fileMgrParameter) {
fileMgr = fileMgrParameter;
};
2013-08-18 00:02:23 +00:00
var liEltTmpl = [
'<li class="<%= isCurrent ? "disabled" : "" %>" data-file-index="<%= fileDesc.fileIndex %>">',
' <a href="#">',
' <%= fileDesc.composeTitle() %>',
' </a>',
'</li>'
].join('');
2013-11-07 23:10:38 +00:00
var dropdownElt;
var liEltMap;
var liEltList;
var sortFunction;
var selectFileDesc;
var selectedLi;
var $editorElt;
2013-12-02 00:09:39 +00:00
var buildSelector = _.debounce(function() {
2013-08-18 00:02:23 +00:00
var liListHtml = _.chain(fileSystem).sortBy(sortFunction).reduce(function(result, fileDesc) {
return result + _.template(liEltTmpl, {
fileDesc: fileDesc,
isCurrent: fileDesc === selectFileDesc
});
}, '').value();
dropdownElt.innerHTML = liListHtml;
2013-05-29 19:55:23 +00:00
2013-08-18 00:02:23 +00:00
liEltList = [];
liEltMap = {};
_.each(dropdownElt.querySelectorAll('li'), function(liElt) {
var $liElt = $(liElt);
liEltList.push($liElt);
var fileDesc = fileSystem[$liElt.data('fileIndex')];
liEltMap[fileDesc.fileIndex] = $liElt;
2013-05-29 19:55:23 +00:00
});
2013-12-02 00:09:39 +00:00
}, 50);
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
};
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
documentSelector.onReady = function() {
2013-09-12 23:25:25 +00:00
$editorElt = $('#wmd-input');
2014-03-20 00:24:56 +00:00
2013-06-10 21:22:32 +00:00
if(documentSelector.config.orderBy == "title") {
2013-06-09 09:49:19 +00:00
sortFunction = function(fileDesc) {
return fileDesc.title.toLowerCase();
};
}
2013-06-10 21:22:32 +00:00
else if(documentSelector.config.orderBy == "mru") {
2013-06-09 09:49:19 +00:00
sortFunction = function(fileDesc) {
return -fileDesc.selectTime;
};
}
2013-08-18 00:02:23 +00:00
dropdownElt = crel('ul', {
class: 'dropdown-menu dropdown-file-selector'
2013-05-29 19:55:23 +00:00
});
2014-04-14 00:21:06 +00:00
document.querySelector('.navbar').appendChild(crel('div', crel('div', {
2013-08-18 00:02:23 +00:00
'data-toggle': 'dropdown'
}), dropdownElt));
var $dropdownElt = $(dropdownElt).dropdown();
2013-08-22 00:19:59 +00:00
var $documentPanelTogglerElt = $('.document-panel .collapse-button');
$documentPanelTogglerElt.prop("title", _.template("<%= title %> <%= shortcutPrevious %> <%= shortcutNext %>", {
title: $documentPanelTogglerElt.prop("title"),
2013-08-10 11:34:30 +00:00
shortcutPrevious: documentSelector.config.shortcutPrevious,
shortcutNext: documentSelector.config.shortcutNext
}));
2013-06-09 09:49:19 +00:00
// Handle key shortcut
2013-06-22 23:48:57 +00:00
var shortcutPrevious = documentSelector.config.shortcutPrevious.toLowerCase();
mousetrap.bind(shortcutPrevious, function() {
2013-08-20 22:40:19 +00:00
if(selectedLi === undefined) {
2013-08-18 00:02:23 +00:00
$dropdownElt.dropdown('toggle');
2013-08-20 22:40:19 +00:00
selectedLi = liEltMap[selectFileDesc.fileIndex];
2013-06-09 09:49:19 +00:00
}
2013-08-20 22:40:19 +00:00
var liIndex = _.indexOf(liEltList, selectedLi) - 1;
2013-06-09 09:49:19 +00:00
if(liIndex === -2) {
liIndex = -1;
}
2013-08-20 22:40:19 +00:00
selectedLi = liEltList[(liIndex + liEltList.length) % liEltList.length];
2014-04-08 23:20:48 +00:00
setTimeout(function() {
2013-08-20 22:40:19 +00:00
selectedLi.find("a").focus();
2014-04-08 23:20:48 +00:00
}, 10);
2013-06-09 09:49:19 +00:00
return false;
});
2013-06-22 23:48:57 +00:00
var shortcutNext = documentSelector.config.shortcutNext.toLowerCase();
2013-06-10 21:22:32 +00:00
mousetrap.bind(documentSelector.config.shortcutNext.toLowerCase(), function() {
2013-08-20 22:40:19 +00:00
if(selectedLi === undefined) {
2013-08-18 00:02:23 +00:00
$dropdownElt.dropdown('toggle');
2013-08-20 22:40:19 +00:00
selectedLi = liEltMap[selectFileDesc.fileIndex];
2013-06-09 09:49:19 +00:00
}
2013-08-20 22:40:19 +00:00
var liIndex = _.indexOf(liEltList, selectedLi) + 1;
selectedLi = liEltList[liIndex % liEltList.length];
2014-04-08 23:20:48 +00:00
setTimeout(function() {
2013-08-20 22:40:19 +00:00
selectedLi.find("a").focus();
2014-04-08 23:20:48 +00:00
}, 10);
2013-06-09 09:49:19 +00:00
return false;
});
2013-06-22 23:48:57 +00:00
var delimiter1 = shortcutPrevious.indexOf("+");
var shortcutSelect1 = delimiter1 === -1 ? shortcutPrevious : shortcutPrevious.substring(0, delimiter1);
var delimiter2 = shortcutNext.indexOf("+");
var shortcutSelect2 = delimiter2 === -1 ? shortcutNext : shortcutNext.substring(0, delimiter2);
mousetrap.bind([
shortcutSelect1,
shortcutSelect2
], function() {
2013-08-20 22:40:19 +00:00
if(selectedLi !== undefined) {
selectedLi.find("a").click();
2013-06-03 22:19:52 +00:00
}
2013-06-09 09:49:19 +00:00
}, "keyup");
2014-04-23 23:12:21 +00:00
$dropdownElt.on('click', 'a', function() {
selectedLi = undefined;
var $liElt = $(this.parentNode);
var fileDesc = fileSystem[$liElt.data('fileIndex')];
if(!$liElt.hasClass("disabled")) {
fileMgr.selectFile(fileDesc);
}
else {
$editorElt.focus();
}
});
2013-05-29 19:55:23 +00:00
};
return documentSelector;
2014-03-20 00:24:56 +00:00
});