diff options
| author | Geo Halkiadakis <gchalkiadakis@sklavenitis.co.gr> | 2026-07-12 15:51:52 +0300 |
|---|---|---|
| committer | Geo Halkiadakis <gchalkiadakis@sklavenitis.co.gr> | 2026-07-12 15:51:52 +0300 |
| commit | 02608271bb2a9f3a65ed536984d306ee14b48e34 (patch) | |
| tree | 3f23ec48a694ec014e845c4f70d9b5f1c065403c /public/ui-catalogs.php | |
| download | kalassa-02608271bb2a9f3a65ed536984d306ee14b48e34.tar.gz kalassa-02608271bb2a9f3a65ed536984d306ee14b48e34.tar.bz2 kalassa-02608271bb2a9f3a65ed536984d306ee14b48e34.zip | |
Diffstat (limited to 'public/ui-catalogs.php')
| -rw-r--r-- | public/ui-catalogs.php | 396 |
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">ΟΛΑ — (<?=$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 . " — (". $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> |
