diff --git a/plist b/plist
index a201f4184d..1c2b75a41a 100644
--- a/plist
+++ b/plist
@@ -2056,7 +2056,9 @@
/usr/local/opnsense/www/css/jqtree.css
/usr/local/opnsense/www/css/jquery.bootgrid.css
/usr/local/opnsense/www/css/nv.d3.css
+/usr/local/opnsense/www/css/opnsense-bootgrid.css
/usr/local/opnsense/www/css/pick-a-color-1.2.3.min.css
+/usr/local/opnsense/www/css/tabulator.min.css
/usr/local/opnsense/www/css/tokenize2.css
/usr/local/opnsense/www/fonts/FontAwesome.otf
/usr/local/opnsense/www/fonts/glyphicons-halflings-regular.eot
@@ -2097,6 +2099,7 @@
/usr/local/opnsense/www/js/nv.d3.min.js.LICENSE.md
/usr/local/opnsense/www/js/opnsense-treeview.js
/usr/local/opnsense/www/js/opnsense.js
+/usr/local/opnsense/www/js/opnsense_bootgrid.js
/usr/local/opnsense/www/js/opnsense_bootgrid_plugin.js
/usr/local/opnsense/www/js/opnsense_health.js
/usr/local/opnsense/www/js/opnsense_status.js
@@ -2109,6 +2112,8 @@
/usr/local/opnsense/www/js/polyfills.js
/usr/local/opnsense/www/js/qrcode.js
/usr/local/opnsense/www/js/smoothie.js
+/usr/local/opnsense/www/js/tabulator.min.js
+/usr/local/opnsense/www/js/tabulator.min.js.map
/usr/local/opnsense/www/js/theme.js
/usr/local/opnsense/www/js/tinycolor-1.4.1.min.js
/usr/local/opnsense/www/js/tokenize2.js
@@ -2233,6 +2238,7 @@
/usr/local/opnsense/www/themes/opnsense-dark/assets/stylesheets/dashboard.scss
/usr/local/opnsense/www/themes/opnsense-dark/assets/stylesheets/dns-overview.scss
/usr/local/opnsense/www/themes/opnsense-dark/assets/stylesheets/main.scss
+/usr/local/opnsense/www/themes/opnsense-dark/assets/stylesheets/opnsense-bootgrid.scss
/usr/local/opnsense/www/themes/opnsense-dark/build/css/bootstrap-dialog.css
/usr/local/opnsense/www/themes/opnsense-dark/build/css/bootstrap-select.css
/usr/local/opnsense/www/themes/opnsense-dark/build/css/dashboard.css
@@ -2240,6 +2246,7 @@
/usr/local/opnsense/www/themes/opnsense-dark/build/css/jquery.bootgrid.css
/usr/local/opnsense/www/themes/opnsense-dark/build/css/main.css
/usr/local/opnsense/www/themes/opnsense-dark/build/css/nv.d3.css
+/usr/local/opnsense/www/themes/opnsense-dark/build/css/opnsense-bootgrid.css
/usr/local/opnsense/www/themes/opnsense-dark/build/css/tokenize2.css
/usr/local/opnsense/www/themes/opnsense-dark/build/fonts/LICENSE.SourceSansPro.txt
/usr/local/opnsense/www/themes/opnsense-dark/build/fonts/SourceSansPro-Bold/SourceSansPro-Bold.eot
@@ -2354,9 +2361,11 @@
/usr/local/opnsense/www/themes/opnsense/assets/stylesheets/config/colors.scss
/usr/local/opnsense/www/themes/opnsense/assets/stylesheets/dashboard.scss
/usr/local/opnsense/www/themes/opnsense/assets/stylesheets/main.scss
+/usr/local/opnsense/www/themes/opnsense/assets/stylesheets/opnsense-bootgrid.scss
/usr/local/opnsense/www/themes/opnsense/build/css/bootstrap-dialog.css
/usr/local/opnsense/www/themes/opnsense/build/css/dashboard.css
/usr/local/opnsense/www/themes/opnsense/build/css/main.css
+/usr/local/opnsense/www/themes/opnsense/build/css/opnsense-bootgrid.css
/usr/local/opnsense/www/themes/opnsense/build/fonts/LICENSE.SourceSansPro.txt
/usr/local/opnsense/www/themes/opnsense/build/fonts/SourceSansPro-Bold/SourceSansPro-Bold.eot
/usr/local/opnsense/www/themes/opnsense/build/fonts/SourceSansPro-Bold/SourceSansPro-Bold.otf
diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php b/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php
index b722574dce..1f34287529 100644
--- a/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php
+++ b/src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php
@@ -67,14 +67,14 @@ class ControllerBase extends ControllerRoot
// JQuery Tokenize2 (https://zellerda.github.io/Tokenize2/)
'/ui/js/tokenize2.js',
// Bootgrid (grid system from http://www.jquery-bootgrid.com/ )
- '/ui/js/jquery.bootgrid.js',
+ '/ui/js/tabulator.min.js',
+ '/ui/js/opnsense_bootgrid.js',
// Bootstrap type ahead
'/ui/js/bootstrap3-typeahead.min.js',
// OPNsense standard toolkit
'/ui/js/opnsense.js',
'/ui/js/opnsense_theme.js',
'/ui/js/opnsense_ui.js',
- '/ui/js/opnsense_bootgrid_plugin.js',
'/ui/js/opnsense_status.js',
// bootstrap script
'/ui/js/bootstrap.min.js',
@@ -96,6 +96,8 @@ class ControllerBase extends ControllerRoot
'/css/bootstrap-select.css',
// bootstrap dialog
'/css/bootstrap-dialog.css',
+ '/css/tabulator.min.css',
+ '/css/opnsense-bootgrid.css',
// Font awesome
'/ui/assets/fontawesome/css/all.min.css',
'/ui/assets/fontawesome/css/v4-shims.min.css',
diff --git a/src/opnsense/mvc/app/views/OPNsense/Core/hasync_status.volt b/src/opnsense/mvc/app/views/OPNsense/Core/hasync_status.volt
index 41d56ebaee..940c7af729 100644
--- a/src/opnsense/mvc/app/views/OPNsense/Core/hasync_status.volt
+++ b/src/opnsense/mvc/app/views/OPNsense/Core/hasync_status.volt
@@ -84,13 +84,13 @@
$(".xmlrpc_srv_status_act").each(function(){
switch($(this).data('service_action')) {
case 'start':
- $(this).tooltip({title: "{{ lang._('Start') | safe}}"});
+ $(this).tooltip({title: "{{ lang._('Start') | safe}}", container: "body", trigger: "hover"});
break;
case 'restart':
- $(this).tooltip({title: "{{ lang._('Synchronize and Restart') | safe}}"});
+ $(this).tooltip({title: "{{ lang._('Synchronize and Restart') | safe}}", container: "body", trigger: "hover"});
break;
case 'stop':
- $(this).tooltip({title: "{{ lang._('Stop') | safe}}"});
+ $(this).tooltip({title: "{{ lang._('Stop') | safe}}", container: "body", trigger: "hover"});
break;
}
$(this).click(function(){
@@ -110,17 +110,25 @@
$("#status_error").show();
}
$("#status_query").hide();
- });
- $("#act_restart_all").click(function(){
- let icon = $(this).find('i');
- if (icon.hasClass('spinner')) {
- return;
- }
- icon.removeClass('fa-repeat').addClass('fa-spinner fa-pulse');
- ajaxCall('/api/core/hasync_status/restart_all', {}, function(data){
- icon.removeClass('fa-spinner fa-pulse').addClass('fa-repeat');
- $('#grid_services').bootgrid('reload');
- });
+
+ $("#grid_services-header > .row > .actionBar").prepend($(`
+
+ {{ lang._('Synchronize and reconfigure all') }}
+
+
+
+
+ `).click(function() {
+ let icon = $(this).find('i');
+ if (icon.hasClass('spinner')) {
+ return;
+ }
+ icon.removeClass('fa-repeat').addClass('fa-spinner fa-pulse');
+ ajaxCall('/api/core/hasync_status/restart_all', {}, function(data){
+ icon.removeClass('fa-spinner fa-pulse').addClass('fa-repeat');
+ $('#grid_services').bootgrid('reload');
+ });
+ }));
});
});
@@ -177,16 +185,6 @@
-
-
- | {{ lang._('Synchronize and reconfigure all') }} |
-
-
-
-
- |
-
-
diff --git a/src/opnsense/mvc/app/views/OPNsense/Core/service.volt b/src/opnsense/mvc/app/views/OPNsense/Core/service.volt
index 93a83aeda1..2146e97d9f 100644
--- a/src/opnsense/mvc/app/views/OPNsense/Core/service.volt
+++ b/src/opnsense/mvc/app/views/OPNsense/Core/service.volt
@@ -32,7 +32,6 @@
search:'/api/core/service/search',
options:{
multiSelect: false,
- rowSelect: true,
selection: false,
formatters:{
commands: function (column, row) {
@@ -47,20 +46,16 @@
},
status: function (column, row) {
if (row['running']) {
- return '';
+ return '';
} else {
- return '';
+ return '';
}
}
}
}
});
grid_service.on('loaded.rs.jquery.bootgrid', function () {
- $('[data-toggle="tooltip"]').tooltip();
- let ids = $("#grid-service").bootgrid("getCurrentRows");
- if (ids.length > 0) {
- $("#grid-service").bootgrid('select', [ids[0].name]);
- }
+ $('[data-toggle="tooltip"]').tooltip({container: 'body', trigger: 'hover'});
$('.command-stop').click(function () {
$(this).toggleClass('disabled');
$(this).children().toggleClass('fa-stop fa-spinner fa-pulse');
@@ -92,12 +87,11 @@
| {{ lang._('ID') }} |
- |
+ |
{{ lang._('Name') }} |
{{ lang._('Description') }} |
|
- |
- |
+ |
diff --git a/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt b/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt
index 45b888cefe..3e531f7266 100644
--- a/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt
+++ b/src/opnsense/mvc/app/views/OPNsense/DHCPv4/leases.volt
@@ -54,6 +54,7 @@
search:'/api/dhcpv4/leases/searchLease/',
del:'/api/dhcpv4/leases/delLease/',
options: {
+ virtualDOM: true,
selection: false,
multiSelect: false,
useRequestHandlerOnGet: true,
@@ -94,8 +95,11 @@
"tooltipformatter": function (column, row) {
return '' + row[column.id] + '
'
},
- "statusformatter": function (column, row) {
+ "statusformatter": function (column, row, onRendered) {
let connected = row.status == 'online' ? 'text-success' : 'text-danger';
+ onRendered(() => {
+ $('[data-toggle="tooltip"]').tooltip({container: 'body', trigger: 'hover'});
+ })
return ''
},
"commands": function (column, row) {
@@ -118,7 +122,7 @@
/* The delete action can be hooked up to the default bootgrid behaviour */
let deleteip = '