summaryrefslogtreecommitdiff
path: root/public/ui-catalogs.php
diff options
context:
space:
mode:
authorGeo Halkiadakis <gchalkiadakis@sklavenitis.co.gr>2026-07-12 15:51:52 +0300
committerGeo Halkiadakis <gchalkiadakis@sklavenitis.co.gr>2026-07-12 15:51:52 +0300
commit02608271bb2a9f3a65ed536984d306ee14b48e34 (patch)
tree3f23ec48a694ec014e845c4f70d9b5f1c065403c /public/ui-catalogs.php
downloadkalassa-master.tar.gz
kalassa-master.tar.bz2
kalassa-master.zip
initialize repository; add docker config; migrate configuration to new specsHEADmaster
Diffstat (limited to 'public/ui-catalogs.php')
-rw-r--r--public/ui-catalogs.php396
1 files changed, 396 insertions, 0 deletions
diff --git a/public/ui-catalogs.php b/public/ui-catalogs.php
new file mode 100644
index 0000000..4b416a6
--- /dev/null
+++ b/public/ui-catalogs.php
@@ -0,0 +1,396 @@
+<?php
+include("config/parametres.php");
+include("includes/sessions.php");
+include("includes/functions.php");
+
+// if user's ROLE is less then ADMIN : then go to Login | Panel
+// -----------------------------------------------------------------------------
+if (ROLE < ADMIN) {
+ header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
+ header("Cache-Control: post-check=0, pre-check=0", false);
+ header("Pragma: no-cache");
+ header("Location: /");
+ die();
+}
+
+
+// Parse arguments and intitialize behaviout flags
+// Arguments:
+// ID -> ccode [ certain id: ##.## --or-- 0 = any id ]
+////////////////////////////////////////////////////////////////////////////////
+
+$doSearch = false; // shall not do a search (if no search arguments passes)
+
+$totals = get_totals(); // get totals of categories
+
+if ((isset($_GET['id'])) && (mb_strlen($_GET['id']) < 6)) {
+ $ccid = $_GET['id']; // category id passed
+ $doSearch = true;
+}
+
+
+// get records
+// -----------------------------------------------------------------------------
+
+ if ($doSearch) {
+
+ $items = array();
+
+ // init database connection
+ $_dbc = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_DBMS);
+ if ($_dbc->connect_errno) {
+ echo "Database connection failed; Please try in a few minutes. ";
+ if (TESTING) echo $_dbc->connect_error;
+ $_dbc->close(); die();
+ }
+ $_dbc->set_charset("utf8");
+
+ if ($ccid != '0') {
+ $_stm = $_dbc->prepare("SELECT id, img, img2, ccode, identity, summary, operator, `timestamp`, record FROM items WHERE ccode = ?");
+ $_stm->bind_param("s", $ccid);
+ }
+ else {
+ $_stm = $_dbc->prepare("SELECT id, img, img2, ccode, identity, summary, operator, `timestamp`, record FROM items");
+ }
+ $_stm->execute(); // execute query
+ $_stm->store_result(); // store result
+
+ if ($_stm->num_rows) {
+
+ $_stm->bind_result($id, $imgfile, $imgfile2, $ccode, $idnt, $sum, $opr, $tm, $serREC); // bind result variables
+
+ while ($_stm->fetch()) {
+
+ $record = unserialize($serREC);
+ $it_id = explode('.', $idnt);
+
+ // calculate record
+ $record['id'] = $id;
+ $record['ccode'] = $ccode;
+ $record['img'] = ( (strlen($imgfile) > 9) ? ("/". UPLOAD_DIR . intdiv($id,FOLDER_CPC) ."/". $imgfile) : "" );
+ $record['img2'] = ( (strlen($imgfile2) > 9) ? ("/". UPLOAD_DIR . intdiv($id,FOLDER_CPC) ."/". $imgfile2) : "" );
+ $record['identity'] = $idnt;
+ $record['operator'] = $opr;
+ $record['itemid'] = end($it_id);
+ $record['totalitems'] = $totals[$record['ccode']];
+ $record['timestamp'] = local_dt($tm);
+ $record['summary'] = $sum;
+
+ $items[] = $record;
+ unset($record);
+
+
+
+
+ /*
+ // unserialize main record to variable
+ $record = unserialize($serREC);
+ $it_id = explode('.', $idnt);
+
+ // calculate record
+ $record['id'] = $id;
+ $record['identity'] = $idnt;
+ $record['operator'] = $opr;
+ $record['itemid'] = end($it_id);
+ $record['totalitems'] = $totals[$ccode];
+ date_default_timezone_set('Europe/Athens');
+ setlocale(LC_ALL, 'el_GR.UTF-8', 'grc');
+ $record['timestamp'] = local_dt($tm);
+
+ $record['img'] = ( (strlen($imgfile) > 9) ? ("/". UPLOAD_DIR . intdiv($id,FOLDER_CPC) ."/". $imgfile) : "" );
+ $record['img2'] = ( (strlen($imgfile2) > 9) ? ("/". UPLOAD_DIR . intdiv($id,FOLDER_CPC) ."/". $imgfile2) : "" );
+
+ $items[] = array(
+ 'id' => $id,
+ 'ccode' => $ccode,
+ 'summary' => $sum,
+ 'record' => $record,
+ );
+ */
+
+ }
+ }
+
+ $_stm->close(); // close statement
+ $_dbc->close(); // close connection
+
+ // 03. Prepare PDF to print ----------------------------------------------------
+ // include printing php script
+ ////////////////////////////////////////////////////////////////////////////////
+
+ define("PRINT_MODE", 'book');
+ define("RENDER_COVER", true );
+ define("RENDER_HF", true); // render header + footer
+ $formARRAY = json_decode(FORMJSON);
+
+ include("do-pdf.php");
+
+ }
+
+ // Script Workflow:
+ // ---------------------------------------------------------------------------
+ // 1. read fields options
+ // 2. generate HTML
+ // 3. generate JS needed
+
+ // the UI
+ // ---------------------------------------------------------------------------
+ // Fields are grouped in sections
+ // These sections presented in tabs (or accordion if mobile device)
+ // Two (2) sections incduded to inform the user of empty fields or errors
+
+ // Libraries and FrameWorks used
+ // ---------------------------------------------------------------------------
+ // Bootstrap 4.3 is used for easy responsive HTML code
+ // JQuery 3.3 is used to handle user interation
+ // Select2 is used to make select-boxes (single or multiple) easier to use
+
+
+ // read fields options (json format) /////////////////////////////////////////
+ // ---------------------------------------------------------------------------
+ // --- depricated: $formJSON = file_get_contents('config/kallassa.json');
+ // --- $formJSON has been readed already on functions.php and being a global constant
+ $formARRAY = json_decode(FORMJSON);
+
+ // Init strigns for JS generator (needed to handle everything) ///////////////
+ // ---------------------------------------------------------------------------
+ $checkFilledJS = ""; // JS for checking empty fields
+ $ref2Select2JS = ""; // references to Select2-controls Javascript
+ $initSelectsJS = ""; // js to initialize select fields (single or multiple)
+
+?><!DOCTYPE html>
+<html prefix="og: http://ogp.me/ns#" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB" dir="ltr">
+ <head>
+ <!-- Metas + Title -->
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+
+ <title><?=PROJECT?> : Κατάλογοι Αντικειμένων'</title>
+
+ <!-- CSS needed -->
+ <link href="https://fonts.googleapis.com/css?family=Ubuntu:400,700&display=swap" rel="stylesheet">
+ <link rel="stylesheet" href="/css/bootstrap.min.css" /><!-- v4.4.1 -->
+ <link rel="stylesheet" href="/css/select2.min.css" /><!-- v4.0.10 -->
+ <link rel="stylesheet" href="/css/pi.css" />
+ <style>
+pre {
+ white-space: pre-wrap; /* css-3 */
+ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+}
+ </style>
+ </head>
+ <body>
+ <?php // Menu ----------------------------------------------------------------
+ include("includes/menu.php");
+ ?>
+
+ <div class="pi-container">
+ <div class="row">
+ <div class="col-md-12">
+ <h2>Κατάλογοι Αντικειμένων</h2>
+ <h4>Η διεργασία είναι υπό δοκιμή.</h4>
+
+ <div class=""><!-- class='row' : conflicts with select2 width @_@ -->
+ <form>
+
+ <div class="form-group col-md-12">
+ <label for="ccode">Κωδικός Κατηγορίας</label>
+ <select id="ccode" class="select-field" name="ccode" style="width:100%;">
+ <option></option>
+ <option value="0">ΟΛΑ &mdash; (<?=$totals['all']?>)</option>
+ <?php
+ $ccAr = json_decode(CODEJSON);
+ foreach ($ccAr as $key => $val) {
+ if (isset($totals[$val->id])) {
+ echo "<option value='". $val->id ."'>". $val->id ." : ". $val->tag . " &mdash; (". $totals[$val->id] .")</option>
+ ";
+ }
+ }
+ ?>
+ </select>
+ </div>
+
+ </form>
+ </div>
+
+ <hr />
+
+ <pre>
+ <?php
+ print_r($items);
+ ?>
+ </pre>
+
+
+ </div>
+ </div>
+ </div>
+ <!-- DOM ENDS HERE -->
+
+ <!-- scripts and libraries
+ load and register one by one, so you don't need to worry about if they are ready -->
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-migrate/1.4.1/jquery-migrate.min.js"></script>
+ <script src="/js/bootstrap.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/js/select2.full.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.10/js/i18n/el.js"></script>
+
+ <!-- scripts and libraries
+ load and register one by one, so you don't need to worry about if they are ready
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-migrate/1.4.1/jquery-migrate.min.js"></script>
+ <script src="/js/bootstrap.min.js"></script>
+-->
+ <script>
+ // NOW RUN EVERYTHING AFTER JQUERY (AND DOM ready)
+ // -----------------------------------------------------------------------------
+ ////////////////////////////////////////////////////////////////////////////////
+
+ var waitingResponse = false; // flag for an ajax request that was sent and still waiting response
+
+ // functions needed
+ // ---------------------------------------------------------------------------
+
+ // pure JS ajax GET request
+ // return data as JSON
+ // no fancy things like UTF8; if needed use base64 ---------------------------
+ function ajax_get(url, callback) {
+ var xmlhttp = new XMLHttpRequest();
+ xmlhttp.onreadystatechange = function() {
+ if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
+
+ try {
+ var data = JSON.parse(xmlhttp.responseText);
+ } catch(err) {
+ console.log(err.message + " in " + xmlhttp.responseText);
+ return;
+ }
+ callback(data);
+ }
+ };
+
+ xmlhttp.open("GET", url, true);
+ xmlhttp.send();
+ }
+
+ // menu management
+ // ---------------------------------------------------------------------------
+ $('.dropdown-item').on('click', function(e){
+ e.preventDefault();
+
+ // all data-goto have the format: 'method,uri_address'
+ // uri_address is the url to call
+ // method options:
+ // * url : means goto url (redirect)
+ // * ajax : means call url via ajax; if 'success = true' then goto '/' after that
+ // -------------------------------------------------------------------------
+ var opt = $(this).data('goto').split(','); // split data-goto
+
+ if (opt[0] == 'url') { // if method = url
+ window.location.href = opt[1];
+ }
+ else { // else, method = ajax
+ ajax_get(opt[1], function(response) {
+ if (response.success) {
+ window.location.href = '/';
+ }
+ });
+ }
+ });
+
+
+
+ // 01. MENU MANAGEMENT
+ // ---------------------------------------------------------------------------
+ //////////////////////////////////////////////////////////////////////////////
+
+ // menu management
+ // ---------------------------------------------------------------------------
+ $('.dropdown-item').on('click', function(e) {
+ e.preventDefault();
+
+ if (!waitingResponse) {
+ waitingResponse = true;
+
+ // var r = confirm("Δεν έχετε αποθηκεύσει το τρέχον αντικείμενο!\nΕίστε σίγουροι ότι θέλετε να εγκαταλείψετε τη σελίδα;");
+ r = true; // no need for confirmation
+ if (r == true) {
+
+ // all data-goto have the format: 'method,uri_address'
+ // uri_address is the url to call
+ // method options:
+ // * url : means goto url (redirect)
+ // * ajax : means call url via ajax; if 'success = true' then goto '/' after that
+ // -----------------------------------------------------------------------
+ var opt = $(this).data('goto').split(','); // split data-goto
+
+ if (opt[0] == 'url') { // if method = url
+ window.location.href = opt[1];
+ }
+ else { // else, method = ajax
+ ajax_get(opt[1], function(response) {
+ if (response.success) {
+ window.location.href = '/';
+ }
+ });
+ }
+
+ }
+ else {
+ // user did not confirmed the selection; do nothing
+ }
+
+ waitingResponse = false;
+ }
+
+ });
+
+
+ // 02. INIT AND HANDLE SEARCH FIELDS
+ // (select2 CCODE)
+ // ---------------------------------------------------------------------------
+ //////////////////////////////////////////////////////////////////////////////
+
+ // FUNCTION: Get selected value(s) of Select2 control
+ // pass arg: source-element
+ // return: value(s) comma-separated
+ // ---------------------------------------------------------------------------
+ function getValues(srcElm) {
+ var res;
+ var obj = srcElm.select2('data'); // get delected data array
+
+ if (obj.length === 0) return ''; // if empty list then nothig is selected
+ else {
+ var i = 0;
+ obj.forEach(function(elm){ // loop through object elements array
+
+ if (i) res += ',' + elm.id; // if not first item, prepend ',' befor value(id)
+ else res = elm.id; // else set (first) checked value
+
+ i++;
+ });
+ }
+ return res;
+ }
+
+ // patch select2-multiple widths
+ // ---------------------------------------------------------------------------
+ $('.select-field').select2({ width: '100%' });
+
+ // init CCODE select2
+ // ---------------------------------------------------------------------------
+ var ccode = $('#ccode');
+ ccode.select2({ placeholder: ' ', allowClear: true });
+
+ $('form').on('keyup change paste', 'input, select, textarea', function(){
+ console.log('Form changed!');
+ window.location.href = '/ui-catalogs.php?id=' + getValues(ccode);
+ });
+ </script>
+
+ </body>
+</html>