c9-core/plugins/c9.ide.readonly/access_control.js

200 wiersze
7.0 KiB
JavaScript

/**
* Access control dialogs
*/
define(function(require, exports, module) {
"use strict";
main.consumes = [
"Plugin", "api", "dialog.alert", "dialog.question",
"ui", "layout", "commands", "dialog.notification"
];
main.provides = ["accessControl"];
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
var api = imports.api;
var showAlert = imports["dialog.alert"].show;
var showQuestion = imports["dialog.question"].show;
var notify = imports["dialog.notification"].show;
var ui = imports.ui;
var layout = imports.layout;
var commands = imports.commands;
var plugin = new Plugin("Ajax.org", main.consumes);
var readonly = options.readonly;
var dashboardUrl = options.dashboardUrl;
var lastInfo = {};
var btn;
var loaded = false;
function load() {
if (loaded) return;
loaded = true;
if (!readonly)
return;
api.collab.get("access_info", function (err, info) {
if (err) return showAlert("Error", err);
lastInfo = info;
if (info.admin) {
var profileBaseUrl = dashboardUrl.match("^http(s)?://[^/#?]+")[0];
notify(
'<div class="c9-readonly">Your workspace is in Read-Only Mode because your '
+ 'account has ran out of quota for this type of workspace. '
+ 'Please visit your <a target="_blank" style="color: blue;" href="'
+ profileBaseUrl
+ '/account/billing">subscription page to buy more resources</a>.'
+ "</div>"
);
}
else if (info.acl == "rw") {
notify(
'<div class="c9-readonly">This workspace is in Read-Only Mode because owners '
+ 'account has ran out of quota for this type of workspace. '
+ 'Please ask the owner to buy more resources'
+ "</div>"
);
}
else if (info.private) {
if (!info.member) {
// Do you want to request access to this workspace
showRequestAccessDialog();
}
else if (info.pending) {
// Already requested, do you want to cancel ?
showCancelAccessDialog();
}
}
else {
addRequestButton();
if (!info.member || info.pending) {
notify("<div class='c9-readonly'>You are in Read-Only Mode. "
+ (info.pending ? "" : "Click on this bar to request access from the owner.")
+ "</div>", true);
if (!info.pending) {
document.querySelector(".c9-readonly").addEventListener("click", function() {
showRequestAccessDialog();
}, false);
}
}
}
});
}
function addRequestButton() {
btn = new ui.button({
skin: "c9-menu-btn",
tooltip: "Request Write Access",
command: "request_access"
});
updateButton();
commands.addCommand({
name: "request_access",
hint: "Share the workspace",
group: "General",
exec: showRequestAccessDialog
}, plugin);
ui.insertByIndex(layout.findParent({
name: "preferences"
}), btn, 600, plugin);
}
function updateButton() {
if (!btn) return;
btn.setAttribute("caption",
lastInfo.pending ? "Cancel Access Request" : "Request Access");
btn.setAttribute("tooltip",
lastInfo.pending ? "Cancel Pending Access Request" : "Request Write Access");
}
function showRequestAccessDialog(write) {
if (lastInfo.pending)
return showCancelAccessDialog();
showQuestion("Workspace Access",
"You don't currently have " + (write ? "write " : "")
+ "access to this workspace",
"Would you like to request access?",
function() {
// Yes
requestAccess();
lastInfo.pending = true;
},
redirectToDashboardIfPrivate,
{
yes: "Request access",
no: "Not now"
}
);
}
function requestAccess() {
api.collab.post("request_access", function (err, member) {
if (err) return showAlert("Error Requesting access", err.message || err);
showAlert("Done", "Access request sent", "We have sent an access request to the admin of this workspace.");
updateButton();
});
}
function showCancelAccessDialog() {
showQuestion("Workspace Access",
"Request access pending approval",
"Would you like to cancel your access request?",
function() {
// Yes
api.collab.delete("cancel_request", function (err) {
if (err && err.message && /isn't a pending workspace member/.test(err.message))
err = null;
if (err) return showAlert("Error", err.message || err);
lastInfo.pending = false;
showAlert("Done", "Access request cancelled", "We don't currently have access to this workspace");
updateButton();
});
},
redirectToDashboardIfPrivate
);
}
function redirectToDashboardIfPrivate() {
if (lastInfo.private)
window.top.location.href = dashboardUrl;
}
/***** Lifecycle *****/
plugin.on("load", function() {
load();
});
plugin.on("enable", function() {
});
plugin.on("disable", function() {
});
plugin.on("unload", function() {
loaded = false;
lastInfo = {};
btn = null;
});
plugin.freezePublicAPI({
requestAccess: requestAccess,
showRequestAccessDialog: showRequestAccessDialog
});
register(null, {
accessControl: plugin
});
}
});