QuartzMap/admin/permalinks.php

358 lines
11 KiB
PHP
Raw Normal View History

2024-03-16 23:03:30 +00:00
<?php
session_start();
require('incl/const.php');
require('class/database.php');
require('class/map.php');
require('class/permalink.php');
require('class/access_groups.php');
if(!isset($_SESSION['user']) || $_SESSION['user']->accesslevel != 'Admin') {
header('Location: ../login.php');
exit;
}
$database = new Database(DB_HOST, DB_NAME, DB_USER, DB_PASS, DB_PORT, DB_SCMA);
$dbconn = $database->getConn();
$tab = 'permalink'; $action = 'permalink';
$conn_obj = new permalink_Class($dbconn, $_SESSION['user']->id);
$conn_rows = $conn_obj->getRows();
$maps_obj = new map_Class($dbconn, $_SESSION['user']->id);
$map_rows = $maps_obj->getRows();
$maps = array();
while($row = pg_fetch_assoc($map_rows)){
$maps[$row['id']] = $row;
}
?>
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<?php include("incl/meta.php"); ?>
<link href="dist/css/table.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.8/css/dataTables.bootstrap4.min.css">
<script src="https://cdn.datatables.net/1.13.8/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.13.8/js/dataTables.bootstrap4.min.js"></script>
<style type="text/css">
td {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.nav-tabs .nav-item.show .nav-link, .nav-tabs .nav-link.active {
color: #fff;
background-color: #666;
border-color: #f1f9ff #f1f9ff #fff;
border-top-left-radius: 12px;
border-top-right-radius: 12px;
}
</style>
<script type="text/javascript">
$(document).ready(function() {
$('[data-toggle="tooltip"]').tooltip();
var actions = `
<a class="add" title="Add" data-toggle="tooltip">
<i class="material-icons">&#xE03B;</i>
</a>
<a class="edit" title="Edit" data-toggle="tooltip">
<i class="material-icons">&#xE254;</i>
</a>
<a class="delete" title="Delete" data-toggle="tooltip">
<i class="material-icons">&#xE872;</i>
</a>
`;
//$("table td:last-child").html();
// Append table with add row form on add new button click
$(".add-new").click(function() {
//var actions = $("table td:last-child").html();
$(this).attr("disabled", "disabled");
var index = $("table tbody tr:last-child").index();
var row = '<tr>';
$("table thead tr th").each(function(k, v) {
if($(this).attr('data-editable') == 'false') {
if($(this).attr('data-action') == 'true') { // last child or actions cell
row += '<td>'+actions+'</td>';
} else {
row += '<td></td>';
}
}
else {
if($(this).attr('data-type') == 'select') {
if($(this).attr('data-name') == 'map_id') {
row += `
<td data-type="select" data-value="0">
<select name="`+$(this).attr('data-name')+`">
<?PHP foreach($maps as $k => $v) { ?>
<option value="<?=$k?>"><?=$v['name']?></option>
<?PHP } ?>
</select>
</td>
`;
}
}else{
row += ' <td> <input type = "text" class = "form-control" name="'+$(this).attr('data-name')+'"> </td>';
}
}
});
row += '</tr>';
$("table").append(row);
$("table tbody tr").eq(index + 1).find(".add, .edit").toggle();
$('[data-toggle="tooltip"]').tooltip();
});
// Add row on add button click
$(document).on("click", ".add", function() {
var obj = $(this);
var empty = false;
var input = $(this).parents("tr").find('input[type="text"], select');
input.each(function() {
if (!$(this).val() && ($(this).attr('name') != 'query')) {
$(this).addClass("error");
empty = true;
} else {
$(this).removeClass("error");
}
});
$(this).parents("tr").find(".error").first().focus();
if (!empty) {
var data = {};
data['save'] = 1;
data['id'] = $(this).closest('tr').attr('data-id');
input.each(function() {
if($(this).closest('td').attr('data-type') == 'select') {
var val = $(this).find('option:selected').text();
$(this).parent("td").attr('data-value', $(this).val());
$(this).parent("td").html(val);
}else {
$(this).parent("td").html($(this).val());
}
data[$(this).attr('name')] = $(this).val();
});
$.ajax({
type: "POST",
url: 'action/permalink.php',
data: data,
dataType:"json",
success: function(response){
if(response.id) { // means, new record is added
obj.closest('table').find('tr:last-child').attr('data-id', response.id);
obj.closest('table').find('tr:last-child td:first-child').text(response.id)
obj.closest('table').find('tr:last-child td').eq(3).text(response.created);
obj.closest('table').find('tr:last-child td').eq(4).text(response.expires);
obj.closest('table').find('tr:last-child td').eq(5).text(0);
var perma_link = '<a href="../' + response.url + '">' + response.hash + '</a>';
obj.closest('table').find('tr:last-child td').eq(7).html(perma_link);
}
alert(response.message)
}
});
$(this).parents("tr").find(".add, .edit").toggle();
$(".add-new").removeAttr("disabled");
}
});
// Edit row on edit button click
$(document).on("click", ".edit", function() {
$(this).parents("tr").find("td:not([data-editable=false])").each(function(k, v) {
if($(this).closest('table').find('thead tr th').eq(k).attr('data-editable') != 'false') {
var name = $(this).closest('table').find('thead tr th').eq(k).attr('data-name');
var id = $(this).closest('tr').attr('data-id');
if($(this).closest('table').find('thead tr th').eq(k).attr('data-type') == 'select') {
if(name == 'map_id') {
$(this).html(`
<select name="`+name+`" multiple>
<?PHP foreach($maps as $k => $v) { ?>
<option value="<?=$k?>"><?=$v['name']?></option>
<?PHP } ?>
</select>
`);
}
var val = $(this).attr('data-value').split(',');
$(this).find('[name='+name+']').val(val);
} else {
var val = $(this).html().replace('<br>', '&');
$(this).html(' <input type = "text" name="'+ name +'" class = "form-control" value = "' + val + '" > ');
}
}
});
$(this).parents("tr").find(".add, .edit").toggle(); $(".add-new").attr("disabled", "disabled");
});
// Delete row on delete button click
$(document).on("click", ".delete", function() {
var obj = $(this);
var data = {'delete': true, 'id': obj.parents("tr").attr('data-id')}
if(confirm('Connection will be deleted ?')){
$.ajax({
type: "POST",
url: 'action/permalink.php',
data: data,
dataType:"json",
success: function(response){
if(response.success) { // means, new record is added
obj.parents("tr").remove();
}
alert(response.message);
}
});
}
});
});
</script>
<style>
.card {
position: relative;
display: flex;
flex-direction: column;
min-width: 0;
word-wrap: break-word;
background-color: #fff;
border: none!important;
border-radius: inherit;
text-decoration: none!important;
}
.bg-warning {
background-color: #50667f!important;
}
</style>
</head>
<body>
<div id="main-wrapper" data-layout="vertical" data-navbarbg="skin5" data-sidebartype="full"
data-sidebar-position="absolute" data-header-position="absolute" data-boxed-layout="full">
<?php define('MENU_SEL', 'permalinks.php');
include("incl/topbar.php");
include("incl/sidebar.php");
?>
<div class="page-wrapper">
<div class="page-breadcrumb" style="padding-left:30px; padding-right: 30px; padding-top:0px; padding-bottom: 0px">
<div class="row align-items-center">
<div class="col-6">
<nav aria-label="breadcrumb">
</nav>
<h1 class="mb-0 fw-bold">Permalinks</h1>
</div>
<div class="col-6">
<div class="text-end upgrade-btn">
<div class="text-end upgrade-btn">
<a class="btn btn-primary text-white add-new" role="button" aria-pressed="true"><i class="fa fa-plus"></i> Add New</a>
</div>
</div>
</div>
</div>
<div class="container-fluid"><p>&nbsp;</p>
<div class="table-responsive">
<table class="table table-bordered" id="sortTable">
<thead>
<tr>
<th data-name="id" data-editable='false'>ID</th>
<th data-name="map_id" data-type="select">Map</th>
<th data-name="description">Description</th>
<th data-name="query">Query</th>
<th data-name="created" data-editable='false'>Created</th>
<th data-name="expires">Expires</th>
<th data-name="visits" data-editable='false'>Visits</th>
<th data-name="visits_limit" >Limit</th>
<th data-name="hash" data-editable='false'>Hash</th>
<th data-editable='false' data-action='true'>Actions</th>
</tr>
</thead>
<tbody> <?php while($row = pg_fetch_object($conn_rows)): ?> <tr data-id="<?=$row->id?>" align="left">
<td><?=$row->id?></td>
<td data-type="select" data-value="<?=$row->map_id?>"><?=$maps[$row->map_id]['name']?></td>
<td><?=$row->description?></td>
<td><?=str_replace('&', '</br>', urldecode($row->query))?></td>
<td><?=$row->created?></td>
<td><?=$row->expires?></td>
<td><?=$row->visits?></td>
<td><?=$row->visits_limit?></td>
<td>
<a href="../apps/<?=$row->map_id?>/index.php?permalink=<?=$row->hash?>"><?=$row->hash?></a>
</td>
<td>
<a class="add" title="Add" data-toggle="tooltip"><i class="material-icons">&#xE03B;</i></a>
<a class="edit" title="Edit" data-toggle="tooltip"><i class="material-icons">&#xE254;</i></a>
<a class="delete" title="Delete" data-toggle="tooltip"><i class="material-icons">&#xE872;</i></a>
</td>
</tr> <?php endwhile; ?>
</tbody>
</table>
</div>
<div class="row">
<p>&nbsp;</p>
<div class="col-6" style="width: 50%!important">
<p>&nbsp;</p>
<div class = "alert alert-success">
<a href = "#" class = "close" data-dismiss = "alert">&times;</a>
<strong>Note:</strong> Permalinks will be auto-deleted on when they expire by time or run out of visits. Limit of 0, disables visits limitation.
</div>
<div class = "alert alert-warning">
<a href = "#" class = "close" data-dismiss="alert">&times;</a>
<strong>Note:</strong> In expires you can write PostgreSQL TIMESTAMP values, like '1 hour', '1 day'.
For more <a href="https://www.postgresql.org/docs/current/functions-datetime.html" target="_blank">see here.</a>
</div>
</div>
</div>
</div>
<script>new DataTable('#sortTable', { paging: false });</script>
<footer class="footer text-center">
</footer>
</div>
</div>
<script src="dist/js/sidebarmenu.js"></script>
<script src="dist/js/custom.js"></script>
</body>
</html>