]>
git.proxmox.com Git - pve-http-server.git/blob - src/PVE/APIServer/Formatter/Bootstrap.pm
e67554a1140758cdafe85bb92cd8b522827421b3
1 package PVE
::APIServer
::Formatter
::Bootstrap
;
9 # FIXME: remove console code??
11 # Helpers to generate simple html pages using Bootstrap markup.
14 PVE.open_vm_console = function(node, vmid) {
15 console.log("open vm " + vmid + " on node " + node);
17 var downloadWithName = function(uri, name) {
18 var link = jQuery('#pve_console_anchor');
19 link.attr("href", uri);
21 // Note: we need to tell android the correct file name extension
22 // but we do not set 'download' tag for other environments, because
23 // It can have strange side effects (additional user prompt on firefox)
24 var andriod = navigator.userAgent.match(/Android/i) ? true : false;
26 link.attr("download", name);
29 if (document.createEvent) {
30 var evt = document.createEvent("MouseEvents");
31 evt.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
32 link.get(0).dispatchEvent(evt);
34 link.get(0).fireEvent('onclick');
38 jQuery.ajax("/api2/json/console", {
39 data: { vmid: vmid, node: node },
40 headers: { CSRFPreventionToken: PVE.CSRFPreventionToken },
43 error: function(jqXHR, textStatus, errorThrown) {
44 // fixme: howto view JS errors ?
45 console.log("ERROR " + textStatus + ": " + errorThrown);
47 success: function(data) {
48 var raw = "[virt-viewer]\\n";
49 jQuery.each(data.data, function(k, v) {
50 raw += k + "=" + v + "\\n";
52 var url = 'data:application/x-virt-viewer;charset=UTF-8,' +
53 encodeURIComponent(raw);
55 downloadWithName(url, "pve-spice.vv");
62 my ($class, $res, $url, $auth, $config) = @_;
66 title
=> $config->{title
},
67 cookie_name
=> $config->{cookie_name
},
68 apitoken_name
=> $config->{apitoken_name
},
72 if (my $username = $auth->{userid
}) {
73 $self->{csrftoken
} = $config->{csrfgen_func
}->($username);
80 my ($self, $html) = @_;
82 my $jssetup = "PVE = {};\n\n"; # create namespace
84 if ($self->{csrftoken
}) {
85 $jssetup .= "PVE.CSRFPreventionToken = '$self->{csrftoken}';\n";
88 $jssetup .= "PVE.delete_auth_cookie = function() {\n";
90 if ($self->{cookie_name
}) {
91 $jssetup .= " document.cookie = \"$self->{cookie_name}=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; secure;\";\n";
99 <meta charset="utf-8">
100 <meta http-equiv="X-UA-Compatible" content="IE=edge">
101 <meta name="viewport" content="width=device-width, initial-scale=1">
102 <title>$self->{title}</title>
105 <link href="/js/bootstrap/css/bootstrap.min.css" rel="stylesheet">
107 <script type="text/javascript">
118 <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
119 <script src="/js/jquery/jquery.min.js"></script>
120 <!-- Include all compiled plugins (below), or include individual files as needed -->
121 <script src="/js/bootstrap/js/bootstrap.min.js"></script>
125 <a class="hidden" id="pve_console_anchor"></a>
127 <script type="text/javascript">
135 my $comp_id_counter = 0;
138 my ($self, %param) = @_;
140 $param{tag
} = 'div' if !$param{tag
};
144 my $html = "<$param{tag}";
148 $id = "pveid$comp_id_counter";
168 foreach my $attr (keys %param) {
169 next if $skip->{$attr};
170 my $v = $noescape->{$attr} ?
$param{$attr} : uri_escape_utf8
($param{$attr},"[^\/\ A-Za-z0-9\-\._~]");
171 next if !defined($v);
172 if ($boolattr->{$attr}) {
173 $html .= " $attr" if $v;
175 $html .= " $attr=\"$v\"";
182 if (my $cn = $param{cn}) {
183 if(ref($cn) eq 'ARRAY'){
184 foreach my $rec (@$cn) {
185 $html .= $self->el(%$rec);
188 $html .= $self->el(%$cn);
190 } elsif ($param{html}) {
191 $html .= $param{html};
192 } elsif ($param{text}) {
193 $html .= encode_entities($param{text});
196 $html .= "</$param{tag
}>";
198 return wantarray ? ($html, $id) : $html;
202 my ($self, %param) = @_;
204 return $self->el(class => "alert alert-danger
", %param);
208 my ($self, $js) = @_;
210 $self->{js} .= $js . "\n";
213 my $format_event_callback = sub {
216 my $pstr = encode_json($info->{param});
217 return "function
(e
){$info->{fn
}.apply
(e
, $pstr);}";
221 my ($self, %param) = @_;
223 $param{tag} = 'button';
224 $param{class} = "btn btn-default btn-xs
";
226 if (my $click = delete $param{click}) {
227 my ($html, $id) = $self->el(%param);
228 my $cb = &$format_event_callback($click);
229 $self->add_js("jQuery
('#$id').on
('click', $cb);");
232 return $self->el(%param);