Обновление панели аутентификации и отображения товаров в заказах

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-07-30 20:43:37 +10:00
parent 8270eaed11
commit d087256181
13 changed files with 312 additions and 181 deletions

View File

@ -99,9 +99,9 @@ $config = [
'profile/geolocation/<action:(init)>' => 'profile/geolocation-<action>', 'profile/geolocation/<action:(init)>' => 'profile/geolocation-<action>',
'orders' => 'order/index', 'orders' => 'order/index',
'orders/<type:[^/]+>' => 'order/index', 'orders/<type:[^/]+>' => 'order/index',
'orders/<_key:[^/]+>/<action:(accept)>' => 'order/<action>', 'orders/<catn:[^/]+>/<action:(accept)>' => 'order/<action>',
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>' => 'order/supply-<action>', 'orders/supply/<catn:[^/]+>/<action:(read|write|edit|delete)>' => 'order/supply-<action>',
'orders/supply/<_key:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>', 'orders/supply/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>',
'invoices/<order:[^/]+>' => 'invoice/index', 'invoices/<order:[^/]+>' => 'invoice/index',
'invoices/<order:[^/]+>/<action:(download)>' => 'invoice/<action>', 'invoices/<order:[^/]+>/<action:(download)>' => 'invoice/<action>',
'verify/send' => 'verify/send', 'verify/send' => 'verify/send',

View File

@ -44,11 +44,14 @@ class AuthenticationController extends Controller
// Фильтрация // Фильтрация
$target = match ($target) { $target = match ($target) {
'menu' => 'menu', 'panel' => 'panel',
'main' => 'main', 'main' => 'main',
default => 'main' default => 'main'
}; };
// Рендер для всплывающей панели
$panel = $target === 'panel';
if (yii::$app->request->isPost) { if (yii::$app->request->isPost) {
// AJAX-POST-запрос // AJAX-POST-запрос
@ -72,15 +75,13 @@ class AuthenticationController extends Controller
// Инициализация // Инициализация
$notifications_button = $this->renderPartial('/notification/button'); $notifications_button = $this->renderPartial('/notification/button');
$notifications_panel_full = true; $notifications_panel = $this->renderPartial('/notification/panel', ['notifications_panel_full' => true]);
$notifications_panel = $this->renderPartial('/notification/panel', compact('notifications_panel_full'));
// Запись ответа // Запись ответа
$return = [ $return = [
$target => $this->renderPartial('/account/panel/authenticated', compact( 'menu' => $this->renderPartial('/account/panel/authenticated', compact(
'notifications_button', 'notifications_button',
'notifications_panel', 'notifications_panel'
'notifications_panel_full'
)), )),
'_csrf' => yii::$app->request->getCsrfToken() '_csrf' => yii::$app->request->getCsrfToken()
]; ];
@ -131,7 +132,7 @@ class AuthenticationController extends Controller
yii::$app->response->statusCode = 400; yii::$app->response->statusCode = 400;
return [ return [
$target => $this->renderPartial('/account/index', compact('model')), $target => $this->renderPartial('/account/index', compact('model', 'panel')),
'redirect' => '/authentication', 'redirect' => '/authentication',
'_csrf' => yii::$app->request->getCsrfToken() '_csrf' => yii::$app->request->getCsrfToken()
]; ];
@ -141,7 +142,7 @@ class AuthenticationController extends Controller
if (!yii::$app->user->isGuest) { if (!yii::$app->user->isGuest) {
yii::$app->response->redirect('/'); yii::$app->response->redirect('/');
} else { } else {
return $this->render('/account/index'); return $this->render('/account/index', compact('model', 'panel'));
} }
} }
} }

View File

