QuartzMap/admin/edit_map.php

430 lines
21 KiB
PHP

<?php
session_start();
require('incl/const.php');
require('class/database.php');
require('class/map.php');
require('class/app.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);
$map = ['name' => '','description' => ''];
$map_acc_ids = array();
$use_dt = false;
if(!empty($_GET['id'])){
$map_obj = new map_Class($database->getConn(), $_SESSION['user']->id);
$result = $map_obj->getById($_GET['id']);
if(!$result){
$_GET['error'] = 'Error: No such map!';
exit;
}
$map = pg_fetch_assoc($result);
pg_free_result($result);
$map_acc_grps = $map_obj->getAccessGroups($_GET['id']);
$map_acc_ids = array_keys($map_acc_grps);
list($dss,$lys,$use_dt) = App::parseDatasources(APPS_DIR.'/'.$map['id']);
}else{
$upload_dir = App::upload_dir($_SESSION['user']->ftp_user);
$app_names = App::getApps($upload_dir);
}
$acc_obj = new access_group_Class($database->getConn(), $_SESSION['user']->id);
$acc_grps = $acc_obj->getRowsArr();
?>
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<?php include("incl/meta.php"); ?>
<link href="dist/css/table.css" rel="stylesheet">
<?php if(!empty($_GET['id'])){ ?>
<link href="dist/css/accordion.css" rel="stylesheet">
<?php } ?>
<script type="text/javascript">
$(document).ready(function() {
$('[data-toggle="tooltip"]').tooltip();
$('#map_form').submit(false);
<?php
if(isset($_GET['id'])){
foreach($dss as $dsi => $ds) {
if($ds['data_type'] == 'gs'){ ?>
$('#pg_details<?=$dsi?>').hide();
<?php } else if($ds['data_type'] == 'pg'){ ?>
$('#gs_details<?=$dsi?>').hide();
<?php }else { ?>
$('#pg_details<?=$dsi?>').hide();
$('#gs_details<?=$dsi?>').hide();
<?php }
}
foreach($lys as $lyi => $ly) {
if($ly['layer_type'] == 'gs_geo'){ ?>
$('#wms_details<?=$lyi?>').hide();
<?php }else if($ly['layer_type'] == 'wms'){ ?>
$('#gs_geo_details<?=$lyi?>').hide();
<?php }
}
} ?>
$('#archive').hide();
$(document).on("click", 'input[name="from_type"]', function() {
if($(this).attr('id') == 'from_uploaded'){
$('#app').show(); $('#app').prop('disabled', false); $('#app').prop('required',true);
$('#archive').hide();$('#archive').prop('disabled', true); $('#archive').prop('required',false);
}else{
$('#app').hide(); $('#app').prop('disabled', true); $('#app').prop('required',false);
$('#archive').show(); $('#archive').prop('disabled', false); $('#archive').prop('required',true);
}
});
//// data
$(document).on("click", 'input[class="data_files"]', function() {
const id = $(this).attr('data-id');
let pg = $('#pg_details' + id);
let gs = $('#gs_details' + id);
pg.hide(); pg.children('input').prop('required',false);
gs.hide(); gs.children('input').prop('required',false);
});
$(document).on("click", 'input[class="data_pg"]', function() {
const id = $(this).attr('data-id');
let pg = $('#pg_details' + id);
let gs = $('#gs_details' + id);
pg.show(); pg.children('input').prop('required',true);
gs.hide(); gs.children('input').prop('required',false);
});
$(document).on("click", 'input[class="data_gs"]', function() {
const id = $(this).attr('data-id');
let pg = $('#pg_details' + id);
let gs = $('#gs_details' + id);
pg.hide(); pg.children('input').prop('required',false);
gs.show(); gs.children('input').prop('required',true);
});
//// layers
$(document).on("click", 'input[class="layer_wms"]', function() {
const id = $(this).attr('data-id');
let wms = $('#wms_details' + id);
let gs = $('#gs_geo_details' + id);
wms.show(); wms.children('input').prop('required',true);
wms.children('input[name^="wms_user"], input[name^="wms_pwd"]').prop('required',false);
gs.hide(); gs.children('input').prop('required',false);
});
$(document).on("click", 'input[class="layer_gs_geo"]', function() {
const id = $(this).attr('data-id');
let wms = $('#wms_details' + id);
let gs = $('#gs_geo_details' + id);
wms.hide(); wms.children('input').prop('required',false);
gs.show(); gs.children('input').prop('required',true);
});
// Update/Create connection on submit button click
$(document).on("click", "#btn_submit", function() {
let obj = $(this);
let input = $('#map_form').find('input[type="text"], input[type="password"], select');
let empty = false;
input.each(function() {
if (!$(this).prop('disabled') && $(this).prop('required') && !$(this).val()) {
$(this).addClass("error");
empty = true;
} else {
$(this).removeClass("error");
}
});
if(empty){
$('#map_form').find(".error").first().focus();
}else{
$.ajax({
type: "POST",
url: 'action/map.php',
data: new FormData($('#map_form')[0]),
processData: false,
contentType: false,
dataType:"json",
success: function(response){
alert(response.message);
if(response.success) {
<?php if(isset($_GET['id'])){ ?>
window.location.href = 'maps.php'; // redirect to maps.php
<?php } else { ?>
window.location.href = 'edit_map.php?id=' + response.id; // redirect to step 2 for datasources
<?php } ?>
}
}
});
}
});
});
</script>
</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 const MENU_SEL = 'maps.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>
<?php if(isset($_GET['id'])){ ?>
<h1 class="mb-0 fw-bold">Update Map <?=$_GET['id']?></h1>
<?php } else { ?>
<h1 class="mb-0 fw-bold">Add new map</h1>
<?php } ?>
</div>
<div class="col-6">
<div class="text-end upgrade-btn">
</div>
</div>
</div>
</div>
<div class="container-fluid">
<form action="" method="post" enctype="multipart/form-data" id="map_form" style="width: 50%;">
<?php if (isset($_GET['error'])) { ?>
<div class="alert alert-danger" role="alert">
<?=$_GET['error']?>
</div>
<?php } ?>
<?php if(isset($_GET['id'])){ ?>
<input type="hidden" class="form-control" name="id" id="id" value="<?=$_GET['id']?>" />
<?php } ?>
<input type="hidden" class="form-control" name="save" id="save" value="1" />
<div class="form-group">
<label for="name" class="form-label">Name</label>
<input type="text" class="form-control" name="name" id="name" value="<?=$map['name']?>" required/>
<label for="description" class="form-label">Description</label>
<input type="text" class="form-control" name="description" id="description" value="<?=$map['description']?>" required/>
</div>
<?php if(!isset($_GET['id'])){ ?>
<fieldset>
<legend>Source</legend>
<div class="form-group">
<input type="radio" id="from_uploaded" name="from_type" value="uploaded" checked>
<label for="from_uploaded">Uploads</label>
<input type="radio" id="from_zip" name="from_type" value="archive">
<label for="from_zip">Archive</label>
<select class="form-control" name="app" id="app" aria-label="Select app">
<?php foreach($app_names as $k){ ?>
<option <?php if($k == $map['name']){ ?> selected <?php }?> value="<?=$k?>"><?=$k?></option>
<?php } ?>
</select>
<input type="file" class="form-control" name="archive" id="archive" value="" accept=".zip" disabled/>
<p>NOTE: Archive can contains files, or project directory.</p>
</div>
</fieldset>
<?php }else {
$aci = 0;
?>
<fieldset>
<legend>Data</legend>
<?php
foreach($dss as $dsi => $ds) { ?>
<div class="panel-group" id="accordion<?=$aci?>" role="tablist" aria-multiselectable="false">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="heading<?=$aci?>">
<h5 class="panel-title">
<a role="button" data-toggle="collapse" class="accordion-plus-toggle collapsed" data-parent="#accordion<?=$aci?>" href="#collapse<?=$aci?>" aria-expanded="false" aria-controls="collapse<?=$aci?>"><?=$ds['name']?></a>
</h5>
</div>
<div id="collapse<?=$aci?>" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading<?=$aci?>">
<div class="form-group col-sm">
<input type="radio" class="data_files" data-id="<?=$dsi?>" name="data_type<?=$dsi?>" value="file" <?php if($ds['data_type'] == 'file'){ ?> checked<?php } ?>> <label for="data_files<?=$dsi?>">Files</label>
<input type="radio" class="data_pg" data-id="<?=$dsi?>" name="data_type<?=$dsi?>" value="pg" <?php if($ds['data_type'] == 'pg'){ ?> checked<?php } ?>> <label for="data_pg<?=$dsi?>">Postgres</label>
<input type="radio" class="data_gs" data-id="<?=$dsi?>" name="data_type<?=$dsi?>" value="gs" <?php if($ds['data_type'] == 'gs'){ ?> checked<?php } ?>> <label for="data_gs<?=$dsi?>">GeoServer</label>
</div>
<div class="pg_details" id="pg_details<?=$dsi?>">
<label for="pg_host<?=$dsi?>" class="form-label">Host</label> <input type="text" class="form-control" name="pg_host<?=$dsi?>" id="pg_host<?=$dsi?>" value="<?=$ds['pg_host']?>"/>
<label for="pg_port<?=$dsi?>" class="form-label">Port</label> <input type="text" class="form-control" name="pg_port<?=$dsi?>" id="pg_port<?=$dsi?>" value="<?=$ds['pg_port']?>"/>
<label for="pg_db<?=$dsi?>" class="form-label">Database</label> <input type="text" class="form-control" name="pg_db<?=$dsi?>" id="pg_db<?=$dsi?>" value="<?=$ds['pg_db']?>"/>
<label for="pg_user<?=$dsi?>" class="form-label">User</label> <input type="text" class="form-control" name="pg_user<?=$dsi?>" id="pg_user<?=$dsi?>" value="<?=$ds['pg_user']?>"/>
<label for="pg_pwd<?=$dsi?>" class="form-label">Password</label> <input type="password" class="form-control" name="pg_pwd<?=$dsi?>" id="pg_pwd<?=$dsi?>" value="<?=$ds['pg_pwd']?>"/>
<div class="form-group">
<label for="pg_cache<?=$dsi?>" class="form-label">Cache</label>
<input type="number" name="pg_cache_val<?=$dsi?>" id="pg_cache_val<?=$dsi?>" value="<?=$ds['pg_cache_val']?>"/>
<select name="pg_cache_per<?=$dsi?>" id="pg_cache_per<?=$dsi?>">
<?php foreach(TIME_MAP as $per => $val) { ?>
<option value="<?=$per?>" <?php if($ds['pg_cache_per'] == $per) { ?> selected <?php } ?>><?=$per?></option>
<?php } ?>
</select>
</div>
</div>
<div class="gs_details" id="gs_details<?=$dsi?>">
<label for="gs_host<?=$dsi?>" class="form-label">Host</label> <input type="text" class="form-control" name="gs_host<?=$dsi?>" id="gs_host<?=$dsi?>" value="<?=$ds['gs_host']?>"/>
<label for="gs_user<?=$dsi?>" class="form-label">User</label> <input type="text" class="form-control" name="gs_user<?=$dsi?>" id="gs_user<?=$dsi?>" value="<?=$ds['gs_user']?>"/>
<label for="gs_pwd<?=$dsi?>" class="form-label">Password</label> <input type="password" class="form-control" name="gs_pwd<?=$dsi?>" id="gs_pwd<?=$dsi?>" value="<?=$ds['gs_pwd']?>"/>
<label for="gs_ws<?=$dsi?>" class="form-label">Workspace</label><input type="text" class="form-control" name="gs_ws<?=$dsi?>" id="gs_ws<?=$dsi?>" value="<?=$ds['gs_ws']?>"/>
<div class="form-group">
<label for="gs_cache<?=$dsi?>" class="form-label">Cache</label>
<input type="number" name="gs_cache_val<?=$dsi?>" id="gs_cache_val<?=$dsi?>" value="<?=$ds['gs_cache_val']?>"/>
<select name="gs_cache_per<?=$dsi?>" id="gs_cache_per<?=$dsi?>">
<?php foreach(TIME_MAP as $per => $val) { ?>
<option value="<?=$per?>" <?php if($ds['gs_cache_per'] == $per) { ?> selected <?php } ?>><?=$per?></option>
<?php } ?>
</select>
</div>
</div>
</div>
</div>
</div>
<?php $aci = $aci + 1;
} ?>
</fieldset>
<fieldset>
<legend>Layers</legend>
<?php
foreach($lys as $lyi => $ly) { ?>
<div class="panel-group" id="accordion<?=$aci?>" role="tablist" aria-multiselectable="false">
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="heading<?=$aci?>">
<h5 class="panel-title">
<a role="button" data-toggle="collapse" class="accordion-plus-toggle collapsed" data-parent="#accordion<?=$aci?>" href="#collapse<?=$aci?>" aria-expanded="false" aria-controls="collapse<?=$aci?>"><?=$ly['name']?></a>
</h5>
</div>
<div id="collapse<?=$aci?>" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading<?=$aci?>">
<div class="form-group col-sm">
<input type="radio" class="layer_wms" data-id="<?=$lyi?>" name="layer_type<?=$lyi?>" value="wms" <?php if($ly['layer_type'] == 'wms'){ ?> checked<?php } ?>> <label for="layer_wms<?=$lyi?>">WMS</label>
<input type="radio" class="layer_gs_geo" data-id="<?=$lyi?>" name="layer_type<?=$lyi?>" value="gs_geo" <?php if($ly['layer_type'] == 'gs_geo'){ ?> checked<?php } ?>> <label for="layer_gs_geo<?=$lyi?>">GeoJSON(GS)</label>
</div>
<input type="hidden" name="layer_varname<?=$lyi?>" id="layer_varname<?=$lyi?>" value="<?=$ly['layer_varname']?>"/>
<div class="wms_details" id="wms_details<?=$lyi?>">
<label for="wms_url<?=$lyi?>" class="form-label">URL</label> <input type="text" class="form-control" name="wms_url<?=$lyi?>" id="wms_url<?=$lyi?>" value="<?=$ly['wms_url']?>"/>
<label for="wms_ws<?=$lyi?>" class="form-label">Workspace</label> <input type="text" class="form-control" name="wms_ws<?=$lyi?>" id="wms_ws<?=$lyi?>" value="<?=$ly['wms_ws']?>"/>
<label for="wms_layer<?=$lyi?>" class="form-label">Layer</label> <input type="text" class="form-control" name="wms_layer<?=$lyi?>" id="wms_layer<?=$lyi?>" value="<?=$ly['wms_layer']?>"/>
<label for="wms_user<?=$lyi?>" class="form-label">User (only for secured connections)</label> <input type="text" class="form-control" name="wms_user<?=$lyi?>" id="wms_user<?=$lyi?>" value="<?=$ly['wms_user']?>"/>
<label for="wms_pwd<?=$lyi?>" class="form-label">Password</label> <input type="password" class="form-control" name="wms_pwd<?=$lyi?>" id="wms_pwd<?=$lyi?>" value="<?=$ly['wms_pwd']?>"/>
</div>
<div class="gs_geo_details" id="gs_geo_details<?=$lyi?>">
<label for="gs_geo_host<?=$lyi?>" class="form-label">Host</label> <input type="text" class="form-control" name="gs_geo_host<?=$lyi?>" id="gs_geo_host<?=$lyi?>" value="<?=$ly['gs_geo_host']?>"/>
<label for="gs_geo_user<?=$lyi?>" class="form-label">User</label> <input type="text" class="form-control" name="gs_geo_user<?=$lyi?>" id="gs_geo_user<?=$lyi?>" value="<?=$ly['gs_geo_user']?>"/>
<label for="gs_geo_pwd<?=$lyi?>" class="form-label">Password</label> <input type="password" class="form-control" name="gs_geo_pwd<?=$lyi?>" id="gs_geo_pwd<?=$lyi?>" value="<?=$ly['gs_geo_pwd']?>"/>
<label for="gs_geo_ws<?=$lyi?>" class="form-label">Workspace</label> <input type="text" class="form-control" name="gs_geo_ws<?=$lyi?>" id="gs_geo_ws<?=$lyi?>" value="<?=$ly['gs_geo_ws']?>"/>
<label for="gs_geo_layer<?=$lyi?>" class="form-label">Layer</label> <input type="text" class="form-control" name="gs_geo_layer<?=$lyi?>" id="gs_geo_layer<?=$lyi?>" value="<?=$ly['gs_geo_layer']?>"/>
<div class="form-group">
<label for="gs_geo_color<?=$lyi?>" class="form-label">Color</label>
<input type="color" class="form-control" name="gs_geo_color<?=$lyi?>" id="gs_geo_color<?=$lyi?>" value="<?=$ly['gs_geo_color']?>"/>
<input type="range" class="form-control" name="gs_geo_opacity<?=$lyi?>" id="gs_geo_opacity<?=$lyi?>" value="<?=$ly['gs_geo_opacity']?>" min="0" max="100"/>
</div>
<div class="form-group">
<label for="gs_geo_fillcolor<?=$lyi?>" class="form-label">Fill Color</label>
<input type="color" class="form-control" name="gs_geo_fill_color<?=$lyi?>" id="gs_geo_fill_color<?=$lyi?>" value="<?=$ly['gs_geo_fill_color']?>"/>
<input type="range" class="form-control" name="gs_geo_fill_opacity<?=$lyi?>" id="gs_geo_fill_opacity<?=$lyi?>" value="<?=$ly['gs_geo_fill_opacity']?>" min="0" max="100"/>
</div>
<div class="form-group">
<label for="gs_geo_cache<?=$lyi?>" class="form-label">Cache</label>
<input type="number" name="gs_geo_cache_val<?=$lyi?>" id="gs_geo_cache_val<?=$lyi?>" value="<?=$ly['gs_geo_cache_val']?>"/>
<select name="gs_geo_cache_per<?=$lyi?>" id="gs_geo_cache_per<?=$lyi?>">
<?php foreach(TIME_MAP as $per => $val) { ?>
<option value="<?=$per?>" <?php if($ly['gs_geo_cache_per'] == $per) { ?> selected <?php } ?>><?=$per?></option>
<?php } ?>
</select>
</div>
</div>
</div>
</div>
</div>
<?php $aci = $aci + 1;
} ?>
</fieldset>
<?php } ?>
<fieldset>
<legend>View</legend>
<div class="form-group">
<input type="checkbox" class="form-checkbox" name="use_datatable" id="use_datatable" value="1" <?php if($use_dt) {?> checked <?php } ?>/>
<label for="use_datatable" class="form-label">Show DataTable below map</label>
</div>
<div class="form-group">
<label for="image" class="form-label">Preview image (.png, .jpeg formats)</label>
<?php if(isset($_GET['id']) && is_file("../assets/maps/".$_GET['id'].".png")){ ?>
<img src="../assets/maps/<?=$_GET['id']?>.png" alt="Map Preview" width="200" height="150">
<?php } else { ?>
<img src="../assets/maps/default.png" alt="Map Preview" width="200" height="150">
<?php } ?>
<input type="file" class="form-control" name="image" id="image" value="" accept=".png,.jpg,.jpeg"/>
</div>
<div class="form-group">
<label for="accgrps" class="form-label">Access Groups</label>
<select class="form-control" name="accgrps[]" id="accgrps" aria-label="Select access groups" multiple required>
<?php foreach($acc_grps as $k => $v){?>
<option <?php if(in_array($k, $map_acc_ids)){?> selected <?php }?> value="<?=$k?>"><?=$v?></option>
<?php } ?>
</select>
</div>
</fieldset>
<button type="submit" class="btn btn-primary" id="btn_submit"><?php if(isset($_GET['id'])){ ?>Update<?php } else { ?>Create<?php } ?></button>
</form>
</div>
</div>
<footer class="footer text-center">
</footer>
</div>
<script src="dist/js/sidebarmenu.js"></script>
<script src="dist/js/custom.js"></script>
</body>
</html>