Работа над сайтом 19

This commit is contained in:
Arsen Mirzaev Tatyano-Muradovich 2021-08-16 03:53:25 +10:00
parent 5e01240938
commit dc30b8c6bb
24 changed files with 475 additions and 143 deletions

View File

@ -98,7 +98,7 @@ $config = [
'<section:(product|cart)>/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(title|catn|dscr|dmns|wght|image|cover|comm)>' => '<section>/<action>-<target>',
'profile/geolocation/<action:(init|write)>' => 'profile/geolocation-<action>',
'orders' => 'order/index',
'orders/<filter:[^/]+>' => 'order/index',
'orders/<type:[^/]+>' => 'order/index',
'orders/<catn:[^/]+>/<action:(accept)>' => 'order/<action>',
'orders/supply/<catn:[^/]+>/<action:(read|write|edit|delete)>' => 'order/supply-<action>',
'orders/supply/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(stts|cost|time|comm)>' => 'order/supply-<action>-<target>',

View File

@ -76,12 +76,14 @@ class AuthenticationController extends Controller
// Инициализация
$notifications_button = $this->renderPartial('/notification/button');
$notifications_panel = $this->renderPartial('/notification/panel', ['notifications_panel_full' => true]);
$cart_button = $this->renderPartial('/cart/button', ['cart_amount' => Order::count(supplies: true)]);
// Запись ответа
$return = [
'menu' => $this->renderPartial('/account/panel/authenticated', compact(
'notifications_button',
'notifications_panel'
'notifications_panel',
'cart_button'
)),
'_csrf' => yii::$app->request->getCsrfToken()
];

View File

@ -30,7 +30,8 @@ class CartController extends Controller
'roles' => ['@'],
'actions' => [
'index',
'edit-comm'
'edit-comm',
'count'
]
],
[
@ -195,4 +196,19 @@ class CartController extends Controller
return $this->redirect('/');
}
}
public function actionCount(): array|string|null
{
if (yii::$app->request->isPost) {
// POST-запрос
// Настройка типа ответа
yii::$app->response->format = Response::FORMAT_JSON;
return [
'button' => $this->renderPartial('/cart/button', ['cart_amount' => Order::count(supplies: true)]),
'_csrf' => yii::$app->request->getCsrfToken()
];
}
}
}

View File