@ -19,6 +19,7 @@ use app\models\connection\Dellin;
use app\models\Invoice; use app\models\Invoice;
use app\models\Notification; use app\models\Notification;
use app\models\Settings; use app\models\Settings;
use app\models\Supply;
use app\models\SupplyEdgeProduct; use app\models\SupplyEdgeProduct;
use Codeception\PHPUnit\ResultPrinter\HTML; use Codeception\PHPUnit\ResultPrinter\HTML;
@ -561,15 +562,20 @@ class OrderController extends Controller
/** /**
* Чтение инстанции поставки в заказе (order_edge_supply) * Чтение инстанции поставки в заказе (order_edge_supply)
* *
* @param int $_key Ключ записи в коллекции order_edge_supply * @param string $catn Артикул поставки
* *
* @return string|array|null * @return string|array|null
*/ */
public function actionSupplyRead(int $_key): string|array|null public function actionSupplyRead(string $catn): string|array|null
{ {
// Инициализация // Инициализация
$buffer = []; $buffer = [];
if ($supply = OrderEdgeSupply::searchBySupplyCatn($catn)) {
// Удалось найти инстанцию поставки
}
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) { if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) {
// Удалось найти инстанцию поставки // Удалось найти инстанцию поставки
@ -661,17 +667,24 @@ class OrderController extends Controller
/** /**
* Запись статуса поставки в заказе (order_edge_supply) * Запись статуса поставки в заказе (order_edge_supply)
* *
* @param int $_key Ключ записи в коллекции order_edge_supply * @param string $catn Артикул поставки
* *
* @return string|array|null * @return string|array|null
*/ */
public function actionSupplyWriteStts(int $_key): string|array|null public function actionSupplyWriteStts(string $catn): string|array|null
{ {
// Инициализация // Инициализация
$stts = yii::$app->request->post('stts') ?? yii::$app->request->get('stts'); $stts = yii::$app->request->post('stts') ?? yii::$app->request->get('stts') ?? '';
$buffer = []; $buffer = [];
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) { if ($supply = OrderEdgeSupply::searchBySupplyCatn($_id = Supply::collectionName() . '/' . $catn)) {
// Удалось найти инстанцию поставки
var_dump($supply);
}
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $catn)) {
// Удалось найти инстанцию поставки // Удалось найти инстанцию поставки
// Запись в буфер изначальных данных // Запись в буфер изначальных данных
@ -711,17 +724,17 @@ class OrderController extends Controller
/** /**
* Запись цены поставки в заказе (order_edge_supply) * Запись цены поставки в заказе (order_edge_supply)
* *
* @param int $_key Ключ записи в коллекции order_edge_supply * @param string $catn Артикул поставки
* *
* @return string|array|null * @return string|array|null
*/ */
public function actionSupplyEditCost(int $_key): string|array|null public function actionSupplyEditCost(int $catn): string|array|null
{ {
// Инициализация // Инициализация
$cost = yii::$app->request->post('cost') ?? yii::$app->request->get('cost'); $cost = yii::$app->request->post('cost') ?? yii::$app->request->get('cost');
$buffer = []; $buffer = [];
if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $_key)) { if ($order_edge_supply = OrderEdgeSupply::searchById($_id = OrderEdgeSupply::collectionName() . '/' . $catn)) {
// Удалось найти инстанцию поставки // Удалось найти инстанцию поставки
// Запись в буфер изначальных данных // Запись в буфер изначальных данных

View File

@ -19,16 +19,24 @@ class RegistrationController extends Controller
// Инициализация // Инициализация
$model = new AccountForm(yii::$app->request->post('AccountForm') ?? yii::$app->request->get('AccountForm')); $model = new AccountForm(yii::$app->request->post('AccountForm') ?? yii::$app->request->get('AccountForm'));
$type = yii::$app->request->post('type') ?? yii::$app->request->get('type'); $type = yii::$app->request->post('type') ?? yii::$app->request->get('type');
$target = yii::$app->request->post('target') ?? yii::$app->request->get('target');
$model->scenario = $model::SCENARIO_REGISTRATION; $model->scenario = $model::SCENARIO_REGISTRATION;
// Фильтрация
$target = match ($target) {
'panel' => 'panel',
'main' => 'main',
default => 'main'
};
// Рендер для всплывающей панели
$panel = $target === 'panel';
if (yii::$app->request->isPost) { if (yii::$app->request->isPost) {
// POST-запрос // POST-запрос
yii::$app->response->format = Response::FORMAT_JSON; yii::$app->response->format = Response::FORMAT_JSON;
// Валидация формы
if (!empty($errors = ActiveForm::validate($model))) return $errors;
if ($type === 'registration' && (!yii::$app->user->isGuest || $model->registration())) { if ($type === 'registration' && (!yii::$app->user->isGuest || $model->registration())) {
// Данные прошли проверку и аккаунт был создан // Данные прошли проверку и аккаунт был создан
@ -43,7 +51,7 @@ class RegistrationController extends Controller
$model->scenario = $model::SCENARIO_REGISTRATION; $model->scenario = $model::SCENARIO_REGISTRATION;
return [ return [
'main' => $this->renderPartial('/account/index', compact('model') + ['registration' => true]), $target => $this->renderPartial('/account/index', compact('model', 'panel') + ['registration' => true]),
'redirect' => '/registration', 'redirect' => '/registration',
'_csrf' => yii::$app->request->getCsrfToken() '_csrf' => yii::$app->request->getCsrfToken()
]; ];
@ -51,8 +59,7 @@ class RegistrationController extends Controller
// Инициализация // Инициализация
$notifications_button = $this->renderPartial('/notification/button'); $notifications_button = $this->renderPartial('/notification/button');
$notifications_panel_full = true; $notifications_panel = $this->renderPartial('/notification/panel', ['notifications_panel_full' => true]);
$notifications_panel = $this->renderPartial('/notification/panel', compact('notifications_panel_full'));
// Запись ответа // Запись ответа
$return = [ $return = [
@ -108,7 +115,7 @@ class RegistrationController extends Controller
yii::$app->response->statusCode = 400; yii::$app->response->statusCode = 400;
return [ return [
'main' => $this->renderPartial('/account/index', compact('model') + ['registration' => true]), $target => $this->renderPartial('/account/index', compact('model', 'panel') + ['registration' => true]),
'redirect' => '/registration', 'redirect' => '/registration',
'_csrf' => yii::$app->request->getCsrfToken() '_csrf' => yii::$app->request->getCsrfToken()
]; ];
@ -118,7 +125,7 @@ class RegistrationController extends Controller
if (!yii::$app->user->isGuest) { if (!yii::$app->user->isGuest) {
yii::$app->response->redirect('/'); yii::$app->response->redirect('/');
} else { } else {
return $this->render('/account/index', compact('model') + ['registration' => true]); return $this->render('/account/index', compact('model', 'panel') + ['registration' => true]);
} }
} }
} }

View File

@ -337,6 +337,17 @@ class Order extends Document implements DocumentInterface
return $limit === 1 ? $return[0] ?? null : $return; return $limit === 1 ? $return[0] ?? null : $return;
} }
// /**
// * Объеденить дубликаты поставок
// *
// * @return array Данные заказа
// */
// public function mergeDuplicateSupplies(array $order): array {
// foreach ($orders as $order) {
// }
// }
/** /**
* Поиск содержимого заказа * Поиск содержимого заказа
* *
@ -444,6 +455,7 @@ class Order extends Document implements DocumentInterface
foreach ($connections as &$connection_for_check) { foreach ($connections as &$connection_for_check) {
if ($connection == $connection_for_check) { if ($connection == $connection_for_check) {
// Найден дубликат // Найден дубликат
// Запись в реестр // Запись в реестр
$registry[$key] = [ $registry[$key] = [
'catn' => $connection_for_check['supply']['catn'], 'catn' => $connection_for_check['supply']['catn'],
@ -456,7 +468,6 @@ class Order extends Document implements DocumentInterface
$connection['amount'] = count($connection['order_edge_supply']); $connection['amount'] = count($connection['order_edge_supply']);
} }
// Инициализация дополнительных данных // Инициализация дополнительных данных
foreach ($connections as $key => &$connection) { foreach ($connections as $key => &$connection) {
// Перебор поставок // Перебор поставок
@ -620,6 +631,27 @@ class Order extends Document implements DocumentInterface
return $connections; return $connections;
} }
/**
* Проверка на то, что все поставки подтверждены
*
* @param array $order_edge_supply Поставки
*
* @return bool Статус подтверждения всех поставок (true если все и false если хотя бы одна из них не подтверждена)
*/
public static function checkSuppliesStts(array $order_edge_supply): bool {
foreach ($order_edge_supply as $edge) {
// Перебор поставок
if (empty($edge['stts']) || $edge['stts'] !== 'accepted') {
// Найдена неподтверждённая поставка
return false;
}
}
return true;
}
/** /**
* @return DocumentInterface[] * @return DocumentInterface[]
*/ */

View File

@ -19,12 +19,12 @@ use app\models\AccountForm;
<?php <?php
// Инициализация идентификатора формы // Инициализация идентификатора формы
if ($isPopupMenu ?? false) { if ($panel ?? false) {
// Генерация документа во всплывающем меню // Генерация документа во всплывающем меню
// Инициализация параметров // Инициализация параметров
$form_id = 'form_account_menu'; $form_id = 'form_account_panel';
$target = 'menu'; $target = 'panel';
} else { } else {
// Генерация документа в основном блоке страницы // Генерация документа в основном блоке страницы
@ -54,21 +54,21 @@ use app\models\AccountForm;
?> ?>
<?php if ($registration ?? false) : ?> <?php if ($registration ?? false) : ?>
<?php if ($isPopupMenu ?? false) : ?> <?php if ($panel ?? false) : ?>
<h5 class="mb-4 text-center">Регистрация</h5> <h5 class="mb-4 text-center">Регистрация</h5>
<?php else : ?> <?php else : ?>
<h3 class="mb-4 text-center">Регистрация</h3> <h3 class="mb-4 text-center">Регистрация</h3>
<?php endif ?> <?php endif ?>
<?php else : ?> <?php else : ?>
<?php if ($isPopupMenu ?? false) : ?> <?php if ($panel ?? false) : ?>
<h5 class="mb-4 text-center">Аутентификация</h5> <h5 class="mb-4 text-center">Аутентификация</h5>
<?php else : ?> <?php else : ?>
<h3 class="mb-4 text-center">Аутентификация</h3> <h3 class="mb-4 text-center">Аутентификация</h3>
<?php endif ?> <?php endif ?>
<?php endif ?> <?php endif ?>
<?= $form->field($model, 'mail', ['enableLabel' => false, 'options' => ['class' => 'mb-2'], 'errorOptions' => ['class' => 'help-block help-block-error px-2 small']])->textInput(['autofocus' => true, 'placeholder' => $model->getAttributeLabel('mail')]) ?> <?= $form->field($model, 'mail', ['enableLabel' => false, 'options' => ['class' => 'mb-2'], 'inputOptions' => ['class' => 'form-control button_clean', 'errorOptions' => ['class' => 'help-block help-block-error px-2 small']]])->textInput(['autofocus' => true, 'placeholder' => $model->getAttributeLabel('mail')]) ?>
<?= $form->field($model, 'pswd', ['enableLabel' => false, 'errorOptions' => ['class' => 'help-block help-block-error px-2 small']])->passwordInput(['placeholder' => $model->getAttributeLabel('pswd')]) ?> <?= $form->field($model, 'pswd', ['enableLabel' => false, 'inputOptions' => ['class' => 'form-control button_clean'], 'errorOptions' => ['class' => 'help-block help-block-error px-2 small']])->passwordInput(['placeholder' => $model->getAttributeLabel('pswd')]) ?>
<div class="d-flex mb-2 mt-4"> <div class="d-flex mb-2 mt-4">
<?= Html::submitButton('Войти', ['name' => 'submitAuthentication', 'onclick' => 'authentication(this.parentElement.parentElement, \'' . $target . '\');', 'class' => 'flex-grow-1 mr-2 btn btn-primary button_clean']) ?> <?= Html::submitButton('Войти', ['name' => 'submitAuthentication', 'onclick' => 'authentication(this.parentElement.parentElement, \'' . $target . '\');', 'class' => 'flex-grow-1 mr-2 btn btn-primary button_clean']) ?>
@ -77,7 +77,7 @@ use app\models\AccountForm;
'{endLabel}</div>'])->checkbox()->label($model->getAttributeLabel('auto'), ['class' => 'w-100 m-0']) ?> '{endLabel}</div>'])->checkbox()->label($model->getAttributeLabel('auto'), ['class' => 'w-100 m-0']) ?>
</div> </div>
<?= Html::submitButton('Регистрация', ['name' => 'submitRegistration', 'onclick' => 'return registration_start(this.parentElement);', 'class' => 'col-12 ml-auto btn btn-success btn-sm button_clean']) ?> <?= Html::submitButton('Регистрация', ['name' => 'submitRegistration', 'onclick' => 'return registration_start(this.parentElement, \'' . $target . '\');', 'class' => 'col-12 ml-auto btn btn-success btn-sm button_clean']) ?>
<?php <?php
@ -90,18 +90,29 @@ use app\models\AccountForm;
<?php if ($registration ?? false) : ?> <?php if ($registration ?? false) : ?>
<script defer> <script defer>
if (document.readyState === "complete") { // Инициализация формы
let form = document.getElementById('<?= $form_id ?>'); let form = document.getElementById('<?= $form_id ?>');
// Запуск программы регистрации
registration_start(form, 'panel');
if (document.readyState === "complete") {
// Документ загружен
// Обработчик события инициализации
$(form).on('afterInit', function(e) { $(form).on('afterInit', function(e) {
registration_start(form); // Запуск программы регистрации
registration_start(form, 'panel');
}); });
} else { } else {
document.addEventListener('DOMContentLoaded', function() { // Документ не загружен
let form = document.getElementById('<?= $form_id ?>');
// Обработчик события загрузки документа
document.addEventListener('DOMContentLoaded', function() {
// Обработчик события инициализации
$(form).on('afterInit', function(e) { $(form).on('afterInit', function(e) {
registration_start(form); // Запуск программы регистрации
registration_start(form, 'panel');
}); });
}, false); }, false);
} }

View File

@ -6,14 +6,14 @@ use yii;
?> ?>
<?=$notifications_button?> <?= $notifications_button ?>
<?=$notifications_panel?> <?= $notifications_panel ?>
<a class="text-dark my-auto mr-2" title="Корзина" href="/cart" role="button" onclick="return page_cart();"><i class="fas fa-shopping-cart mx-2"></i></a> <a class="text-dark my-auto mr-2" title="Корзина" href="/cart" role="button" onclick="return page_cart();"><i class="fas fa-shopping-cart mx-2"></i></a>
<a class="text-dark my-auto mr-2" title="Заказы" href="/orders" role="button" onclick="return page_orders();"><i class="fas fa-list mx-2"></i></a> <a class="text-dark my-auto mr-2" title="Заказы" href="/orders" role="button" onclick="return page_orders();"><i class="fas fa-list mx-2"></i></a>
<div class="btn-group my-auto"> <div class="btn-group my-auto">
<a class="btn m-0 px-0 text-dark button_clean" title="Личный кабинет" href="/profile" role="button" onclick="return page_profile();"><b><?= yii::$app->user->identity->mail ?></b></a> <a class="btn m-0 px-0 text-dark button_clean" title="Личный кабинет" href="/profile" role="button" onclick="return page_profile();"><b><?= yii::$app->user->identity->mail ?></b></a>
<button id="profile_button" class="btn button_clean_full pr-0 dropdown-toggle dropdown-toggle-split button_clean" type="button" data-toggle="dropdown" onmouseover="$('#profile_button').dropdown('show')"></button> <button id="menu_auth_panel_button" class="pr-0 btn button_clean button_clean_full" type="button" onclick="return deauthentication();" title="Выход"><i class="fas fa-sign-out-alt"></i></button>
<div id="profile_button_panel" class="dropdown-menu dropdown-menu-right py-1" aria-labelledby="profile_button" onmouseout="$('#profile_button').dropdown('show')"> <!-- <div id="menu_auth_panel" class="py-1 text-center d-none">
<a class="dropdown-item button_white text-dark" onclick="deauthentication()">Выход (<?= yii::$app->user->identity->mail ?>)</a> <a class="py-1 px-3 d-block button_white text-dark" onclick="return deauthentication();"><b>Выход</b></a>
</div> </div> -->
</div> </div>

View File

@ -11,10 +11,9 @@ use app\models\helpers\JsManager;
<a class="text-dark my-auto mr-2" title="Заказы" href="/orders" role="button" onclick="return page_orders();"><i class="fas fa-list mx-2"></i></a> <a class="text-dark my-auto mr-2" title="Заказы" href="/orders" role="button" onclick="return page_orders();"><i class="fas fa-list mx-2"></i></a>
<div class="btn-group my-auto"> <div class="btn-group my-auto">
<a class="btn m-0 px-0 text-dark button_clean" title="Личный кабинет" href="/profile" role="button" onclick="return page_profile();">Личный кабинет</a> <a class="btn m-0 px-0 text-dark button_clean" title="Личный кабинет" href="/profile" role="button" onclick="return page_profile();">Личный кабинет</a>
<button id="profile_button" class="btn pr-0 dropdown-toggle dropdown-toggle-split button_clean" type="button" data-toggle="dropdown" onmouseover="$('#profile_button').dropdown('show')"></button> <button id="menu_auth_panel_button" class="pr-0 btn button_clean button_clean_full" type="button" onmouseover="return menu_auth_panel_show(document.getElementById('menu_auth_panel'));" onclick="return menu_auth_panel_show(document.getElementById('menu_auth_panel'));"><i class="fas fa-caret-down"></i></button>
<div id="profile_button_panel" class="dropdown-menu dropdown-menu-long dropdown-menu-right p-3" aria-labelledby="profile_button" onmouseout="$('#profile_button').dropdown('show')"> <div id="menu_auth_panel" class="p-3 d-none">
<?= yii::$app->controller->renderPartial('/account/index', compact('model') + ['isPopupMenu' => true]) ?> <?= yii::$app->controller->renderPartial('/account/index', compact('model') + ['panel' => true]) ?>
<!-- <a class="dropdown-item-text text-center px-0 py-2" href="#"><small>Восстановление пароля</small></a> -->
</div> </div>
</div> </div>

View File

@ -2,11 +2,13 @@
declare(strict_types=1); declare(strict_types=1);
use app\models\AccountEdgeOrder;
use app\models\OrderEdgeSupply;
use yii; use yii;
use yii\bootstrap\ActiveForm; use yii\bootstrap\ActiveForm;
use app\models\AccountEdgeOrder;
use app\models\Order;
use app\models\OrderEdgeSupply;
// Инициализация // Инициализация
if ( if (
!yii::$app->user->isGuest !yii::$app->user->isGuest
@ -110,18 +112,18 @@ if (
} }
} }
// Инициализация окружения
extract($supply);
?> ?>
<?php foreach ($supply['order_edge_supply'] as $part) : ?> <a id="<?= $supply['catn'] ?>_supply" class="row mb-2 p-2 px-0 rounded row_supply" type="button" onclick="return orders_supply_edit('<?= $supply['catn'] ?>', <?= $order['order']['_key'] ?>);">
<a id="<?= $part['_key'] ?>_supply" class="row p-2 px-0 rounded row_supply" type="button" onclick="return orders_supply_edit('<?= $part['_key'] ?>', <?= $order['order']['_key'] ?>);"> <img class="col-auto px-0 h-100 img-fluid rounded" src="<?= $covr ?>" />
<img class="col-auto px-0 h-100 img-fluid rounded" src="<?= $covr ?>" /> <p id="<?= $supply['catn'] ?>_supply_stts_indicator" class="col d-flex text-dark"><?= $product['catn'] . ' x' . $amount ?>
<p id="<?= $part['_key'] ?>_supply_stts_indicator" class="col d-flex text-dark"><?= $supply['product']['catn'] ?> <?php if (Order::checkSuppliesStts($order_edge_supply)) : ?>
<?php if (isset($part['stts']) && $part['stts'] == 1) : ?> <span id="<?= $supply['catn'] ?>_supply_stts_indicator_icon" class="ml-auto my-auto fas fa-check"></span>
<span id="<?= $part['_key'] ?>_supply_stts_indicator_icon" class="ml-auto my-auto fas fa-check"></span> <?php endif ?>
<?php endif ?> </p>
</p> </a>
</a>
<?php endforeach ?>
<?php if ($count++ < count($order['supplies'])) : ?> <?php if ($count++ < count($order['supplies'])) : ?>
<div class="dropdown-divider mb-2"></div> <div class="dropdown-divider mb-2"></div>
@ -205,9 +207,10 @@ if (
<input id="checkbox_cart_all" type="checkbox" onchange="return cart_list_checkbox(this);" /> <input id="checkbox_cart_all" type="checkbox" onchange="return cart_list_checkbox(this);" />
</div> --> </div> -->
<span class="col-2"><b>Артикул</b></span> <span class="col-2"><b>Артикул</b></span>
<span class="col-4"><b>Статус</b></span> <span class="col-3"><b>Статус</b></span>
<span class="col-3"><b>Поступление</b></span> <span class="col-3"><b>Поступление</b></span>
<span class="col-3"><b>Стоимость</b></span> <span class="col-2"><b>Количество</b></span>
<span class="col-2"><b>Стоимость</b></span>
</div> </div>
<?php <?php
@ -252,92 +255,92 @@ if (
// Инициализация окружения // Инициализация окружения
extract($supply); extract($supply);
foreach ($order_edge_supply as $part) { // Инициализация связи поставки с заказом (подразумевается, что все одинаковые по основным параметрам)
// Перебор связей поставок с заказом $part = $order_edge_supply[0];
// Инициализация доставки
if (isset($delivery['error'])) {
// Не удалось рассчитать доставку
// Инициализация индикатора
$date_icon = '';
// Инициализация доставки // Инициализация доставки
if (isset($delivery['error'])) { if (isset($part['date'])) {
// Не удалось рассчитать доставку // Найдены данные в инстанции поставки
// Инициализация индикатора // Запись в буфер вывода
$date_icon = ''; // $time = $part['time'] . ' дн';
$date = date('d.m.Y', $part['date']);
// Инициализация доставки $date_html = "<span class=\"m-auto\">$date</span>";
if (isset($part['date'])) {
// Найдены данные в инстанции поставки
// Запись в буфер вывода
// $time = $part['time'] . ' дн';
$date = date('d.m.Y', $part['date']);
$date_html = "<span class=\"m-auto\">$date</span>";
} else {
$date = 'Неизвестно';
$date_html = "<small class=\"m-auto\">$date</small>";
}
// Инициализация стоимости
if (isset($part['cost'])) $cost_html = '<span class="m-auto">' . ($cost = $part['cost']) . ' <small>' . $currency . '</small></span>';
else $cost_html = '<small class="m-auto">' . ($cost = 'Неизвестно') . '</small>';
} else { } else {
// Удалось рассчитать доставку $date = 'Неизвестно';
$date_html = "<small class=\"m-auto\">$date</small>";
// Инициализация типа доставки
$time_type = $part['dlvr']['type'] ?? 'auto';
// Инициализация индикатора
$date_icon = match ($time_type) {
'avia' => '<i class="ml-1 fas fa-plane"></i>',
default => '<i class="ml-1 fas fa-truck"></i>'
};
// Инициализация доставки
if (isset($part['date'])) {
// Найдены данные в инстанции поставки
// Запись в буфер вывода
// $time = $part['time'] . ' дн';
$date = date('d.m.Y', $part['date']);
$date_html = "<span class=\"m-auto\">$date</span>";
} else {
// Рассчет времени из данных поставки
try {
$time_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Exception $e) {
$time_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
// $time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
$date = date('d.m.Y', $time_converted);
$date_html = "<span class=\"m-auto\">$date</span>";
}
// Инициализация стоимости
if (isset($part['cost'])) $cost_html = '<span class="m-auto">' . ($cost = $part['cost']) . ' <small>' . $currency . '</small></span>';
else $cost_html = '<span class="m-auto">' . ($cost = $cost) . ' <small>' . $currency . '</small></span>';
} }
// Инициализация статуса связи поставки // Инициализация стоимости
$status = OrderEdgeSupply::convertStatusToRussian($part['stts'] ?? 0); if (isset($part['cost'])) $cost_html = '<span class="m-auto">' . ($cost = $part['cost']) . ' <small>' . $currency . '</small></span>';
else $cost_html = '<small class="m-auto">' . ($cost = 'Неизвестно') . '</small>';
} else {
// Удалось рассчитать доставку
// Инициализация класса для поставки (если необходимо) // Инициализация типа доставки
$css = match ($part['stts'] ?? 0) { $time_type = $part['dlvr']['type'] ?? 'auto';
'accepted', 1 => ' supply_accepted',
default => '' // Инициализация индикатора
$date_icon = match ($time_type) {
'avia' => '<i class="ml-1 fas fa-plane"></i>',
default => '<i class="ml-1 fas fa-truck"></i>'
}; };
// Пробела между supply и $css не должно быть // Инициализация доставки
$supplies_html .= <<<HTML if (isset($part['date'])) {
// Найдены данные в инстанции поставки
// Запись в буфер вывода
// $time = $part['time'] . ' дн';
$date = date('d.m.Y', $part['date']);
$date_html = "<span class=\"m-auto\">$date</span>";
} else {
// Рассчет времени из данных поставки
try {
$time_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Exception $e) {
$time_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
// $time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
$date = date('d.m.Y', $time_converted);
$date_html = "<span class=\"m-auto\">$date</span>";
}
// Инициализация стоимости
if (isset($part['cost'])) $cost_html = '<span class="m-auto">' . ($cost = $part['cost']) . ' <small>' . $currency . '</small></span>';
else $cost_html = '<span class="m-auto">' . ($cost = $cost) . ' <small>' . $currency . '</small></span>';
}
// Инициализация статуса связи поставки
$status = OrderEdgeSupply::convertStatusToRussian($part['stts'] ?? '');
// Инициализация класса для поставки (если необходимо)
$css = match ($part['stts'] ?? '') {
'accepted' => ' supply_accepted',
default => ''
};
// Пробела между supply и $css не должно быть
$supplies_html .= <<<HTML
<div class="row py-2 supply$css text-center"> <div class="row py-2 supply$css text-center">
<div class="col-2">{$supply['catn']}</div> <div class="col-2">{$supply['catn']}</div>
<div class="col-4 d-flex"><small class="m-auto">$status</small></div> <div class="col-3 d-flex"><small class="m-auto">$status</small></div>
<div class="col-3 d-flex">$date_html</div> <div class="col-3 d-flex">$date_html</div>
<div class="col-3 d-flex">$cost_html</div> <div class="col-2">$amount</div>
<div class="col-2 d-flex">$cost_html</div>
</div> </div>
HTML; HTML;
// Обновление общего счётчика цены // Обновление общего счётчика цены
$sum += (int) $cost; $sum += (int) $cost;
}
} }
} }
@ -353,9 +356,10 @@ if (
$supplies_html $supplies_html
<div class="row py-2 cart_list_target_total text-center"> <div class="row py-2 cart_list_target_total text-center">
<div class="col-2">$invoice</div> <div class="col-2">$invoice</div>
<div class="col-4"><b>$status</b></div> <div class="col-3"><b>$status</b></div>
<div class="col-3"><b>$date</b></div> <div class="col-3"><b>$date</b></div>
<div class="col-3"><b>$sum <small><b>руб</b></small></b></div> <div class="col-2"></div>
<div class="col-2"><b>$sum <small><b>руб</b></small></b></div>
</div> </div>
HTML; HTML;
} }

View File

@ -7,16 +7,15 @@ nav {
height: max-content; height: max-content;
} }
#profile_button+.dropdown-menu-long { #menu_auth_panel_button+#menu_auth_panel {
z-index: 9999;
top: 100%;
right: 0;
width: 250px; width: 250px;
} position: absolute;
background: #fff;
#profile_button+.dropdown-menu #form_account .help-block-error { border: 1px solid #ced4da;
margin-bottom: .5rem; border-radius: 3px;
}
#profile_button_panel {
z-index: 1500;
} }
.h-divider { .h-divider {

View File

@ -54,13 +54,13 @@ function deauthentication() {
}); });
}; };
function registration_start(form, type) { function registration_start(form, target = 'main') {
// Инициализация постфикса // // Инициализация постфикса
let postfix = ''; // let postfix = '';
if (type === 'menu') { // if (target === 'panel') {
postfix = '-menu'; // postfix = '-panel';
} // }
// Удаление кнопок аутентификации // Удаление кнопок аутентификации
form.children[4].remove(); form.children[4].remove();
@ -89,7 +89,7 @@ function registration_start(form, type) {
// Изменение вызываемой функции // Изменение вызываемой функции
registration.setAttribute('onclick', 'return registration_end(this.parentElement);'); registration.setAttribute('onclick', 'return registration_end(this.parentElement, \'' + target + '\');');
// // Инициализация оболочки поля повтора пароля // // Инициализация оболочки поля повтора пароля
// let password_repeat_wrap = document.createElement('div'); // let password_repeat_wrap = document.createElement('div');
@ -187,7 +187,7 @@ function registration_start(form, type) {
return false; return false;
}; };
function registration_end(form) { function registration_end(form, target = 'main') {
// Инициализация // Инициализация
$(form).yiiActiveForm('init'); $(form).yiiActiveForm('init');
@ -202,10 +202,15 @@ function registration_end(form) {
form = $(form).serializeArray(); form = $(form).serializeArray();
} }
form.push({ form.push(
name: 'type', {
value: 'registration' name: 'type',
}); value: 'registration'
},
{
name: 'target',
value: target
});
$.ajax({ $.ajax({
url: '/registration', url: '/registration',
@ -256,6 +261,42 @@ function account_response(data, status, xhr) {
// reinitialization(main); // reinitialization(main);
// } // }
if (data !== undefined) {
// Получены данные с сервера
// Панель
if (data.panel !== undefined) {
// Данные с панелью переданы
// Инициализация
let panel = document.getElementById('menu_auth_panel');
if (panel !== null) {
// Панель инициализирована
// Обновление документа
panel.innerHTML = data.panel;
// Реинициализация
reinitialization(panel);
}
}
// Меню
if (data.menu !== undefined) {
// Данные с меню переданы
// Инициализация
let menu = document.getElementsByTagName('menu')[0];
// Обновление документа
menu.innerHTML = data.menu;
// Реинициализация
reinitialization(menu);
}
}
main_response(data, status, xhr); main_response(data, status, xhr);
} }
@ -269,22 +310,6 @@ function account_response_success(data, status, xhr) {
// // Обновление панели поиска // // Обновление панели поиска
// product_search(); // product_search();
if (data !== undefined) {
// Получены данные с сервера
// Меню
if (data.menu !== undefined) {
// Инициализация
let menu = document.getElementsByTagName('menu')[0];
// Обновление документа
menu.innerHTML = data.menu;
// Реинициализация
reinitialization(menu);
}
}
account_response(data, status, xhr); account_response(data, status, xhr);
} }

View File

@ -66,9 +66,48 @@ function page_orders() {
return false; return false;
}; };
function notifications() { function menu_auth_panel_show(panel) {
if (panel !== undefined) {
// Необходимые данные переданы
return false; // Отображение панели
panel.classList.remove('d-none');
// Возможность скрыть панель при клике вне её
function menu_auth_panel_hide_handler(event) {
if (panel.contains(event.target)) {
// Событие произошло по панели или элементов внутри неё
return true;
} else {
// Событие произошло вне панели
// Скрыть панель
return menu_auth_panel_hide(panel);
};
};
// Запись обработчика события
document.addEventListener('mousedown', menu_auth_panel_hide_handler);
return false;
};
return true;
};
function menu_auth_panel_hide(panel) {
if (panel !== undefined) {
// Необходимые данные переданы
// Скрытие панели
panel.classList.add('d-none');
return false;
};
return true;
}; };
function menu_responce(data, status, xhr) { function menu_responce(data, status, xhr) {

View File

@ -72,12 +72,13 @@ function orders_supply_edit(supply_key, order_key) {
data: { data: {
'_csrf': yii.getCsrfToken() '_csrf': yii.getCsrfToken()
}, },
success: function (data, statu, xhrs) { success: function (data, status, xhr) {
// Удаление индикатора загрузки // Удаление индикатора загрузки
panel.innerHTML = ''; panel.innerHTML = '';
if (data !== undefined) { if (data !== undefined) {
// Получены данные с сервера // Получены данные с сервера
// Идентификатор // Идентификатор
if (document.getElementById(supply.getAttribute('id') + '_id') === null) { if (document.getElementById(supply.getAttribute('id') + '_id') === null) {
// Инициализация контейнера // Инициализация контейнера