From 37ce4a2cc46d3ff23621d6fdf00ee83ae98859d7 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Thu, 31 May 2018 16:25:10 -0600 Subject: [PATCH] Add cash report --- composer.json | 4 +- composer.lock | 114 ++++++- database.mwb | Bin 15220 -> 16009 bytes lang/en_us.php | 17 +- lib/reports.php | 297 +++++++++++++++++++ pages.php | 15 + pages/reports.php | 91 ++++++ static/css/easy-autocomplete.min.css | 11 + static/css/easy-autocomplete.themes.min.css | 11 + static/css/tempusdominus-bootstrap-4.min.css | 204 +++++++++++++ static/js/jquery.easy-autocomplete.min.js | 10 + static/js/moment.min.js | 7 + static/js/reports.js | 55 ++++ static/js/tempusdominus-bootstrap-4.min.js | 7 + 14 files changed, 839 insertions(+), 4 deletions(-) create mode 100644 lib/reports.php create mode 100644 pages/reports.php create mode 100644 static/css/easy-autocomplete.min.css create mode 100644 static/css/easy-autocomplete.themes.min.css create mode 100644 static/css/tempusdominus-bootstrap-4.min.css create mode 100644 static/js/jquery.easy-autocomplete.min.js create mode 100644 static/js/moment.min.js create mode 100644 static/js/reports.js create mode 100644 static/js/tempusdominus-bootstrap-4.min.js diff --git a/composer.json b/composer.json index fb37c32..9a3473c 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,9 @@ "type": "project", "require": { "catfan/medoo": "^1.5", - "guzzlehttp/guzzle": "^6.2" + "guzzlehttp/guzzle": "^6.2", + "league/csv": "^9.1", + "lapinator/ods-php-generator": "^0.0.3" }, "license": "MPL-2.0", "authors": [ diff --git a/composer.lock b/composer.lock index f6f5538..590de35 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "577921e9d14ff39571692f88476151ee", - "content-hash": "1c8b61c5d506ae016285b99b20040cf0", + "hash": "0e5db12408080dd084cad072b8cfd599", + "content-hash": "348006dfc1d25121fcc3b4cb32bc3369", "packages": [ { "name": "catfan/medoo", @@ -247,6 +247,116 @@ ], "time": "2017-03-20 17:10:46" }, + { + "name": "lapinator/ods-php-generator", + "version": "v0.0.3", + "source": { + "type": "git", + "url": "https://github.com/Lapinator/odsPhpGenerator.git", + "reference": "575314c003c2ec3032813bedcc1d27032b7b7ab2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Lapinator/odsPhpGenerator/zipball/575314c003c2ec3032813bedcc1d27032b7b7ab2", + "reference": "575314c003c2ec3032813bedcc1d27032b7b7ab2", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Laurent VUIBERT", + "email": "lapinator@gmx.fr", + "homepage": "http://lapinator.net", + "role": "Developer" + } + ], + "description": "Open Document Spreadsheet (.ods) generator ", + "homepage": "https://odsphpgenerator.lapinator.net/", + "keywords": [ + "LibreOffice", + "ods" + ], + "time": "2016-04-14 21:51:27" + }, + { + "name": "league/csv", + "version": "9.1.4", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/csv.git", + "reference": "9c8ad06fb5d747c149875beb6133566c00eaa481" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/9c8ad06fb5d747c149875beb6133566c00eaa481", + "reference": "9c8ad06fb5d747c149875beb6133566c00eaa481", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=7.0.10" + }, + "require-dev": { + "ext-curl": "*", + "friendsofphp/php-cs-fixer": "^2.0", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", + "phpunit/phpunit": "^6.0" + }, + "suggest": { + "ext-iconv": "Needed to ease transcoding CSV using iconv stream filters" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.x-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Csv\\": "src" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ignace Nyamagana Butera", + "email": "nyamsprod@gmail.com", + "homepage": "https://github.com/nyamsprod/", + "role": "Developer" + } + ], + "description": "Csv data manipulation made easy in PHP", + "homepage": "http://csv.thephpleague.com", + "keywords": [ + "csv", + "export", + "filter", + "import", + "read", + "write" + ], + "time": "2018-05-01 18:32:48" + }, { "name": "psr/http-message", "version": "1.0.1", diff --git a/database.mwb b/database.mwb index 0dad56fca905455f1271b3154831995877db1af2..ce72d53eb6f911dd278d08482a9b5ee069f2e3ac 100644 GIT binary patch literal 16009 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 literal 15220 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 diff --git a/lang/en_us.php b/lang/en_us.php index f06e796..19f44ba 100644 --- a/lang/en_us.php +++ b/lang/en_us.php @@ -89,4 +89,19 @@ define("STRINGS", [ "cash closed" => "Cash closed.", "register set" => "Register set.", "change register" => "Change register", -]); \ No newline at end of file + "reports" => "Reports", + "report type" => "Report Type", + "format" => "Format", + "filter" => "Filter", + "generate report" => "Generate Report", + "cashflow" => "Cash Flow", + "z report" => "Z Report", + "csv file" => "CSV text file", + "ods file" => "ODS spreadsheet", + "html file" => "HTML web page", + "register" => "Register", + "all" => "All", + "date range" => "Date Range", + "start" => "Start", + "end" => "End" +]); diff --git a/lib/reports.php b/lib/reports.php new file mode 100644 index 0000000..7fce0e0 --- /dev/null +++ b/lib/reports.php @@ -0,0 +1,297 @@ +has('report_access_codes', ["AND" => ['code' => $VARS['code'], 'expires[>]' => $date]])) { + dieifnotloggedin(); + $requester = $_SESSION['uid']; + } else { + $requester = $database->get('report_access_codes', 'uid', ['code' => $VARS['code']]); + } +} else { + dieifnotloggedin(); + $requester = $_SESSION['uid']; +} + +if (account_has_permission($_SESSION['username'], "ADMIN")) { + $allowed_users = true; +} else { + if (account_has_permission($_SESSION['username'], "QWIKCLOCK_MANAGE")) { + $allowed_users = getManagedUIDs($requester); + } + + if (account_has_permission($_SESSION['username'], "QWIKCLOCK_EDITSELF")) { + $allowed_users[] = $_SESSION['uid']; + } +} + +// Delete old DB entries +$database->delete('report_access_codes', ['expires[<=]' => $date]); + +if (LOADED) { + $user = null; + if (isset($VARS['type']) && isset($VARS['format'])) { + generateReport($VARS['type'], $VARS['format'], $VARS['register'], $VARS['startdate'], $VARS['enddate']); + die(); + } else { + lang("invalid parameters"); + die(); + } +} + +function getCashFlowReport($register = null, $start = null, $end = null) { + global $database; + $where = []; + + if (!is_null($register) && $database->has('registers', ['registerid' => $register])) { + $where["registers.registerid"] = $register; + } + + if ((bool) strtotime($start) == TRUE) { + $where["OR #open"] = [ + "open[>=]" => date("Y-m-d", strtotime($start)), + "close[>=]" => date("Y-m-d", strtotime($start)) + ]; + } + if ((bool) strtotime($end) == TRUE) { + // Make the date be the end of the day, not the start + $where["close[<=]"] = date("Y-m-d", strtotime($end)) . " 23:59:59"; + } + + if (count($where) > 1) { + $where = ["AND" => $where]; + } + $cash = $database->select( + "cash_drawer", [ + '[>]registers' => ['cash_drawer.registerid' => 'registerid'], + '[>]transactions' => ['cash_drawer.cashid' => 'cashid'], + '[>]payments' => ['transactions.txid' => 'txid'], + '[>]payment_types' => ['payments.type' => 'typeid'] + ], [ + "cash_drawer.cashid", + "registers.registername", + "cash_drawer.registerid", + "open", + "close", + "payments.type", + "payments.amount", + "payment_types.typename" + ], $where + ); + $header = [lang("register", false), lang("open", false), lang("close", false), lang("cash", false), lang("card", false), lang("check", false), lang("crypto", false), lang("gift card", false), lang("free", false)]; + $out = [$header]; + + $registers = []; + + foreach ($cash as $c) { + $registers[$c['registerid']]['name'] = $c['registername']; + $registers[$c['registerid']]['id'] = $c['registerid']; + $registers[$c['registerid']]['open'] = date(DATETIME_FORMAT, strtotime($c['open'])); + if (is_null($c['close'])) { + $registers[$c['registerid']]['close'] = date(DATETIME_FORMAT); + } else { + $registers[$c['registerid']]['close'] = date(DATETIME_FORMAT, strtotime($c['close'])); + } + if (!isset($registers[$c['registerid']][$c['typename']])) { + $registers[$c['registerid']][$c['typename']] = 0.0; + } + $registers[$c['registerid']][$c['typename']] += $c['amount']; + } + + foreach ($registers as $r) { + $types = $database->select('payment_types', 'typename'); + foreach ($types as $t) { + if (!isset($r[$t])) { + $r[$t] = 0.0; + } + } + $out[] = [ + $r['name'], + $r['open'], + $r['close'], + $r['cash'] . "", + $r['card'] . "", + $r['check'] . "", + $r['crypto'] . "", + $r['giftcard'] . "", + $r['free'] . "" + ]; + } + + return $out; +} + +function getReportData($type, $register = null, $start = null, $end = null) { + switch ($type) { + case "cashflow": + return getCashFlowReport($register, $start, $end); + default: + return [["error"]]; + } +} + +function dataToCSV($data, $name = "report", $register = null, $start = null, $end = null) { + $csv = Writer::createFromString(''); + $usernotice = ""; + $usertitle = ""; + $datetitle = ""; + if ($start != null && (bool) strtotime($start)) { + $datenotice = lang2("report filtered to start date", ["date" => date(DATE_FORMAT, strtotime($start))], false); + $datetitle = "_" . date(DATE_FORMAT, strtotime($start)); + $csv->insertOne([$datenotice]); + } + if ($end != null && (bool) strtotime($end)) { + $datenotice = lang2("report filtered to end date", ["date" => date(DATE_FORMAT, strtotime($end))], false); + $datetitle .= ($datetitle == "" ? "_" : "-") . date(DATE_FORMAT, strtotime($end)); + $csv->insertOne([$datenotice]); + } + $csv->insertAll($data); + header('Content-type: text/csv'); + header('Content-Disposition: attachment; filename="' . $name . $usertitle . $datetitle . "_" . date("Y-m-d_Hi") . ".csv" . '"'); + echo $csv; + die(); +} + +function dataToODS($data, $name = "report", $register = null, $start = null, $end = null) { + $ods = new ods(); + $styleColumn = new odsStyleTableColumn(); + $styleColumn->setUseOptimalColumnWidth(true); + $headerstyle = new odsStyleTableCell(); + $headerstyle->setFontWeight("bold"); + $table = new odsTable($name); + + for ($i = 0; $i < count($data[0]); $i++) { + $table->addTableColumn(new odsTableColumn($styleColumn)); + } + + $usernotice = ""; + $usertitle = ""; + $datetitle = ""; + if ($user != null && array_key_exists('username', $user) && array_key_exists('name', $user)) { + $usernotice = lang2("report filtered to user", ["name" => $user['name'], "username" => $user['username']], false); + $usertitle = "_" . $user['username']; + $row = new odsTableRow(); + $row->addCell(new odsTableCellString($usernotice)); + $table->addRow($row); + } + if ($start != null && (bool) strtotime($start)) { + $datenotice = lang2("report filtered to start date", ["date" => date(DATE_FORMAT, strtotime($start))], false); + $datetitle = "_" . date(DATE_FORMAT, strtotime($start)); + $row = new odsTableRow(); + $row->addCell(new odsTableCellString($datenotice)); + $table->addRow($row); + } + if ($end != null && (bool) strtotime($end)) { + $datenotice = lang2("report filtered to end date", ["date" => date(DATE_FORMAT, strtotime($end))], false); + $datetitle .= ($datetitle == "" ? "_" : "-") . date(DATE_FORMAT, strtotime($end)); + $row = new odsTableRow(); + $row->addCell(new odsTableCellString($datenotice)); + $table->addRow($row); + } + + $rowid = 0; + foreach ($data as $datarow) { + $row = new odsTableRow(); + foreach ($datarow as $cell) { + if ($rowid == 0) { + $row->addCell(new odsTableCellString($cell, $headerstyle)); + } else { + $row->addCell(new odsTableCellString($cell)); + } + } + $table->addRow($row); + $rowid++; + } + $ods->addTable($table); + $ods->downloadOdsFile($name . $usertitle . $datetitle . "_" . date("Y-m-d_Hi") . ".ods"); +} + +function dataToHTML($data, $name = "report", $register = null, $start = null, $end = null) { + global $SECURE_NONCE; + // HTML exporter doesn't like null values + for ($i = 0; $i < count($data); $i++) { + for ($j = 0; $j < count($data[$i]); $j++) { + if (is_null($data[$i][$j])) { + $data[$i][$j] = ''; + } + } + } + $datenotice = ""; + $datetitle = ""; + if ($start != null && (bool) strtotime($start)) { + $datenotice = "" . lang2("report filtered to start date", ["date" => date(DATE_FORMAT, strtotime($start))], false) . "
"; + $datetitle = "_" . date(DATE_FORMAT, strtotime($start)); + } + if ($end != null && (bool) strtotime($end)) { + $datenotice .= "" . lang2("report filtered to end date", ["date" => date(DATE_FORMAT, strtotime($end))], false) . "
"; + $datetitle .= ($datetitle == "" ? "_" : "-") . date(DATE_FORMAT, strtotime($end)); + } + header('Content-type: text/html'); + $converter = new HTMLConverter(); + $out = "\n" + . "\n" + . "\n" + . "" . $name . $datetitle . "_" . date("Y-m-d_Hi") . "\n" + . << +STYLE + . $datenotice + . $converter->convert($data); + echo $out; +} + +function generateReport($type, $format, $register = null, $start = null, $end = null, $deleted = true) { + $data = getReportData($type, $register, $start, $end, $deleted); + switch ($format) { + case "ods": + dataToODS($data, $type, $register, $start, $end); + break; + case "html": + dataToHTML($data, $type, $register, $start, $end); + break; + case "csv": + default: + echo dataToCSV($data, $type, $register, $start, $end); + break; + } +} diff --git a/pages.php b/pages.php index 57de716..d15b4a4 100644 --- a/pages.php +++ b/pages.php @@ -69,6 +69,21 @@ define("PAGES", [ "static/js/registers.js" ], ], + "reports" => [ + "title" => "reports", + "navbar" => true, + "icon" => "fas fa-download", + "styles" => [ + "static/css/tempusdominus-bootstrap-4.min.css", + "static/css/easy-autocomplete.min.css" + ], + "scripts" => [ + "static/js/moment.min.js", + "static/js/tempusdominus-bootstrap-4.min.js", + "static/js/jquery.easy-autocomplete.min.js", + "static/js/reports.js" + ] + ], "404" => [ "title" => "404 error" ] diff --git a/pages/reports.php b/pages/reports.php new file mode 100644 index 0000000..da84939 --- /dev/null +++ b/pages/reports.php @@ -0,0 +1,91 @@ + +
+ +
+
+
+
+
+
+
+

+ +
+
+
+
+
+
+

+ +
+
+
+
+ +
+
+
+
+
+
+
+
+

+
+
+
+ + + +
+
+
+ + +
+
+
+
+
+ insert('report_access_codes', ['code' => $code, 'expires' => date("Y-m-d H:i:s", strtotime("+5 minutes"))]); + ?> + + + +
+
+
+
+
+ \ No newline at end of file diff --git a/static/css/easy-autocomplete.min.css b/static/css/easy-autocomplete.min.css new file mode 100644 index 0000000..b5c0875 --- /dev/null +++ b/static/css/easy-autocomplete.min.css @@ -0,0 +1,11 @@ +/* + * easy-autocomplete + * jQuery plugin for autocompletion + * + * @author Łukasz Pawełczak (http://github.com/pawelczak) + * @version 1.3.5 + * Copyright License: + */ + +.easy-autocomplete{position:relative}.easy-autocomplete input{border-color:#ccc;border-radius:4px;border-style:solid;border-width:1px;box-shadow:0 1px 2px rgba(0,0,0,0.1) inset;color:#555;float:none;padding:6px 12px}.easy-autocomplete input:hover,.easy-autocomplete input:focus{box-shadow:none}.easy-autocomplete a{display:block}.easy-autocomplete.eac-blue-light input:hover,.easy-autocomplete.eac-blue-light input:focus{border-color:#66afe9;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6)}.easy-autocomplete.eac-blue-light ul{border-color:#66afe9;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6)}.easy-autocomplete.eac-blue-light ul li,.easy-autocomplete.eac-blue-light ul .eac-category{border-color:#66afe9}.easy-autocomplete.eac-blue-light ul li.selected,.easy-autocomplete.eac-blue-light ul .eac-category.selected{background-color:#ecf5fc}.easy-autocomplete.eac-green-light input:hover,.easy-autocomplete.eac-green-light input:focus{border-color:#41DB00;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(146,237,107,0.6)}.easy-autocomplete.eac-green-light ul{border-color:#41DB00;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(146,237,107,0.6)}.easy-autocomplete.eac-green-light ul li,.easy-autocomplete.eac-green-light ul .eac-category{border-color:#41DB00}.easy-autocomplete.eac-green-light ul li.selected,.easy-autocomplete.eac-green-light ul .eac-category.selected{background-color:#9eff75}.easy-autocomplete.eac-red-light input:hover,.easy-autocomplete.eac-red-light input:focus{border-color:#ff5b5b;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(255,90,90,0.6)}.easy-autocomplete.eac-red-light ul{border-color:#ff5b5b;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(255,90,90,0.6)}.easy-autocomplete.eac-red-light ul li,.easy-autocomplete.eac-red-light ul .eac-category{border-color:#ff5b5b}.easy-autocomplete.eac-red-light ul li.selected,.easy-autocomplete.eac-red-light ul .eac-category.selected{background-color:#ff8e8e}.easy-autocomplete.eac-yellow-light input:hover,.easy-autocomplete.eac-yellow-light input:focus{border-color:#ffdb00;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(255,231,84,0.6)}.easy-autocomplete.eac-yellow-light ul{border-color:#ffdb00;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(255,231,84,0.6)}.easy-autocomplete.eac-yellow-light ul li,.easy-autocomplete.eac-yellow-light ul .eac-category{border-color:#ffdb00}.easy-autocomplete.eac-yellow-light ul li.selected,.easy-autocomplete.eac-yellow-light ul .eac-category.selected{background-color:#ffe233}.easy-autocomplete.eac-dark-light input:hover,.easy-autocomplete.eac-dark-light input:focus{border-color:#333;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(55,55,55,0.6)}.easy-autocomplete.eac-dark-light ul{border-color:#333;box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(55,55,55,0.6)}.easy-autocomplete.eac-dark-light ul li,.easy-autocomplete.eac-dark-light ul .eac-category{border-color:#333}.easy-autocomplete.eac-dark-light ul li.selected,.easy-autocomplete.eac-dark-light ul .eac-category.selected{background-color:#4d4d4d;color:#fff}.easy-autocomplete.eac-dark{color:#fff}.easy-autocomplete.eac-dark input{background-color:#404040;border-radius:4px;box-shadow:0;color:#f6f6f6}.easy-autocomplete.eac-dark input:hover,.easy-autocomplete.eac-dark input:focus{border-color:#333;box-shadow:0}.easy-autocomplete.eac-dark ul{border-color:#333}.easy-autocomplete.eac-dark ul li,.easy-autocomplete.eac-dark ul .eac-category{background-color:#404040;border-color:#333}.easy-autocomplete.eac-dark ul li.selected,.easy-autocomplete.eac-dark ul .eac-category.selected{background-color:#737373;color:#f6f6f6}.easy-autocomplete.eac-dark-glass{color:#fff}.easy-autocomplete.eac-dark-glass input{background-color:rgba(0,0,0,0.8);border-radius:4px;box-shadow:0;color:#f6f6f6}.easy-autocomplete.eac-dark-glass input:hover,.easy-autocomplete.eac-dark-glass input:focus{border-color:rgba(0,0,0,0.8);box-shadow:0}.easy-autocomplete.eac-dark-glass ul{border-color:rgba(0,0,0,0.8)}.easy-autocomplete.eac-dark-glass ul li,.easy-autocomplete.eac-dark-glass ul .eac-category{background-color:rgba(0,0,0,0.8);border-color:rgba(0,0,0,0.8)}.easy-autocomplete.eac-dark-glass ul li.selected,.easy-autocomplete.eac-dark-glass ul .eac-category.selected{background-color:rgba(64,64,64,0.8);color:#f6f6f6}.easy-autocomplete.eac-dark-glass ul li:last-child,.easy-autocomplete.eac-dark-glass ul .eac-category:last-child{border-radius:0 0 4px 4px}.easy-autocomplete.eac-blue{color:#fff}.easy-autocomplete.eac-blue input{background-color:#6d9ed1;border-radius:4px;box-shadow:0;color:#f6f6f6}.easy-autocomplete.eac-blue input::-webkit-input-placeholder{color:#f6f6f6}.easy-autocomplete.eac-blue input:-moz-placeholder{color:#f6f6f6}.easy-autocomplete.eac-blue input::-moz-placeholder{color:#f6f6f6}.easy-autocomplete.eac-blue input:-ms-input-placeholder{color:#f6f6f6}.easy-autocomplete.eac-blue input:hover,.easy-autocomplete.eac-blue input:focus{border-color:#5A91CB;box-shadow:0}.easy-autocomplete.eac-blue ul{border-color:#5A91CB}.easy-autocomplete.eac-blue ul li,.easy-autocomplete.eac-blue ul .eac-category{background-color:#6d9ed1;border-color:#5A91CB}.easy-autocomplete.eac-blue ul li.selected,.easy-autocomplete.eac-blue ul .eac-category.selected{background-color:#94b8dd;color:#f6f6f6}.easy-autocomplete.eac-yellow{color:#333}.easy-autocomplete.eac-yellow input{background-color:#ffdb7e;border-color:#333;border-radius:4px;box-shadow:0;color:#333}.easy-autocomplete.eac-yellow input:hover,.easy-autocomplete.eac-yellow input:focus{border-color:#333;box-shadow:0}.easy-autocomplete.eac-yellow ul{border-color:#333}.easy-autocomplete.eac-yellow ul li,.easy-autocomplete.eac-yellow ul .eac-category{background-color:#ffdb7e;border-color:#333}.easy-autocomplete.eac-yellow ul li.selected,.easy-autocomplete.eac-yellow ul .eac-category.selected{background-color:#ffe9b1;color:#333}.easy-autocomplete.eac-purple{color:#333}.easy-autocomplete.eac-purple input{background-color:#d6d1e7;border-color:#b8afd5;box-shadow:0;color:#333}.easy-autocomplete.eac-purple input:hover,.easy-autocomplete.eac-purple input:focus{border-color:#333;box-shadow:0}.easy-autocomplete.eac-purple ul{border-color:#333}.easy-autocomplete.eac-purple ul li,.easy-autocomplete.eac-purple ul .eac-category{background-color:#d6d1e7;border-color:#333}.easy-autocomplete.eac-purple ul li.selected,.easy-autocomplete.eac-purple ul .eac-category.selected{background-color:#ebe8f3;color:#333}.easy-autocomplete.eac-bootstrap input{border-color:#ccc;border-radius:4px;border-style:solid;border-width:1px;color:#555;padding:6px 12px}.easy-autocomplete-container{left:0;position:absolute;width:100%;z-index:2}.easy-autocomplete-container ul{background:none repeat scroll 0 0 #ffffff;border-top:1px dotted #ccc;display:none;margin-top:0;padding-bottom:0;padding-left:0;position:relative;top:-1px}.easy-autocomplete-container ul li,.easy-autocomplete-container ul .eac-category{background:inherit;border-color:#ccc;border-image:none;border-style:solid;border-width:0 1px;display:block;font-size:14px;font-weight:normal;padding:4px 12px}.easy-autocomplete-container ul li:last-child{border-radius:0 0 2px 2px;border-width:0 1px 1px}.easy-autocomplete-container ul li.selected{background:none repeat scroll 0 0 #ebebeb;cursor:pointer}.easy-autocomplete-container ul li.selected div{font-weight:normal}.easy-autocomplete-container ul li div{display:block;font-weight:normal;word-break:break-all}.easy-autocomplete-container ul li b{font-weight:bold}.easy-autocomplete-container ul .eac-category{font-color:#aaa;font-style:italic}.eac-description .eac-item span{color:#aaa;font-style:italic;font-size:0.9em}.eac-icon-left .eac-item img{margin-right:4px;max-height:30px}.eac-icon-right .eac-item{margin-top:8px;min-height:24px;position:relative}.eac-icon-right .eac-item img{margin-left:4px;max-height:30px;position:absolute;right:-4px;top:-8px} +/*# sourceMappingURL=easy-autocomplete.min.css.map */ diff --git a/static/css/easy-autocomplete.themes.min.css b/static/css/easy-autocomplete.themes.min.css new file mode 100644 index 0000000..37ac693 --- /dev/null +++ b/static/css/easy-autocomplete.themes.min.css @@ -0,0 +1,11 @@ +/* + * easy-autocomplete + * jQuery plugin for autocompletion + * + * @author Łukasz Pawełczak (http://github.com/pawelczak) + * @version 1.3.5 + * Copyright License: + */ + +.easy-autocomplete.eac-square{font-family:"Roboto", "Helvetica Neue",Helvetica,Arial,sans-serif}.easy-autocomplete.eac-square input{border:1px solid #7f8c8d;border-radius:0;color:#7f8c8d;font-family:inherit;font-size:18px;font-style:italic;font-weight:300;margin:0;min-width:350px;padding:12px 43px 12px 15px}.easy-autocomplete.eac-square ul{border-color:#7f8c8d;border-top:0;box-shadow:none;top:0}.easy-autocomplete.eac-square ul li,.easy-autocomplete.eac-square ul .eac-category{border-color:#7f8c8d;font-family:inherit;font-size:16px;font-weight:300;padding:6px 12px;transition:all 0.4s ease 0s}.easy-autocomplete.eac-square ul li *,.easy-autocomplete.eac-square ul .eac-category *{font-weight:300}.easy-autocomplete.eac-square ul li.selected,.easy-autocomplete.eac-square ul .eac-category.selected{background-color:#f1f1f1;font-weight:300}.easy-autocomplete.eac-square ul li b,.easy-autocomplete.eac-square ul .eac-category b{font-weight:600}.easy-autocomplete.eac-round{font-family:"Open Sans", "Helvetica Neue",Helvetica,Arial,sans-serif}.easy-autocomplete.eac-round input{border:2px solid #888;border-radius:10px;color:#888;font-family:inherit;font-size:16px;font-weight:400;margin:0;min-width:300px;padding:10px}.easy-autocomplete.eac-round input:hover,.easy-autocomplete.eac-round input:focus{border-color:#3079ed}.easy-autocomplete.eac-round ul{background:none;border-color:#888;border-width:0;box-shadow:none;min-width:300px;top:20px}.easy-autocomplete.eac-round ul li,.easy-autocomplete.eac-round ul .eac-category{background:#fff;border-color:#3079ed;border-width:0 2px;font-size:14px;padding:8px 12px;transition:all 0.4s ease 0s}.easy-autocomplete.eac-round ul li.selected,.easy-autocomplete.eac-round ul .eac-category.selected{background-color:#d4e3fb}.easy-autocomplete.eac-round ul li:first-child,.easy-autocomplete.eac-round ul .eac-category:first-child{border-radius:10px 10px 0 0;border-width:2px 2px 0}.easy-autocomplete.eac-round ul li:last-child,.easy-autocomplete.eac-round ul .eac-category:last-child{border-radius:0 0 10px 10px;border-width:0 2px 2px}.easy-autocomplete.eac-round ul li b,.easy-autocomplete.eac-round ul .eac-category b{font-weight:700}.easy-autocomplete.eac-funky{font-family:"Inconsolata", "Helvetica Neue",Helvetica,Arial,sans-serif}.easy-autocomplete.eac-funky input{background:#07ED89;border:0;border-radius:0;color:#ED076B;font-family:inherit;font-size:18px;min-width:240px;padding:12px}.easy-autocomplete.eac-funky ul{background:transparent;border:0}.easy-autocomplete.eac-funky ul li,.easy-autocomplete.eac-funky ul .eac-category{background:transparent;border:0;color:#ED076B;font-size:18px;padding:4px 12px;transition:all 0.4s ease 0s}.easy-autocomplete.eac-funky ul li.selected,.easy-autocomplete.eac-funky ul .eac-category.selected{color:#8907ED}.easy-autocomplete.eac-solid input{box-shadow:0 1px 2px rgba(0,0,0,0.15) inset;border-color:#ddd;color:#666;font-size:13px;min-height:0;padding:6px 12px}.easy-autocomplete.eac-solid ul li,.easy-autocomplete.eac-solid ul .eac-category{transition:all 0.4s ease 0s}.easy-autocomplete.eac-solid ul li.selected,.easy-autocomplete.eac-solid ul .eac-category.selected{background-color:#f2f2f2}.easy-autocomplete.eac-plate{font-family:"Open Sans", "Helvetica Neue",Helvetica,Arial,sans-serif}.easy-autocomplete.eac-plate input{font-size:13px;padding:6px 12px}.easy-autocomplete.eac-plate ul{background:#b5b5b5;border-radius:6px;border-width:0;top:10px}.easy-autocomplete.eac-plate ul li,.easy-autocomplete.eac-plate ul .eac-category{background:#b5b5b5;color:#FAFAFA;font-size:12px;transition:all 0.4s ease 0s}.easy-autocomplete.eac-plate ul li b,.easy-autocomplete.eac-plate ul .eac-category b{color:#ffd464}.easy-autocomplete.eac-plate ul li.selected,.easy-autocomplete.eac-plate ul .eac-category.selected{background:#656565}.easy-autocomplete.eac-plate ul li:first-child,.easy-autocomplete.eac-plate ul .eac-category:first-child{border-radius:6px 6px 0 0}.easy-autocomplete.eac-plate ul li:last-child,.easy-autocomplete.eac-plate ul .eac-category:last-child{border-radius:0 0 6px 6px}.easy-autocomplete.eac-plate-dark{font-family:"Open Sans", "Helvetica Neue",Helvetica,Arial,sans-serif}.easy-autocomplete.eac-plate-dark input{font-size:13px;padding:6px 12px}.easy-autocomplete.eac-plate-dark ul{background:#212121;border-radius:6px;border-width:0;top:10px}.easy-autocomplete.eac-plate-dark ul li,.easy-autocomplete.eac-plate-dark ul .eac-category{background:#212121;color:#FAFAFA;font-size:12px;transition:all 0.4s ease 0s}.easy-autocomplete.eac-plate-dark ul li b,.easy-autocomplete.eac-plate-dark ul .eac-category b{color:#ffd464}.easy-autocomplete.eac-plate-dark ul li.selected,.easy-autocomplete.eac-plate-dark ul .eac-category.selected{background:#656565}.easy-autocomplete.eac-plate-dark ul li:first-child,.easy-autocomplete.eac-plate-dark ul .eac-category:first-child{border-radius:6px 6px 0 0}.easy-autocomplete.eac-plate-dark ul li:last-child,.easy-autocomplete.eac-plate-dark ul .eac-category:last-child{border-radius:0 0 6px 6px} +/*# sourceMappingURL=easy-autocomplete.themes.min.css.map */ diff --git a/static/css/tempusdominus-bootstrap-4.min.css b/static/css/tempusdominus-bootstrap-4.min.css new file mode 100644 index 0000000..65ae800 --- /dev/null +++ b/static/css/tempusdominus-bootstrap-4.min.css @@ -0,0 +1,204 @@ +/*@preserve + * Tempus Dominus Bootstrap4 v5.0.0-alpha16 (https://tempusdominus.github.io/bootstrap-4/) + * Copyright 2016-2018 Jonathan Peterson + * Licensed under MIT (https://github.com/tempusdominus/bootstrap-3/blob/master/LICENSE) + */ + +.sr-only, .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after, .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after, .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after, .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after, .bootstrap-datetimepicker-widget .btn[data-action="today"]::after, .bootstrap-datetimepicker-widget .picker-switch::after, .bootstrap-datetimepicker-widget table th.prev::after, .bootstrap-datetimepicker-widget table th.next::after { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.bootstrap-datetimepicker-widget { + list-style: none; } + .bootstrap-datetimepicker-widget.dropdown-menu { + display: block; + margin: 2px 0; + padding: 4px; + width: 14rem; } + @media (min-width: 576px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; } } + @media (min-width: 768px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; } } + @media (min-width: 992px) { + .bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs { + width: 38em; } } + .bootstrap-datetimepicker-widget.dropdown-menu:before, .bootstrap-datetimepicker-widget.dropdown-menu:after { + content: ''; + display: inline-block; + position: absolute; } + .bootstrap-datetimepicker-widget.dropdown-menu.bottom:before { + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + top: -7px; + left: 7px; } + .bootstrap-datetimepicker-widget.dropdown-menu.bottom:after { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid white; + top: -6px; + left: 8px; } + .bootstrap-datetimepicker-widget.dropdown-menu.top:before { + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + bottom: -7px; + left: 6px; } + .bootstrap-datetimepicker-widget.dropdown-menu.top:after { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid white; + bottom: -6px; + left: 7px; } + .bootstrap-datetimepicker-widget.dropdown-menu.float-right:before { + left: auto; + right: 6px; } + .bootstrap-datetimepicker-widget.dropdown-menu.float-right:after { + left: auto; + right: 7px; } + .bootstrap-datetimepicker-widget .list-unstyled { + margin: 0; } + .bootstrap-datetimepicker-widget a[data-action] { + padding: 6px 0; } + .bootstrap-datetimepicker-widget a[data-action]:active { + box-shadow: none; } + .bootstrap-datetimepicker-widget .timepicker-hour, .bootstrap-datetimepicker-widget .timepicker-minute, .bootstrap-datetimepicker-widget .timepicker-second { + width: 54px; + font-weight: bold; + font-size: 1.2em; + margin: 0; } + .bootstrap-datetimepicker-widget button[data-action] { + padding: 6px; } + .bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after { + content: "Increment Hours"; } + .bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after { + content: "Increment Minutes"; } + .bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after { + content: "Decrement Hours"; } + .bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after { + content: "Decrement Minutes"; } + .bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after { + content: "Show Hours"; } + .bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after { + content: "Show Minutes"; } + .bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after { + content: "Toggle AM/PM"; } + .bootstrap-datetimepicker-widget .btn[data-action="clear"]::after { + content: "Clear the picker"; } + .bootstrap-datetimepicker-widget .btn[data-action="today"]::after { + content: "Set the date to today"; } + .bootstrap-datetimepicker-widget .picker-switch { + text-align: center; } + .bootstrap-datetimepicker-widget .picker-switch::after { + content: "Toggle Date and Time Screens"; } + .bootstrap-datetimepicker-widget .picker-switch td { + padding: 0; + margin: 0; + height: auto; + width: auto; + line-height: inherit; } + .bootstrap-datetimepicker-widget .picker-switch td span { + line-height: 2.5; + height: 2.5em; + width: 100%; } + .bootstrap-datetimepicker-widget table { + width: 100%; + margin: 0; } + .bootstrap-datetimepicker-widget table td, + .bootstrap-datetimepicker-widget table th { + text-align: center; + border-radius: 0.25rem; } + .bootstrap-datetimepicker-widget table th { + height: 20px; + line-height: 20px; + width: 20px; } + .bootstrap-datetimepicker-widget table th.picker-switch { + width: 145px; } + .bootstrap-datetimepicker-widget table th.disabled, .bootstrap-datetimepicker-widget table th.disabled:hover { + background: none; + color: #868e96; + cursor: not-allowed; } + .bootstrap-datetimepicker-widget table th.prev::after { + content: "Previous Month"; } + .bootstrap-datetimepicker-widget table th.next::after { + content: "Next Month"; } + .bootstrap-datetimepicker-widget table thead tr:first-child th { + cursor: pointer; } + .bootstrap-datetimepicker-widget table thead tr:first-child th:hover { + background: #e9ecef; } + .bootstrap-datetimepicker-widget table td { + height: 54px; + line-height: 54px; + width: 54px; } + .bootstrap-datetimepicker-widget table td.cw { + font-size: .8em; + height: 20px; + line-height: 20px; + color: #868e96; } + .bootstrap-datetimepicker-widget table td.day { + height: 20px; + line-height: 20px; + width: 20px; } + .bootstrap-datetimepicker-widget table td.day:hover, .bootstrap-datetimepicker-widget table td.hour:hover, .bootstrap-datetimepicker-widget table td.minute:hover, .bootstrap-datetimepicker-widget table td.second:hover { + background: #e9ecef; + cursor: pointer; } + .bootstrap-datetimepicker-widget table td.old, .bootstrap-datetimepicker-widget table td.new { + color: #868e96; } + .bootstrap-datetimepicker-widget table td.today { + position: relative; } + .bootstrap-datetimepicker-widget table td.today:before { + content: ''; + display: inline-block; + border: solid transparent; + border-width: 0 0 7px 7px; + border-bottom-color: #007bff; + border-top-color: rgba(0, 0, 0, 0.2); + position: absolute; + bottom: 4px; + right: 4px; } + .bootstrap-datetimepicker-widget table td.active, .bootstrap-datetimepicker-widget table td.active:hover { + background-color: #007bff; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } + .bootstrap-datetimepicker-widget table td.active.today:before { + border-bottom-color: #fff; } + .bootstrap-datetimepicker-widget table td.disabled, .bootstrap-datetimepicker-widget table td.disabled:hover { + background: none; + color: #868e96; + cursor: not-allowed; } + .bootstrap-datetimepicker-widget table td span { + display: inline-block; + width: 54px; + height: 54px; + line-height: 54px; + margin: 2px 1.5px; + cursor: pointer; + border-radius: 0.25rem; } + .bootstrap-datetimepicker-widget table td span:hover { + background: #e9ecef; } + .bootstrap-datetimepicker-widget table td span.active { + background-color: #007bff; + color: #fff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } + .bootstrap-datetimepicker-widget table td span.old { + color: #868e96; } + .bootstrap-datetimepicker-widget table td span.disabled, .bootstrap-datetimepicker-widget table td span.disabled:hover { + background: none; + color: #868e96; + cursor: not-allowed; } + .bootstrap-datetimepicker-widget.usetwentyfour td.hour { + height: 27px; + line-height: 27px; } + +.input-group [data-toggle="datetimepicker"] { + cursor: pointer; } diff --git a/static/js/jquery.easy-autocomplete.min.js b/static/js/jquery.easy-autocomplete.min.js new file mode 100644 index 0000000..926b946 --- /dev/null +++ b/static/js/jquery.easy-autocomplete.min.js @@ -0,0 +1,10 @@ +/* + * easy-autocomplete + * jQuery plugin for autocompletion + * + * @author Łukasz Pawełczak (http://github.com/pawelczak) + * @version 1.3.5 + * Copyright License: + */ + +var EasyAutocomplete=function(a){return a.Configuration=function(a){function b(){if("xml"===a.dataType&&(a.getValue||(a.getValue=function(a){return $(a).text()}),a.list||(a.list={}),a.list.sort||(a.list.sort={}),a.list.sort.method=function(b,c){return b=a.getValue(b),c=a.getValue(c),c>b?-1:b>c?1:0},a.list.match||(a.list.match={}),a.list.match.method=function(a,b){return a.search(b)>-1}),void 0!==a.categories&&a.categories instanceof Array){for(var b=[],c=0,d=a.categories.length;d>c;c+=1){var e=a.categories[c];for(var f in h.categories[0])void 0===e[f]&&(e[f]=h.categories[0][f]);b.push(e)}a.categories=b}}function c(){function b(a,c){var d=a||{};for(var e in a)void 0!==c[e]&&null!==c[e]&&("object"!=typeof c[e]||c[e]instanceof Array?d[e]=c[e]:b(a[e],c[e]));return void 0!==c.data&&null!==c.data&&"object"==typeof c.data&&(d.data=c.data),d}h=b(h,a)}function d(){if("list-required"!==h.url&&"function"!=typeof h.url){var b=h.url;h.url=function(){return b}}if(void 0!==h.ajaxSettings.url&&"function"!=typeof h.ajaxSettings.url){var b=h.ajaxSettings.url;h.ajaxSettings.url=function(){return b}}if("string"==typeof h.listLocation){var c=h.listLocation;"XML"===h.dataType.toUpperCase()?h.listLocation=function(a){return $(a).find(c)}:h.listLocation=function(a){return a[c]}}if("string"==typeof h.getValue){var d=h.getValue;h.getValue=function(a){return a[d]}}void 0!==a.categories&&(h.categoriesAssigned=!0)}function e(){void 0!==a.ajaxSettings&&"object"==typeof a.ajaxSettings?h.ajaxSettings=a.ajaxSettings:h.ajaxSettings={}}function f(a){return void 0!==h[a]&&null!==h[a]}function g(a,b){function c(b,d){for(var e in d)void 0===b[e]&&a.log("Property '"+e+"' does not exist in EasyAutocomplete options API."),"object"==typeof b[e]&&-1===$.inArray(e,i)&&c(b[e],d[e])}c(h,b)}var h={data:"list-required",url:"list-required",dataType:"json",listLocation:function(a){return a},xmlElementName:"",getValue:function(a){return a},autocompleteOff:!0,placeholder:!1,ajaxCallback:function(){},matchResponseProperty:!1,list:{sort:{enabled:!1,method:function(a,b){return a=h.getValue(a),b=h.getValue(b),b>a?-1:a>b?1:0}},maxNumberOfElements:6,hideOnEmptyPhrase:!0,match:{enabled:!1,caseSensitive:!1,method:function(a,b){return a.search(b)>-1}},showAnimation:{type:"normal",time:400,callback:function(){}},hideAnimation:{type:"normal",time:400,callback:function(){}},onClickEvent:function(){},onSelectItemEvent:function(){},onLoadEvent:function(){},onChooseEvent:function(){},onKeyEnterEvent:function(){},onMouseOverEvent:function(){},onMouseOutEvent:function(){},onShowListEvent:function(){},onHideListEvent:function(){}},highlightPhrase:!0,theme:"",cssClasses:"",minCharNumber:0,requestDelay:0,adjustWidth:!0,ajaxSettings:{},preparePostData:function(a,b){return a},loggerEnabled:!0,template:"",categoriesAssigned:!1,categories:[{maxNumberOfElements:4}]},i=["ajaxSettings","template"];this.get=function(a){return h[a]},this.equals=function(a,b){return!(!f(a)||h[a]!==b)},this.checkDataUrlProperties=function(){return"list-required"!==h.url||"list-required"!==h.data},this.checkRequiredProperties=function(){for(var a in h)if("required"===h[a])return logger.error("Option "+a+" must be defined"),!1;return!0},this.printPropertiesThatDoesntExist=function(a,b){g(a,b)},b(),c(),h.loggerEnabled===!0&&g(console,a),e(),d()},a}(EasyAutocomplete||{}),EasyAutocomplete=function(a){return a.Logger=function(){this.error=function(a){console.log("ERROR: "+a)},this.warning=function(a){console.log("WARNING: "+a)}},a}(EasyAutocomplete||{}),EasyAutocomplete=function(a){return a.Constans=function(){var a={CONTAINER_CLASS:"easy-autocomplete-container",CONTAINER_ID:"eac-container-",WRAPPER_CSS_CLASS:"easy-autocomplete"};this.getValue=function(b){return a[b]}},a}(EasyAutocomplete||{}),EasyAutocomplete=function(a){return a.ListBuilderService=function(a,b){function c(b,c){function d(){var d,e={};return void 0!==b.xmlElementName&&(e.xmlElementName=b.xmlElementName),void 0!==b.listLocation?d=b.listLocation:void 0!==a.get("listLocation")&&(d=a.get("listLocation")),void 0!==d?"string"==typeof d?e.data=$(c).find(d):"function"==typeof d&&(e.data=d(c)):e.data=c,e}function e(){var a={};return void 0!==b.listLocation?"string"==typeof b.listLocation?a.data=c[b.listLocation]:"function"==typeof b.listLocation&&(a.data=b.listLocation(c)):a.data=c,a}var f={};if(f="XML"===a.get("dataType").toUpperCase()?d():e(),void 0!==b.header&&(f.header=b.header),void 0!==b.maxNumberOfElements&&(f.maxNumberOfElements=b.maxNumberOfElements),void 0!==a.get("list").maxNumberOfElements&&(f.maxListSize=a.get("list").maxNumberOfElements),void 0!==b.getValue)if("string"==typeof b.getValue){var g=b.getValue;f.getValue=function(a){return a[g]}}else"function"==typeof b.getValue&&(f.getValue=b.getValue);else f.getValue=a.get("getValue");return f}function d(b){var c=[];return void 0===b.xmlElementName&&(b.xmlElementName=a.get("xmlElementName")),$(b.data).find(b.xmlElementName).each(function(){c.push(this)}),c}this.init=function(b){var c=[],d={};return d.data=a.get("listLocation")(b),d.getValue=a.get("getValue"),d.maxListSize=a.get("list").maxNumberOfElements,c.push(d),c},this.updateCategories=function(b,d){if(a.get("categoriesAssigned")){b=[];for(var e=0;ee;e+=1)c[e].data=b(a,c[e],d);return c},this.checkIfDataExists=function(a){for(var b=0,c=a.length;c>b;b+=1)if(void 0!==a[b].data&&a[b].data instanceof Array&&a[b].data.length>0)return!0;return!1}},a}(EasyAutocomplete||{}),EasyAutocomplete=function(a){return a.proccess=function(b,c,d){function e(a,c){var d=[],e="";if(b.get("list").match.enabled)for(var g=0,h=a.length;h>g;g+=1)e=b.get("getValue")(a[g]),f(e,c)&&d.push(a[g]);else d=a;return d}function f(a,c){return b.get("list").match.caseSensitive||("string"==typeof a&&(a=a.toLowerCase()),c=c.toLowerCase()),!!b.get("list").match.method(a,c)}function g(a){return void 0!==c.maxNumberOfElements&&a.length>c.maxNumberOfElements&&(a=a.slice(0,c.maxNumberOfElements)),a}function h(a){return b.get("list").sort.enabled&&a.sort(b.get("list").sort.method),a}a.proccess.match=f;var i=c.data,j=d;return i=e(i,j),i=g(i),i=h(i)},a}(EasyAutocomplete||{}),EasyAutocomplete=function(a){return a.Template=function(a){var b={basic:{type:"basic",method:function(a){return a},cssClass:""},description:{type:"description",fields:{description:"description"},method:function(a){return a+" - description"},cssClass:"eac-description"},iconLeft:{type:"iconLeft",fields:{icon:""},method:function(a){return a},cssClass:"eac-icon-left"},iconRight:{type:"iconRight",fields:{iconSrc:""},method:function(a){return a},cssClass:"eac-icon-right"},links:{type:"links",fields:{link:""},method:function(a){return a},cssClass:""},custom:{type:"custom",method:function(){},cssClass:""}},c=function(a){var c,d=a.fields;return"description"===a.type?(c=b.description.method,"string"==typeof d.description?c=function(a,b){return a+" - "+b[d.description]+""}:"function"==typeof d.description&&(c=function(a,b){return a+" - "+d.description(b)+""}),c):"iconRight"===a.type?("string"==typeof d.iconSrc?c=function(a,b){return a+""}:"function"==typeof d.iconSrc&&(c=function(a,b){return a+""}),c):"iconLeft"===a.type?("string"==typeof d.iconSrc?c=function(a,b){return""+a}:"function"==typeof d.iconSrc&&(c=function(a,b){return""+a}),c):"links"===a.type?("string"==typeof d.link?c=function(a,b){return""+a+""}:"function"==typeof d.link&&(c=function(a,b){return""+a+""}),c):"custom"===a.type?a.method:b.basic.method},d=function(a){return a&&a.type&&a.type&&b[a.type]?c(a):b.basic.method},e=function(a){var c=function(){return""};return a&&a.type&&a.type&&b[a.type]?function(){var c=b[a.type].cssClass;return function(){return c}}():c};this.getTemplateClass=e(a),this.build=d(a)},a}(EasyAutocomplete||{}),EasyAutocomplete=function(a){return a.main=function(b,c){function d(){return 0===t.length?void p.error("Input field doesn't exist."):o.checkDataUrlProperties()?o.checkRequiredProperties()?(e(),void g()):void p.error("Will not work without mentioned properties."):void p.error("One of options variables 'data' or 'url' must be defined.")}function e(){function a(){var a=$("
"),c=n.getValue("WRAPPER_CSS_CLASS");o.get("theme")&&""!==o.get("theme")&&(c+=" eac-"+o.get("theme")),o.get("cssClasses")&&""!==o.get("cssClasses")&&(c+=" "+o.get("cssClasses")),""!==q.getTemplateClass()&&(c+=" "+q.getTemplateClass()),a.addClass(c),t.wrap(a),o.get("adjustWidth")===!0&&b()}function b(){var a=t.outerWidth();t.parent().css("width",a)}function c(){t.unwrap()}function d(){var a=$("
").addClass(n.getValue("CONTAINER_CLASS"));a.attr("id",f()).prepend($("