diff options
| -rw-r--r-- | docker-compose.yml | 3 | ||||
| -rw-r--r-- | public/app/config/setup_application.php | 53 | ||||
| -rw-r--r-- | public/app/controllers/JsonToForm.php | 749 | ||||
| -rw-r--r-- | public/app/controllers/Office.php | 10 | ||||
| -rw-r--r-- | public/app/routes/frontend.php | 2 | ||||
| -rw-r--r-- | public/app/views/templates/application.php (renamed from public/app/views/templates/common-form.php) | 9 | ||||
| -rw-r--r-- | public/assets/css/class.css | 4 | ||||
| -rw-r--r-- | tests/obj.php | 9 |
8 files changed, 398 insertions, 441 deletions
diff --git a/docker-compose.yml b/docker-compose.yml index e41843d..0ddccbb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,8 @@ services: build: context: . ports: - - "80:8080" + - "1415:8080" + # - "80:8080" volumes: - "./public:/var/www/public" - "./core:/var/www/core" diff --git a/public/app/config/setup_application.php b/public/app/config/setup_application.php index ec9a7bb..b87ffae 100644 --- a/public/app/config/setup_application.php +++ b/public/app/config/setup_application.php @@ -138,6 +138,9 @@ define ('PETITION_TYPE', [ + + + // the forms /////////////////////////////////////////////////////////////////// // ----------------------------------------------------------------------------- @@ -258,9 +261,9 @@ define('REGISTRATION_FORM', [ ] ]); -// common requesy form (for any application) +// Application (common request) form // --- -define('COMMON_REQUEST_FORM', [ +define('APPLICATION_FORM', [ 'defaults' => [ 'outer_class' => 'col-12', 'inner_class' => 'form-control', @@ -276,22 +279,37 @@ define('COMMON_REQUEST_FORM', [ [ 'name' => 'first_name', 'label' => 'Όνομα', + 'class' => 'col-5', 'attributes' => ['auto'] ], [ 'name' => 'last_name', 'label' => 'Επίθετο', + 'class' => 'col-7', 'attributes' => ['auto'] ], [ - 'name' => 'email', - 'label' => 'e-mail', - 'type' => 'email', + 'name' => 'father_name', + 'label' => 'Πατρώνυμο', + 'class' => 'col-5', 'attributes' => ['auto'] ], [ - 'name' => 'father_name', - 'label' => 'Πατρώνυμο', + 'label' => '', + 'type' => 'label', + 'class' => 'col-7', + ], + [ + 'name' => 'phone', + 'label' => 'Τηλέφωνο', + 'class' => 'col-5', + 'attributes' => ['required'] + ], + [ + 'name' => 'email', + 'label' => 'e-mail', + 'type' => 'email', + 'class' => 'col-7', 'attributes' => ['auto'] ], [ @@ -303,6 +321,7 @@ define('COMMON_REQUEST_FORM', [ [ 'name' => 'sector', 'label' => 'Κλάδος / Ειδικότητα', + 'class' => 'col-7', 'attributes' => ['auto'] ], [ @@ -316,28 +335,26 @@ define('COMMON_REQUEST_FORM', [ 'attributes' => ['required'] ], [ + 'name' => 'date', + 'label' => 'Ημερομηνία αίτησης', + 'type' => 'date', + 'class' => 'col-5', + 'attributes' => ['required'] + ], + [ 'name' => 'position', 'label' => 'Θέση', 'type' => 'select', + 'class' => 'col-7', 'source' => 'positions', 'attributes' => ['required'] ], [ - 'name' => 'phone', - 'label' => 'Τηλέφωνο', - 'attributes' => ['required'] - ], - [ 'name' => 'request', 'label' => 'Αίτημα (πχ, Παρακαλώ να μου χορηγήσετε ...)', + 'class' => 'col-12 x7-lines', 'type' => 'textarea', 'attributes' => ['required'] - ], - [ - 'name' => 'date', - 'label' => 'Ημερομηνία αίτησης', - 'type' => 'date', - 'attributes' => ['required'] ] ] ]); diff --git a/public/app/controllers/JsonToForm.php b/public/app/controllers/JsonToForm.php index 7df8098..f6e9746 100644 --- a/public/app/controllers/JsonToForm.php +++ b/public/app/controllers/JsonToForm.php @@ -4,28 +4,29 @@ namespace app\controllers; class JsonToForm { /** - * ## Help Constants and Functions ------------------------------------------------ - * //////////////////////////////////////////////////////////////////////////////// + * ## Help Constants and Functions ----------------------------------------- + * ///////////////////////////////////////////////////////////////////////// * - * // Cache fields options (json format) //////////////////////////////////////// - * // --------------------------------------------------------------------------- + * + * Cache fields options (json format) ////////////////////////////////////// + * ------------------------------------------------------------------------- * $formJSON = file_get_contents('config/kallassa.json'); * define("FORMJSON", $formJSON); * - * // Cache CCODE attributes (json format) ////////////////////////////////////// - * // --------------------------------------------------------------------------- + * Cache CCODE attributes (json format) //////////////////////////////////// + * ------------------------------------------------------------------------- * $codeJSON = file_get_contents('config/ccode.json'); * define("CODEJSON", $codeJSON); * - * // Parse anythig from a field //////////////////////////////////////////////// - * // ARGS: - * // $fkey = keyname (as in json fields oprions) - * // $inp = input value (string) - * // RETURN: array( - * // 'label' = field label, - * // 'multi' = (true|false) is multiple choice (select|radio|check) or not, - * // 'value' = human readable value (or array of values if multi) - * // ) ------------------------------------------------------------------------- + * Parse anythig from a field ////////////////////////////////////////////// + * ARGS: + * $fkey = keyname (as in json fields oprions) + * $inp = input value (string) + * RETURN: array( + * 'label' = field label, + * 'multi' = (true|false) is multiple choice (select|radio|check) or not, + * 'value' = human readable value (or array of values if multi) + * ) ----------------------------------------------------------------------- */ public static function parse_any($fkey, $inp ="") { @@ -71,7 +72,8 @@ class JsonToForm // Parse anythig from ccode - public static function parse_ccode($ckey) { + public static function parse_ccode($ckey) + { $ccARRAY = json_decode(CODEJSON); foreach ($ccARRAY as $key => $val) { @@ -84,44 +86,12 @@ class JsonToForm } - // Get totals of alla categories ///////////////////////////////////////////// - // RETURN array of items (value) per category (array key) - // --------------------------------------------------------------------------- - public static function get_totals() { - $result = array(); - $sum = 0; - - $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 - $stm = $dbc->prepare("SELECT ccode, count(id) total FROM `items` GROUP BY ccode"); - $stm->execute(); // execute query - $stm->store_result(); // store result - $stm->bind_result($c, $tot); - while ($stm->fetch()) { - // using md5() you can have any unicode string as key ;) - // credit: https://stackoverflow.com/questions/10696067/characters-allowed-in-php-array-keys -> Rob's answer - // but newer versions of php (v7+) seem to handle unicide keys nicely - $result[$c] = $tot; - $sum += $tot; - } - - $result['all'] = $sum; - - return $result; - } - - // Preview Local Datetime //////////////////////////////////////////////////// + // Preview Local Datetime ////////////////////////////////////////////////// // (in Greek format and names ) - // --------------------------------------------------------------------------- - public static function local_dt($t) { + // ------------------------------------------------------------------------- + public static function local_dt($t) + { $day = array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"); $dayL = array("Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"); $mon = array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); @@ -138,7 +108,8 @@ class JsonToForm // Part of string // UTF-8 SAFE - public static function str_part($str, $len) { + public static function str_part($str, $len) + { return (mb_strlen($str) > $len) ? mb_substr($str, 0, $len-1) ."…" : $str; } @@ -147,41 +118,46 @@ class JsonToForm * construct a form (html, javasctipt) * from a json designer * + * @param $formJson (Std Object): form descriptor + * @param $require_identity (array): array of properties and values; + * they identify the record; injected into form as hidden fields + * @param $source (array): array of [key => value] pairs, where ... + * `key`: the name of field, `value`: the default value of this field */ - public static function json_form($formJson, $require_identity = []) + public static function json_form($formJson, $require_identity = [], $source = []) { // $formJson = json_decode(json_encode($form)); - $default_outer = $formJson->defaults->outer_class ?? ''; - $default_inner = $formJson->defaults->inner_class ?? ''; - $default_type = $formJson->defaults->type ?? 'text'; + $default_outer = $formJson->defaults->outer_class ?? ''; + $default_inner = $formJson->defaults->inner_class ?? ''; + $default_type = $formJson->defaults->type ?? 'text'; $default_values = $formJson->defaults->values ?? ((object) ['nothing' => true]); // TODO handle $form->defaults->source; // 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) ///////////////////////////////////////// - // --------------------------------------------------------------------------- + // read fields options (json format) /////////////////////////////////// + // --------------------------------------------------------------------- - // Init strigns for JS generator (needed to handle everything) /////////////// - // --------------------------------------------------------------------------- + // 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) @@ -218,8 +194,8 @@ class JsonToForm } // print_r([ $set_value, $name, ($default_values->$name ?? 'none') ]); - $appendKey = in_array('append-key', $attributes) ? true : false; // append key (for selects) - $required = in_array('required', $attributes) ? 'required' : ''; // required + $appendKey = in_array('append-key', $attributes) ? true : false; // append key (for selects) + $required = in_array('required', $attributes) ? 'required' : ''; // required $asterisk = in_array('required', $attributes) ? '*' : ''; // asterisk in label if required $html .= " @@ -399,359 +375,300 @@ class JsonToForm - /***** - // Script Workflow: - // --------------------------------------------------------------------------- - // 1. read fields options - // 2. generate HTML - // 3. generate JS needed +/*** + * 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 + * 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 + * 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) ///////////////////////////////////////// - // --------------------------------------------------------------------------- - $formJSON = file_get_contents('config/kallassa.json'); - $formARRAY = json_decode($formJSON); + * read fields options (json format) /////////////////////////////////////////// + * ----------------------------------------------------------------------------- + $formJSON = file_get_contents('config/kallassa.json'); + $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) - */ - - - - /** document header - * - * <!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" /> - * </head> - * <body> - */ - - - /** form footer - * <!-- footer of form --> - * <div class="row"> - * - * <div class="col-md-4 line-right"> - * <h3>Δεν έχουν συμπληρωθεί:</h3> - * <div id="empty-fields"></div> - * </div> - * - * <div class="col-md-8"> - * - * <!-- custom field --> - * <div class="form-group"> - * <label for="more">Συμπληρωματική Πληροφορία</label> - * <textarea name="note" class="form-control form-control-sm tall"></textarea> - * <?php - * // append js code - * // for checking if field is empty - * // and attaching value to json data - * $checkFilledJS .= " - * if ($('textarea[name=note]').val() =='') { - * empty += '<span>Γενικά:</span>Συμπληρωματική Πληροφορία<br />'; - * } - * values.note = $('textarea[name=note]').val(); - * "; - * ?> - * </div> - * - * <div class="form-group"> - * <input class="btn btn-primary" type="submit" value="Καταχώρηση Εγγραφής"> - * </div> - * </div> - * </div> - */ - - - /** post-DOM-end + scripts - * - * </form> - * </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Είστε σίγουροι ότι θέλετε να εγκαταλείψετε τη σελίδα;'); - * 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. USER INTERFACE - * // --------------------------------------------------------------------------- - * ////////////////////////////////////////////////////////////////////////////// - * - * // tabs to accorderon -------------------------------------------------------- - * ////////////////////////////////////////////////////////////////////////////// - * - * // FUNCTION: Set tabsContainer height - * // acording to which tab is visible - * // and tab mode (tabs|acordeon) - * // --------------------------------------------------------------------------- - * function set_tabsContainer_height() { - * var ch_; // content height - * var tc_base; // tabs-container base height - * tc_base = ($(window).width() > 650) ? 100 : 400; - * if ($('#content1').is(':visible')) ch_ = $('#content1').height(); - * if ($('#content2').is(':visible')) ch_ = $('#content2').height(); - * if ($('#content3').is(':visible')) ch_ = $('#content3').height(); - * if ($('#content4').is(':visible')) ch_ = $('#content4').height(); - * if ($('#content5').is(':visible')) ch_ = $('#content5').height(); - * if ($('#content6').is(':visible')) ch_ = $('#content6').height(); - * - * $('#tabsContainer').height(ch_ + tc_base); - * - * } - * set_tabsContainer_height(); // init (run for 1st time) - * - * // on tab selection - * // calculate tabsContainer height - * $('input:radio[name="tabs"]').change( function(){ - * set_tabsContainer_height() - * }); - * - * // on window change - * // set tabsContainer height - * $( window ).resize(function() { - * set_tabsContainer_height(); - * }); - * - * - * - * // 03. form-control form-control-smS - * // --------------------------------------------------------------------------- - * ////////////////////////////////////////////////////////////////////////////// - * - * // Select2 controls - * ////////////////////////////////////////////////////////////////////////////// - * - * // 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 select2 fields - * // (embed from php) - * // --------------------------------------------------------------------------- - * <?=$initSelectsJS?> - * - * - * // 04. FORM-LOGIC - * // --------------------------------------------------------------------------- - * ////////////////////////////////////////////////////////////////////////////// - * - * // FUNCTION: Report empty fields - * // --------------------------------------------------------------------------- - * function reportEmpty() { - * var empty = ''; - * var needit = []; - * var values = {}; - * - * // embed if-conditions from php - * <?=$checkFilledJS?> - * - * $("#empty-fields").html(empty); // render empty fields - * - * // console.log(JSON.stringify(values)); - * - * return { need : needit, data: values }; // return all fields - * } - * reportEmpty(); - * - * $('form').on('keyup change paste', 'input, select, textarea', function(){ - * console.log('Form changed!'); - * reportEmpty(); - * }); - * - * // validation? - * // check: https://www.sitepoint.com/instant-validation/ - * - * - * $('#post-form').on('submit', function(e){ - * e.preventDefault(); - * if (!waitingResponse) { - * waitingResponse = true; - * var resp = reportEmpty(); - * - * if (resp.need.length > 0) alert("Tα πεδία:\n\n" + resp.need.join(',\n') + "\n\nείναι υποχρεωτικά!"); - * else { - * // alert('sending: '+JSON.stringify(resp.data)); - * var postUrl = "/ajax.php?do=additem"; // url to post form - * var data2send = resp.data; // parse data to send - * - * $.ajax({ - * type: 'POST', - * url: postUrl, // make sure you respect the same origin policy with this url - * data: data2send, - * dataType: "text", - * - * success: function(data) { // server replies - * var json = $.parseJSON(data); - * if (json.success == true) { // good! post accepted - * // alert(json.id) - * window.location.href = '/ui-show-item.php?id='+ json.id; - * } - * else { - * alert("Post not accepted.\nPlease check the data you submit."); - * // $('#oc-company-form')[0].reset(); - * } - * }, - * - * error: function() { - * alert('Some ajax error! :('); - * } - * }); - * } - * - * waitingResponse = false; - * } - * - * }); - * - * <?php - * // bibliography and References - * // - * // WHICH JQUERY: - * // read: https://jquery.com/download/ - * // - * // SELECT2 - * // https://stackoverflow.com/questions/12889309/get-selected-value-from-multi-value-select-boxes-by-jquery-select2 - * // - * // tests: - * // https://jsfiddle.net/3nd1gL8o/1/ - * // https://jsfiddle.net/3nd1gL8o/5/ - * // - * // EXAMPLE with ALL CASES NEEDed: - * // https://jsfiddle.net/v684h0g2/2/ - * ?> - * </script> - * </body> - * </html> - */ + * 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) +*/ + + + /** post-DOM-end + scripts + * + * </form> + * </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Θέλετε σίγουρα να εγκαταλείψετε τη σελίδα;'); + * 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. USER INTERFACE + * // --------------------------------------------------------------------------- + * ////////////////////////////////////////////////////////////////////////////// + * + * // tabs to accorderon -------------------------------------------------------- + * ////////////////////////////////////////////////////////////////////////////// + * + * // FUNCTION: Set tabsContainer height + * // acording to which tab is visible + * // and tab mode (tabs|acordeon) + * // --------------------------------------------------------------------------- + * function set_tabsContainer_height() { + * var ch_; // content height + * var tc_base; // tabs-container base height + * tc_base = ($(window).width() > 650) ? 100 : 400; + * if ($('#content1').is(':visible')) ch_ = $('#content1').height(); + * if ($('#content2').is(':visible')) ch_ = $('#content2').height(); + * if ($('#content3').is(':visible')) ch_ = $('#content3').height(); + * if ($('#content4').is(':visible')) ch_ = $('#content4').height(); + * if ($('#content5').is(':visible')) ch_ = $('#content5').height(); + * if ($('#content6').is(':visible')) ch_ = $('#content6').height(); + * + * $('#tabsContainer').height(ch_ + tc_base); + * + * } + * set_tabsContainer_height(); // init (run for 1st time) + * + * // on tab selection + * // calculate tabsContainer height + * $('input:radio[name="tabs"]').change( function(){ + * set_tabsContainer_height() + * }); + * + * // on window change + * // set tabsContainer height + * $( window ).resize(function() { + * set_tabsContainer_height(); + * }); + * + * + * + * // 03. form-control form-control-smS + * // --------------------------------------------------------------------------- + * ////////////////////////////////////////////////////////////////////////////// + * + * // Select2 controls + * ////////////////////////////////////////////////////////////////////////////// + * + * // 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 select2 fields + * // (embed from php) + * // --------------------------------------------------------------------------- + * <?=$initSelectsJS?> + * + * + * // 04. FORM-LOGIC + * // --------------------------------------------------------------------------- + * ////////////////////////////////////////////////////////////////////////////// + * + * // FUNCTION: Report empty fields + * // --------------------------------------------------------------------------- + * function reportEmpty() { + * var empty = ''; + * var needit = []; + * var values = {}; + * + * // embed if-conditions from php + * <?=$checkFilledJS?> + * + * $("#empty-fields").html(empty); // render empty fields + * + * // console.log(JSON.stringify(values)); + * + * return { need : needit, data: values }; // return all fields + * } + * reportEmpty(); + * + * $('form').on('keyup change paste', 'input, select, textarea', function(){ + * console.log('Form changed!'); + * reportEmpty(); + * }); + * + * // validation? + * // check: https://www.sitepoint.com/instant-validation/ + * + * + * $('#post-form').on('submit', function(e){ + * e.preventDefault(); + * if (!waitingResponse) { + * waitingResponse = true; + * var resp = reportEmpty(); + * + * if (resp.need.length > 0) alert("Tα πεδία:\n\n" + resp.need.join(',\n') + "\n\nείναι υποχρεωτικά!"); + * else { + * // alert('sending: '+JSON.stringify(resp.data)); + * var postUrl = "/ajax.php?do=additem"; // url to post form + * var data2send = resp.data; // parse data to send + * + * $.ajax({ + * type: 'POST', + * url: postUrl, // make sure you respect the same origin policy with this url + * data: data2send, + * dataType: "text", + * + * success: function(data) { // server replies + * var json = $.parseJSON(data); + * if (json.success == true) { // good! post accepted + * // alert(json.id) + * window.location.href = '/ui-show-item.php?id='+ json.id; + * } + * else { + * alert("Post not accepted.\nPlease check the data you submit."); + * // $('#oc-company-form')[0].reset(); + * } + * }, + * + * error: function() { + * alert('Some ajax error! :('); + * } + * }); + * } + * + * waitingResponse = false; + * } + * + * }); + * + * <?php + * // bibliography and References + * // + * // WHICH JQUERY: + * // read: https://jquery.com/download/ + * // + * // SELECT2 + * // https://stackoverflow.com/questions/12889309/get-selected-value-from-multi-value-select-boxes-by-jquery-select2 + * // + * // tests: + * // https://jsfiddle.net/3nd1gL8o/1/ + * // https://jsfiddle.net/3nd1gL8o/5/ + * // + * // EXAMPLE with ALL CASES NEEDed: + * // https://jsfiddle.net/v684h0g2/2/ + * ?> + * </script> + * </body> + * </html> + */ diff --git a/public/app/controllers/Office.php b/public/app/controllers/Office.php index 5e8af75..d0c10b9 100644 --- a/public/app/controllers/Office.php +++ b/public/app/controllers/Office.php @@ -144,8 +144,8 @@ class Office { switch ($petition_tag) { // route to specific type of petition - case 'common': - self::render_common_petition(['user' => $user]); + case 'application': + self::render_application_form(['user' => $user]); break; case 'penalty': @@ -160,18 +160,18 @@ class Office { } - private static function render_common_petition($opts) + private static function render_application_form($opts) { $user_id = $opts['user']->getID(); - $form_setup = json_decode(json_encode(COMMON_REQUEST_FORM, JSON_UNESCAPED_UNICODE)); + $form_setup = json_decode(json_encode(APPLICATION_FORM, JSON_UNESCAPED_UNICODE)); // get Form's HTML and Jsvascript $form = JsonToForm::json_form($form_setup, [ ['name' => 'user_id', 'value' => $user_id] // pass user identity ]); - Render::view('templates/common-form', ['form' => $form]); + Render::view('templates/application', ['form' => $form]); } private static function render_penalty_form($opts) diff --git a/public/app/routes/frontend.php b/public/app/routes/frontend.php index f10f29d..47b1816 100644 --- a/public/app/routes/frontend.php +++ b/public/app/routes/frontend.php @@ -62,7 +62,7 @@ Route::add('/serve/file/([0-9a-zA-Z-_\.\/]*)', // serve file by path // Account -/////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// // [ok] login // [ok] register diff --git a/public/app/views/templates/common-form.php b/public/app/views/templates/application.php index 1ecc85d..a6b2b6b 100644 --- a/public/app/views/templates/common-form.php +++ b/public/app/views/templates/application.php @@ -31,6 +31,15 @@ </form> </div> + <div class="info"> + <h4>Synhmena</h4> + <ul> + <li>uno</li> + <li>duo</li> + <li>tre</li> + </ul> + </div> + </div> </div> diff --git a/public/assets/css/class.css b/public/assets/css/class.css index 5333f29..201f13b 100644 --- a/public/assets/css/class.css +++ b/public/assets/css/class.css @@ -111,6 +111,10 @@ html, body { .central-form h4 { font-size: 1.24rem; } +.central-form .x3-lines textarea { height: 74; } +.central-form .x5-lines textarea { height: 124px; } +.central-form .x7-lines textarea { height: 156px; } + /* main layout classes * ---------------------------------------------------------------------------- diff --git a/tests/obj.php b/tests/obj.php new file mode 100644 index 0000000..8537381 --- /dev/null +++ b/tests/obj.php @@ -0,0 +1,9 @@ +<?php + +print_r(json_decode( json_encode( [ + 'in' => [ + 'el' => 'mesa', + 'en' => 'inside' + ], + 'out' => 'exo' +])));
\ No newline at end of file |
