Extension pattern
This commit is contained in:
parent
a4c46085e4
commit
1f0fea1428
65
js/extensions/document-selector.js
Normal file
65
js/extensions/document-selector.js
Normal file
@ -0,0 +1,65 @@
|
||||
define( [ "jquery", "underscore" ], function($) {
|
||||
|
||||
var documentSelector = {
|
||||
extensionId: "documentSelector",
|
||||
extensionName: "Document selector",
|
||||
settingsBloc: [
|
||||
'<p>Builds the "Open document" dropdown menu.</p>'
|
||||
].join("")
|
||||
};
|
||||
|
||||
var fileSystemDescriptor = undefined;
|
||||
documentSelector.onFileSystemLoaded = function(fileSystemDescriptorParameter) {
|
||||
fileSystemDescriptor = fileSystemDescriptorParameter;
|
||||
};
|
||||
|
||||
var fileDesc = undefined;
|
||||
var updateSelector = function() {
|
||||
var sortedDescriptor = _.sortBy(fileSystemDescriptor, function(fileDesc) {
|
||||
return fileDesc.title.toLowerCase();
|
||||
});
|
||||
|
||||
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;
|
||||
}).each(function(attributes) {
|
||||
result.push('<i class="icon-' + attributes.provider + '"></i>');
|
||||
});
|
||||
result.push(" ");
|
||||
result.push(fileDesc.title);
|
||||
return result.join("");
|
||||
}
|
||||
|
||||
$("#file-selector li:not(.stick)").empty();
|
||||
_.each(sortedDescriptor, function(fileDescToPrint) {
|
||||
var a = $("<a>").html(composeTitle(fileDescToPrint.index));
|
||||
var li = $("<li>").append(a);
|
||||
if (fileDescToPrint === fileDesc) {
|
||||
li.addClass("disabled");
|
||||
} else {
|
||||
a.prop("href", "#").click(function() {
|
||||
fileManager.selectFile(fileDescToPrint);
|
||||
});
|
||||
}
|
||||
$("#file-selector").append(li);
|
||||
});
|
||||
};
|
||||
|
||||
documentSelector.onFileSelected = function(fileDescParameter) {
|
||||
fileDesc = fileDescParameter;
|
||||
updateSelector();
|
||||
};
|
||||
|
||||
documentSelector.onTitleChanged = updateSelector;
|
||||
documentSelector.onSyncExportSuccess = updateSelector;
|
||||
documentSelector.onSyncRemoved = updateSelector;
|
||||
documentSelector.onNewPublishSuccess = updateSelector;
|
||||
documentSelector.onPublishRemoved = updateSelector;
|
||||
|
||||
return documentSelector;
|
||||
|
||||
});
|
62
js/extensions/document-title.js
Normal file
62
js/extensions/document-title.js
Normal file
@ -0,0 +1,62 @@
|
||||
define( [ "jquery", "underscore" ], function($) {
|
||||
|
||||
var documentTitle = {
|
||||
extensionId: "documentTitle",
|
||||
extensionName: "Document title",
|
||||
settingsBloc: [
|
||||
'<p>Responsible for showing the document title in the navigation bar.</p>'
|
||||
].join("")
|
||||
};
|
||||
|
||||
var layout = undefined;
|
||||
documentTitle.onLayoutCreated = function(layoutParameter) {
|
||||
layout = layoutParameter;
|
||||
};
|
||||
|
||||
var fileDesc = undefined;
|
||||
var updateTitle = function(fileDescParameter) {
|
||||
if(fileDescParameter !== undefined && fileDescParameter !== fileDesc) {
|
||||
return;
|
||||
}
|
||||
|
||||
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;
|
||||
}).each(function(attributes) {
|
||||
result.push('<i class="icon-' + attributes.provider + '"></i>');
|
||||
});
|
||||
result.push(" ");
|
||||
result.push(fileDesc.title);
|
||||
return result.join("");
|
||||
}
|
||||
|
||||
var title = fileDesc.title;
|
||||
document.title = "StackEdit - " + title;
|
||||
$("#file-title").html(composeTitle(fileDesc));
|
||||
$(".file-title").text(title);
|
||||
$("#file-title-input").val(title);
|
||||
|
||||
if(layout !== undefined) {
|
||||
// Use defer to make sure UI has been updated
|
||||
_.defer(layout.resizeAll);
|
||||
}
|
||||
};
|
||||
|
||||
documentTitle.onFileSelected = function(fileDescParameter) {
|
||||
fileDesc = fileDescParameter;
|
||||
updateTitle(fileDescParameter);
|
||||
};
|
||||
|
||||
documentTitle.onTitleChanged = updateTitle;
|
||||
documentTitle.onSyncExportSuccess = updateTitle;
|
||||
documentTitle.onSyncRemoved = updateTitle;
|
||||
documentTitle.onNewPublishSuccess = updateTitle;
|
||||
documentTitle.onPublishRemoved = updateTitle;
|
||||
|
||||
return documentTitle;
|
||||
|
||||
});
|
65
js/extensions/manage-publication.js
Normal file
65
js/extensions/manage-publication.js
Normal file
@ -0,0 +1,65 @@
|
||||
define( [ "jquery", "underscore" ], function($) {
|
||||
|
||||
var managePublication = {
|
||||
extensionId: "managePublication",
|
||||
extensionName: "Manage Publication",
|
||||
settingsBloc: [
|
||||
'<p>Populates the "Manage publication" dialog box.</p>'
|
||||
].join("")
|
||||
};
|
||||
|
||||
var fileManager = undefined;
|
||||
manageSynchronization.onFileManagerCreated = function(fileManagerParameter) {
|
||||
fileManager = fileManagerParameter;
|
||||
};
|
||||
|
||||
var fileDesc = undefined;
|
||||
var lineTemplate = [
|
||||
'<div class="input-prepend input-append">',
|
||||
'<span class="add-on" title="<%= provider.providerName %>">',
|
||||
'<i class="icon-<%= provider.providerId %>"></i>',
|
||||
'</span>',
|
||||
'<input class="span5" type="text" value="<%= publishDesc %>" disabled />',
|
||||
'</div>'].join("");
|
||||
var removeButtonTemplate = '<a class="btn" title="Remove this location"><i class="icon-trash"></i></a>';
|
||||
var refreshDialog = function(fileDescParameter) {
|
||||
if(fileDescParameter !== undefined && fileDescParameter !== fileDesc) {
|
||||
return;
|
||||
}
|
||||
|
||||
var publishAttributesList = _.values(fileDesc.publishLocations);
|
||||
$(".msg-no-publish, .msg-publish-list").addClass("hide");
|
||||
var publishList = $("#manage-publish-list").empty();
|
||||
if (publishAttributesList.length > 0) {
|
||||
$(".msg-publish-list").removeClass("hide");
|
||||
} else {
|
||||
$(".msg-no-publish").removeClass("hide");
|
||||
}
|
||||
_.each(publishAttributesList, function(publishAttributes) {
|
||||
publishAttributes = _.extend({}, publishAttributes);
|
||||
if(publishAttributes.password) {
|
||||
publishAttributes.password = "********";
|
||||
}
|
||||
var publishDesc = JSON.stringify(publishAttributes).replace(/{|}|"/g, "");
|
||||
var lineElement = $(_.template(lineTemplate, {
|
||||
provider: providerMap[publishAttributes.provider],
|
||||
publishDesc: publishDesc
|
||||
}));
|
||||
lineElement.append($(removeButtonTemplate).click(function() {
|
||||
fileManager.removePublish(publishIndex);
|
||||
}));
|
||||
publishList.append(lineElement);
|
||||
});
|
||||
};
|
||||
|
||||
managePublication.onFileSelected = function(fileDescParameter) {
|
||||
fileDesc = fileDescParameter;
|
||||
refreshDialog(fileDescParameter);
|
||||
};
|
||||
|
||||
managePublication.onNewPublishSuccess = refreshDialog;
|
||||
managePublication.onPublishRemoved = refreshDialog;
|
||||
|
||||
return managePublication;
|
||||
|
||||
});
|
61
js/extensions/manage-synchronization.js
Normal file
61
js/extensions/manage-synchronization.js
Normal file
@ -0,0 +1,61 @@
|
||||
define( [ "jquery", "underscore" ], function($) {
|
||||
|
||||
var manageSynchronization = {
|
||||
extensionId: "manageSynchronization",
|
||||
extensionName: "Manage Synchronization",
|
||||
settingsBloc: [
|
||||
'<p>Populates the "Manage synchronization" dialog box.</p>'
|
||||
].join("")
|
||||
};
|
||||
|
||||
var fileManager = undefined;
|
||||
manageSynchronization.onFileManagerCreated = function(fileManagerParameter) {
|
||||
fileManager = fileManagerParameter;
|
||||
};
|
||||
|
||||
var fileDesc = undefined;
|
||||
var lineTemplate = [
|
||||
'<div class="input-prepend input-append">',
|
||||
'<span class="add-on" title="<%= provider.providerName %>">',
|
||||
'<i class="icon-<%= provider.providerId %>"></i>',
|
||||
'</span>',
|
||||
'<input class="span5" type="text" value="<%= syncDesc %>" disabled />',
|
||||
'</div>'].join("");
|
||||
var removeButtonTemplate = '<a class="btn" title="Remove this location"><i class="icon-trash"></i></a>';
|
||||
var refreshDialog = function(fileDescParameter) {
|
||||
if(fileDescParameter !== undefined && fileDescParameter !== fileDesc) {
|
||||
return;
|
||||
}
|
||||
|
||||
var syncAttributesList = _.values(fileDesc.syncLocations);
|
||||
$(".msg-no-sync, .msg-sync-list").addClass("hide");
|
||||
var syncList = $("#manage-sync-list").empty();
|
||||
if (syncAttributesList.length > 0) {
|
||||
$(".msg-sync-list").removeClass("hide");
|
||||
} else {
|
||||
$(".msg-no-sync").removeClass("hide");
|
||||
}
|
||||
_.each(syncAttributesList, function(syncAttributes) {
|
||||
var syncDesc = syncAttributes.id || syncAttributes.path;
|
||||
var lineElement = $(_.template(lineTemplate, {
|
||||
provider: providerMap[syncAttributes.provider],
|
||||
syncDesc: syncDesc
|
||||
}));
|
||||
lineElement.append($(removeButtonTemplate).click(function() {
|
||||
fileManager.removeSync(syncAttributes);
|
||||
}));
|
||||
syncList.append(lineElement);
|
||||
});
|
||||
};
|
||||
|
||||
manageSynchronization.onFileSelected = function(fileDescParameter) {
|
||||
fileDesc = fileDescParameter;
|
||||
refreshDialog(fileDescParameter);
|
||||
};
|
||||
|
||||
manageSynchronization.onSyncExportSuccess = refreshDialog;
|
||||
manageSynchronization.onSyncRemoved = refreshDialog;
|
||||
|
||||
return manageSynchronization;
|
||||
|
||||
});
|
52
js/extensions/sharing-button.js
Normal file
52
js/extensions/sharing-button.js
Normal file
@ -0,0 +1,52 @@
|
||||
define( [ "jquery", "underscore" ], function($) {
|
||||
|
||||
var sharingButton = {
|
||||
extensionId: "sharingButton",
|
||||
extensionName: "Sharing button",
|
||||
optional: true,
|
||||
settingsBloc: [
|
||||
'<p>Adds a "Share document" button in the navigation bar.</p>'
|
||||
].join("")
|
||||
};
|
||||
|
||||
var fileDesc = undefined;
|
||||
var lineTemplate = [
|
||||
'<div class="input-prepend">',
|
||||
'<a href="<%= link %>" class="add-on" title="Sharing location"><i class="icon-link"></i></a>',
|
||||
'<input class="span2" type="text" value="<%= link %>" readonly />',
|
||||
'</div>'
|
||||
].join("");
|
||||
var refreshDocumentSharing = function(fileDescParameter) {
|
||||
if(fileDescParameter !== undefined && fileDescParameter !== fileDesc) {
|
||||
return;
|
||||
}
|
||||
|
||||
var linkList = $("#link-container .link-list").empty();
|
||||
$("#link-container .no-link").show();
|
||||
|
||||
var attributesList = _.values(fileDesc.publishLocations);
|
||||
_.each(attributesList, function(attributes) {
|
||||
if(attributes.sharingLink) {
|
||||
var lineElement = $(_.template(lineTemplate, {
|
||||
link: attributes.sharingLink
|
||||
}));
|
||||
lineElement.click(function(event) {
|
||||
event.stopPropagation();
|
||||
});
|
||||
linkList.append(lineElement);
|
||||
$("#link-container .no-link").hide();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
sharingButton.onFileSelected = function(fileDescParameter) {
|
||||
fileDesc = fileDescParameter;
|
||||
refreshDocumentSharing(fileDescParameter);
|
||||
};
|
||||
|
||||
sharingButton.onNewPublishSuccess = refreshDocumentSharing;
|
||||
sharingButton.onPublishRemoved = refreshDocumentSharing;
|
||||
|
||||
return sharingButton;
|
||||
|
||||
});
|
Loading…
Reference in New Issue
Block a user