first commit
This commit is contained in:
115
routes/admin_route.js
Executable file
115
routes/admin_route.js
Executable file
@ -0,0 +1,115 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const dotenv = require('dotenv');
|
||||
const conn = require('../conn');
|
||||
const connection = conn.connection;
|
||||
const md5 = require('md5');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
// connection.connect((err) => {
|
||||
// if (err) {
|
||||
// console.error('Error connecting to MySQL database: ' + err.stack);
|
||||
// return;
|
||||
// }
|
||||
// console.log('Connected to MySQL database as id ' + connection.threadId);
|
||||
// })
|
||||
|
||||
dotenv.config();
|
||||
|
||||
router.get('/', async (req, res) => {
|
||||
res.sendFile(__dirname + '/ui/index.html');
|
||||
})
|
||||
|
||||
router.get('/list' , (req, res) => {
|
||||
res.sendFile(__dirname + '/ui/list.html');
|
||||
})
|
||||
|
||||
router.post('/' , (req, res) => {
|
||||
const { nama, alamat, langganan } = req.body;
|
||||
const query = "INSERT INTO tb_ont (nama, alamat, langganan) VALUES (?, ?, ?)";
|
||||
connection.query(query, [nama, alamat, langganan], (err, result) => {
|
||||
if (err) {
|
||||
console.log(err, "error menerima data");
|
||||
return res.status(500).send('Internal Server Error');
|
||||
}
|
||||
return res.status(200).send(result);
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
|
||||
router.get('/data', async (req, res) => {
|
||||
// get parameter
|
||||
const status = req.query.status == "all" ? true : false
|
||||
const query = 'SELECT * FROM tb_ont '+ (status ? "" : "WHERE status != '-'");
|
||||
connection.query(query, (err, result) => {
|
||||
if (err) {
|
||||
console.log(err, "error menerima data");
|
||||
return res.status(500).send('Internal Server Error');
|
||||
}
|
||||
|
||||
result.forEach(item => {
|
||||
if (item.updated) {
|
||||
// Convert the updated value to a Date object (if not already)
|
||||
let date = item.updated instanceof Date ? item.updated : new Date(item.updated);
|
||||
|
||||
// Add UTC+8 offset (8 hours in milliseconds)
|
||||
let utcPlus8 = new Date(date.getTime() + 8 * 60 * 60 * 1000);
|
||||
|
||||
// Format the datetime
|
||||
item.updated = utcPlus8.toISOString().replace("T", " ").slice(0, -5);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
return res.status(200).send(result);
|
||||
})
|
||||
})
|
||||
|
||||
router.get('/data/:id', async (req, res) => {
|
||||
const { id } = req.params;
|
||||
const query = 'SELECT * FROM tb_ont WHERE id = ?';
|
||||
connection.query(query, [id], (err, result) => {
|
||||
if (err) {
|
||||
console.log(err, "error menerima data");
|
||||
return res.status(500).send('Internal Server Error');
|
||||
}
|
||||
if (result.length === 0) {
|
||||
return res.status(404).send('Data not found');
|
||||
}
|
||||
let date = result[0].updated instanceof Date ? result[0].updated : new Date(result[0].updated);
|
||||
let utcPlus8 = new Date(date.getTime() + 8 * 60 * 60 * 1000);
|
||||
result[0].updated = utcPlus8.toISOString().replace("T", " ").slice(0, -5);
|
||||
return res.status(200).send(result[0]);
|
||||
})
|
||||
})
|
||||
|
||||
router.delete('/:id', async (req, res) => {
|
||||
const { id } = req.params;
|
||||
const query = 'DELETE FROM tb_ont WHERE id = ?';
|
||||
connection.query(query, [id], (err, result) => {
|
||||
if (err) {
|
||||
console.log(err, "error menghapus data");
|
||||
return res.status(500).send('Internal Server Error');
|
||||
}
|
||||
return res.status(200).send(result);
|
||||
})
|
||||
})
|
||||
|
||||
router.get('/count', async (req, res) => {
|
||||
const query = "SELECT COUNT(*) AS all_count,SUM(status = 'Terhubung ke Wifi dan Internet') AS connected_count FROM tb_ont;"
|
||||
connection.query(query, (err, result) => {
|
||||
if (err) {
|
||||
console.log(err, "error menerima data");
|
||||
return res.status(500).send('Internal Server Error');
|
||||
}
|
||||
return res.status(200).send(result[0]);
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
|
||||
module.exports = router
|
390
routes/ui/index.html
Executable file
390
routes/ui/index.html
Executable file
@ -0,0 +1,390 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Halaman Utama</title>
|
||||
|
||||
<!-- Main Styles -->
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- mCustomScrollbar -->
|
||||
<link rel="stylesheet" href="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Sweet Alert -->
|
||||
<link rel="stylesheet" href="/plugin/sweet-alert/sweetalert.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/fontello/fontello.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design/css/materialdesignicons.css">
|
||||
<link rel="stylesheet" href="/plugin/datatables/media/css/dataTables.bootstrap.min.css">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="main-menu">
|
||||
<header class="header">
|
||||
<a href="/" class="logo">ONT Checker</a>
|
||||
<button type="button" class="button-close fa fa-times js__menu_close"></button>
|
||||
<div class="user">
|
||||
<a href="#" class="avatar"><img src="/images/visitor.png" alt=""></a>
|
||||
<h5 class="name"><a href="#">Admin</a></h5>
|
||||
<h5 class="position">Administrator</h5>
|
||||
<!-- /.name -->
|
||||
<!-- <div class="control-wrap js__drop_down">
|
||||
<i class="fa fa-caret-down js__drop_down_button"></i>
|
||||
<div class="control-list">
|
||||
<div class="control-item"><a href="profile.html"><i class="fa fa-user"></i> Profile</a></div>
|
||||
<div class="control-item"><a href="#"><i class="fa fa-gear"></i> Settings</a></div>
|
||||
<div class="control-item"><a href="#"><i class="fa fa-sign-out"></i> Log out</a></div>
|
||||
</div>
|
||||
|
||||
</div> -->
|
||||
<!-- /.control-wrap -->
|
||||
</div>
|
||||
<!-- /.user -->
|
||||
</header>
|
||||
<!-- /.header -->
|
||||
<div class="content">
|
||||
|
||||
<div class="navigation">
|
||||
<h5 class="title">Navigasi</h5>
|
||||
<!-- /.title -->
|
||||
<ul class="menu js__accordion">
|
||||
<li class="current">
|
||||
<a class="waves-effect" href="/admin"><i class="menu-icon fa fa-home"></i><span>Halaman
|
||||
Utama</span></a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/admin/list"><i class="menu-icon fa fa-list"></i><span>List
|
||||
ONT</span></a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<!-- <li>
|
||||
<a class="waves-effect" href="/before-login/siswa" ><i
|
||||
class="menu-icon fa fa-users"></i><span>Siswa</span></a>
|
||||
</li>
|
||||
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="#" onclick="notAvailable()"><i
|
||||
class="menu-icon ico mdi mdi-account-switch"></i><span>Staf</span></a>
|
||||
</li>
|
||||
-->
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/"><i
|
||||
class="menu-icon ico icon-logout"></i><span>Logout</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- /.navigation -->
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.main-menu -->
|
||||
|
||||
<div class="fixed-navbar">
|
||||
<div class="pull-left">
|
||||
<button type="button"
|
||||
class="menu-mobile-button glyphicon glyphicon-menu-hamburger js__menu_mobile"></button>
|
||||
<h1 class="page-title">Halaman Utama</h1>
|
||||
<!-- /.page-title -->
|
||||
</div>
|
||||
<!-- /.pull-left -->
|
||||
<div class="pull-right">
|
||||
|
||||
|
||||
<a href="/before-login" class="ico-item ico icon-login"></a>
|
||||
</div>
|
||||
<!-- /.pull-right -->
|
||||
</div>
|
||||
<!-- /.fixed-navbar -->
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="main-content">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah ONT</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/ont.png" alt="" style="width: 83%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="all-ont-counter">-</h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">ONT</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Terhubung</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/ont.png" alt="" style="width: 83%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="connected-ont-counter">-</h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">ONT</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Disconnected</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/ont.png" alt="" style="width: 83%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="disconnected-ont-counter">-</h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">ONT</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
|
||||
<!-- <div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Teknisi</h4>
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/staf.png" alt="" style="width: 110%;">
|
||||
</div>
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="staf-counter">10</h2>
|
||||
<p class="text">Orang</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-12">
|
||||
<div class="box-content card">
|
||||
<h4 class="box-title">List ONT Dengan ONT Checker</h4>
|
||||
<!-- /.box-title -->
|
||||
<div class="card-content">
|
||||
|
||||
<table id="tb-ont" class="table table-striped table-bordered display" style="width:100%; ">
|
||||
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<footer class="footer">
|
||||
<ul class="list-inline">
|
||||
<li>2024 © ONT Checker.</li>
|
||||
<!-- <li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Help</a></li> -->
|
||||
</ul>
|
||||
</footer>
|
||||
</div>
|
||||
<!-- /.main-content -->
|
||||
</div><!--/#wrapper -->
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/sweet-alert/sweetalert.min.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
<!-- Full Screen Plugin -->
|
||||
<script src="/plugin/fullscreen/jquery.fullscreen-min.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/color-switcher/color-switcher.min.js"></script>
|
||||
|
||||
<script src="/plugin/datatables/media/js/jquery.dataTables.min.js"></script>
|
||||
<script src="/plugin/datatables/media/js/dataTables.bootstrap.min.js"></script>
|
||||
<script src="/plugin/datatables/extensions/Responsive/js/dataTables.responsive.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
|
||||
<script>
|
||||
|
||||
function reloadData() {
|
||||
var all_count = $.ajax({
|
||||
url: '/admin/count',
|
||||
async: false
|
||||
}).responseJSON;
|
||||
console.log(all_count);
|
||||
|
||||
$(".all-ont-counter").html(all_count.all_count);
|
||||
$(".connected-ont-counter").html(all_count.connected_count);
|
||||
$(".disconnected-ont-counter").html(all_count.all_count - all_count.connected_count);
|
||||
|
||||
}
|
||||
function reloadTable() {
|
||||
// var all_count = $.ajax({
|
||||
// url: '/admin/count',
|
||||
// async: false
|
||||
// }).responseJSON;
|
||||
// console.log(all_count);
|
||||
|
||||
// $(".all-ont-counter").html(all_count.all_count);
|
||||
// $(".connected-ont-counter").html(all_count.connected_count);
|
||||
// $(".disconnected-ont-counter").html(all_count.all_count - all_count.connected_count);
|
||||
|
||||
// Initialize DataTable if not already initialized
|
||||
var table = $('#tb-ont').DataTable({
|
||||
scrollX: true,
|
||||
responsive: true,
|
||||
ajax: {
|
||||
url: '/admin/data?status=connected',
|
||||
type: 'GET',
|
||||
timeout: 120000,
|
||||
dataSrc: function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
"sAjaxDataProp": "",
|
||||
"aoColumns": [
|
||||
{
|
||||
"mData": "nama",
|
||||
"title": "NAMA",
|
||||
"render": function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": "alamat",
|
||||
"title": "Alamat",
|
||||
"render": function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": "langganan",
|
||||
"title": "Langganan",
|
||||
"render": function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": null,
|
||||
"title": "Status",
|
||||
"render": function (data) {
|
||||
return "<p id='td_status_" + data.id + "'>" + data.status + "</p>";
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": null,
|
||||
"title": "Last Update",
|
||||
"render": function (data) {
|
||||
return "<p id='td_updated_" + data.id + "'>" + data.updated + "</p>";
|
||||
}
|
||||
},
|
||||
]
|
||||
});
|
||||
return table; // Return the table instance
|
||||
}
|
||||
|
||||
// Initialize the DataTable and store it in a variable
|
||||
var table = reloadTable();
|
||||
reloadData();
|
||||
|
||||
// Function to refresh only the td content
|
||||
function refreshTdStatus() {
|
||||
table.rows().every(function (rowIdx, tableLoop, rowLoop) {
|
||||
var row = this.data();
|
||||
var id = row.id;
|
||||
var status = row.status;
|
||||
var updated = row.updated;
|
||||
$('#td_status_' + id).html(status);
|
||||
$('#td_updated_' + id).html(updated);
|
||||
});
|
||||
}
|
||||
|
||||
// Refresh the table every 5 seconds
|
||||
setInterval(() => {
|
||||
table.ajax.reload(null, false); // Reload data without resetting the state
|
||||
refreshTdStatus(); // Refresh the td content
|
||||
reloadData()
|
||||
}, 5000);
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
570
routes/ui/list.html
Executable file
570
routes/ui/list.html
Executable file
@ -0,0 +1,570 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
|
||||
<title>Halaman LIst ONT</title>
|
||||
|
||||
<!-- Main Styles -->
|
||||
<link rel="stylesheet" href="/styles/style.min.css">
|
||||
|
||||
<!-- mCustomScrollbar -->
|
||||
<link rel="stylesheet" href="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.min.css">
|
||||
|
||||
<!-- Waves Effect -->
|
||||
<link rel="stylesheet" href="/plugin/waves/waves.min.css">
|
||||
|
||||
<!-- Sweet Alert -->
|
||||
<link rel="stylesheet" href="/plugin/sweet-alert/sweetalert.css">
|
||||
|
||||
<link rel="stylesheet" href="/fonts/fontello/fontello.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design-iconic-font/css/material-design-iconic-font.min.css">
|
||||
<link rel="stylesheet" href="/fonts/material-design/css/materialdesignicons.css">
|
||||
<link rel="stylesheet" href="/plugin/datatables/media/css/dataTables.bootstrap.min.css">
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="main-menu">
|
||||
<header class="header">
|
||||
<a href="/" class="logo">ONT Checker</a>
|
||||
<button type="button" class="button-close fa fa-times js__menu_close"></button>
|
||||
<div class="user">
|
||||
<a href="#" class="avatar"><img src="/images/visitor.png" alt=""></a>
|
||||
<h5 class="name"><a href="#">Admin</a></h5>
|
||||
<h5 class="position">Administrator</h5>
|
||||
<!-- /.name -->
|
||||
<!-- <div class="control-wrap js__drop_down">
|
||||
<i class="fa fa-caret-down js__drop_down_button"></i>
|
||||
<div class="control-list">
|
||||
<div class="control-item"><a href="profile.html"><i class="fa fa-user"></i> Profile</a></div>
|
||||
<div class="control-item"><a href="#"><i class="fa fa-gear"></i> Settings</a></div>
|
||||
<div class="control-item"><a href="#"><i class="fa fa-sign-out"></i> Log out</a></div>
|
||||
</div>
|
||||
|
||||
</div> -->
|
||||
<!-- /.control-wrap -->
|
||||
</div>
|
||||
<!-- /.user -->
|
||||
</header>
|
||||
<!-- /.header -->
|
||||
<div class="content">
|
||||
|
||||
<div class="navigation">
|
||||
<h5 class="title">Navigasi</h5>
|
||||
<!-- /.title -->
|
||||
<ul class="menu js__accordion">
|
||||
<li>
|
||||
<a class="waves-effect" href="/admin"><i class="menu-icon fa fa-home"></i><span>Halaman
|
||||
Utama</span></a>
|
||||
</li>
|
||||
|
||||
<li class="current">
|
||||
<a class="waves-effect" href="/admin/list"><i class="menu-icon fa fa-list"></i><span>List
|
||||
ONT</span></a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<!-- <li>
|
||||
<a class="waves-effect" href="/before-login/siswa" ><i
|
||||
class="menu-icon fa fa-users"></i><span>Siswa</span></a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="#" onclick="notAvailable()"><i
|
||||
class="menu-icon ico mdi mdi-account-switch"></i><span>Staf</span></a>
|
||||
</li>
|
||||
-->
|
||||
|
||||
<li>
|
||||
<a class="waves-effect" href="/"><i
|
||||
class="menu-icon ico icon-logout"></i><span>Logout</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
<!-- /.navigation -->
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.main-menu -->
|
||||
|
||||
<div class="fixed-navbar">
|
||||
<div class="pull-left">
|
||||
<button type="button"
|
||||
class="menu-mobile-button glyphicon glyphicon-menu-hamburger js__menu_mobile"></button>
|
||||
<h1 class="page-title">Halaman List ONT</h1>
|
||||
<!-- /.page-title -->
|
||||
</div>
|
||||
<!-- /.pull-left -->
|
||||
<div class="pull-right">
|
||||
|
||||
|
||||
<a href="/before-login" class="ico-item ico icon-login"></a>
|
||||
</div>
|
||||
<!-- /.pull-right -->
|
||||
</div>
|
||||
<!-- /.fixed-navbar -->
|
||||
|
||||
<div id="wrapper">
|
||||
<div class="main-content">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah ONT</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/ont.png" alt="" style="width: 83%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="all-ont-counter">-</h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">ONT</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Terhubung</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/ont.png" alt="" style="width: 83%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="connected-ont-counter">-</h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">ONT</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Disconnected</h4>
|
||||
<!-- /.box-title -->
|
||||
|
||||
<!-- /.dropdown js__dropdown -->
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/ont.png" alt="" style="width: 83%;">
|
||||
</div>
|
||||
<!-- show this icon ico icon-users-1 -->
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="disconnected-ont-counter">-</h2>
|
||||
<!-- /.counter -->
|
||||
<p class="text">ONT</p>
|
||||
<!-- /.text -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.right-content -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
|
||||
<!-- <div class="col-lg-4 col-md-4 col-xs-12">
|
||||
<div class="box-content">
|
||||
<h4 class="box-title">Jumlah Teknisi</h4>
|
||||
<div class="content">
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-6">
|
||||
<img src="/images/staf.png" alt="" style="width: 110%;">
|
||||
</div>
|
||||
|
||||
<div class="col-xs-6">
|
||||
<div class="right-content">
|
||||
<h2 class="staf-counter">10</h2>
|
||||
<p class="text">Orang</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row small-spacing">
|
||||
<div class="col-xs-12">
|
||||
<div class="box-content card">
|
||||
<h4 class="box-title">List ONT </h4>
|
||||
<!-- /.box-title -->
|
||||
<div class="card-content">
|
||||
<div class="form-group">
|
||||
<button type="button" class="btn btn-primary btn-xs"
|
||||
onclick="bukaModal('tambah');">Tambah
|
||||
ONT</button>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<table id="tb-ont" class="table table-striped table-bordered display"
|
||||
style="width:100%; ">
|
||||
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.box-content -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<footer class="footer">
|
||||
<ul class="list-inline">
|
||||
<li>2024 © ONT Checker.</li>
|
||||
<!-- <li><a href="#">Privacy</a></li>
|
||||
<li><a href="#">Terms</a></li>
|
||||
<li><a href="#">Help</a></li> -->
|
||||
</ul>
|
||||
</footer>
|
||||
</div>
|
||||
<!-- /.main-content -->
|
||||
</div><!--/#wrapper -->
|
||||
|
||||
<div class="modal fade" id="modal-ont" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
|
||||
aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="modal-ont-title">Modal title</h4>
|
||||
</div>
|
||||
<form class="modal-body" id="form-modal">
|
||||
<div class="form-group">
|
||||
<label for="modal-ont-nama">Nama</label>
|
||||
<input type="text" class="form-control" id="nama" maxlength="50" placeholder="Masukkan Nama">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="modal-ont-alamat">Alamat</label>
|
||||
<textarea name="alamat" class="form-control" id="alamat"
|
||||
placeholder="Masukkan Alamat"></textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="modal-ont-langganan">Langganan</label>
|
||||
<select class="form-control" id="select-langanan">
|
||||
<option value="" disabled selected>-Pilih Jenis Langganan</option>
|
||||
<option value="30mbps/bulan">30mbps/bulan</option>
|
||||
<option value="50mbps/bulan">50mbps/bulan</option>
|
||||
<option value="100mbps/bulan">100mbps/bulan</option>
|
||||
</select>
|
||||
</div>
|
||||
</form>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default btn-sm waves-effect waves-light"
|
||||
data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-primary btn-sm waves-effect waves-light" id="btn-tambah-ont"
|
||||
onclick="tambahont()">Tambah ONT</button>
|
||||
<button type="button" class="btn btn-info btn-sm waves-effect waves-light" id="btn-edit-ont"
|
||||
onclick="editont()">Edit ONT</button>
|
||||
<button type="button" class="btn btn-danger btn-sm waves-effect waves-light" id="btn-hapus-ont"
|
||||
onclick="hapusont()">Hapus ONT</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="/script/html5shiv.min.js"></script>
|
||||
<script src="/script/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<!--
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
<script src="/scripts/jquery.min.js"></script>
|
||||
<script src="/scripts/modernizr.min.js"></script>
|
||||
<script src="/plugin/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="/plugin/mCustomScrollbar/jquery.mCustomScrollbar.concat.min.js"></script>
|
||||
<script src="/plugin/nprogress/nprogress.js"></script>
|
||||
<script src="/plugin/sweet-alert/sweetalert.min.js"></script>
|
||||
<script src="/plugin/waves/waves.min.js"></script>
|
||||
<!-- Full Screen Plugin -->
|
||||
<script src="/plugin/fullscreen/jquery.fullscreen-min.js"></script>
|
||||
|
||||
<script src="/scripts/main.min.js"></script>
|
||||
<script src="/color-switcher/color-switcher.min.js"></script>
|
||||
|
||||
<script src="/plugin/datatables/media/js/jquery.dataTables.min.js"></script>
|
||||
<script src="/plugin/datatables/media/js/dataTables.bootstrap.min.js"></script>
|
||||
<script src="/plugin/datatables/extensions/Responsive/js/dataTables.responsive.min.js"></script>
|
||||
<script src="/my-js.js"></script>
|
||||
|
||||
<script>
|
||||
var ont_id;
|
||||
|
||||
|
||||
function reloadData() {
|
||||
var all_count = $.ajax({
|
||||
url: '/admin/count',
|
||||
async: false
|
||||
}).responseJSON;
|
||||
console.log(all_count);
|
||||
|
||||
$(".all-ont-counter").html(all_count.all_count);
|
||||
$(".connected-ont-counter").html(all_count.connected_count);
|
||||
$(".disconnected-ont-counter").html(all_count.all_count - all_count.connected_count);
|
||||
|
||||
}
|
||||
|
||||
function reloadTable() {
|
||||
// var all_count = $.ajax({
|
||||
// url: '/admin/count',
|
||||
// async: false
|
||||
// }).responseJSON;
|
||||
// console.log(all_count);
|
||||
|
||||
// $(".all-ont-counter").html(all_count.all_count);
|
||||
// $(".connected-ont-counter").html(all_count.connected_count);
|
||||
// $(".disconnected-ont-counter").html(all_count.all_count - all_count.connected_count);
|
||||
|
||||
// Initialize DataTable if not already initialized
|
||||
var table = $('#tb-ont').DataTable({
|
||||
scrollX: true,
|
||||
responsive: true,
|
||||
ajax: {
|
||||
url: '/admin/data?status=all',
|
||||
type: 'GET',
|
||||
timeout: 120000,
|
||||
dataSrc: function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
"sAjaxDataProp": "",
|
||||
"aoColumns": [
|
||||
{
|
||||
"mData": "nama",
|
||||
"title": "NAMA",
|
||||
"render": function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": "alamat",
|
||||
"title": "Alamat",
|
||||
"render": function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": "langganan",
|
||||
"title": "Langganan",
|
||||
"render": function (data) {
|
||||
return data;
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": null,
|
||||
"title": "Status",
|
||||
"render": function (data) {
|
||||
return "<p id='td_status_" + data.id + "'>" + data.status + "</p>";
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": null,
|
||||
"title": "Last Update",
|
||||
"render": function (data) {
|
||||
return "<p id='td_updated_" + data.id + "'>" + data.updated + "</p>";
|
||||
}
|
||||
},
|
||||
{
|
||||
"mData": null,
|
||||
"title": "Aksi",
|
||||
"render": function (data) {
|
||||
return `<button class='btn btn-info btn-xs' onclick='bukaModal("edit", ${data.id})'>Detail</button>`;
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
return table; // Return the table instance
|
||||
}
|
||||
|
||||
// Initialize the DataTable and store it in a variable
|
||||
var table = reloadTable();
|
||||
reloadData();
|
||||
// Function to refresh only the td content
|
||||
function refreshTdStatus() {
|
||||
table.rows().every(function (rowIdx, tableLoop, rowLoop) {
|
||||
var row = this.data();
|
||||
var id = row.id;
|
||||
var status = row.status;
|
||||
var updated = row.updated;
|
||||
$('#td_status_' + id).html(status);
|
||||
$('#td_updated_' + id).html(updated);
|
||||
});
|
||||
}
|
||||
|
||||
// Refresh the table every 5 seconds
|
||||
setInterval(() => {
|
||||
table.ajax.reload(null, false); // Reload data without resetting the state
|
||||
refreshTdStatus(); // Refresh the td content
|
||||
reloadData();
|
||||
}, 5000);
|
||||
|
||||
function bukaModal(stat, id) {
|
||||
let title = stat == 'tambah' ? 'Tambah ONT' : 'Detail ONT';
|
||||
$('#modal-ont-title').html(title);
|
||||
if (stat == 'tambah') {
|
||||
$("#nama").val('');
|
||||
$("#alamat").val('');
|
||||
$("#select-langanan").val('');
|
||||
$('#btn-tambah-ont').show();
|
||||
$('#btn-edit-ont').hide();
|
||||
$('#btn-update-ont').hide();
|
||||
$('#btn-hapus-ont').hide();
|
||||
} else {
|
||||
$('#btn-tambah-ont').hide();
|
||||
$('#btn-edit-ont').show();
|
||||
$('#btn-update-ont').hide();
|
||||
$('#btn-hapus-ont').show();
|
||||
ont_id = id;
|
||||
getData(id)
|
||||
}
|
||||
$('#modal-ont').modal('show');
|
||||
}
|
||||
|
||||
function tambahont() {
|
||||
let nama = $('#nama').val();
|
||||
let alamat = $('#alamat').val();
|
||||
let langganan = $('#select-langanan').val();
|
||||
console.log(nama, alamat, langganan);
|
||||
if (nama == '' || alamat == '' || langganan == null) {
|
||||
swal('Error', 'Data tidak boleh ada yang kosong', 'error');
|
||||
return;
|
||||
}
|
||||
swal({
|
||||
title: "Yakin?",
|
||||
text: "ONT Baru akan ditambahkan pada list ONT",
|
||||
type: "info",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Ya",
|
||||
cancelButtonText: "Tidak",
|
||||
closeOnConfirm: false,
|
||||
closeOnCancel: false
|
||||
},
|
||||
function (isConfirm) {
|
||||
if (isConfirm) {
|
||||
$.ajax({
|
||||
url: '/admin/',
|
||||
type: 'POST',
|
||||
data: {
|
||||
nama: nama,
|
||||
alamat: alamat,
|
||||
langganan: langganan
|
||||
},
|
||||
success: function (data) {
|
||||
console.log(data);
|
||||
$('#modal-ont').modal('hide');
|
||||
swal('Berhasil', 'ONT Baru berhasil ditambahkan', 'success');
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
swal('Error', error, 'error');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
swal("Cancelled", "ONT Baru gagal ditambahkan", "error");
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
}
|
||||
|
||||
function getData(id) {
|
||||
$.ajax({
|
||||
url: '/admin/data/' + id,
|
||||
type: 'GET',
|
||||
success: function (data) {
|
||||
$("#nama").val(data.nama);
|
||||
$("#alamat").val(data.alamat);
|
||||
$("#select-langanan").val(data.langganan);
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
swal('Error', error, 'error');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function hapusont() {
|
||||
swal({
|
||||
title: "Yakin?",
|
||||
text: "ONT akan dihapus dari list ONT",
|
||||
type: "info",
|
||||
showCancelButton: true,
|
||||
confirmButtonText: "Ya",
|
||||
cancelButtonText: "Tidak",
|
||||
closeOnConfirm: true,
|
||||
closeOnCancel: true,
|
||||
// yes button color to red
|
||||
confirmButtonColor: "#DD6B55"
|
||||
},
|
||||
function (isConfirm) {
|
||||
if (isConfirm) {
|
||||
$.ajax({
|
||||
url: '/admin/' + ont_id,
|
||||
type: 'DELETE',
|
||||
success: function (data) {
|
||||
console.log(data);
|
||||
$('#modal-ont').modal('hide');
|
||||
swal('Berhasil', 'ONT berhasil dihapus', 'success');
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
swal('Error', error, 'error');
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
</body>
|
||||
|
||||
</html>
|
Reference in New Issue
Block a user