diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 06bae08..2d6cae1 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -51,5 +51,8 @@
"label": "Vite Dev Server (Web)",
"onAutoForward": "notify"
}
- }
+ },
+ "runArgs": [
+ "--network=host"
+ ]
}
\ No newline at end of file
diff --git a/.devcontainer/docker-compose.dev.yml b/.devcontainer/docker-compose.dev.yml
index d205a7f..df7d4f4 100644
--- a/.devcontainer/docker-compose.dev.yml
+++ b/.devcontainer/docker-compose.dev.yml
@@ -62,6 +62,7 @@ services:
MYSQL_EXTRA_OPTIONS: --default-authentication-plugin=mysql_native_password
volumes:
- '../:/var/www/html'
+ - './php-upload-limits.ini:/etc/php/8.4/cli/conf.d/99-upload-limits.ini:ro'
networks:
- sail
depends_on:
diff --git a/.devcontainer/php-upload-limits.ini b/.devcontainer/php-upload-limits.ini
new file mode 100644
index 0000000..ed99be6
--- /dev/null
+++ b/.devcontainer/php-upload-limits.ini
@@ -0,0 +1,2 @@
+upload_max_filesize = 210M
+post_max_size = 210M
diff --git a/app/Livewire/Admin/Cms/DisplayMediaPicker.php b/app/Livewire/Admin/Cms/DisplayMediaPicker.php
index a223114..a187a5e 100644
--- a/app/Livewire/Admin/Cms/DisplayMediaPicker.php
+++ b/app/Livewire/Admin/Cms/DisplayMediaPicker.php
@@ -63,7 +63,7 @@ class DisplayMediaPicker extends Component
{
$this->validate([
'quickUploads' => 'nullable|array|max:5',
- 'quickUploads.*' => 'file|mimes:jpeg,jpg,png,gif,webp,mp4,webm,mov|max:51200',
+ 'quickUploads.*' => 'file|mimes:jpeg,jpg,png,gif,webp,mp4,webm,mov|max:204800',
]);
$service = app(DisplayMediaService::class);
diff --git a/config/livewire.php b/config/livewire.php
index 480b9ba..85df097 100644
--- a/config/livewire.php
+++ b/config/livewire.php
@@ -67,7 +67,7 @@ return [
'temporary_file_upload' => [
'disk' => null, // Example: 'local', 's3' | Default: 'default'
- 'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
+ 'rules' => ['required', 'file', 'max:204800'], // 200 MB
'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
diff --git a/docker-compose.yml b/docker-compose.yml
index 99b2968..e3a8b9e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -32,6 +32,7 @@ services:
REDIS_HOST: global-redis
volumes:
- '.:/var/www/html'
+ - './.devcontainer/php-upload-limits.ini:/etc/php/8.4/cli/conf.d/99-upload-limits.ini:ro'
networks:
- sail
- proxy
diff --git a/docs/Issues.md b/docs/Issues.md
new file mode 100644
index 0000000..b241ee8
--- /dev/null
+++ b/docs/Issues.md
@@ -0,0 +1 @@
+Wir werden die weiteren Tickets stehen
diff --git a/resources/views/livewire/admin/cms/display-dashboard.blade.php b/resources/views/livewire/admin/cms/display-dashboard.blade.php
index 33c3e9a..fb66326 100644
--- a/resources/views/livewire/admin/cms/display-dashboard.blade.php
+++ b/resources/views/livewire/admin/cms/display-dashboard.blade.php
@@ -171,7 +171,7 @@ $tabletStatus = computed(function () {
Es besteht aus drei Bereichen, die Sie über die Kacheln oben erreichen:
- - Mediathek – Zentrale Verwaltung aller Bilder und Videos fuer die Displays. Dateien bis 50 MB direkt hochladen oder groessere Videos als externe URL (Google Drive, OneDrive) einbinden.
+ - Mediathek - Zentrale Verwaltung aller Bilder und Videos fuer die Displays. Dateien bis 200 MB direkt hochladen oder groessere Videos als externe URL (Google Drive, OneDrive) einbinden.
- Versionen – Content-Pakete, die auf den Displays abgespielt werden. Jede Version hat einen bestimmten Typ und enthält passende Inhalte (Videos, Bilder oder Angebots-Slides).
- Displays – Die physischen Bildschirme im Showroom. Jedem Display werden eine oder mehrere Versionen als Playlist zugewiesen.
- Info-Tablet – Das Tablet an der Eingangstür des Showrooms. Hier verwalten Sie Öffnungszeiten, den aktuellen Store-Status und Hinweise für Besucher.
@@ -190,8 +190,8 @@ $tabletStatus = computed(function () {
Sie ist unabhängig von der Website-Mediathek (Flux CMS) und speziell auf die Anforderungen der Displays zugeschnitten.
- - Direkt-Upload: Bilder und Videos bis 50 MB direkt per Drag-and-drop oder Dateiauswahl hochladen. Die Dateien werden auf dem Server gespeichert und stehen sofort zur Verfügung.
- - Externe URLs: Für Videos über 50 MB (z. B. 4K-Showroom-Rundgänge) können Sie einen Freigabe-Link von Google Drive, OneDrive oder anderen Cloud-Diensten hinterlegen. Diese URL wird wie ein normales Medium in der Mediathek verwaltet und kann genauso in Versionen eingebunden werden.
+ - Direkt-Upload: Bilder und Videos bis 200 MB direkt per Drag-and-drop oder Dateiauswahl hochladen. Die Dateien werden auf dem Server gespeichert und stehen sofort zur Verfügung.
+ - Externe URLs: Für Videos über 200 MB (z. B. 4K-Showroom-Rundgänge) können Sie einen Freigabe-Link von Google Drive, OneDrive oder anderen Cloud-Diensten hinterlegen. Diese URL wird wie ein normales Medium in der Mediathek verwaltet und kann genauso in Versionen eingebunden werden.
- Sammlungen: Ordnen Sie Medien in Sammlungen wie immobilien, moebel oder brand, um bei vielen Dateien den Überblick zu behalten.
- Medienauswahl im Editor: Beim Bearbeiten einer Version erscheint ein „Aus Mediathek"-Button. Darüber öffnen Sie die Medienauswahl und können bestehende Medien wählen oder direkt neue hochladen.
diff --git a/resources/views/livewire/admin/cms/display-media-library.blade.php b/resources/views/livewire/admin/cms/display-media-library.blade.php
index b4a0917..5d49cc5 100644
--- a/resources/views/livewire/admin/cms/display-media-library.blade.php
+++ b/resources/views/livewire/admin/cms/display-media-library.blade.php
@@ -77,7 +77,7 @@ $stats = computed(fn () => [
$handleUploads = function () {
$this->validate([
'uploads' => 'nullable|array|max:10',
- 'uploads.*' => 'file|mimes:jpeg,jpg,png,gif,webp,mp4,webm,mov|max:51200',
+ 'uploads.*' => 'file|mimes:jpeg,jpg,png,gif,webp,mp4,webm,mov|max:204800',
]);
$service = app(DisplayMediaService::class);
@@ -208,7 +208,7 @@ $closeDetail = function () {
accept="image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm,.jpg,.jpeg,.png,.webp,.mp4,.webm,.mov">
@if (isset($uploads) && count($uploads) > 0)
diff --git a/resources/views/livewire/admin/cms/display-media-picker.blade.php b/resources/views/livewire/admin/cms/display-media-picker.blade.php
index 94e27be..693219f 100644
--- a/resources/views/livewire/admin/cms/display-media-picker.blade.php
+++ b/resources/views/livewire/admin/cms/display-media-picker.blade.php
@@ -57,7 +57,7 @@
accept="image/jpeg,image/png,image/gif,image/webp,video/mp4,video/webm,.jpg,.jpeg,.png,.webp,.mp4,.webm,.mov">
diff --git a/tests/Feature/DisplayMediaTest.php b/tests/Feature/DisplayMediaTest.php
index 2022b4e..53b1bcd 100644
--- a/tests/Feature/DisplayMediaTest.php
+++ b/tests/Feature/DisplayMediaTest.php
@@ -7,6 +7,7 @@ use App\Models\User;
use App\Services\DisplayMediaService;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
+use Livewire\Volt\Volt;
use Spatie\Permission\Models\Role;
beforeEach(function () {
@@ -128,7 +129,7 @@ it('stores an uploaded file', function () {
->and($media->collection)->toBe('immobilien')
->and($media->path)->not->toBeNull();
- Storage::disk('public')->assertExists($media->path);
+ expect(Storage::disk('public')->exists($media->path))->toBeTrue();
});
it('stores a video upload', function () {
@@ -141,6 +142,25 @@ it('stores a video upload', function () {
->and($media->mime_type)->toBe('video/mp4');
});
+it('accepts display media videos up to 200 mb', function () {
+ $file = UploadedFile::fake()->create('showroom.mp4', 204800, 'video/mp4');
+
+ Volt::test('admin.cms.display-media-library')
+ ->set('uploads', [$file])
+ ->call('handleUploads')
+ ->assertHasNoErrors();
+
+ $media = DisplayMedia::query()->first();
+
+ expect($media)->not->toBeNull()
+ ->and($media->filename)->toBe('showroom.mp4')
+ ->and($media->type)->toBe('video');
+});
+
+it('configures livewire temporary uploads up to 200 mb', function () {
+ expect(config('livewire.temporary_file_upload.rules'))->toContain('max:204800');
+});
+
it('creates media from external URL', function () {
$service = app(DisplayMediaService::class);
@@ -165,11 +185,11 @@ it('deletes uploaded media and its file', function () {
$media = $service->storeUpload($file);
$path = $media->path;
- Storage::disk('public')->assertExists($path);
+ expect(Storage::disk('public')->exists($path))->toBeTrue();
$service->delete($media);
- Storage::disk('public')->assertMissing($path);
+ expect(Storage::disk('public')->exists($path))->toBeFalse();
expect(DisplayMedia::find($media->id))->toBeNull();
});