Работа над сайтом 19
This commit is contained in:
parent
5e01240938
commit
dc30b8c6bb
|
@ -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>',
|
||||
|
|
|
@ -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()
|
||||
];
|
||||
|
|
|
@ -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()
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
];
|
||||
|
|
|
@ -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');
|
||||
} else {
|
||||
// Запрошена сортировка
|
||||
// Чтение сохраненных данных в cookie
|
||||
$search = $cookies->get('search');
|
||||
|
||||
// Запись cookie с данными текущей фильтрации по типу
|
||||
$cookies->add(new Cookie([
|
||||
'name' => 'filter',
|
||||
'value' => $filter
|
||||
]));
|
||||
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');
|
||||
}
|
||||
}
|
||||
|
||||
// Инициализация входных данных
|
||||
$from = yii::$app->request->post('from') ?? yii::$app->request->get('from');
|
||||
$to = yii::$app->request->post('to') ?? yii::$app->request->get('to');
|
||||
// Инициализация открытого окна
|
||||
try {
|
||||
if ('@last' === $type) {
|
||||
// Запрошено использование прошлых данных
|
||||
|
||||
// Инициализация фильтра по периоду
|
||||
if (!empty($from) && !empty($to) && filter_var($from, FILTER_VALIDATE_INT) && filter_var($to, FILTER_VALIDATE_INT)) {
|
||||
// Данные фильтра по периоду переданы и представляют собой целые числа (подразумевается unixtime)
|
||||
// Чтение сохраненных данных в cookie
|
||||
$type = $cookies->get('type');
|
||||
|
||||
// Конвертация типов
|
||||
$from = (int) $from;
|
||||
$to = (int) $to;
|
||||
if (empty($type)) {
|
||||
// Переданы неверные данные
|
||||
|
||||
// Запись cookie с данными начала периода
|
||||
$cookies->add(new Cookie([
|
||||
'name' => 'from',
|
||||
'value' => $from
|
||||
]));
|
||||
|
||||
// Запись 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();
|
||||
throw new Exception("Переданы неверные данные \$type: $type", 500);
|
||||
}
|
||||
} else {
|
||||
// Данные в cookie найдены и подходят для выполнения
|
||||
// Запрошена сортировка
|
||||
|
||||
// Конвертация типов
|
||||
$from = (int) $from;
|
||||
$to = (int) $to;
|
||||
if (empty($type)) {
|
||||
// Переданы неверные данные
|
||||
|
||||
throw new Exception("Переданы неверные данные \$type: $type", 500);
|
||||
}
|
||||
|
||||
// Запись данных в cookie
|
||||
$cookies->add(new Cookie([
|
||||
'name' => 'type',
|
||||
'value' => $type
|
||||
]));
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
// Реинициализация
|
||||
$type = 'all';
|
||||
}
|
||||
|
||||
// Инициализация данных периода (от)
|
||||
try {
|
||||
if ('@last' === $from = yii::$app->request->post('from') ?? yii::$app->request->get('from')) {
|
||||
// Запрошено использование прошлых данных
|
||||
|
||||
// Чтение сохраненных данных в cookie
|
||||
$from = $cookies->get('from');
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Инициализация данных периода (до)
|
||||
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
|
||||
]));
|
||||
}
|
||||
} 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()
|
||||
|
|
|
@ -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()
|
||||
];
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
// Поиск записан
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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]);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
?>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
?>
|
|
@ -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']
|
||||
)) {
|
||||
// История поиска существует
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,8 +1,3 @@
|
|||
#notification_button .notification_button_active {
|
||||
/* color: #123EAB; */
|
||||
color: #0010ff;
|
||||
}
|
||||
|
||||
#notifications_popup_wrap>.notification {
|
||||
min-height : 60px;
|
||||
border : 1px solid #a39bb1;
|
||||
|
|
|
@ -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%;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -13,6 +13,8 @@ function main_response(data, status, xhr) {
|
|||
// Обновление документа
|
||||
main.innerHTML = data.main;
|
||||
|
||||
// alert('Основной блок на ' + data.main);
|
||||
|
||||
// Реинициализация
|
||||
reinitialization(main);
|
||||
};
|
||||
|
|
|
@ -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) {
|
||||
// Обработка ответов
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -1,41 +1,33 @@
|
|||
// Запросить заказы
|
||||
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
|
||||
'window': window
|
||||
};
|
||||
} else {
|
||||
// Данные периода не переданы
|
||||
|
||||
// Инициализация буфера с данными запроса
|
||||
data = {
|
||||
'_csrf': yii.getCsrfToken(),
|
||||
'panel': panel
|
||||
};
|
||||
// Запрос
|
||||
$.ajax({
|
||||
url: '/orders/' + type,
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
data: data,
|
||||
success: orders_response_success,
|
||||
error: orders_response_error
|
||||
});
|
||||
|
||||
// // Пересчитывание стоимости
|
||||
// cart_cost_calculate();
|
||||
};
|
||||
|
||||
// Запрос
|
||||
$.ajax({
|
||||
url: '/orders/' + type,
|
||||
type: 'post',
|
||||
dataType: 'json',
|
||||
data: data,
|
||||
success: orders_response_success,
|
||||
error: orders_response_error
|
||||
});
|
||||
|
||||
// // Пересчитывание стоимости
|
||||
// cart_cost_calculate();
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
|
|
Reference in New Issue