Stackedit/js/fileMgr.js

228 lines
8.1 KiB
JavaScript
Raw Normal View History

2013-05-26 22:59:03 +00:00
define([
"jquery",
2013-05-27 19:45:33 +00:00
"underscore",
2013-05-26 22:59:03 +00:00
"core",
"utils",
2013-05-27 19:45:33 +00:00
"settings",
2013-07-30 08:46:36 +00:00
"eventMgr",
2013-06-10 21:22:32 +00:00
"fileSystem",
2013-06-16 10:47:35 +00:00
"classes/FileDescriptor",
2013-06-10 21:22:32 +00:00
"text!../WELCOME.md"
2013-07-30 08:46:36 +00:00
], function($, _, core, utils, settings, eventMgr, fileSystem, FileDescriptor, welcomeContent) {
2013-05-29 19:55:23 +00:00
var fileMgr = {};
// Defines the current file
2013-06-19 20:33:46 +00:00
fileMgr.currentFile = undefined;
2013-05-29 19:55:23 +00:00
// Set the current file and refresh the editor
2013-05-29 19:55:23 +00:00
fileMgr.selectFile = function(fileDesc) {
2013-06-19 20:33:46 +00:00
fileDesc = fileDesc || fileMgr.currentFile;
2013-05-29 19:55:23 +00:00
if(fileDesc === undefined) {
var fileSystemSize = _.size(fileSystem);
if(fileSystemSize === 0) {
2013-06-16 10:47:35 +00:00
// If fileSystem empty create one file
2013-05-29 19:55:23 +00:00
fileDesc = fileMgr.createFile(WELCOME_DOCUMENT_TITLE, welcomeContent);
}
else {
2013-06-16 10:47:35 +00:00
// Select the last selected file
fileDesc = _.max(fileSystem, function(fileDesc) {
return fileDesc.selectTime || 0;
});
2013-05-29 19:55:23 +00:00
}
}
2013-06-19 20:33:46 +00:00
if(fileMgr.currentFile !== fileDesc) {
fileMgr.currentFile = fileDesc;
2013-06-09 09:49:19 +00:00
fileDesc.selectTime = new Date().getTime();
2013-05-29 19:55:23 +00:00
// Notify extensions
2013-07-30 08:46:36 +00:00
eventMgr.onFileSelected(fileDesc);
2013-05-29 19:55:23 +00:00
// Hide the viewer pencil button
if(fileDesc.fileIndex == TEMPORARY_FILE_INDEX) {
$(".action-edit-document").removeClass("hide");
}
else {
$(".action-edit-document").addClass("hide");
}
}
// Refresh the editor (even if it's the same file)
2013-06-19 20:33:46 +00:00
core.initEditor(fileDesc);
2013-05-29 19:55:23 +00:00
};
fileMgr.createFile = function(title, content, syncLocations, isTemporary) {
content = content !== undefined ? content : settings.defaultContent;
if(!title) {
// Create a file title
title = DEFAULT_FILE_TITLE;
var indicator = 2;
while (_.some(fileSystem, function(fileDesc) {
return fileDesc.title == title;
})) {
title = DEFAULT_FILE_TITLE + indicator++;
}
}
// Generate a unique fileIndex
var fileIndex = TEMPORARY_FILE_INDEX;
if(!isTemporary) {
do {
fileIndex = "file." + utils.randomString();
} while (_.has(fileSystem, fileIndex));
}
// syncIndex associations
syncLocations = syncLocations || {};
var sync = _.reduce(syncLocations, function(sync, syncAttributes) {
2013-06-16 10:47:35 +00:00
utils.storeAttributes(syncAttributes);
return sync + syncAttributes.syncIndex + ";";
2013-05-29 19:55:23 +00:00
}, ";");
localStorage[fileIndex + ".title"] = title;
localStorage[fileIndex + ".content"] = content;
localStorage[fileIndex + ".sync"] = sync;
localStorage[fileIndex + ".publish"] = ";";
// Create the file descriptor
var fileDesc = new FileDescriptor(fileIndex, title, syncLocations);
// Add the index to the file list
if(!isTemporary) {
2013-06-03 22:19:52 +00:00
utils.appendIndexToArray("file.list", fileIndex);
2013-05-29 19:55:23 +00:00
fileSystem[fileIndex] = fileDesc;
2013-07-30 08:46:36 +00:00
eventMgr.onFileCreated(fileDesc);
2013-05-29 19:55:23 +00:00
}
return fileDesc;
};
fileMgr.deleteFile = function(fileDesc) {
2013-06-19 20:33:46 +00:00
fileDesc = fileDesc || fileMgr.currentFile;
2013-05-29 23:04:52 +00:00
// Remove the index from the file list
2013-06-03 22:19:52 +00:00
utils.removeIndexFromArray("file.list", fileDesc.fileIndex);
2013-05-29 23:04:52 +00:00
delete fileSystem[fileDesc.fileIndex];
2013-06-09 09:49:19 +00:00
2013-06-19 20:33:46 +00:00
if(fileMgr.currentFile === fileDesc) {
2013-05-29 19:55:23 +00:00
// Unset the current fileDesc
2013-06-19 20:33:46 +00:00
fileMgr.currentFile = undefined;
2013-06-16 10:47:35 +00:00
// Refresh the editor with another file
2013-05-29 19:55:23 +00:00
fileMgr.selectFile();
}
2013-06-16 10:47:35 +00:00
// Remove synchronized locations from localStorage
2013-05-29 19:55:23 +00:00
_.each(fileDesc.syncLocations, function(syncAttributes) {
2013-06-16 10:47:35 +00:00
localStorage.removeItem(syncAttributes.syncIndex);
2013-05-29 19:55:23 +00:00
});
2013-06-16 10:47:35 +00:00
// Remove publish locations from localStorage
2013-05-29 19:55:23 +00:00
_.each(fileDesc.publishLocations, function(publishAttributes) {
2013-06-16 10:47:35 +00:00
localStorage.removeItem(publishAttributes.publishIndex);
2013-05-29 19:55:23 +00:00
});
2013-05-29 23:04:52 +00:00
localStorage.removeItem(fileDesc.fileIndex + ".title");
localStorage.removeItem(fileDesc.fileIndex + ".content");
localStorage.removeItem(fileDesc.fileIndex + ".sync");
localStorage.removeItem(fileDesc.fileIndex + ".publish");
2013-08-12 00:10:26 +00:00
localStorage.removeItem(fileDesc.fileIndex + ".selectTime");
localStorage.removeItem(fileDesc.fileIndex + ".editorStart");
localStorage.removeItem(fileDesc.fileIndex + ".editorEnd");
localStorage.removeItem(fileDesc.fileIndex + ".editorScrollTop");
localStorage.removeItem(fileDesc.fileIndex + ".previewScrollTop");
2013-05-29 19:55:23 +00:00
2013-07-30 08:46:36 +00:00
eventMgr.onFileDeleted(fileDesc);
2013-05-29 19:55:23 +00:00
};
// Get the file descriptor associated to a syncIndex
fileMgr.getFileFromSyncIndex = function(syncIndex) {
return _.find(fileSystem, function(fileDesc) {
return _.has(fileDesc.syncLocations, syncIndex);
});
};
// Get syncAttributes from syncIndex
fileMgr.getSyncAttributes = function(syncIndex) {
var fileDesc = fileMgr.getFileFromSyncIndex(syncIndex);
return fileDesc && fileDesc.syncLocations[syncIndex];
};
// Get the file descriptor associated to a publishIndex
fileMgr.getFileFromPublishIndex = function(publishIndex) {
return _.find(fileSystem, function(fileDesc) {
return _.has(fileDesc.publishLocations, publishIndex);
});
};
2013-08-04 00:53:46 +00:00
eventMgr.addListener("onReady", function() {
2013-05-29 19:55:23 +00:00
fileMgr.selectFile();
2013-08-06 23:52:58 +00:00
var fileTitleElt = $('.file-title-navbar');
var fileTitleInputElt = $(".input-file-title");
2013-05-29 19:55:23 +00:00
$(".action-create-file").click(function() {
var fileDesc = fileMgr.createFile();
fileMgr.selectFile(fileDesc);
var wmdInput = $("#wmd-input").focus().get(0);
if(wmdInput.setSelectionRange) {
wmdInput.setSelectionRange(0, 0);
}
2013-08-06 23:52:58 +00:00
fileTitleElt.click();
2013-05-29 19:55:23 +00:00
});
$(".action-remove-file").click(function() {
fileMgr.deleteFile();
});
2013-08-06 23:52:58 +00:00
fileTitleElt.click(function() {
2013-05-29 19:55:23 +00:00
if(viewerMode === true) {
return;
}
2013-08-06 23:52:58 +00:00
fileTitleElt.addClass('hide');
var fileTitleInput = fileTitleInputElt.removeClass('hide');
2013-05-29 19:55:23 +00:00
_.defer(function() {
fileTitleInput.focus().get(0).select();
});
});
2013-08-06 23:52:58 +00:00
function applyTitle() {
fileTitleInputElt.addClass('hide');
fileTitleElt.removeClass('hide');
var title = $.trim(fileTitleInputElt.val());
2013-06-19 20:33:46 +00:00
var fileDesc = fileMgr.currentFile;
2013-05-29 19:55:23 +00:00
if(title && title != fileDesc.title) {
fileDesc.title = title;
2013-07-30 08:46:36 +00:00
eventMgr.onTitleChanged(fileDesc);
2013-05-29 19:55:23 +00:00
}
2013-08-06 23:52:58 +00:00
fileTitleInputElt.val(fileDesc.title);
2013-05-29 19:55:23 +00:00
$("#wmd-input").focus();
}
2013-08-06 23:52:58 +00:00
fileTitleInputElt.blur(function() {
applyTitle();
2013-05-29 19:55:23 +00:00
}).keyup(function(e) {
if(e.keyCode == 13) {
2013-08-06 23:52:58 +00:00
applyTitle();
2013-05-29 19:55:23 +00:00
}
if(e.keyCode == 27) {
2013-08-06 23:52:58 +00:00
fileTitleInputElt.val("");
applyTitle();
2013-05-29 19:55:23 +00:00
}
});
$(".action-open-stackedit").click(function() {
window.location.href = ".";
});
$(".action-edit-document").click(function() {
var content = $("#wmd-input").val();
2013-06-19 20:33:46 +00:00
var title = fileMgr.currentFile.title;
2013-05-29 19:55:23 +00:00
var fileDesc = fileMgr.createFile(title, content);
fileMgr.selectFile(fileDesc);
window.location.href = ".";
});
$(".action-welcome-file").click(function() {
var fileDesc = fileMgr.createFile(WELCOME_DOCUMENT_TITLE, welcomeContent);
fileMgr.selectFile(fileDesc);
});
});
2013-07-30 08:46:36 +00:00
eventMgr.onFileMgrCreated(fileMgr);
2013-05-29 19:55:23 +00:00
return fileMgr;
2013-04-02 18:42:47 +00:00
});