blob: daae21202de2443235e30e7b8aff49c17010b1cf [file] [log] [blame]
<!DOCTYPE html>
<!--
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
-->
<div id="bodydiv" class="body">
<div id="viewform" class="viewform">
<form id="createAppForm">
<table style="width: 100%;">
<tr><td class="label">URL:</td></tr>
<tr><td><span id="hostname" class="readentry"></span><input type="text" id="appName" class="flatentry" size="18" autocapitalize="off" placeholder="New app name"/></td></tr>
<tr><td style="padding-top: 20px;">
<input id="createAppOKButton" type="submit" class="bluebutton" style="font-weight: bold;" value="Create" title="Create the app"/>
<input id="createAppCancelButton" type="button" class="graybutton" value="Cancel"/>
</td></tr>
</table>
</form>
<br/>
</div>
<script type="text/javascript">
(function createbody() {
/**
* Setup page layout.
*/
(function layout() {
document.title = config.windowtitle() + ' - New App';
$('viewhead').innerHTML = '<span class="smenu">New App</span>';
if (!ui.isMobile())
$('viewform').className = 'viewform flatscrollbars';
$('hostname').innerHTML = window.location.hostname + '/';
})();
/**
* Initialize service references.
*/
var editorComp = sca.component("Editor");
var apps = sca.reference(editorComp, "apps");
/**
* The current app entry and corresponding saved XML content.
*/
var appentry;
var savedappxml = '';
/**
* Save an app.
*/
function saveapp(name, entryxml) {
workingstatus(true);
showstatus('Saving');
savedappxml = entryxml;
apps.put(name, savedappxml, function(e) {
if (e) {
if (e.code && e.code == 404) {
alert('name taken');
errorstatus('App name is taken, please pick another name');
workingstatus(false);
return false;
}
showstatus('Local copy');
workingstatus(false);
return false;
}
showstatus('Saved');
workingstatus(false);
// Open the app in the page editor
ui.navigate('/#view=info&app=' + name, '_view');
return false;
});
return false;
}
/**
* Create an app.
*/
$('createAppForm').onsubmit = function() {
// Validate app name
var name = $('appName').value;
if (name.length < 3 || name.length > 10) {
errorstatus('App name must be between 3 and 10 characters');
return false;
}
name = name.toLowerCase();
var anum = name.split('').reduce(function(p, c, i, a) { return p && ((c >= 'a' && c <= 'z') || (c >= '0' && c<= '9')); }, true);
if (!anum) {
errorstatus('App name can only use numbers and letters');
return false;
}
if (name.charAt(0) < 'a' || name.charAt(0) > 'z') {
errorstatus('App name must start with a letter');
return false;
}
// Check reserved app names
var reserved = mklist('account', 'app', 'cache', 'clone', 'create', 'delete', 'graph', 'home', 'login', 'new', 'page', 'proxy', 'public', 'private', 'info', 'store');
if (!isNull(assoc(name, map(function(r) { return mklist(r, r); }, reserved)))) {
alert('invalid name');
errorstatus('App name is taken, please pick another name');
return false;
}
// Clone the 'new' app template
showstatus('Modified');
appentry = mklist("'entry", mklist("'title", name), mklist("'id", 'new'), mklist("'author", username));
var entryxml = car(atom.writeATOMEntry(valuesToElements(mklist(appentry))));
return saveapp(name, entryxml);
};
/**
* Cancel creating an app.
*/
ui.onclick($('createAppCancelButton'), function(e) {
history.back();
});
/**
* Show the status.
*/
onlinestatus();
})();
</script>
</div>