Initial import

This commit is contained in:
Admin Nasledstvo
2026-05-01 20:52:04 +03:00
commit ac168868ee
10028 changed files with 2337954 additions and 0 deletions
@@ -0,0 +1,55 @@
<?php
if (!empty($_GET['webview_mode'])):
\app\models\Ts::set([194])
?>
<link rel="stylesheet" href="/_public/assets/fonts/line-awesome/css/line-awesome.min.css">
<style>
header, .page-header, footer, .cart, .mobile-logo {display: none !important;}
.main-profile-panel, .booking-panel { margin: 0 !important; !important;}
.content {width: calc(100% - 20px) !important; padding: 60px 10px 10px 10px !important;}
.panel-box { background: #FFFFFF; border: 0}
.header-app {
background: #FFFFFF;
width: 100%;
text-align: center;
height: 50px;
line-height: 50px;
position: fixed;
box-shadow: 0 5px 10px rgba(0,0,0, 0.4);
top: 0;
left: 0;
}
.close-browser-in-app {
position: absolute;
color: #FFFFFF;
background: #000000;
width: 25px;
height: 25px;
right: 15px;
top: 14px;
font-size: 20px;
text-align: center;
line-height: 27px;
border-radius: 5px !important;
}
</style>
<script>
const closeBrowseBtn = document.createElement('div');
closeBrowseBtn.className = 'close-browser-in-app';
closeBrowseBtn.innerHTML = '<i class="la la-times"></i>';
closeBrowseBtn.addEventListener('click', () => {
window.location.href = '<?= Yii::$app->params['portal'] ?>/bg/mobile-api/browser-close/'
})
const headerApp = document.createElement('div');
headerApp.className = 'header-app';
headerApp.innerHTML = '<?= \app\models\Ts::get(194)?>'
headerApp.appendChild(closeBrowseBtn);
window.addEventListener('DOMContentLoaded', function () {
document.body.appendChild(headerApp);
})
</script>
<?php endif ?>
@@ -0,0 +1,12 @@
<?php
/* @var $this \yii\web\View */
if (!empty($_GET['id'])):
$help = \app\models\Help::findOne($_GET['id']);
?>
<div class="content-body-title"><?=$help->title?></div>
<div class="content-body-text">
<?= $help->text ?>
</div>
<?php endif; ?>
@@ -0,0 +1,57 @@
<?php
/**
* @var $guide_type
*/
if (!empty($_FILES) && !empty($_GET['upload'])) {
if ($_FILES['upload-cms-guide']['error'] !== UPLOAD_ERR_OK) {
// Handle the error
switch ($_FILES['upload-cms-guide']['error']) {
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
echo "The uploaded file exceeds the maximum file size.";
break;
case UPLOAD_ERR_PARTIAL:
echo "The uploaded file was only partially uploaded.";
break;
case UPLOAD_ERR_NO_FILE:
echo "No file was uploaded.";
break;
case UPLOAD_ERR_NO_TMP_DIR:
echo "Missing a temporary folder.";
break;
case UPLOAD_ERR_CANT_WRITE:
echo "Failed to write file to disk.";
break;
case UPLOAD_ERR_EXTENSION:
echo "A PHP extension stopped the file upload.";
break;
default:
echo "An unknown error occurred.";
break;
}
}
echo json_encode($_FILES);
if (!empty($_FILES['upload-cms-guide'])) {
$file = $_FILES['upload-cms-guide'];
$type = $file['type'];
$file_size = $file['size'];
//if (!$type == 'application/pdf') {
// echo json_encode(['error' => 'Качения файл не е pdf']);
//}
$file_size_mb = round($file_size / 1048576, 2);
//if ($file_size_mb > 20) {
// echo json_encode(['error' => 'Качения файл не е по-голям от 20 МБ']);
//}
$lg = $_GET['lg'] ?? 'bg';
$path = $_SERVER['DOCUMENT_ROOT'] . '/_public/guides/'. $guide_type . '-' . $lg . '.pdf';
move_uploaded_file($file["tmp_name"], $path);
$_SESSION['flash'] = [];
$_SESSION['flash']['success'] = true;
$_SESSION['flash']['msg'] = 'Файла е качен успешно';
echo json_encode(['success' => 1]);
}
exit;
}
@@ -0,0 +1,57 @@
<?php
/**
* @var $guide_type
*/
if (!empty($_FILES) && !empty($_GET['upload'])) {
if ($_FILES['upload-cms-qa']['error'] !== UPLOAD_ERR_OK) {
// Handle the error
switch ($_FILES['upload-cms-qa']['error']) {
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
echo "The uploaded file exceeds the maximum file size.";
break;
case UPLOAD_ERR_PARTIAL:
echo "The uploaded file was only partially uploaded.";
break;
case UPLOAD_ERR_NO_FILE:
echo "No file was uploaded.";
break;
case UPLOAD_ERR_NO_TMP_DIR:
echo "Missing a temporary folder.";
break;
case UPLOAD_ERR_CANT_WRITE:
echo "Failed to write file to disk.";
break;
case UPLOAD_ERR_EXTENSION:
echo "A PHP extension stopped the file upload.";
break;
default:
echo "An unknown error occurred.";
break;
}
}
echo json_encode($_FILES);
if (!empty($_FILES['upload-cms-qa'])) {
$file = $_FILES['upload-cms-qa'];
$type = $file['type'];
$file_size = $file['size'];
//if (!$type == 'application/pdf') {
// echo json_encode(['error' => 'Качения файл не е pdf']);
//}
$file_size_mb = round($file_size / 1048576, 2);
//if ($file_size_mb > 20) {
// echo json_encode(['error' => 'Качения файл не е по-голям от 20 МБ']);
//}
$lg = $_GET['lg'] ?? 'bg';
$path = $_SERVER['DOCUMENT_ROOT'] . '/_public/guides/'. $guide_type . '-' . $lg . '.pdf';
move_uploaded_file($file["tmp_name"], $path);
$_SESSION['flash'] = [];
$_SESSION['flash']['success'] = true;
$_SESSION['flash']['msg'] = 'Файла е качен успешно';
echo json_encode(['success' => 1]);
}
exit;
}
@@ -0,0 +1,30 @@
<?php
use app\models\AboutProject;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
$_GET['id'] = 1;
$_GET['o'] = 'w';
FormWidget::widget([
'top' => [
'title' => 'Нова помощна информация',
'title_edit' => 'За проекта',
'data' => [
'index/dashboard' => 'Начало',
'index/help' => 'Помощна информация',
],
],
'tabs' => $tabs ?? [],
'writeView' => "index/tabs/main/about_project_w",
'model' => AboutProject::class,
'validation' => function ($p) {
return null;
},
'postService' => function ($p, AboutProject $model) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
$model->redirectTo('index/about-project');
}
]);
@@ -0,0 +1,60 @@
<?php
use app\widgets\services\Includes;
Includes::top('Начално табло');
$users_count = \app\models\UserPublic::find()->count();
$register_objects = \app\models\RegisterObjects::find()->where(['lib_type' => 1])->count();
$collections = \app\models\register\Collections::find()->where(['deleted' => 0])->count();
$expositions = \app\models\Expositions::find()->count();
$publications = \app\models\RegisterObjects::find()->where(['lib_type' => 2])->count();
$lg = !empty($_COOKIE['cookie_lg']) ? '/'.$_COOKIE['cookie_lg'].'/' : '';
?>
<div class="flex">
<div class="dashboard-info-cm">
<div class="label">Брой публични потребители</div>
<div class="count"><?= $users_count ?></div>
</div>
<div class="dashboard-info-cm">
<div class="label">Брой обекти</div>
<div class="count"><?= $register_objects ?></div>
</div>
<div class="dashboard-info-cm">
<div class="label">Брой колекции</div>
<div class="count"><?= $collections ?></div>
</div>
<div class="dashboard-info-cm">
<div class="label">Брой експозиции</div>
<div class="count"><?= $expositions ?></div>
</div>
<div class="dashboard-info-cm">
<div class="label">Брой научни публикации</div>
<div class="count"><?= $publications ?></div>
</div>
</div>
<div class="p5 top30">
<div class="flex flex-wrap">
<div class="dashboard-plate">
<div class="title">Публичен портал</div>
<a target="_blank" class="button" href="<?= Yii::$app->params['portal'] . $lg ?>">Влизане в Публичен портал</a>
</div>
<div class="dashboard-plate">
<div class="title">Дигитален магазин</div>
<a class="button" href="/admin-global/products/subscriptions/">Влизане в Дигитален магазин</a>
</div>
<div class="dashboard-plate">
<div class="title">Потребители</div>
<a class="button" href="/admin-global/user/public/">Влизане в Потребители</a>
</div>
<div class="dashboard-plate">
<div class="title">
Табло на вътрешен портал
</div>
<a target="_blank" class="button" href="<?= Yii::$app->params['register'] ?>">Вход</a>
</div>
</div>
</div>
@@ -0,0 +1,97 @@
<?php
echo $this->render('_upload_file_guide', ['guide_type' => 'cms-guide']);
$lg = $_GET['lg'] ?? 'bg';
?>
<div class="flex top">
<div class="top-title">Ръководство на потребителя</div>
<div class="breadcrumb p10">
<a href="/admin-global/index/dashboard">Начало</a>
<span>Ръководство на потребителя</span>
</div>
</div>
<div class="inner-content p10">
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
class="lg lg-bg"></i> Български</a>
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
class="lg lg-en"></i> Английски</a>
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
id="progress"></span></div>
</div>
<div class="top10">
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/cms-guide-' . $lg . '.pdf')): ?>
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/cms-guide-' . $lg . '.pdf?time='. time() ?>"
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
<?php endif; ?>
</div>
</div>
<style>
.guide-link {
border: 1px solid #cccccc !important;
}
.guide-link.selected {
background: var(--base-background-ultra-bright-clear) !important;
}
.modalImg {
height: auto !important;
max-height: none !important;
}
.modalImg img {
height: auto !important;
width: 100% !important;
display: block;
}
</style>
<script>
window.onscroll = function () {
const ab = one('.action-buttons');
if (ab) {
if (window.pageYOffset > ab.offsetTop) {
ab.addClass('buttons-top')
} else {
ab.removeClass('buttons-top')
}
}
}
function openZoomImg(src) {
modal.modalPreview(src)
}
function uploadDocument(btn) {
const process = document.querySelector('#progress')
const fileInput = document.createElement('input')
fileInput.type = 'file';
fileInput.name = 'upload-cms-guide'
//fileInput.accept = '.pdf'
fileInput.addEventListener('change', () => {
btn.classList.add('disabled')
const file = fileInput.files[0];
const formData = new FormData();
formData.append('upload-cms-guide', file);
const xhr = new XMLHttpRequest()
xhr.upload.addEventListener('progress', (event) => {
const percentComplete = event.loaded / event.total * 100;
process.innerHTML = ` ${parseInt(percentComplete)}%`
if (percentComplete === 100) {
setTimeout(function () {
process.innerHTML = ''
btn.classList.add('disabled')
window.location.reload()
}, 2000)
}
});
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
xhr.send(formData);
})
fileInput.click()
}
</script>
@@ -0,0 +1,97 @@
<?php
echo $this->render('_upload_file_guide', ['guide_type' => 'portal-guide']);
$lg = $_GET['lg'] ?? 'bg';
?>
<div class="flex top">
<div class="top-title">Ръководство на публичен портал</div>
<div class="breadcrumb p10">
<a href="/admin-global/index/dashboard">Начало</a>
<span>Ръководство на публичен портал</span>
</div>
</div>
<div class="inner-content p10">
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
class="lg lg-bg"></i> Български</a>
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
class="lg lg-en"></i> Английски</a>
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
id="progress"></span></div>
</div>
<div class="top10">
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/portal-guide-' . $lg . '.pdf')): ?>
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/portal-guide-' . $lg . '.pdf?time='. time() ?>"
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
<?php endif; ?>
</div>
</div>
<style>
.guide-link {
border: 1px solid #cccccc !important;
}
.guide-link.selected {
background: var(--base-background-ultra-bright-clear) !important;
}
.modalImg {
height: auto !important;
max-height: none !important;
}
.modalImg img {
height: auto !important;
width: 100% !important;
display: block;
}
</style>
<script>
window.onscroll = function () {
const ab = one('.action-buttons');
if (ab) {
if (window.pageYOffset > ab.offsetTop) {
ab.addClass('buttons-top')
} else {
ab.removeClass('buttons-top')
}
}
}
function openZoomImg(src) {
modal.modalPreview(src)
}
function uploadDocument(btn) {
const process = document.querySelector('#progress')
const fileInput = document.createElement('input')
fileInput.type = 'file';
fileInput.name = 'upload-cms-guide'
//fileInput.accept = '.pdf'
fileInput.addEventListener('change', () => {
btn.classList.add('disabled')
const file = fileInput.files[0];
const formData = new FormData();
formData.append('upload-cms-guide', file);
const xhr = new XMLHttpRequest()
xhr.upload.addEventListener('progress', (event) => {
const percentComplete = event.loaded / event.total * 100;
process.innerHTML = ` ${parseInt(percentComplete)}%`
if (percentComplete === 100) {
setTimeout(function () {
process.innerHTML = ''
btn.classList.add('disabled')
window.location.reload()
}, 2000)
}
});
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
xhr.send(formData);
})
fileInput.click()
}
</script>
@@ -0,0 +1,147 @@
<?php if($_SERVER['REQUEST_METHOD'] != 'POST'): ?>
<style>
.help-logic {
padding: 20px 0 0 10px
}
.help-logic p {
font-size: 12px;
font-style: italic;
color: var(--base-background-super-dark);
width: 500px;
display: block;
}
.help-key-btn {
height: 35px;
background: #FFFFFF;
border: 1px solid var(--base-background-dark);
color: var(--base-background-dark);
cursor: pointer;
}
.help-key-btn.inactive {
background: darkmagenta;
color: #FFFFFF;
border: 1px solid darkmagenta;
}
.help-key-btn:hover {
background: var(--base-background-ultra-bright-clear);
color: var(--base-background-super-dark);
}
.help-key-btn.inactive:hover {
color: darkmagenta;
}
</style>
<div class="help-logic">
<?php if (empty($_SESSION['help_keys'])): ?>
<button onclick="helpKeys('active')" class="help-key-btn active">Активирай показване на ключовете за помощна
информация
</button>
<p><i class="la la-info-circle"></i> При активиране на "показване на ключовете за помощна информация" ще
покажете текстов ключ, който ще се намира
до всяко поле за въвеждане във формите за създаване или редакция на цялата система.</p>
<?php else: ?>
<button onclick="helpKeys('inactive')" class="help-key-btn inactive">Деактивирай показване на ключовете за
помощна информация
</button>
<p><i class="la la-info-circle"></i> При деактивиране на "показване на ключовете за помощна информация" ще
скриете текстовия ключ, който се намира до всяко поле за въвеждане във формите за създаване или редакция на
цялата система.</p>
<?php endif; ?>
</div>
<?php endif; ?>
<?php
use app\models\Help;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$filter = Yii::$app->getFilterData('and');
$filter[0] = 'and';
TableWidget::widget([
'top' => [
'title' => 'Помощна информация',
'data' => [
'index/dashboard' => 'Начало',
]
],
'filter' => [
[
'title' => ['Заглавие на помощна информация', 'c4'],
'key' => ['Ключ', 'c4'],
],
],
'actions' => [
//'new' => 'Добавяне',
'edit' => 'Редакция на помощна информация',
'delete' => 'Изтриване на помощна информация'
],
'th' => [
'№' => 'c0 text-right',
'Ключ' => '',
'Заглавие на помощна информация' => '',
],
'model' => Help::class,
'data' => Help::find()->where(Yii::$app->getFilterData('or'))->loop([
'id',
function (Help $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->key . '</a>';
},
'title'
], $_GET['p'] ?? 1, 50)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова помощна информация',
'title_edit' => 'Редакция помощна информация',
'data' => [
'index/dashboard' => 'Начало',
'index/help' => 'Помощна информация',
],
],
'tabs' => $tabs ?? [],
'writeView' => "index/tabs/" . Includes::tab($tab) . "/help_w",
'model' => Help::class,
'validation' => function ($p) use ($tab) {
if (empty($p->{'key'}))
return ["key" => 'Ключът е задължителен'];
if (empty($p->{'title'}))
return ["title" => 'Моля, въведете заглавие на помощната информация'];
if (empty($p->{'text'}))
return ["text" => 'Моля, попълнете текста'];
return null;
},
'postService' => function ($p, Help $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
$model->smartRedirect();
}
]);
?>
<?php if($_SERVER['REQUEST_METHOD'] != 'POST'): ?>
<script>
function helpKeys(action) {
request({
url: '/admin-global/help-keys-remote/prepare-help/?help_keys=' + action,
done: () => {
window.location.reload()
}
})
}
</script>
<?php endif; ?>
@@ -0,0 +1,58 @@
<?php
use app\models\History;
use app\models\Subscriptions;
use app\models\TourObjects;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$filter = Yii::$app->getFilterData('and');
$filter[0] = 'and';
TableWidget::widget([
'top' => [
'title' => 'Хронология',
'data' => [
'index/dashboard' => 'Начало',
]
],
//'filter' => [
// [
// 'name' => ['Име на туристическия обект', 'c4'],
// ],
//],
'actions' => [],
'th' => [
'№' => 'c0 text-right',
'Потребител' => '',
'Действие' => '',
'Какво' => '',
'Дата и час' => '',
],
'model' => History::class,
'data' => History::find()->where(Yii::$app->getFilterData('and'))->orderBy(['date_time' => SORT_DESC])->loop([
'id',
'user',
function (History $h) {
switch ($h->action) {
case 1:
return '<span style="color: cornflowerblue; font-weight: bold"><i class="la la-plus-circle"></i> Въвеждане</span>';
case 2:
return '<span style="color: #228827; font-weight: bold"><i class="la la-pencil-square-o"></i> Редакция</span>';
}
},
function(History $h) {
return $h->table_name.' ID:'.$h->history_id;
},
function (History $h) {
return $h->formatDate($h->date_time, 'd.m.Y H:i');
}
], $_GET['p'] ?? 1, 50)
]);
@@ -0,0 +1,74 @@
<?php
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
use app\models\Inquiries;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$filter = Yii::$app->getFilterData('and');
$filter[0] = 'and';
TableWidget::widget([
'top' => [
'title' => 'Запитвания',
'data' => [
'index/dashboard' => 'Начало',
]
],
'filter' => [
[
'name' => ['Име', 'c4'],
'email' => ['Ел. поща', 'c4'],
],
],
'actions' => [
'delete' => 'Изтриване на помощна информация'
],
'th' => [
'№' => 'c0 text-right',
'Име' => 'c1',
'Ел. поща' => 'c2',
'Действие' => 'c2',
'Какво не е наред' => '',
'Дата' => 'c0'
],
'model' => Inquiries ::class,
'data' => Inquiries::find()->where(Yii::$app->getFilterData('or'))->orderBy(['date_time' => SORT_DESC])->loop([
'id',
'name',
'email',
'operation',
'error',
function (Inquiries $i) {
if ($i->date_time)
return '<div class="ct">'.date('d.m.Y H:i ч.', strtotime($i->date_time)).'</div>';
}
], $_GET['p'] ?? 1, 50)
]);
FormWidget::widget([
'top' => [
'title' => '',
'title_edit' => 'Преглед запитване',
'data' => [
'index/dashboard' => 'Начало',
'index/inquiries' => 'Запитвания',
],
],
'tabs' => $tabs ?? [],
'writeView' => "index/tabs/" . Includes::tab($tab) . "/inquiries_w",
'model' => Inquiries::class,
'validation' => function ($p) use ($tab) {
return null;
},
'postService' => function ($p, Inquiries $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,97 @@
<?php
echo $this->render('_upload_file_qa', ['guide_type' => 'cms-qa']);
$lg = $_GET['lg'] ?? 'bg';
?>
<div class="flex top">
<div class="top-title">Въпроси и отговори</div>
<div class="breadcrumb p10">
<a href="/admin-global/index/dashboard">Начало</a>
<span>Въпроси и отговори</span>
</div>
</div>
<div class="inner-content p10">
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
class="lg lg-bg"></i> Български</a>
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
class="lg lg-en"></i> Английски</a>
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
id="progress"></span></div>
</div>
<div class="top10">
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/cms-qa-' . $lg . '.pdf')): ?>
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/cms-qa-' . $lg . '.pdf?time='. time() ?>"
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
<?php endif; ?>
</div>
</div>
<style>
.guide-link {
border: 1px solid #cccccc !important;
}
.guide-link.selected {
background: var(--base-background-ultra-bright-clear) !important;
}
.modalImg {
height: auto !important;
max-height: none !important;
}
.modalImg img {
height: auto !important;
width: 100% !important;
display: block;
}
</style>
<script>
window.onscroll = function () {
const ab = one('.action-buttons');
if (ab) {
if (window.pageYOffset > ab.offsetTop) {
ab.addClass('buttons-top')
} else {
ab.removeClass('buttons-top')
}
}
}
function openZoomImg(src) {
modal.modalPreview(src)
}
function uploadDocument(btn) {
const process = document.querySelector('#progress')
const fileInput = document.createElement('input')
fileInput.type = 'file';
fileInput.name = 'upload-cms-qa'
//fileInput.accept = '.pdf'
fileInput.addEventListener('change', () => {
btn.classList.add('disabled')
const file = fileInput.files[0];
const formData = new FormData();
formData.append('upload-cms-qa', file);
const xhr = new XMLHttpRequest()
xhr.upload.addEventListener('progress', (event) => {
const percentComplete = event.loaded / event.total * 100;
process.innerHTML = ` ${parseInt(percentComplete)}%`
if (percentComplete === 100) {
setTimeout(function () {
process.innerHTML = ''
btn.classList.add('disabled')
window.location.reload()
}, 2000)
}
});
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
xhr.send(formData);
})
fileInput.click()
}
</script>
@@ -0,0 +1,97 @@
<?php
echo $this->render('_upload_file_qa', ['guide_type' => 'portal-qa']);
$lg = $_GET['lg'] ?? 'bg';
?>
<div class="flex top">
<div class="top-title">Въпроси и отговори портал</div>
<div class="breadcrumb p10">
<a href="/admin-global/index/dashboard">Начало</a>
<span>Въпроси и отговори портал</span>
</div>
</div>
<div class="inner-content p10">
<div class="action-buttons" style="border-bottom: 4px solid #f1f1f1; padding-bottom: 10px">
<a href="?lg=bg" class="btn-ib btn-default ct guide-link <?= $lg == 'bg' ? 'selected' : '' ?>"><i
class="lg lg-bg"></i> Български</a>
<a href="?lg=en" class="btn-ib btn-default ct guide-link <?= $lg == 'en' ? 'selected' : '' ?>"><i
class="lg lg-en"></i> Английски</a>
<div onclick="uploadDocument(this)" class="btn-ib btn-default"><i class="la la-file-pdf"></i> Качи документ<span
id="progress"></span></div>
</div>
<div class="top10">
<?php if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/_public/guides/portal-qa-' . $lg . '.pdf')): ?>
<iframe src="<?= Yii::$app->params['cms'] . '/_public/guides/portal-qa-' . $lg . '.pdf?time='. time() ?>"
style="height: calc(100vh - 200px); width: 100%; border: 0"></iframe>
<?php endif; ?>
</div>
</div>
<style>
.guide-link {
border: 1px solid #cccccc !important;
}
.guide-link.selected {
background: var(--base-background-ultra-bright-clear) !important;
}
.modalImg {
height: auto !important;
max-height: none !important;
}
.modalImg img {
height: auto !important;
width: 100% !important;
display: block;
}
</style>
<script>
window.onscroll = function () {
const ab = one('.action-buttons');
if (ab) {
if (window.pageYOffset > ab.offsetTop) {
ab.addClass('buttons-top')
} else {
ab.removeClass('buttons-top')
}
}
}
function openZoomImg(src) {
modal.modalPreview(src)
}
function uploadDocument(btn) {
const process = document.querySelector('#progress')
const fileInput = document.createElement('input')
fileInput.type = 'file';
fileInput.name = 'upload-cms-qa'
//fileInput.accept = '.pdf'
fileInput.addEventListener('change', () => {
btn.classList.add('disabled')
const file = fileInput.files[0];
const formData = new FormData();
formData.append('upload-cms-qa', file);
const xhr = new XMLHttpRequest()
xhr.upload.addEventListener('progress', (event) => {
const percentComplete = event.loaded / event.total * 100;
process.innerHTML = ` ${parseInt(percentComplete)}%`
if (percentComplete === 100) {
setTimeout(function () {
process.innerHTML = ''
btn.classList.add('disabled')
window.location.reload()
}, 2000)
}
});
xhr.open('POST', '?upload=true&lg=<?= $lg ?>');
xhr.send(formData);
})
fileInput.click()
}
</script>
@@ -0,0 +1,62 @@
<?php
/** @var \app\models\AboutProject $model */
use app\widgets\FileWidget;
use app\widgets\services\Includes;
$media_key = $model->getMediaKey();
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c9 top15">
<label>Лога български език</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'about_project_logos',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображения',
'edit' => 'Редакция на изображение',
'delete' => 'Премахване на изображения'
],
'resolutions' => ['3:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<div class="row c9 top15">
<label>Лога английски език</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'about_project_logos_en',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображения',
'edit' => 'Редакция на изображение',
'delete' => 'Премахване на изображения'
],
'resolutions' => ['3:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<div class="c10 row top15">
<label>Текст BG</label>
<textarea name="text_bg" placeholder="Въведи текст BG"><?= $model->text_bg ?></textarea>
</div>
<div class="c10 row top15">
<label>Текст EN</label>
<textarea name="text_en" placeholder="Въведи текст EN"><?= $model->text_en ?></textarea>
</div>
<div class="row c9 top15 flex">
<button id="save" class="btn btn-default">
<i class="la la-save"></i> Актуализация
</button>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
@@ -0,0 +1,54 @@
<?php
use app\widgets\services\Includes;
/**
* @var \app\models\Help $model
*/
?>
<div class="inner-content p10">
<?php if ($model->id): ?>
<div class="btn btn-default" style="width: 280px; text-align: center"
onclick="deleteHelpInfo(this)" data-id="<?= $model->id ?>">
<i
class="la la-trash"></i> Изтрий помощната информация
</div>
<?php endif; ?>
<form autocomplete="off">
<div class="c10 row top15">
<label>Ключ на помощната информация</label>
<input readonly name="key" placeholder="Полето се въвежда автоматично" value="<?= $model->key ?>"/>
</div>
<div class="c10 row top15">
<label>Заглавие на помощната информация</label>
<input name="title" placeholder="Въведи заглавие на помощната информация" value="<?= $model->title ?>"/>
</div>
<div class="c10 row top15">
<label>Текст</label>
<textarea class="ckEditor" name="text"
placeholder="Въведи текст на помощната информация"><?= $model->text ?></textarea>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('index/help') ?>
</div>
</form>
</div>
<script>
function deleteHelpInfo(e) {
let id = e.dataset.id
modal.confirm('Сигурни ли сте, че искате да изтриете помощната информация', () => {
request({
url: '/admin-global/help-keys-remote/delete-help/',
post: {id},
done: r => {
if (r.url_to) {
window.location.href = r.url_to
}
}
})
})
}
</script>
@@ -0,0 +1,75 @@
<?php
use app\models\ExplorerObjects;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$filter = Yii::$app->getFilterData('and');
$filter[0] = 'and';
TableWidget::widget([
'top' => [
'title' => 'Обекти за стани изследовател',
'data' => [
'index/dashboard' => 'Начало',
]
],
'actions' => [
'new' => 'Нов обект',
'edit' => 'Редакция обект',
'delete' => 'Изтриване обект'
],
'th' => [
'№' => 'c0 text-right',
'Име на обект' => '',
'Бр. точки' => ''
],
'model' => ExplorerObjects::class,
'data' => ExplorerObjects::find()->where(Yii::$app->getFilterData('and'))->loop([
'id',
function (ExplorerObjects $model) {
if($model->tourObject)
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->tourObject->name . '</a>';
},
'points'
], $_GET['p'] ?? 1, 50)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов туристически обект',
'title_edit' => 'Редакция туристически обект',
'data' => [
'index/dashboard' => 'Начало',
'mobile-app/become-an-explorer-objects' => 'Стани изследовател обекти',
],
],
'tabs' => $tabs ?? [],
'writeView' => "mobile-app/tabs/" . Includes::tab($tab) . "/tour_objects_w",
'model' => ExplorerObjects::class,
'validation' => function ($p) {
if (empty($p->{'tour_object_id'})) {
return ['tour_object_id' => 'Моля, изберете туристически обект'];
} else {
$filter = ['tour_object_id' => $p->tour_object_id];
if(!empty($_GET['id']))
$filter = ['and', ['=', 'tour_object_id', $p->tour_object_id], ['!=', 'id', $_GET['id']]];
$exists = ExplorerObjects::find()->where($filter)->exists();
if($exists)
return ['tour_object_id' => 'Туристическия обект вече е добавен, моля изберете друг'];
}
if (empty($p->{'points'}))
return ['points' => 'Моля, попълнете брой точки за получаване при посещение на туристическия обект.'];
},
'postService' => function ($p, ExplorerObjects $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,111 @@
<?php
use app\models\TourObjects;
/**
* @var $model TourObjects;
*/
$lat = $model->latitude ?? 42.698334;
$lon = $model->longitude ?? 23.319941;
?>
<link rel="stylesheet" href="/_public/plugins/leafletjs/leaflet.css">
<script src="/_public/plugins/leafletjs/leaflet.js"></script>
<style>
.search-location {
position: relative;
}
.search-location .result {
position: absolute;
top: 40px;
left: 0;
background: #FFFFFF;
z-index: 10000000;
padding: 5px;
display: none;
}
.search-location .result .row-result {
padding: 5px;
border: 1px solid #ccc;
background: #f1f1f1;
margin-bottom: 3px;
}
#map {
width: 100%;
height: 800px;
border: 1px solid var(--base-background-dark);
border-radius: 5px;
margin-top: 10px;
}
</style>
<div class="search-location c6">
<input placeholder="Търси">
<div class="result"></div>
</div>
<div id="map"></div>
<script>
const inputSearchLocation = document.querySelector('.search-location input');
const results = document.querySelector('.search-location .result');
let mapOptions = {
center: [<?=$lat ?>, <?= $lon ?>],
zoom: 13
}
let map = new L.map('map', mapOptions);
let layer = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
map.addLayer(layer);
let marker = new L.Marker([<?=$lat?>, <?= $lon?>]);
marker.addTo(map);
map.on('click', function(e){
let coord = e.latlng;
let lat = coord.lat;
let lon = coord.lng;
setNewLocation({lat, lon})
});
inputSearchLocation.addEventListener('keyup', () => {
request({
url: `https://nominatim.openstreetmap.org/search.php?q=${inputSearchLocation.value}&accept-language=bg&countrycodes=bg&limit=10&format=jsonv2`,
done: res => {
results.innerHTML = '';
res = res || [];
res.forEach(r => {
let row = document.createElement('div')
row.className = 'row-result';
console.log(r);
row.innerHTML = `<span>${r.display_name}</span>`;
row.addEventListener('click', function () {
if (r.lat && r.lon) {
setNewLocation(r)
}
})
results.appendChild(row)
})
if (res.length > 0) {
results.style.display = 'block'
} else {
results.style.display = 'none'
}
}
})
})
function setNewLocation(r) {
document.querySelector('[name="latitude"]').value = r.lat
document.querySelector('[name="longitude"]').value = r.lon
marker.setLatLng([r.lat, r.lon])
let latLon = [marker.getLatLng()];
let markerBounds = L.latLngBounds(latLon);
map.fitBounds(markerBounds);
results.innerHTML = ''
results.style.display = 'none'
}
</script>
@@ -0,0 +1,62 @@
<?php
use app\models\TourObjects;
use app\widgets\FileWidget;
use app\widgets\services\Includes;
/**
* @var \app\models\ExplorerObjects $model
*/
$media_key = $model->getMediaKey();
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="c10 row top15">
<label class="require">Туристически обект</label>
<div class="flex row row-panel">
<select class="search-select-box" name="tour_object_id" style="display: none">
<option value="">- Избери туристически обект -</option>
<?php foreach (TourObjects::find()->all() as $tObject): ?>
<option <?= $model->tour_object_id == $tObject->id ? 'selected' : '' ?>
value="<?= $tObject->id ?>"><?= $tObject->name ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="c10 row top15">
<label class="require">Бр. точки</label>
<input name="points" data-format="integer" value="<?= $model->points ?>">
</div>
<div class="row top15" style="width: 350px">
<label>Изображение</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'explorer_object_image',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне',
'edit' => 'Редакция',
'delete' => 'Премахване'
],
'single_file' => true,
'resolutions' => ['1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('mobile-app/become-an-explorer-objects') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<script src="/_public/assets/js/search-box.js"></script>
<script>
all('.search-select-box').forEach(el => {
new SearchBox(el)
})
</script>
@@ -0,0 +1,86 @@
<?php
use app\models\UserAdminGlobal;
use app\models\UserPublic;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
$filter = [];
$filter['is_mobile_user'] = 1;
$u = Auth::userAdminGlobal();
TableWidget::widget([
'filter' => [
['email' => ['Ел. поща', 'c3']]
],
'top' => [
'title' => 'Потребители мобилно приложение',
'data' => [
'index/dashboard' => 'Начало',
'mobile-app/become-an-explorer-objects' => 'Мобилно приложение',
]
],
'actions' => [
//'new' => 'Нов потребител',
//'edit' => 'Редакция потребител',
//'delete' => 'Изтриване потребител',
'export' => 'Експорт (csv)'
],
'th' => [
'№' => 'c0 text-right',
'Ел. поща' => 'c3',
'Име' => '',
'Клубна карта' => 'c1 ct',
'Бр. точки' => 'c1 ct',
'Активен' => 'c02 ct'
],
'data' => UserPublic::find()->where($filter)->andWhere(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
'id',
function (UserPublic $model) {
return '<a href="?o=w&id=' . $model->id . '">' . $model->email . '</a>';
},
'full_name',
function (UserPublic $model) {
return $model->club_card ? '<span style="color: green">да</span>' : '<span style="color: darkred">не</span>';
},
function (UserPublic $model) {
return $model->getExplorerObjectsSumPoints();
},
function (UserPublic $model) {
return $model->statusSwitch('is_active', null, ['Потребителя е активиран', 'Потребителя е деактивиран']);
},
], $_GET['p'] ?? 1, 30),
//'ignoreIds' => [$u->id],
'exportData' => function () {
return [
'header' => [
'ID' => ['integer', 10],
'E-mail' => ['string', 50],
'Име и фамилия' => ['string', 50],
],
'data' => UserPublic::find()->where(Yii::$app->getFilterData())->orderBy(['full_name' => SORT_ASC])->loop([
'id',
'full_name',
'email',
]),
'file_name' => 'Потребители_публичен_портал' . date('Y_m_d_H_i')
];
}
]);
FormWidget::widget([
'top' => [
'title' => 'Потребител',
'title_edit' => 'Преглед на потребител',
'data' => [
'index/dashboard' => 'Начало',
'mobile-app/become-an-explorer-objects' => 'Мобилно приложение',
'mobile-app/users' => 'Потребители',
]
],
'writeView' => 'mobile-app/tabs/main/public-user_w',
'model' => UserPublic::class,
]);
@@ -0,0 +1,31 @@
<?php
use app\widgets\TableWidget;
use app\models\register\Fields;
$tab = $_GET['tab'] ?? 'main';
TableWidget::widget([
'top' => [
'title' => 'Номенклатури',
'data' => [
'index/dashboard' => 'Начало'
]
],
'actions' => [
//'new' => 'Нова категория',
//'edit' => 'Редакция на категория',
//'delete' => 'Изтриване на категория'
],
'th' => [
'№' => 'c0 text-right',
'Номенклатура' => '',
],
'data' => Fields::find()->where(['parent_id' => 0])->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Fields $model) {
return $model->name;
},
], $_GET['p'] ?? 1, 30)
]);
@@ -0,0 +1,105 @@
<?php
use app\models\Categories;
use app\models\History;
use app\models\Partner;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$model = Categories::getModel();
$tab = $_GET['tab'] ?? 'main';
TableWidget::widget([
'top' => [
'title' => 'Категории',
'data' => [
'index/dashboard' => 'Начало'
]
],
'actions' => [
'new' => 'Нова категория',
'edit' => 'Редакция на категория',
'delete' => 'Изтриване на категория'
],
'th' => [
'№' => 'c0 text-right',
'Наименование на категория (bg)' => '',
'Наименование на категория (en)' => '',
],
'data' => Categories::find()->where(['IS', 'parent_id', NULL])->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Categories $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (Categories $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->ts_en_name . '</a>';
},
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова категория',
'title_edit' => 'Редакция на категория',
'data' => [
'index/dashboard' => 'Начало',
'nomenclature/categories' => 'Номенклатури - Категории'
],
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "nomenclature/tabs/main/categories_w" : "nomenclature/tabs/" . Includes::tab($tab) . "/categories_w",
'model' => Categories::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете наименование на категорията'];
if (empty($p->{'ts_en_name'}))
return ["ts_en_name" => 'Моля, въведете наименование на категорията на английски'];
if (isset($p->{'sub'})) {
foreach ($p->{'sub'} as $indexId => $value) {
if (empty($p->{'sub'}{$indexId}{'name'}))
return ["sub[$indexId][name]" => 'Моля, въведете наименование на подкатегорията'];
if (empty($p->{'sub'}{$indexId}{'ts_en_name'}))
return ["sub[$indexId][ts_en_name]" => 'Моля, въведете наименование на подкатегорията'];
}
}
}
return null;
},
'postService' => function ($p, Categories $model) {
$model->setPostDataToModel();
$model->save();
if (!empty($p->{'sub'})) {
$orderIndex = 0;
if ($model->id) {
$last = Categories::find()->where(['parent_id' => $model->id])->orderBy(['order_index' => SORT_DESC])->one();
if ($last)
$orderIndex = $last->order_index;
}
foreach ($p->{'sub'} as $id => $name) {
$catToUpdate = empty($_GET['id']) ? new Categories() : Categories::findOne($id);
if ($catToUpdate) {
$catToUpdate->name = $name['name'];
$catToUpdate->ts_en_name = $name['ts_en_name'];
$catToUpdate->parent_id = $model->id;
if (empty($catToUpdate->id))
$catToUpdate->order_index = $orderIndex;
$catToUpdate->save();
if (empty($name['object_types_list'])) {
$catToUpdate->updateObjectTypes([]);
} else {
$catToUpdate->updateObjectTypes($name['object_types_list']);
}
}
}
}
History::addNew($model->id, 'categories', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Категорията е актуализирана успешно' : 'Категорията е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,110 @@
<?php
use app\models\Collections;
use app\models\History;
use app\services\Auth;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$model = Collections::getModel();
$tab = $_GET['tab'] ?? 'main';
$tabs = [
'main' => '<i class="la la-database"></i> Основни данни',
'ts_en' => '<i class="lg lg-en"></i> Превод английски',
'media' => '<i class="la la-file-movie-o"></i> Медия файлове'
];
TableWidget::widget([
'top' => [
'title' => 'Колекции на обекти',
'data' => [
'index/dashboard' => 'Начало'
]
],
'actions' => [
'new' => 'Нова колекция',
'edit' => 'Редакция на колекция',
'delete' => 'Изтриване на колекция'
],
'th' => [
'№' => 'c0 text-right',
'Име на колекция' => '',
'История' => 'c1 ct',
'Добавена в избрани' => 'c1 ct',
'Публикувана' => 'c1 ct',
'Дата на публикуване' => 'c1 ct',
],
'data' => Collections::find()->where([])->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Collections $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (Collections $model) {
return '<i data-table="collections" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (Collections $model) {
return $model->statusSwitch('is_selected', null, ['Колекцията е добавена в избрани', 'Колекцията е махната от избрани']);
},
function (Collections $model) {
return $model->statusSwitch('is_active', null, ['Колекцията е видима на сайта', 'Колекцията е свалена от сайта']);
},
function (Collections $model) {
if ($model->publish_date)
return Formatter::date($model->publish_date);
},
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова колекция',
'title_edit' => 'Редакция на колекция',
'data' => [
'index/dashboard' => 'Начало',
'nomenclature/collections' => 'Колекции на обекти'
],
],
'tabs' => $tabs ?? [],
'writeView' => "nomenclature/tabs/" . Includes::tab($tab) . "/collections_w",
'model' => Collections::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете име на колекцията'];
if (empty($p->{'ts_en_name'}))
return ["ts_en_name" => 'Моля, въведете име на колекцията на английски'];
if (empty($p->{'annotation'}))
return ["annotation" => 'Моля, въведете анотация на колекцията'];
if (empty($p->{'description'}))
return ["description" => 'Моля, въведете описание на колекцията'];
if (empty($p->{'partner_id'}))
return ["partner_id" => 'Моля, изберете партноьор, който представя колекцията'];
if (empty($p->{'info_center'}))
return ["info_center" => 'Моля, попълнете име на информационен център'];
if (empty($p->{'info_center_address'}))
return ["info_center_address" => 'Моля, попълнете адрес на информационен център'];
} else if (Includes::inLocales($tab)) {
if (empty($p->{$tab . '_annotation'}))
return [$tab . "_annotation" => 'Моля, въведете анотация на колекцията'];
if (empty($p->{$tab . '_description'}))
return [$tab . "_description" => 'Моля, въведете описание на колекцията'];
if (empty($p->{$tab . '_info_center'}))
return [$tab . "_info_center" => 'Моля, попълнете име на информационен център'];
if (empty($p->{$tab . '_info_center_address'}))
return [$tab . "_info_center_address" => 'Моля, попълнете адрес на информационен център'];
}
return null;
},
'postService' => function ($p, Collections $model) {
$model->setPostDataToModel();
$model->save();
History::addNew($model->id, 'collections', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Колекцията е актуализирана успешно' : 'Колекцията е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,101 @@
<?php
use app\models\Categories;
use app\models\CommonFields;
use app\models\History;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$model = CommonFields::getModel();
$tab = $_GET['tab'] ?? 'main';
TableWidget::widget([
'top' => [
'title' => 'Общи номенклатури',
'data' => [
'index/dashboard' => 'Начало',
'nomenclature/categories' => 'Номенклатури',
]
],
'actions' => [
'new' => 'Ново поле',
'edit' => 'Редакция на поле',
'delete' => 'Изтриване на поле'
],
'th' => [
'№' => 'c0 text-right',
'Име на поле (bg)' => '',
'Множествено избиране' => 'c1 ct',
],
'data' => CommonFields::find()->where(['IS', 'parent_id', NULL])->orderBy(['id' => SORT_DESC])->loop([
'id',
function (CommonFields $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (CommonFields $model) {
return $model->statusSwitch('multiple_filters', null, ['Добавена е възможност за многежествено избиране при филтриране', 'Премахната е възможност за многежествено избиране при филтриране']);
},
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Ново поле',
'title_edit' => 'Редакция на поле',
'data' => [
'index/dashboard' => 'Начало',
'nomenclature/categories' => 'Номенклатури',
'nomenclature/common-fields' => 'Общи номенклатури',
],
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "nomenclature/tabs/main/common_fields_w" : "nomenclature/tabs/" . Includes::tab($tab) . "/common_fields_w",
'model' => CommonFields::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете име на полето'];
if (empty($p->{'ts_en_name'}))
return ["ts_en_name" => 'Моля, въведете име на полето'];
if (isset($p->{'sub'})) {
foreach ($p->{'sub'} as $indexId => $value) {
if (empty($p->{'sub'}{$indexId}{'name'}))
return ["sub[$indexId][name]" => 'Моля, въведете име на полето'];
if (empty($p->{'sub'}{$indexId}{'ts_en_name'}))
return ["sub[$indexId][ts_en_name]" => 'Моля, въведете име на полето'];
}
}
}
return null;
},
'postService' => function ($p, CommonFields $model) {
$model->setPostDataToModel();
$model->save();
if (!empty($p->{'sub'})) {
$orderIndex = 0;
if ($model->id) {
$last = CommonFields::find()->where(['parent_id' => $model->id])->orderBy(['order_index' => SORT_DESC])->one();
if ($last)
$orderIndex = $last->order_index;
}
foreach ($p->{'sub'} as $id => $name) {
$catToUpdate = empty($_GET['id']) ? new CommonFields() : CommonFields::findOne($id);
if ($catToUpdate) {
$catToUpdate->name = $name['name'];
$catToUpdate->ts_en_name = $name['ts_en_name'];
$catToUpdate->parent_id = $model->id;
if (empty($catToUpdate->id))
$catToUpdate->order_index = $orderIndex;
$catToUpdate->save();
}
}
}
History::addNew($model->id, 'common-fields', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Номенклатурата е актуализирана успешно' : 'Номенклатурата е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,147 @@
<?php
use app\models\History;
use app\models\ObjectTemplate;
use app\models\ObjectTemplateField;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$model = ObjectTemplate::getModel();
$tab = $_GET['tab'] ?? 'main';
TableWidget::widget([
'filter' => [
[
'heritage_type' => ['Вид наследсво', 'c3', ObjectTemplate::heritageTypes()],
'name' => ['Наименование', 'c2'],
],
],
'top' => [
'title' => 'Видове обекти',
'data' => [
'index/dashboard' => 'Начало',
'nomenclature/categories' => 'Номенклатури',
]
],
'actions' => [
'new' => 'Нов вид обект',
'edit' => 'Редакция на вид обект',
'delete' => 'Изтриване на вид обект'
],
'th' => [
'№' => 'c0 text-right',
'Наименование на вид обект' => '',
'Вид наследсво' => '',
'Категории' => '',
'Полета' => ''
],
'data' => ObjectTemplate::find()->andWhere(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
'id',
function (ObjectTemplate $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (ObjectTemplate $model) {
if ($model->heritage_type)
return ObjectTemplate::heritageTypes($model->heritage_type);
},
function (ObjectTemplate $model) {
return $model->categoryConcatList;
},
function (ObjectTemplate $model) {
if (!empty($model->objectTemplateFields)) {
$objectTemplateFields = [];
foreach ($model->objectTemplateFields as $objectTemplateField)
$objectTemplateFields[] = '<span style="margin: 1px !important; display: inline-block; font-size: 11px; background: var(--base-background-dark); color: #fff; padding: 2px 3px; border-radius: 4px">' . $objectTemplateField->name . '</span>';
return implode(' ', $objectTemplateFields);
}
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов вид обект',
'title_edit' => 'Редакция на вид обект',
'data' => [
'index/dashboard' => 'Начало',
'nomenclature/categories' => 'Номенклатури',
'nomenclature/object-templates' => 'Видове обекти'
],
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "nomenclature/tabs/main/object_templates_w" : "nomenclature/tabs/" . Includes::tab($tab) . "/object_templates_w",
'model' => ObjectTemplate::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете наименованието на вида обект'];
if (empty($p->{'ts_en_name'}))
return ["ts_en_name" => 'Моля, въведете наименованието на вида обект на английски'];
if (empty($p->{'heritage_type'}))
return ["heritage_type" => 'Моля, изберете вид наследство'];
if (ObjectTemplate::exists(['name' => $p->{'name'}]))
return ["name" => 'Обект с това наименование вече съществува'];
if (ObjectTemplate::exists(['ts_en_name' => $p->{'ts_en_name'}]))
return ["ts_en_name" => 'Обект с това наименование вече съществува'];
if (isset($p->{'sub'})) {
foreach ($p->{'sub'} as $indexId => $value) {
if (empty($p->{'sub'}{$indexId}{'name'}))
return ["sub[$indexId][name]" => 'Моля, въведете наименование на полето'];
if (empty($p->{'sub'}{$indexId}{'ts_en_name'}))
return ["sub[$indexId][ts_en_name]" => 'Моля, въведете наименование на полето'];
if (empty($p->{'sub'}{$indexId}{'user_interface_type'}))
return ["sub[$indexId][user_interface_type]" => 'Моля, изберете тип на стойността'];
}
}
}
return null;
},
'postService' => function ($p, ObjectTemplate $model) {
$model->setPostDataToModel();
$model->save();
if (!empty($p->{'sub'})) {
foreach ($p->{'sub'} as $id => $name) {
$objectTemplateField = empty($_GET['id']) ? new ObjectTemplateField() : ObjectTemplateField::findOne($id);
$objectTemplateField->ot_id = $model->id;
$objectTemplateField->name = $name['name'];
$objectTemplateField->ts_en_name = $name['ts_en_name'];
$objectTemplateField->is_filter = empty($name['is_filter']) ? null : 1;
$objectTemplateField->user_interface_type = $name['user_interface_type'];
$userInterfaceTypeId = (int)$name['user_interface_type'];
if ($userInterfaceTypeId != 0) {
$objectTemplateField->common_field_id = $name['user_interface_type'];
} else {
$objectTemplateField->common_field_id = null;
}
//$objectTemplateField->data_type = $name['data_type'];
if (empty($_GET['id']))
$objectTemplateField->order_index = ObjectTemplateField::getNextOrderIndex($model->id);
$objectTemplateField->save();
if (empty($_GET['id']) && !empty($name['select_data'])) {
foreach (json_decode($name['select_data']) as $stdObject) {
$objectTemplateFieldOption = new ObjectTemplateField();
if (isset($stdObject->{'bg'}))
$objectTemplateFieldOption->name = $stdObject->{'bg'};
if (isset($stdObject->{'en'}))
$objectTemplateFieldOption->ts_en_name = $stdObject->{'en'};
if ($objectTemplateFieldOption->name) {
$objectTemplateFieldOption->parent_id = $objectTemplateField->id;
$objectTemplateFieldOption->save();
}
}
}
}
}
History::addNew($model->id, 'object_template', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Вида обект е актуализирана успешно' : 'Вида обект е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,282 @@
<?php
use app\models\Categories;
use app\models\CategoriesOt;
use app\widgets\services\Includes;
/**
* @var Categories $model
*/
$media_key = $model->getMediaKey();
$min = 1;
$max = 30;
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="flex top15 c8">
<div class="row c6 right10">
<label class="require">Наименование на категория (BG)</label>
<input name="name" placeholder="Въведи наименование на основна категория"
value="<?= $model->name ?>"/>
</div>
<div class="row c6">
<label class="require">Наименование на категория (EN)</label>
<input name="ts_en_name" placeholder="Въведи наименование на основна категория"
value="<?= $model->ts_en_name ?>"/>
</div>
</div>
<div class="row c5 top15">
<?php if ($model->id): ?>
<div onclick="addSubCategory(this)" data-id="<?= $model->id ?>"
class="btn-ib btn-default">
<i class="la la-plus-circle"></i> Добавяне на подкатегория
</div>
<?php else: ?>
<div onclick="addNewSubcategory()"
class="btn-ib btn-default">
<i class="la la-plus-circle"></i> Добавяне на подкатегория
</div>
<?php endif; ?>
<div id="bDelete" data-model="app\models\Categories" onclick="checkDelete(this)"
class="btn-ib btn-default ct disabled">
<i class="la la-trash-o"></i> Изтриване на подкатегории <span id="delCount">(0)</span>
</div>
</div>
<div class="c12 top15">
<table class="cms-table">
<thead>
<tr>
<th class="text-right">
<input id="checkAll" onclick="checkAllCategories(this)" title="Избери всички"
class="delete-checkbox" type="checkbox">
No
</th>
<th>Подкатегория (BG)</th>
<th>Подкатегория (EN)</th>
<th class="c4">Видове обекти</th>
</tr>
</thead>
<tbody id="sub-categories">
<?php
foreach ($model->subCategories as $i => $subCategory): ?>
<tr class="sub-categories" draggable="true" data-index="<?= $subCategory->order_index ?>">
<td class="text-right c1" style="width: 50px">
<input onclick="checkSingle(this)" data-del="<?= $subCategory->id ?>"
class="delete-checkbox"
type="checkbox"
style="top: calc(50% - 10px)">
<span class="sub-number"><?= $i + 1 ?></span>
</td>
<td>
<input type="text" name="sub[<?= $subCategory->id ?>][name]"
value="<?= $subCategory->name ?>">
</td>
<td>
<input type="text" name="sub[<?= $subCategory->id ?>][ts_en_name]"
value="<?= $subCategory->ts_en_name ?>">
</td>
<td>
<select style="display:none;" class="search-select-box" multiple
name="sub[<?= $subCategory->id ?>][object_types_list][]">
<option disabled value="">-- избери видове обекти --</option>
<?php foreach ($subCategory->getObjectTemplateList() as $item): ?>
<option <?= $item['selected'] ?>
value="<?= $item['id'] ?>"><?= $item['name'] ?></option>
<?php endforeach; ?>
</select>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('nomenclature/categories') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/search-box.js"></script>
<script>
var objectTypes = '';
try {
objectTypes = '<?= json_encode(CategoriesOt::getObjectTemplateList(true)) ?>'
} catch (e) {
console.log(e);
}
all('.search-select-box').forEach(el => {
new SearchBox(el)
})
orderItems('.sub-categories', '/update-category-indexes/', function () {
var index = 0
all('.sub-categories .sub-number').forEach(e => {
e.innerText = ++index
console.log(e.innerText)
})
});
function validateNumber(e, min, max) {
if (e.value !== '') {
if (e.value < min)
e.value = min;
if (e.value > max)
e.value = max;
}
}
let sl = [];
function checkAllCategories(el) {
sl = [];
all('td [data-del]').forEach(e => {
e.checked = el.checked === true;
if (el.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
e.parentNode.parentNode.removeClass('checked');
}
})
updateActionButtons();
}
function checkSingle(e) {
if (e.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
one('#checkAll').checked = false;
e.parentNode.parentNode.removeClass('checked');
const f = sl.indexOf(e.dataset.del);
sl.splice(f, 1);
}
updateActionButtons(e.dataset.del);
}
function updateActionButtons() {
const bDelete = one('#bDelete');
const delCount = one('#delCount');
const c = sl.length;
if (delCount)
delCount.innerText = '(' + c + ')';
if (c > 0) {
if (bDelete)
bDelete.removeClass('disabled');
} else {
if (bDelete)
bDelete.addClass('disabled');
}
}
function checkDelete(e) {
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
modal.confirm(msg, () => {
console.log(sl)
all('tbody .delete-checkbox:checked').forEach(e => {
e.parentNode.parentNode.remove();
})
all('tbody .delete-checkbox').forEach((e, i) => {
const number = e.parentNode.querySelector('span');
number.innerHTML = (i + 1).toString()
})
const slValues = [];
sl.forEach(v => {
if (v) {
slValues.push(v);
}
})
if (slValues.length > 0) {
request({
url: window.location.href.split('?')[0] + '?o=d',
post: {
ids: JSON.stringify(sl),
model: e.dataset.model
},
done: e => {
window.location.reload();
}
})
}
sl = [];
});
}
function addSubCategory(e) {
request({
url: '/new-sub-category/',
post: {
parent_id: e.dataset.id
},
done: e => {
//window.location.reload();
if (e.id && e.success === true) {
addNewSubcategory(e.id, e.orderIndex);
flash.success(e.msg, true)
}
}
})
}
function addNewSubcategory(id, orderIndex) {
console.log(id, orderIndex);
const tBody = one('#sub-categories');
const tCount = tBody.querySelectorAll('tr').length
const indexId = id ? id : 'index_' + (tCount + 1)
const tr = document.createElement('tr')
tr.className = 'sub-categories'
tr.setAttribute('draggable', true)
tr.setAttribute('data-index', orderIndex)
console.log(tr)
tr.innerHTML = `
<td class="text-right c1" style="width: 50px">
<input onclick="checkSingle(this)"
class="delete-checkbox"
type="checkbox"
data-del="${id}"
style="top: calc(50% - 10px)">
<span class="sub-number">${tCount + 1}</span>
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[${indexId}][name]"
value="">
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[${indexId}][ts_en_name]"
value="">
</td>
<td>
<select style="display:none;" class="search-select-box" multiple name="sub[${indexId}][object_types_list][]">
<option disabled value="">-- избери видове обекти --</option>
${objectTypes}
</select>
</td>
`
//console.log(tr);
tBody.appendChild(tr);
new SearchBox(tr.querySelector('select'))
orderItem(tr, function () {
var index = 0
all('.sub-categories .sub-number').forEach(e => {
e.innerText = ++index
console.log(e.innerText)
})
})
}
</script>
@@ -0,0 +1,56 @@
<?php
use app\models\Collections;
use app\models\Partner;
use app\widgets\services\Includes;
/**
* @var Collections $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="flex top15 c9">
<div class="row c6 right10">
<label class="require">Наименование на колекция (BG)</label>
<input name="name" placeholder="Въведи наименование на колекция"
value="<?= $model->name ?>"/>
</div>
<div class="row c6">
<label class="require">Наименование на колекция (EN)</label>
<input name="ts_en_name" placeholder="Въведи наименование на колекция"
value="<?= $model->ts_en_name ?>"/>
</div>
</div>
<div class="row c9 top15">
<label class="require">Анотация</label>
<textarea class="ckEditor" name="annotation"><?= $model->{'annotation'} ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Описание</label>
<textarea class="ckEditor" name="description"><?= $model->{'description'} ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Партньор</label>
<select name="partner_id">
<option selected disabled value="">-- Изберете партньор--</option>
<?php foreach (Partner::partnerList() as $id => $name): ?>
<option <?= $model->partner_id == $id ? 'selected': ''?> value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row c9 top15">
<label class="require">Информационен център</label>
<input name="info_center" placeholder="Въведи наименование на информационен център"
value="<?= $model->info_center ?>"/>
</div>
<div class="row c9 top15">
<label class="require">Информационен център адрес</label>
<input name="info_center_address" placeholder="Въведи адрес на информационен център"
value="<?= $model->info_center_address ?>"/>
</div>
<div class="row flex c9 top15">
<?= Includes::formButtons('nomenclature/collections') ?>
</div>
</form>
</div>
@@ -0,0 +1,258 @@
<?php
use app\models\Categories;
use app\models\CategoriesOt;
use app\models\CommonFields;
use app\widgets\services\Includes;
/**
* @var CommonFields $model
*/
$media_key = $model->getMediaKey();
$min = 1;
$max = 30;
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="flex top15 c8">
<div class="row c6 right10">
<label class="require">Наименование на поле (BG)</label>
<input name="name" placeholder="Въведи наименование поле"
value="<?= $model->name ?>"/>
</div>
<div class="row c6">
<label class="require">Наименование на поле (EN)</label>
<input name="ts_en_name" placeholder="Въведи наименование на основна категория"
value="<?= $model->ts_en_name ?>"/>
</div>
</div>
<div class="row c5 top15">
<?php if ($model->id): ?>
<div onclick="addSubCategory(this)" data-id="<?= $model->id ?>"
class="btn-ib btn-default">
<i class="la la-plus-circle"></i> Добавяне на нова опция
</div>
<?php else: ?>
<div onclick="addNewSubcategory()"
class="btn-ib btn-default">
<i class="la la-plus-circle"></i> Добавяне на нова опция
</div>
<?php endif; ?>
<div id="bDelete" data-model="app\models\CommonFields" onclick="checkDelete(this)"
class="btn-ib btn-default ct disabled">
<i class="la la-trash-o"></i> Изтриване на опции <span id="delCount">(0)</span>
</div>
</div>
<div class="c12 top15">
<table class="cms-table">
<thead>
<tr>
<th class="text-right">
<input id="checkAll" onclick="checkAllCategories(this)" title="Избери всички"
class="delete-checkbox" type="checkbox">
No
</th>
<th>Наименование опция (BG)</th>
<th>Наименование опция (EN)</th>
</tr>
</thead>
<tbody id="sub-categories">
<?php
foreach ($model->options as $i => $subCategory): ?>
<tr class="sub-categories" draggable="true" data-index="<?= $subCategory->order_index ?>">
<td class="text-right c1" style="width: 50px">
<input onclick="checkSingle(this)" data-del="<?= $subCategory->id ?>"
class="delete-checkbox"
type="checkbox"
style="top: calc(50% - 10px)">
<span class="sub-number"><?= $i + 1 ?></span>
</td>
<td>
<input type="text" name="sub[<?= $subCategory->id ?>][name]"
value="<?= $subCategory->name ?>">
</td>
<td>
<input type="text" name="sub[<?= $subCategory->id ?>][ts_en_name]"
value="<?= $subCategory->ts_en_name ?>">
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('nomenclature/common-fields') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script>
var objectTypes = '';
try {
objectTypes = '<?= json_encode(CategoriesOt::getObjectTemplateList(true)) ?>'
} catch (e) {
console.log(e);
}
all('.search-select-box').forEach(el => {
new SearchBox(el)
})
orderItems('.sub-categories', '/update-common-field-indexes/', function () {
var index = 0
all('.sub-categories .sub-number').forEach(e => {
e.innerText = ++index
console.log(e.innerText)
})
});
function validateNumber(e, min, max) {
if (e.value !== '') {
if (e.value < min)
e.value = min;
if (e.value > max)
e.value = max;
}
}
let sl = [];
function checkAllCategories(el) {
sl = [];
all('td [data-del]').forEach(e => {
e.checked = el.checked === true;
if (el.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
e.parentNode.parentNode.removeClass('checked');
}
})
updateActionButtons();
}
function checkSingle(e) {
if (e.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
one('#checkAll').checked = false;
e.parentNode.parentNode.removeClass('checked');
const f = sl.indexOf(e.dataset.del);
sl.splice(f, 1);
}
updateActionButtons(e.dataset.del);
}
function updateActionButtons() {
const bDelete = one('#bDelete');
const delCount = one('#delCount');
const c = sl.length;
if (delCount)
delCount.innerText = '(' + c + ')';
if (c > 0) {
if (bDelete)
bDelete.removeClass('disabled');
} else {
if (bDelete)
bDelete.addClass('disabled');
}
}
function checkDelete(e) {
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
modal.confirm(msg, () => {
console.log(sl)
all('tbody .delete-checkbox:checked').forEach(e => {
e.parentNode.parentNode.remove();
})
all('tbody .delete-checkbox').forEach((e, i) => {
const number = e.parentNode.querySelector('span');
number.innerHTML = (i + 1).toString()
})
const slValues = [];
sl.forEach(v => {
if (v) {
slValues.push(v);
}
})
if (slValues.length > 0) {
request({
url: window.location.href.split('?')[0] + '?o=d',
post: {
ids: JSON.stringify(sl),
model: e.dataset.model
},
done: e => {
window.location.reload();
}
})
}
sl = [];
});
}
function addSubCategory(e) {
request({
url: '/new-common-field-option/',
post: {
parent_id: e.dataset.id
},
done: e => {
//window.location.reload();
if (e.id && e.success === true) {
addNewSubcategory(e.id, e.orderIndex);
flash.success(e.msg, true)
}
}
})
}
function addNewSubcategory(id, orderIndex) {
console.log(id, orderIndex);
const tBody = one('#sub-categories');
const tCount = tBody.querySelectorAll('tr').length
const indexId = id ? id : 'index_' + (tCount + 1)
const tr = document.createElement('tr')
tr.className = 'sub-categories'
tr.setAttribute('draggable', true)
tr.setAttribute('data-index', orderIndex)
console.log(tr)
tr.innerHTML = `
<td class="text-right c1" style="width: 50px">
<input onclick="checkSingle(this)"
class="delete-checkbox"
type="checkbox"
data-del="${id}"
style="top: calc(50% - 10px)">
<span class="sub-number">${tCount + 1}</span>
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[${indexId}][name]"
value="">
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[${indexId}][ts_en_name]"
value="">
</td>
`
tBody.appendChild(tr);
orderItem(tr, function () {
var index = 0
all('.sub-categories .sub-number').forEach(e => {
e.innerText = ++index
})
})
}
</script>
@@ -0,0 +1,326 @@
<?php
use app\models\Categories;
use app\models\ObjectTemplate;
use app\models\ObjectTemplateField;
use app\widgets\services\Includes;
/**
* @var ObjectTemplate $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="flex top15 c11">
<div class="row c6 right10">
<label class="require">Наименование на вид обект (BG)</label>
<input name="name" placeholder="Въведи наименование на вида обект"
value="<?= $model->name ?>"/>
</div>
<div class="row c6">
<label class="require">Наименование на вид обект (EN)</label>
<input name="ts_en_name" placeholder="Въведи наименование на вида обект"
value="<?= $model->ts_en_name ?>"/>
</div>
</div>
<div class="flex top15 c11">
<div class="row c6 right10">
<label class="require">Вид наследсво</label>
<select name="heritage_type">
<option selected disabled value="">-- Избери вид наследвство --</option>
<?php foreach (ObjectTemplate::heritageTypes() as $id => $type): ?>
<option <?= $id == $model->heritage_type ? 'selected' : '' ?> value="<?= $id ?>">
<?= $type ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="row c5 top15">
<?php if ($model->id): ?>
<div onclick="addSub(this)" data-id="<?= $model->id ?>"
class="btn-ib btn-default">
<i class="la la-plus-circle"></i> Добавяне на динамично поле
</div>
<?php else: ?>
<div onclick="addNewSub()"
class="btn-ib btn-default">
<i class="la la-plus-circle"></i> Добавяне на динамично поле
</div>
<?php endif; ?>
<div id="bDelete" data-model="app\models\ObjectTemplateField" onclick="checkDelete(this)"
class="btn-ib btn-default ct disabled">
<i class="la la-trash-o"></i> Изтриване на динамични полета<span id="delCount">(0)</span>
</div>
</div>
<div class="c11 top15">
<table class="cms-table">
<thead>
<tr>
<th class="text-right">
<input id="checkAll" onclick="checkAllObjectTypes(this)" title="Избери всички"
class="delete-checkbox" type="checkbox">
No
</th>
<th class="c3">Наименование на поле (BG)</th>
<th class="c3">Наименование на поле (EN)</th>
<!--<th>Тип на данните</th>-->
<th>Потребителски интерфейс</th>
<th style="width: 70px">За филтър</th>
</tr>
</thead>
<tbody id="dynamic-fields">
<?php foreach ($model->objectTemplateFields as $i => $dynamicField): ?>
<?php $fieldOptions = $dynamicField->fieldOptions ?>
<tr class="dynamic-fields" draggable="true" data-index="<?= $dynamicField->order_index ?>">
<td class="text-right c1" style="width: 50px">
<input onclick="checkSingle(this)" data-del="<?= $dynamicField->id ?>"
class="delete-checkbox"
type="checkbox"
style="top: calc(50% - 10px)">
<span class="sub-number"><?= $i + 1 ?></span>
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[<?= $dynamicField->id ?>][name]"
value="<?= $dynamicField->name ?>">
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[<?= $dynamicField->id ?>][ts_en_name]"
value="<?= $dynamicField->ts_en_name ?>">
</td>
<td class="value-type">
<?= ObjectTemplateField::userInterfaceType($dynamicField->user_interface_type, true, $dynamicField->id) ?>
<?php if ($dynamicField->user_interface_type == 'list' || $dynamicField->user_interface_type == 'list_simple'): ?>
<input data-id="<?= $dynamicField->id ?>"
name="sub[<?= $dynamicField->id ?>][select_data]" type="hidden"
value='<?= $dynamicField->fieldOptionsAsJson($fieldOptions) ?>'>
<table class="inner-td-table" data-table="sub[<?= $dynamicField->id ?>][select_data]">
<thead>
<tr>
<?php if ($dynamicField->user_interface_type == 'list'): ?>
<td>стойност (bg)</td>
<td>стойност (en)</td>
<?php else: ?>
<td>стойност</td>
<?php endif; ?>
<td></td>
</tr>
</thead>
<tbody data-id="<?= $dynamicField->id ?>">
<?php if (!empty($fieldOptions)): ?>
<?php foreach ($fieldOptions as $index => $option): ?>
<tr data-option-id="<?= $option->id ?>" class="added-row"
data-index="<?= $index ?>"
data-table="sub[<?= $dynamicField->id ?>][select_data]">
<td><input class="update-bg" value="<?= $option->name ?>"></td>
<?php if ($dynamicField->user_interface_type == 'list'): ?>
<td><input class="update-en" value="<?= $option->ts_en_name ?>">
</td><?php endif; ?>
<td class="remove"><i class="la la-remove"></i></td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
<tr data-table="sub[<?= $dynamicField->id ?>][select_data]">
<td><input class="add-bg"></td>
<?php if ($dynamicField->user_interface_type == 'list'): ?>
<td><input class="add-en"></td><?php endif; ?>
<td class="add-row"><i class="la la-plus-circle"></i></td>
</tr>
</tbody>
</table>
<?php endif; ?>
</td>
<td class="ct">
<input <?= $dynamicField->is_filter ? 'checked' : '' ?> type="checkbox" value="1" name="sub[<?= $dynamicField->id ?>][is_filter]">
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('nomenclature/object-templates') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/inner-table-items.js"></script>
<script>
const innerTableItems = new InnerTableItems()
innerTableItems.setUpdateUrl('/update-dynamic-type-values/')
orderItems('.dynamic-fields', '/update-dynamic-fields-indexes/', function () {
var index = 0
all('.dynamic-fields .sub-number').forEach(e => {
e.innerText = ++index
console.log(e.innerText)
})
});
let sl = [];
function checkAllObjectTypes(el) {
console.log(el);
sl = [];
all('td [data-del]').forEach(e => {
e.checked = el.checked === true;
if (el.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
e.parentNode.parentNode.removeClass('checked');
}
})
if (sl.length === 0)
el.checked = false;
updateActionButtons();
}
function checkSingle(e) {
if (e.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
one('#checkAll').checked = false;
e.parentNode.parentNode.removeClass('checked');
const f = sl.indexOf(e.dataset.del);
sl.splice(f, 1);
}
updateActionButtons(e.dataset.del);
}
function updateActionButtons() {
const bDelete = one('#bDelete');
const delCount = one('#delCount');
const c = sl.length;
if (delCount)
delCount.innerText = '(' + c + ')';
if (c > 0) {
if (bDelete)
bDelete.removeClass('disabled');
} else {
if (bDelete)
bDelete.addClass('disabled');
}
}
function checkDelete(e) {
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
modal.confirm(msg, () => {
console.log(sl)
all('tbody .delete-checkbox:checked').forEach(e => {
e.parentNode.parentNode.remove();
})
all('tbody .delete-checkbox').forEach((e, i) => {
const number = e.parentNode.querySelector('span');
number.innerHTML = (i + 1).toString()
})
const slValues = [];
sl.forEach(v => {
if (v) {
slValues.push(v);
}
})
if (slValues.length > 0) {
request({
url: window.location.href.split('?')[0] + '?o=d',
post: {
ids: JSON.stringify(sl),
model: e.dataset.model,
noFlash: true
},
done: r => {
all('.delete-checkbox', e => {
e.checked = false;
})
updateActionButtons();
flash.success(r.message)
}
})
}
sl = [];
});
}
function addSub(e) {
request({
url: '/new-dynamic-field/',
post: {
ot_id: e.dataset.id
},
done: e => {
if (e.id && e.success === true) {
addNewSub(e.id, e.orderIndex);
flash.success(e.msg, true)
}
}
})
}
function addNewSub(id, orderIndex) {
const tBody = one('#dynamic-fields');
const tCount = tBody.querySelectorAll('tr').length
const indexId = id ? id : 'index_' + (tCount + 1)
const tr = document.createElement('tr')
tr.className = 'dynamic-fields'
tr.setAttribute('draggable', true)
tr.setAttribute('data-index', orderIndex)
const
select = document.createElement('select'),
selectDataType = document.createElement('select')
select.className = 'type-value-selector'
select.setAttribute('name', `sub[${indexId}][user_interface_type]`)
select.setAttribute('onchange', 'innerTableItems.setChangeToSelect(this)')
select.innerHTML = '<?= ObjectTemplateField::userInterfaceType(null, true, null, true) ?>'
select.setAttribute('data-id', id)
selectDataType.setAttribute('name', `sub[${indexId}][data_type]`)
selectDataType.setAttribute('onchange', 'innerTableItems.setChangeDataType(this)')
selectDataType.innerHTML = '<?= ObjectTemplateField::dataType(null, null, true, true) ?>'
selectDataType.setAttribute('data-id', id)
tr.innerHTML = `
<td class="text-right c1" style="width: 50px">
<input onclick="checkSingle(this)"
class="delete-checkbox"
type="checkbox"
data-del="${id}"
style="top: calc(50% - 10px)">
<span class="sub-number">${orderIndex || tCount + 1}</span>
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[${indexId}][name]"
value="">
</td>
<td>
<input style="width: calc(100% - 20px); margin-left: 5px; height: 20px; padding: 5px"
name="sub[${indexId}][ts_en_name]"
value="">
</td>
<td>${select.outerHTML}</td>
<td class="ct">
<input type="checkbox" value="1" name="sub[${indexId}][is_filter]">
</td>
`
tBody.appendChild(tr);
orderItem(tr, function () {
var index = 0
all('.dynamic-fields .sub-number').forEach(e => {
e.innerText = ++index
})
})
}
</script>
@@ -0,0 +1,55 @@
<?php
use app\models\Collections;
use app\widgets\FileWidget;
/**
* @var $model Collections
*/
$media_key = $model->getMediaKey();
?>
<form autocomplete="off">
<div class="inner-content p10">
<div class="row info-table c5 top15">
<?php if ($model->name): ?>
<div class="row-flex">
<div>Име на колекцията:</div>
<div class="txt-no-transform"><?= $model->name ?></div>
</div>
<?php endif; ?>
</div>
<div class="row c9 top15">
<label>Заглавно изображение</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'title_collection_image',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображение',
'edit' => 'Редакция на изображенито',
'delete' => 'Премахване на изображението'
],
'single_file' => true,
'resolutions' => ['16:11', '4:3', '1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
</div>
</form>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<?php if (!$model->media_key): ?>
<script>
const media_key = '<?= $media_key ?>';
request({
url: window.location.href + '&media_key_update=1',
post: {media_key: media_key}
})
</script>
<?php endif; ?>
@@ -0,0 +1,40 @@
<?php
use app\models\Collections;
use app\widgets\services\Includes;
/**
* @var Collections $model
*/
$ts = $_GET['tab'];
?>
<div class="inner-content p10">
<?php if (empty($model->id)): ?>
<p style="color: darkorange; font-weight: bold">* Формата ще бъде активна след попълването на "Основни
данни"</p>
<?php endif; ?>
<form autocomplete="off" class="<?= empty($model->id) ? 'disabled' : '' ?>">
<div class="row c9 top15">
<label class="require">Анотация</label>
<textarea class="ckEditor" name="<?= $ts ?>_annotation"><?= $model->{$ts . '_annotation'} ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Описание</label>
<textarea class="ckEditor" name="<?= $ts ?>_description"><?= $model->{$ts . '_description'} ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Информационен център</label>
<input name="<?= $ts ?>_info_center" placeholder="Въведи наименование на информационен център"
value="<?= $model->{$ts . '_info_center'} ?>"/>
</div>
<div class="row c9 top15">
<label class="require">Информационен център адрес</label>
<input name="<?= $ts ?>_info_center_address" placeholder="Въведи адрес на информационен център"
value="<?= $model->{$ts.'_info_center_address'} ?>"/>
</div>
<div class="row flex c9 top15">
<?= Includes::formButtons('nomenclature/collections') ?>
</div>
</form>
</div>
@@ -0,0 +1,73 @@
<?php
use app\models\OrderProduct;
use app\models\Subscriptions;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
TableWidget::widget([
'filter' => [
[
'model_id' => ['Колекция', 'c3', \app\models\register\Collections::getPaidDropDownData()],
'user_email' => ['E-mail', 'c2'],
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']]
],
],
'top' => [
'title' => 'Закупени колекции',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Дигитален магазин',
]
],
'actions' => [
//'new' => 'Нов абонамент',
//'edit' => 'Редакция на абонамент',
//'delete' => 'Изтриване на абонамент'
],
'th' => [
'№' => 'c0 text-right',
'Колекция' => 'c1',
'Дата' => 'c1',
'Потребител име' => 'c1',
'Потребител e-mail' => '',
'Стойност' => '',
'Плащане' => ''
],
'model' => Subscriptions::class,
'data' => \app\models\OrderProduct::find()->joinWith('order')->joinWith('order.payment')->where(['model_class' => \app\models\register\Collections::class])->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
'id',
'name_bg',
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
}
},
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_name;
}
},
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_email;
}
},
function (OrderProduct $orderProduct) {
return number_format($orderProduct->order->total_price, 2, '.', '') . ' лв';
},
function (OrderProduct $orderProduct) {
if ($orderProduct->order && $orderProduct->order->payment) {
$payment = $orderProduct->order->payment;
return
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
}
}
], $_GET['p'] ?? 1, 30)
]);
@@ -0,0 +1,79 @@
<?php
use app\models\OrderProduct;
use app\models\Pages;
use app\models\Subscriptions;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
TableWidget::widget([
'filter' => [
[
//'model_id' => ['Абонамент', 'c3', Subscriptions::getList()],
'user_email' => ['E-mail', 'c2'],
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']]
//'event_dates' => ['Дата', 'c2 fDatepicker'],
//'title' => ['Заглавие на събитието', 'c4'],
//'partner_id' => ['Организация', 'c3', Partner::partnerList()],
//'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
//'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
],
],
'top' => [
'title' => 'Закупени публикации',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Дигитален магазин',
]
],
'actions' => [
//'new' => 'Нов абонамент',
//'edit' => 'Редакция на абонамент',
//'delete' => 'Изтриване на абонамент'
],
'th' => [
'№' => 'c0 text-right',
'Публикация' => 'c1',
'Дата' => 'c1',
'Потребител име' => 'c1',
'Потребител e-mail' => '',
'Стойност' => '',
'Плащане' => ''
],
'model' => Subscriptions::class,
'data' => \app\models\OrderProduct::find()->joinWith('order')->joinWith('order.payment')->where(['model_class' => \app\models\RegisterObjects::class])->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
'id',
'name_bg',
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
}
},
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_name;
}
},
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_email;
}
},
function (OrderProduct $orderProduct) {
return number_format($orderProduct->order->total_price, 2, '.', '') . ' лв';
},
function (OrderProduct $orderProduct) {
if ($orderProduct->order && $orderProduct->order->payment) {
$payment = $orderProduct->order->payment;
return
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
}
}
], $_GET['p'] ?? 1, 30)
]);
@@ -0,0 +1,119 @@
<?php
use app\models\Events;
use app\models\OrderBooking;
use app\models\OrderProduct;
use app\models\Pages;
use app\models\Subscriptions;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
TableWidget::widget([
'filter' => [
[
//'model_id' => ['Абонамент', 'c3', Subscriptions::getList()],
'user_email' => ['E-mail', 'c2'],
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']],
'event_id' => ['Събитие', 'c3', Events::getList()]
],
],
'top' => [
'title' => 'Резервации',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Дигитален магазин',
]
],
'actions' => [
//'new' => 'Нов абонамент',
//'edit' => 'Редакция на абонамент',
//'delete' => 'Изтриване на абонамент'
],
'th' => [
'№' => 'c0 text-right',
'Билет' => 'c1',
'Събитие' => '',
'Дата' => 'c1',
'Потребител име' => 'c1',
'Потребител e-mail' => '',
'Цена на билета' => '',
'Плащане' => ''
],
'model' => Subscriptions::class,
'data' => \app\models\OrderBooking::find()->joinWith('order')->joinWith('order.payment')->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
'id',
'name_bg',
function(OrderBooking $orderBooking) {
if($orderBooking->event) {
return $orderBooking->event->title;
}
},
function (OrderBooking $orderProduct) {
if ($orderProduct->order) {
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
}
},
function (OrderBooking $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_name;
}
},
function (OrderBooking $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_email;
}
},
function (OrderBooking $orderBooking) {
return number_format($orderBooking->single_price, 2, '.', '') . ' лв.';
},
function (OrderBooking $orderProduct) {
if ($orderProduct->order && $orderProduct->order->payment) {
$payment = $orderProduct->order->payment;
return
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
}
}
], $_GET['p'] ?? 1, 30)
]);
/*
FormWidget::widget([
'top' => [
'title' => 'Нов абонамент',
'title_edit' => 'Редакция на абонамент',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Абонаменти',
],
],
'tabs' => $tabs ?? [],
'writeView' => "products/tabs/" . Includes::tab($tab) . "/subscriptions_w",
'model' => Subscriptions::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{"name"}))
return ["name" => 'Моля, въведете наименование на абонамента'];
if (empty($p->{"name_en"}))
return ["name_en" => 'Моля, въведете наименование на абонамента'];
if(empty($p->{"price"}))
return ['price' => 'Моля, въведете цена на абонамента'];
}
return null;
},
'postService' => function ($p, Subscriptions $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Абонамента е актуализиран успешно' : 'Абонамента е създаден успешно');
$model->smartRedirect();
}
]);
*/
@@ -0,0 +1,115 @@
<?php
use app\models\OrderProduct;
use app\models\Pages;
use app\models\Subscriptions;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
TableWidget::widget([
'filter' => [
[
'model_id' => ['Абонамент', 'c3', Subscriptions::getList()],
'user_email' => ['E-mail', 'c2'],
'status' => ['Статус', 'c2', ['PAID' => 'Платено', 'CANCELED' => 'Отказано плащане']]
//'event_dates' => ['Дата', 'c2 fDatepicker'],
//'title' => ['Заглавие на събитието', 'c4'],
//'partner_id' => ['Организация', 'c3', Partner::partnerList()],
//'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
//'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
],
],
'top' => [
'title' => 'Абонаменти',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Дигитален магазин',
]
],
'actions' => [
//'new' => 'Нов абонамент',
//'edit' => 'Редакция на абонамент',
//'delete' => 'Изтриване на абонамент'
],
'th' => [
'№' => 'c0 text-right',
'Абонамент' => 'c1',
'Дата' => 'c1',
'Потребител име' => 'c1',
'Потребител e-mail' => '',
'Стойност' => '',
'Плащане' => ''
],
'model' => Subscriptions::class,
'data' => \app\models\OrderProduct::find()->joinWith('order')->joinWith('order.payment')->where(['model_class' => Subscriptions::class])->andWhere(Yii::$app->getFilterData('or'))->orderBy(['order_date' => SORT_DESC])->loop([
'id',
'name_bg',
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return date('d.m.Y H:i', strtotime($orderProduct->order->order_date));
}
},
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_name;
}
},
function (\app\models\OrderProduct $orderProduct) {
if ($orderProduct->order) {
return $orderProduct->order->user_email;
}
},
function (OrderProduct $orderProduct) {
return number_format($orderProduct->order->total_price, 2, '.', '') . ' лв';
},
function (OrderProduct $orderProduct) {
if ($orderProduct->order && $orderProduct->order->payment) {
$payment = $orderProduct->order->payment;
return
'<div>статус: <span style="font-weight: bold">' . $payment->status . '</span></div>
<div style="margin-top: 4px">дата: ' . date('d.m.Y H:i', strtotime($payment->response_time)) . '</div>';
}
}
], $_GET['p'] ?? 1, 30)
]);
/*
FormWidget::widget([
'top' => [
'title' => 'Нов абонамент',
'title_edit' => 'Редакция на абонамент',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Абонаменти',
],
],
'tabs' => $tabs ?? [],
'writeView' => "products/tabs/" . Includes::tab($tab) . "/subscriptions_w",
'model' => Subscriptions::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{"name"}))
return ["name" => 'Моля, въведете наименование на абонамента'];
if (empty($p->{"name_en"}))
return ["name_en" => 'Моля, въведете наименование на абонамента'];
if(empty($p->{"price"}))
return ['price' => 'Моля, въведете цена на абонамента'];
}
return null;
},
'postService' => function ($p, Subscriptions $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Абонамента е актуализиран успешно' : 'Абонамента е създаден успешно');
$model->smartRedirect();
}
]);
*/
@@ -0,0 +1,90 @@
<?php
use app\models\register\Partner;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
use app\models\register\Collections;
$tab = $_GET['tab'] ?? 'main';
$filter = Yii::$app->getFilterData('and');
$filter[0] = 'and';
$filter[] = ['=', 'deleted', 0];
$filter[] = ['=', 'active', 1];
$filter[] = ['=', 'published', 1];
TableWidget::widget([
'top' => [
'title' => 'Колекции',
'data' => [
'index/dashboard' => 'Начало'
]
],
'filter' => [
[
'name' => ['Заглавие на колекция', 'c4'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()]
],
],
'actions' => [
//'new' => 'Нова категория',
//'edit' => 'Редакция на категория',
// 'delete' => 'Изтриване на колекция'
],
'th' => [
'№' => 'c0 text-right',
'Колекция' => '',
'Изображение' => '',
'Цена' => 'c1',
'Партньор' => '',
],
'data' => Collections::find()->orderBy(['modified_on' => SORT_DESC])->where(['is_payable' => 1])->andWhere($filter)->loop([
'id',
function (Collections $model) {
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
},
function (Collections $model) {
if ($model->thumbnail && $model->thumbnail != "''")
return '<img src="'.Yii::$app->params['register'].'/uploads/collections/' . $model->thumbnail . '" style="height: 200px">';
},
function (Collections $model) {
return number_format($model->price, 2, '.', ' ');
},
function (Collections $model) {
if ($model->partner)
return $model->partner->name;
},
], $_GET['p'] ?? 1, 50)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова колекция',
'title_edit' => 'Преглед на колекция',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions/' => 'Продукти',
'products/paid-collections/' => 'Колекции'
],
],
'tabs' => [
//'main' => '<i class="la la-database"></i> Основни данни',
//'ts_en' => '<i class="lg lg-en"></i> Превод английски'
],
'writeView' => "products/tabs/" . Includes::tab($tab) . "/collections_register_w",
'model' => Collections::class,
'validation' => function ($p) use ($tab) {
},
'postService' => function ($p, Collections $model) {
$model->setPostDataToModel();
$model->save();
echo json_encode(['success' => 1]);
exit;
}
]);
@@ -0,0 +1,87 @@
<?php
use app\models\register\Partner;
use app\models\RegisterObjects;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
use app\models\register\Collections;
$tab = $_GET['tab'] ?? 'main';
$filter = Yii::$app->getFilterData('and');
$filter[] = ['=', 'lib_type', 2];
$filter[] = ['=', 'is_payable', 1];
$filter[0] = 'and';
TableWidget::widget([
'top' => [
'title' => 'Публикации',
'data' => [
'index/dashboard' => 'Начало'
]
],
'filter' => [
[
'name' => ['Заглавие на публикация', 'c4'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()]
],
],
'actions' => [],
'th' => [
'№' => 'c0 text-right',
'Публикация' => '',
'Изображение' => '',
'Цена' => 'c1',
'Партньор' => '',
],
'data' => RegisterObjects::find()
->where($filter)
->loop([
'id',
function (RegisterObjects $model) {
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
},
function (RegisterObjects $model) {
if ($model->getMainImgFile()) {
return '<img src="' . $model->getMainImgFile() . '" style="height: 200px">';
}
},
function (RegisterObjects $model) {
return number_format($model->price, 2, '.', ' ');
},
function (RegisterObjects $model) {
if ($model->partner)
return $model->partner->name;
}
], $_GET['p'] ?? 1, 50)
]);
FormWidget::widget([
'top' => [
'title' => 'Преглед',
'title_edit' => 'Преглед на публикация',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions/' => 'Дигитален магазин',
'products/paid-publications/' => 'Публикации'
],
],
'tabs' => [
//'main' => '<i class="la la-database"></i> Основни данни',
//'ts_en' => '<i class="lg lg-en"></i> Превод английски'
],
'writeView' => "products/tabs/" . Includes::tab($tab) . "/publications_register_w",
'model' => RegisterObjects::class,
'validation' => function ($p) use ($tab) {
},
'postService' => function ($p, RegisterObjects $model) {
$model->setPostDataToModel();
$model->save();
echo json_encode(['success' => 1]);
exit;
}
]);
@@ -0,0 +1,77 @@
<?php
use app\models\Pages;
use app\models\Subscriptions;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
TableWidget::widget([
'top' => [
'title' => 'Абонаменти',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Дигитален магазин',
]
],
'actions' => [
'new' => 'Нов абонамент',
'edit' => 'Редакция на абонамент',
'delete' => 'Изтриване на абонамент'
],
'th' => [
'№' => 'c1 text-right',
'Абонамент' => '',
'Цена' => '',
'Месеци' => '',
],
'model' => Subscriptions::class,
'data' => Subscriptions::find()->loop([
'id',
function (Subscriptions $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (Subscriptions $model) {
return number_format($model->price, 2, ".", " ");
},
'months'
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов абонамент',
'title_edit' => 'Редакция на абонамент',
'data' => [
'index/dashboard' => 'Начало',
'products/subscriptions' => 'Абонаменти',
],
],
'tabs' => $tabs ?? [],
'writeView' => "products/tabs/" . Includes::tab($tab) . "/subscriptions_w",
'model' => Subscriptions::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{"name"}))
return ["name" => 'Моля, въведете наименование на абонамента'];
if (empty($p->{"name_en"}))
return ["name_en" => 'Моля, въведете наименование на абонамента'];
if(empty($p->{"price"}))
return ['price' => 'Моля, въведете цена на абонамента'];
}
return null;
},
'postService' => function ($p, Subscriptions $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Абонамента е актуализиран успешно' : 'Абонамента е създаден успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,87 @@
<?php
/** @var \app\models\register\Collections $model */
?>
<div class="inner-content p20">
<div class="row top15">
<a style="width: 200px; text-align: center" href="<?= Yii::$app->goTo('products/paid-collections') ?><?= isset($_GET['p']) ? '?p=' . $_GET['p'] : '' ?>"
class="btn btn-default right10"><i class="la la-undo"></i> Обратно в списъка</a>
</div>
</div>
<div class="inner-content p20">
<?php if ($model->thumbnail && $model->thumbnail != "''"): ?>
<img src="<?= Yii::$app->params['register']?>/uploads/collections/<?= $model->thumbnail ?>" style="height: 200px">
<?php endif; ?>
<div class="flex top15">
<div class="row">
<label>Цена</label>
<div class="flex update-price">
<input id="collection-price" data-format="money"
value="<?= number_format($model->price, 2, '.', '') ?>"
style="width: 150px">
<i class="la la-check"></i>
<div onclick="updateValuePrice()" class="btn btn-default left5">Актуализирай цената</div>
</div>
</div>
</div>
<div class="flex top15">
<div class="row c6">
<p><i class="lg lg-bg"></i> български</p>
<div class="row">
<h2><?= $model->name ?></h2>
</div>
<div class="row top15">
<label>Кратко описание</label>
<div>
<?= $model->annotation ?>
</div>
</div>
<div class="row top15">
<label>Oписание</label>
<div>
<?= $model->description ?>
</div>
</div>
</div>
<div class="row c6">
<p><i class="lg lg-bg"></i> английски</p>
<div class="row">
<h2><?= $model->name_en ?></h2>
</div>
<div class="row top15">
<label>Кратко описание</label>
<div>
<?= $model->annotation_en ?>
</div>
</div>
<div class="row top15">
<label>Oписание</label>
<div>
<?= $model->description_en ?>
</div>
</div>
</div>
</div>
</div>
<script>
let collectionPrice = document.querySelector('#collection-price');
function updateValuePrice() {
request({
post: {
price: collectionPrice.value
},
done: () => {
flash.success('Цената е сменена')
flash.success('Цената е сменена')
document.querySelector('.update-price').classList.add('updated');
setTimeout(() => {
document.querySelector('.update-price').classList.remove('updated')
}, 4000)
}
})
}
</script>
@@ -0,0 +1,121 @@
<?php
/** @var \app\models\RegisterObjects $model */
?>
<div class="inner-content p20">
<div class="row top15">
<a style="width: 200px; text-align: center"
href="<?= Yii::$app->goTo('products/paid-publications') ?><?= isset($_GET['p']) ? '?p=' . $_GET['p'] : '' ?>"
class="btn btn-default right10"><i class="la la-undo"></i> Обратно в списъка</a>
</div>
</div>
<div class="inner-content p20">
<?php if ($model->getMainImgFile()): ?>
<img src="<?= $model->getMainImgFile() ?>" style="height: 200px">
<?php endif; ?>
<div class="flex top15 top30">
<div class="row">
<label>Цена</label>
<div class="flex update-price">
<input id="publication-price" data-format="money"
value="<?= number_format($model->price, 2, '.', '') ?>"
style="width: 150px">
<i class="la la-check"></i>
<div onclick="updateValuePrice()" class="btn btn-default left5">Актуализирай цената</div>
</div>
</div>
</div>
<div class="flex top15">
<div class="row c6">
<p><i class="lg lg-bg"></i> български</p>
<div class="row">
<h2><?= $model->name ?></h2>
</div>
<div class="row">
<h3>Автор: <?= $model->created_by ?></h3>
</div>
<div class="row top15">
<label>Кратко описание</label>
<div>
<?= $model->short_description ?>
</div>
</div>
<div class="row top15">
<label>Oписание</label>
<div>
<?= $model->description ?>
</div>
</div>
</div>
<div class="row c6">
<p><i class="lg lg-bg"></i> английски</p>
<div class="row">
<h2><?= $model->ts_en_name ?></h2>
</div>
<div class="row top15">
<label>Кратко описание</label>
<div>
<?= $model->ts_en_short_description ?>
</div>
</div>
<div class="row top15">
<label>Oписание</label>
<div>
<?= $model->ts_en_description ?>
</div>
</div>
</div>
</div>
<div class="inner-content p10 top30">
<table class="cms-table">
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<?php foreach ($model->registerObjectFields as $registerObjectField): ?>
<tr>
<td class="c2 text-right bold">
<?php if ($registerObjectField->field): ?>
<?= $registerObjectField->field->name ?>:
<?php endif; ?>
</td>
<td>
<?php if ($registerObjectField->fieldValue): ?>
<?= $registerObjectField->fieldValue->name ?>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
<script>
let publicationPrice = document.querySelector('#publication-price');
function updateValuePrice() {
request({
post: {
price: publicationPrice.value
},
done: () => {
flash.success('Цената е сменена')
document.querySelector('.update-price').classList.add('updated');
setTimeout(() => {
document.querySelector('.update-price').classList.remove('updated')
}, 4000)
}
})
}
</script>
@@ -0,0 +1,50 @@
<?php
use app\models\Pages;
use app\widgets\services\Includes;
/**
* @var Pages $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="c10 row">
<label>Име на абонамента</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label class="require"><i class="lg lg-bg"></i> Български</label>
<input name="name" placeholder="Въведи заглавието страницата [BG]" value="<?= $model->name ?>"/>
</div>
<div class="row c6 right10">
<label class="require"><i class="lg lg-en"></i> Английски</label>
<input name="name_en" placeholder="Въведи заглавието страницата [EN]" value="<?= $model->name_en ?>"/>
</div>
</div>
</div>
<div class="c10 row top15">
<label>Текст</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label><i class="lg lg-bg"></i> Български</label>
<textarea class="ckEditor" name="text" placeholder="Въведи текст на абонамента [BG]"><?= $model->text ?></textarea>
</div>
<div class="row c6 right10">
<label><i class="lg lg-en"></i> Английски</label>
<textarea class="ckEditor" name="text_en" placeholder="Въведи текст на абонамента [EN]"><?= $model->text_en ?></textarea>
</div>
</div>
</div>
<div class="c6 row top15">
<label>Месеци</label>
<input style="width: 200px" name="months" type="text" data-format="integer" placeholder="Въведи месеци" value="<?= $model->months ?? 1 ?>"/>
</div>
<div class="c6 row top15">
<label>Цена</label>
<input style="width: 200px" name="price" type="text" data-format="money" placeholder="Въведи цена" value="<?= $model->price ?>"/>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('products/subscriptions') ?>
</div>
</form>
</div>
@@ -0,0 +1,111 @@
<?php
use app\models\TourObjects;
/**
* @var $model TourObjects;
*/
$lat = $model->latitude ?? 42.698334;
$lon = $model->longitude ?? 23.319941;
?>
<link rel="stylesheet" href="/_public/plugins/leafletjs/leaflet.css">
<script src="/_public/plugins/leafletjs/leaflet.js"></script>
<style>
.search-location {
position: relative;
}
.search-location .result {
position: absolute;
top: 40px;
left: 0;
background: #FFFFFF;
z-index: 10000000;
padding: 5px;
display: none;
}
.search-location .result .row-result {
padding: 5px;
border: 1px solid #ccc;
background: #f1f1f1;
margin-bottom: 3px;
}
#map {
width: 100%;
height: 800px;
border: 1px solid var(--base-background-dark);
border-radius: 5px;
margin-top: 10px;
}
</style>
<div class="search-location c6">
<input placeholder="Търси">
<div class="result"></div>
</div>
<div id="map"></div>
<script>
const inputSearchLocation = document.querySelector('.search-location input');
const results = document.querySelector('.search-location .result');
let mapOptions = {
center: [<?=$lat ?>, <?= $lon ?>],
zoom: 13
}
let map = new L.map('map', mapOptions);
let layer = new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png');
map.addLayer(layer);
let marker = new L.Marker([<?=$lat?>, <?= $lon?>]);
marker.addTo(map);
map.on('click', function(e){
let coord = e.latlng;
let lat = coord.lat;
let lon = coord.lng;
setNewLocation({lat, lon})
});
inputSearchLocation.addEventListener('keyup', () => {
request({
url: `https://nominatim.openstreetmap.org/search.php?q=${inputSearchLocation.value}&accept-language=bg&countrycodes=bg&limit=10&format=jsonv2`,
done: res => {
results.innerHTML = '';
res = res || [];
res.forEach(r => {
let row = document.createElement('div')
row.className = 'row-result';
console.log(r);
row.innerHTML = `<span>${r.display_name}</span>`;
row.addEventListener('click', function () {
if (r.lat && r.lon) {
setNewLocation(r)
}
})
results.appendChild(row)
})
if (res.length > 0) {
results.style.display = 'block'
} else {
results.style.display = 'none'
}
}
})
})
function setNewLocation(r) {
document.querySelector('[name="latitude"]').value = r.lat
document.querySelector('[name="longitude"]').value = r.lon
marker.setLatLng([r.lat, r.lon])
let latLon = [marker.getLatLng()];
let markerBounds = L.latLngBounds(latLon);
map.fitBounds(markerBounds);
results.innerHTML = ''
results.style.display = 'none'
}
</script>
@@ -0,0 +1,66 @@
<?php
use app\widgets\services\Includes;
$museums = \app\models\register\Partner::find()->where(['deleted' => 0, 'active' => 1])->all();
/**
* @var \app\models\TourObjects $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="c10 row">
<label>Име на туристическия обект</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label class="require"><i class="lg lg-bg"></i> Български</label>
<input name="name" placeholder="Въведи име на туристическия обект [BG]" value="<?= $model->name ?>"/>
</div>
<div class="row c6 right10">
<label class="require"><i class="lg lg-en"></i> Английски</label>
<input name="name_en" placeholder="Въведи име на туристическия обект [EN]"
value="<?= $model->name_en ?>"/>
</div>
</div>
</div>
<div class="c10 row top15">
<label>Текст</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label><i class="lg lg-bg"></i> Български</label>
<textarea class="ckEditor" name="text"
placeholder="Въведи текст за туристическия обект [BG]"><?= $model->text ?></textarea>
</div>
<div class="row c6 right10">
<label><i class="lg lg-en"></i> Английски</label>
<textarea class="ckEditor" name="text_en"
placeholder="Въведи текст за туристическия обект [EN]"><?= $model->text_en ?></textarea>
</div>
</div>
</div>
<div class="c5 row top15">
<label>Асоциация с партньор</label>
<select name="partner_id">
<option>Без асоцииране</option>
<?php foreach ($museums as $museum): ?>
<option <?= $model->partner_id == $museum->id ? 'selected' : '' ?>
value="<?= $museum->id ?>"><?= $museum->name ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="c10 row top15">
<label>Локация</label>
<?= $this->render('_object_location_map', ['model' => $model]) ?>
</div>
<div class="c10 row top15">
<label>Географски координати</label>
<div class="row-panel flex">
<div class="c6 right10"><label>latitude</label><input readonly name="latitude" placeholder="Latitude" value="<?= $model->latitude ?>"></div>
<div class="c6 leaflet-right"><label>longitude</label><input readonly name="longitude" placeholder="Longitude" value="<?= $model->longitude ?>"></div>
</div>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('tour/tour-objects') ?>
</div>
</form>
</div>
@@ -0,0 +1,72 @@
<?php
use app\models\Subscriptions;
use app\models\TourObjects;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$filter = Yii::$app->getFilterData('and');
$filter[0] = 'and';
TableWidget::widget([
'top' => [
'title' => 'Туристически обекти',
'data' => [
'index/dashboard' => 'Начало',
]
],
'filter' => [
[
'name' => ['Наименование на туристическия обект', 'c4'],
],
],
'actions' => [
'new' => 'Нов туристически обект',
'edit' => 'Редакция на туристически обект',
'delete' => 'Изтриване на туристически обект'
],
'th' => [
'№' => 'c0 text-right',
'Наименование на туристическия обект' => '',
],
'model' => TourObjects::class,
'data' => TourObjects::find()->where(Yii::$app->getFilterData('and'))->loop([
'id',
function (TourObjects $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
], $_GET['p'] ?? 1, 50)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов туристически обект',
'title_edit' => 'Редакция туристически обект',
'data' => [
'index/dashboard' => 'Начало',
'tour/tour-objects' => 'Туристически обекти',
],
],
'tabs' => $tabs ?? [],
'writeView' => "tour/tabs/" . Includes::tab($tab) . "/tour_objects_w",
'model' => TourObjects::class,
'validation' => function ($p) use ($tab) {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете наименование на туристическия обект'];
if (empty($p->{'name_en'}))
return ["name_en" => 'Моля, въведете наименование на туристическия обект'];
if (empty($p->{'latitude'}) || empty($p->{'longitude'}))
return ["latitude" => 'Моля, изберете локация от картата по-горе за да попълните географските координати автоматично'];
},
'postService' => function ($p, TourObjects $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Данните са записани успешно' : 'Данните са създадени успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,79 @@
<?php
Yii::$app->controller->pageTitle = 'CMS администратори';
use app\models\UserAdminCms;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
TableWidget::widget([
'top' => [
'title' => 'CMS администратори',
'data' => [
'index/dashboard' => 'Начало',
'user/admin-global' => 'Потребители'
]
],
'actions' => [
//'new' => 'Нов CMS админ',
'edit' => 'Редакция на CMS админ',
'delete' => 'Изтриване на CMS админ'
],
'th' => [
'№' => 'c1 text-right',
'Ел. поща' => '',
'Име' => '',
'Активен' => 'c0 ct'
],
'data' => UserAdminCms::find()->orderBy(['id' => SORT_DESC])->loop([
'id',
'email_login',
'fullName',
function (UserAdminCms $model) {
return $model->statusSwitch('is_active');
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов CMS администратор',
'title_edit' => 'Редакция на CMS администратор',
'data' => [
'index/dashboard' => 'Начало',
'user/admin-cms' => 'CMS администратори'
]
],
'writeView' => 'user/write/admin-cms_w',
'model' => UserAdminCms::class,
'validation' => function ($p) {
if (isset($p->profile_update)) {
if (empty($p->{'email_login'}))
return ['email_login' => 'Моля, въведете ел. поща'];
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
if (UserAdminCms::recordExists('email_login', $p->{'email_login'}))
return ['email_login' => 'Този имейл адрес вече се ползва от друг cms администратор'];
//if (empty($p->{'role_id'}))
// return ['role_id' => 'Моля, изберете роля / група'];
}
if (isset($p->password_change) || empty($_GET['id'])) {
if (empty($p->{'password'}))
return ['password' => 'Моля, въведете парола'];
if (strlen($p->{'password'}) < 6)
return ['password' => 'Моля, въведете парола от поне 6 символа'];
if ($p->{'cPassword'} != $p->{'password'})
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
}
},
'postService' => function ($p, UserAdminCms $model) {
$model->setPostDataToModel();
$model->save();
if (!isset($p->{'rights'}))
$p->{'rights'} = [];
$model->updateRights($p->{'rights'});
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,102 @@
<?php
use app\models\UserAdminGlobal;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
$u = Auth::userAdminGlobal();
$filter = ['IS NOT', 'open_id', NULL];
TableWidget::widget([
'filter' => [
['email_login' => ['Ел. поща', 'c3']]
],
'top' => [
'title' => 'Глобални администратори',
'data' => [
'index/dashboard' => 'Начало',
'user/admin-global' => 'Потребители'
]
],
'actions' => [
//'new' => 'Нов глобален администратор',
'edit' => 'Редакция на глобален администратор',
//'delete' => 'Изтриване глобален администратор',
'export' => 'Експорт (csv)'
],
'th' => [
'№' => 'c1 text-right',
'Ел. поща' => '',
'Име' => '',
'Активен' => 'c0 ct'
],
'data' => UserAdminGlobal::find()->where($filter)->andWhere(Yii::$app->getFilterData())->orderBy(['first_name' => SORT_ASC])->loop([
'id',
'email_login',
function (UserAdminGlobal $model) {
return $model->getFullName();
},
function (UserAdminGlobal $model) use ($u) {
$disabled = $model->id == $u->id ? 'disabled' : null;
return $model->statusSwitch('is_active', null, null, $disabled);
},
], $_GET['p'] ?? 1, 30),
'ignoreIds' => [$u->id],
'exportData' => function () {
return [
'header' => [
'ID' => ['integer', 10],
'E-mail' => ['string', 50],
'Име' => ['string', 20],
'Фамилия' => ['string', 20]
],
'data' => UserAdminGlobal::find()->where(Yii::$app->getFilterData())->orderBy(['first_name' => SORT_ASC])->loop([
'id',
'email_login',
'first_name',
'last_name'
]),
'file_name' => 'Глобални_администратори_' . date('Y_m_d_H_i')
];
}
]);
FormWidget::widget([
'top' => [
'title' => 'Нов глобален администратор',
'title_edit' => 'Редакция на глобален администратор',
'data' => [
'index/dashboard' => 'Начало',
'user/admin-global' => 'Глобални администратори'
]
],
'writeView' => 'user/write/admin-global_w',
'model' => UserAdminGlobal::class,
'validation' => function ($p) {
if (isset($p->profile_update)) {
if (empty($p->{'email_login'}))
return ['email_login' => 'Моля, въведете ел. поща'];
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
if (UserAdminGlobal::recordExists('email_login', $p->{'email_login'}))
return ['email_login' => 'Този имейл адрес вече се ползва от друг глобален администратор'];
}
if (isset($p->password_change) || empty($_GET['id'])) {
if (empty($p->{'password'}))
return ['password' => 'Моля, въведете парола'];
if (strlen($p->{'password'}) < 6)
return ['password' => 'Моля, въведете парола от поне 6 символа'];
if ($p->{'cPassword'} != $p->{'password'})
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
}
},
'postService' => function ($p, UserAdminGlobal $model) {
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->setPostDataToModel();
$model->save();
$model->smartRedirect();
}
]);
@@ -0,0 +1 @@
<?php
@@ -0,0 +1,63 @@
<?php
use app\models\register\Partner;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
TableWidget::widget([
'filter' => [
['name' => ['Наименование', 'c3']]
],
'top' => [
'title' => 'Партньори',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители'
]
],
'actions' => [
//'new' => 'Нов парньор',
'edit' => 'Редакция на партньор',
//'delete' => 'Изтриване на партньор'
],
'th' => [
'№' => 'c1 text-right',
'logo' => '',
'Име на партньор' => '',
'Активен' => 'ct'
],
'data' => Partner::find()->where(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Partner $model) {
return '<img src="' . $model->getSrcOfSingleImage('partner_logo_image', '1:1') . '" style="width:80px">';
},
function (Partner $model) {
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
},
function (Partner $model) {
return $model->statusSwitch('active', null, ['Партньора е активен', 'Партньора е деактивиран']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов партньор',
'title_edit' => 'Редакция на партньор',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители',
'user/partner-org' => 'Партньори'
]
],
'writeView' => 'user/write/partner_org_w',
'model' => Partner::class,
'validation' => function ($p) {
},
'postService' => function ($p, Partner $model) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,169 @@
<?php
use app\models\CmsRoles;
use app\models\History;
use app\models\register\Partner;
use app\models\UserPartner;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
TableWidget::widget([
'filter' => [
[
'first_name' => ['Име', 'c1'],
'last_name' => ['Фамилия', 'c1'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
'role_id' => ['Роля/група', 'c2', CmsRoles::roleList()],
'is_active' => ['Статус', 'c1', [1 => 'Активен', 'null' => 'Не активен']]
],
],
'top' => [
'title' => 'Потребители на партньор',
'data' => [
'index/dashboard' => 'Начало',
'user/admin-global' => 'Потребители'
]
],
'actions' => [
//'new' => 'Нов потребител',
'edit' => 'Редакция на потребител',
//'delete' => 'Изтриване на потребител',
'export' => 'Експорт (csv)'
],
'th' => [
'№' => 'c1 text-right',
'Ел. поща' => '',
'Име' => '',
'Организация' => '',
'Група / роля ' => '',
'Бр. права' => 'c1',
'История' => 'c0 ct',
'Активен' => 'c0 ct'
],
'data' => UserPartner::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
'id',
function (UserPartner $model) {
return '<a href="?o=w&id=' . $model->id . '">' . $model->email_login . '</a>';
},
'fullName',
function (UserPartner $model) {
if ($model->partner)
return $model->partner->name;
},
function (UserPartner $model) {
if ($model->cmsRole)
return $model->cmsRole->name;
},
function (UserPartner $model) {
if ($model->getRightsIds())
return sizeof($model->getRightsIds());
},
function (UserPartner $model) {
return '<i data-table="user_partner" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (UserPartner $model) {
return $model->statusSwitch('is_active');
}
], $_GET['p'] ?? 1, 30),
'exportData' => function () {
return [
'header' => [
'ID' => ['integer', 10],
'E-mail' => ['string', 50],
'Име' => ['string', 20],
'Фамилия' => ['string', 20],
'Организация' => ['string', 50],
'Група / роля' => ['string', 30]
],
'data' => UserPartner::find()->where(Yii::$app->getFilterData())->orderBy(['first_name' => SORT_ASC])->loop([
'id',
'email_login',
'first_name',
'last_name',
function (UserPartner $userPartner) {
return $userPartner->partner->name;
},
function (UserPartner $userPartner) {
if ($userPartner->cmsRole)
return $userPartner->cmsRole->name;
}
]),
'file_name' => 'Партньори_' . date('Y_m_d_H_i')
];
}
]);
FormWidget::widget([
'top' => [
'title' => 'Нов партньор',
'title_edit' => 'Редакция на партньор',
'data' => [
'index/dashboard' => 'Начало',
'user/admin-global' => 'Потребители',
'user/partner' => 'Партньори',
]
],
'writeView' => 'user/write/partner_w',
'model' => UserPartner::class,
'validation' => function ($p, $f) {
if (isset($p->profile_update)) {
if (empty($p->{'email_login'}))
return ['email_login' => 'Моля, въведете ел. поща'];
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
if (UserPartner::recordExists('email_login', $p->{'email_login'}))
return ['email_login' => 'Този имейл адрес вече се ползва от друг потребител на партньор'];
/*if (empty($_GET['id'])) {
if (empty($p->{'password'}))
return ['password' => 'Моля, въведете парола'];
}
if (!empty($p->{'password'})) {
if (strlen($p->{'password'}) < 6)
return ['password' => 'Моля, въведете парола от поне 6 символа'];
if ($p->{'cPassword'} != $p->{'password'})
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
}
if (empty($p->{'first_name'}))
return ['first_name' => 'Моля, попълнете име'];
if (empty($p->{'middle_name'}))
return ['middle_name' => 'Моля, попълнете презиме'];
if (empty($p->{'last_name'}))
return ['last_name' => 'Моля, попълнете фамилия'];
*/
if (empty($p->{'first_name'}))
return ['first_name' => 'Моля, попълнете име'];
if (empty($p->{'last_name'}))
return ['last_name' => 'Моля, попълнете фамилия'];
if (empty($p->{'partner_id'}))
return ['partner_id' => 'Моля, изберете организация'];
if (empty($p->{'role_id'}))
return ['role_id' => 'Моля, изберете роля / група'];
}
if (isset($p->password_change) && !empty($_GET['id'])) {
if (empty($p->{'password'}))
return ['password' => 'Моля, въведете парола'];
if (strlen($p->{'password'}) < 6)
return ['password' => 'Моля, въведете парола от поне 6 символа'];
if ($p->{'cPassword'} != $p->{'password'})
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
}
return null;
},
'postService' => function ($p, UserPartner $model) {
$model->setPostDataToModel();
$model->uploadSingleImage('upload_image', 'user/partner');
$model->save();
if (!isset($p->{'rights'}))
$p->{'rights'} = [];
$model->updateRights($p->{'rights'});
History::addNew($model->id, 'user_partner', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
Yii::$app->setRefresh();
$model->smartRedirect();
}
]);
@@ -0,0 +1,47 @@
<?php
use app\models\UserAdminGlobal;
use app\services\Auth;
use app\widgets\FormWidget;
$u = Auth::userAdminGlobal();
$_GET['o'] = 'w';
$_GET['id'] = $u->id;
FormWidget::widget([
'top' => [
'title' => 'Профил',
'title_edit' => 'Профил',
'data' => [
'index/dashboard' => 'Начало'
]
],
'writeView' => 'user/write/profile_w',
'model' => UserAdminGlobal::class,
'validation' => function ($p) {
if (isset($p->profile_update)) {
if (empty($p->{'email_login'}))
return ['email_login' => 'Моля, въведете ел. поща'];
if (!filter_var($p->{'email_login'}, FILTER_VALIDATE_EMAIL))
return ['email_login' => 'Моля, въведете валиден имейл адрес'];
if (UserAdminGlobal::recordExists('email_login', $p->{'email_login'}))
return ['email_login' => 'Този имейл адрес вече се ползва от друг глобален администратор'];
}
if (isset($p->password_change) || empty($_GET['id'])) {
if (empty($p->{'password'}))
return ['password' => 'Моля, въведете парола'];
if (strlen($p->{'password'}) < 6)
return ['password' => 'Моля, въведете парола от поне 6 символа'];
if ($p->{'cPassword'} != $p->{'password'})
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
}
},
'postService' => function ($p, UserAdminGlobal $model) {
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->setPostDataToModel();
$model->save();
$model->redirectTo('user/profile', true);
}
]);
@@ -0,0 +1,106 @@
<?php
use app\models\UserAdminGlobal;
use app\models\UserPublic;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
$filter = [];
$u = Auth::userAdminGlobal();
TableWidget::widget([
'filter' => [
['email' => ['Ел. поща', 'c3']]
],
'top' => [
'title' => 'Потребители публичен портал',
'data' => [
'index/dashboard' => 'Начало',
'user/public' => 'Управление на потребители публичен портал'
]
],
'actions' => [
//'new' => 'Нов потребител',
//'edit' => 'Редакция потребител',
//'delete' => 'Изтриване потребител',
'export' => 'Експорт (csv)'
],
'th' => [
'№' => 'c0 text-right',
'Ел. поща' => 'c3',
'Име' => '',
'Клубна карта' => 'c1 ct',
'Активен' => 'c02 ct'
],
'data' => UserPublic::find()->where($filter)->andWhere(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
'id',
'email',
'full_name',
/*function (UserPublic $model) use ($u) {
$disabled = $model->id == $u->id ? 'disabled' : null;
return $model->statusSwitch('is_active', null, null, $disabled);
},*/
function (UserPublic $model) {
return $model->club_card ? '<span style="color: green">да</span>' : '<span style="color: darkred">не</span>';
},
function (UserPublic $model) {
return $model->statusSwitch('is_active', null, ['Потребителя е активиран', 'Потребителя е деактивиран']);
}
], $_GET['p'] ?? 1, 30),
//'ignoreIds' => [$u->id],
'exportData' => function () {
return [
'header' => [
'ID' => ['integer', 10],
'E-mail' => ['string', 50],
'Име и фамилия' => ['string', 50],
],
'data' => UserPublic::find()->where(Yii::$app->getFilterData())->orderBy(['full_name' => SORT_ASC])->loop([
'id',
'full_name',
'email',
]),
'file_name' => 'Потребители_публичен_портал' . date('Y_m_d_H_i')
];
}
]);
FormWidget::widget([
'top' => [
'title' => 'Нов глобален администратор',
'title_edit' => 'Редакция на глобален администратор',
'data' => [
'index/dashboard' => 'Начало',
'user/public' => 'Управление на потребители публичен портал'
]
],
'writeView' => 'user/write/public-user_w',
'model' => UserPublic::class,
'validation' => function ($p) {
if (isset($p->profile_update)) {
if (empty($p->{'email'}))
return ['email' => 'Моля, въведете ел. поща'];
if (!filter_var($p->{'email'}, FILTER_VALIDATE_EMAIL))
return ['email' => 'Моля, въведете валиден имейл адрес'];
if (UserPublic::recordExists('email', $p->{'email'}))
return ['email' => 'Този имейл адрес вече се ползва от потребител в публичен портал'];
}
if (isset($p->password_change) || empty($_GET['id'])) {
if (empty($p->{'password'}))
return ['password' => 'Моля, въведете парола'];
if (strlen($p->{'password'}) < 6)
return ['password' => 'Моля, въведете парола от поне 6 символа'];
if ($p->{'cPassword'} != $p->{'password'})
return ['cPassword' => 'Повторното въвеждане на паролата не съвпада с първата'];
}
},
'postService' => function ($p, UserPublic $model) {
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->setPostDataToModel();
$model->save();
$model->smartRedirect();
}
]);
@@ -0,0 +1 @@
<?php
@@ -0,0 +1,62 @@
<?php
Yii::$app->controller->pageTitle = 'Права';
use app\models\CmsRights;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
TableWidget::widget([
'filter' => [
['name' => ['Наименование', 'c3']]
],
'top' => [
'title' => 'Права',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители'
]
],
'actions' => [
'new' => 'Ново право',
'edit' => 'Редакция на право',
//'delete' => 'Изтриване на право'
],
'th' => [
'№' => 'c1 text-right',
'Наименование на потребителското правото' => '',
'Активен' => ''
],
'data' => CmsRights::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
'id',
'name',
function(CmsRights $model) {
return $model->statusSwitch('is_active', null, ['Правото е активирано', 'Правото е деактивирано']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Ново право',
'title_edit' => 'Редакция на право',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители',
'user/rights' => 'Права'
]
],
'writeView' => 'user/write/rights_w',
'model' => CmsRights::class,
'validation' => function ($p) {
if (empty($p->{'name'}))
return ['name' => 'Моля, въведете наименование на правото'];
if (CmsRights::recordExists('name', $p->{'name'}))
return ['name' => 'Това право вече е въведено, моля използвайте друго наименование'];
},
'postService' => function ($p, CmsRights $model) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,69 @@
<?php
Yii::$app->controller->pageTitle = 'Роли / групи';
use app\models\CmsRoles;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
TableWidget::widget([
'top' => [
'title' => 'Роли / групи',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители'
]
],
'actions' => [
'new' => 'Нова роля',
'edit' => 'Редакция на роля',
'delete' => 'Изтриване на роля'
],
'th' => [
'№' => 'c1 text-right',
'Наименование на роля' => 'c3',
'Описание на роля' => '',
'Бр. зададени права' => ''
],
'data' => CmsRoles::find()->loop([
'id',
function (CmsRoles $model) {
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
},
'description',
function (CmsRoles $model) {
return sizeof($model->getRightsIds());
}
], $_GET['p'] ?? 1, 20)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова роля/група',
'title_edit' => 'Редакция на роля/група',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители',
'user/roles' => 'Роли / групи'
]
],
'writeView' => 'user/write/roles_w',
'model' => CmsRoles::class,
'validation' => function ($p) {
if (empty($p->{'user_type_id'}))
return ['user_type_id' => 'Моля, изберете тип потребител'];
if (empty($p->{'name'}))
return ['name' => 'Моля, въведете наименование на ролята'];
if (CmsRoles::recordExists('name', $p->{'name'}))
return ['name' => 'Тази роля вече е ваведена, моля използвайте друго наименование'];
},
'postService' => function ($p, CmsRoles $model) {
$model->setPostDataToModel();
$model->save();
if (!isset($p->{'rights'}))
$p->{'rights'} = [];
$model->updateRights($p->{'rights'});
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,105 @@
<?php
use app\models\CmsRoles;
use app\models\UserAdminCms;
/**
* @var UserAdminCms $model
*/
?>
<div class="inner-content p10">
<?php if (!empty($_GET['id'])): ?>
<form autocomplete="off">
<input name="password_change" type="hidden" value="1">
<div class="row c7 top15">
<div class="top-title">Смяна на парола</div>
</div>
<div class="c7 flex top15 top-page-panel">
<div class="row c6 right10">
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
<input type="password" name="password"
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
value=""/>
</div>
<div class="row c6">
<label class="require">Повтори паролата</label>
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
</div>
</div>
<div class="row c7 top15 flex">
<button class="btn btn-default"><i class="la la-lock"></i> Смени паролата</button>
</div>
</form>
<?php endif ?>
<form autocomplete="off" class="top15">
<input name="profile_update" type="hidden" value="1">
<div class="row c7">
<div class="top-title">Данни на потребителя</div>
</div>
<div class="row c7 flex top15">
<div class="right10 c6">
<label class="require">Потребител (ел. поща)</label>
<input name="email_login" placeholder="Въведи ел. поща за логин в системата"
value="<?= $model->email_login ?>"/>
</div>
<div class="c6">
<label>Телефон</label>
<input name="phone" placeholder="Въведи телефон"
value="<?= $model->phone ?>"/>
</div>
</div>
<div class="row c7 top15 flex">
<div class="right10 c6">
<label>Име</label>
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
</div>
<div class="c6">
<label>Фамилия</label>
<input name="last_name" placeholder="Фамилия" value="<?= $model->last_name ?>">
</div>
</div>
<?php if (empty($_GET['id'])): ?>
<div class="c7 flex top15">
<div class="row c6 right10">
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
<input type="password" name="password"
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
value=""/>
</div>
<div class="row c6">
<label class="require">Повтори паролата</label>
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
</div>
</div>
<?php endif; ?>
<div class="row c7 top15 flex">
<?=\app\widgets\services\Includes::formButtons('user/admin-cms')?>
</div>
</form>
</div>
<script>
function updateCheckListByRole(e) {
if(e.value) {
request({
url: e.dataset.update + '?role_id=' + e.value,
done: r => {
if(r.rights) {
all('.check-list input', e => {
e.checked = false;
});
r.rights.forEach(e => {
console.log(e)
const inputRight = one('.check-list input[value="'+ e +'"]');
inputRight.checked = true;
})
}
}
})
} else {
}
}
</script>
@@ -0,0 +1,76 @@
<?php
use app\models\UserAdminGlobal;
use app\widgets\services\Includes;
/**
* @var UserAdminGlobal $model
*/
?>
<div class="inner-content p10">
<?php if (!empty($_GET['id'])): ?>
<!--
<form autocomplete="off">
<input name="password_change" type="hidden" value="1">
<div class="row c7 top15">
<div class="top-title">Смяна на парола</div>
</div>
<div class="c7 flex top15 top-page-panel">
<div class="row c6 right10">
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
<input type="password" name="password"
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
value=""/>
</div>
<div class="row c6">
<label class="require">Повтори паролата</label>
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
</div>
</div>
<div class="row c7 top15 flex">
<button class="btn btn-default"><i class="la la-lock"></i> Смени паролата</button>
</div>
</form>
-->
<?php endif ?>
<form autocomplete="off" class="top15">
<input name="profile_update" type="hidden" value="1">
<div class="row c7">
<div class="top-title">Данни на потребителя</div>
</div>
<div class="row c7 flex top15">
<div class="right10 c6">
<label class="require">Потребител (ел. поща)</label>
<input readonly name="email_login" placeholder="Въведи ел. поща за логин в системата"
value="<?= $model->email_login ?>"/>
</div>
<div class="c6">
<label>Телефон</label>
<input name="phone" placeholder="Въведи телефон"
value="<?= $model->phone ?>"/>
</div>
</div>
<div class="row c7 top15 flex">
<div class="right10 c6">
<label>Име</label>
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
</div>
</div>
<?php if (empty($_GET['id'])): ?>
<div class="c7 flex top15">
<div class="row c6 right10">
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
<input type="password" name="password"
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
value=""/>
</div>
<div class="row c6">
<label class="require">Повтори паролата</label>
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
</div>
</div>
<?php endif; ?>
<div class="row c7 top15 flex">
<?= Includes::formButtons('user/admin-global'); ?>
</div>
</form>
</div>
@@ -0,0 +1,148 @@
<?php
use app\widgets\FileWidget;
/**
* @var \app\models\register\Partner $model
*/
$media_key = $model->getMediaKey();
?>
<div class="inner-content p20">
<div class="row top15">
<a style="width: 200px; text-align: center"
href="<?= Yii::$app->goTo('user/partner-org') ?><?= isset($_GET['p']) ? '?p=' . $_GET['p'] : '' ?>"
class="btn btn-default right10"><i class="la la-undo"></i> Обратно в списъка</a>
</div>
</div>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c5">
<h2><?= $model->name ?></h2>
</div>
<div class="row top30" style="width: 350px">
<label>Лого</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'partner_logo_image',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне',
'edit' => 'Редакция',
'delete' => 'Премахване'
],
'single_file' => true,
'resolutions' => ['1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<div class="row top15" style="width: 350px">
<label>Хедър изображение за страницата на партньор</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'partner_header_image',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне',
'edit' => 'Редакция',
'delete' => 'Премахване'
],
'single_file' => true,
'resolutions' => ['21:5'],
'max_file_size' => 4,
'error_message' => 'Файловете по-големи от 4МБ, не бяха добавени'
]) ?>
</div>
<div class="row top15 c5">
<label>Описание</label>
<p><?= $model->description ?></p>
</div>
<div class="row top15 c5">
<label>Уебсайт</label>
<p><?= $model->website ?></p>
</div>
<div class="row top15 c5">
<label>Телефон</label>
<p><?= $model->phone ?></p>
</div>
<div class="row top15 c5">
<label>E-mail</label>
<p><?= $model->email ?></p>
</div>
<div class="row c15 top15 top-page-panel">
<label>Ауторизирани публични потребители</label>
<p class="upload-info">* изберете потребители, които да бъдат ауторизирани да проверяват направените
резервации в деня и часа на дадено събитие, публикувано партньора.</p>
<div class="flex">
<div style="width: 700px">
<select id="auth_users" style="display:none;" class="search-select-box" multiple
name="user_list[]">
<option disabled value="">-- избери потребител --</option>
<?php foreach ($model->userPublicList() as $item): ?>
<option <?= $item['selected'] ?>
value="<?= $item['id'] ?>"><?= $item['name'] ?></option>
<?php endforeach; ?>
</select>
</div>
<div onclick="updateQrValidators()" id="update_qr_validators" class="btn btn-default"
style="width: 200px; text-align: center; height: 10px; line-height: 10px; margin-left: 10px">
Актуализирай
</div>
</div>
</div>
<p class="upload-info">Партньорът ще бъде визоализиран на сайта, след като има качено и обработено лого
изображение за него във формат 1:1</p>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<script src="/_public/assets/js/search-box.js"></script>
<script>
all('.search-select-box').forEach(el => {
var s = new SearchBox(el)
})
function updateQrValidators() {
const selectEl = document.getElementById("auth_users");
const selectedOptions = [];
for (let i = 0; i < selectEl.options.length; i++) {
if (selectEl.options[i].selected) {
selectedOptions.push(selectEl.options[i].value);
}
}
console.log(selectedOptions)
request({
url: '/remote/update-qr-validators/',
post: {
validators: selectedOptions,
partner_id: '<?= $model->id ?>'
},
done: (r) => {
console.log(r)
if(r && r.success) {
flash.success('Списъка с потребители е актуализиран успешно', false)
}
}
})
}
</script>
<?php if ($model->id && !$model->media_key): ?>
<script>
const media_key = '<?= $media_key ?>';
request({
url: window.location.href + '&media_key_update=1',
post: {media_key: media_key}
})
</script>
<?php endif; ?>
@@ -0,0 +1,121 @@
<?php
use app\models\CmsRoles;
use app\models\register\Partner;
use app\models\UserPartner;
use app\services\JWT;
use app\widgets\services\Includes;
/**
* @var \app\models\UserPartner $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<input name="profile_update" type="hidden" value="1">
<div class="row c7 top15">
<div class="top-title">Данни на потребителя</div>
</div>
<div class="row c7 top15">
<div class="c6">
<label>Снимка</label>
<div class="image-upload cursor-default">
<div class="actions"
data-image-name="upload_image"
data-add="Добави снимка"
data-edit="Смени снимката"
data-remove="Премахни снимката"
data-remove-msg="Искате ли снимката да бъде премахната?"
data-remove-ready="Снимката е премахната"
data-warning="Снимката ще се актуализира след запазване на цялата форма"
data-default="la la-user"
data-src="<?= $model->getSingleImageSrc('user/partner') ?>"
></div>
</div>
</div>
</div>
<div class="row c7 top15 flex">
<div class="right10 c6">
<label class="require">Служебен имейл</label>
<input name="email_login" placeholder="Въведи ел. поща за логин в системата" value="<?= $model->email_login?>"/>
</div>
<div class="right10 c6">
<label class="require">Име</label>
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
</div>
<div class="c6">
<label class="require">Фамилия</label>
<input name="last_name" placeholder="Фамилия" value="<?= $model->last_name ?>">
</div>
</div>
<div class="row c7 top15 flex">
<div class="c6 right10">
<label>Организация</label>
<select style="pointer-events: none; appearance: none; border: 0; width: calc(100% - 10px); font-weight: bold; color: #1e6ab3; background: #f1f1f1" readonly="" name="partner_id">
<option disabled selected>-- Избери организация --</option>
<?php foreach (Partner::partnerList() as $id => $name): ?>
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="row c7 top15">
<div class="c8">
<label>Представяне</label>
<textarea name="presentation"><?= $model->presentation ?></textarea>
</div>
</div>
<div class="row c7 top15">
<div class="c8">
<label class="require">Роля / група</label>
<select name="role_id" data-update="<?= Yii::$app->goTo('role-rights') ?>"
onchange="updateCheckListByRole(this)">
<option disabled selected>-- Избери роля / група --</option>
<?php foreach (CmsRoles::roleList() as $id => $name): ?>
<option <?= $model->role_id == $id ? 'selected' : '' ?> value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="row c7 flex top15">
<div class="row c8">
<label>Добавяне на права</label>
<div class="p10 border-default">
<input onkeyup="searchInCheckList(this)" placeholder="Филтър на права">
<div class="check-list p10 border-default top5" style="width: calc(100% - 20px)">
<?= UserPartner::getRightList($model) ?>
</div>
</div>
</div>
</div>
<div class="row c7 top15 flex">
<?= Includes::formButtons('user/partner') ?>
</div>
</form>
</div>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<script>
function updateCheckListByRole(e) {
if (e.value) {
request({
url: e.dataset.update + '?role_id=' + e.value,
done: r => {
if (r.rights) {
all('.check-list input', e => {
e.checked = false;
});
r.rights.forEach(e => {
console.log(e)
const inputRight = one('.check-list input[value="' + e + '"]');
inputRight.checked = true;
})
}
}
})
} else {
}
}
</script>
@@ -0,0 +1,69 @@
<?php
use app\models\UserAdminGlobal;
/**
* @var UserAdminGlobal $model
*/
?>
<div class="inner-content p10">
<?php if (!empty($_GET['id'])): ?>
<?php if(!$model->open_id): ?>
<form autocomplete="off">
<input name="password_change" type="hidden" value="1">
<div class="row c7 top15">
<div class="top-title">Смяна на парола</div>
</div>
<div class="c7 flex top15 top-page-panel">
<div class="row c6 right10">
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
<input type="password" name="password"
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
value=""/>
</div>
<div class="row c6">
<label class="require">Повтори паролата</label>
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
</div>
</div>
<div class="row c7 top15 flex">
<button class="btn btn-default"><i class="la la-save"></i> Смяна на парола</button>
</div>
</form>
<?php endif; ?>
<?php endif ?>
<form autocomplete="off" class="top15">
<div class="row c7 top15">
<div class="top-title">Данни на потребителя</div>
</div>
<input name="profile_update" type="hidden" value="1">
<div class="c7 top15">
<div class="row flex">
<div class="right10 c6">
<label class="require">Потребител (ел. поща)</label>
<input name="email_login" placeholder="Въведи ел. поща за логин в системата"
value="<?= $model->email_login ?>"/>
</div>
<div class="c6">
<label>Телефон</label>
<input name="phone" placeholder="Въведи телефон"
value="<?= $model->phone ?>"/>
</div>
</div>
<div class="row top15 flex">
<div class="right10 c6">
<label>Име</label>
<input name="first_name" placeholder="Име" value="<?= $model->first_name ?>">
</div>
<div class="c6">
<label>Фамилия</label>
<input name="last_name" placeholder="Фамилия" value="<?= $model->last_name ?>">
</div>
</div>
</div>
<div class="row c7 top15 flex">
<button class="btn btn-default"><i class="la la-save"></i> Актуализирай</button>
</div>
</form>
</div>
@@ -0,0 +1,70 @@
<?php
use app\models\UserAdminGlobal;
use app\widgets\services\Includes;
exit;
/**
* @var \app\models\UserPublic $model
*/
?>
<div class="inner-content p10">
<?php if (!empty($_GET['id'])): ?>
<form autocomplete="off">
<input name="password_change" type="hidden" value="1">
<div class="row c7 top15">
<div class="top-title">Смяна на парола</div>
</div>
<div class="c7 flex top15 top-page-panel">
<div class="row c6 right10">
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
<input type="password" name="password"
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
value=""/>
</div>
<div class="row c6">
<label class="require">Повтори паролата</label>
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
</div>
</div>
<div class="row c7 top15 flex">
<button class="btn btn-default"><i class="la la-lock"></i> Смени паролата</button>
</div>
</form>
<?php endif ?>
<form autocomplete="off" class="top15">
<input name="profile_update" type="hidden" value="1">
<div class="row c7">
<div class="top-title">Данни на потребителя</div>
</div>
<div class="row c7 flex top15">
<div class="right10 c6">
<label class="require">Потребител (ел. поща)</label>
<input name="email" placeholder="Въведи ел. поща за логин в системата"
value="<?= $model->email ?>"/>
</div>
</div>
<div class="row c7 top15 flex">
<div class="right10 c6">
<label>Име и фамилия</label>
<input name="full_name" placeholder="Име" value="<?= $model->full_name ?>">
</div>
</div>
<?php if (empty($_GET['id'])): ?>
<div class="c7 flex top15">
<div class="row c6 right10">
<label class="require"><?= $model->password ? 'Нова парола' : 'Парола' ?></label>
<input type="password" name="password"
placeholder="<?= $model->password ? 'Смени паролата за логиин' : 'Въведи парола за логин в системата' ?> "
value=""/>
</div>
<div class="row c6">
<label class="require">Повтори паролата</label>
<input type="password" name="cPassword" placeholder="Повторете паролата" value=""/>
</div>
</div>
<?php endif; ?>
<div class="row c7 top15 flex">
<?= Includes::formButtons('user/public'); ?>
</div>
</form>
</div>
@@ -0,0 +1,20 @@
<?php
use app\models\CmsRights;
use app\widgets\services\Includes;
/**
* @var CmsRights $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c5">
<label class="require">Наименование на право</label>
<input name="name" placeholder="Въведи наименование потребителското право" value="<?= $model->name ?>"/>
</div>
<div class="row c5 top15 flex">
<?= Includes::formButtons('user/rights') ?>
</div>
</form>
</div>
@@ -0,0 +1,44 @@
<?php
use app\models\CmsRights;
use app\models\CmsRoles;
use app\widgets\services\Includes;
/**
* @var CmsRoles $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c5">
<label class="require">Тип потребител</label>
<select name="user_type_id">
<option disabled selected>-- Избери тип потребител --</option>
<?php foreach (CmsRoles::roleUserTypes() as $id => $roleUserType): ?>
<option <?= $model->user_type_id == $id ? 'selected' : '' ?> value="<?= $id ?>"><?=$roleUserType?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row c5 top15">
<label class="require">Наименование на роля / група</label>
<input name="name" placeholder="Въведи наименование на ролята / групата" value="<?= $model->name ?>"/>
</div>
<div class="row c5 top15">
<label>Описание на роля / група</label>
<input name="description" placeholder="Въведи кратко описание на ролята / групата"
value="<?= $model->description ?>"/>
</div>
<div class="row c5 top15">
<label>Добавяне на права</label>
<div class="p10 border-default">
<input onkeyup="searchInCheckList(this)" placeholder="Филтър на права">
<div class="check-list p10 border-default top5" style="width: calc(100% - 20px)">
<?= CmsRights::getHtmlList($model) ?>
</div>
</div>
</div>
<div class="row c5 top15 flex">
<?= Includes::formButtons('user/roles') ?>
</div>
</form>
</div>
@@ -0,0 +1,30 @@
<?php
use app\models\CommonFields;
$commonFields = CommonFields::find()->where(['IS', 'parent_id', NULL])->all();
?>
<div class="advanced-filter filter">
<div class="filter-header">
<div class="close-filter"><i class="la la-remove"></i></div>
</div>
<div class="filter-body">
<div class="row top15">
<label>Вид шаблон</label>
<select style="display: none" class="objet_type_select" multiple >
<option value="">-- без филтър --</option>
</select>
</div>
<?php foreach ($commonFields as $commonField): ?>
<div class="row top15">
<label><?= $commonField->name ?></label>
<select style="display: none" class="advanced-select" multiple >
<option value="">-- без филтър --</option>
<?php foreach ($commonField->options as $option): ?>
<option value="<?= $option->id ?>"><?= $option->name ?></option>
<?php endforeach; ?>
</select>
</div>
<?php endforeach; ?>
</div>
</div>
@@ -0,0 +1,72 @@
<?php
use app\models\Expositions;
use app\models\ExpositionsCategories;
use app\models\History;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
/**
* @var $listtabs
* @var $tab
*/
TableWidget::widget([
'top' => [
'title' => 'Експозиции категории',
'data' => [
'index/dashboard' => 'Начало',
]
],
'listTabs' => $listtabs,
'actions' => [
'new' => 'Нова категория',
'edit' => 'Редакция на категория',
'delete' => 'Изтриване на категори'
],
'th' => [
'№' => 'c0 text-right',
'Име на категория (bg)' => '',
'Име на категория (en)' => '',
],
'data' => ExpositionsCategories::find()->where([])->orderBy(['id' => SORT_ASC])->loop([
'id',
function (ExpositionsCategories $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
'name_en'
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова категория',
'title_edit' => 'Редакция на категория',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions?listtab=categories' => 'Категории експозиции'
],
],
'tabs' => ['main' => '<i class="la la-database"></i> Основни данни'],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/expositions_categories_w",
'model' => ExpositionsCategories::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете име на категорията'];
if (empty($p->{'name_en'}))
return ["name_en" => 'Моля, въведете име на категорията на английски'];
}
return null;
},
'postService' => function ($p, ExpositionsCategories $model) {
$model->setPostDataToModel();
$model->save();
History::addNew($model->id, 'expositions-categories', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Категорията експозиция е актуализирана успешно' : 'Категорията експозиция е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,132 @@
<?php
use app\models\Expositions;
use app\models\ExpositionsObjects;
use app\models\History;
use app\models\register\Partner;
use app\services\Auth;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
/**
* @var $listtabs
* @var $tab
*/
TableWidget::widget([
'filter' => [
[
'name' => ['Име', 'c4'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
]
],
'top' => [
'title' => 'Експозиции на обекти',
'data' => [
'index/dashboard' => 'Начало'
]
],
'listTabs' => $listtabs,
'actions' => [
'new' => 'Нова експозиция',
'edit' => 'Редакция на експозиция',
'delete' => 'Изтриване на експозиция'
],
'th' => [
'№' => 'c0 text-right',
'Име на експозиция' => '',
'История' => 'c1 ct',
'Добавена в избрани' => 'c1 ct',
'За публикуване' => 'c1 ct',
'Публикувана' => 'c1 ct',
'Дата на публикуване' => 'c1 ct',
],
'data' => Expositions::find()->where(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Expositions $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (Expositions $model) {
return '<i data-table="expositions" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (Expositions $model) {
return $model->statusSwitch('is_selected', null, ['Експозицията е добавена в избрани', 'Експозицията е махната от избрани']);
},
function (Expositions $model) {
return $model->is_for_publish ? '<span id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">да</span>' : 'не';
},
function (Expositions $model) {
return $model->statusSwitch('is_active', null, ['Експозицията е видима на сайта', 'Експозицията е свалена от сайта']);
},
function (Expositions $model) {
if ($model->publish_date)
return Formatter::date($model->publish_date);
},
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова експозиция',
'title_edit' => 'Редакция на експозиция',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Експозиции на обекти'
],
],
'tabs' => $tabs ?? [],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/expositions_w",
'model' => Expositions::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете име на експозицията'];
if (empty($p->{'ts_en_name'}))
return ["ts_en_name" => 'Моля, въведете име на експозицията на английски'];
if (empty($p->{'category_id'}))
return ["category_id" => 'Моля, изберете категория на експозицията'];
if (empty($p->{'annotation'}))
return ["annotation" => 'Моля, въведете анотация на експозицията'];
if (empty($p->{'description'}))
return ["description" => 'Моля, въведете описание на експозицията'];
if (empty($p->{'partner_id'}))
return ["partner_id" => 'Моля, изберете партноьор, който представя експозицията'];
if (empty($p->{'info_center'}))
return ["info_center" => 'Моля, попълнете име на информационен център'];
if (empty($p->{'info_center_address'}))
return ["info_center_address" => 'Моля, попълнете адрес на информационен център'];
} else if (Includes::inLocales($tab)) {
if (empty($p->{$tab . '_annotation'}))
return [$tab . "_annotation" => 'Моля, въведете анотация на експозицията'];
if (empty($p->{$tab . '_description'}))
return [$tab . "_description" => 'Моля, въведете описание на експозицията'];
if (empty($p->{$tab . '_info_center'}))
return [$tab . "_info_center" => 'Моля, попълнете име на информационен център'];
if (empty($p->{$tab . '_info_center_address'}))
return [$tab . "_info_center_address" => 'Моля, попълнете адрес на информационен център'];
}
return null;
},
'postService' => function ($p, Expositions $model) {
if (!empty($p->{'exposition_id'}) && !empty($p->{'object_id'}) && !empty($p->{'delete'})) {
$eo = ExpositionsObjects::find()->where(['exposition_id' => $p->{'exposition_id'}, 'object_id' => $p->{'object_id'}])->one();
if ($eo)
$eo->delete();
echo json_encode(['success' => 1, 'message' => '']);
exit;
}
$model->setPostDataToModel();
$model->save();
if (empty($p->{'tag_list'})) {
$model->updateExpositionTags([]);
} else {
$model->updateExpositionTags($p->{'tag_list'});
}
History::addNew($model->id, 'expositions', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Експозицията е актуализирана успешно' : 'Експозицията е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,32 @@
<?php
use app\models\ExpositionsTags;
use app\widgets\FormWidget;
$_GET['o'] = 'w';
FormWidget::widget([
'top' => [
'title' => 'Експозиции тагове',
'title_edit' => '',
'data' => [
'index/dashboard' => 'Начало',
],
],
'writeView' => "web-portal/tabs/main/expositions_tags_w",
'model' => ExpositionsTags::class,
'validation' => function ($p) {
},
'postService' => function ($p, ExpositionsTags $model) {
$model->setPostDataToModel();
if (isset($p->{'name'}) && $p->name == 'null')
$model->name = null;
if (isset($p->{'name_en'}) && $p->name_en == 'null')
$model->name_en = null;
$model->save();
echo json_encode(['id' => $model->id]);
exit;
}
]);
@@ -0,0 +1,48 @@
<?php
/**
* @var $expId
*/
$filterData = [];
?>
<style>
.filter-box {
position: fixed;
right: 0;
height: calc(100% - 137px);
background: #FFFFFF;
width: 600px;
top: 45px;
transform: translateX(650px);
transition: all 0.3s;
padding: 30px 20px 10px 30px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
}
.filter-box.open {
transform: translateX(0);
}
</style>
<div class="filter-box">
<div class="row">
<label>Реф. номер</label>
<input data-format="integer" id="filter_object_ref_num" value="<?= $_GET['ref_num'] ?? ''?>" style="width: 200px">
</div>
<div class="row top15">
<label>Име на обект</label>
<input id="filter_object_name" value="<?= $_GET['name'] ?? ''?>">
</div>
<div class="flex flex-center top15">
<div onclick="filterExpObjects()" class="btn-ib btn-default"><i class="la la-filter"></i> Филтрирай</div>
<div onclick="clearFilterExpObjects()" class="btn-ib btn-rem"><i class="la la-remove"></i> Изчисти</div>
</div>
</div>
<script>
//dataFormat()
</script>
<!-- //filter_object_name -->
@@ -0,0 +1,310 @@
<style>
.page-navbar {
display: none;
}
.header {
display: none;
}
.cms-table {
margin: 45px 0 35px 0;
}
.pagination {
position: fixed;
bottom: 0;
left: 0;
justify-content: left !important;
background: #FFFFFF;
padding: 15px;
box-shadow: 0 -3px 10px rgba(0, 0, 0, 0.3);
width: 100%;
margin-left: 0 !important;
}
.page-content {
width: 100%;
padding: 0 !important;
}
.flex.top {
position: fixed;
top: 0;
left: 0;
background: #FFFFFF;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
z-index: 10000;
padding-left: 15px;
margin-left: 0;
width: 100%;
}
.flex.top .top-title {
padding-top: 15px !important;
padding-bottom: 10px !important;
width: 100%;
white-space: nowrap;
overflow-x: hidden;
font-size: 16px;
color: var(--base-background-dark);
}
.inner-content {
padding: 1px !important;
position: relative;
}
.filter-button {
position: fixed;
right: 15px;
bottom: 70px;
height: 50px !important;
width: 50px !important;
text-align: center;
line-height: 60px;
cursor: pointer;
border-radius: 100%;
border: 1px solid var(--base-background-dark);
background: #FFFFFF;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
z-index: 100000;
}
.filter-button:hover {
background: var(--base-background-ultra-bright-clear);
}
.filter-button .la {
font-size: 25px;
color: var(--base-background-dark);
}
.breadcrumb {
display: none;
}
</style>
<?php
/**
* @var $this \yii\web\View
*/
use app\models\History;
use app\models\RegisterObjects;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$title = null;
$expId = null;
$partner_id = null;
if (!empty($_GET['expId'])) {
$exp = \app\models\Expositions::findOne($_GET['expId']);
if ($exp) {
$title = $exp->name;
$expId = $exp->id;
$partner_id = $exp->partner_id;
}
}
if(!$partner_id) exit;
$specialCondition = [];
$specialCondition['partner_id'] = $partner_id;
$specialCondition['lib_type'] = 1;
if(!empty($_GET['ref_num'])) {
$specialCondition['ref_num'] = (int)$_GET['ref_num'];
}
if(!empty($_GET['name'])) {
$specialCondition['name'] = $_GET['name'];
}
$data = RegisterObjects::find()->where($specialCondition)->orderBy(['date_updated' => SORT_DESC]);
TableWidget::widget([
//'advanced_filter' => $this->render('_advanced_filters/object'),
'top' => [
'title' => $title ? 'Експозиция: ' . $title : '',
'data' => [
//'index/dashboard' => 'Начало',
//'web-portal/expositions' => 'Уебпортал',
]
],
'actions' => [
// 'edit' => 'Редакция на обект',
// 'delete' => 'Изтриване на обект'
],
'th' => [
//'ID' => 'c05 text-right',
'Реф. №' => 'c05 text-right',
'Добавяне в експозицията' => 'c1',
'Изображение' => 'ct c1',
'Наименование' => '',
],
'data' => $data->loop([
//'id',
'ref_num',
function (RegisterObjects $model) use ($expId) {
$button = $model->isAddedToExposition($expId);
return '<div data-exposition-id="' . $expId . '" data-object-id="' . $model->id . '" class="flex flex-center">' . $button . '</div>';
},
function (RegisterObjects $model) {
if ($model->mainImgFile) {
return '<img src="' . $model->mainImgFile . '" style="height: 130px">';
}
},
function (RegisterObjects $model) {
if ($model->name)
return $model->name;
},
/*function (RegisterObjects $model) {
if ($model->city)
return $model->city->place;
},*/
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) ? "web-portal/tabs/main/register_objects_w" : "web-portal/tabs/" . Includes::tab($tab) . "/register_objects_w",
'model' => RegisterObjects::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($_GET['id'])) {
//NEW OBJECT
if (empty($p->{'sc_id'}))
return ['sc_id' => 'Моля, изберете категория'];
if (empty($p->{'sc_id'}))
return ['ot_id' => 'Моля, изберете шаблон на обект'];
} else {
//UPDATE GENERAL DATA
if (empty($p->{'name'}))
return ['name' => 'Моля, въведете име на обекта'];
if (empty($p->{'annotation'}))
return ['annotation' => 'Моля, въведете анотация'];
if (empty($p->{'description'}))
return ['description' => 'Моля, въведете описание'];
}
} else if (Includes::inLocales($tab)) {
if (empty($p->{$tab . '_name'}))
return [$tab . '_name' => 'Моля, въведете име на обекта'];
if (empty($p->{$tab . '_annotation'}))
return [$tab . '_annotation' => 'Моля, въведете анотация'];
if (empty($p->{$tab . '_description'}))
return [$tab . '_description' => 'Моля, въведете описание'];
}
return null;
},
'postService' => function ($p, RegisterObjects $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
History::addNew($model->id, 'register_objects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
if (empty($_GET['media_key_update'])) {
Yii::$app->flash('success', isset($_GET['id']) ? 'Обекта е актуализиран успешно' : 'Обекта е създаден успешно');
$model->smartRedirect();
}
}
]);
echo $this->render('_list_object_filter', ['expId' => $expId])
?>
<script>
function addExpObject(elem) {
const exposition_id = elem.parentNode.dataset.expositionId;
const object_id = elem.parentNode.dataset.objectId;
elem.classList.add('disabled')
request({
url: '/remote/add-object-to-exposition/',
post: {
exposition_id,
object_id
},
done: (e) => {
if (e.error) {
flash.error('Този обект вече е добавен, изберете друг', true);
} else {
flash.success('Обекта е добавен към експозицията', true);
elem.parentNode.innerHTML = '<div onclick="removeExpObject(this)" class="btn-rem btn-ib"><i class="la la-remove"></i> Премахни</div>'
}
window.parent.loadExpositionObjects()
}
})
}
function removeExpObject(elem) {
const exposition_id = elem.parentNode.dataset.expositionId;
const object_id = elem.parentNode.dataset.objectId;
elem.classList.add('disabled');
request({
url: '/remote/remove-object-from-exposition/',
post: {
exposition_id,
object_id
},
done: (e) => {
if (e.error) {
} else {
flash.success('Обекта е премахнат от експозицията', true);
elem.parentNode.innerHTML = '<div onclick="addExpObject(this)" class="btn-ib btn-default"><i class="la la-plus-circle"></i> Добави</div>'
window.parent.loadExpositionObjects()
}
}
})
}
window.addEventListener('DOMContentLoaded', function () {
const top = document.querySelector('.inner-content');
const fbx = document.querySelector('.filter-box');
const fb = one('filter-button', top);
fb.innerHTML = '<i class="la la-search"></i>'
fb.addEventListener('click', () => {
if (fbx.classList.contains('open')) {
fbx.classList.remove('open')
fb.innerHTML = '<i class="la la-search"></i>';
} else {
fbx.classList.add('open')
fb.innerHTML = '<i class="la la-remove"></i>';
}
})
})
function filterExpObjects() {
let expId = '<?= $_GET['expId'] ?? '' ?>';
let p = '<?= $_GET['p'] ?? '1' ?>';
let filter_object_ref_num = document.querySelector('#filter_object_ref_num')
let filter_object_name = document.querySelector('#filter_object_name')
let filters = [];
if (filter_object_name.value !== '')
filters.push(`name=${filter_object_name.value}`)
if (filter_object_ref_num.value !== '')
filters.push(`ref_num=${filter_object_ref_num.value}`)
let q = ''
if(filters.length > 0) {
q = `&${filters.join('&')}`
}
window.location.href = `?expId=${expId}&p=${p}${q}`
}
function clearFilterExpObjects() {
let expId = '<?= $_GET['expId'] ?? '' ?>';
window.location.href = `?expId=${expId}`
}
</script>
@@ -0,0 +1,128 @@
<?php
use app\models\Campaigns;
use app\models\History;
use app\models\register\Partner;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
TableWidget::widget([
'filter' => [
[
'event_dates' => ['Дата', 'c2 fDatepicker'],
'title' => ['Заглавие на кампанията', 'c4'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
'is_active' => ['Публикувана', 'c1', [1 => 'да', 'null' => 'не']]
],
],
'top' => [
'title' => 'Кампании',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'actions' => [
'new' => 'Нова кампания',
'edit' => 'Редакция на кампания',
'delete' => 'Изтриване на кампания'
],
'th' => [
'№' => 'c1 text-right',
'Заглавие' => '',
'Дати на кампанията' => '',
'Партньор' => 'c4',
'Тематични зони' => 'c0 ct',
'История' => 'c0 ct',
'За публикуване' => 'c0 ct',
'Публикуване' => 'c0 ct',
],
'data' => Campaigns::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Campaigns $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
},
function (Campaigns $model) {
$event_dates = '';
foreach (explode(',', $model->event_dates) as $d) {
$event_dates .= '<div class="badge-dark right3">' . date('d.m.Y', strtotime($d)) . '</div>';
}
return '<div class="flex-wrap">' . $event_dates . '</div>';
},
function (Campaigns $model) {
if ($model->partner)
return $model->partner->name;
},
function (Campaigns $model) {
return '<i data-article-key="'.$model->article_key.'" class="la la-stream positionButton"></i>';
},
function (Campaigns $model) {
return '<i data-table="campaigns" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (Campaigns $model) {
return $model->is_for_publish ? '<span data-published="Пуликувана" data-unpublished="да" id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">'. ((!$model->is_active) ? 'да' : 'Публикувана').'</span>' : 'не';
},
function (Campaigns $model) {
return $model->statusSwitch('is_active', null, ['Кампанията е публикувана на сайта', 'Кампанията е свалена от сайта']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова кампания',
'title_edit' => 'Редакция на кампания',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/campaigns' => 'Кампании'
],
],
'tabs' => [
'main' => '<i class="la la-database"></i> Основни данни',
'ts_en' => '<i class="lg lg-en"></i> Превод английски'
],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/campaigns_w",
'model' => Campaigns::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'event_dates'}))
return ["event_dates" => 'Моля, въведете дати на кампанията'];
if (empty($p->{"title"}))
return ["title" => 'Моля, въведете заглавие на кампанията'];
if (empty($p->{"partner_id"}))
return ["partner_id" => 'Моля, изберете организация'];
if (empty($p->{"text_short"}))
return ["text_short" => 'Моля, въведете кратък текст на кампанията'];
if (empty($p->{"text"}))
return ["text" => 'Моля, въведете пълен текст на кампанията'];
if (!empty($p->{"stream_url"})) {
if (empty($p->{"stream_access"}))
return ["stream_access" => 'Моля, изберете стрийминг достъп'];
}
}
if (Includes::inLocales($tab)) {
if (empty($p->{$tab . "_title"}))
return [$tab . "_title" => 'Моля, въведете заглавие на кампанията'];
if (empty($p->{$tab . "_text_short"}))
return [$tab . "_text_short" => 'Моля, въведете кратък текст на кампанията'];
if (empty($p->{$tab . "_text"}))
return [$tab . "_text" => 'Моля, въведете пълен текст на кампанията'];
}
return null;
},
'postService' => function ($p, Campaigns $model) {
$model->setPostDataToModel();
$model->save();
\app\models\Articles::updateArticle($model);
History::addNew($model->id, 'campaigns', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Кампанията е актуализирана успешно' : 'Кампанията е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,95 @@
<?php
use app\models\register\Partner;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
use app\models\register\Collections;
$tab = $_GET['tab'] ?? 'main';
$filter = Yii::$app->getFilterData('and');
$filter[0] = 'and';
$filter[] = ['=', 'deleted', 0];
$filter[] = ['=', 'active', 1];
$filter[] = ['=', 'published', 1];
TableWidget::widget([
'top' => [
'title' => 'Колекции',
'data' => [
'index/dashboard' => 'Начало'
]
],
'filter' => [
[
'name' => ['Заглавие на колекция', 'c4'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
'is_selected' => ['Избрани колекции', 'c1', [1 => 'да', 'null' => 'не']],
'private' => ['С абонамент', 'c1', [1 => 'да', 'null' => 'не']]
],
],
'actions' => [
//'new' => 'Нова категория',
//'edit' => 'Преглед на колекция',
// 'delete' => 'Изтриване на колекция'
],
'th' => [
'№' => 'c0 text-right',
'Колекция' => '',
'Изображение' => '',
'Партньор' => '',
'Добавена в избрани' => '',
'Достъп с абонамент' => '',
],
'data' => Collections::find()
->where(['or', ['=', 'is_payable', 0], ['IS', 'is_payable', null]])
->andWhere($filter)
->orderBy(['modified_on' => SORT_DESC])
->loop([
'id',
function (Collections $model) {
return '<a href="?o=w&id=' . $model->id . '">' . $model->name . '</a>';
},
function (Collections $model) {
if ($model->thumbnail && $model->thumbnail != "''")
return '<img src="' . Yii::$app->params['register'] . '/uploads/collections/' . $model->thumbnail . '" style="height: 200px">';
},
function (Collections $model) {
if ($model->partner)
return $model->partner->name;
},
function (Collections $model) {
return $model->statusSwitch('is_selected', null, ['Колекцията е добавена в избрани', 'Колекцията е махната от избрани']);
},
function (Collections $model) {
return $model->statusSwitch('private', null, ['Колекцията е само за лица с платен абонамент', 'Колекцията е за всички']);
}
], $_GET['p'] ?? 1, 50)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова колекция',
'title_edit' => 'Преглед на колекция',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions/' => 'Уебпортал',
'web-portal/collections/' => 'Колекции'
],
],
'tabs' => [
//'main' => '<i class="la la-database"></i> Основни данни',
//'ts_en' => '<i class="lg lg-en"></i> Превод английски'
],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/collections_register_w",
'model' => Collections::class,
'validation' => function ($p) use ($tab) {
},
'postService' => function ($p, Collections $model) {
}
]);
@@ -0,0 +1,11 @@
<div class="inner-content p10">
<div class="row c2">
<div class="top-title" style="color: var(--base-background);">Изберете вида на събитието</div>
</div>
<div class="row flex top15">
<?php foreach (\app\models\Events::eventTypes() as $type => $title): ?>
<a href="<?= Yii::$app->setQueryString(['type' => $type]) ?>"
class="btn btn-default right5"><?= $title ?></a>
<?php endforeach; ?>
</div>
</div>
@@ -0,0 +1,140 @@
<?php
use app\models\History;
use app\models\register\CollectionsObjects;
use app\models\RegisterObjects;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
if (!empty($_GET['id'])) {
//$tabs['nomenclature'] = '<i class="la la-clipboard-list"></i> Номенклатури';
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
//$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
}
$condition = Yii::$app->getFilterData('or', ['identifier']);
$identifier = null;
if (!empty($_GET['q'])) {
foreach (explode('|', $_GET['q']) as $id) {
$filter = explode(':', $id);
if ($filter[0] == 'identifier' && !empty($filter[1])) {
$identifier = $filter[1];
break;
}
}
}
$data = RegisterObjects::find();
$data->where(['lib_type' => 2]);
if ($identifier) {
$data->innerJoinWith('library');
$data->andWhere([
'or',
['LIKE', 'lib_identifier_isbn_print', $identifier],
['LIKE', 'lib_identifier_isbn_online', $identifier],
['LIKE', 'lib_identifier_issn_print', $identifier],
['LIKE', 'lib_identifier_issn_online', $identifier],
['LIKE', 'lib_identifier_doi', $identifier],
['LIKE', 'lib_identifier_ismn', $identifier],
['LIKE', 'lib_identifier_isan', $identifier],
]);
}
$data->andWhere($condition)
->orderBy(['date_updated' => SORT_DESC]);
TableWidget::widget([
'filter' => [
[
'identifier' => ['Идентификатор', 'c2'],
'name' => ['Наименование', 'c3'],
'ref_num' => ['Реф.№', 'c1'],
'partner_id' => ['Партньор', 'c3', \app\models\register\Partner::partnerList()]
]
],
//'advanced_filter' => $this->render('_advanced_filters/object'),
'top' => [
'title' => 'Е-библиотека',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
]
],
'actions' => [
'edit' => 'Преглед на публикация',
//'delete' => 'Изтриване'
],
'th' => [
'ID' => 'c05 text-right',
'Реф. №' => 'c05 text-right',
'Наименование' => 'c2 ct',
'Изображение' => 'ct c1',
'Партньор' => 'c2 ct',
'Дата на добавяне' => 'ct',
'Дата на последна актуализация' => 'ct',
'Публикувана' => '',
],
'data' => $data->loop([
'id',
'ref_num',
function (RegisterObjects $model) {
if ($model->name)
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (RegisterObjects $model) {
if ($model->mainImgFile) {
return '<img src="' . $model->mainImgFile . '" style="height: 130px">';
}
},
function (RegisterObjects $model) {
if ($model->partner)
return $model->partner->name;
},
function (RegisterObjects $model) {
//date published
if ($model->date_added)
return date('d.m.Y H:i', strtotime($model->date_added));
},
function (RegisterObjects $model) {
//date published
if ($model->date_updated)
return date('d.m.Y H:i', strtotime($model->date_updated));
},
function (RegisterObjects $model) {
//return $model->is_active ? 'да': ''
return $model->statusSwitch('is_active', null, ['Публикацията е публикувана на сайта', 'Публикацията е свалена от сайта']);
},
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова публикация',
'title_edit' => 'Преглед на публикация',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
'web-portal/e-library' => 'Е-библиотека'
],
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) ? "web-portal/tabs/main/e_library_w" : "web-portal/tabs/" . Includes::tab($tab) . "/e_library_w",
'model' => RegisterObjects::class,
'validation' => function ($p) use ($tab) {
},
'postService' => function ($p, RegisterObjects $model) use ($tab) {
}
]);
@@ -0,0 +1,208 @@
<?php
use app\models\Events;
use app\models\History;
use app\models\Partner;
use app\models\PriceObject;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$model = Events::getModel();
$typeTitle = '';
//exit;
$tab = $_GET['tab'] ?? 'main';
if (!empty($_GET['type'])) {
if ($_GET['type'] == 'booking')
$tabs['booking'] = '<i class="la la-cog"></i> Резервация';
if ($_GET['type'] == 'online')
$tabs['online'] = '<i class="la la-cog"></i> Стрийминг';
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
$typeTitle = Events::eventTypes($_GET['type']);
$typeTitle = $typeTitle ? " [ $typeTitle ]" : "";
}
if (!empty($_GET['id'])) {
if ($model->type == 'online')
$tabs['online'] = '<i class="la la-cog"></i> Стрийминг';
if ($model->type == 'booking')
$tabs['booking'] = '<i class="la la-cog"></i> Резервация';
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
$typeTitle = Events::eventTypes($model->type);
$typeTitle = $typeTitle ? " [ $typeTitle ]" : "";
}
TableWidget::widget([
'filter' => [
[
'type' => ['Вид събитие', 'c3', Events::eventTypes()],
'event_dates' => ['Дата', 'c2 fDatepicker'],
'title' => ['Заглавие на събитието', 'c4'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
'is_active' => ['Публикувано', 'c1', [1 => 'да', 'null' => 'не']]
],
],
'top' => [
'title' => 'Събития',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
]
],
'actions' => [
'new' => 'Ново събитие',
'edit' => 'Редакция на събитие',
'delete' => 'Изтриване на събитие'
],
'th' => [
'№' => 'c1 text-right',
'Заглавие' => 'c3',
'Вид събитие' => '',
'Достъп' => 'c0 ct',
'Дати на събитието' => 'c4',
'Партньор' => 'c3',
'Тематични зони' => 'c0 ct',
'История' => 'c0 ct',
'За публикуване' => 'c0 ct',
'Публикуване' => 'c0 ct'
],
'data' => Events::find()->where(Yii::$app->getFilterData('or'))->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Events $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
},
function (Events $model) {
return str_replace('събитие', '', Events::eventTypes($model->type));
},
function (Events $model) {
$access = [1 => 'частен достъп', 2 => 'свободно'];
switch ($model->type) {
case 'online':
return !empty($access[$model->stream_access]) ? $access[$model->stream_access] : 'не определен';
case 'booking':
return 'с резервация';
case 'simple':
return 'свободно';
}
},
function (Events $model) {
$event_dates = '';
foreach (explode(',', $model->event_dates) as $d) {
$event_dates .= '<div class="badge-dark right3">' . date('d.m.Y', strtotime($d)) . '</div>';
}
return '<div class="flex-wrap">' . $event_dates . '</div>';
},
function (Events $model) {
if ($model->partner)
return $model->partner->name;
},
function (Events $model) {
return '<i data-article-key="'.$model->article_key.'" class="la la-stream positionButton"></i>';
},
function (Events $model) {
return '<i data-table="events" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (Events $model) {
return $model->is_for_publish ? '<span data-published="Пуликувано" data-unpublished="да" id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">'. ((!$model->is_active) ? 'да' : 'Публикувано').'</span>' : 'не';
},
function (Events $model) {
return $model->statusSwitch('is_active', null, ['Събитието е публикувано на сайта', 'Събитието е свалено от сайта']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Ново събитие' . $typeTitle,
'title_edit' => 'Редакция на събитие' . $typeTitle,
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
'web-portal/events' => 'Събития'
],
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) && empty($_GET['type']) ? "web-portal/default/events_w" : "web-portal/tabs/" . Includes::tab($tab) . "/events_w",
'model' => Events::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'event_dates'}))
return ["event_dates" => 'Моля, въведете дати на събитието'];
if (empty($p->{"title"}))
return ["title" => 'Моля, въведете заглавие на събитието'];
if (empty($p->{"partner_id"}))
return ["partner_id" => 'Моля, изберете организация'];
if (empty($p->{"text_short"}))
return ["text_short" => 'Моля, въведете кратък текст на събитието'];
if (empty($p->{"text"}))
return ["text" => 'Моля, въведете пълен текст на събитието'];
} else if (Includes::inLocales($tab)) {
if (empty($p->{$tab . "_title"}))
return [$tab . "_title" => 'Моля, въведете заглавие на събитието'];
if (empty($p->{$tab . "_text_short"}))
return [$tab . "_text_short" => 'Моля, въведете кратък текст на събитието'];
if (empty($p->{$tab . "_text"}))
return [$tab . "_text" => 'Моля, въведете пълен текст на събитието'];
} else if ($tab == 'booking') {
if (empty($p->{'daily_open_time'}))
return ['daily_open_time' => 'Моля, попълнете вярно времето за дневно посещение'];
if (empty($p->{'max_visitors'}))
return ['max_visitors' => 'Моля, попълнете максимален брой посетители за деня'];
} else if ($tab == 'online') {
if (empty($p->{'daily_open_time'}))
return ['daily_open_time' => 'Моля, изберете време, в което стийминга ще бъде излъчен'];
if (empty($p->{"stream_url"}))
return ["stream_url" => 'Моля, попълнете стрийминг линк'];
if ($p->{"stream_access"} == 1 && $p->{"stream_purchase_type"} == 'individual_price' && empty($p->{"stream_price"}))
return ['stream_price' => 'Моля, попълнете индивидуална цена'];
}
return null;
},
'postService' => function ($p, Events $model) {
$model->setPostDataToModel();
if (!empty($p->{'stream_access'})) {
if ($p->{'stream_access'} == 2) {
$model->stream_purchase_type = null;
$model->stream_price = null;
} else {
if ($model->stream_purchase_type == 'subscription') {
$model->stream_price = null;
}
}
}
$model->setFirstLast();
$model->save();
if ($model->type == 'booking') {
if(!empty($p->{'price_object'})) {
foreach ($p->{'price_object'} as $key => $object) {
$keyArr = explode('_', $key);
$priceObject = $keyArr[0] == 'id' ? PriceObject::findOne($keyArr[1]) : new PriceObject();
$priceObject->text_bg = $object['text_bg'];
$priceObject->text_en = $object['text_en'];
$priceObject->price = $object['price'];
$priceObject->event_id = $model->id;
$priceObject->save();
}
}
}
\app\models\Articles::updateArticle($model);
History::addNew($model->id, 'events', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Събитието е актуализирано успешно' : 'Събитието е създадено успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,72 @@
<?php
use app\models\Expositions;
use app\models\ExpositionsCategories;
use app\models\History;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$model = ExpositionsCategories::getModel();
$tab = $_GET['tab'] ?? 'main';
$tabs = [
];
TableWidget::widget([
'top' => [
'title' => 'Експозиции категории',
'data' => [
'index/dashboard' => 'Начало'
]
],
'actions' => [
'new' => 'Нова категория',
'edit' => 'Редакция на категория',
'delete' => 'Изтриване на категори'
],
'th' => [
'№' => 'c0 text-right',
'Наименование на категория (bg)' => '',
'Наименование на категория (en)' => '',
],
'data' => ExpositionsCategories::find()->where([])->orderBy(['id' => SORT_ASC])->loop([
'id',
function (ExpositionsCategories $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
'name_en'
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова колекция',
'title_edit' => 'Редакция на експозиция',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Експозиции на обекти'
],
],
'tabs' => $tabs ?? [],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/expositions_categories_w",
'model' => ExpositionsCategories::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{'name'}))
return ["name" => 'Моля, въведете име на категорията'];
if (empty($p->{'name_en'}))
return ["name_en" => 'Моля, въведете име на категорията на английски'];
}
return null;
},
'postService' => function ($p, ExpositionsCategories $model) {
$model->setPostDataToModel();
$model->save();
History::addNew($model->id, 'expositions-categories', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Категорията експозиция е актуализирана успешно' : 'Категорията експозиция е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,45 @@
<?php
/**
* @var $this \yii\web\View
*/
use app\models\Expositions;
$model = Expositions::getModel();
$tab = $_GET['tab'] ?? 'main';
$tabs = [
'main' => '<i class="la la-database"></i> Основни данни',
'ts_en' => '<i class="lg lg-en"></i> Превод английски',
'objects' => '<i class="la la-object-group"></i> Обекти',
];
$listtabs = [
'list' => '<i class="la la-navicon"></i> Списък с експозиции',
'categories' => '<i class="la la-navicon"></i> Категории',
'tags' => '<i class="la la-navicon"></i> Тагове',
];
$_GET['listtab'] = $_GET['listtab'] ?? 'list';
switch ($_GET['listtab']) {
case 'list':
echo $this->render('_expositions_list', ['model' => $model, 'tab' => $tab, 'tabs' => $tabs, 'listtabs' => $listtabs]);
break;
case 'categories':
echo $this->render('_expositions_categories', ['model' => $model, 'tab' => $tab, 'tabs' => $tabs, 'listtabs' => $listtabs]);
break;
case 'tags':
echo $this->render('_expositions_tags', ['model' => $model, 'tab' => $tab, 'tabs' => $tabs, 'listtabs' => $listtabs]);
}
?>
<?php if (empty($model->id)): ?>
<style>
#tab_objects {
opacity: 0.5;
pointer-events: none;
}
</style>
<?php endif; ?>
@@ -0,0 +1,75 @@
<?php
use app\models\Navigation;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
$_GET['listtab'] = $_GET['listtab'] ?? 'main';
TableWidget::widget([
'top' => [
'title' => 'Навигация',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'actions' => [
'new' => 'Нов бутон',
'edit' => 'Редакция на бутон',
'delete' => 'Изтриване на бутон'
],
'th' => [
'№' => 'c1 text-right',
'Заглавие' => '',
'Текст' => 'c4'
],
'model' => Navigation::class,
'data' => Navigation::find()
->where(['menu_type' => $_GET['listtab']])->orderBy(['order_index' => SORT_ASC])->loop([
'id',
function(Navigation $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
'relation',
'order_index',
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов слайд',
'title_edit' => 'Редакция на слайд',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/home-slider' => 'Слайдер начална страница'
],
],
'writeView' => "web-portal/tabs/main/navigation_w",
'model' => Navigation::class,
'validation' => function ($p) {
if (empty($p->{"title"}))
return ["title" => 'Моля, въведете заглавие на слайда'];
if (empty($p->{"ts_en_title"}))
return ["ts_en_title" => 'Моля, въведете заглавие на слайда'];
return null;
},
'postService' => function ($p, Navigation $model) {
$model->setPostDataToModel();
if(empty($_GET['id'])) {
$nextIndex = 0;
$last = Navigation::find()->where(['menu_type' => $p->menu_type])->orderBy(['order_index' => SORT_DESC])->one();
if($last) {
$nextIndex = $last->order_index + 1;
}
$model->order_index = $nextIndex;
}
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Навигацията е актуализирана успешно' : 'Навигацията е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,63 @@
<?php
Yii::$app->controller->pageTitle = 'Връзки';
use app\models\CmsRights;
use app\models\JoinToUs;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
TableWidget::widget([
'filter' => [
['name' => ['Наименование', 'c3']]
],
'top' => [
'title' => 'Права',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители'
]
],
'actions' => [
'new' => 'Ново право',
'edit' => 'Редакция на право',
//'delete' => 'Изтриване на право'
],
'th' => [
'№' => 'c1 text-right',
'Наименование на потребителското правото' => '',
'Активен' => ''
],
'data' => \app\models\JoinToUs::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
'id',
'name',
function(JoinToUs $model) {
return $model->statusSwitch('is_active', null, ['Записа е активиран', 'Записа е деактивиран']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Ново право',
'title_edit' => 'Редакция на връзка',
'data' => [
'index/dashboard' => 'Начало',
'user/admin' => 'Потребители',
'user/rights' => 'Права'
]
],
'writeView' => ' web-/rights_w',
'model' => CmsRights::class,
'validation' => function ($p) {
if (empty($p->{'name'}))
return ['name' => 'Моля, въведете наименование на връзката'];
//if (CmsRights::recordExists('name', $p->{'name'}))
// return ['name' => 'Това име вече е въведено, моля използвайте друго наименование'];
},
'postService' => function ($p, CmsRights $model) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Записът е актуализиран успешно' : 'Записът е създадено успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,119 @@
<?php
use app\models\Navigation;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
$_GET['listtab'] = $_GET['listtab'] ?? 'main';
$listtabs = [
'main' => '<i class="la la-navicon"></i> Основна навигация',
//'header_hidden' => '<i class="la la-bars"></i> Скрита навигация хедър',
'footer' => '<i class="la la-navicon"></i> Навигация футър 1',
'footer_2' => '<i class="la la-navicon"></i> Навигация футър 2',
'footer_3' => '<i class="la la-navicon"></i> Навигация футър 3'
];
TableWidget::widget([
'top' => [
'title' => 'Навигация',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'listTabs' => $listtabs,
'actions' => [
'new' => 'Нов бутон',
'edit' => 'Редакция на бутон',
'delete' => 'Изтриване на бутон'
],
'th' => [
'№' => 'c1 text-right',
'Име' => '',
'Връзка' => 'c4',
'Във външни връзки на начална стр.' => 'c1 ct',
'В скрита навигация' => 'c1 ct',
'В страница на партньор' => 'c1 ct',
'Активен' => 'c1 ct',
],
'model' => Navigation::class,
'data' => Navigation::find()
->where(['menu_type' => $_GET['listtab']])->orderBy(['order_index' => SORT_ASC])->loop([
'id',
function (Navigation $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (Navigation $model) {
if ($model->page_id)
return '<a target="_blank" href="' . Yii::$app->goTo('web-portal/pages') . '?o=w&id=' . $model->page_id . '">' . $model->page->name . '</a>';
return '<a target="_blank" href="' . $model->url . '">' . $model->url . '</a>';
},
function (Navigation $model) {
return $model->statusSwitch('home_conn');
},
function (Navigation $model) {
return $model->statusSwitch('in_submenu');
},
function (Navigation $model) {
return $model->statusSwitch('partner_page', null, ['Връзката е добавена в страницата на партньора', 'Връзката е премахната от страницата на партньора']);
},
function (Navigation $model) {
return $model->statusSwitch('is_active');
},
'order_index',
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов бутон - ' . mb_strtolower(strip_tags($listtabs[$_GET['listtab']])),
'title_edit' => 'Редакция на бутон - ' . mb_strtolower(strip_tags($listtabs[$_GET['listtab']])),
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/navigation' => 'Навигация'
],
],
'writeView' => "web-portal/tabs/main/navigation_w",
'model' => Navigation::class,
'validation' => function ($p) {
if (empty($p->{"name"}))
return ["name" => 'Моля, въведете име на бутона'];
if (empty($p->{"ts_en_name"}))
return ["ts_en_name" => 'Моля, въведете име на бутона'];
if (empty($p->{'relation_type'}))
return ["relation_type" => 'Моля, изберете връзка'];
if ($p->{'relation_type'} == 'inner_page' && empty($p->{'page_id'}))
return ["page_id" => 'Моля, изберете вътрешна страницата'];
if ($p->{'relation_type'} == 'outer_page' && empty($p->{'url'}))
return ["url" => 'Моля, въведете url адрес'];
if ($p->{'relation_type'} == 'outer_page' && !empty($p->{'url'})) {
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $p->{'url'}))
return ["url" => 'Моля, въведете валиден url адрес'];
}
return null;
},
'postService' => function ($p, Navigation $model) {
$model->setPostDataToModel();
if ($p->{'relation_type'} == 'inner_page')
$model->url = NULL;
if ($p->{'relation_type'} == 'outer_page')
$model->page_id = NULL;
if (empty($_GET['id'])) {
$nextIndex = 0;
$last = Navigation::find()->where(['menu_type' => $p->menu_type])->orderBy(['order_index' => SORT_DESC])->one();
if ($last) {
$nextIndex = $last->order_index + 1;
}
$model->order_index = $nextIndex;
$model->is_active = 1;
}
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Навигацията е актуализирана успешно' : 'Навигацията е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,113 @@
<?php
use app\models\History;
use app\models\News;
use app\models\register\Partner;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
TableWidget::widget([
'filter' => [
[
'title' => ['Заглавие на новина', 'c4'],
'partner_id' => ['Организация', 'c3', Partner::partnerList()],
'is_for_publish' => ['За публикувне', 'c1', [1 => 'да', 'null' => 'не']],
'is_active' => ['Публикувана', 'c1', [1 => 'да', 'null' => 'не']]
],
],
'top' => [
'title' => 'Новини',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'actions' => [
'new' => 'Нова новина',
'edit' => 'Редакция на новина',
'delete' => 'Изтриване на новина'
],
'th' => [
'№' => 'c1 text-right',
'Заглавие' => '',
'Партньор' => 'c4',
'Тематични зони' => 'c0 ct',
'История' => 'c0 ct',
'За публикуване' => 'c0 ct',
'Публикуване' => 'c0 ct'
],
'data' => News::find()->where(Yii::$app->getFilterData('and'))->orderBy(['id' => SORT_DESC])->loop([
'id',
function (News $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
},
function (News $model) {
if ($model->partner)
return $model->partner->name;
},
function (News $model) {
return '<i data-article-key="'.$model->article_key.'" class="la la-stream positionButton"></i>';
},
function (News $model) {
return '<i data-table="news" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (News $model) {
return $model->is_for_publish ? '<span data-published="Пуликувана" data-unpublished="да" id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">'. ((!$model->is_active) ? 'да' : 'Публикувана').'</span>' : 'не';
},
function (News $model) {
return $model->statusSwitch('is_active', null, ['Новината е публикувана на сайта', 'Новината е свалена от сайта']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова новина',
'title_edit' => 'Редакция на новина',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/news' => 'Новини'
],
],
'tabs' => [
'main' => '<i class="la la-database"></i> Основни данни',
'ts_en' => '<i class="lg lg-en"></i> Превод английски'
],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/news_w",
'model' => News::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{"partner_id"}))
return ["partner_id" => 'Моля, изберете организация'];
if (empty($p->{"title"}))
return ["title" => 'Моля, въведете заглавие на новината'];
if (empty($p->{"text_short"}))
return ["text_short" => 'Моля, въведете кратък текст на новината'];
if (empty($p->{"text"}))
return ["text" => 'Моля, въведете пълен текст на новината'];
}
if (Includes::inLocales($tab)) {
if (empty($p->{$tab . "_title"}))
return [$tab . "_title" => 'Моля, въведете заглавие на новината'];
if (empty($p->{$tab . "_text_short"}))
return [$tab . "_text_short" => 'Моля, въведете кратък текст на новината'];
if (empty($p->{$tab . "_text"}))
return [$tab . "_text" => 'Моля, въведете пълен текст на новината'];
}
return null;
},
'postService' => function ($p, News $model) {
$model->setPostDataToModel();
$model->save();
\app\models\Articles::updateArticle($model);
History::addNew($model->id, 'news', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Новината е актуализирана успешно' : 'Новината е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,170 @@
<?php
use app\models\History;
use app\models\register\CollectionsObjects;
use app\models\RegisterObjects;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
if (!empty($_GET['id'])) {
$tabs['nomenclature'] = '<i class="la la-clipboard-list"></i> Номенклатури';
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
}
$condition = Yii::$app->getFilterData('or', ['collection_id']);
$collection_id = Yii::$app->getFilterDataAsArray('collection_id');
if($collection_id) {
$collectionsObjects = CollectionsObjects::find()->select('object_id')->where(['collection_id' => $collection_id])->all();
$objectIds = [];
foreach ($collectionsObjects as $collectionsObject)
$objectIds[] = $collectionsObject->object_id;
$condition[] = ['IN', 'ref_num', $objectIds];
}
$data = RegisterObjects::find()
->where(['lib_type' => 1])
->andWhere($condition)
->orderBy(['date_updated' => SORT_DESC]);
TableWidget::widget([
'filter' => [
[
'name' => ['Наименование', 'c3'],
'ref_num' => ['Реф.№', 'c1'],
'partner_id' => ['Партньор', 'c3', \app\models\register\Partner::partnerList()],
'collection_id' => ['Колекция', 'c3', \app\models\register\Collections::getDropDownData()]
]
],
//'advanced_filter' => $this->render('_advanced_filters/object'),
'top' => [
'title' => 'Обекти',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
]
],
'actions' => [
'edit' => 'Преглед на обект',
//'delete' => 'Изтриване'
],
'th' => [
'ID' => 'c05 text-right',
'Реф. №' => 'c05 text-right',
'Наименование' => 'c2 ct',
'Населено място' => '',
'Изображение' => 'ct c1',
'Колекции' => '',
'Тагове' => '',
'Партньор' => 'c2 ct',
'Дата на добавяне' => 'ct',
'Дата на последна актуализация' => 'ct',
'Публикуван' => '',
],
'data' => $data->loop([
'id',
'ref_num',
function (RegisterObjects $model) {
if ($model->name)
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (RegisterObjects $model) {
if ($model->city)
return $model->city->place;
},
function (RegisterObjects $model) {
if ($model->mainImgFile) {
return '<img src="' . $model->mainImgFile . '" style="height: 130px">';
}
},
function (RegisterObjects $model) {
return $model->getCollectionsListStr();
},
function (RegisterObjects $model) {
return $model->getTagsList();
},
function (RegisterObjects $model) {
if($model->partner)
return $model->partner->name;
},
function (RegisterObjects $model) {
//date published
if ($model->date_added)
return date('d.m.Y H:i', strtotime($model->date_added));
},
function (RegisterObjects $model) {
//date published
if ($model->date_updated)
return date('d.m.Y H:i', strtotime($model->date_updated));
},
function (RegisterObjects $model) {
//return $model->is_active ? 'да': ''
return $model->statusSwitch('is_active', null, ['Обекта е публикуван на сайта', 'Обекта е свален от сайта']);
},
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов обект',
'title_edit' => 'Преглед на обект',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
'web-portal/objects-register' => 'Обекти'
],
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) ? "web-portal/tabs/main/register_objects_w" : "web-portal/tabs/" . Includes::tab($tab) . "/register_objects_w",
'model' => RegisterObjects::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($_GET['id'])) {
//NEW OBJECT
if (empty($p->{'sc_id'}))
return ['sc_id' => 'Моля, изберете категория'];
if (empty($p->{'sc_id'}))
return ['ot_id' => 'Моля, изберете шаблон на обект'];
} else {
//UPDATE GENERAL DATA
if (empty($p->{'name'}))
return ['name' => 'Моля, въведете име на обекта'];
if (empty($p->{'annotation'}))
return ['annotation' => 'Моля, въведете анотация'];
if (empty($p->{'description'}))
return ['description' => 'Моля, въведете описание'];
}
} else if (Includes::inLocales($tab)) {
if (empty($p->{$tab . '_name'}))
return [$tab . '_name' => 'Моля, въведете име на обекта'];
if (empty($p->{$tab . '_annotation'}))
return [$tab . '_annotation' => 'Моля, въведете анотация'];
if (empty($p->{$tab . '_description'}))
return [$tab . '_description' => 'Моля, въведете описание'];
}
return null;
},
'postService' => function ($p, RegisterObjects $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
History::addNew($model->id, 'register_objects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
if (empty($_GET['media_key_update'])) {
Yii::$app->flash('success', isset($_GET['id']) ? 'Обекта е актуализиран успешно' : 'Обекта е създаден успешно');
$model->smartRedirect();
}
}
]);
@@ -0,0 +1,193 @@
<?php
use app\models\History;
use app\models\Objects;
use app\models\ObjectTemplate;
use app\models\register\Partner;
use app\services\api\NomenclatureService;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
/** @var Objects $model */
$model = Objects::getModel();
$tab = $_GET['tab'] ?? 'nomenclature';
$_GET['tab'] = $tab;
if (!empty($_GET['id'])) {
$tabs['nomenclature'] = '<i class="la la-clipboard-list"></i> Номенклатури';
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
}
TableWidget::widget([
'filter' => [
[
'objects.name' => ['Наименование', 'c3'],
'description' => ['Описание', 'c3'],
'annotation' => ['Анотация', 'c3'],
'partner_id' => ['Партньор', 'c3', Partner::partnerList()],
'heritage_type' => ['Вид наследсво', 'c3', ObjectTemplate::heritageTypesByCategory()],
'sc_id' => ['Категория', 'c3 category_search_box', NomenclatureService::categoryFilterSelect()],
]
],
'advanced_filter' => $this->render('_advanced_filters/object'),
'top' => [
'title' => 'Обекти',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
]
],
'actions' => [
'new' => 'Нов обект',
'edit' => 'Редакция на обект',
'delete' => 'Изтриване на обект'
],
'th' => [
'ID' => 'c05 text-right',
'Наименование' => 'c2',
'Изображение' => 'c1 ct',
'Категория' => '',
'Колекция' => '',
'Вид шаблон' => 'c1',
'Партньор' => '',
'Дата на добавяне' => 'ct',
'История' => 'ct',
'Активен' => '',
],
'data' => Objects::find()->andWhere(Yii::$app->getFilterData('or'))
->innerJoin('object_template', 'object_template.id = objects.ot_id')
->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Objects $model) {
if ($model->name)
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
function (Objects $model) {
if ($model->media_key) {
$src = $model->getSrcOfSingleImage('title_object_image', 'thumb');
return '<img style="width: 100px" src="' . $src . '">';
}
},
function (Objects $model) {
return $model->subCategory->name;
},
function (Objects $model) {
if ($model->collections)
return $model->collectionConcatList;
},
function (Objects $model) {
if ($model->objectTemplate)
return $model->objectTemplate->name;
},
function (Objects $model) {
if ($model->partner)
return $model->partner->name;
},
function (Objects $model) {
if ($model->history)
return $model->history->date;
},
function (Objects $model) {
return '<i data-table="objects" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (Objects $model) {
return $model->statusSwitch('is_active', null, ['Обекта е видим на сайта', 'Обекта е свален от сайта']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов обект',
'title_edit' => 'Редакция на обект',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уебпортал',
'web-portal/objects' => 'Обекти'
],
],
'tabs' => $tabs ?? [],
'writeView' => empty($_GET['id']) ? "web-portal/tabs/nomenclature/objects_w" : "web-portal/tabs/" . Includes::tab($tab) . "/objects_w",
'model' => Objects::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($_GET['id'])) {
//NEW OBJECT
if (empty($p->{'sc_id'}))
return ['sc_id' => 'Моля, изберете категория'];
if (empty($p->{'sc_id'}))
return ['ot_id' => 'Моля, изберете шаблон на обект'];
} else {
//UPDATE GENERAL DATA
if (empty($p->{'name'}))
return ['name' => 'Моля, въведете име на обекта'];
if (empty($p->{'annotation'}))
return ['annotation' => 'Моля, въведете анотация'];
if (empty($p->{'description'}))
return ['description' => 'Моля, въведете описание'];
}
} else if (Includes::inLocales($tab)) {
if (empty($p->{$tab . '_name'}))
return [$tab . '_name' => 'Моля, въведете име на обекта'];
if (empty($p->{$tab . '_annotation'}))
return [$tab . '_annotation' => 'Моля, въведете анотация'];
if (empty($p->{$tab . '_description'}))
return [$tab . '_description' => 'Моля, въведете описание'];
}
return null;
},
'postService' => function ($p, Objects $model) use ($tab) {
$model->setPostDataToModel();
$model->save();
if ($tab == 'nomenclature') {
$model->setObjectFields($p);
$model->setCollections($p);
}
History::addNew($model->id, 'objects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
if (empty($_GET['media_key_update'])) {
Yii::$app->flash('success', isset($_GET['id']) ? 'Обекта е актуализиран успешно' : 'Обекта е създаден успешно');
$model->smartRedirect();
}
}
]);
?>
<script src="/_public/assets/js/search-box.js"></script>
<script>
new SearchBox('#collections')
const category_search_box = new SearchBox('.category_search_box select')
const objet_type_select = new SearchBox('.objet_type_select')
const
categorySearchBox = new SearchBox('#category_search_box'),
objectTypeSearchBox = new SearchBox('#object_type_search_box')
if (categorySearchBox && objectTypeSearchBox) {
objectTypeSearchBox.updateFromObject({
searchBox: categorySearchBox,
url: '/api/object-templates/',
queryId: 'sc_id',
data: {id: 'id', name: 'name'}
})
}
if (category_search_box && objet_type_select) {
objet_type_select.updateFromObject({
searchBox: category_search_box,
url: '/api/object-templates/',
queryId: 'sc_id',
data: {id: 'id', name: 'name'}
})
}
all('.advanced-select', e => {
new SearchBox(e)
})
</script>
@@ -0,0 +1,100 @@
<?php
use app\models\Pages;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
$tabs['media'] = '<i class="la la-file-movie-o"></i> Медия файлове';
TableWidget::widget([
'top' => [
'title' => 'Страници',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'actions' => [
'new' => 'Нова страница',
'edit' => 'Редакция на страница',
'delete' => 'Изтриване на страница'
],
'th' => [
'№' => 'c1 text-right',
'Заглавие на страница' => '',
],
'model' => Pages::class,
'data' => Pages::find()->loop([
'id',
function (Pages $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->name . '</a>';
},
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова страница',
'title_edit' => 'Редакция на страница',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/navigation' => 'Страници'
],
],
'tabs' => $tabs ?? [],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/pages_w" ,
'model' => Pages::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{"name"}))
return ["name" => 'Моля, въведете заглавие на страницата'];
if (empty($p->{"name_en"}))
return ["name_en" => 'Моля, въведете заглавие на страницата'];
if (Pages::exists(['slug' => Formatter::cyrillicTrans(ltrim(rtrim($p->{"name"})))]))
return ["name" => 'Заглавието вече съществува'];
if (Pages::exists(['slug_en' => Formatter::cyrillicTrans(ltrim(rtrim($p->{"name_en"})))]))
return ["name_en" => 'Заглавието вече съществува'];
} else if (Includes::inLocales($tab)) {
}
return null;
},
'postService' => function ($p, Pages $model) use ($tab) {
$model->setPostDataToModel();
if ($tab == 'main') {
if ($p->{'name'}) {
$name = ltrim($p->{'name'}, ' ');
$name = rtrim($name, ' ');
$model->name = $name;
$model->slug = Formatter::cyrillicTrans($name);
}
if ($p->{'name_en'}) {
$name_en = ltrim($p->{'name_en'}, ' ');
$name_en = rtrim($name_en, ' ');
$model->name_en = $name_en;
$model->slug_en = Formatter::cyrillicTrans($name_en);
}
}
$model->save();
if(!empty($p->contacts) && $model->contact) {
$contactModel = \app\models\Contacts::findOne($model->contact->id);
foreach ($p->contacts as $contact => $value) {
$contactModel->{$contact} = $value;
}
$contactModel->save();
}
if (empty($_GET['media_key_update'])) {
Yii::$app->flash('success', isset($_GET['id']) ? 'Страницата е актуализирана успешно' : 'Страницата е създадена успешно');
$model->smartRedirect();
}
}
]);
@@ -0,0 +1,80 @@
<?php
use app\models\Positions;
use app\services\Auth;
use app\widgets\FormWidget;
use app\widgets\TableWidget;
TableWidget::widget([
'top' => [
'title' => 'Тематични зони',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'actions' => [
'new' => 'Нова група',
'edit' => 'Редакция на група',
//'delete' => 'Изтриване на група'
],
'th' => [
'№' => 'c1 text-right',
'Тематична зона' => '',
'Брой позиции' => 'c4'
],
'data' => Positions::find()->where(['IS', 'group_id', null])->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Positions $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->group_name . '</a>';
},
function (Positions $model) {
return $model->positionsCount;
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова група',
'title_edit' => 'Редакция на тематична зона',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/positions' => 'Тематични зони'
],
],
'writeView' => "web-portal/tabs/main/positions_group_w",
'model' => Positions::class,
'validation' => function ($p) {
if (empty($p->{"group_name"}))
return ["group_name" => 'Моля, въведете име на групата'];
if (empty($p->{"positions_count"}) && $p->{'positions_count_ready'} == 0)
return ["positions_count" => 'Моля, въведете брой позиции'];
return null;
},
'postService' => function ($p, Positions $model) {
$model->setPostDataToModel();
$model->save();
if(!empty($p->positions_count)) {
for ($i = 0; $i < $p->positions_count; $i++) {
$position = new Positions();
$position->group_id = $model->id;
$position->order_index = $i;
$position->save();
}
}
if(!empty($p->enter_class_name)) {
foreach ($p->enter_class_name as $id => $class_name) {
$positionToUpdate = Positions::findOne($id);
if($positionToUpdate) {
$positionToUpdate->class_name = $class_name;
$positionToUpdate->save();
}
}
}
Yii::$app->flash('success', isset($_GET['id']) ? 'Групата на позициите е актуализирана успешно' : 'Групата на позициите е създадена успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,115 @@
<?php
use app\models\Projects;
use app\models\History;
use app\models\ProjectsPartner;
use app\services\Auth;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
if (!empty($_GET['id'])) {
$tabs['main'] = '<i class="la la-database"></i> Основни данни';
$tabs['ts_en'] = '<i class="lg lg-en"></i> Превод английски';
$tabs['docs'] = '<i class="la la-file"></i> Документи';
$tabs['media'] = '<i class="la la-images"></i> Галерия (снимки)';
}
TableWidget::widget([
'filter' => [
[
'period_date_start' => ['Начална дата', 'c2 fDatepicker'],
'title' => ['Заглавие на проекта', 'c4'],
'is_active' => ['Публикувана', 'c1', [1 => 'да', 'null' => 'не']]
],
],
'top' => [
'title' => 'Проекти',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'actions' => [
'new' => 'Нов проект',
'edit' => 'Редакция на проект',
'delete' => 'Изтриване на проект'
],
'th' => [
'№' => 'c1 text-right',
'Заглавие' => '',
'Период' => 'c2 ct',
'История' => 'c0 ct',
'Дата на публикуване' => 'c1 ct',
'За публикуване' => 'c0 ct',
'Публикуване' => 'c0 ct',
],
'data' => Projects::find()->where(Yii::$app->getFilterData())->orderBy(['id' => SORT_DESC])->loop([
'id',
function (Projects $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . $model->title . '</a>';
},
function (Projects $model) {
return $model->period;
},
function (Projects $model) {
return '<i data-table="projects" data-id="' . $model->id . '" class="la la-history historyButton"></i>';
},
function (Projects $model) {
return $model->formatDate($model->publish_date);
},
function (Projects $model) {
return $model->is_for_publish ? '<span id="blink_' . $model->id . '" class="' . (!$model->is_active ? 'blink-green' : '') . '">да</span>' : 'не';
},
function (Projects $model) {
return $model->statusSwitch('is_active', null, ['Проекта е публикуван на сайта', 'Проекта е свален от сайта']);
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нова проект',
'title_edit' => 'Редакция на проект',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/projects' => 'Проекти'
],
],
'tabs' => $tabs ?? [],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/projects_w",
'model' => Projects::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{"title"}))
return ["title" => 'Моля, въведете заглавие на проекта'];
if (empty($p->{"text"}))
return ["text" => 'Моля, въведете пълен текст на проекта'];
if(!empty($p->{'website'}) ) {
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i", $p->{'website'})) {
return ["website" => 'Моля, въведете валиден url адрес'];
}
}
}
if (Includes::inLocales($tab)) {
if (empty($p->{$tab . "_title"}))
return [$tab . "_title" => 'Моля, въведете заглавие на проекта'];
if (empty($p->{$tab . "_text"}))
return [$tab . "_text" => 'Моля, въведете пълен текст на проекта'];
}
return null;
},
'postService' => function ($p, Projects $model) {
$model->setPostDataToModel();
$model->save();
ProjectsPartner::updateRecords($_POST['partners'] ?? [], ['partner_id', 'project_id', $model->id]);
History::addNew($model->id, 'projects', Auth::userAdminGlobal()->getFullName() . ' - Глобален администратор', !empty($_GET['id']));
Yii::$app->flash('success', isset($_GET['id']) ? 'Проекта е актуализиран успешно' : 'Проекта е създаден успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,77 @@
<?php
use app\models\Pages;
use app\models\SeoManagement;
use app\services\Formatter;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$tab = $_GET['tab'] ?? 'main';
$_GET['tab'] = $tab;
$_GET['id'] = 1;
$_GET['o'] = 'w';
TableWidget::widget([
'top' => [
'title' => 'SEO управление',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'actions' => [
//'new' => 'Нов SEO запис',
//'edit' => 'Редакция на SEO запис',
//'delete' => 'Изтриване на SEO запис'
],
'th' => [
'№' => 'c1 text-right',
'Ключови думи' => '',
'Текст' => '',
'Страница' => '',
],
'model' => SeoManagement::class,
'data' => SeoManagement::find()->loop([
'id',
'key_words',
'text',
function (SeoManagement $model) {
if ($model->page) {
return $model->page->name;
} else {
return 'основни данни';
}
}
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов SEO запис',
'title_edit' => 'Редакция на SEO запис',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/navigation' => 'SEO управление'
],
],
'tabs' => [],
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/seo_w",
'model' => SeoManagement::class,
'validation' => function ($p) {
if(empty($p->{'page_seo'})) {
if(empty($p->{'page_id'})) {
return ["page_id" => 'Моля, изберете страница, за която искате да се отнасят данни'];
}
}
},
'postService' => function ($p, SeoManagement $model) {
$model->setPostDataToModel();
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Записа е актуализирана успешно' : 'Записа е създадена успешно');
$model->redirectTo('web-portal/seo');
}
]);
@@ -0,0 +1,102 @@
<?php
use app\models\Navigation;
use app\models\Slides;
use app\widgets\FormWidget;
use app\widgets\services\Includes;
use app\widgets\TableWidget;
$_GET['listtab'] = $_GET['listtab'] ?? 'home_page';
$listtabs = [
'home_page' => '<i class="la la-navicon"></i> Начална страница'
];
$tab = $_GET['tab'] ?? 'main';
$tabs = [
'main' => '<i class="la la-database"></i> Основни данни',
'ts_en' => '<i class="lg lg-en"></i> Превод английски'
];
TableWidget::widget([
'top' => [
'title' => 'Слайдер',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
]
],
'listTabs' => $listtabs,
'actions' => [
'new' => 'Нов бутон',
'edit' => 'Редакция на бутон',
'delete' => 'Изтриване на бутон'
],
'th' => [
'№' => 'c1 text-right',
'Заглавие' => '',
'Url адрес' => 'c4',
'Активен' => 'c1 ct'
],
'model' => Slides::class,
'data' => Slides::find()
->where(['type' => $_GET['listtab']])->orderBy(['order_index' => SORT_ASC])->loop([
'id',
function (Slides $model) {
return '<a href="' . Yii::$app->setQueryString(['o' => 'w', 'id' => $model->id]) . '">' . ($model->title ?? $model->ts_en_title) . '</a>';
},
'relation',
function (Slides $model) {
return $model->statusSwitch('is_active');
},
'order_index',
], $_GET['p'] ?? 1, 30)
]);
FormWidget::widget([
'top' => [
'title' => 'Нов слайд',
'title_edit' => 'Редакция на слайд',
'data' => [
'index/dashboard' => 'Начало',
'web-portal/expositions' => 'Уеб портал',
'web-portal/slider' => 'Слайдер начална страница'
],
],
'tabs' => $tabs,
'writeView' => "web-portal/tabs/" . Includes::tab($tab) . "/slider_w",
'model' => Slides::class,
'validation' => function ($p) use ($tab) {
if ($tab == 'main') {
if (empty($p->{"title"}))
return ["title" => 'Моля, въведете заглавие на слайда'];
if (empty($p->{"text"}))
return ["text" => 'Моля, въведете текст на слайда'];
}
if (Includes::inLocales($tab)) {
if (empty($p->{$tab . "_title"}))
return [$tab . "_title" => 'Моля, въведете заглавие на слайда'];
if (empty($p->{$tab . "_text"}))
return [$tab . "_text" => 'Моля, въведете текст на слайда'];
}
return null;
},
'postService' => function ($p, Slides $model) {
$model->setPostDataToModel();
if (empty($_GET['id'])) {
$nextIndex = 0;
$last = Slides::find()->where(['type' => $p->type])->orderBy(['order_index' => SORT_DESC])->one();
if ($last) {
$nextIndex = $last->order_index + 1;
}
$model->order_index = $nextIndex;
$model->is_active = 1;
}
$model->save();
Yii::$app->flash('success', isset($_GET['id']) ? 'Слайда е актуализиран успешно' : 'Слайда е създаден успешно');
$model->smartRedirect();
}
]);
@@ -0,0 +1,201 @@
<?php
use app\models\Events;
use app\models\PriceObject;
use app\widgets\services\Includes;
/**
* @var Events $model
* @var PriceObject $object
*/
?>
<div class="inner-content p10">
<?php if (empty($model->id)): ?>
<p style="color: darkorange; font-weight: bold">* Формата ще бъде активна след попълването на "Основни
данни"</p>
<?php endif; ?>
<form autocomplete="off" class="<?= empty($model->id) ? 'disabled' : '' ?>">
<div class="row" style="width: 250px">
<label class="require">Време за дневно посещение</label>
<input data-min-h="7" data-max-h="20" type="hidden" name="daily_open_time" id="daily_open_time"
value="<?= $model->daily_open_time ?>">
</div>
<div class="row c4 top15">
<label class="require">Максимален брой посетители за деня</label>
<input data-format="integer" name="max_visitors" style="width: 60px" value="<?= $model->max_visitors ?>">
</div>
<div class="row top15">
<label>Цени</label>
</div>
<div class="top-page-panel c9">
<div class="row c5">
<div onclick="addPrice(this)" data-id="<?= $model->id ?>"
class="btn-ib btn-default">
<i class="la la-plus-circle"></i> Добавяне на цена
</div>
<div id="bDelete" data-model="app\models\PriceObject" onclick="checkDelete(this)"
class="btn-ib btn-default ct disabled">
<i class="la la-trash-o"></i> Изтриване на цена <span id="delCount">(0)</span>
</div>
</div>
<div class="top15">
<table class="cms-table">
<thead>
<tr>
<th class="text-right c1">
<input id="checkAll" onclick="checkAllPositions(this)" title="Избери всички"
class="delete-checkbox <?= sizeof($model->price_objects) == 0 ? 'hide' : '' ?>" type="checkbox">
No
</th>
<th>Текст [bg]</th>
<th>Текст [en]</th>
<th style="width: 100px">Цена</th>
</tr>
</thead>
<tbody id="price_list">
<?php foreach ($model->price_objects as $i => $object): ?>
<tr>
<td class="text-right">
<input onclick="checkSingle(this)"
data-del="<?= $object->id ?>"
class="delete-checkbox"
type="checkbox"
style="top: calc(50% - 10px)">
<span><?= $i + 1 ?></span></td>
<td><input name="price_object[id_<?= $object->id ?>][text_bg]" value="<?= $object->text_bg ?>" type="text"></td>
<td><input name="price_object[id_<?= $object->id ?>][text_en]" value="<?= $object->text_en ?>" type="text"></td>
<td><input name="price_object[id_<?= $object->id ?>][price]" value="<?= $object->price ?>" type="text"
data-format="money"></td>
</tr>
<?php endforeach; ?>
</tbody>
<tr id="empty_row" class="<?= (sizeof($model->price_objects) > 0 ? 'hide' : '') ?>">
<td colspan="4" class="ct"
style="font-size: 14px; padding: 15px; color: var(--base-background-dark); pointer-events: none">
Няма добавени цени
</td>
</tr>
</table>
</div>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/events') ?>
</div>
</form>
</div>
<script>
const checkAll = one('#checkAll');
function addPrice(e) {
const price_list = one('#price_list');
const row = document.createElement('tr');
const count = all('#price_list tr').length
one('#empty_row').addClass('hide')
row.innerHTML = `
<td class="text-right">
<input onclick="checkSingle(this)"
data-del
class="delete-checkbox"
type="checkbox"
style="top: calc(50% - 10px)">
<span>${count + 1}</span></td>
<td><input name="price_object[c_${count + 1}][text_bg]" type="text"></td>
<td><input name="price_object[c_${count + 1}][text_en]" type="text"></td>
<td><input name="price_object[c_${count + 1}][price]" type="text" data-format="money"></td>
`;
price_list.appendChild(row);
dataFormat();
checkAll.removeClass('hide')
}
timeRange('#daily_open_time');
let sl = [];
function checkAllPositions(el) {
sl = [];
all('td [data-del]').forEach(e => {
e.checked = el.checked === true;
if (el.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
e.parentNode.parentNode.removeClass('checked');
}
})
updateActionButtons();
}
function checkSingle(e) {
if (e.checked) {
sl.push(e.dataset.del);
console.log(sl)
e.parentNode.parentNode.addClass('checked');
} else {
one('#checkAll').checked = false;
e.parentNode.parentNode.removeClass('checked');
const f = sl.indexOf(e.dataset.del);
sl.splice(f, 1);
}
updateActionButtons(e.dataset.del);
}
function updateActionButtons() {
const bDelete = one('#bDelete');
const delCount = one('#delCount');
const c = sl.length;
if (delCount)
delCount.innerText = '(' + c + ')';
if (c > 0) {
if (bDelete)
bDelete.removeClass('disabled');
} else {
if (bDelete)
bDelete.addClass('disabled');
}
}
function checkDelete(e) {
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
modal.confirm(msg, () => {
if(all('[data-del]').length === 0) {
const checkAll = one('#checkAll')
checkAll.checked = false;
checkAll.addClass('hide')
one('#empty_row').removeClass('hide')
}
all('[data-del]').forEach(e => {
if (e.checked)
e.parentNode.parentNode.remove();
});
all('[data-del]').forEach((e, i) => {
const number = e.parentNode.querySelector('span');
number.innerText = (i + 1).toString();
})
const ids = [];
sl.forEach(value => {
if(value) {
ids.push(value);
}
});
sl = [];
updateActionButtons();
if(ids.length > 0) {
request({
url: window.location.href.split('?')[0] + '?o=d',
post: {
ids: JSON.stringify(ids),
model: e.dataset.model
},
done: e => {
window.location.reload()
}
})
}
});
}
</script>
@@ -0,0 +1,15 @@
<?php
use app\models\Projects;
use app\widgets\DocumentWidget;
/**
* @var $model Projects
*/
$document_key = $model->getDocumentKey();
DocumentWidget::widget([
'document_key' => $document_key,
'model_class' => Projects::class,
'model' => $model
]);
@@ -0,0 +1,133 @@
<?php
use app\models\Campaigns;
use app\models\register\Partner;
use app\widgets\FileWidget;
use app\widgets\services\Includes;
/**
* @var Campaigns $model
*/
$media_key = $model->getMediaKey();
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c2">
<label class="require">Дати на кампанията</label>
<input type="hidden" name="event_dates" id="event_dates" value="<?= $model->event_dates ?>">
</div>
<div class="row c6 top15">
<label>Локация</label>
<input name="location" placeholder="Въведи локация на събитието" value="<?= $model->location ?>"/>
</div>
<div class="row c6 top15">
<label class="require">Заглавие</label>
<input name="title" placeholder="Въведи заглавие на събитието" value="<?= $model->title ?>"/>
</div>
<div class="row c6 top15">
<label class="require">Пртньор</label>
<select name="partner_id">
<option disabled selected>-- Избери организация --</option>
<?php foreach (Partner::partnerList() as $id => $name): ?>
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row top15" style="width: 350px">
<label>Заглавно изображение</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'title_campaigns_image',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне',
'edit' => 'Редакция',
'delete' => 'Премахване'
],
'single_file' => true,
'resolutions' => ['16:11', '16:9', '1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<?= $this->render('/shared/instruction_1') ?>
<div class="row c9 top15">
<label class="require">Кратък текст</label>
<textarea class="ckEditor" name="text_short"><?= $model->text_short ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Пълен текст</label>
<textarea class="ckEditor" name="text"><?= $model->text ?></textarea>
</div>
<div class="row c9 top15">
<label>Изображения в кампанията</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'campaigns_images',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображения',
'edit' => 'Редакция на изображение',
'delete' => 'Премахване на изображения'
],
'resolutions' => ['16:11', '16:9', '1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<div class="row c9 top15 flex">
<div class="c7 right10">
<label>Стрийминг линк</label>
<input onkeyup="updateLabelRequire(this, '#sta')" name="stream_url"
placeholder="Въведи линк на стрийминг"
value="<?= $model->stream_url ?>"/>
</div>
<div class="left10">
<label id="sta">Достъп</label>
<div class="flex top-page-panel"
style="height: 14px; border-radius: 3px; border-color: var(--base-background-dark)">
<?php foreach ([1 => 'Частен', 2 => 'Публичен'] as $v => $t): ?>
<label style="margin-top: -3px" class="right10 radio-error"><input
style="width: 14px; height: 14px;" type="radio"
name="stream_access" <?= $model->stream_access == $v ? 'checked' : '' ?>
value="<?= $v ?>"/> <?= $t ?>
</label>
<?php endforeach; ?>
</div>
</div>
</div>
<div class="row c3 top15">
<label class="require">Дата на публикуване</label>
<input type="hidden" name="publish_date" id="publish_date" value="<?= $model->getPublishDate() ?>">
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/campaigns') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<script src="/_public/plugins/air-datepicker/locales.js"></script>
<script src="/_public/plugins/air-datepicker/air-datepicker.js"></script>
<script>
new AirDatepicker('#event_dates', {
inline: true,
locale: locales.bg,
multipleDates: true,
multipleDatesSeparator: ',',
selectedDates: document.querySelector('#event_dates').value.split(',')
});
new AirDatepicker('#publish_date', {
inline: true,
locale: locales.bg,
selectedDates: [document.querySelector('#publish_date').value]
});
</script>
@@ -0,0 +1,49 @@
<?php
/** @var Collections $model */
use app\models\register\Collections;
?>
<div class="inner-content p20">
<?php if ($model->thumbnail && $model->thumbnail != "''"): ?>
<img src="<?= Yii::$app->params['register'] ?>/uploads/collections/<?= $model->thumbnail ?>" style="height: 200px">
<?php endif; ?>
<div class="flex">
<div class="row c6">
<p><i class="lg lg-bg"></i> български</p>
<div class="row">
<h2><?= $model->name ?></h2>
</div>
<div class="row top15">
<label>Кратко описание</label>
<div>
<?= $model->annotation ?>
</div>
</div>
<div class="row top15">
<label>Oписание</label>
<div>
<?= $model->description ?>
</div>
</div>
</div>
<div class="row c6">
<p><i class="lg lg-bg"></i> английски</p>
<div class="row">
<h2><?= $model->name_en ?></h2>
</div>
<div class="row top15">
<label>Кратко описание</label>
<div>
<?= $model->annotation_en ?>
</div>
</div>
<div class="row top15">
<label>Oписание</label>
<div>
<?= $model->description_en ?>
</div>
</div>
</div>
</div>
</div>
@@ -0,0 +1,89 @@
<?php
use app\models\RegisterObjects;
use app\services\ELibraryModels;
use app\services\JWT;
/**
* @var RegisterObjects $model
*/
$download = null;
if (sizeof($model->getRegisterObjectFiles()->all()) > 0) {
$download = $model->getRegisterObjectFiles()->all()[0]->file_url;
}
$lib_variants = [1 => 'Книга', 2 => 'Периодично издание', 3 => 'Статия'];
$lib_formats = ["1" => 'Електронно', "3" => 'Печатно', "2" => 'Електронно и печатно'];
?>
<div class="inner-content p10 preview-mode">
<?php if ($model->mainImgFile): ?>
<img data-preview="<?= $model->mainImgFile ?>" src="<?= $model->mainImgFile ?>" style="height: 300px">
<?php endif; ?>
<?php if ($model->pdf): ?>
<div class="row top15 c7 flex">
<button data-pdf="https://portal.nasledstvo.bg/file-system/file-preview-delivery/<?= JWT::encode(['id' => $model->pdf->id], JWT::SECRET_KEY) ?>/"
class="btn btn-default"><i class="la la-file-pdf"></i> Преглед
</button>
<?php if ($download): ?>
<a href="<?= $download ?>" download="true" class="left10 btn btn-default"><i class="la la-download"></i>
Сваляне на файл</a>
<?php endif; ?>
</div>
<?php endif; ?>
<!-- EDIT -->
<div class="row top15 c7">
<label>Име на публикацията</label>
<div><?= $model->name ?></div>
</div>
<div class="row top15 c7">
<label>Анотация</label>
<div><?= $model->annotation ?></div>
</div>
<?php //if (!empty($_GET['lib']) && $_GET['lib'] == 'sichtbar'): ?>
<div class="row top15 c7">
<label>Ключови думи</label>
<div><?= $model->getTagsList(', ') ?></div>
</div>
<?php if ($model->library): ?>
<div class="row top15 c7">
<label>Информация</label>
<div>
<?php foreach ($model->library as $key => $value):
if ($key == "id" || $key == "object_id" || $value == "''" || $value == "") continue;
switch ($key) {
case 'lib_variant':
$value = ELibraryModels::$lib_types[$value][0] ?? $value[0];
break;
case 'lib_format':
$value = ELibraryModels::$lib_format_opt[$value][0] ?? $value[0];
break;
case 'lib_license':
$value = ELibraryModels::$lib_licenses[$value][0];
break;
case 'lib_rights':
$value = ELibraryModels::$lib_rights[$value][0];
break;
case 'lib_language':
$value = ELibraryModels::getLanguages($value);
break;
}
?>
<div><b><?= ELibraryModels::$key_labels[$key] ?? $key ?></b>: <?= strip_tags($value) ?></div>
<?php endforeach; ?>
</div>
</div>
<?php endif ?>
<?php //endif; ?>
</div>
<script>
document.querySelectorAll('[data-preview]').forEach(e => {
e.classList.add('pointer')
e.addEventListener('click', () => {
modal.modalPreview(e.dataset.preview);
})
})
</script>
@@ -0,0 +1,138 @@
<?php
use app\models\Events;
use app\models\register\Partner;
use app\widgets\FileWidget;
use app\widgets\services\Includes;
/**
* @var Events $model
*/
$media_key = $model->getMediaKey();
?>
<div class="inner-content p10">
<form autocomplete="off">
<?php if ($model->getEventType()): ?>
<input name="type" type="hidden" value="<?= $model->getEventType() ?>">
<?php endif; ?>
<div class="row c2">
<label class="require">Дати на събитието</label>
<input type="hidden" name="event_dates" id="event_dates" value="<?= $model->event_dates ?>">
</div>
<div class="row c6 top15">
<label>Локация</label>
<input name="location" placeholder="Въведи локация на събитието" value="<?= $model->location ?>"/>
</div>
<div class="row c6 top15">
<label class="require">Заглавие</label>
<input name="title" placeholder="Въведи заглавие на събитието" value="<?= $model->title ?>"/>
</div>
<div class="row c6 top15">
<label class="require">Пртньор</label>
<select name="partner_id">
<option disabled selected>-- Избери организация --</option>
<?php foreach (Partner::partnerList() as $id => $name): ?>
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row top15" style="width: 350px">
<label>Заглавно изображение</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'title_event_image',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне',
'edit' => 'Редакция',
'delete' => 'Премахване'
],
'single_file' => true,
'resolutions' => ['16:11', '21:11', '1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<?= $this->render('/shared/instruction_1') ?>
<div class="row c9 top15">
<label class="require">Кратък текст</label>
<textarea class="ckEditor" name="text_short"><?= $model->text_short ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Подробен текст</label>
<textarea class="ckEditor" name="text"><?= $model->text ?></textarea>
</div>
<div class="row c9 top15">
<label>Изображения в събитието</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'event_images',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображения',
'edit' => 'Редакция на изображение',
'delete' => 'Премахване на изображения'
],
'resolutions' => ['16:11', '21:11', '1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<?php if ($model->type == 'simple'): ?>
<div class="row c9 top15 flex">
<div class="c7 right10">
<label>Стрийминг линк</label>
<input onkeyup="updateLabelRequire(this, '#sta')" name="stream_url"
placeholder="Въведи линк на стрийминг"
value="<?= $model->stream_url ?>"/>
</div>
<div class="left10">
<label id="sta">Достъп</label>
<div class="flex top-page-panel"
style="height: 14px; border-radius: 3px; border-color: var(--base-background-dark)">
<?php foreach ([1 => 'Частен', 2 => 'Публичен'] as $v => $t): ?>
<label style="margin-top: -3px" class="right10 radio-error"><input
style="width: 14px; height: 14px;" type="radio"
name="stream_access" <?= $model->stream_access == $v ? 'checked' : '' ?>
value="<?= $v ?>"/> <?= $t ?>
</label>
<?php endforeach; ?>
</div>
</div>
</div>
<?php endif; ?>
<div class="row c3 top15">
<label class="require">Дата на публикуване</label>
<input type="hidden" name="publish_date" id="publish_date" value="<?= $model->getPublishDate() ?>">
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/events') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<script src="/_public/plugins/air-datepicker/locales.js"></script>
<script src="/_public/plugins/air-datepicker/air-datepicker.js"></script>
<script>
new AirDatepicker('#event_dates', {
inline: true,
locale: locales.bg,
multipleDates: true,
multipleDatesSeparator: ',',
minDate: '<?= date('Y-m-d') ?>',
selectedDates: document.querySelector('#event_dates').value.split(',')
});
new AirDatepicker('#publish_date', {
inline: true,
locale: locales.bg,
minDate: '<?= date('Y-m-d') ?>',
selectedDates: [document.querySelector('#publish_date').value]
});
</script>
@@ -0,0 +1,27 @@
<?php
use app\widgets\services\Includes;
/**
* @var \app\models\ExpositionsCategories $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="flex top15 c9">
<div class="row c6 right10">
<label class="require">Наименование на категория (BG)</label>
<input name="name" placeholder="Въведи наименование на категория"
value="<?= $model->name ?>"/>
</div>
<div class="row c6">
<label class="require">Наименование на категория (EN)</label>
<input name="name_en" placeholder="Въведи наименование на категория"
value="<?= $model->name_en ?>"/>
</div>
</div>
<div class="row flex c9 top15">
<?= Includes::formButtons('web-portal/expositions?listtab=categories') ?>
</div>
</form>
</div>
@@ -0,0 +1,163 @@
<div class="wl-switch">
<a class="" href="?listtab=list"><i class="la la-navicon"></i> Списък с експозиции</a>
<a class="" href="?listtab=categories"><i class="la la-navicon"></i> Категории</a>
<a class="selected" href="?listtab=tags"><i class="la la-navicon"></i> Тагове</a>
</div>
<?php
use app\models\ExpositionsTags;
$translations = ExpositionsTags::find()->orderBy(['id' => SORT_DESC])->all();
?>
<div class="inner-content p10">
<div class="c10 row">
<div class="row top15">
<div onclick="addTs(this)" class="btn-ib btn-default add-ts"><i class="la la-plus-circle"></i> Добави нов
таг
</div>
</div>
<div class="row-panel top15">
<input id="searchByName" style="height:13px; width: 300px" type="text" onkeydown="searchByName(this)"
placeholder="Търси по име на таг">
<div id="clearButton" onclick="clearButton()" class="btn-ib btn-default add-ts disabled left5"><i
class="la la-remove"></i>
Изчисти
</div>
<div onclick="searchButton()" class="btn-ib btn-default add-ts"><i class="la la-search"></i> Търси</div>
</div>
<table class="cms-table top15">
<thead id="header" class="<?= sizeof($translations) == 0 ? 'hidden-row' : '' ?>">
</thead>
<tbody id="tslist">
<?php if (sizeof($translations) == 0): ?>
<tr id="empty-row">
<td class="ct" style="font-size: 16px; padding: 20px" colspan="3">Няма добавени тагове</td>
</tr>
<?php else: ?>
<?php foreach ($translations as $ts): ?>
<tr id="ID<?= $ts->id ?>" data-row-id="<?= $ts->id ?>">
<td class="c5">
<div class="flex left10">
<i class="lg lg-bg" style="margin-top: 10px"></i>
<input autocomplete="off" oninput="updateTs(this)" data-input-id="<?= $ts->id ?>"
name="name" placeholder="[BG]" value="<?= $ts->name ?>"/>
</div>
</td>
<td class="c5">
<div class="flex left10">
<i class="lg lg-en" style="margin-top: 10px"></i>
<input autocomplete="off" oninput="updateTs(this)" data-input-id="<?= $ts->id ?>"
name="name_en" placeholder="[EN]" value="<?= $ts->name_en ?>"/>
</div>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
<script>
const newRow = (id) => {
return `<tr id="ID${id}" data-row-id="${id}">
<td class="c5">
<div class="flex left10">
<i class="lg lg-bg" style="margin-top: 10px"></i>
<input autocomplete="off" oninput="updateTs(this)" data-input-id="${id}" name="name" placeholder="[BG]" value=""/>
</div>
</td>
<td class="c5">
<div class="flex left10">
<i class="lg lg-en" style="margin-top: 10px"></i>
<input autocomplete="off" oninput="updateTs(this)" data-input-id="${id}" name="name_en" placeholder="[EN]" value=""/>
</div>
</td>
</tr>`;
}
const addTs = (e) => {
e.classList.add('disabled')
request({
post: {},
done: r => {
if (r.id) {
e.classList.remove('disabled')
if (one('#empty-row')) {
one('#tslist').innerHTML = newRow(r.id)
one('#header').classList.remove('hidden-row')
} else {
let firstRow = one('#tslist tr:first-child')
let tb = document.createElement('tbody')
tb.innerHTML = newRow(r.id)
one('#tslist').insertBefore(tb.firstChild, firstRow)
}
}
}
})
}
const updateTs = (e) => {
let post = {}
post[e.name] = e.value || 'null'
request({
url: `?listtab=tags&o=w&id=${e.dataset.inputId}`, post
})
}
const searchByName = (e) => {
if (event.keyCode === 13) {
const search = e.value.toLowerCase();
const clearButton = one('#clearButton');
if (search !== '') {
clearButton.removeClass('disabled');
} else {
clearButton.addClass('disabled');
}
document.querySelectorAll(`#tslist tr`).forEach(tr => {
const vBg = tr.querySelector('td:nth-child(1) input').value.toLowerCase();
const vEn = tr.querySelector('td:nth-child(2) input').value.toLowerCase();
if (search !== '') {
if (vBg.indexOf(search) > -1 || vEn.indexOf(search) > -1) {
tr.classList.remove('hidden-row')
} else {
tr.classList.add('hidden-row')
}
} else {
tr.classList.remove('hidden-row')
}
})
}
}
const searchButton = () => {
const search = one('#searchByName').value.toLowerCase();
const clearButton = one('#clearButton');
if (search !== '') {
clearButton.removeClass('disabled');
} else {
clearButton.addClass('disabled');
}
document.querySelectorAll(`#tslist tr`).forEach(tr => {
const vBg = tr.querySelector('td:nth-child(1) input').value.toLowerCase();
const vEn = tr.querySelector('td:nth-child(2) input').value.toLowerCase();
if (search !== '') {
if (vBg.indexOf(search) > -1 || vEn.indexOf(search) > -1) {
tr.classList.remove('hidden-row')
} else {
tr.classList.add('hidden-row')
}
} else {
tr.classList.remove('hidden-row')
}
});
}
const clearButton = () => {
one('#searchByName').value = '';
document.querySelectorAll(`#tslist tr`).forEach(tr => {
tr.classList.remove('hidden-row')
})
const clearButton = one('#clearButton');
clearButton.addClass('disabled');
}
</script>
@@ -0,0 +1,114 @@
<?php
use app\models\ExpositionsCategories;
use app\models\Partner;
use app\widgets\FileWidget;
use app\widgets\services\Includes;
/**
* @var \app\models\Expositions $model
*/
$media_key = $model->getMediaKey();
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c9 top15">
<label>Галерия</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'title_expositions_images',
'media_key' => $media_key,
'model_id' => $model->id,
'model_class' => \app\models\Expositions::class,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображение',
'edit' => 'Редакция на изображенито',
'delete' => 'Премахване на изображението'
],
'resolutions' => ['1:1', '16:11'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<div class="flex top15 c9">
<div class="row c6 right10">
<label class="require">Наименование на експозиция (BG)</label>
<input name="name" placeholder="Въведи наименование на експозиция"
value="<?= $model->name ?>"/>
</div>
<div class="row c6">
<label class="require">Наименование на експозиция (EN)</label>
<input name="ts_en_name" placeholder="Въведи наименование на експозиция"
value="<?= $model->ts_en_name ?>"/>
</div>
</div>
<div class="flex top15 c9">
<div class="row c3 right10">
<label class="require">Категория</label>
<select name="category_id">
<option selected disabled>-- избери категория --</option>
<?php foreach (ExpositionsCategories::dropDownList($model->category_id) as $category): ?>
<option value="<?= $category->id ?>" <?= $category->selected ?>><?= $category->name ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="row c9 top15">
<label class="require">Анотация</label>
<textarea class="ckEditor" name="annotation"><?= $model->{'annotation'} ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Описание</label>
<textarea class="ckEditor" name="description"><?= $model->{'description'} ?></textarea>
</div>
<div class="row c9 top15">
<label>Тагове</label>
<select style="display:none;" class="search-select-box" multiple
name="tag_list[]">
<option disabled value="">-- избери тагове --</option>
<?php foreach ($model->getTagList() as $item): ?>
<option <?= $item['selected'] ?>
value="<?= $item['id'] ?>"><?= $item['name'] ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row c9 top15">
<label class="require">Партньор</label>
<select name="partner_id">
<option selected disabled value="">-- Изберете партньор --</option>
<?php foreach (\app\models\register\Partner::partnerList() as $id => $name): ?>
<option <?= $model->partner_id == $id ? 'selected' : '' ?> value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row c9 top15">
<label class="require">Информационен център</label>
<input name="info_center" placeholder="Въведи наименование на информационен център"
value="<?= $model->info_center ?>"/>
</div>
<div class="row c9 top15">
<label class="require">Информационен център адрес</label>
<input name="info_center_address" placeholder="Въведи адрес на информационен център"
value="<?= $model->info_center_address ?>"/>
</div>
<div class="row flex c9 top15">
<?= Includes::formButtons('web-portal/expositions') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<script src="/_public/assets/js/search-box.js"></script>
<script>
all('.search-select-box').forEach(el => {
new SearchBox(el)
})
</script>
@@ -0,0 +1,94 @@
<?php
use app\models\Navigation;
use app\models\Pages;
use app\widgets\services\Includes;
/**
* @var Navigation $model
*/
$availableListTabs = ['main', 'footer', 'footer_2', 'footer_3'];
?>
<?php if (!empty($_GET['listtab']) && in_array($_GET['listtab'], $availableListTabs)): ?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="c10 row">
<label class="require">Име на бутон</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label><i class="lg lg-bg"></i> BG</label>
<input name="name" placeholder="Въведи име на бутона"
value="<?= $model->name ?>"/>
</div>
<div class="row c6">
<label><i class="lg lg-en"></i> EN</label>
<input name="ts_en_name" placeholder="Въведи име на бутона"
value="<?= $model->ts_en_name ?>"/>
</div>
</div>
</div>
<div class="c10 row top15">
<label class="require">Връзка</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label class="inner-block"><input <?= $model->isRelationType('inner_page') ?>
value="inner_page" type="radio" name="relation_type"> Вътрешна страница
</label>
<select data-content="inner_page" <?= $model->isRelationTypeFor('inner_page') ?> name="page_id">
<option value="" disabled selected>Избери вътрешна страница</option>
<?php foreach (Pages::getList() as $id => $page): ?>
<option <?= $id == $model->page_id ? 'selected' : '' ?>
value="<?= $id ?>"><?= $page ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row c6">
<label class="inner-block"><input <?= $model->isRelationType('outer_page') ?>
value="outer_page" type="radio" name="relation_type"> Url адрес на страница
</label>
<div>
<input placeholder="Въведи url адрес на външна или вътрешна страница"
data-content="outer_page" <?= $model->isRelationTypeFor('outer_page') ?> name="url"
value="<?= $model->url ?>">
</div>
<div class="top5">
<input placeholder="Въведи url адрес на външна или вътрешна страница за уторизирани потребители"
data-content="outer_page" <?= $model->isRelationTypeFor('outer_page') ?>
name="url_authorised"
value="<?= $model->url_authorised ?>">
</div>
</div>
</div>
</div>
<?php if (empty($_GET['id'])): ?>
<input name="menu_type" type="hidden" value="<?= $_GET['listtab'] ?>">
<?php endif; ?>
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/navigation/?listtab=' . $_GET['listtab']) ?>
</div>
</form>
</div>
<?php endif; ?>
<script>
all('[name="relation_type"]', e => {
e.addEventListener('click', () => {
all('[data-content]', (elm) => {
elm.parentNode.removeClass('form-error')
let msg = elm.parentNode.querySelector('.error-bubble');
if (msg) {
msg.remove();
}
if (elm.dataset.content === e.value) {
elm.removeAttribute('readonly')
elm.removeClass('disabled')
} else {
elm.setAttribute('readonly', true)
elm.addClass('disabled')
elm.value = ''
}
})
})
})
</script>
@@ -0,0 +1,110 @@
<?php
use app\models\News;
use app\models\register\Partner;
use app\widgets\FileWidget;
use app\widgets\services\Includes;
/**
* @var News $model
*/
$media_key = $model->getMediaKey();
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c5">
<label class="require">Пртньор</label>
<select name="partner_id">
<option disabled selected>-- Избери организация --</option>
<?php foreach (Partner::partnerList() as $id => $name): ?>
<option <?= $model->partner_id == $id ? 'selected' : '' ?>
value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row c5 top15">
<label class="require">Заглавие</label>
<input name="title" placeholder="Въведи заглавие на новината" value="<?= $model->title ?>"/>
</div>
<div class="row c9 top15">
<label>Заглавно изображение</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'title_news_image',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображение',
'edit' => 'Редакция на изображенито',
'delete' => 'Премахване на изображението'
],
'single_file' => true,
'resolutions' => ['16:11', '16:9', '1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<?= $this->render('/shared/instruction_1') ?>
<div class="row c9 top15">
<label class="require">Кратък текст (на български)</label>
<textarea class="ckEditor" name="text_short"><?= $model->text_short ?></textarea>
</div>
<div class="row c9 top15">
<label class="require">Пълен текст (на български)</label>
<textarea class="ckEditor" name="text"><?= $model->text ?></textarea>
</div>
<div class="row c9 top15">
<label>Изображения в новината</label>
<?= FileWidget::widget([
'media_type' => 'image',
'object_key' => 'news_images',
'media_key' => $media_key,
'files' => $model->getFiles('thumb'),
'actions' => [
'add' => 'Добавяне на изображения',
'edit' => 'Редакция на изображение',
'delete' => 'Премахване на изображения'
],
'resolutions' => ['16:11', '16:9', '1:1'],
'max_file_size' => 2,
'error_message' => 'Файловете по-големи от 2МБ, не бяха добавени'
]) ?>
</div>
<div class="row c9 top15 flex">
<div class="c7 right10">
<label>Стрийминг линк</label>
<input onkeyup="updateLabelRequire(this, '#sta')" name="stream_url" placeholder="Въведи линк на стрийминг"
value="<?= $model->stream_url ?>"/>
</div>
<div class="left10">
<label id="sta">Достъп</label>
<div class="flex top-page-panel" style="height: 14px; border-radius: 3px; border-color: var(--base-background-dark)">
<?php foreach ([1 => 'Частен', 2 => 'Публичен'] as $v => $t): ?>
<label style="margin-top: -3px" class="right10 radio-error"><input style="width: 14px; height: 14px;" type="radio" name="stream_access" <?= $model->stream_access == $v ? 'checked' : '' ?>
value="<?= $v ?>"/> <?= $t ?>
</label>
<?php endforeach; ?>
</div>
</div>
</div>
<div class="row c3 top15">
<label class="require">Дата на публикуване</label>
<input type="hidden" name="publish_date" id="publish_date" value="<?= $model->getPublishDate() ?>">
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/news') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script src="/_public/assets/js/file-img.js"></script>
<script src="/_public/plugins/cropperJs/cropper.min.js"></script>
<script src="/_public/plugins/air-datepicker/locales.js"></script>
<script src="/_public/plugins/air-datepicker/air-datepicker.js"></script>
<script>
new AirDatepicker('#publish_date', {
inline: true,
locale: locales.bg,
selectedDates: [document.querySelector('#publish_date').value]
});
</script>
@@ -0,0 +1,60 @@
<?php
use app\models\Objects;
use app\models\Partner;
use app\widgets\services\Includes;
/**
* @var Objects $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<?php if ($model->ot_id && $model->sc_id): ?>
<!-- EDIT -->
<div class="row info-table c4 top15">
<div class="row-flex">
<div>Категория:</div>
<div class="fl-capitalize"><?= $model->subCategory->mainCategory->name ?></div>
</div>
<div class="row-flex">
<div>Под категория:</div>
<div class="fl-capitalize"><?= $model->subCategory->name ?></div>
</div>
<div class="row-flex">
<div>Вид обект:</div>
<div class="fl-capitalize"><?= $model->objectTemplate->name ?></div>
</div>
<div class="row-flex">
<div>Партньор:</div>
<div class="fl-capitalize"><?= $model->partner->name ?></div>
</div>
</div>
<div class="row c7 top15">
<label class="require">Партньор</label>
<select name="partner_id">
<option selected disabled value="">-- Изберете партньор--</option>
<?php foreach (Partner::partnerList() as $id => $name): ?>
<option <?= $model->partner_id == $id ? 'selected': ''?> value="<?= $id ?>"><?= $name ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="row top15 c7">
<label class="require">Наименование на обекта</label>
<input name="name" value="<?= $model->name ?>">
</div>
<div class="row top15 c7">
<label class="require">Анотация</label>
<textarea name="annotation"><?= $model->annotation ?></textarea>
</div>
<div class="row top15 c7">
<label class="require">Подробно описание</label>
<textarea class="ckEditor" name="description"><?= $model->description ?></textarea>
</div>
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/objects') ?>
</div>
<?php endif; ?>
</form>
</div>
@@ -0,0 +1,91 @@
<?php
use app\models\Pages;
use app\widgets\services\Includes;
/**
* @var Pages $model
*/
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="c10 row">
<label>Заглавие страница</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label class="require"><i class="lg lg-bg"></i> Български</label>
<input name="name" placeholder="Въведи заглавието страницата [BG]" value="<?= $model->name ?>"/>
</div>
<div class="row c6 right10">
<label class="require"><i class="lg lg-en"></i> Английски</label>
<input name="name_en" placeholder="Въведи заглавието страницата [EN]" value="<?= $model->name_en ?>"/>
</div>
</div>
</div>
<div class="c10 row top15">
<label>Текст</label>
<div class="row row-panel">
<div class="row c12">
<label><i class="lg lg-bg"></i> Български</label>
<textarea class="ckEditor" name="text" placeholder="Въведи текст на страницата [BG]"><?= $model->text ?></textarea>
</div>
<div class="row c12 top15">
<label><i class="lg lg-en"></i> Английски</label>
<textarea class="ckEditor" name="text_en" placeholder="Въведи текст на страницата [EN]"><?= $model->text_en ?></textarea>
</div>
</div>
</div>
<?php if($model && $model->contact): ?>
<div class="panel row-panel top15 c10">
<h2>Контакти</h2>
<div class="row">
<div class="flex row">
<div class="row c6 right10">
<label>Телефон</label>
<input name="contacts[phone]" value="<?= $model->contact->phone ?>">
</div>
<div class="row c6">
<label>E-mail</label>
<input name="contacts[email]" value="<?= $model->contact->email ?>">
</div>
</div>
<div class="flex row top15">
<div class="row c12">
<label>Уебсайт</label>
<input name="contacts[website]" value="<?= $model->contact->website ?>">
</div>
</div>
</div>
<div class="row top15">
<label>Адрес</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label class="require"><i class="lg lg-bg"></i> Български</label>
<input name="contacts[address]" placeholder="Въведи адрес [BG]" value="<?= $model->contact->address ?>"/>
</div>
<div class="row c6 right10">
<label class="require"><i class="lg lg-en"></i> Английски</label>
<input name="contacts[address_en]" placeholder="Въведи адрес [EN]" value="<?= $model->contact->address_en ?>"/>
</div>
</div>
</div>
<div class="row top15">
<label>Управляващ орган</label>
<div class="flex row row-panel">
<div class="row c6 right10">
<label class="require"><i class="lg lg-bg"></i> Български</label>
<input name="contacts[managing_authority]" placeholder="Въведи управляващ орган [BG]" value="<?= $model->contact->managing_authority ?>"/>
</div>
<div class="row c6 right10">
<label class="require"><i class="lg lg-en"></i> Английски</label>
<input name="contacts[managing_authority_en]" placeholder="Въведи управляващ орган [EN]" value="<?= $model->contact->managing_authority_en ?>"/>
</div>
</div>
</div>
</div>
<?php endif ?>
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/pages') ?>
</div>
</form>
</div>
@@ -0,0 +1,173 @@
<?php
use app\models\Positions;
use app\widgets\services\Includes;
/**
* @var Positions $model
*/
$media_key = $model->getMediaKey();
$min = 1;
$max = 15;
?>
<div class="inner-content p10">
<form autocomplete="off">
<div class="row c3 top15">
<label class="require">Име на групата</label>
<input name="group_name" placeholder="Въведи име на групата на позициите"
value="<?= $model->group_name ?>"/>
</div>
<?php if($model->id == 1):?>
<p class="upload-info">Материалите се показват на началната страница за да иглеждат добре е препоръчително броят на активните позиции в тематичната зона да бъде нечетно число.</i></p>
<?php endif; ?>
<?php if ($model->positionsCount == 0): ?>
<div class="row c3 top15">
<label class="require">Брой позиции</label>
<input onkeyup="validateNumber(this, <?= $min ?>, <?= $max ?>)" type="number" min="<?= $min ?>"
max="<?= $max ?>" name="positions_count" placeholder="Въведи колко на брой ще бъдат позициите"/>
</div>
<?php else: ?>
<div class="row c5 top15">
<div onclick="addPosition(this)" data-id="<?= $model->id ?>"
class="btn-ib btn-default <?= $model->positionsCount >= $max ? 'disabled' : '' ?>">
<i class="la la-plus-circle"></i> Добавяне на позиция
</div>
<div id="bDelete" data-model="app\models\Positions" onclick="checkDelete(this)"
class="btn-ib btn-default ct disabled">
<i class="la la-trash-o"></i> Изтриване на позиции <span id="delCount">(0)</span>
</div>
</div>
<div class="c9 top15">
<table class="cms-table">
<thead>
<tr>
<th class="text-right c0">
<input id="checkAll" onclick="checkAllPositions(this)" title="Избери всички"
class="delete-checkbox" type="checkbox">
No
</th>
<th>Материял</th>
</tr>
</thead>
<tbody>
<?php
$articles = ['Новина', 'Събитие', 'Кампания'];
foreach ($model->positions as $i => $position): ?>
<tr draggable="true" data-index="<?= $position->order_index ?>">
<td class="text-right">
<input onclick="checkSingle(this)" data-del="<?= $position->id ?>"
class="delete-checkbox"
type="checkbox"
style="top: calc(50% - 10px)">
<span class="order-index"><?= $position->order_index + 1 ?></span>
</td>
<td><?= $position->article ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
<input type="hidden" name="positions_count_ready" value="<?= $model->positionsCount ?>">
<div class="row c9 top15 flex">
<?= Includes::formButtons('web-portal/positions') ?>
</div>
</form>
</div>
<script src="/_public/assets/js/order.js"></script>
<script>
orderItems('[data-index]', '/update-positions-indexes/', function () {
var index = 0
all('[data-index] .order-index').forEach(e => {
e.innerText = ++index
})
});
function validateNumber(e, min, max) {
if (e.value !== '') {
if (e.value < min)
e.value = min;
if (e.value > max)
e.value = max;
}
}
let sl = [];
function checkAllPositions(el) {
sl = [];
all('td [data-del]').forEach(e => {
e.checked = el.checked === true;
if (el.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
e.parentNode.parentNode.removeClass('checked');
}
})
updateActionButtons();
}
function checkSingle(e) {
if (e.checked) {
sl.push(e.dataset.del);
e.parentNode.parentNode.addClass('checked');
} else {
one('#checkAll').checked = false;
e.parentNode.parentNode.removeClass('checked');
const f = sl.indexOf(e.dataset.del);
sl.splice(f, 1);
}
updateActionButtons(e.dataset.del);
}
function updateActionButtons() {
const bDelete = one('#bDelete');
const delCount = one('#delCount');
const c = sl.length;
if (delCount)
delCount.innerText = '(' + c + ')';
if (c > 0) {
if (bDelete)
bDelete.removeClass('disabled');
} else {
if (bDelete)
bDelete.addClass('disabled');
}
}
function checkDelete(e) {
const msg = 'Сигурни ли сте, че искате да изтриете ' + (sl.length > 1 ? 'тези ' + sl.length + ' записа?' : 'този запис?');
modal.confirm(msg, () => {
request({
url: window.location.href.split('?')[0] + '?o=d',
post: {
ids: JSON.stringify(sl),
model: e.dataset.model
},
done: e => {
window.location.reload();
}
})
});
}
function addPosition(e) {
request({
url: '/new-article-position/',
post: {
group_id: e.dataset.id
},
done: e => {
window.location.reload();
}
})
}
</script>

Some files were not shown because too many files have changed in this diff Show More