fix(console): comprehensive TUI rendering fixes

- Fix Enter key detection: handle multiple Enter key formats (\n, \r, \r\n)
- Reduce flickering: lower render frequency from 60 FPS to 30 FPS
- Fix menu bar visibility: re-render menu bar after content to prevent overwriting
- Fix content positioning: explicit line positioning for categories and commands
- Fix line shifting: clear lines before writing, control newlines manually
- Limit visible items: prevent overflow with maxVisibleCategories/Commands
- Improve CPU usage: increase sleep interval when no events processed

This fixes:
- Enter key not working for selection
- Strong flickering of the application
- Menu bar not visible or being overwritten
- Top half of selection list not displayed
- Lines being shifted/misaligned
This commit is contained in:
2025-11-10 11:06:07 +01:00
parent 6bc78f5540
commit 8f3c15ddbb
106 changed files with 9082 additions and 4483 deletions

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Analytics;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Application\Analytics\Service\AnalyticsDashboardService;
use App\Application\Analytics\Service\AnalyticsRealTimeService;
use App\Application\Analytics\Service\AnalyticsReportService;
@@ -22,10 +21,9 @@ use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
#[AdminSection(name: 'Analytics', icon: 'chart-bar', order: 4, description: 'Analytics and reporting')]
final class AnalyticsController
final readonly class AnalyticsController
{
public function __construct(
private AdminLayoutProcessor $layoutProcessor,
private AnalyticsDashboardService $dashboardService,
private AnalyticsStorage $storage,
private AnalyticsReportService $reportService,
@@ -69,12 +67,10 @@ final class AnalyticsController
'last_update' => date('Y-m-d H:i:s'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'analytics-dashboard',
metaData: new MetaData('Analytics Dashboard', 'Website Analytics and User Behavior'),
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Content;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Domain\Media\ImageRepository;
use App\Domain\Media\ImageSlotRepository;
use App\Framework\Admin\Attributes\AdminPage;
@@ -21,7 +20,6 @@ final readonly class ImageManagerController
public function __construct(
private ImageSlotRepository $slotRepository,
private ImageRepository $imageRepository,
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
) {
}
@@ -40,12 +38,10 @@ final readonly class ImageManagerController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
'image-manager',
new MetaData('Image Manager'),
$finalData
$data
);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Content;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Domain\Media\ImageSlot;
use App\Domain\Media\ImageSlotRepository;
use App\Framework\Admin\Attributes\AdminPage;
@@ -21,7 +20,6 @@ final readonly class ImageSlotsController
{
public function __construct(
private ImageSlotRepository $imageSlotRepository,
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
) {
}
@@ -38,9 +36,7 @@ final readonly class ImageSlotsController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult('imageslots', new MetaData('Image Slots', 'Image Slots Management'), $finalData);
return new ViewResult('imageslots', new MetaData('Image Slots', 'Image Slots Management'), $data);
}
#[Route('/admin/content/image-slots/{slotName}', method: Method::POST)]
@@ -55,9 +51,7 @@ final readonly class ImageSlotsController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult('imageslot', new MetaData('Edit Image Slot', 'Image Slot Management'), $finalData);
return new ViewResult('imageslot', new MetaData('Edit Image Slot', 'Image Slot Management'), $data);
}
#[Route('/admin/imageslots/create', method: Method::POST)]

View File

@@ -6,7 +6,6 @@ namespace App\Application\Admin\Database;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\AdminPageRenderer;
use App\Framework\Attributes\Route;
use App\Framework\Database\Browser\Registry\DatabaseRegistry;
@@ -24,7 +23,6 @@ final readonly class DatabaseBrowserController
private DatabaseRegistry $databaseRegistry,
private TableRegistry $tableRegistry,
private AdminPageRenderer $pageRenderer,
private AdminLayoutProcessor $layoutProcessor,
private PaginationService $paginationService,
private DatabaseTableGenerator $tableGenerator,
) {
@@ -72,12 +70,10 @@ final readonly class DatabaseBrowserController
],
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'database/browser',
metaData: new MetaData('Database Browser', 'Admin - Database Browser'),
data: $finalData
data: $data
);
}
}

View File

@@ -5,7 +5,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Database;
use App\Framework\Admin\Attributes\AdminPage;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Attributes\Route;
use App\Framework\Database\Browser\Registry\TableRegistry;
use App\Framework\Meta\MetaData;
@@ -16,7 +15,6 @@ final readonly class TableBrowserController
{
public function __construct(
private TableRegistry $tableRegistry,
private AdminLayoutProcessor $layoutProcessor,
private DatabaseMetadataTableGenerator $metadataTableGenerator,
) {
}
@@ -33,12 +31,10 @@ final readonly class TableBrowserController
'error' => "Table '{$table}' not found",
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'database/table-detail',
metaData: new MetaData('Table Not Found', 'Admin - Table Not Found'),
data: $finalData
data: $data
);
}
@@ -57,12 +53,10 @@ final readonly class TableBrowserController
'has_foreign_keys' => !empty($tableSchema->foreignKeys),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'database/table-detail',
metaData: new MetaData("Table: {$tableSchema->name}", "Admin - Table: {$tableSchema->name}"),
data: $finalData
data: $data
);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Development;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Attributes\Route;
use App\Framework\DateTime\Clock;
use App\Framework\Design\Component\ComponentCategory;
@@ -33,7 +32,6 @@ final readonly class DesignSystemController
private DesignSystemAnalyzer $analyzer,
private FileScanner $fileScanner,
private ComponentScanner $componentScanner,
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
) {
}
@@ -56,12 +54,10 @@ final readonly class DesignSystemController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
'design-dashboard',
new MetaData('Design System Dashboard', 'Design System Dashboard'),
$finalData
$data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Development;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -17,7 +16,6 @@ final readonly class RoutesController
{
public function __construct(
private DiscoveryRegistry $processedResults,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -110,12 +108,10 @@ final readonly class RoutesController
'routes' => $routes,
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'routes-overview',
metaData: new MetaData('Routes Overview', 'System Routes Overview'),
data: $finalData
data: $data
);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Development;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Attributes\Route;
use App\Framework\DateTime\Clock;
use App\Framework\Http\Method;
@@ -29,7 +28,6 @@ use App\Framework\Router\AdminRoutes;
final readonly class StyleguideController
{
public function __construct(
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
) {
}
@@ -52,12 +50,10 @@ final readonly class StyleguideController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'styleguide',
metaData: $metaData,
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Development;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Attributes\Route;
use App\Framework\Config\WafConfig as FrameworkWafConfig;
use App\Framework\Core\ValueObjects\Duration;
@@ -46,7 +45,6 @@ final class WafTestController
private readonly PerformanceService $performance,
private readonly Logger $logger,
private readonly Clock $clock,
private readonly AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -59,12 +57,10 @@ final class WafTestController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'waf-test',
metaData: new MetaData('WAF Test Suite', 'Web Application Firewall Testing Interface'),
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Infrastructure;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -22,7 +21,6 @@ final readonly class CacheMetricsController
public function __construct(
private CacheMetricsInterface $cacheMetrics,
private Clock $clock,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -52,12 +50,10 @@ final readonly class CacheMetricsController
$data['driver_stats'] = $driverStats;
}
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'cache-metrics',
metaData: new MetaData('Cache Metrics', 'Cache Performance Monitoring'),
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Infrastructure;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -22,7 +21,6 @@ final readonly class DockerController
{
public function __construct(
private DockerService $dockerService,
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
) {
}
@@ -71,12 +69,10 @@ final readonly class DockerController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'docker-dashboard',
metaData: new MetaData('Docker Dashboard', 'Docker container management and monitoring'),
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Infrastructure;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -28,7 +27,6 @@ final readonly class LogViewerController
public function __construct(
private LogViewer $logViewer,
private Timer $timer,
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
) {
}
@@ -48,9 +46,7 @@ final readonly class LogViewerController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult('log-viewer', $metaData, $finalData);
return new ViewResult('log-viewer', $metaData, $data);
}
#[Route('/admin/infrastructure/logs/api/list', Method::GET)]

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Infrastructure;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -20,7 +19,6 @@ final readonly class RedisController
public function __construct(
private RedisMonitoringService $redisMonitoring,
private Clock $clock,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -86,12 +84,10 @@ final readonly class RedisController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'redis',
metaData: new MetaData('Redis Dashboard', 'Redis monitoring and cache analysis'),
data: $finalData
data: $data
);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\Infrastructure;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -20,7 +19,6 @@ final readonly class ServicesController
public function __construct(
private DefaultContainer $container,
private Clock $clock,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -66,12 +64,10 @@ final readonly class ServicesController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'services',
metaData: new MetaData('Registrierte Dienste', 'Übersicht aller registrierten Services'),
data: $finalData
data: $data
);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\MachineLearning;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Attributes\Route;
use App\Framework\Core\ValueObjects\Duration;
use App\Framework\Http\HttpRequest;
@@ -23,7 +22,6 @@ final readonly class MLDashboardAdminController
public function __construct(
private ModelRegistry $registry,
private ModelPerformanceMonitor $performanceMonitor,
private AdminLayoutProcessor $layoutProcessor
) {}
#[AdminPage(title: 'ML Dashboard', icon: 'brain', section: 'Machine Learning', order: 10)]
@@ -167,12 +165,10 @@ final readonly class MLDashboardAdminController
'api_health_url' => '/api/ml/dashboard/health',
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'ml-dashboard',
metaData: new MetaData('ML Dashboard', 'Machine Learning Model Monitoring and Performance'),
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -24,7 +23,6 @@ final readonly class MigrationStatus
public function __construct(
private MigrationLoader $migrationLoader,
private MigrationRunner $migrationRunner,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -96,12 +94,10 @@ final readonly class MigrationStatus
'has_pending' => $pendingCount > 0,
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'migrations',
metaData: new MetaData('Database Migrations', 'Database migration status and management'),
data: $finalData
data: $data
);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Application\LiveComponents\ImageGallery\ImageGalleryComponent;
use App\Domain\Media\ImageRepository;
use App\Framework\Admin\Attributes\AdminPage;
@@ -21,7 +20,6 @@ use App\Framework\Router\Result\ViewResult;
final readonly class ShowImageManager
{
public function __construct(
private AdminLayoutProcessor $layoutProcessor,
private ImageRepository $imageRepository,
private DataProviderResolver $dataProviderResolver
) {
@@ -56,13 +54,11 @@ final readonly class ShowImageManager
'slots' => [], // TODO: Load actual slots for legacy support
];
$finalData = $this->layoutProcessor->processLayoutFromArray($viewData);
$metaData = MetaData::create(
title: 'Image Management',
description: 'Upload, manage and organize your images'
);
return new ViewResult('image-manager', $metaData, $finalData);
return new ViewResult('image-manager', $metaData, $viewData);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Domain\Media\Image;
use App\Domain\Media\ImageRepository;
use App\Domain\Media\ImageResizer;
@@ -28,7 +27,6 @@ final readonly class ShowImageUpload
private PathProvider $pathProvider,
private StringConverter $stringConverter,
private FormIdGenerator $formIdGenerator,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -49,14 +47,12 @@ final readonly class ShowImageUpload
'formHtml' => RawHtml::from($formHtml),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
$metaData = MetaData::create(
title: 'Bild-Upload | Admin Panel',
description: 'Upload new images to the system'
);
return new ViewResult('upload-form', $metaData, $finalData);
return new ViewResult('upload-form', $metaData, $data);
}
#[Route('/upload', Method::POST)]
@@ -143,12 +139,10 @@ final readonly class ShowImageUpload
'formHtml' => $this->buildUploadForm(),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
'upload-form',
MetaData::create('Upload Fehler | Admin Panel', $message),
$finalData
$data
);
}
@@ -161,12 +155,10 @@ final readonly class ShowImageUpload
'formHtml' => $this->buildUploadForm(),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
'upload-form',
MetaData::create($title . ' | Admin Panel', $message),
$finalData
$data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -14,9 +13,8 @@ use App\Framework\Router\Result\ViewResult;
#[AdminSection(name: 'Development', icon: 'code', order: 5, description: 'Development tools and utilities')]
final readonly class ShowUploadTest
{
public function __construct(
private AdminLayoutProcessor $layoutProcessor,
) {
public function __construct()
{
}
#[AdminPage(title: 'Upload Test', icon: 'file-upload', section: 'Development', order: 60, hidden: true)]
@@ -28,13 +26,11 @@ final readonly class ShowUploadTest
'description' => 'Test page for JavaScript file upload functionality with CSRF protection.',
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
$metaData = MetaData::create(
title: 'JavaScript Upload Test | Admin Panel',
description: 'Test JavaScript upload functionality'
);
return new ViewResult('upload-test', $metaData, $finalData);
return new ViewResult('upload-test', $metaData, $data);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\System;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -21,7 +20,6 @@ final readonly class EnvironmentController
public function __construct(
private DefaultContainer $container,
private Clock $clock,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -60,12 +58,10 @@ final readonly class EnvironmentController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'environment',
metaData: new MetaData('Umgebungsvariablen', 'Umgebungsvariablen'),
data: $finalData
data: $data
);
}
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\System;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -22,7 +21,6 @@ final readonly class HealthController
{
public function __construct(
private HealthCheckManager $healthManager,
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
private HealthCheckTableGenerator $tableGenerator,
) {
@@ -81,14 +79,10 @@ final readonly class HealthController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
error_log("HealthController: Final data keys: " . implode(', ', array_keys($finalData)));
return new ViewResult(
template: 'health-dashboard',
metaData: new MetaData('System Health', 'System Health Dashboard'),
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\System;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
use App\Framework\Attributes\Route;
@@ -24,7 +23,6 @@ final readonly class PerformanceController
public function __construct(
private MemoryMonitor $memoryMonitor,
private Clock $clock,
private AdminLayoutProcessor $layoutProcessor,
) {
}
@@ -73,12 +71,10 @@ final readonly class PerformanceController
'timestamp' => $this->clock->now()->format('Y-m-d H:i:s'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'performance',
metaData: new MetaData('Performance-Daten', 'Performance-Daten'),
data: $finalData
data: $data
);
}

View File

@@ -4,7 +4,6 @@ declare(strict_types=1);
namespace App\Application\Admin\System;
use App\Application\Admin\Service\AdminLayoutProcessor;
use App\Application\Admin\System\Service\PhpInfoService;
use App\Framework\Admin\Attributes\AdminPage;
use App\Framework\Admin\Attributes\AdminSection;
@@ -19,7 +18,6 @@ final readonly class PhpInfoController
{
public function __construct(
private PhpInfoService $phpInfoService,
private AdminLayoutProcessor $layoutProcessor,
private Clock $clock,
) {
}
@@ -56,12 +54,10 @@ final readonly class PhpInfoController
'current_year' => $this->clock->now()->format('Y'),
];
$finalData = $this->layoutProcessor->processLayoutFromArray($data);
return new ViewResult(
template: 'phpinfo',
metaData: new MetaData('PHP Information', 'PHP Information and Configuration'),
data: $finalData
data: $data
);
}
}