First web gui prototype
This commit is contained in:
@@ -0,0 +1,392 @@
|
||||
<?php
|
||||
/******************************************************************************
|
||||
* YMS - Yacht Management Software
|
||||
* Copyright (C) 2024 Thomas Hooge
|
||||
*
|
||||
* SPDX-License-Identifier: WTFPL
|
||||
******************************************************************************/
|
||||
|
||||
require 'globals.inc';
|
||||
$pagetitle = _('Start');
|
||||
|
||||
// ========== ACTIONS START ===================================================
|
||||
|
||||
switch ($submit = form_get_action()) {
|
||||
|
||||
case NULL: break;
|
||||
|
||||
case 'add': $action = ACT_ADD; break;
|
||||
case 'view': $action = ACT_DEFAULT; break;
|
||||
case 'edit': $action = ACT_EDIT; break;
|
||||
|
||||
case 'select':
|
||||
$vid = gpc_get_int($_POST, 'vid', 1);
|
||||
$sql = "UPDATE settings SET valint=? WHERE userid=? AND sno=1";
|
||||
$sth = $pdo->prepare($sql);
|
||||
try {
|
||||
$sth->execute([$vid, $user->id]);
|
||||
} catch (PDOException $e) {
|
||||
$g_error->Add('SQL-Error: '. $e->getMessage());
|
||||
}
|
||||
$g_message->Add(sprintf(_('Selected vessel %d'), $vid));
|
||||
$user->load_vessel();
|
||||
break;
|
||||
|
||||
case 'insert':
|
||||
$action = ACT_DEFAULT;
|
||||
if ($user->role != 'captain') {
|
||||
$g_error->Add(_('Access denied. You are not the captain.'));
|
||||
break;
|
||||
}
|
||||
$p[':vesselname'] = gpc_get_string($_POST, 'vesselname');
|
||||
$p[':model'] = gpc_get_string($_POST, 'model');
|
||||
$p[':remarks'] = gpc_get_string($_POST, 'remarks', 150);
|
||||
$keys = array_keys($p);
|
||||
$fields = join(',', array_map(function($s) { return ltrim($s, ':'); }, $keys));
|
||||
$pnames = join(',', $keys);
|
||||
$sth = $pdo->prepare("INSERT INTO vessel ($fields) VALUES ($pnames)");
|
||||
try {
|
||||
$sth->execute($p);
|
||||
} catch (PDOException $e) {
|
||||
$g_error->Add('SQL-Error: '. $e->getMessage());
|
||||
}
|
||||
$id = $pdo->LastInsertId();
|
||||
// autoselect newly created vessel
|
||||
$sql = "UPDATE settings SET valint=? WHERE userid=? AND sno=1";
|
||||
$sth = $pdo->prepare($sql);
|
||||
try {
|
||||
$sth->execute([$id, $user->id]);
|
||||
} catch (PDOException $e) {
|
||||
$g_error->Add('SQL-Error: '. $e->getMessage());
|
||||
}
|
||||
$g_message->Add(sprintf(_('Selected new vessel %d'), $vid));
|
||||
$user->load_vessel();
|
||||
break;
|
||||
|
||||
case 'update':
|
||||
if ($user->role != 'captain') {
|
||||
$g_error->Add(_('Access denied. You are not the captain.'));
|
||||
break;
|
||||
}
|
||||
// $p[':vtype'] = gpc_get_string($_POST, 'vtype');
|
||||
$p[':vesselname'] = gpc_get_string($_POST, 'vesselname');
|
||||
$p[':model'] = gpc_get_string($_POST, 'model');
|
||||
$p[':loa'] = gpc_get_float($_POST, 'loa');
|
||||
$p[':lwl'] = gpc_get_float($_POST, 'lwl');
|
||||
$p[':beam'] = gpc_get_float($_POST, 'beam');
|
||||
$p[':draught'] = gpc_get_float($_POST, 'draught');
|
||||
$p[':draught_min'] = gpc_get_float($_POST, 'draught_min');
|
||||
$p[':displacement'] = gpc_get_int($_POST, 'displacement');
|
||||
$p[':ballast'] = gpc_get_int($_POST, 'ballast');
|
||||
$p[':remarks'] = gpc_get_string($_POST, 'remarks', 150);
|
||||
$fields = join(',', array_map(function($s) { return ltrim($s, ':') . '=' . $s; }, array_keys($p)));
|
||||
$sth = $pdo->prepare("UPDATE vessel SET $fields WHERE vid=:vid");
|
||||
$p[':vid'] = gpc_get_int($_POST, 'id');
|
||||
try {
|
||||
$sth->execute($p);
|
||||
} catch (PDOException $e) {
|
||||
$g_error->Add('SQL-Error: '. $e->getMessage());
|
||||
}
|
||||
$action = ACT_DEFAULT;
|
||||
break;
|
||||
|
||||
default:
|
||||
$g_error->Add(_('Unknown function!'));
|
||||
$valid = FALSE;
|
||||
|
||||
}
|
||||
|
||||
// ========== ACTIONS END =====================================================
|
||||
|
||||
require 'header.php';
|
||||
|
||||
// ========== PAGE CONTENT ====================================================
|
||||
|
||||
if ($action == ACT_DEFAULT):
|
||||
// ========== VARIANT: default behavior =======================================
|
||||
|
||||
|
||||
echo '<h1>', _('Yacht data'), "</h1>\n";
|
||||
|
||||
echo '<p>', _('User'), ': ', $user->displayname, ' (', $user->role, ')', "</p>\n";
|
||||
|
||||
// Fetch current selected vessel number
|
||||
$sql = "SELECT valint FROM settings WHERE userid=? AND sno=1";
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute([$user->id]);
|
||||
$res = $sth->fetch(PDO::FETCH_NUM);
|
||||
$vid = ($res[0]);
|
||||
|
||||
// Switch between vessels
|
||||
$sth = $pdo->query("SELECT vid, vesselname, model FROM vessel ORDER BY vid");
|
||||
$res = $sth->fetchAll();
|
||||
echo '<form class="row" method="post">', "\n";
|
||||
echo '<div class="col-1">', "\n";
|
||||
echo '<label class="form-label" for="vid">Yacht:</label>';
|
||||
echo "</div>\n";
|
||||
echo '<div class="col-4">', "\n";
|
||||
echo '<select class="form-select" name="vid" id="vid">', "\n";
|
||||
foreach ($res as $row) {
|
||||
echo '<option value="', $row['vid'], '"', ($row['vid'] == $vid ? ' selected>' : '>');
|
||||
echo $row['vesselname'], ' - ', $row['model'];
|
||||
echo "</option>\n";
|
||||
}
|
||||
echo "</select>\n";
|
||||
echo "</div>\n";
|
||||
echo '<div class="col">', "\n";
|
||||
echo '<button type="submit" class="btn btn-secondary" name="submit[select]">', _('Select'), '</button>', "\n";
|
||||
echo '<button type="submit" class="btn btn-secondary" name="submit[add]">', _('Add yacht'), '</button>', "\n";
|
||||
echo "</div>\n";
|
||||
echo "</form>\n";
|
||||
|
||||
// Get current vessel data
|
||||
$sql = "SELECT vesselname, model, loa, lwl, beam, draught, draught_min,"
|
||||
. " displacement, ballast, remarks "
|
||||
. "FROM vessel "
|
||||
. "WHERE vid=?";
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute([$vid]);
|
||||
$vessel = $sth->fetch();
|
||||
|
||||
?>
|
||||
|
||||
<?php /* <svg viewbox="0 0 1024 768">
|
||||
<circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
|
||||
<rect x="0" y="0" width="1024" height="768" stroke="black" fill="none" />
|
||||
<text x="0" y="20" font-size="12" fill="#ccc" text-anchor="start">Elizabethan 29</text>
|
||||
<line x1="0" y1="0" x2="100" y2="100" />
|
||||
</svg> */ ?>
|
||||
<br>
|
||||
<svg
|
||||
width="680.8349"
|
||||
height="205.42085"
|
||||
viewBox="0 0 180.13756 54.350934"
|
||||
version="1.1"
|
||||
id="svg5"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs2" />
|
||||
<g
|
||||
id="layer1"
|
||||
transform="translate(-18.454117,-34.670903)">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 18.719809,61.846371 18.587517,51.734929 c 0,0 14.698452,-6.829606 22.491781,-8.894215 18.280597,-4.842895 36.646466,-7.606499 56.167649,-7.993756 29.649633,-0.588182 48.780143,4.813228 71.891193,12.372959 10.39946,3.401709 29.38622,14.626454 29.38622,14.626454"
|
||||
id="path245" />
|
||||
<use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path245"
|
||||
id="use461"
|
||||
transform="matrix(1,0,0,-1,-4.9118388e-8,123.69274)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row my-4">
|
||||
<div class="col">
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><?=_('Boat data') ?></h5>
|
||||
<table class="table table-sm">
|
||||
<tr><td><?=_('Loa')?></td><td><?=format_float($vessel['loa'], 2, 'm')?></td></tr>
|
||||
<tr><td><?=_('Lwl')?></td><td><?=format_float($vessel['lwl'], 2, 'm')?></td></tr>
|
||||
<tr><td><?=_('Beam')?></td><td><?=format_float($vessel['beam'], 2, 'm')?></td></tr>
|
||||
<tr><td><?=_('Draught')?></td><td><?=format_float($vessel['draught'], 2, 'm')?></td></tr>
|
||||
<tr><td><?=_('Draught, min.')?></td><td><?=format_float($vessel['draught_min'], 2, 'm')?></td></tr>
|
||||
<tr><td><?=_('Displacement')?></td><td><?=$vessel['displacement']?> kg</td></tr>
|
||||
<tr><td><?=_('Ballast')?></td><td><?=$vessel['ballast']?> kg</td></tr>
|
||||
</table>
|
||||
<?php
|
||||
// Edit vessel only for captain
|
||||
if ($user->role == 'captain') {
|
||||
echo '<a href="', $script, '?f=edit&id=', $user->vid, '" class="btn btn-primary" role="button">', _('Edit'), "</a>\n";
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div><?php /* card */ ?>
|
||||
|
||||
</div>
|
||||
<div class="col">
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><?=_('Statistics') ?></h5>
|
||||
<?php
|
||||
// Statistics
|
||||
|
||||
// Storage: 0 - default, 1 - tank
|
||||
$stype = [ 0 => _('Default'), 1 => _('Tank')];
|
||||
$sql = "SELECT stype, COUNT(stype) "
|
||||
. "FROM storage "
|
||||
. "WHERE vid=? "
|
||||
. "GROUP BY stype "
|
||||
. "ORDER BY stype";
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute([$vid]);
|
||||
$res = $sth->fetchAll(PDO::FETCH_NUM);
|
||||
echo '<table class="table table-sm">', "\n";
|
||||
echo '<tr><td colspan="2">', _('Storage type') , "</td>";
|
||||
foreach ($res as $row) {
|
||||
echo "<tr><td>", $stype[$row[0]], "</td><td>", $row[1], "</td></tr>\n";
|
||||
}
|
||||
|
||||
// Boxes
|
||||
$sth = $pdo->prepare("SELECT COUNT(*) FROM box INNER JOIN storage USING (sid) WHERE vid=?");
|
||||
$sth->execute([$user->vid]);
|
||||
echo '<tr><td>', _('Boxes'), '</td><td>', $sth->fetchColumn(), "</td></tr>\n";
|
||||
|
||||
// Equipment
|
||||
$sth = $pdo->prepare("SELECT COUNT(*) FROM equipment WHERE vid=?");
|
||||
$sth->execute([$user->vid]);
|
||||
echo '<tr><td colspan="2">', _('Equipment') , "</td>";
|
||||
echo '<tr><td>', _('Count'), '</td><td>', $sth->fetchColumn(), "</td></tr>\n";
|
||||
|
||||
// Inventory
|
||||
// All items from vessel storage and all items from boxes in vessel storage
|
||||
$sql = "SELECT SUM(n) FROM ("
|
||||
. "SELECT COUNT(*) AS n FROM inventory JOIN storage USING (sid) WHERE boxtype='storage' AND vid=:vid "
|
||||
. "UNION "
|
||||
. "SELECT COUNT(*) AS n FROM inventory JOIN box USING (boxid) JOIN storage ON (box.sid=storage.sid) WHERE boxtype='box' AND vid=:vid"
|
||||
. ") AS x";
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->bindValue(':vid', $user->vid, PDO::PARAM_INT);
|
||||
$sth->execute();
|
||||
|
||||
// Tasks
|
||||
echo '<tr><td colspan="2">', _('Inventory') , "</td>";
|
||||
echo '<tr><td>', _('Count'), '</td><td>', $sth->fetchColumn(), "</td></tr>\n";
|
||||
|
||||
|
||||
echo "</table>\n";
|
||||
|
||||
?>
|
||||
</div>
|
||||
</div><?php /* card */ ?>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="col">
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title"><?=_('Base data')?></h5>
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item"><a href="dropdown.php"><?=_('Selection lists')?></a></li>
|
||||
<li class="list-group-item"><a href="storage.php"><?=_('Storage')?></a></li>
|
||||
<li class="list-group-item"><a href="company.php"><?=_('Companies')?></a></li>
|
||||
</ul>
|
||||
<hr>
|
||||
<h5 class="card-title"><?=_('Additional modules')?></h5>
|
||||
<ul class="list-group list-group-flush">
|
||||
<li class="list-group-item"><a href="measurement.php"><?=_('Measurements')?></a></li>
|
||||
<li class="list-group-item"><a href="checklist.php"><?=_('Checklists')?></a></li>
|
||||
<li class="list-group-item"><a href="search.php"><?=_('Search')?></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div><?php /* col */ ?>
|
||||
</div><?php /* row */ ?>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
|
||||
elseif ($action == ACT_ADD):
|
||||
// ========== VARIANT: add record =============================================
|
||||
|
||||
echo '<h2>', _('Add additional yacht'), "</h2>\n";
|
||||
|
||||
?>
|
||||
<form method="post">
|
||||
<div class="mb-3">
|
||||
<label for="vesselname" class="form-label"><?=_('Name')?></label>
|
||||
<input type="text" class="form-control" id="vesselname" name="vesselname" required autofocus>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="model" class="form-label"><?=_('Model')?></label>
|
||||
<input type="text" class="form-control" id="model" name="model">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="remarks" class="form-label"><?=_('Remarks')?></label>
|
||||
<textarea class="form-control" id="remarks" name="remarks" rows="3"><?=$project->remarks ?></textarea>
|
||||
</div>
|
||||
<div class="container-fluid px-0 my-3">
|
||||
<button type="submit" name="submit[insert]" class="btn btn-primary"><?=_('Save')?></button>
|
||||
<a href="<?=$g_scriptname?>" class="btn btn-secondary"><?=_('Back')?></a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<?php
|
||||
|
||||
elseif ($action == ACT_EDIT):
|
||||
// ========== VARIANT: edit single record =====================================
|
||||
|
||||
$sql = "SELECT vesselname, vtype, model, loa, lwl, beam, draught, draught_min,"
|
||||
. " displacement, ballast, remarks "
|
||||
. "FROM vessel "
|
||||
. "WHERE vid=?";
|
||||
$sth = $pdo->prepare($sql);
|
||||
$sth->execute([$user->vid]);
|
||||
$vessel = $sth->fetch(PDO::FETCH_OBJ);
|
||||
?>
|
||||
<h2><?=_('Edit Yacht')?></h2>
|
||||
<form method="post" action="<?=$g_scriptname?>">
|
||||
<input type="hidden" name="id" value="<?=$user->vid?>">
|
||||
<div class="mb-3">
|
||||
<label for="vesselname" class="form-label"><?=_('Vesselname')?></label>
|
||||
<input type="text" class="form-control" id="vesselname" name="vesselname" value="<?=$vessel->vesselname ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="model" class="form-label"><?=_('Model')?></label>
|
||||
<input type="text" class="form-control" id="model" name="model" value="<?=$vessel->model ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="loa" class="form-label"><?=_('LoA')?></label>
|
||||
<input type="text" class="form-control" id="loa" name="loa" value="<?=format_float($vessel->loa, 2) ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="lwl" class="form-label"><?=_('LwL')?></label>
|
||||
<input type="text" class="form-control" id="lwl" name="lwl" value="<?=format_float($vessel->lwl, 2) ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="beam" class="form-label"><?=_('Beam')?></label>
|
||||
<input type="text" class="form-control" id="beam" name="beam" value="<?=format_float($vessel->beam, 2) ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="draught" class="form-label"><?=_('Draught')?></label>
|
||||
<input type="text" class="form-control" id="draught" name="draught" value="<?=format_float($vessel->draught, 2) ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="draught_min" class="form-label"><?=_('Draught, min.')?></label>
|
||||
<input type="text" class="form-control" id="draught_min" name="draught_min" value="<?=format_float($vessel->draught_min, 2) ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="displacement" class="form-label"><?=_('Displacement')?></label>
|
||||
<input type="number" input-mode="decimal" min="0" max="100000" step="1" class="form-control" id="displacement" name="displacement" value="<?=$vessel->displacement ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="ballast" class="form-label"><?=_('Ballast')?></label>
|
||||
<input type="number" input-mode="decimal" min="0" max="100000" step="1" class="form-control" id="ballast" name="ballast" value="<?=$vessel->ballast ?>">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="remarks" class="form-label"><?=_('Remarks')?></label>
|
||||
<textarea class="form-control" id="remarks" name="remarks" rows="3"><?=$vessel->remarks ?></textarea>
|
||||
</div>
|
||||
<?php
|
||||
|
||||
form_edit_buttons($g_scriptname, $user->vid);
|
||||
echo "</form>\n";
|
||||
|
||||
else:
|
||||
// ========== ERROR UNKNOWN VARIANT ===========================================
|
||||
|
||||
echo '<p>', _('Unknown function call: Please report to system development!'), "</p>\n";
|
||||
|
||||
endif; // $action == ...
|
||||
// ========== END OF VARIANTS =================================================
|
||||
|
||||
include 'footer.php';
|
||||
Reference in New Issue
Block a user