Панель модератора для регистрации поставщиков
This commit is contained in:
parent
d9337944b1
commit
3cb2aa1a15
|
@ -1,2 +1,3 @@
|
||||||
/import
|
/import/*
|
||||||
/invoices
|
/invoices/*
|
||||||
|
/accounts/*
|
||||||
|
|
|
@ -97,6 +97,7 @@ $config = [
|
||||||
'product/<catn:[^/]+>' => 'product/index',
|
'product/<catn:[^/]+>' => 'product/index',
|
||||||
'<section:(product|cart)>/<catn:[^/]+>/<action:(read|write|edit|delete)>/<target:(title|catn|dscr|dmns|wght|image|cover|comm)>' => '<section>/<action>-<target>',
|
'<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>',
|
'profile/geolocation/<action:(init|write)>' => 'profile/geolocation-<action>',
|
||||||
|
'profile/panel/<panel:(suppliers)>/<block:(requests)>/<action:(search)>' => 'profile/panel-<panel>-<block>-<action>',
|
||||||
'orders' => 'order/index',
|
'orders' => 'order/index',
|
||||||
'orders/<filter:[^/]+>' => 'order/index',
|
'orders/<filter:[^/]+>' => 'order/index',
|
||||||
'orders/<catn:[^/]+>/<action:(accept)>' => 'order/<action>',
|
'orders/<catn:[^/]+>/<action:(accept)>' => 'order/<action>',
|
||||||
|
|
|
@ -49,7 +49,8 @@ class ProfileController extends Controller
|
||||||
'import',
|
'import',
|
||||||
'monitoring',
|
'monitoring',
|
||||||
'readGroups',
|
'readGroups',
|
||||||
'geolocation-write'
|
'geolocation-write',
|
||||||
|
'panel-suppliers-requests-search'
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -258,6 +259,8 @@ class ProfileController extends Controller
|
||||||
// Деинициализация
|
// Деинициализация
|
||||||
unset($vars);
|
unset($vars);
|
||||||
|
|
||||||
|
// Раздел "Поставщики"
|
||||||
|
|
||||||
if (yii::$app->request->isPost) {
|
if (yii::$app->request->isPost) {
|
||||||
// AJAX-POST-запрос
|
// AJAX-POST-запрос
|
||||||
|
|
||||||
|
@ -659,12 +662,16 @@ class ProfileController extends Controller
|
||||||
$account->city = $account->geol['data']['city'];
|
$account->city = $account->geol['data']['city'];
|
||||||
|
|
||||||
// Запись в буфер новых данных (непонятно почему, но только вторым запросом можно получать часовую зону)
|
// Запись в буфер новых данных (непонятно почему, но только вторым запросом можно получать часовую зону)
|
||||||
$account->geol = $account->geol + $dadata->clean("address", $account->city);
|
$account->geol = [
|
||||||
|
'data' => [
|
||||||
|
'timezone' => $dadata->clean("address", $account->city)['data']['timezone']
|
||||||
|
]
|
||||||
|
] + $account->geol;
|
||||||
|
|
||||||
// Запись в буфер часовой зоны
|
// Запись в буфер часовой зоны
|
||||||
$account->zone = $account->geol['data']['timezone'];
|
$account->zone = $account->geol['data']['timezone'];
|
||||||
|
|
||||||
if($account->update() < 1) {
|
if ($account->update() < 1) {
|
||||||
// Не удалось записать данные
|
// Не удалось записать данные
|
||||||
|
|
||||||
// Запись кода ответа
|
// Запись кода ответа
|
||||||
|
@ -696,31 +703,7 @@ class ProfileController extends Controller
|
||||||
*/
|
*/
|
||||||
public static function syncGeolocationWithDellin(Account|int|null $account = null): bool
|
public static function syncGeolocationWithDellin(Account|int|null $account = null): bool
|
||||||
{
|
{
|
||||||
if (is_null($account)) {
|
Account::initForController($account);
|
||||||
// Данные аккаунта не переданы
|
|
||||||
|
|
||||||
if (yii::$app->user->isGuest) {
|
|
||||||
// Аккаунт не аутентифицирован
|
|
||||||
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
// Аккаунт аутентифицирован
|
|
||||||
|
|
||||||
// Инициализация
|
|
||||||
$account = yii::$app->user->identity;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (is_int($account)) {
|
|
||||||
// Передан идентификатор (_key) аккаунта (подразумевается)
|
|
||||||
|
|
||||||
// Инициализация (поиск в базе данных)
|
|
||||||
if (!$account = Account::searchById(Account::collectionName() . "/$account")) {
|
|
||||||
// Не удалось инициализировать аккаунт
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Синхронизация с базой данных (таблица с ДеловыеЛинии)
|
// Синхронизация с базой данных (таблица с ДеловыеЛинии)
|
||||||
if (isset($account->geol['data']) && $dellin = Dellin::searchByCityKladr(str_pad($account->geol['data']['city_kladr_id'], 25, '0000000000000000000000'))) {
|
if (isset($account->geol['data']) && $dellin = Dellin::searchByCityKladr(str_pad($account->geol['data']['city_kladr_id'], 25, '0000000000000000000000'))) {
|
||||||
|
@ -791,4 +774,94 @@ class ProfileController extends Controller
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function actionPanelSuppliersRequestsSearch()
|
||||||
|
{
|
||||||
|
if (Yii::$app->request->isPost) {
|
||||||
|
// POST-запрос
|
||||||
|
|
||||||
|
if (Account::isAdmin() || Account::isModer()) {
|
||||||
|
// Доступ разрешен
|
||||||
|
|
||||||
|
// Инициализация буфера ответа
|
||||||
|
$response = [];
|
||||||
|
|
||||||
|
// Поиск заявок на регистрацию
|
||||||
|
$suppliers = Account::searchSuppliersRequests();
|
||||||
|
|
||||||
|
foreach ($suppliers as $account) {
|
||||||
|
// Перебор заявок
|
||||||
|
|
||||||
|
// Поиск данных о заявке
|
||||||
|
foreach ($account->jrnl as $jrnl) {
|
||||||
|
// Перебор журнала
|
||||||
|
|
||||||
|
if ($jrnl['action'] === 'create') {
|
||||||
|
// Заявка найдена
|
||||||
|
|
||||||
|
// Запись даты регистрации
|
||||||
|
$registration_date = $jrnl['date'];
|
||||||
|
} else if ($jrnl['action'] === 'request to become a supplier') {
|
||||||
|
// Заявка найдена
|
||||||
|
|
||||||
|
// Запись даты отправки заявки
|
||||||
|
$supplier_date = $jrnl['date'];
|
||||||
|
|
||||||
|
// Запись данных о заявке
|
||||||
|
$supplier_data = $jrnl['data'][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($supplier_data) || empty($supplier_date) || empty($registration_date)) {
|
||||||
|
// Данные из журнала не найдены
|
||||||
|
|
||||||
|
// Запись кода ответа
|
||||||
|
yii::$app->response->statusCode = 500;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Инициализация индекса
|
||||||
|
Account::generateIndexes([$account]);
|
||||||
|
|
||||||
|
// Инициализация пароля
|
||||||
|
$account->passwordInit();
|
||||||
|
|
||||||
|
// Запись в буфер ответа
|
||||||
|
$response[] = [
|
||||||
|
'_key' => $account->_key,
|
||||||
|
'name' => $account->name,
|
||||||
|
'mail' => $account->mail,
|
||||||
|
'simc' => $account->simc,
|
||||||
|
'indx' => $account->indx,
|
||||||
|
'pswd' => $account->pswd,
|
||||||
|
'vrfy' => Account::validateVrfy($account->vrfy),
|
||||||
|
'data' => $supplier_data,
|
||||||
|
'date' => [
|
||||||
|
'regs' => $registration_date,
|
||||||
|
'supl' => $supplier_date
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Настройка заголовков ответа
|
||||||
|
Yii::$app->response->format = Response::FORMAT_JSON;
|
||||||
|
|
||||||
|
return [
|
||||||
|
'suppliers' => $response,
|
||||||
|
'_csrf' => yii::$app->request->getCsrfToken()
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
// Запись кода ответа
|
||||||
|
yii::$app->response->statusCode = 401;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Запись кода ответа
|
||||||
|
yii::$app->response->statusCode = 500;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ use yii\web\Controller;
|
||||||
use yii\web\UploadedFile;
|
use yii\web\UploadedFile;
|
||||||
|
|
||||||
use app\models\Request;
|
use app\models\Request;
|
||||||
|
use app\models\Account;
|
||||||
|
|
||||||
class SuppliersController extends Controller
|
class SuppliersController extends Controller
|
||||||
{
|
{
|
||||||
|
@ -27,15 +28,19 @@ class SuppliersController extends Controller
|
||||||
*/
|
*/
|
||||||
public function actionRequestSend()
|
public function actionRequestSend()
|
||||||
{
|
{
|
||||||
|
// Инициализация данных запроса
|
||||||
$request = yii::$app->request->post('Request') ?? yii::$app->request->get('Request');
|
$request = yii::$app->request->post('Request') ?? yii::$app->request->get('Request');
|
||||||
|
|
||||||
yii::$app->mail_system->compose()
|
// Запись поставщика
|
||||||
->setFrom(yii::$app->params['mail']['system'])
|
Account::writeSupplier($request['name'], $request['phon'], $request['mail'], $file = UploadedFile::getInstance(new Request($request), 'file'));
|
||||||
->setTo(yii::$app->params['mail']['info'])
|
|
||||||
->setSubject('Регистрация поставщика')
|
// yii::$app->mail_system->compose()
|
||||||
->setHtmlBody($this->renderPartial('/mails/supplier', $request))
|
// ->setFrom(yii::$app->params['mail']['system'])
|
||||||
->attach(($file = UploadedFile::getInstance(new Request($request), 'file'))->tempName, ['fileName' => $file->name])
|
// ->setTo(yii::$app->params['mail']['info'])
|
||||||
->send();
|
// ->setSubject('Регистрация поставщика')
|
||||||
|
// ->setHtmlBody($this->renderPartial('/mails/supplier', $request))
|
||||||
|
// ->attach($file->tempName, ['fileName' => $file->name])
|
||||||
|
// ->send();
|
||||||
|
|
||||||
return $this->renderPartial('/suppliers/requested');
|
return $this->renderPartial('/suppliers/requested');
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ use carono\exchange1c\interfaces\PartnerInterface;
|
||||||
|
|
||||||
use app\models\Dellin;
|
use app\models\Dellin;
|
||||||
use app\models\traits\SearchByEdge;
|
use app\models\traits\SearchByEdge;
|
||||||
|
use yii\web\UploadedFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Аккаунт
|
* Аккаунт
|
||||||
|
@ -43,7 +44,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
'pswd',
|
'pswd',
|
||||||
'name',
|
'name',
|
||||||
'simc',
|
'simc',
|
||||||
'sity',
|
'city',
|
||||||
'zone',
|
'zone',
|
||||||
'comp',
|
'comp',
|
||||||
'taxn',
|
'taxn',
|
||||||
|
@ -379,10 +380,10 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
public function writeOption(string $name, mixed $value = null): bool
|
public function writeOption(string $name, mixed $value = null): bool
|
||||||
{
|
{
|
||||||
// Запись
|
// Запись
|
||||||
$this->opts[$name] = $value;
|
$this->opts = [$name => $value] + $this->opts;
|
||||||
|
|
||||||
// Отправка
|
// Отправка
|
||||||
return $this->save();
|
return $this->update() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -396,7 +397,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
unset($this->opts[$name]);
|
unset($this->opts[$name]);
|
||||||
|
|
||||||
// Отправка
|
// Отправка
|
||||||
return $this->save();
|
return $this->update() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -589,7 +590,7 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
regenerate_index:
|
regenerate_index:
|
||||||
|
|
||||||
// Генерация
|
// Генерация
|
||||||
$account->indx = $int_to_string(random_int(0, 32)) . $int_to_string(random_int(0, 32)) . $int_to_string(random_int(0, 32));
|
$account->indx = $int_to_string(random_int(0, 29)) . $int_to_string(random_int(0, 29)) . $int_to_string(random_int(0, 29));
|
||||||
|
|
||||||
if (in_array($account->indx, $registry)) {
|
if (in_array($account->indx, $registry)) {
|
||||||
// Сгенерированный индекс обнаружено в реестре запрещённых индексов
|
// Сгенерированный индекс обнаружено в реестре запрещённых индексов
|
||||||
|
@ -688,6 +689,24 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Инициализация пароля
|
||||||
|
*/
|
||||||
|
public function passwordInit(): bool
|
||||||
|
{
|
||||||
|
if (empty($this->pswd) || $this->pswd === 'undefined') {
|
||||||
|
// Пароль не инициализирован
|
||||||
|
|
||||||
|
// Генерация пароля
|
||||||
|
$this->pswd = self::passwordGenerate();
|
||||||
|
|
||||||
|
// Сохранение и возврат
|
||||||
|
return $this->update() > 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Гениальный генератор пароля
|
* Гениальный генератор пароля
|
||||||
*
|
*
|
||||||
|
@ -778,4 +797,138 @@ class Account extends Document implements IdentityInterface, PartnerInterface
|
||||||
|
|
||||||
return $this->update() > 0 ? true : false;
|
return $this->update() > 0 ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Поиск заявок на регистрацию поставщиков
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function writeSupplier(string $name, string $phone, string $mail, UploadedFile $file): ?static
|
||||||
|
{
|
||||||
|
// Инициализация
|
||||||
|
$account = new static;
|
||||||
|
|
||||||
|
// Настройка
|
||||||
|
$account->agnt = true;
|
||||||
|
$account->name = $name;
|
||||||
|
$account->simc = $phone;
|
||||||
|
$account->mail = $mail;
|
||||||
|
$account->type = 'requested';
|
||||||
|
|
||||||
|
// Генерация пароля
|
||||||
|
$account->passwordInit();
|
||||||
|
|
||||||
|
// Инициализация индекса
|
||||||
|
Account::generateIndexes([$account]);
|
||||||
|
|
||||||
|
if ($account->save()) {
|
||||||
|
// Удалось сохранить аккаунт
|
||||||
|
|
||||||
|
if (!file_exists($dir = YII_PATH_PUBLIC . '/../assets/accounts/' . $account->_key . '/documents')) {
|
||||||
|
// Директория для хранения документов не найдена
|
||||||
|
|
||||||
|
if (!mkdir($dir, 0775, true)) {
|
||||||
|
// Не удалось записать директорию
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Перенос файла из временной директории
|
||||||
|
copy($file->tempName, $file2 = $dir . '/' . $file->name);
|
||||||
|
|
||||||
|
$account->journal('request to become a supplier', [
|
||||||
|
'name' => $name,
|
||||||
|
'phone' => $phone,
|
||||||
|
'mail' => $mail,
|
||||||
|
'file' => $file2
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $account;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Поиск заявок на регистрацию поставщиков
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function searchSuppliersRequests(): array
|
||||||
|
{
|
||||||
|
return self::find()->where(['agnt' => true, 'type' => 'requested'])->all();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Инициализация аккаунта для контроллера
|
||||||
|
*
|
||||||
|
* @param static|null $account Аккаунт
|
||||||
|
*/
|
||||||
|
public static function initAccount($account = null): ?static
|
||||||
|
{
|
||||||
|
if (is_null($account)) {
|
||||||
|
// Данные аккаунта не переданы
|
||||||
|
|
||||||
|
if (yii::$app->user->isGuest) {
|
||||||
|
// Аккаунт не аутентифицирован
|
||||||
|
} else {
|
||||||
|
// Аккаунт аутентифицирован
|
||||||
|
|
||||||
|
// Инициализация
|
||||||
|
$account = yii::$app->user->identity;
|
||||||
|
|
||||||
|
return $account;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (is_int($account)) {
|
||||||
|
// Передан идентификатор (_key) аккаунта (подразумевается)
|
||||||
|
|
||||||
|
// Инициализация (поиск в базе данных)
|
||||||
|
if ($account = Account::searchById(Account::collectionName() . "/$account")) {
|
||||||
|
// Удалось инициализировать аккаунт
|
||||||
|
|
||||||
|
return $account;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверка на то, что аккаунт является администраторрм
|
||||||
|
*
|
||||||
|
* @param static|null $account Аккаунт
|
||||||
|
*/
|
||||||
|
public static function isAdmin($account = null): bool
|
||||||
|
{
|
||||||
|
if ($account = self::initAccount($account)) {
|
||||||
|
// Аккаунт инициализирован
|
||||||
|
|
||||||
|
if ($account->type === 'administrator') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Проверка на то, что аккаунт является модератором
|
||||||
|
*
|
||||||
|
* @param static|null $account Аккаунт
|
||||||
|
*/
|
||||||
|
public static function isModer($account = null): bool
|
||||||
|
{
|
||||||
|
if ($account = self::initAccount($account)) {
|
||||||
|
// Аккаунт инициализирован
|
||||||
|
|
||||||
|
if ($account->type === 'moderator') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,7 +109,9 @@ abstract class Document extends ActiveRecord
|
||||||
'account' => yii::$app->user->id ?? 'system',
|
'account' => yii::$app->user->id ?? 'system',
|
||||||
'action' => $action
|
'action' => $action
|
||||||
],
|
],
|
||||||
...$data
|
[
|
||||||
|
'data' => $data
|
||||||
|
]
|
||||||
)]
|
)]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -207,7 +207,7 @@ class Dellin extends Model
|
||||||
'sessionID' => self::$session,
|
'sessionID' => self::$session,
|
||||||
'delivery' => [
|
'delivery' => [
|
||||||
'derival' => [
|
'derival' => [
|
||||||
'produceDate' => (new DateTime())->setTimestamp(time())->setTimezone(new DateTimeZone($timezone))->format('Y-m-d')
|
'produceDate' => (new DateTime())->setTimestamp(time() + 86400 * 3)->setTimezone(new DateTimeZone($timezone))->format('Y-m-d')
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
'members' => [
|
'members' => [
|
||||||
|
|
|
@ -7,9 +7,10 @@ use yii\bootstrap\ActiveForm;
|
||||||
use yii\helpers\Html;
|
use yii\helpers\Html;
|
||||||
|
|
||||||
use app\models\Notification;
|
use app\models\Notification;
|
||||||
|
use app\models\Account;
|
||||||
|
|
||||||
// Инициализация
|
// Инициализация
|
||||||
$panel ?? $panel = 'profile_panel_panel_input_notifications';
|
$panel ?? $panel = 'profile_panel_input_notifications';
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
@ -25,11 +26,12 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
|
||||||
<h4 class="ml-4 mb-4"><i class="fas fa-user-shield my-auto mr-2"></i>Панель управления</h4>
|
<h4 class="ml-4 mb-4"><i class="fas fa-user-shield my-auto mr-2"></i>Панель управления</h4>
|
||||||
<div id="profile_panel_panel" class="profile_panel">
|
<div id="profile_panel_panel" class="profile_panel">
|
||||||
<div class="profile_panel_menu mb-3">
|
<div class="profile_panel_menu mb-3">
|
||||||
<label class="btn button_white mb-0 mr-2" for="profile_panel_panel_input_notifications">Уведомления</label>
|
<label class="btn button_white mb-0 mr-2" for="profile_panel_input_notifications" onclick="return page_profile_panel_suppliers_choose('profile_panel_input_notifications');">Уведомления</label>
|
||||||
<label class="btn button_white mb-0 mr-2" for="profile_panel_panel_input_settings">Настройки</label>
|
<label class="btn button_white mb-0 mr-2" for="profile_panel_input_suppliers" onclick="return page_profile_panel_input_suppliers_requests_init();">Поставщики</label>
|
||||||
|
<label class="btn button_white mb-0 mr-2" for="profile_panel_input_settings" onclick="return page_profile_panel_suppliers_choose('profile_panel_input_settings');">Настройки</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="profile_panel_content">
|
<div class="profile_panel_content">
|
||||||
<input type="radio" id="profile_panel_panel_input_notifications" name="main_panel" <?= $panel === 'profile_panel_panel_input_notifications' ? 'checked' : null ?> />
|
<input type="radio" id="profile_panel_input_notifications" name="main_panel" <?= $panel === 'profile_panel_input_notifications' ? 'checked' : null ?> />
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<h5>Отправка уведомления</h5>
|
<h5>Отправка уведомления</h5>
|
||||||
<div class="dropdown-divider mb-3"></div>
|
<div class="dropdown-divider mb-3"></div>
|
||||||
|
@ -74,7 +76,15 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
|
||||||
<?php ActiveForm::end(); ?>
|
<?php ActiveForm::end(); ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<input type="radio" id="profile_panel_panel_input_settings" name="main_panel" <?= $panel === 'profile_panel_panel_input_settings' ? 'checked' : null ?> />
|
|
||||||
|
<input type="radio" id="profile_panel_input_suppliers" name="main_panel" <?= $panel === 'profile_panel_input_suppliers' ? 'checked' : null ?> />
|
||||||
|
<div class="col">
|
||||||
|
<h5>Заявки на регистрацию</h5>
|
||||||
|
<div class="dropdown-divider mb-3"></div>
|
||||||
|
<div id="profile_panel_input_suppliers_requests"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input type="radio" id="profile_panel_input_settings" name="main_panel" <?= $panel === 'profile_panel_input_settings' ? 'checked' : null ?> />
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<?php
|
<?php
|
||||||
$form = ActiveForm::begin([
|
$form = ActiveForm::begin([
|
||||||
|
@ -92,7 +102,7 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
|
||||||
|
|
||||||
<?= $form->errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?>
|
<?= $form->errorSummary($model_settings, ['header' => 'Получены ошибки:']) ?>
|
||||||
|
|
||||||
<?= $form->field($model_settings, 'search_period', ['options' => ['class' => "mb-1"]])->textInput(['value' => $model_settings['search_period'], 'onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_panel_input_settings\')']); ?>
|
<?= $form->field($model_settings, 'search_period', ['options' => ['class' => "mb-1"]])->textInput(['value' => $model_settings['search_period'], 'onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_input_settings\')']); ?>
|
||||||
<small class="d-block mb-1">Время которое надо ждать для повторного поиска в секундах</small>
|
<small class="d-block mb-1">Время которое надо ждать для повторного поиска в секундах</small>
|
||||||
|
|
||||||
<?php ActiveForm::end(); ?>
|
<?php ActiveForm::end(); ?>
|
||||||
|
@ -134,7 +144,7 @@ $panel ?? $panel = 'profile_panel_panel_input_notifications';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<?= $form->field($model_settings, 'search_connect_keep', ['options' => ['class' => "mb-1"]])->dropDownList($list, ['onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_panel_input_settings\')']); ?>
|
<?= $form->field($model_settings, 'search_connect_keep', ['options' => ['class' => "mb-1"]])->dropDownList($list, ['onChange' => 'page_profile_panel_settings(this.parentElement.parentElement, \'profile_panel_input_settings\')']); ?>
|
||||||
<small class="d-block mb-1">Удерживать открытое соединение до истечения срока блокировки поиска?</small>
|
<small class="d-block mb-1">Удерживать открытое соединение до истечения срока блокировки поиска?</small>
|
||||||
<small class="d-block mb-1">При малой задержке позволяет снизить время загрузки страницы, но при большой будет казаться, что сайт завис</small>
|
<small class="d-block mb-1">При малой задержке позволяет снизить время загрузки страницы, но при большой будет казаться, что сайт завис</small>
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
<div id="page_search" class="container flex-grow-1 d-flex">
|
<div id="page_search" class="container flex-grow-1 d-flex">
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Var_;
|
|
||||||
|
|
||||||
if (isset($timer) && $timer > 0) : ?>
|
if (isset($timer) && $timer > 0) : ?>
|
||||||
|
|
||||||
<div class="row py-3 w-100">
|
<div class="row py-3 w-100">
|
||||||
|
|
|
@ -25,6 +25,10 @@
|
||||||
background-color: #f7f6f9;
|
background-color: #f7f6f9;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#page_profile [id^=profile_panel_]>.profile_panel_content #profile_panel_input_suppliers_requests .panel_supplier_request {
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
/* #page_profile [id^=profile_panel_]>.profile_panel_content>div>.header_blue~.row:nth-child(2n + 1) {
|
/* #page_profile [id^=profile_panel_]>.profile_panel_content>div>.header_blue~.row:nth-child(2n + 1) {
|
||||||
background-color: #dbdde3;
|
background-color: #dbdde3;
|
||||||
} */
|
} */
|
||||||
|
@ -69,4 +73,4 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @media (max-width: 400px) {} */
|
/* @media (max-width: 400px) {} */
|
||||||
|
|
|
@ -137,7 +137,7 @@ function orders_supply_edit(type, supply_key, order_key) {
|
||||||
input.setAttribute('id', supply.getAttribute('id') + '_cost_input');
|
input.setAttribute('id', supply.getAttribute('id') + '_cost_input');
|
||||||
input.setAttribute('class', 'col-2 text-center form-control-plaintext');
|
input.setAttribute('class', 'col-2 text-center form-control-plaintext');
|
||||||
input.setAttribute('type', 'number');
|
input.setAttribute('type', 'number');
|
||||||
input.setAttribute('onchange', 'return orders_supply_cost_edit(' + supply_key + ', this);')
|
input.setAttribute('onchange', 'return orders_supply_cost_edit(' + supply_key + ', this);');
|
||||||
if (data.cost !== undefined) {
|
if (data.cost !== undefined) {
|
||||||
input.setAttribute('value', data.cost);
|
input.setAttribute('value', data.cost);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
'use strict'
|
||||||
|
|
||||||
function page_profile_panel_notification_create(form, html = 0) {
|
function page_profile_panel_notification_create(form, html = 0) {
|
||||||
if (form == undefined) {
|
if (form == undefined) {
|
||||||
form = {
|
form = {
|
||||||
|
@ -37,7 +39,7 @@ function page_profile_panel_settings(form, panel) {
|
||||||
return page_profile_panel_write(form);
|
return page_profile_panel_write(form);
|
||||||
};
|
};
|
||||||
|
|
||||||
function page_profile_panel_write (form) {
|
function page_profile_panel_write(form) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/profile/panel',
|
url: '/profile/panel',
|
||||||
type: 'post',
|
type: 'post',
|
||||||
|
@ -49,3 +51,306 @@ function page_profile_panel_write (form) {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function page_profile_panel_input_suppliers_requests_init() {
|
||||||
|
// Инициализация скриптов при открытии вкладки "Поставщики"
|
||||||
|
|
||||||
|
// Выбор панели
|
||||||
|
page_profile_panel_suppliers_choose('profile_panel_input_suppliers');
|
||||||
|
|
||||||
|
// Инициализация панели
|
||||||
|
page_profile_panel_input_suppliers_requests_init();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
function page_profile_panel_suppliers_choose(button) {
|
||||||
|
|
||||||
|
if (button === 'profile_panel_input_suppliers') {
|
||||||
|
document.getElementById('profile_panel_input_notifications').addAttribute('onclick', 'return page_profile_panel_input_suppliers_notifications_init();');
|
||||||
|
document.getElementById('profile_panel_input_settings').addAttribute('onclick', 'return page_profile_panel_input_suppliers_settings_init();');
|
||||||
|
} else if (button === 'profile_panel_input_notifications') {
|
||||||
|
document.getElementById('profile_panel_input_suppliers').addAttribute('onclick', 'return page_profile_panel_input_suppliers_requests_init();');
|
||||||
|
document.getElementById('profile_panel_input_settings').addAttribute('onclick', 'return page_profile_panel_input_suppliers_settings_init();');
|
||||||
|
} else if (button === 'profile_panel_input_settings') {
|
||||||
|
document.getElementById('profile_panel_input_notifications').addAttribute('onclick', 'return page_profile_panel_input_suppliers_notifications_init();');
|
||||||
|
document.getElementById('profile_panel_input_suppliers').addAttribute('onclick', 'return page_profile_panel_input_suppliers_requests_init();');
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById(button).removeAttribute('onclick');
|
||||||
|
}
|
||||||
|
|
||||||
|
function page_profile_panel_input_suppliers_requests_init(wrap = 'profile_panel_input_suppliers_requests') {
|
||||||
|
// Инициализация блока "Заявки на регистрацию" (поставщиков)
|
||||||
|
|
||||||
|
// Инициализация оболочки
|
||||||
|
wrap = document.getElementById(wrap);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: '/profile/panel/suppliers/requests/search',
|
||||||
|
type: 'post',
|
||||||
|
dataType: 'json',
|
||||||
|
data: {
|
||||||
|
'_csrf': yii.getCsrfToken()
|
||||||
|
},
|
||||||
|
success: (data, status, xhr) => {
|
||||||
|
// Обработка ответа
|
||||||
|
|
||||||
|
if (data !== undefined) {
|
||||||
|
// Получены данные с сервера
|
||||||
|
|
||||||
|
if (data.suppliers !== undefined && data.suppliers !== null) {
|
||||||
|
// Найдены данные поставщиков
|
||||||
|
|
||||||
|
for (let html of page_profile_panel_input_suppliers_requests_generate(data.suppliers)) {
|
||||||
|
// Перебор сгенерированных HTML-элементов
|
||||||
|
|
||||||
|
// Запись в документ
|
||||||
|
wrap.appendChild(html);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Переход к остальным обработчикам
|
||||||
|
page_profile_response_success(data, status, xhr);
|
||||||
|
},
|
||||||
|
error: page_profile_response_error
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function page_profile_panel_input_suppliers_requests_generate(suppliers) {
|
||||||
|
// Генерация HTML со списком заявок на регистрацию поставщиков
|
||||||
|
|
||||||
|
// Инициализация буфера вывода
|
||||||
|
let html = new Set;
|
||||||
|
|
||||||
|
// Инициализация итератора
|
||||||
|
let i = 0;
|
||||||
|
|
||||||
|
for (let account of suppliers) {
|
||||||
|
// Перебор данных поставщиков
|
||||||
|
|
||||||
|
// Обновление счётчика
|
||||||
|
++i;
|
||||||
|
|
||||||
|
// Инициализация контейнера
|
||||||
|
let container = document.createElement('div');
|
||||||
|
container.setAttribute('id', 'profile_panel_input_suppliers_requests_block_' + account._key);
|
||||||
|
container.setAttribute('class', i < suppliers.length ? 'mb-3 px-3 py-1 row' : 'px-3 py-1 row');
|
||||||
|
|
||||||
|
// Инициализация колонки с метаданными аккаунта
|
||||||
|
let block_metadata = document.createElement('div');
|
||||||
|
block_metadata.setAttribute('id', 'profile_panel_input_suppliers_requests_block_metadata_' + account._key);
|
||||||
|
block_metadata.setAttribute('class', 'col-4 pl-0 d-flex flex-column');
|
||||||
|
|
||||||
|
// Инициализация оболочки идентификатора аккаунта
|
||||||
|
let wrap_id = document.createElement('p');
|
||||||
|
wrap_id.setAttribute('class', 'mt-0 mb-2 px-3 row');
|
||||||
|
|
||||||
|
// Инициализация ярлыка идентификатора аккаунта
|
||||||
|
let label_id = document.createElement('b');
|
||||||
|
label_id.setAttribute('class', '');
|
||||||
|
label_id.innerText = 'Договор:';
|
||||||
|
|
||||||
|
// Инициализация значения идентификатора аккаунта
|
||||||
|
let value_id = document.createElement('span');
|
||||||
|
value_id.setAttribute('class', 'ml-auto');
|
||||||
|
value_id.innerText = account._key;
|
||||||
|
|
||||||
|
// Инициализация оболочки времени регистрации
|
||||||
|
let wrap_regs = document.createElement('p');
|
||||||
|
wrap_regs.setAttribute('class', 'mt-auto mb-2 px-3 row');
|
||||||
|
|
||||||
|
// Инициализация ярлыка времени регистрации
|
||||||
|
let label_regs = document.createElement('b');
|
||||||
|
label_regs.setAttribute('class', '');
|
||||||
|
label_regs.innerText = 'Регистрация:';
|
||||||
|
|
||||||
|
// Инициализация значения времени регистрации
|
||||||
|
let value_regs = document.createElement('span');
|
||||||
|
value_regs.setAttribute('class', 'ml-auto');
|
||||||
|
value_regs.innerText = moment.unix(account.date.regs).locale('ru-ru').format('DD.MM.YYYY');
|
||||||
|
|
||||||
|
// Инициализация оболочки времени заявки
|
||||||
|
let wrap_supl = document.createElement('p');
|
||||||
|
wrap_supl.setAttribute('class', 'mt-0 mb-2 px-3 row');
|
||||||
|
|
||||||
|
// Инициализация ярлыка времени заявки
|
||||||
|
let label_supl = document.createElement('b');
|
||||||
|
label_supl.setAttribute('class', '');
|
||||||
|
label_supl.innerText = 'Заявка:';
|
||||||
|
|
||||||
|
// Инициализация значения времени заявки
|
||||||
|
let value_supl = document.createElement('span');
|
||||||
|
value_supl.setAttribute('class', 'ml-auto');
|
||||||
|
value_supl.innerText = moment.unix(account.date.supl).locale('ru-ru').format('DD.MM.YYYY');
|
||||||
|
|
||||||
|
// Инициализация кнопки сохранения
|
||||||
|
let button_save = document.createElement('a');
|
||||||
|
button_save.setAttribute('class', 'btn form-control button_blue');
|
||||||
|
button_save.setAttribute('type', 'button');
|
||||||
|
button_save.setAttribute('role', 'button');
|
||||||
|
button_save.innerText = 'Сохранить';
|
||||||
|
|
||||||
|
// Инициализация колонки с основными данными аккаунта
|
||||||
|
let block_info = document.createElement('div');
|
||||||
|
block_info.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_' + account._key);
|
||||||
|
block_info.setAttribute('class', 'col-4 d-flex flex-column');
|
||||||
|
|
||||||
|
// Инициализация ярлыка "NAME"
|
||||||
|
let label_name = document.createElement('label');
|
||||||
|
label_name.setAttribute('class', 'control-label');
|
||||||
|
label_name.innerText = 'Имя';
|
||||||
|
|
||||||
|
// Инициализация поля "NAME"
|
||||||
|
let input_name = document.createElement('input');
|
||||||
|
input_name.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_name_' + account._key);
|
||||||
|
input_name.setAttribute('class', 'form-control button_clean mb-3');
|
||||||
|
input_name.setAttribute('type', 'text');
|
||||||
|
input_name.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_name_edit(' + account._key + ', this);');
|
||||||
|
input_name.value = account.name;
|
||||||
|
|
||||||
|
// Инициализация ярлыка "SIMC" (телефон)
|
||||||
|
let label_simc = document.createElement('label');
|
||||||
|
label_simc.setAttribute('class', 'control-label');
|
||||||
|
label_simc.innerText = 'Номер';
|
||||||
|
|
||||||
|
// Инициализация поля "SIMC" (телефон)
|
||||||
|
let input_simc = document.createElement('input');
|
||||||
|
input_simc.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_simc_' + account._key);
|
||||||
|
input_simc.setAttribute('class', 'form-control button_clean mb-3');
|
||||||
|
input_simc.setAttribute('type', 'number');
|
||||||
|
input_simc.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_simc_edit(' + account._key + ', this);');
|
||||||
|
input_simc.value = account.simc;
|
||||||
|
|
||||||
|
// Инициализация ярлыка "MAIL"
|
||||||
|
let label_mail = document.createElement('label');
|
||||||
|
label_mail.setAttribute('class', 'control-label');
|
||||||
|
label_mail.innerText = 'Почта';
|
||||||
|
|
||||||
|
// Инициализация поля "MAIL"
|
||||||
|
let input_mail = document.createElement('input');
|
||||||
|
input_mail.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_mail_' + account._key);
|
||||||
|
input_mail.setAttribute('class', 'form-control button_clean');
|
||||||
|
input_mail.setAttribute('type', 'mail');
|
||||||
|
input_mail.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_mail_edit(' + account._key + ', this);');
|
||||||
|
input_mail.value = account.mail;
|
||||||
|
|
||||||
|
// Инициализация колонки с вторичными данными аккаунта
|
||||||
|
let block_details = document.createElement('div');
|
||||||
|
block_details.setAttribute('id', 'profile_panel_input_suppliers_requests_block_details_' + account._key);
|
||||||
|
block_details.setAttribute('class', 'col-4 pr-0 d-flex flex-column');
|
||||||
|
|
||||||
|
// Инициализация ярлыка "INDX"
|
||||||
|
let label_indx = document.createElement('label');
|
||||||
|
label_indx.setAttribute('class', 'control-label');
|
||||||
|
label_indx.innerText = 'Индекс';
|
||||||
|
|
||||||
|
// Инициализация оболочки "INDX"
|
||||||
|
let wrap_indx = document.createElement('div');
|
||||||
|
wrap_indx.setAttribute('class', 'row mx-0 mb-3');
|
||||||
|
|
||||||
|
// Инициализация поля "INDX"
|
||||||
|
let input_indx = document.createElement('input');
|
||||||
|
input_indx.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_indx_' + account._key);
|
||||||
|
input_indx.setAttribute('class', 'col form-control button_clean');
|
||||||
|
input_indx.setAttribute('type', 'text');
|
||||||
|
input_indx.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_indx_edit(' + account._key + ', this);');
|
||||||
|
input_indx.value = account.indx;
|
||||||
|
|
||||||
|
// Инициализация кнопки "INDX"
|
||||||
|
let button_indx = document.createElement('a');
|
||||||
|
button_indx.setAttribute('class', 'ml-2 my-auto text-dark');
|
||||||
|
button_indx.setAttribute('type', 'button');
|
||||||
|
button_indx.setAttribute('role', 'button');
|
||||||
|
button_indx.innerHTML = '<i class="fas fa-redo-alt"></i>';
|
||||||
|
|
||||||
|
// Инициализация ярлыка "PSWD"
|
||||||
|
let label_pswd = document.createElement('label');
|
||||||
|
label_pswd.setAttribute('class', 'control-label');
|
||||||
|
label_pswd.innerText = 'Пароль';
|
||||||
|
|
||||||
|
// Инициализация оболочки "PSWD"
|
||||||
|
let wrap_pswd = document.createElement('div');
|
||||||
|
wrap_pswd.setAttribute('class', 'row mx-0 mb-3');
|
||||||
|
|
||||||
|
// Инициализация поля "PSWD"
|
||||||
|
let input_pswd = document.createElement('input');
|
||||||
|
input_pswd.setAttribute('id', 'profile_panel_input_suppliers_requests_block_info_pswd_' + account._key);
|
||||||
|
input_pswd.setAttribute('class', 'col form-control button_clean');
|
||||||
|
input_pswd.setAttribute('type', 'text');
|
||||||
|
input_pswd.setAttribute('onchange', 'return profile_panel_input_suppliers_requests_block_pswd_edit(' + account._key + ', this);');
|
||||||
|
input_pswd.value = account.pswd;
|
||||||
|
|
||||||
|
// Инициализация кнопки "PSWD"
|
||||||
|
let button_pswd = document.createElement('a');
|
||||||
|
button_pswd.setAttribute('class', 'ml-2 my-auto text-dark');
|
||||||
|
button_pswd.setAttribute('type', 'button');
|
||||||
|
button_pswd.setAttribute('role', 'button');
|
||||||
|
button_pswd.innerHTML = '<i class="fas fa-redo-alt"></i>';
|
||||||
|
|
||||||
|
// Инициализация ярлыка "FILE"
|
||||||
|
let label_file = document.createElement('label');
|
||||||
|
label_file.setAttribute('class', 'control-label');
|
||||||
|
label_file.innerText = 'Карточка предприятия';
|
||||||
|
|
||||||
|
// Инициализация ссылки на "FILE"
|
||||||
|
let button_file = document.createElement('a');
|
||||||
|
button_file.setAttribute('class', 'btn form-control button_blue');
|
||||||
|
button_file.setAttribute('href', '/' + account._key + '/requests/supplier/' + account.date.supl + '/document');
|
||||||
|
button_file.innerHTML = 'Скачать';
|
||||||
|
|
||||||
|
// Компоновка элементов блока с основной информацией
|
||||||
|
wrap_id.appendChild(label_id);
|
||||||
|
wrap_id.appendChild(value_id);
|
||||||
|
block_metadata.appendChild(wrap_id);
|
||||||
|
wrap_regs.appendChild(label_regs);
|
||||||
|
wrap_regs.appendChild(value_regs);
|
||||||
|
block_metadata.appendChild(wrap_regs);
|
||||||
|
wrap_supl.appendChild(label_supl);
|
||||||
|
wrap_supl.appendChild(value_supl);
|
||||||
|
block_metadata.appendChild(wrap_supl);
|
||||||
|
block_metadata.appendChild(button_save);
|
||||||
|
|
||||||
|
// Компоновка элементов блока с основной информацией
|
||||||
|
block_info.appendChild(label_name);
|
||||||
|
block_info.appendChild(input_name);
|
||||||
|
block_info.appendChild(label_simc);
|
||||||
|
block_info.appendChild(input_simc);
|
||||||
|
block_info.appendChild(label_mail);
|
||||||
|
block_info.appendChild(input_mail);
|
||||||
|
|
||||||
|
// Компоновка элементов блока с вторичными данными
|
||||||
|
block_details.appendChild(label_indx);
|
||||||
|
wrap_indx.appendChild(input_indx);
|
||||||
|
wrap_indx.appendChild(button_indx);
|
||||||
|
block_details.appendChild(wrap_indx);
|
||||||
|
block_details.appendChild(label_pswd);
|
||||||
|
wrap_pswd.appendChild(input_pswd);
|
||||||
|
wrap_pswd.appendChild(button_pswd);
|
||||||
|
block_details.appendChild(wrap_pswd);
|
||||||
|
block_details.appendChild(label_file);
|
||||||
|
block_details.appendChild(button_file);
|
||||||
|
|
||||||
|
// Компоновка всех колонок
|
||||||
|
container.appendChild(block_metadata);
|
||||||
|
container.appendChild(block_info);
|
||||||
|
container.appendChild(block_details);
|
||||||
|
|
||||||
|
html.add(container);
|
||||||
|
|
||||||
|
if (i < suppliers.length) {
|
||||||
|
// Это не последний элемент в списке
|
||||||
|
|
||||||
|
// Инициализация разделителя (разобраться почему его надо генерировать заново - удаляется после add)
|
||||||
|
let divider = document.createElement('div');
|
||||||
|
divider.setAttribute('class', 'dropdown-divider mx-2 mb-2');
|
||||||
|
|
||||||
|
// Добавить разделитель
|
||||||
|
html.add(divider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Возврат
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
Reference in New Issue