diff options
Diffstat (limited to 'public/ui-search.php')
| -rw-r--r-- | public/ui-search.php | 373 |
1 files changed, 373 insertions, 0 deletions
diff --git a/public/ui-search.php b/public/ui-search.php new file mode 100644 index 0000000..1a9b8ab --- /dev/null +++ b/public/ui-search.php @@ -0,0 +1,373 @@ +<?php +include("config/parametres.php"); +include("includes/sessions.php"); +include("includes/functions.php"); +date_default_timezone_set('Europe/Athens'); +setlocale(LC_ALL, 'el_GR.UTF-8', 'grc'); + + +// if visitor then go to '/' +if (!ROLE) { + 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"); + + // prepare statemet + if ($ccid != '0') { + $_stm = $_dbc->prepare("SELECT id, img, ccode, identity, summary, operator, `timestamp` FROM items WHERE ccode = ?"); + $_stm->bind_param("s", $ccid); + } + else { + $_stm = $_dbc->prepare("SELECT id, img, ccode, identity, summary, operator, `timestamp` FROM items"); + } + $_stm->execute(); // execute query + $_stm->store_result(); // store result + + if ($_stm->num_rows) { + + $_stm->bind_result($id, $imgfile, $ccode, $idnt, $sum, $opr, $tm); // bind result variables + + while ($_stm->fetch()) { + + $it_id = explode('.', $idnt); + $items[] = array( + 'id' => $id, + 'ccode' => $ccode, + 'img' => ( (strlen($imgfile) > 9) ? ("/". UPLOAD_DIR . intdiv($id,FOLDER_CPC) ."/pi". $imgfile) : "" ), + 'identity' => $idnt, + 'itemid' => end($it_id), + 'totalitems' => $totals[$ccode], + 'summary' => $sum, + 'operator' => $opr, + 'timestamp' => local_dt($tm) + ); + + } + } + + $_stm->close(); // close statement + $_dbc->close(); // close connection + + } + + // 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> + @media print { + .dropdown-menu, .dropdown-menu .dropdown-item { display: none !important; } + } + </style> + </head> + <body> + <?php // Menu ---------------------------------------------------------------- + include("includes/menu.php"); + ?> + + +<div class="pi-container"> + <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 /> + + <?php if ($doSearch) : ?> + + <h4>Αναζήτηση με κωδικό αντικειμένου: <?=($ccid != '0') ? $ccid : "(όλα)"?></h4> + <?php if (sizeof($items)) : ?> + + <div class="list-results"> + <?php foreach ($items as $key => $record) : ?> + <br /> + <h4>Κωδικός Αντικειμένου : <?=$record['identity']?> + <span class="pi-action"><a class="btn btn-pi-color" href="/ui-edit-item.php?id=<?=$record['id']?>">Επεξεργασία</a></span> + <span class="pi-action"><a class="btn btn-pi-light" href="/ui-show-item.php?id=<?=$record['id']?>">Προεπισκόπιση</a></span> + </h4> + + <div class="row"> + + <div class="col-md-2 col-sm-3 col-xs-4"> + <?php if ($record['img'] != '') : ?> + <img src="<?=$record['img']?>" class="img-fluid img-thumbnail" /> + <?php endif; ?> + </div> + + <div class="col-md-10 col-sm-9 col-xs-8"> + <div class="row"> + + <div class="pi-preview col-md-6"> + <span>Κωδ.Εγγραφής :</span> + <?php $cc = parse_ccode($record['ccode']); ?> + <strong> + <?=$cc->id?> : <?=$cc->tag?> + <?php /* --- depricated (local name): <_?=($cc->local == '') ? '' : '('. $cc->local .')' */ ?> + </strong> + </div> + <div class="pi-preview col-md-3"> + <span>Τεμάχιο :</span> <?=$record['itemid']?> / <?=$record['totalitems']?> + </div> + <div class="pi-preview col-md-3"> + <span>Αριθμός εισαγωγής :</span> <?=$record['id']?> + </div> + <div class="pi-preview col-md-6"> + <span>Χειριστής (καταγραφέας) :</span> <?=$record['operator']?> + </div> + <div class="pi-preview col-md-6"> + <span>Ημερομηνία καταγραφής :</span> <?=$record['timestamp']?> + </div> + <div class="pi-preview col-md-12"> + <span>Γενική περιγραφή :</span> <?=nl2br(str_part($record['summary'], STR_LIMIT))?> + </div> + + </div> + </div> + + </div> + + + <br /> + <?php endforeach; ?> + + + <?php else: ?> + Δεν βρέθηκαν αντικείμενα + <?php endif; ?> + + <?php endif; ?> + + </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> +<script> +// NOW RUN EVERYTHING AFTER JQUERY (AND DOM ready) +// ----------------------------------------------------------------------------- +//////////////////////////////////////////////////////////////////////////////// + + // 00. FLAGS and NEEDED FUNCTIONS + // --------------------------------------------------------------------------- + ////////////////////////////////////////////////////////////////////////////// + + var waitingResponse = false; // flag for an ajax request that was sent and still waiting response + + // 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(); + } + + + // 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-search.php?id=' + getValues(ccode); + }); + + +</script> + </body> +</html> |
