Webgui code improvements for dropdown handling

This commit is contained in:
2026-10-01 18:10:57 +02:00
parent 131af7d9e7
commit 72571ede53
15 changed files with 63 additions and 25 deletions
+1 -1
View File
@@ -81,7 +81,7 @@ group (here as example 'yms'). The user which runs the local gui (here
chgrp yms /var/local/lib/yms/thumb chgrp yms /var/local/lib/yms/thumb
chmod -R 770 /var/local/lib/yms chmod -R 770 /var/local/lib/yms
4. Setup local GUI 5. Setup local GUI
Create a local database user with same name as your computer user and allow Create a local database user with same name as your computer user and allow
database access with current unix credentials. E.g if your current unix user database access with current unix credentials. E.g if your current unix user
+1
View File
@@ -17,6 +17,7 @@ Depends:
gir1.2-gtk-3.0, gir1.2-gtk-3.0,
gir1.2-rsvg-2.0, gir1.2-rsvg-2.0,
python3-mysqldb, python3-mysqldb,
python3-fitz,
python3-bcrypt, python3-bcrypt,
python3-pyudev, python3-pyudev,
php (>= 8.0), php (>= 8.0),
+1 -1
View File
@@ -31,7 +31,7 @@ foreach ($sth->fetchAll() as $row) {
$opt_storage[$row['sid']] = $row['sname']; $opt_storage[$row['sid']] = $row['sname'];
} }
$opt_boxtype = db_get_options(9); $opt_boxtype = db_get_options(DD_BOX_TYPE);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
+2 -2
View File
@@ -14,8 +14,8 @@ $pagetitle = _('Cables');
$id = gpc_get_int($_REQUEST, 'id', 0); $id = gpc_get_int($_REQUEST, 'id', 0);
$opt_cabletype = db_get_options(11); $opt_cabletype = db_get_options(DD_CABLE_TYPE);
$opt_techname = db_get_options(12); $opt_techname = db_get_options(DD_CABLE_TECHNAME);
$opt_cablecond = db_load_enum('cable', 'cablecond', true, true); $opt_cablecond = db_load_enum('cable', 'cablecond', true, true);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
+1 -1
View File
@@ -13,7 +13,7 @@ require 'lib/gpc.inc';
$pagetitle=_('Company'); $pagetitle=_('Company');
$id = gpc_get_int($_REQUEST, 'id', 0); $id = gpc_get_int($_REQUEST, 'id', 0);
$opt_comptype = db_get_options(2); $opt_comptype = db_get_options(DD_COMPANY_TYPE);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
+7 -1
View File
@@ -84,6 +84,8 @@ switch ($submit = form_get_action()) {
break; break;
case 'update': case 'update':
# changing ddval would need to update all dependent data
# so this is not intended here!
$p[':ddtext'] = gpc_get_string($_POST, 'ddtext'); $p[':ddtext'] = gpc_get_string($_POST, 'ddtext');
$p[':ddshort'] = gpc_get_string($_POST, 'ddshort'); $p[':ddshort'] = gpc_get_string($_POST, 'ddshort');
$p[':color'] = gpc_get_color($_POST, 'color'); $p[':color'] = gpc_get_color($_POST, 'color');
@@ -132,7 +134,7 @@ $sth = $pdo->query($sql);
foreach ($sth->fetchAll(PDO::FETCH_NUM) as $row) { foreach ($sth->fetchAll(PDO::FETCH_NUM) as $row) {
$num[$row[0]] = $row[1]; $num[$row[0]] = $row[1];
} }
$sql = "SELECT ddval, ddtext FROM dropdown WHERE ddid=0 AND ddval>0"; $sql = "SELECT ddval, ddtext, flags FROM dropdown WHERE ddid=0 AND ddval>0";
$sth = $pdo->query($sql); $sth = $pdo->query($sql);
echo "<h1>$pagetitle</h1>\n"; echo "<h1>$pagetitle</h1>\n";
@@ -160,7 +162,11 @@ foreach ($sth->fetchAll() as $row) {
echo '<td>', $num[$row['ddval']] ?? 0, '</td>'; echo '<td>', $num[$row['ddval']] ?? 0, '</td>';
// form_action_buttons($g_scriptname, $row['ddval']); // form_action_buttons($g_scriptname, $row['ddval']);
echo "<td>"; echo "<td>";
if ($row['flags'] == 'locked') {
echo _('Locked');
} else {
echo '<a class="text-nowrap" title="', _('Edit'), '" href="', $g_scriptname, '?f=edit&id=', $row['ddval'], '"><i class="bi bi-pencil ms-2"></i></a>'; echo '<a class="text-nowrap" title="', _('Edit'), '" href="', $g_scriptname, '?f=edit&id=', $row['ddval'], '"><i class="bi bi-pencil ms-2"></i></a>';
}
echo "</td>\n"; echo "</td>\n";
echo "</tr>\n"; echo "</tr>\n";
} }
+2 -2
View File
@@ -18,8 +18,8 @@ $id = gpc_get_int($_REQUEST, 'id', 0);
$opt_supplier = db_get_opt_supp($g_opt_unknown); $opt_supplier = db_get_opt_supp($g_opt_unknown);
$opt_manufacturer = db_get_opt_manuf($g_opt_unknown); $opt_manufacturer = db_get_opt_manuf($g_opt_unknown);
$opt_ecat = db_get_options(4); // Equipment categories $opt_ecat = db_get_options(DD_EQUIPMENT_CATEGORY);
$opt_unit = db_get_options(8); $opt_unit = db_get_options(DD_UNIT);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
+3 -3
View File
@@ -14,8 +14,8 @@ $pagetitle = _('Fuses');
$id = gpc_get_int($_REQUEST, 'id', 0); $id = gpc_get_int($_REQUEST, 'id', 0);
$opt_ftype = db_get_options(7); $opt_ftype = db_get_options(DD_FUSE_TYPE);
$opt_location = db_get_options(10); $opt_location = db_get_options(DD_FUSE_BLOCK);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
@@ -94,7 +94,7 @@ if ($action == ACT_DEFAULT):
// ========== VARIANT: default behavior ======================================= // ========== VARIANT: default behavior =======================================
// lookup tables // lookup tables
$opt_ftype_short = db_get_options(7, '', true); $opt_ftype_short = db_get_options(DD_FUSE_TYPE, '', true);
// load filter from db // load filter from db
$flt = db_get_filter($user->id, 212); $flt = db_get_filter($user->id, 212);
+17
View File
@@ -15,6 +15,7 @@
* 0.2.0 2026-08-18 First public release tho * 0.2.0 2026-08-18 First public release tho
* 0.2.1 2026-08-28 Foreign keys, bugfixes and output sanitation tho * 0.2.1 2026-08-28 Foreign keys, bugfixes and output sanitation tho
* 0.2.2 2026-09-21 Lots of improvements and fixes tho * 0.2.2 2026-09-21 Lots of improvements and fixes tho
* 2026-10-01 Dropdown constants for readability tho
* *
*/ */
@@ -47,6 +48,22 @@ define('ROLE_CAPTAIN', 'captain');
define('ROLE_HELMSMAN', 'helmsman'); define('ROLE_HELMSMAN', 'helmsman');
define('ROLE_SAILOR', 'sailor'); define('ROLE_SAILOR', 'sailor');
define('DD_HULL_TYPE', 1);
define('DD_COMPANY_TYPE', 2);
define('DD_STORAGE_TYPE', 3);
define('DD_EQUIPMENT_CATEGORY', 4);
define('DD_PROVISION_CATEGORY', 5);
define('DD_PROVISION_UNIT', 6);
define('DD_FUSE_TYPE', 7);
define('DD_UNIT', 8);
define('DD_BOX_TYPE', 9);
define('DD_FUSE_BLOCK', 10);
define('DD_CABLE_TYPE', 11);
define('DD_CABLE_TECHNAME', 12);
define('DD_INVENTORY_CATEGORY', 13);
define('DD_BBN_VESSELDATA', 14);
define('DD_MEASUREMENT_CATEGORY', 15);
// ========== PAGE START CODE ================================================= // ========== PAGE START CODE =================================================
// global version string // global version string
+1 -1
View File
@@ -351,7 +351,7 @@ if ($user->role == 'captain') {
// Storage: 0 - default, 1 - tank // Storage: 0 - default, 1 - tank
// $stype = [ 0 => _('Default'), 1 => _('Tank')]; // $stype = [ 0 => _('Default'), 1 => _('Tank')];
$stype = db_get_options(3); $stype = db_get_options(DD_STORAGE_TYPE);
$sql = "SELECT stype, COUNT(stype) " $sql = "SELECT stype, COUNT(stype) "
. "FROM storage " . "FROM storage "
. "WHERE vid=? " . "WHERE vid=? "
+1 -1
View File
@@ -18,7 +18,7 @@ $opt_storage = db_get_opt_storage($user->vid);
$opt_box = db_get_opt_box($user->vid); $opt_box = db_get_opt_box($user->vid);
$opt_invcond = db_load_enum('inventory', 'invcond', true, true); $opt_invcond = db_load_enum('inventory', 'invcond', true, true);
$opt_equipment = db_get_opt_equip($user->vid, [-1 => _('&horbar; none &horbar;')]); $opt_equipment = db_get_opt_equip($user->vid, [-1 => _('&horbar; none &horbar;')]);
$opt_icat = db_get_options(13); $opt_icat = db_get_options(DD_INVENTORY_CATEGORY);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
+10 -3
View File
@@ -25,7 +25,8 @@ $pagetitle = _('Measurements');
$id = gpc_get_int($_REQUEST, 'id', 0); $id = gpc_get_int($_REQUEST, 'id', 0);
$opt_unit = db_get_options(8); $opt_unit = db_get_options(DD_UNIT);
$opt_category = db_get_options(DD_MEASUREMENT_CATEGORY);
$opt_accuracy = db_load_enum('measurement', 'accuracy', true, true); $opt_accuracy = db_load_enum('measurement', 'accuracy', true, true);
$opt_dimensions = array( $opt_dimensions = array(
1 => _('1D'), 1 => _('1D'),
@@ -102,6 +103,10 @@ switch ($submit = form_get_action()) {
$p[':unit'] = gpc_get_int($_POST, 'unit'); $p[':unit'] = gpc_get_int($_POST, 'unit');
$p[':accuracy'] = gpc_get_string($_POST, 'accuracy'); $p[':accuracy'] = gpc_get_string($_POST, 'accuracy');
$p[':mdate'] = gpc_get_date($_POST, 'mdate'); $p[':mdate'] = gpc_get_date($_POST, 'mdate');
$p[':mcat'] = gpc_get_int($_POST, 'mcat');
if ($p[':mcat'] == -1) {
$p[':mcat'] = NULL;
}
$p[':note'] = gpc_get_string($_POST, 'note'); $p[':note'] = gpc_get_string($_POST, 'note');
$p[':eid'] = gpc_get_int($_POST, 'eid'); $p[':eid'] = gpc_get_int($_POST, 'eid');
if ($p[':eid'] == -1) { if ($p[':eid'] == -1) {
@@ -291,7 +296,7 @@ form_create_select('eid', _('Equipment'), $opt_equipment, $id);
elseif ($action == ACT_VIEW): elseif ($action == ACT_VIEW):
// ========== VARIANT: view single record ===================================== // ========== VARIANT: view single record =====================================
$sql = "SELECT mname, unit, nval, val1, val2, val3, accuracy, mdate, note, eid " $sql = "SELECT mname, unit, nval, val1, val2, val3, accuracy, mdate, mcat, note, eid "
. "FROM measurement " . "FROM measurement "
. "WHERE mid=?"; . "WHERE mid=?";
$sth = $pdo->prepare($sql); $sth = $pdo->prepare($sql);
@@ -310,6 +315,7 @@ echo '<tr><th>', _('Value 3'), '</th><td>', $measurement->val3, "</td></tr>\n";
echo '<tr><th>', _('Accuracy'), '</th><td>', get_enum($measurement->accuracy), "</td></tr>\n"; echo '<tr><th>', _('Accuracy'), '</th><td>', get_enum($measurement->accuracy), "</td></tr>\n";
echo '<tr><th>', _('Date'), '</th><td>', format_date($measurement->mdate), "</td></tr>\n"; echo '<tr><th>', _('Date'), '</th><td>', format_date($measurement->mdate), "</td></tr>\n";
echo '<tr><th>', _('Note'), '</th><td>', h($measurement->note), "</td></tr>\n"; echo '<tr><th>', _('Note'), '</th><td>', h($measurement->note), "</td></tr>\n";
echo '<tr><th>', _('Category'),"</th><td>", $opt_category[$measurement->mcat] ?? 'n/a', "</td></tr>\n";
echo '<tr><th>', _('Equipment'), '</th><td>', $opt_equipment[$measurement->eid], "</td></tr>\n"; echo '<tr><th>', _('Equipment'), '</th><td>', $opt_equipment[$measurement->eid], "</td></tr>\n";
echo "</table>\n"; echo "</table>\n";
@@ -319,7 +325,7 @@ form_view_buttons($g_scriptname, $id);
elseif ($action == ACT_EDIT): elseif ($action == ACT_EDIT):
// ========== VARIANT: edit single record ===================================== // ========== VARIANT: edit single record =====================================
$sql = "SELECT mname, nval, val1, val2, val3, unit, accuracy, note, eid " $sql = "SELECT mname, nval, val1, val2, val3, unit, accuracy, note, eid, mcat "
. "FROM measurement " . "FROM measurement "
. "WHERE mid=?"; . "WHERE mid=?";
$sth = $pdo->prepare($sql); $sth = $pdo->prepare($sql);
@@ -356,6 +362,7 @@ form_create_select('nval', _('Dimensions'), $opt_dimensions, $measurement->nval)
<?php <?php
form_create_select('unit', _('Unit'), $opt_unit, $measurement->unit); form_create_select('unit', _('Unit'), $opt_unit, $measurement->unit);
form_create_select('accuracy', _('Accuracy'), $opt_accuracy, $measurement->accuracy); form_create_select('accuracy', _('Accuracy'), $opt_accuracy, $measurement->accuracy);
form_create_select('mcat', _('Category'), $g_opt_none + $opt_category, $measurement->mcat);
form_create_select('eid', _('Equipment'), $opt_equipment, $measurement->eid); form_create_select('eid', _('Equipment'), $opt_equipment, $measurement->eid);
form_edit_buttons($g_scriptname, $id); form_edit_buttons($g_scriptname, $id);
+2 -2
View File
@@ -15,8 +15,8 @@ $pagetitle=_('Provisions');
$id = gpc_get_int($_REQUEST, 'id', 0); $id = gpc_get_int($_REQUEST, 'id', 0);
$opt_storage = db_get_opt_storage($user->vid); $opt_storage = db_get_opt_storage($user->vid);
$opt_category = db_get_options(5); $opt_category = db_get_options(DD_PROVISION_CATEGORY);
$opt_unit = db_get_options(6); $opt_unit = db_get_options(DD_PROVISION_UNIT);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
+10 -3
View File
@@ -14,7 +14,7 @@ $pagetitle = _('Storage');
$id = gpc_get_int($_REQUEST, 'id', 0); $id = gpc_get_int($_REQUEST, 'id', 0);
$opt_stype = db_get_options(3); $opt_stype = db_get_options(SS_STORAGE_TYPE);
$opt_capaunit = $g_opt_empty + db_load_enum('storage', 'capaunit', true, true); $opt_capaunit = $g_opt_empty + db_load_enum('storage', 'capaunit', true, true);
// ========== ACTIONS START =================================================== // ========== ACTIONS START ===================================================
@@ -50,6 +50,7 @@ switch ($submit = form_get_action()) {
$p[':capacity'] = gpc_get_int($_POST, 'capacity'); $p[':capacity'] = gpc_get_int($_POST, 'capacity');
if ($p[':capacity'] == 0) $p[':capacity'] = NULL; if ($p[':capacity'] == 0) $p[':capacity'] = NULL;
$p[':capaunit'] = gpc_get_string($_POST, 'capaunit'); $p[':capaunit'] = gpc_get_string($_POST, 'capaunit');
$p[':color'] = gpc_get_color($_POST, 'color');
$p[':remarks'] = gpc_get_string($_POST, 'remarks', 150); $p[':remarks'] = gpc_get_string($_POST, 'remarks', 150);
db_exec_update('storage', $p, 'sid'); db_exec_update('storage', $p, 'sid');
$action = ACT_VIEW; $action = ACT_VIEW;
@@ -107,7 +108,7 @@ page_caption_search($pagetitle);
// Storage // Storage
// stype from dropdown // stype from dropdown
$sql = "SELECT sid, sname, x, y, z, angle, remarks " $sql = "SELECT sid, sname, color, x, y, z, angle, remarks "
. "FROM storage " . "FROM storage "
. "WHERE vid=? " . "WHERE vid=? "
. "ORDER BY sid"; . "ORDER BY sid";
@@ -119,6 +120,7 @@ echo "<thead>\n";
echo "<tr>"; echo "<tr>";
echo '<th>#</th>'; echo '<th>#</th>';
echo "<th>", _('Name'), "</th>"; echo "<th>", _('Name'), "</th>";
echo "<th>", _('Color'), "</th>";
echo "<th>", _('Position'), "</th>"; echo "<th>", _('Position'), "</th>";
echo "<th>", _('Remarks'), "</th>"; echo "<th>", _('Remarks'), "</th>";
echo "<th>&nbsp;</th>"; echo "<th>&nbsp;</th>";
@@ -132,6 +134,7 @@ foreach ($res as $row) {
echo '<a class="text-nowrap" title="', _('View'), '" href="', $g_scriptname, '?f=view&id=', $row['sid'], '"><i class="bi bi-eye ms-2"></i></a>', "\n"; echo '<a class="text-nowrap" title="', _('View'), '" href="', $g_scriptname, '?f=view&id=', $row['sid'], '"><i class="bi bi-eye ms-2"></i></a>', "\n";
echo "</td>\n"; echo "</td>\n";
echo "<td>", $row['sname'], "</td>\n"; echo "<td>", $row['sname'], "</td>\n";
echo '<td>', format_color(strtoupper($row['color'])), "</td>\n";
if ($row['angle'] != 0) { if ($row['angle'] != 0) {
$angle = " (" . $row['angle'] . "°)"; $angle = " (" . $row['angle'] . "°)";
} else { } else {
@@ -216,7 +219,7 @@ form_create_select('stype', _('Type'), $opt_stype);
elseif ($action == ACT_VIEW): elseif ($action == ACT_VIEW):
// ========== VARIANT: view single record ===================================== // ========== VARIANT: view single record =====================================
$opt_unit = db_get_options(6); $opt_unit = db_get_options(DD_PROVISION_UNIT);
$sql = "SELECT sid, sname, stype, capacity, capaunit, x, y, z, wx, wy, wz, angle, color, remarks " $sql = "SELECT sid, sname, stype, capacity, capaunit, x, y, z, wx, wy, wz, angle, color, remarks "
. "FROM storage " . "FROM storage "
. "WHERE sid=?"; . "WHERE sid=?";
@@ -358,6 +361,10 @@ form_create_select('stype', _('Type'), $opt_stype, $storage->stype);
<input type="number" class="form-control" id="capacity" name="capacity" value="<?=$storage->capacity ?>"> <input type="number" class="form-control" id="capacity" name="capacity" value="<?=$storage->capacity ?>">
</div> </div>
<?php form_create_select('capaunit', _('Capacity Unit'), $opt_capaunit, $storage->capaunit); ?> <?php form_create_select('capaunit', _('Capacity Unit'), $opt_capaunit, $storage->capaunit); ?>
<div class="mb-3">
<label for="color"><?=_('Color')?></label>
<input type="color" class="form-control" id="color" name="color" value="#<?=$storage->color ?>">
</div>
<div class="mb-3"> <div class="mb-3">
<label for="remarks" class="form-label"><?=_('Remarks')?></label> <label for="remarks" class="form-label"><?=_('Remarks')?></label>
<textarea class="form-control" id="remarks" name="remarks" rows="3"><?=h($storage->remarks)?></textarea> <textarea class="form-control" id="remarks" name="remarks" rows="3"><?=h($storage->remarks)?></textarea>
+3 -3
View File
@@ -1,4 +1,4 @@
.TH YMS 1 "August 2026" "YMS 0.2" "User Commands" .TH YMS 1 "September 2026" "YMS 0.2" "User Commands"
.SH NAME .SH NAME
yms - Yacht Management Software yms - Yacht Management Software
.SH SYNOPSIS .SH SYNOPSIS
@@ -50,7 +50,7 @@ the application is running.
Per-user configuration file for the YMS graphical user interface. Per-user configuration file for the YMS graphical user interface.
.TP .TP
.I /var/local/yms/ .I /var/local/lib/yms/
Persistent storage for files managed by YMS. Persistent storage for files managed by YMS.
The directory contains photos, documents and other media associated The directory contains photos, documents and other media associated
@@ -60,7 +60,7 @@ SVG and PDF.
YMS stores application data in two separate locations. YMS stores application data in two separate locations.
The directory The directory
.I /var/local/yms/ .I /var/local/lib/yms/
contains user-managed photos and documents and should be included contains user-managed photos and documents and should be included
in regular backups. in regular backups.