@ -9,6 +9,7 @@ use yii\web\Controller;
use yii\web\Response;
use app\models\AccountForm;
use app\models\Order;
class IdentificationController extends Controller
{
@ -38,14 +39,15 @@ class IdentificationController extends Controller
// Инициализация
$notifications_button = $this->renderPartial('/notification/button');
$notifications_panel_full = true;
$notifications_panel = $this->renderPartial('/notification/panel', compact('notifications_panel_full'));
$notifications_panel = $this->renderPartial('/notification/panel', ['notifications_panel_full' => true]);
$cart_button = $this->renderPartial('/cart/button', ['cart_amount' => Order::count(supplies: true)]);
// Запись ответа
$return = [
'menu' => $this->renderPartial('/account/panel/authenticated', compact(
'notifications_button',
'notifications_panel'
'notifications_panel',
'cart_button'
)),
'_csrf' => yii::$app->request->getCsrfToken()
];

View File

@ -18,6 +18,7 @@ use app\models\AccountEdgeOrder;
use app\models\connection\Dellin;
use app\models\Invoice;
use app\models\Notification;
use app\models\Search;
use app\models\Settings;
use app\models\Supply;
use app\models\SupplyEdgeProduct;
@ -112,88 +113,171 @@ class OrderController extends Controller
}
}
public function actionIndex(string $filter = 'all')
public function actionIndex(string $type = 'all')
{
// Инициализация cookie
$cookies = yii::$app->response->cookies;
// Инициализация открытой панели ("Модерация", "Мои заказы")
$panel = yii::$app->request->post('panel') ?? yii::$app->request->get('panel') ?? 'orders_panel_orders';
$window = yii::$app->request->post('window') ?? yii::$app->request->get('window') ?? 'orders_panel_orders';
// Инициализация фильтра по типу
if ($filter === 'last') {
// Запрошено использование прошлых данных о фильтрации по типу
// Инициализация данных поиска
try {
if ('@last' === $search = yii::$app->request->post('search') ?? yii::$app->request->get('search')) {
// Запрошено использование прошлых данных
// Чтение сохраненных cookie с данными прошлой фильтрации по типу
$filter = $cookies->get('filter');
// Чтение сохраненных данных в cookie
$search = $cookies->get('search');
if (empty($search)) {
// Переданы неверные данные
throw new Exception("Переданы неверные данные \$search: $search", 500);
}
} else {
// Запрошен поиск
if (empty($search)) {
// Переданы неверные данные
throw new Exception("Переданы неверные данные \$search: $search", 500);
}
// Запись данных в cookie
$cookies->add(new Cookie([
'name' => 'search',
'value' => $search
]));
}
} catch (Exception $e) {
// Деинициализация (не удалять, отправляется в представление через compact)
$search = null;
} finally {
if (isset($search)) {
// Запись в историю
Search::write($search, 'order');
}
}
// Инициализация открытого окна
try {
if ('@last' === $type) {
// Запрошено использование прошлых данных
// Чтение сохраненных данных в cookie
$type = $cookies->get('type');
if (empty($type)) {
// Переданы неверные данные
throw new Exception("Переданы неверные данные \$type: $type", 500);
}
} else {
// Запрошена сортировка
// Запись cookie с данными текущей фильтрации по типу
$cookies->add(new Cookie([
'name' => 'filter',
'value' => $filter
]));
if (empty($type)) {
// Переданы неверные данные
throw new Exception("Переданы неверные данные \$type: $type", 500);
}
// Инициализация входных данных
$from = yii::$app->request->post('from') ?? yii::$app->request->get('from');
$to = yii::$app->request->post('to') ?? yii::$app->request->get('to');
// Запись данных в cookie
$cookies->add(new Cookie([
'name' => 'type',
'value' => $type
]));
}
} catch (Exception $e) {
// Реинициализация
$type = 'all';
}
// Инициализация фильтра по периоду
if (!empty($from) && !empty($to) && filter_var($from, FILTER_VALIDATE_INT) && filter_var($to, FILTER_VALIDATE_INT)) {
// Данные фильтра по периоду переданы и представляют собой целые числа (подразумевается unixtime)
// Инициализация данных периода (от)
try {
if ('@last' === $from = yii::$app->request->post('from') ?? yii::$app->request->get('from')) {
// Запрошено использование прошлых данных
// Конвертация типов
$from = (int) $from;
$to = (int) $to;
// Чтение сохраненных данных в cookie
$from = $cookies->get('from');
// Запись cookie с данными начала периода
if (empty($from) || !filter_var($from, FILTER_VALIDATE_INT)) {
// Переданы неверные данные (необходим unixtime)
throw new Exception("Переданы неверные данные \$from: $from", 500);
}
} else {
// Запрошен поиск
if (empty($from) || !filter_var($from, FILTER_VALIDATE_INT)) {
// Переданы неверные данные (необходим unixtime)
throw new Exception("Переданы неверные данные \$from: $from", 500);
}
// Запись данных в cookie
$cookies->add(new Cookie([
'name' => 'from',
'value' => $from
]));
}
} catch (Exception $e) {
// Реинициализация
$from = time() - 604800;
} finally {
// Конвертация типа
$from = (int) $from;
}
// Запись cookie с данными окончания периода
// Инициализация данных периода (до)
try {
if ('@last' === $to = yii::$app->request->post('to') ?? yii::$app->request->get('to')) {
// Запрошено использование прошлых данных
// Чтение данных в cookie
$to = $cookies->get('to');
if (empty($to) || !filter_var($to, FILTER_VALIDATE_INT)) {
// Переданы неверные данные (необходим unixtime)
throw new Exception("Переданы неверные данные \$to: $to", 500);
}
} else {
// Запрошен поиск
if (empty($to) || !filter_var($to, FILTER_VALIDATE_INT)) {
// Переданы неверные данные (необходим unixtime)
throw new Exception("Переданы неверные данные \$to: $to", 500);
}
// Запись данных в cookie
$cookies->add(new Cookie([
'name' => 'to',
'value' => $to
]));
} else {
// Некоректные данные или их отсутствие
// Чтение сохраненных cookie с данными прошлой фильтрации по периоду (начало)
$from = $cookies->get('from');
// Чтение сохраненных cookie с данными прошлой фильтрации по периоду (конец)
$to = $cookies->get('to');
if (empty($from) || empty($to) || filter_var($from, FILTER_VALIDATE_INT) || filter_var($to, FILTER_VALIDATE_INT)) {
// Каких-то cookie не оказалось, либо данные в них не подходящие, либо это первый запрос, но без фильтрации по периоду
// Реинициализация на стандартные параметры (неделя)
$from = time() - 604800;
$to = time();
} else {
// Данные в cookie найдены и подходят для выполнения
// Конвертация типов
$from = (int) $from;
$to = (int) $to;
}
} catch (Exception $e) {
// Реинициализация
$to = time();
} finally {
// Конвертация типа
$to = (int) $to;
}
// Инициализация заказов
$orders = Order::search(
type: $filter,
type: $type,
limit: 10,
page: 1,
select: '{account_edge_order, order}',
supplies: true,
from: $from,
to: $to
to: $to,
search: $search
);
// Фильтрация
if (
!yii::$app->user->isGuest
&& yii::$app->user->identity->type === 'administrator'
@ -221,7 +305,8 @@ class OrderController extends Controller
$to = DateTime::createFromFormat('U', (string) $to)->format('Y-m-d');
return [
'main' => $this->renderPartial('/orders/index', compact('orders', 'moderator_orders', 'from', 'to', 'panel')),
'main' => $this->renderPartial('/orders/index', compact('orders', 'moderator_orders', 'search', 'from', 'to', 'window')
+ ['panel' => $this->renderPartial('/orders/search/panel', ['response' => $orders[0]['supplies']])]),
'title' => 'Заказы',
'redirect' => '/orders',
'_csrf' => yii::$app->request->getCsrfToken()

View File

@ -60,12 +60,14 @@ class RegistrationController extends Controller
// Инициализация
$notifications_button = $this->renderPartial('/notification/button');
$notifications_panel = $this->renderPartial('/notification/panel', ['notifications_panel_full' => true]);
$cart_button = $this->renderPartial('/cart/button', ['cart_amount' => Order::count(supplies: true)]);
// Запись ответа
$return = [
'menu' => $this->renderPartial('/account/panel/authenticated', compact(
'notifications_button',
'notifications_panel'
'notifications_panel',
'cart_button'
)),
'_csrf' => yii::$app->request->getCsrfToken()
];

View File

@ -28,7 +28,7 @@ class Order extends Document implements DocumentInterface
/**
* Поставки для записи
*/
public array $supplies;
public array|int $supplies;
/**
* Имя коллекции
@ -261,8 +261,18 @@ class Order extends Document implements DocumentInterface
*
* @todo Привести в порядок
*/
public static function search(Account|string $account = null, string $type = 'current', int $limit = 1, int $page = 1, string $select = null, bool $supplies = false, int|null $from = null, int|null $to = null): self|array|null
{
public static function search(
Account|string $account = null,
string $type = 'current',
string|null $search = null,
int $limit = 1,
int $page = 1,
string|null $select = null,
bool $supplies = false,
int|null $from = null,
int|null $to = null,
bool $count = false
): self|int|array|null {
// Инициализация аккаунта
if (empty($account) && isset(yii::$app->user->identity)) {
// Данные не переданы
@ -322,7 +332,7 @@ class Order extends Document implements DocumentInterface
$where = "edge._to == order._id";
}
// Запрос на поиск заказов
// Поиск заказов в базе данных
$return = self::searchByEdge(
from: 'account',
to: 'order',
@ -333,9 +343,16 @@ class Order extends Document implements DocumentInterface
offset: $offset,
sort: ['DESC'],
select: $select,
direction: 'INBOUND'
direction: 'INBOUND',
count: !$supplies && $count ? true : false
);
if (!$supplies && $count) {
// Запрошен подсчет заказов
return $return;
}
if ($supplies) {
// Запрошен поиск поставок
@ -354,7 +371,13 @@ class Order extends Document implements DocumentInterface
}
// Чтение полного содержания
$container['supplies'] = $buffer->content(30);
$container['supplies'] = $buffer->content($limit, $page, $search, count: $count);
if ($count) {
// Запрошен подсчет поставок
return $container['supplies'];
}
}
}
@ -378,11 +401,19 @@ class Order extends Document implements DocumentInterface
* @todo В будущем возможно заказ не только поставок реализовать
* Переписать реестр и проверку на дубликаты, не понимаю как они работают
*/
public function content(int $limit = 1, int $page = 1): Supply|array|null
public function content(int $limit = 1, int $page = 1, string|null $search = null, bool $count = false): Supply|int|array|null
{
// Генерация сдвига по запрашиваемым данным (пагинация)
$offset = $limit * ($page - 1);
if (!empty($search)) {
// Передан поиск по продуктам в заказах
// Добавить ограничитель
$limit = 9999;
}
// Поиск по рёбрам: ЗАКАЗ -> ПОСТАВКА
$connections = Supply::searchByEdge(
from: 'order',
@ -397,10 +428,18 @@ class Order extends Document implements DocumentInterface
where: 'edge._to == supply._id',
limit: $limit,
offset: $offset,
filterStart: ['catn' => $search],
direction: 'INBOUND',
select: '{supply, order_edge_supply}'
select: '{supply, order_edge_supply}',
count: $count
);
if ($count) {
// Запрошен подсчет
return $connections;
}
// Рекурсивная фильтрации соединений
recursive_connections_filtration:
@ -838,4 +877,17 @@ class Order extends Document implements DocumentInterface
// Отправка
return Notification::_write($text, type: $type);
}
/**
* Посчитать количство заказов или количество поставок в заказах
*
* @param int $limit Ограничение
* @param bool $supplies Считать поставки в активном заказе (иначе - заказы)
*
* @return int Количество
*/
public static function count(int $limit = 500, bool $supplies = false): int
{
return self::search(supplies: $supplies, type: $supplies ? 'current' : 'all', limit: $limit, count: true);
}
}

View File

@ -35,6 +35,7 @@ class Search extends Document
parent::attributes(),
[
'text',
'type',
'ipv4',
'head'
]
@ -50,6 +51,7 @@ class Search extends Document
parent::attributeLabels(),
[
'text' => 'Текст',
'type' => 'Тип',
'ipv4' => 'IPv4',
'head' => 'Заголовки'
]
@ -86,9 +88,10 @@ class Search extends Document
* Запись
*
* @param string $text Текст запроса
* @param string $type Тип запроса
* @param Account|null $account Пользователь совершивший запрос
*/
public static function write(string $text, Account|null $account = null): ?self
public static function write(string $text, string $type = 'general', Account|null $account = null): ?self
{
// Инициализация
$vertex = new self;
@ -96,6 +99,7 @@ class Search extends Document
// Настройки
$vertex->text = $text;
$vertex->type = $type;
if ($vertex->save()) {
// Поиск записан

View File

@ -16,11 +16,6 @@ trait SearchByEdge
* Поиск через связи рёбрами с аккаунтом
*
* Аргумент $asArray и его реализацию пришлось добавить чтобы не переписывать кучу кода
*
* @param string $id Идентификатор пользователя
* @param int $limit Количество
* @param int $offset Сдвиг
* @param string $sort Сортировка
*/
public static function searchByEdge(
string $from,
@ -37,9 +32,11 @@ trait SearchByEdge
array|null $let = [],
string|array $select = null,
callable|null $handle = null,
array|null $filterStart = null,
array $params = [],
bool $asArray = true,
bool $debug = false
bool $debug = false,
bool $count = false
): mixed {
$subquery = static::find()
->params($params)
@ -65,6 +62,12 @@ trait SearchByEdge
$query->let(...$let);
}
if (!empty($filterStart)) {
// Переданы дополнительные условия фильтрации
$query->filter($filterStart, 'START_SENSETIVE');
}
// Инициализация
$request = $query
->foreach($foreach)
@ -80,7 +83,11 @@ trait SearchByEdge
}
// Запрос
if (isset($handle)) {
if ($count) {
// Запрошен подсчет
return $query->count();
} else if (isset($handle)) {
// Передана функция для постобработки
return $handle($request);

View File

@ -6,9 +6,9 @@ use yii;
?>
<?= $notifications_button ?>
<?= $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>
<?= $notifications_button ?>
<?= $cart_button ?>
<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">
<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>

View File

@ -0,0 +1,18 @@
<a id="cart_button" class="mr-2 h-100 text-dark d-flex" title="Корзина" href="/cart" onclick="return page_cart();">
<?php
if (empty($cart_amount) || $cart_amount < 1) {
// Новые уведомления не найдены
echo <<<HTML
<i class="mx-2 fas fa-shopping-cart"></i>
HTML;
} else {
// Новые уведомления найдены
echo <<<HTML
<small class="ml-2 mr-1 my-auto"><b>$cart_amount</b></small>
<i class="mr-2 my-auto fas fa-shopping-cart cart_button_active"></i>
HTML;
}
?>
</a>

View File

@ -82,7 +82,7 @@ AppAsset::register($this);
<div id="searchPanel" class="col">
<form class="d-flex catalog_search" onsubmit="return false;">
<div class="position-relative col-sm-8 col-lg-10 px-0">
<input id="search_line" type="text" class="form-control button_clean col-12 catalog_search_line button_clean" placeholder="Введите номер запчасти, например: 45223503481" oninput="$('#search_line').dropdown('hide'); product_search(this.value);" data-toggle="dropdown" aria-expanded="false" autocomplete="off">
<input id="search_line" type="text" class="form-control button_clean col-12 catalog_search_line" placeholder="Введите номер запчасти, например: 45223503481" oninput="$('#search_line').dropdown('hide'); return product_search(this.value);" data-toggle="dropdown" aria-expanded="false" autocomplete="off">
<?php
// Сделать системные настройки и по ним работать
$search_panel = yii::$app->controller->renderPartial('/search/panel', ['history' => true]);

View File

@ -1,17 +1,17 @@
<a id="notification_button" class="text-dark d-flex h-100 mr-2" title="Уведомления" role="button" data-toggle="dropdown" data-offset="-100%p + 100%" onclick="return notification_stream();">
<a id="notification_button" class="mr-2 h-100 text-dark d-flex" title="Уведомления" role="button" data-toggle="dropdown" data-offset="-100%p + 100%" onclick="return notification_stream();">
<?php
if (empty($notifications_new_amount) || $notifications_new_amount < 1) {
// Новые уведомления не найдены
echo <<<HTML
<i class="fas fa-bell my-auto mx-2"></i>
<i class="mx-2 fas fa-bell my-auto"></i>
HTML;
} else {
// Новые уведомления найдены
echo <<<HTML
<small class="my-auto ml-2 mr-1"><b>$notifications_new_amount</b></small>
<i class="fas fa-bell my-auto mr-2 notification_button_active"></i>
<small class="ml-2 mr-1 my-auto"><b>$notifications_new_amount</b></small>
<i class="mr-2 my-auto fas fa-bell notification_button_active"></i>
HTML;
}
?>

View File

@ -10,16 +10,16 @@ use app\models\Order;
use app\models\OrderEdgeSupply;
// Инициализация открытой панели
if (empty($panel)) {
if (empty($window)) {
if (
!yii::$app->user->isGuest
&& yii::$app->user->identity->type === 'administrator'
|| yii::$app->user->identity->type === 'moderator'
) {
$panel ?? $panel = 'orders_panel_moderation';
$window ?? $window = 'orders_panel_moderation';
} else {
$panel ?? $panel = 'orders_panel_orders';
$window ?? $window = 'orders_panel_orders';
}
}
@ -36,7 +36,7 @@ if (empty($panel)) {
<label class="btn button_white mb-0 mr-2" for="orders_panel_moderation">Модерация</label>
<label class="btn button_white mb-0" for="orders_panel_orders">Мои заказы</label>
</div>
<input type="radio" id="orders_panel_moderation" name="main_panel" <?= $panel === 'orders_panel_moderation' ? 'checked' : null ?> />
<input type="radio" id="orders_panel_moderation" name="main_panel" <?= $window === 'orders_panel_moderation' ? 'checked' : null ?> />
<article>
<div class="orders_panel_moderation_menu mb-3">
<label class="btn btn-sm button_white mb-0 mr-2" for="orders_panel_moderation_all">Все</label>
@ -122,7 +122,7 @@ if (empty($panel)) {
<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'] ?>);">
<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="<?= $supply['catn'] ?>_supply_stts_indicator" class="col d-flex text-dark"><?= $product['catn'] . ' x' . $amount['auto'] ?>
<?php if (Order::checkSuppliesStts($order_edge_supply)) : ?>
<span id="<?= $supply['catn'] ?>_supply_stts_indicator_icon" class="ml-auto my-auto fas fa-check"></span>
<?php endif ?>
@ -176,28 +176,41 @@ if (empty($panel)) {
<?php endif ?>
</article>
<input type="radio" id="orders_panel_orders" name="main_panel" <?= $panel === 'orders_panel_orders' ? 'checked' : null ?> />
<input type="radio" id="orders_panel_orders" name="main_panel" <?= $window === 'orders_panel_orders' ? 'checked' : null ?> />
<?php endif ?>
<article class="page_order_panel mt-3 py-3 px-4 rounded <?= $account_type ?? false ? '' : 'd-block'; ?>">
<div class="row mt-2 mb-2">
<h4 class="col ml-4"><i class="fas fa-list mr-2"></i>Заказы</h4>
<div class="col-auto orders_panel_menu ml-auto text-right">
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('all');">Все</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('requested');">Запрошенные</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('accepted');">Активные</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0" type="button" onclick="return orders_read('completed');">Завершенные</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'all');">Все</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'requested');">Запрошенные</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0 mr-2" type="button" onclick="return orders_read('@last', 'accepted');">Активные</a>
<a class="btn btn-sm button_white button_clean font-weight-bold mb-0" type="button" onclick="return orders_read('@last', 'completed');">Завершенные</a>
</div>
</div>
<div class="row mb-4">
<div class="row mb-4 px-3">
<div class="col-3 p-0 form-control form-control-sm d-flex align-items-center">
<i id="orders_search_line_icon" class="ml-2 fas fa-search"></i><input id="orders_search_line" type="text" class="h-100 pr-3 my-auto form_clean_full" value="<?= $search ?? null ?>" placeholder="Номер запчасти" oninput="$('#orders_search_line').dropdown('hide'); return orders_read(this.value);" data-toggle="dropdown" aria-expanded="false" autocomplete="off">
<?php
// Сделать системные настройки и по ним работать
$orders_search_panel = $panel ?? yii::$app->controller->renderPartial('/orders/search/panel', ['history' => true]);
echo <<<HTML
<div id="orders_search_line_window" class="dropdown-menu w-100" aria-labelledby="orders_search_line">
$orders_search_panel
</div>
HTML;
?>
</div>
<small class="ml-auto d-flex">
<a class="btn btn-sm button_white button_clean mb-0 mr-2 l" type="button" onclick="return orders_read('last','<?= time() - 86400 ?>', '<?= time() ?>');">День</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('last', '<?= time() - 604800 ?>', '<?= time() ?>');">Неделя</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('last', '<?= time() - 2592000 ?>', '<?= time() ?>');">Месяц</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('last', '<?= time() - 31536000 ?>', '<?= time() ?>');">Год</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2 l" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 86400 ?>', '<?= time() ?>');">День</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 604800 ?>', '<?= time() ?>');">Неделя</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 2592000 ?>', '<?= time() ?>');">Месяц</a>
<a class="btn btn-sm button_white button_clean mb-0 mr-2" type="button" onclick="return orders_read('@last', '@last', '<?= time() - 31536000 ?>', '<?= time() ?>');">Год</a>
</small>
<div class="ml-2 mr-3 px-0 w-auto form-control form-control-sm text-center">
<input id="orders_period_calendar" class="pl-0 form_clean_full text-center" type="text" />
<div class="col-auto ml-2 w-auto form-control form-control-sm">
<input id="orders_period_calendar" class="pl-0 h-100 form_clean_full text-center" type="text" /><i class="ml-2 fas fa-calendar-alt my-auto"></i>
</div>
</div>
<div class="col mb-4 list rounded">
@ -304,9 +317,9 @@ if (empty($panel)) {
// Рассчет времени из данных поставки
try {
$time_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
$time_converted = DateTime::createFromFormat('Y-m-d H:i:s', $delivery['auto']['orderDates']['giveoutFromOspReceiver'])->getTimestamp();
} catch (Exception $e) {
$time_converted = DateTime::createFromFormat('Y-m-d', $delivery['orderDates']['arrivalToOspReceiver'])->getTimestamp();
$time_converted = DateTime::createFromFormat('Y-m-d', $delivery['auto']['orderDates']['arrivalToOspReceiver'])->getTimestamp();
}
// $time = (ceil(($time_converted - time()) / 60 / 60 / 24) + 1) . ' дн';
$date = date('d.m.Y', $time_converted);
@ -315,7 +328,7 @@ if (empty($panel)) {
// Инициализация стоимости
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>';
else $cost_html = '<span class="m-auto">' . ($cost = $cost['auto']) . ' <small>' . $currency . '</small></span>';
}
// Инициализация статуса связи поставки
@ -333,7 +346,7 @@ if (empty($panel)) {
<div class="col-2">{$supply['catn']}</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-2">$amount</div>
<div class="col-2">{$amount['auto']}</div>
<div class="col-2 d-flex">$cost_html</div>
</div>
HTML;

View File

@ -0,0 +1,53 @@
<?php
declare(strict_types=1);
use app\models\Search;
if (isset($history) && $history) {
// Отображение истории
if (yii::$app->user->isGuest) {
// Не аутентифицирован
// В будущем выводить историю из cookie
echo <<<HTML
<p class="m-0 py-2 d-flex justify-content-center">Войдите для просмотра истории поиска</p>
HTML;
} else if ($rows = Search::searchByEdge(
from: 'account',
to: 'search',
sort: ['DESC'],
where: ['search.type' => 'order']
)) {
// История поиска существует
foreach ($rows as $row) {
// Инициализация
$time = $row->jrnl;
$date = empty($time) ? '' : date('d.m.y', end($time)['date']);
echo <<<HTML
<a class="dropdown-item d-flex button_white text-dark" href="/search?type=product&q=$row->text">$row->text<span class="ml-auto">$date</span></a>
HTML;
}
}
} else if (isset($response) && $response) {
// Ответ получен
foreach ($response as $row) {
// Перебор найденных данных
$catn = $row['supply']['catn'];
echo <<<HTML
<a class="dropdown-item button_white text-dark" href="/product/$catn">$catn</a>
HTML;
}
} else {
echo <<<HTML
<p class="m-0 py-2 d-flex justify-content-center">Ничего не найдено</p>
HTML;
}
?>

View File

@ -18,7 +18,8 @@ if (isset($history) && $history) {
} else if ($rows = Search::searchByEdge(
from: 'account',
to: 'search',
sort: ['DESC']
sort: ['DESC'],
where: ['search.type' => 'general']
)) {
// История поиска существует

View File

@ -149,6 +149,12 @@ nav {
background-color: #d7d4dd;
}
#notification_button .notification_button_active, #cart_button .cart_button_active {
/* color: #123EAB; */
color: #0010ff;
}
@media (max-width: 400px) {
.catalog_search {
flex-direction: column;

View File

@ -1,8 +1,3 @@
#notification_button .notification_button_active {
/* color: #123EAB; */
color: #0010ff;
}
#notifications_popup_wrap>.notification {
min-height : 60px;
border : 1px solid #a39bb1;

View File

@ -66,3 +66,11 @@
margin-left: 0;
opacity: 0;
}
#page_orders article #orders_search_line_icon {
position: absolute;
}
#page_orders article #orders_search_line {
padding-left: 13%;
}

View File

@ -18,6 +18,9 @@ function cart_write(supply_id, delivery_type, amount = 1) {
error: cart_response_error
});
// Пересчет количества товаров в корзине для кнопки в меню
setTimeout(cart_count, 500);
return false;
};
@ -36,6 +39,9 @@ function cart_delete() {
error: cart_response_error
});
// Пересчет количества товаров в корзине для кнопки в меню
setTimeout(cart_count, 500);
return false;
};
@ -54,6 +60,9 @@ function cart_request() {
error: cart_response_error
});
// Пересчет количества товаров в корзине для кнопки в меню
setTimeout(cart_count, 500);
return false;
};
@ -134,6 +143,9 @@ function cart_list_delete(target, amount = 0) {
// Реинициализация
document.getElementById('cart_list_action').value = 'none';
// Пересчет количества товаров в корзине для кнопки в меню
setTimeout(cart_count, 500);
// Пересчитывание стоимости
cart_cost_calculate();
@ -164,6 +176,9 @@ function cart_list_amount_update(target, type, input) {
error: cart_response_error
});
// Пересчет количества товаров в корзине для кнопки в меню
setTimeout(cart_count, 500);
// Пересчитывание стоимости
cart_cost_calculate();
};

View File

@ -13,6 +13,8 @@ function main_response(data, status, xhr) {
// Обновление документа
main.innerHTML = data.main;
// alert('Основной блок на ' + data.main);
// Реинициализация
reinitialization(main);
};

View File

@ -96,7 +96,6 @@ function menu_auth_panel_show(panel) {
return true;
};
function menu_auth_panel_hide(panel) {
if (panel !== undefined) {
// Необходимые данные переданы
@ -110,6 +109,66 @@ function menu_auth_panel_hide(panel) {
return true;
};
function cart_count() {
$.ajax({
url: '/cart/count',
type: 'post',
dataType: 'json',
data: {
'_csrf': yii.getCsrfToken()
},
success: function (data, status, xhr) {
if (data !== undefined) {
// Получены данные с сервера
// Кнопка корзины
if (data.button !== undefined) {
// Инициализация
button_old = document.getElementById('cart_button');
// Запись
button_old.insertAdjacentHTML("beforebegin", data.button);
// Запись
button_old.remove();
// Реинициализация
$('#cart_button').dropdown().init();
};
};
return menu_success(data, status, xhr);
},
error: function (data, status, xhr) {
if (data !== undefined) {
// Получены данные с сервера
// Кнопка корзины
if (data.button !== undefined) {
// Инициализация
button_old = document.getElementById('cart_button');
// Запись
button_old.insertAdjacentHTML("beforebegin", data.button);
// Запись
button_old.remove();
// Реинициализация
$('#cart_button').dropdown().init();
};
};
return menu_error(data, status, xhr);
}
});
return false;
};
function menu_responce(data, status, xhr) {
// Обработка ответов

View File

@ -15,7 +15,7 @@ function notification_last() {
};
// Проверка уведомлений
setInterval(notification_last, 10000);
setInterval(notification_last, 3000);
function notification_popup_create(html, id) {
// Инициализация
@ -48,7 +48,7 @@ function notification_popup_delete(notification) {
// Удаление
notification.remove();
}, 300);
}, 3000);
}, 1000);
return false;
};

View File

@ -1,26 +1,17 @@
// Запросить заказы
function orders_read(type = 'all', from, to, panel = 'orders_panel_orders') {
// type = 'last' (оставить без изменений и взять данные из cookie
// Пустые from и to тоже возьмутся из текущих значений в cookie
function orders_read(search = '@last', type = '@last', from = '@last', to = '@last', window = 'orders_panel_orders') {
// '@last' - оставить без изменений и взять данные из cookie
if (from !== undefined && to !== undefined) {
// Данные периода переданы
if (search.length > 1) {
// Проверка на длину запроса пройдена
// Инициализация буфера с данными запроса
data = {
'_csrf': yii.getCsrfToken(),
'search': search,
'from': from,
'to': to,
'panel': panel
};
} else {
// Данные периода не переданы
// Инициализация буфера с данными запроса
data = {
'_csrf': yii.getCsrfToken(),
'panel': panel
};
'window': window
};
// Запрос
@ -35,6 +26,7 @@ function orders_read(type = 'all', from, to, panel = 'orders_panel_orders') {
// // Пересчитывание стоимости
// cart_cost_calculate();
};
return false;
};