Commit 03cfb3d1 authored by Thomas Lechauve's avatar Thomas Lechauve

New feature: Bang an instance

parent abb1aea3
......@@ -100,7 +100,9 @@
return this.each(function () {
$(this).slapos('discovery', function (access) {
if (access.hasOwnProperty(methodName)) {
var url = args.url || access[methodName].url;
var url = access[methodName].url.replace(/{(\w+)}/, function (matchedText, $1) {
return "" + args[$1]
});
$.extend(args, {'url': url});
$this.slapos('request',
access[methodName].method,
......@@ -129,13 +131,22 @@
},
instanceInfo: function (url, args) {
url = decodeURIComponent(url);
$.extend(args, {'url': url});
$.extend(args, {'instance_url': decodeURIComponent(url)});
return $(this).slapos('prepareRequest', 'instance_info', args);
},
instanceRequest: function (args) {
return $(this).slapos('prepareRequest', 'request_instance', args);
},
instanceBang: function (url, args) {
$.extend(args, {'instance_url': decodeURIComponent(url)});
return $(this).slapos('prepareRequest', 'instance_bang', args);
},
instanceCertificate: function (url, args) {
$.extend(args, {'instance_url': decodeURIComponent(url)});
return $(this).slapos('prepareRequest', 'instance_certificate', args);
}
};
......
......@@ -39,6 +39,15 @@
</article>
</script>
<script id="form.bang.instance" type="text/html">
<form class="form-horizontal" id="form-bang">
<label>Why do you want to bang this instance ?</label>
<input class="input-large" name="log" type="text">
<button class="btn btn-primary" type="submit" name="submit">Bang</button>
<button class="btn">Cancel</button>
</form>
</script>
<script id="form.new.instance" type="text/html">
<article>
<form class="form-horizontal">
......@@ -51,7 +60,7 @@
</div>
</div>
<div class="control-group">
<label class="control-label">Software release</label>
><label class="control-label">Software release</label>
<div class="controls">
<input type="text" class="input-xlarge" required name="software_release"/>
</div>
......@@ -73,15 +82,17 @@
<script id="instance" type="text/html">
{{! Service page template }}
<article>
<div class="subnav">
<ul class="nav nav-pills">
{{# actions }}
<li><a href="{{ url }}">{{ name }}</a></li>
{{/ actions}}
</ul>
</div>
<form class="form-horizontal" id="instance-form">
<fieldset>
<legend>
{{ title }}
<div class="pull-right">
<div class="btn">Bang</div>
<div class="btn">Destroy</div>
</div>
</legend>
<div class="control-group">
<label class="control-label">Reference</label>
......@@ -133,7 +144,6 @@
</textarea>
</fieldset>
</form>
</article>
</script>
<script id="instance.stop_requested" type="text/html">
......@@ -229,6 +239,7 @@
<script type="text/javascript" src="static/js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="static/js/bootstrap-alert.js"></script>
<script type="text/javascript" src="static/js/bootstrap-modal.js"></script>
<script type="text/javascript" src="static/js/spin.js"></script>
<script type="text/javascript" src="static/js/jquery-spin.js"></script>
<script type="text/javascript" src="static/js/ICanHaz.min.js"></script>
......
......@@ -8,6 +8,7 @@
var routes = {
'/instance' : 'requestInstance',
'/instance/:url' : 'showInstance',
'/instance/:url/bang' : 'showBangInstance',
'/computers' : 'listComputers',
'/instances' : 'listInstances',
'/invoices' : 'listInvoices'
......@@ -25,6 +26,21 @@
});
},
/* Based on ben alman code
* https://raw.github.com/cowboy/jquery-misc/master/jquery.ba-serializeobject.js
*/
serializeObject = function () {
var obj = {};
$.each($(this).serializeArray(), function (i, o) {
var k = o.name,
v = o.value;
obj[k] = obj[k] === undefined ? v
: $.isArray(obj[k]) ? obj[k].concat(v)
: [obj[k], v];
});
return obj;
},
getDate = function () {
var today = new Date();
return [today.getFullYear(), today.getMonth(), today.getDay()].join('/') +
......@@ -100,7 +116,7 @@
},
genInstanceUrl: function (uri) {
return location.href.split('#')[0] + '#/instance/' + encodeURIComponent(uri);
return $.genHash(['instance', encodeURIComponent(uri)]);
},
extractInstanceURIFromHref: function () {
......@@ -108,7 +124,13 @@
},
extractInstanceURIFromHashtag: function () {
return decodeURIComponent(window.location.hash.split('/').pop());
var loc = window.location.hash.split('/'),
i = $.inArray("instance", loc);
return (i !== -1 && loc.length > i) ? decodeURIComponent(loc[i + 1]) : "";
},
genBangUrl: function (uri) {
return $.genHash(["instance", encodeURIComponent(uri), "bang"]);
},
authenticate: function (data) {
......@@ -143,6 +165,9 @@
$(this).slapos('instanceInfo', uri, {
success: function (infos) {
infos.status = $(this).vifib('getRender', 'instance.' + infos.status);
infos.actions = [
{name: "Bang", url: methods.genBangUrl(decodeURIComponent(uri))}
];
$(this).vifib('render', 'instance', infos);
var form = $(this).find("#instance-form");
form.vifib('prepareForm');
......@@ -158,6 +183,7 @@
prepareForm: function () {
$(this).vifib('bindStopStartButtons');
$("#bangInstance").click();
$(this).vifib('refresh', methods.refreshInstanceForm, 30);
},
......@@ -185,6 +211,31 @@
return false;
},
showBangInstance: function () {
var statusCode = {
400: bad_request,
401: redirect,
402: payment,
404: notFound,
500: serverError,
};
return this.each(function () {
$(this).vifib("render", 'form.bang.instance');
$(this).find("#form-bang").submit(function () {
var data = $(this).serializeObject(),
uri = methods.extractInstanceURIFromHashtag();
$(this).slapos('instanceBang', uri, {
data: data,
statusCode: statusCode,
success: function () {
$.redirect(['instance', encodeURIComponent(uri)]);
}
});
return false;
});
});
},
changeStatusInstance: function (status) {
var uri = methods.extractInstanceURIFromHashtag(),
data = $(this).vifib('extractInstanceInfo');
......@@ -325,7 +376,6 @@
popup: function (message, state) {
state = state || 'error';
console.log($(this));
return this.each(function () {
$(this).prepend(ich.error({
'message': message,
......@@ -363,6 +413,21 @@
$.error( 'Method ' + method + ' does not exist on jQuery.vifib' );
}
};
/* Thanks to Ben Alman
* https://raw.github.com/cowboy/jquery-misc/master/jquery.ba-serializeobject.js
*/
$.fn.serializeObject = function(){
var obj = {};
$.each( this.serializeArray(), function(i,o){
var n = o.name,
v = o.value;
obj[n] = obj[n] === undefined ? v
: $.isArray( obj[n] ) ? obj[n].concat( v )
: [ obj[n], v ];
});
return obj;
};
})(jQuery);
$('#main').vifib();
......@@ -138,6 +138,11 @@
instanceRequest: function (args) {
return $(this).slapos('prepareRequest', 'request_instance', args);
},
instanceBang: function (url, args) {
$.extend(args, {'instance_url': decodeURIComponent(url)});
return $(this).slapos('prepareRequest', 'instance_bang', args);
},
instanceCertificate: function (url, args) {
$.extend(args, {'instance_url': decodeURIComponent(url)});
......
......@@ -34,7 +34,7 @@ $.extractAuth = function (hashTag) {
};
$.genHash = function(url) {
return '/' + url.join('/');
return '#/' + url.join('/');
};
/* Pub / Sub Pattern
......@@ -55,10 +55,10 @@ $.publish = function() {
// Event Handlers
$.hashHandler = function(){ $.publish('urlChange', $.parseHash(window.location.hash.substr(1))); };
$.redirectHandler = function(e, url){ window.location.hash = $.genHash([url]); };
$.redirectHandler = function(e, url){ window.location.hash = $.genHash(url); };
// redirections manager
$.redirect = function(url){ $.publish('redirect', url); };
$.redirect = function(url){ $.publish('redirect', [url]); };
$.subscribe('redirect', $.redirectHandler)
$(window).bind('hashchange', $.hashHandler);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment