diff --git a/app/Core/Admin/Http/Views/assets/js/components/tabs.js b/app/Core/Admin/Http/Views/assets/js/components/tabs.js index aeebee1..0adefad 100644 --- a/app/Core/Admin/Http/Views/assets/js/components/tabs.js +++ b/app/Core/Admin/Http/Views/assets/js/components/tabs.js @@ -69,6 +69,7 @@ class ChromeTabs { this.contentContainers = {}; this.abortControllers = {}; this.instanceId = 0; + this.shouldUpdateTabs = true; // Флаг для отслеживания необходимости обновления ширины вкладок } init(el) { @@ -81,6 +82,15 @@ class ChromeTabs { this.layoutTabs(); this.setupNewTabButton(); this.setupDraggabilly(); + + // Добавляем обработчики событий для мыши + this.el.addEventListener('mouseenter', () => { + this.shouldUpdateTabs = false; + }); + this.el.addEventListener('mouseleave', () => { + this.shouldUpdateTabs = true; + this.layoutTabs(); + }); } createContentContainerForTab(tabEl) { @@ -213,12 +223,12 @@ class ChromeTabs { let styleHTML = ''; this.tabPositions.forEach((position, i) => { styleHTML += ` - .chrome-tabs[data-chrome-tabs-instance-id="${ - this.instanceId - }"] .chrome-tab:nth-child(${i + 1}) { - transform: translate3d(${position}px, 0, 0) - } - `; + .chrome-tabs[data-chrome-tabs-instance-id="${ + this.instanceId + }"] .chrome-tab:nth-child(${i + 1}) { + transform: translate3d(${position}px, 0, 0) + } + `; }); this.styleEl.innerHTML = styleHTML; @@ -276,8 +286,8 @@ class ChromeTabs { this.setCurrentTab(tabEl); } - this.layoutTabs(); this.cleanUpPreviouslyDraggedTabs(); + this.layoutTabs(); this.setupDraggabilly(); this.saveTabs(); } @@ -402,7 +412,9 @@ class ChromeTabs { } this.cleanUpPreviouslyDraggedTabs(); - this.layoutTabs(); + + if (this.shouldUpdateTabs) this.layoutTabs(); + this.setupDraggabilly(); this.saveTabs(); } diff --git a/app/Core/Admin/routes.php b/app/Core/Admin/routes.php index 3073848..da108cf 100644 --- a/app/Core/Admin/routes.php +++ b/app/Core/Admin/routes.php @@ -52,6 +52,7 @@ use Flute\Core\Admin\Http\Controllers\Views\UsersView; use Flute\Core\Admin\Http\Controllers\Views\NavbarView; use Flute\Core\Admin\Http\Middlewares\HasPermissionMiddleware; +use Flute\Core\Http\Middlewares\CSRFMiddleware; use Flute\Core\Router\RouteGroup; $router->group(function ($router) { @@ -181,6 +182,8 @@ }, 'admin'); $router->group(function (RouteGroup $admin) { + $admin->middleware(CSRFMiddleware::class); + // $admin->get('/', [IndexApi::class, 'index']); $admin->get('/createlog', [MainSettingsController::class, 'createLog']); diff --git a/app/Core/App.php b/app/Core/App.php index 58ff21c..d9e2077 100644 --- a/app/Core/App.php +++ b/app/Core/App.php @@ -47,7 +47,7 @@ final class App * * @var string */ - public const VERSION = '0.2.3.5-alpha'; + public const VERSION = '0.2.3.6-alpha'; /** * Set the base path of the application diff --git a/app/Core/Page/PageManager.php b/app/Core/Page/PageManager.php index cf4a47b..4eba20e 100644 --- a/app/Core/Page/PageManager.php +++ b/app/Core/Page/PageManager.php @@ -8,7 +8,9 @@ use Flute\Core\Database\Repositories\PageRepository; use Flute\Core\Events\RoutingFinishedEvent; use Flute\Core\Http\Controllers\PagesController; +use Flute\Core\Http\Middlewares\CSRFMiddleware; use Flute\Core\Router\RouteDispatcher; +use Flute\Core\Router\RouteGroup; use Nette\Utils\Json; use Nette\Utils\JsonException; @@ -241,8 +243,11 @@ protected function loadPermissions(): void protected function loadRoutes(): void { if ($this->hasAccessToEdit()) { - $this->routeDispatcher->post('page/save', [PagesController::class, 'saveEdit']); - $this->routeDispatcher->post('page/saveimage', [PagesController::class, 'saveImage']); + $this->routeDispatcher->group(function (RouteGroup $routeGroup) { + $routeGroup->middleware(CSRFMiddleware::class); + $routeGroup->post('save', [PagesController::class, 'saveEdit']); + $routeGroup->post('saveimage', [PagesController::class, 'saveImage']); + }, 'page/'); } } diff --git a/app/Core/Payments/PaymentRoutes.php b/app/Core/Payments/PaymentRoutes.php index 84693aa..bcddf25 100644 --- a/app/Core/Payments/PaymentRoutes.php +++ b/app/Core/Payments/PaymentRoutes.php @@ -1,8 +1,10 @@ router->group(function( RouteGroup $router) { + $this->router->group(function (RouteGroup $router) { $router->middleware(isAuthenticatedMiddleware::class); $router->get("", [LKViewController::class, "index"]); @@ -28,10 +30,11 @@ public function init() }, '/lk'); - $this->router->group(function( RouteGroup $api) { + $this->router->group(function (RouteGroup $api) { $api->group(function (RouteGroup $apiGroup) { + $apiGroup->middleware(CSRFMiddleware::class); $apiGroup->middleware(isAuthenticatedMiddleware::class); - + $apiGroup->post('/validate-promo', [LKApiController::class, 'validatePromo']); $apiGroup->post('/buy/{gateway}', [LKApiController::class, 'purchase']); $apiGroup->get('/buy/{gateway}', [LKApiController::class, 'purchase']); diff --git a/app/Core/Profile/Mods/InvoicesMode.php b/app/Core/Profile/Mods/InvoicesMode.php index 8d94535..c789bf7 100644 --- a/app/Core/Profile/Mods/InvoicesMode.php +++ b/app/Core/Profile/Mods/InvoicesMode.php @@ -25,6 +25,7 @@ public function render(User $user): string foreach ($invoices as $item) { $item->amountWithCurrency = $item->originalAmount . ' ' . $item->currency->code; $item->promoCode = !empty($item->promoCode) ? $item->promoCode->code : __('def.no'); + $item->created_at = $item->created_at->format(default_date_format()); if ($item->isPaid) { $item->paidCard = '