Files

265 lines
11 KiB
JavaScript

$(function() {
var sessionId = sessionStorage.getItem('phpMaeSessionId');
var functionMatcher = /(?:\/\*\*((?:[\s\S](?!\/\*))*?)\*\/+\s*)?public\s+function\s+(\w+)\s*\((.*)\)/g;
var codeEditor = CodeMirror(document.getElementById('phpmae-source-editor'), {
lineNumbers: false,
matchBrackets: true,
mode: "application/x-httpd-php",
indentUnit: 4,
indentWithTabs: false
});
var configEditor = CodeMirror(document.getElementById('phpmae-config-editor'), {
lineNumbers: false,
matchBrackets: true,
mode: "application/xml",
indentUnit: 4,
indentWithTabs: false
});
var dirty = false;
function checkSignInStatus() {
if (typeof(COWebApp) !== "undefined" && COWebApp.getAccountContext() !== null) {
// Signed in
$('.phpmae-signedout-only').hide();
$('.phpmae-signedin-only').show();
} else {
// Signed out
$('.phpmae-signedin-only').hide();
$('.phpmae-signedout-only').show();
}
}
function updateParameters(functionName) {
var sourceCode = codeEditor.getValue();
var container = $('#phpmae-parameter-container');
var parametersHtml = "";
do {
functionMatch = functionMatcher.exec(sourceCode);
if (functionMatch && functionMatch[2] == functionName) {
var parameters = functionMatch[3].split(",");
for (var p in parameters) {
var parameter = parameters[p].trim();
if (parameter[0] != "$" || parameter.length < 2) continue;
var noPrefix = parameter.substr(1);
var oldValue = container.find('[name=' + noPrefix + ']').val();
parametersHtml += '<div class="input-field col s12">'
+ '<label for="' + noPrefix + '">' + parameter + '</label>'
+ '<input name="' + noPrefix+ '" type="text" value="'
+ (typeof(oldValue) != 'undefined' ? oldValue : '') + '" />'
+ '</div>';
}
}
} while (functionMatch);
container.html(parametersHtml);
M.updateTextFields();
}
window.phpMAE = {
execute : function(form) {
form = $(form);
form.find('button').addClass('disabled');
var request = {
config : configEditor.getValue(),
sourceCode : codeEditor.getValue(),
class : form.find('[name=class]').val(),
method : form.find('[name=function]').val(),
params : {}
};
if (sessionId != null) request.session = sessionId;
var parameters = form.find('input');
for (var p in parameters)
request.params[parameters[p].name] = parameters[p].value;
fetch('/run', {
method : 'POST',
headers : { 'Content-Type' : 'application/json' },
body : JSON.stringify(request)
}).then(function(response) {
response.json().then(function(data) {
if (data.session != sessionId) {
sessionId = data.session;
sessionStorage.setItem('phpMaeSessionId', sessionId);
}
$('#phpmae-result')
.text((typeof(data.content) == "object")
? JSON.stringify(data.content, null, 2)
: data.content)
.css('color', (data.status == "error") ? "#ff0000" : "#000000");
form.find('button').removeClass('disabled');
});
});
},
loadTemplate : function(template) {
if (dirty == false || window.confirm("Do you want to load this template? This will delete your code changes!"))
fetch('/templates/' + template + '.txt').then(function (response) {
response.text().then(function(data) {
var template = data.split("\n----\n");
if (template.length !== 2) {
alert("Invalid template file!");
return;
}
codeEditor.setValue(template[0]);
configEditor.setValue(template[1]);
// Add class name
var classDefinition = template[0].match(/class\s+(\w+)/);
$('input[name="class"]').val(
(classDefinition.length > 1 ? classDefinition[1] : "")
);
// Build executor function list
var functionOptionsHtml = "";
var firstFunction = null;
do {
functionMatch = functionMatcher.exec(template[0]);
if (functionMatch && functionMatch[2] != "__construct") {
firstFunction = firstFunction || functionMatch[2];
functionOptionsHtml += '<option value="' + functionMatch[2] + '">'
+ functionMatch[2] + '()</option>';
}
} while (functionMatch);
$('select[name=function]').html(functionOptionsHtml).formSelect();
updateParameters(firstFunction);
// Clear output
$('#phpmae-result').text('');
dirty = false;
});
});
},
signin : function() {
alert("Coming soon!")
},
signout : function() {
COWebApp.signOut();
}
};
codeEditor.on("change", function(instance, change) {
dirty = true;
var line = instance.getLine(change.from.line);
if (line.indexOf("class") > -1) {
var classDefinition = instance.getValue().match(/class\s+(\w+)/);
$('input[name="class"]').val(
(classDefinition.length > 1 ? classDefinition[1] : "")
);
} else
if (line.indexOf("function") > -1) {
var sourceCode = instance.getValue();
var selector = $('select[name=function]');
var currentlySelected = selector.val();
var previousExists = false;
var functionOptionsHtml = "";
do {
functionMatch = functionMatcher.exec(sourceCode);
if (functionMatch && functionMatch[2] != "__construct") {
previousExists = previousExists || (functionMatch[2] == currentlySelected);
functionOptionsHtml += '<option value="' + functionMatch[2] + '"'
+ (functionMatch[2] == currentlySelected ? ' selected="selected"' : '')
+ '>' + functionMatch[2] + '()</option>';
}
} while (functionMatch);
selector.html(functionOptionsHtml).formSelect();
updateParameters(selector.val());
}
});
configEditor.on("change", function(instance, change) {
dirty = true;
});
$('.tabs').tabs({
onShow : function() {
codeEditor.refresh();
configEditor.refresh();
}
});
$('select[name=function]').on('change', function() {
updateParameters($(this).val());
}).formSelect();
$('.dropdown-trigger').dropdown({
constrainWidth : false,
coverTrigger : false
});
function fixHeight() {
$('.CodeMirror').css('height', ($(window).height() - $('.CodeMirror').offset().top - 30) + 'px');
}
$(window).on('resize', fixHeight);
fixHeight();
checkSignInStatus();
phpMAE.loadTemplate('helloworld');
// Initialize loader modal
$('#phpmae-load').modal({
onOpenStart : function() {
var domainSelector = $('#phpmae-load-form-domain');
var objectSelector = $('#phpmae-load-form-domain-object');
var step2 = $('#phpmae-load-form-step2');
var coAgwClient = COWebApp.getAccountContext().getClient();
// Get domains and create list in domain selector field
domainSelector.attr('disabled', true).formSelect();
coAgwClient.get('/dr/').then(function(response) {
response.data.domains.forEach(function(domain) {
domainSelector.append('<option value="'
+ domain + '">' + domain + '</option>');
});
domainSelector.attr('disabled', false)
.formSelect(); // re-render with Materialize UI
});
domainSelector.on('change', function() {
if (domainSelector.val() != "") {
step2.show();
// Reset input and view
objectSelector.html('<option value="" selected>Choose your object</option>')
.attr('disabled', true)
.formSelect();
// Get objects and create list in object selector field
coAgwClient.get('/ws/' + domainSelector.val() + '/all.jsonld?type='
+ encodeURIComponent('coid://phpmae.dev/Class') + '&jsonld_format=expanded')
.then(function(response) {
currentDomainDoc = LD(response.data, {
'rdfs' : 'http://www.w3.org/2000/01/rdf-schema#'
});
var ids = currentDomainDoc.queryAll('[@type=' + options.domain + '] > @id');
if (ids.length == 1) {
// Single result is automatically selected
var label = currentDomainDoc
.query('[@id=' + ids[0] + '] > rdfs:label @value');
objectSelector.html('<option value="'
+ ids[0] + '" selected>'
+ (label ? label + ' (' + ids[0] + ')' : ids[0])
+ '</option>');
objectSelector.trigger('change');
} else {
// Multiple results give options
ids.forEach(function(id) {
var label = currentDomainDoc
.query('[@id=' + id + '] > rdfs:label @value');
objectSelector.append('<option value="'
+ id + '">' + (label ? label + ' (' + id + ')' : id) + '</option>');
});
}
objectSelector.attr('disabled', false)
.formSelect(); // re-render with Materialize UI
});
} else {
step2.hide();
}
});
}
});
});