572 lines
21 KiB
PHP
572 lines
21 KiB
PHP
<?php
|
|
/******************************************************************************
|
|
* YMS - Yacht Management Software
|
|
* Copyright (C) 2024-2026 Thomas Hooge
|
|
*
|
|
* SPDX-License-Identifier: WTFPL
|
|
******************************************************************************/
|
|
|
|
require 'globals.inc';
|
|
require 'lib/gpc.inc';
|
|
require 'lib/svg.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());
|
|
}
|
|
$user->load_vessel();
|
|
$g_message->Add(sprintf(_('Selected vessel %d: %s'), $vid, $user->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);
|
|
$id = db_exec_insert('vessel', $p);
|
|
// 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'), $id));
|
|
$user->load_vessel();
|
|
break;
|
|
|
|
case 'update':
|
|
if ($user->role != 'captain') {
|
|
$g_error->Add(_('Access denied. You are not the captain.'));
|
|
break;
|
|
}
|
|
$p[':vid'] = gpc_get_int($_POST, 'id');
|
|
// $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[':beltpos_aft'] = gpc_get_float($_POST, 'beltpos_aft');
|
|
$p[':beltpos_bow'] = gpc_get_float($_POST, 'beltpos_bow');
|
|
$p[':shapefile'] = gpc_get_string($_POST, 'shapefile');
|
|
if ($p[':shapefile'] == '-1') {
|
|
$p[':shapefile'] = NULL;
|
|
}
|
|
$p[':shipyard'] = gpc_get_int($_POST, 'shipyard');
|
|
$p[':sid_default'] = gpc_get_uint($_POST, 'sid');
|
|
$p[':remarks'] = gpc_get_string($_POST, 'remarks', 150);
|
|
db_exec_update('vessel', $p, 'vid');
|
|
$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 =======================================
|
|
|
|
page_caption_search(_('Yacht data'));
|
|
|
|
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]);
|
|
|
|
// Get current vessel data
|
|
$sql = "SELECT vesselname, model, loa, lwl, beam, draught, draught_min,"
|
|
. " displacement, ballast, beltpos_aft, beltpos_bow, shapefile,"
|
|
. " shipyard, remarks "
|
|
. "FROM vessel "
|
|
. "WHERE vid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$vid]);
|
|
$vessel = $sth->fetch(PDO::FETCH_OBJ);
|
|
|
|
echo '<div class="container-fluid">', "\n"; // head block
|
|
|
|
// Switch between vessels
|
|
?>
|
|
<form class="row align-items-center" method="post" action="<?=$g_scriptname?>">
|
|
<div class="col-1">
|
|
<label class="form-label" for="vid">Yacht:</label>
|
|
</div>
|
|
<div class="col-4">
|
|
<select class="form-select" name="vid" id="vid">', "\n";
|
|
<?php
|
|
$sth = $pdo->query("SELECT vid, vesselname, model FROM vessel ORDER BY vid");
|
|
$res = $sth->fetchAll();
|
|
foreach ($res as $row) {
|
|
echo ' <option value="', $row['vid'], '"', ($row['vid'] == $vid ? ' selected>' : '>');
|
|
echo $row['vesselname'];
|
|
if ($row['model']) {
|
|
echo ' - ', $row['model'];
|
|
}
|
|
echo "</option>\n";
|
|
}
|
|
?>
|
|
</select>
|
|
</div>
|
|
<div class="col">
|
|
<?php
|
|
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";
|
|
?>
|
|
</div>
|
|
</form>
|
|
<?php
|
|
|
|
// Show additional yacht info
|
|
echo '<div class="row my-2">', "\n";
|
|
echo '<div class="col-1"></div>', "\n";
|
|
echo '<div class="col">';
|
|
if ($vessel->shipyard && $vessel->shipyard > 0) {
|
|
if ($vessel->shipyard == -3) {
|
|
echo _('Custom-build');
|
|
} else {
|
|
$sql = "SELECT compname FROM company WHERE compid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$vessel->shipyard]);
|
|
echo sprintf(_('Built by %s'), $sth->fetchColumn());
|
|
// TODO year of build?
|
|
}
|
|
}
|
|
if (strlen($vessel->remarks) > 0) {
|
|
echo nl2br($vessel->remarks);
|
|
}
|
|
echo "</div>\n";
|
|
echo "</div>\n"; // row 2
|
|
|
|
echo "</div>\n"; // end of yacht head block
|
|
|
|
// get vessel shape
|
|
// test for predefined base shape
|
|
$shapefilepath = dirname(__FILE__).'/'.$g_shapedir.'/'.$vessel->shapefile;
|
|
if (isset($vessel->shapefile) and file_exists($shapefilepath)) {
|
|
$baseshape = file_get_contents($shapefilepath);
|
|
} else {
|
|
// use internal default shape
|
|
$baseshape = <<<EOT
|
|
<svg version="1.1" width="1024" height="350" viewBox="0 0 1024 350" id="svg1"
|
|
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<g id="g1">
|
|
<path id="path1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-dasharray:8, 4, 2, 4;stroke-dashoffset:0;stroke-opacity:1" d="M 3.3e-6,174.91172 1023.9982,174.90837" />
|
|
<path id="path2" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" d="m 1.1002728,174.9708 c 0,0 0.150828,-90.157538 0.02448,-103.853791 C 66.951611,46.573152 247.6267,3.4573666 430.56326,3.8276086 670.30694,4.3128215 758.66035,44.913257 838.18466,74.965511 917.70898,105.01776 1022.8821,175.00227 1022.8821,175.00227" />
|
|
<use id="use1" x="0" y="0" xlink:href="#path2" transform="matrix(1,0,0,-1,0.0781866,350.05682)" />
|
|
</g>
|
|
</svg>
|
|
EOT;
|
|
}
|
|
|
|
$shape = new SimpleXMLElement($baseshape);
|
|
// $shape['width'], $shape['height']
|
|
|
|
// offset for coordinate origin
|
|
$ox = 0;
|
|
$oy = 0;
|
|
|
|
$g = $shape->addChild('g');
|
|
$g->addAttribute('id', 'boxlayout');
|
|
|
|
// line for belt
|
|
if (isset($vessel->beltpos_aft) and isset($vessel->loa) and ($vessel->beltpos_aft < $vessel->loa)) {
|
|
$x = $ox + round($vessel->beltpos_aft / $vessel->loa * 1024);
|
|
$line = $g->addChild('line');
|
|
$line->addAttribute('x1', $x);
|
|
$line->addAttribute('y1', $oy);
|
|
$line->addAttribute('x2', $x);
|
|
$line->addAttribute('y2', $shape['height']);
|
|
$line->addAttribute('style', 'stroke:#ff0000;stroke-width:1px');
|
|
}
|
|
|
|
if (isset($vessel->beltpos_bow) and isset($vessel->loa) and ($vessel->beltpos_bow < $vessel->loa)) {
|
|
$x = $ox + round($vessel->beltpos_bow / $vessel->loa * 1024);
|
|
$line = $g->addChild('line');
|
|
$line->addAttribute('x1', $x);
|
|
$line->addAttribute('y1', $oy);
|
|
$line->addAttribute('x2', $x);
|
|
$line->addAttribute('y2', $shape['height']);
|
|
$line->addAttribute('style', 'stroke:#ff0000;stroke-width:1px');
|
|
}
|
|
|
|
// select all visible storages
|
|
// - x,y,z is center of storage
|
|
// - todo: shape offset x and y for non centered shapes?
|
|
// read center line y-coordinate from shape?
|
|
if (isset($vessel->loa)) {
|
|
$f = $shape['width'] / ($vessel->loa * 1000);
|
|
$sql = "SELECT sid, sname, x, y, wx, wy FROM storage WHERE x>0 AND wx>0 AND wy>0 AND vid=?";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->execute([$user->vid]);
|
|
foreach ($sth->fetchAll() as $row) {
|
|
$w = round($row['wx'] * $f);
|
|
$h = round($row['wy'] * $f);
|
|
$x = round($row['x'] * $f - $w / 2.0);
|
|
$y = round($row['y'] * $f + $shape['height'] / 2.0 - $h / 2.0);
|
|
$rect = $g->addChild('rect');
|
|
$rect->addChild('title', $row['sname']);
|
|
$rect->addAttribute('x', $x);
|
|
$rect->addAttribute('y', $y);
|
|
$rect->addAttribute('width', $w);
|
|
$rect->addAttribute('height', $h);
|
|
$rect->addAttribute('stroke', '#000');
|
|
$rect->addAttribute('stroke-width', '1px');
|
|
$rect->addAttribute('fill', '#57E389');
|
|
$rect->addAttribute('fill-opacity', '0.4');
|
|
}
|
|
|
|
// grid
|
|
// not yet production ready
|
|
/* $step = round($shape['width'] / ($vessel->loa * 10)); // 10cm steps
|
|
$x = $step;
|
|
$n = 0;
|
|
while ($x < ($vessel->loa * 1000)) {
|
|
$n += 1;
|
|
$line = $g->addChild('line');
|
|
$line->addAttribute('x1', $x);
|
|
$line->addAttribute('y1', '0');
|
|
$line->addAttribute('x2', $x);
|
|
$line->addAttribute('y2', $shape['height']);
|
|
if ($n % 10 == 0) {
|
|
$line->addAttribute('style', 'stroke:#0000dd;stroke-width:1px');
|
|
} else {
|
|
$line->addAttribute('style', 'stroke:#0000aa;stroke-width:0.3px');
|
|
}
|
|
$x += $step;
|
|
} */
|
|
|
|
}
|
|
|
|
|
|
// text with link
|
|
/*$link = $g->addChild('a');
|
|
$link->addAttribute('xlink:href', 'storage.php?f=view&id=1');
|
|
$text = $link->addChild('text', 'Box1');
|
|
$text->addAttribute('font-size', '10');
|
|
$text->addAttribute('x', '14');
|
|
$text->addAttribute('y', '95'); */
|
|
|
|
?>
|
|
<div class="container-fluid my-4">
|
|
<?php
|
|
$xml = $shape->asXML();
|
|
// strip first line: xml version ...
|
|
echo substr($xml, strpos($xml, "\n") + 1);
|
|
?>
|
|
</div>
|
|
|
|
<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>
|
|
<tr><td><?=_('Belt position aft')?></td><td><?=format_float($vessel->beltpos_aft, 2, 'm')?></td></tr>
|
|
<tr><td><?=_('Belt position bow')?></td><td><?=format_float($vessel->beltpos_bow, 2, 'm')?></td></tr>
|
|
</table>
|
|
<?php
|
|
// Edit vessel only for captain
|
|
if ($user->role == 'captain') {
|
|
echo '<a href="', $g_scriptname, '?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')];
|
|
$stype = db_get_options(3);
|
|
$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="3">', _('Storage type') , "</td>";
|
|
foreach ($res as $row) {
|
|
echo "<tr><td> </td><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> </td><td>', _('Boxes'), '</td><td>', $sth->fetchColumn(), "</td></tr>\n";
|
|
|
|
// Equipment
|
|
$sth = $pdo->prepare("SELECT COUNT(*), SUM(weight) FROM equipment WHERE vid=?");
|
|
$sth->execute([$user->vid]);
|
|
$row = $sth->fetch(PDO::FETCH_NUM);
|
|
echo '<tr><td colspan="3">', _('Equipment') , "</td>";
|
|
echo '<tr><td> </td><td>', _('Count'), '</td><td>', $row[0], "</td></tr>\n";
|
|
echo '<tr><td> </td><td>', _('Weight'), '</td><td>', format_float($row[1], 1, 'kg'), "</td></tr>\n";
|
|
|
|
// Inventory
|
|
// All items from vessel storage and all items from boxes in vessel storage
|
|
$sql = "SELECT SUM(n), SUM(w) FROM ("
|
|
. "SELECT COUNT(*) AS n, SUM(i.weight * i.number) as w FROM inventory AS i JOIN storage USING (sid) WHERE conttype='storage' AND vid=:vid "
|
|
. "UNION "
|
|
. "SELECT COUNT(*) AS n, SUM(i.weight * i.number) as w FROM inventory AS i JOIN box USING (boxid) JOIN storage ON (box.sid=storage.sid) WHERE conttype='box' AND vid=:vid"
|
|
. ") AS x";
|
|
$sth = $pdo->prepare($sql);
|
|
$sth->bindValue(':vid', $user->vid, PDO::PARAM_INT);
|
|
$sth->execute();
|
|
$row = $sth->fetch(PDO::FETCH_NUM);
|
|
|
|
echo '<tr><td colspan="3">', _('Inventory') , "</td>";
|
|
echo '<tr><td> </td><td>', _('Count'), '</td><td>', $row[0], "</td></tr>\n";
|
|
echo '<tr><td> </td><td>', _('Weight'), '</td><td>', format_float($row[1], 1, 'kg'), "</td></tr>\n";
|
|
|
|
// Documents
|
|
$sth = $pdo->query("SELECT COUNT(*) FROM document");
|
|
echo '<tr><td colspan="3">', _('Documents') , "</td>";
|
|
echo '<tr><td> </td><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">
|
|
<?php
|
|
// load all base modules not in main menu
|
|
foreach ($g_modules as $mid => $module) {
|
|
if (!in_array($mid, $user->menu) && ($module['group'] === 'base')) {
|
|
echo ' <li class="list-group-item"><a href="', $module['file'], '">', $module['title'],"</a></li>\n";
|
|
}
|
|
}
|
|
?>
|
|
</ul>
|
|
<hr>
|
|
<h5 class="card-title"><?=_('Additional modules')?></h5>
|
|
<ul class="list-group list-group-flush">
|
|
<?php
|
|
// load all main or extra modules not in main menu
|
|
foreach ($g_modules as $mid => $module) {
|
|
if (!in_array($mid, $user->menu) && ($module['group'] === 'extra' || $module['group'] === 'main')) {
|
|
echo ' <li class="list-group-item"><a href="', $module['file'], '">', $module['title'],"</a></li>\n";
|
|
}
|
|
}
|
|
?>
|
|
</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" action="<?=$g_scriptname?>">
|
|
<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 =====================================
|
|
|
|
// check if there is a shapefile-index
|
|
$shapeindexfile = $g_doc_basepath . '/shapeindex.json';
|
|
if (!file_exists($shapeindexfile)) {
|
|
$shapeindex = create_shapeindex($shapeindexfile);
|
|
} else {
|
|
// check if shapeindex needs refresh (older than one day)
|
|
if (time() - filemtime($shapeindexfile) > 86400) {
|
|
$shapeindex = create_shapeindex($shapeindexfile);
|
|
} else {
|
|
// read svg metadata from existing file
|
|
$json = file_get_contents($shapeindexfile);
|
|
$shapeindex = json_decode($json, true);
|
|
if (json_last_error() !== JSON_ERROR_NONE) {
|
|
// TODO some kind of error and fallback
|
|
// perhaps regenerate index file?
|
|
}
|
|
}
|
|
}
|
|
$opt_shapefiles = $g_opt_none + $shapeindex;
|
|
|
|
$opt_storage = db_get_opt_storage($user->vid);
|
|
|
|
$opt_shipyard = $g_opt_none + [-3 => _('― Custom-built ―')];
|
|
$sql = "SELECT compid, compname FROM company WHERE comptype=3 ORDER BY compname";
|
|
$sth = $pdo->query($sql);
|
|
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $row) {
|
|
$opt_shipyard[$row[0]] = $row[1];
|
|
}
|
|
|
|
$sql = "SELECT vesselname, vtype, model, loa, lwl, beam, draught, draught_min,"
|
|
. " displacement, ballast, beltpos_aft, beltpos_bow, shapefile,"
|
|
. " shipyard, sid_default, 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')?>, m</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')?>, m</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')?>, m</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')?>, m</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="beltpos_aft" class="form-label"><?=_('Belt position aft')?>, m</label>
|
|
<input type="text" class="form-control" id="beltpos_aft" name="beltpos_aft" value="<?=format_float($vessel->beltpos_aft, 2) ?>">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="beltpos_bow" class="form-label"><?=_('Belt position bow')?>, m</label>
|
|
<input type="text" class="form-control" id="beltpos_bow" name="beltpos_bow" value="<?=format_float($vessel->beltpos_bow, 2) ?>">
|
|
</div>
|
|
<?php /*
|
|
<div class="mb-3">
|
|
<label for="shapefile" class="form-label"><?=_('Shapefile')?></label>
|
|
<input type="text" class="form-control" id="shapefile" name="shapefile" value="<?=$vessel->shapefile ?>">
|
|
</div> */
|
|
form_create_select('shapefile', _('Shape file'), $opt_shapefiles, $vessel->shapefile);
|
|
form_create_select('shipyard', _('Shipyard'), $opt_shipyard, $vessel->shipyard);
|
|
form_create_select('sid', _('Default Storage'), $g_opt_none + $opt_storage, $vessel->sid_default);
|
|
|
|
?>
|
|
<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';
|