diff --git a/mirzaev/ebala/system/controllers/market.php b/mirzaev/ebala/system/controllers/market.php index 6716468..27af9f7 100755 --- a/mirzaev/ebala/system/controllers/market.php +++ b/mirzaev/ebala/system/controllers/market.php @@ -7,15 +7,12 @@ namespace mirzaev\ebala\controllers; // Файлы проекта use mirzaev\ebala\controllers\core, mirzaev\ebala\controllers\traits\errors, - mirzaev\ebala\models\market as model, + mirzaev\ebala\models\registry, + mirzaev\ebala\models\market as model; // Библиотека для ArangoDB use ArangoDBClient\Document as _document; -// System libraries -use datetime, - exception; - /** * Контроллер магазина * @@ -129,7 +126,7 @@ final class market extends core if (!empty($statuses_merged)) $filters .= empty($filters) ? $statuses_merged : " && ($statuses_merged)"; // Инициализация данных для генерации HTML-документа с таблицей - $this->view->rows = model::list(before: empty($filters) ? null : "FILTER ($filters)", page: (int) $this->session->buffer[$_SERVER['INTERFACE']]['markets']['page']); + $this->view->rows = registry::markets(before: empty($filters) ? null : "FILTER ($filters)", page: (int) $this->session->buffer[$_SERVER['INTERFACE']]['markets']['page']); // Запись в cookie (только таким методом можно записать "hostonly: true") setcookie( diff --git a/mirzaev/ebala/system/controllers/operator.php b/mirzaev/ebala/system/controllers/operator.php new file mode 100755 index 0000000..e6838f4 --- /dev/null +++ b/mirzaev/ebala/system/controllers/operator.php @@ -0,0 +1,177 @@ + + */ +final class operator extends core +{ + use errors; + + /** + * Главная страница + * + * @param array $parameters Параметры запроса + */ + public function index(array $parameters = []): ?string + { + // Авторизация + if ($this->account->status() && ($this->account->type === 'administrator' || $this->account->type === 'operator')) { + // Авторизован аккаунт оператора или администратора + + foreach (['confirmed', 'waiting', 'published', 'unpublished', 'problematic', 'hided', 'completed'] as $name) { + // Перебор фильтров статусов + + // Инициализация значения (приоритет у cookie) + $value = $_COOKIE["operators_filter_$name"] ?? $this->session->buffer[$_SERVER['INTERFACE']]['operators']['filters'][$name] ?? 0; + + // Инициализировано значение? + if ($value === null || $value === 0) continue; + + // Генерация класса для HTML-элемента по его состоянию (0 - ОТСУТСТВУЕТ, 1 - И, 2 - ИЛИ) + $this->view->{$name} = match ($value) { + '0', 0 => 'earth', + '1', 1 => 'sand', + '2', 2 => 'river', + default => 'earth' + }; + } + + // Генерация представлениямя + $main = $this->view->render(DIRECTORY_SEPARATOR . 'pages' . DIRECTORY_SEPARATOR . 'operators.html'); + } else $main = $this->authorization(); + + // Возврат (успех) + if ($_SERVER['REQUEST_METHOD'] === 'GET') return $this->view->render(DIRECTORY_SEPARATOR . 'index.html', ['main' => $main]); + else if ($_SERVER['REQUEST_METHOD'] === 'POST') return $main; + + // Возврат (провал) + return null; + } + + /** + * Прочитать + * + * @param array $parameters Параметры запроса + */ + public function read(array $parameters = []): ?string + { + if ($this->account->status() && ($this->account->type === 'administrator' || $this->account->type === 'operator')) { + // Авторизован аккаунт оператора или администратора + + // Реинициализация актуальной страницы + if (isset($parameters['page'])) $this->session->write(['operators' => ['page' => $parameters['page']]]); + else if (empty($this->session->buffer[$_SERVER['INTERFACE']]['operators']['page'])) $this->session->write(['operators' => ['page' => 1]]); + + // Инициализация буфера AQL-выражения для инъекции фильтра по интервалу + $polysemantic = ''; + + // Инициализация допустимых статусов + $statuses = ['active', 'inactive', 'fined', 'decent', 'hided', 'fired']; + + // Инициализация буфера AQL-выражения для инъекции фильтра по статусам (И) + $statuses_and = ''; + + foreach ($statuses as $name) { + // Перебор фильтров статусов (И) + + // Инициализация значения (приоритет у cookie) (отсутствие значения или значение 0 вызывают continue) + if (empty($value = $_COOKIE["operators_filter_$name"] ?? $this->session->buffer[$_SERVER['INTERFACE']]['operators']['filters'][$name] ?? 0)) continue; + + // Генерация AQL-выражения для инъекции в строку запроса + if ($value === '1') $statuses_and .= " && operator.$name == true"; + } + + // Очистка от бинарных операторов сравнения с только одним операндом (крайние) + $statuses_and = trim(trim(trim($statuses_and), '&&')); + + // Инициализация буфера AQL-выражения для инъекции фильтра по статусам (ИЛИ) + $statuses_or = ''; + + foreach ($statuses as $name) { + // Перебор фильтров статусов (ИЛИ) + + // Инициализация значения (приоритет у cookie) (отсутствие значения или значение 0 вызывают continue) + if (empty($value = $_COOKIE["operators_filter_$name"] ?? $this->session->buffer[$_SERVER['INTERFACE']]['operators']['filters'][$name] ?? 0)) continue; + + // Генерация AQL-выражения для инъекции в строку запроса + if ($value === '2') $statuses_or .= " || operator.$name == true"; + } + + // Очистка от бинарных операторов сравнения с только одним операндом (крайние) + $statuses_or = trim(trim(trim($statuses_or), '||')); + + // Инициализация буфера с объёдинёнными буферами c AQL-выражениям "И" и "ИЛИ" + $statuses_merged = (empty($statuses_and) ? '' : "($statuses_and)") . (empty($statuses_or) ? '' : (empty($statuses_and) ? '' : ' || ') . "($statuses_or)"); + + // Инициализация общего буфера с AQL-выражениями + $filters = ''; + + // Объединение фильров в единую строку с AQL-выражениями для инъекции + if (!empty($statuses_merged)) $filters .= empty($filters) ? $statuses_merged : " && ($statuses_merged)"; + + // Инициализация данных для генерации HTML-документа с таблицей + $this->view->rows = model::list(before: empty($filters) ? null : "FILTER ($filters)", page: (int) $this->session->buffer[$_SERVER['INTERFACE']]['operators']['page']); + + // Запись в cookie (только таким методом можно записать "hostonly: true") + setcookie( + 'operators_page', + (string) $this->session->buffer[$_SERVER['INTERFACE']]['operators']['page'], + [ + 'expires' => strtotime('+1 hour'), + 'path' => '/', + 'secure' => true, + 'httponly' => false, + 'samesite' => 'strict' + ] + ); + + // Запись в глобальную переменную шаблонизатора обрабатываемой страницы + $this->view->page = $parameters['page']; + + // Инициализация блока + return $this->view->render(DIRECTORY_SEPARATOR . 'elements' . DIRECTORY_SEPARATOR . 'operators.html'); + } + + // Возврат (провал) + return null; + } + + /** + * Прочитать данные магазинов для + * + * @param array $parameters Параметры запроса + */ + public function datalist(array $parameters = []): ?string + { + if ($this->account->status() && ($this->account->type === 'administrator' || $this->account->type === 'operator' || $this->account->type === 'operator')) { + // Авторизован аккаунт оператора или магазина + + // Инициализация данных магазинов + $this->view->operators = model::read(filter: 'd.status == "active"', amount: 10000, return: '{ id: d.id, director: d.director }'); + + // Универсализация + if ($this->view->operators instanceof _document) $this->view->operators = [$this->view->operators]; + + // Возврат (успех) + return $this->view->render(DIRECTORY_SEPARATOR . 'lists' . DIRECTORY_SEPARATOR . 'operators.html'); + } + + // Возврат (провал) + return null; + } +} diff --git a/mirzaev/ebala/system/controllers/worker.php b/mirzaev/ebala/system/controllers/worker.php index 12ee91c..8f2c6b6 100755 --- a/mirzaev/ebala/system/controllers/worker.php +++ b/mirzaev/ebala/system/controllers/worker.php @@ -7,6 +7,7 @@ namespace mirzaev\ebala\controllers; // Файлы проекта use mirzaev\ebala\controllers\core, mirzaev\ebala\controllers\traits\errors, + mirzaev\ebala\models\registry, mirzaev\ebala\models\worker as model; // Библиотека для ArangoDB @@ -142,7 +143,7 @@ final class worker extends core if (!empty($polysemantic)) $filters .= empty($filters) ? $polysemantic : " && $polysemantic"; // Инициализация данных для генерации HTML-документа с таблицей - $this->view->rows = model::list(before: empty($filters) ? null : "FILTER ($filters)", page: (int) $this->session->buffer[$_SERVER['INTERFACE']]['workers']['page']); + $this->view->rows = registry::workers(before: empty($filters) ? null : "FILTER ($filters)", page: (int) $this->session->buffer[$_SERVER['INTERFACE']]['workers']['page']); // Запись в cookie (только таким методом можно записать "hostonly: true") setcookie( diff --git a/mirzaev/ebala/system/models/market.php b/mirzaev/ebala/system/models/market.php index 9d2ec46..dbdbdd6 100755 --- a/mirzaev/ebala/system/models/market.php +++ b/mirzaev/ebala/system/models/market.php @@ -32,8 +32,7 @@ final class market extends core * * @todo Исправить "markets" на "market" */ - /* final public const COLLECTION = 'market'; */ - final public const COLLECTION = 'markets'; + final public const COLLECTION = 'market'; /** * Инстанция документа в базе данных @@ -64,61 +63,6 @@ final class market extends core } } - /** - * Read markets from ArangoDB - * - * @param ?string $before Injection of AQL-code before search of market and market - * @param int $amount Amount of markets - * @param int $page Offset by amount - * @param array $errors Errors registry - * - * @return array Instances from ArangoDB - */ - public static function list( - ?string $before = '', - int $amount = 100, - int $page = 1, - string $sort = 'market.created DESC', - array &$errors = [] - ): array { - try { - if (collection::init(static::$arangodb->session, self::COLLECTION)) { - // Инициализирована коллекция - - // Search the session data in ArangoDB - $markets = collection::search(static::$arangodb->session, sprintf( - << $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - // Exit (fail) - return []; - } - /** * Найти связанный аккаунт * diff --git a/mirzaev/ebala/system/models/registry.php b/mirzaev/ebala/system/models/registry.php new file mode 100755 index 0000000..20a4cdb --- /dev/null +++ b/mirzaev/ebala/system/models/registry.php @@ -0,0 +1,148 @@ + + */ +final class registry extends core +{ + use instance, status; + + /** + * Generate workers list + * + * @param ?string $before Injection of AQL-code before search + * @param int $amount Amount of workers + * @param int $page Offset by amount + * @param array $errors Errors registry + * + * @return array Instances from ArangoDB + */ + public static function workers( + ?string $before = '', + int $amount = 100, + int $page = 1, + string $sort = 'worker.created DESC', + array &$errors = [] + ): array { + try { + if (collection::init(static::$arangodb->session, account::COLLECTION) && collection::init(static::$arangodb->session, worker::COLLECTION)) { + // Инициализированы коллекции + + // Search the session data in ArangoDB + $workers = collection::search(static::$arangodb->session, sprintf( + << $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + // Exit (fail) + return []; + } + + /** + * Generate markets list + * + * @param ?string $before Injection of AQL-code before search + * @param int $amount Amount of markets + * @param int $page Offset by amount + * @param array $errors Errors registry + * + * @return array Instances from ArangoDB + */ + public static function markets( + ?string $before = '', + int $amount = 100, + int $page = 1, + string $sort = 'market.created DESC', + array &$errors = [] + ): array { + try { + if (collection::init(static::$arangodb->session, account::COLLECTION) && collection::init(static::$arangodb->session, market::COLLECTION)) { + // Инициализированы коллекции + + // Search the session data in ArangoDB + $markets = collection::search(static::$arangodb->session, sprintf( + << $e->getMessage(), + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'stack' => $e->getTrace() + ]; + } + + // Exit (fail) + return []; + } +} diff --git a/mirzaev/ebala/system/models/task.php b/mirzaev/ebala/system/models/task.php index 27fed52..eb3c922 100755 --- a/mirzaev/ebala/system/models/task.php +++ b/mirzaev/ebala/system/models/task.php @@ -149,7 +149,7 @@ final class task extends core self::COLLECTION, $before, 'worker', - 'markets', + 'market', $after, $sort, --$page <= 0 ? 0 : $amount * $page, diff --git a/mirzaev/ebala/system/models/worker.php b/mirzaev/ebala/system/models/worker.php index a9853a0..82ab627 100755 --- a/mirzaev/ebala/system/models/worker.php +++ b/mirzaev/ebala/system/models/worker.php @@ -61,62 +61,6 @@ final class worker extends core } } - /** - * Read workers from ArangoDB - * - * @param ?string $before Injection of AQL-code before search of worker and market - * @param int $amount Amount of workers - * @param int $page Offset by amount - * @param array $errors Errors registry - * - * @return array Instances from ArangoDB - */ - public static function list( - ?string $before = '', - int $amount = 100, - int $page = 1, - string $sort = 'worker.created DESC', - array &$errors = [] - ): array { - try { - if (collection::init(static::$arangodb->session, self::COLLECTION)) { - // Инициализирована коллекция - - // Search the session data in ArangoDB - $workers = collection::search(static::$arangodb->session, sprintf( - << $e->getMessage(), - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'stack' => $e->getTrace() - ]; - } - - // Exit (fail) - return []; - } - - /** * Записать * diff --git a/mirzaev/ebala/system/public/css/list.css b/mirzaev/ebala/system/public/css/list.css index 8e517dc..af7cc95 100755 --- a/mirzaev/ebala/system/public/css/list.css +++ b/mirzaev/ebala/system/public/css/list.css @@ -50,6 +50,10 @@ section.panel.list > form.row.menu.stretched > label > input[type="search"] { flex-grow: 1; } +section.panel.list > form.row.menu.stretched > label > button { + max-width: 250px; +} + section.panel.list > form.row.menu > label > input { padding: 0 10px; } diff --git a/mirzaev/ebala/system/public/css/pages/markets.css b/mirzaev/ebala/system/public/css/pages/markets.css new file mode 100755 index 0000000..2e29afe --- /dev/null +++ b/mirzaev/ebala/system/public/css/pages/markets.css @@ -0,0 +1,66 @@ +section#markets.panel.list + > div.row:nth-of-type(1) + > span[data-column="end"] + > i.home { + margin-top: 5px; + height: 12px; +} + +section#markets.panel.list + > div.row + > span:is( + [data-column="id"], + [data-column="director"], + [data-column="address"], + [data-column="type"], + [data-column="commentary"], + [data-column="status"], + ) { + min-width: 220px; + width: 220px; + display: ruby; + text-overflow: ellipsis; + overflow: hidden; +} + +section#markets.panel.list > div.row > span[data-column="id"] { + min-width: 67px; + width: 67px; + font-weight: bold; +} + +section#markets.panel.list > div.row:nth-of-type(1) > span[data-column="id"] { + margin-top: 8px; +} + +section#markets.panel.list > div.row > span[data-column="director"] { + min-width: 400px; + width: 400px; +} + +section#markets.panel.list > div.row > span[data-column="address"] { + min-width: 450px; + width: 450px; +} + +section#markets.panel.list > div.row:not(:nth-of-type(1)) > span[data-column="type"] { + text-align: center; +} + +section#markets.panel.list > div.row > span[data-column="type"] { + min-width: 80px; + width: 80px; + font-size: small; +} + +section#markets.panel.list > div.row > span[data-column="commentary"] { + min-width: unset; + width: 100%; +} + +section#markets.panel.list > div.row > span[data-column="status"] { + min-width: 100px; + width: 100px; + font-size: small; + text-align: center; +} diff --git a/mirzaev/ebala/system/public/css/pages/operators.css b/mirzaev/ebala/system/public/css/pages/operators.css new file mode 100755 index 0000000..398b375 --- /dev/null +++ b/mirzaev/ebala/system/public/css/pages/operators.css @@ -0,0 +1,94 @@ +section#operators.panel.list + > div.row:nth-of-type(1) + > span[data-column="end"] + > i.home { + margin-top: 5px; + height: 12px; +} + +section#operators.panel.list + > div.row + > span:is( + [data-column="id"], + [data-column="name"], + [data-column="birth"], + [data-column="number"], + [data-column="passport"], + [data-column="department"], + [data-column="city"], + [data-column="address"], + [data-column="requisites"], + [data-column="tax"], + [data-column="commentary"], + [data-column="status"], + ) { + min-width: 220px; + width: 220px; + display: ruby; + text-overflow: ellipsis; + overflow: hidden; +} + +section#operators.panel.list > div.row > span[data-column="id"] { + min-width: 67px; + width: 67px; + font-weight: bold; +} + +section#operators.panel.list > div.row:nth-of-type(1) > span[data-column="id"] { + margin-top: 8px; +} + +section#operators.panel.list > div.row > span[data-column="name"] { + min-width: 200px; + width: 200px; +} + +section#operators.panel.list > div.row > span[data-column="birth"] { + min-width: 80px; + width: 80px; + font-size: small; +} + +section#operators.panel.list > div.row > span[data-column="number"] { + min-width: 120px; + width: 120px; +} + +section#operators.panel.list > div.row > span[data-column="passport"] { + min-width: 150px; + width: 150px; +} + +section#operators.panel.list > div.row > span[data-column="city"] { + min-width: 90px; + width: 90px; +} + +section#operators.panel.list > div.row > span[data-column="address"] { + min-width: 180px; + width: 180px; +} + +section#operators.panel.list > div.row > span[data-column="requisites"] { + min-width: 180px; + width: 180px; +} + +section#operators.panel.list > div.row > span[data-column="tax"] { + min-width: 55px; + width: 55px; + font-size: small; +} + +section#operators.panel.list > div.row > span[data-column="commentary"] { + min-width: unset; + width: 100%; +} + +section#operators.panel.list > div.row > span[data-column="status"] { + min-width: 100px; + width: 100px; + font-size: small; + text-align: center; +} diff --git a/mirzaev/ebala/system/public/css/pages/workers.css b/mirzaev/ebala/system/public/css/pages/workers.css index 29e3cd0..15b7b80 100755 --- a/mirzaev/ebala/system/public/css/pages/workers.css +++ b/mirzaev/ebala/system/public/css/pages/workers.css @@ -40,8 +40,8 @@ section#workers.panel.list > div.row:nth-of-type(1) > span[data-column="id"] { } section#workers.panel.list > div.row > span[data-column="name"] { - min-width: 200px; - width: 200px; + min-width: 180px; + width: 180px; } section#workers.panel.list > div.row > span[data-column="birth"] { @@ -91,3 +91,7 @@ section#workers.panel.list > div.row > span[data-column="status"] { width: 100px; font-size: small; } + +section#workers.panel.list > div.row:not(:nth-of-type(1)) > span[data-column="status"] { + text-align: center; +} diff --git a/mirzaev/ebala/system/public/index.php b/mirzaev/ebala/system/public/index.php index 3c26d8a..3867ec2 100755 --- a/mirzaev/ebala/system/public/index.php +++ b/mirzaev/ebala/system/public/index.php @@ -35,10 +35,16 @@ $router = new router; // Запись маршрутов $router->write('/', 'index', 'index', 'GET'); $router->write('/', 'index', 'index', 'POST'); +$router->write('/worker/$worker/read', 'task', 'worker', 'POST'); $router->write('/workers', 'worker', 'index', 'GET'); $router->write('/workers', 'worker', 'index', 'POST'); +$router->write('/workers/read', 'worker', 'read', 'POST'); +$router->write('/workers/list', 'worker', 'datalist', 'POST'); +$router->write('/market/$market/read', 'task', 'market', 'POST'); $router->write('/markets', 'market', 'index', 'GET'); $router->write('/markets', 'market', 'index', 'POST'); +$router->write('/markets/read', 'market', 'read', 'POST'); +$router->write('/markets/list', 'market', 'datalist', 'POST'); $router->write('/operators', 'operator', 'index', 'GET'); $router->write('/operators', 'operator', 'index', 'POST'); $router->write('/administrators', 'administrators', 'index', 'GET'); @@ -70,11 +76,6 @@ $router->write('/task/$task/description', 'task', 'description', 'POST'); $router->write('/task/$task/commentary', 'task', 'commentary', 'POST'); $router->write('/task/$task/worker/update', 'task', 'update', 'POST'); $router->write('/task/$task/market/update', 'task', 'update', 'POST'); -$router->write('/worker/$worker/read', 'task', 'worker', 'POST'); -$router->write('/workers/read', 'worker', 'read', 'POST'); -$router->write('/workers/list', 'worker', 'datalist', 'POST'); -$router->write('/market/$market/read', 'task', 'market', 'POST'); -$router->write('/markets/list', 'market', 'datalist', 'POST'); $router->write('/elements/menu', 'index', 'menu', 'POST'); // Инициализация ядра diff --git a/mirzaev/ebala/system/public/js/loader.js b/mirzaev/ebala/system/public/js/loader.js index 6e4d7ca..afa3e97 100755 --- a/mirzaev/ebala/system/public/js/loader.js +++ b/mirzaev/ebala/system/public/js/loader.js @@ -77,6 +77,13 @@ if (typeof window.loader !== "function") { }) .then((response) => response.text()) .then((data) => { + // Write path in history + history.pushState(this.storage, "/administrators", "/administrators"); + + // Write path to the current directory buffer + core.page = 'administrators'; + + // Write content in document document.body.getElementsByTagName("main")[0].innerHTML = data; }); } @@ -95,6 +102,13 @@ if (typeof window.loader !== "function") { }) .then((response) => response.text()) .then((data) => { + // Write path in history + history.pushState(this.storage, "/operators", "/operators"); + + // Write path to the current directory buffer + core.page = 'operators'; + + // Write content in document document.body.getElementsByTagName("main")[0].innerHTML = data; }); } @@ -112,6 +126,13 @@ if (typeof window.loader !== "function") { }) .then((response) => response.text()) .then((data) => { + // Write path in history + history.pushState(this.storage, "/markets", "/markets"); + + // Write path to the current directory buffer + core.page = 'markets'; + + // Write content in document document.body.getElementsByTagName("main")[0].innerHTML = data; }); } @@ -176,6 +197,13 @@ if (typeof window.loader !== "function") { }) .then((response) => response.text()) .then((data) => { + // Write path in history + history.pushState(this.storage, "/account", "/account"); + + // Write path to the current directory buffer + core.page = 'account'; + + // Write content in document document.body.getElementsByTagName("main")[0].innerHTML = data; }); } diff --git a/mirzaev/ebala/system/public/js/markets.js b/mirzaev/ebala/system/public/js/markets.js index 2ee658f..a460c50 100644 --- a/mirzaev/ebala/system/public/js/markets.js +++ b/mirzaev/ebala/system/public/js/markets.js @@ -5,6 +5,1048 @@ if (typeof window.markets !== "function") { // Initialize of the class in global namespace window.markets = class markets { + /** + * Заблокировать функцию закрытия всплывающего окна? + */ + static freeze = false; + + /** + * Тело всплывающего окна (массив) + */ + static body = {}; + + /** + * Инициализирован класс? + */ + static initialized = false; + + /** + * Ожидание зависимости: ядро + * + * @param {function} execute Функция, которая будет встроена в демпфер + * @param {mixed} args Аргументы встраиваемой функции + * + * @return {void} + */ + static core(execute, ...args) { + if (typeof execute === "function") { + // Получена функция + + // Инициализация интервала для ожидания загрузки зависимостей + const interval = setInterval(() => { + if (typeof core === "function") { + // Инициализировано ядро + + // Деинициализация интервала для ожидания загрузки записимостей + clearInterval(interval); + + // Запуск выполнения + return execute(...args); + } + }, 100); + + // Инициализация деинициализации интервала для ожидания загрузки зависимостей спустя большой срок времени + setTimeout(() => clearInterval(interval), 3000); + } + } + + /** + * Ожидание зависимости: демпфер + * + * @param {function} execute Функция, которая будет встроена в демпфер + * @param {number} timer Количество миллисекунд для демпфера + * @param {mixed} args Аргументы встраиваемой функции + * + * @return {void} + */ + static damper(execute, timer = 3000, ...args) { + if (typeof execute === "function") { + // Получена функция + + // Инициализация интервала для ожидания загрузки зависимостей + const interval = setInterval(() => { + if (typeof damper === "function") { + // Инициализирован демпфер + + // Деинициализация интервала для ожидания загрузки записимостей + clearInterval(interval); + + // Запуск выполнения + return damper(() => execute(...args), timer); + } + }, 100); + + // Инициализация деинициализации интервала для ожидания загрузки зависимостей спустя большой срок времени + setTimeout(() => clearInterval(interval), 3000); + } + } + + /** + * Авторизация + * + * @param {function} execute Функция, которая будет встроена в демпфер + * @param {mixed} args Аргументы встраиваемой функции + * + * @return {void} + */ + static authorization(execute, ...args) { + if (typeof execute === "function") { + // Получена функция + + if (core.page === this.page) { + // Пройдена проверка на страницу + + // Запуск выполнения + return execute(...args); + } + } + } + + /** + * Создать заявку + * + * @param {HTMLElement} cashiers Количество кассиров + * @param {HTMLElement} displayers Количество выкладчиков + * @param {HTMLElement} loaders Количество грузчиков + * @param {HTMLElement} gastronomes Количество гастрономов + * @param {HTMLElement} start Начало работы (00:00) + * @param {HTMLElement} end Конец работы (00:00) + * @param {HTMLElement} date Дата работы (d.m.Y) + * @param {HTMLElement} button Кнопка создания заявки - - - -
- ФИО - Дата - Номер - Паспорт + Директор Адрес - ИНН - Реквизиты + Тип Комментарий Статус
@@ -79,7 +53,7 @@ // Не выполнялся скрипт document.addEventListener('markets.initialized', (e) => { - // Инициализированы сотрудники + // Инициализированы магазины // Инициализация допустимой страницы для выполнения e.detail.markets.page = 'markets'; diff --git a/mirzaev/ebala/system/views/pages/operators.html b/mirzaev/ebala/system/views/pages/operators.html new file mode 100644 index 0000000..acbcb05 --- /dev/null +++ b/mirzaev/ebala/system/views/pages/operators.html @@ -0,0 +1,92 @@ +{% extends('index.html') %} + +{% block css %} + + + + + + + + + +{% endblock %} + +{% block body %} +
+ + + +
+ + ФИО + Адрес + Тип + Комментарий + Статус +
+
+ + +{% endblock %} + +{% block js %} + + +{% endblock %}