Visual header, body, and footer composition screen.
* Drag-and-drop section ordering with automatic saving.
* Add existing reusable documents to regions.
* Remove placements without deleting documents.
* Create independent page-specific copies.
* Shared-document usage warnings.
* Document creation, duplication, deletion protection and filtering.
* Draft and published document states.
* Document and placement scheduling.
* Authenticated homepage preview.
* Draft sections displayed in preview with a clear draft marker.
* Content Composer added to the administration sidebar.
* Public rendering now respects:
* Publication status
* Future publication dates
* Expiry dates
* Placement start and end dates
* Enabled state
* Original Saasland homepage remains as the fallback when no composition exists.
This commit is contained in:
@@ -3,6 +3,7 @@ namespace Modules\Content\Console;
|
|||||||
|
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
use Modules\Content\Models\ContentDocument;
|
use Modules\Content\Models\ContentDocument;
|
||||||
use Modules\Content\Models\ContentType;
|
use Modules\Content\Models\ContentType;
|
||||||
use Modules\Content\Models\PageContent;
|
use Modules\Content\Models\PageContent;
|
||||||
@@ -14,6 +15,19 @@ final class InstallSaaslandContent extends Command
|
|||||||
|
|
||||||
public function handle(): int
|
public function handle(): int
|
||||||
{
|
{
|
||||||
|
$requiredTables = ['content_types', 'content_documents', 'page_content'];
|
||||||
|
$missingTables = array_values(array_filter(
|
||||||
|
$requiredTables,
|
||||||
|
static fn (string $table): bool => ! Schema::hasTable($table),
|
||||||
|
));
|
||||||
|
|
||||||
|
if ($missingTables !== []) {
|
||||||
|
$this->components->error('Content composition tables are missing: '.implode(', ', $missingTables).'.');
|
||||||
|
$this->components->info('Run php artisan migrate before installing the Saasland composition.');
|
||||||
|
|
||||||
|
return self::FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
DB::transaction(function (): void {
|
DB::transaction(function (): void {
|
||||||
if ($this->option('force')) PageContent::query()->where('page_key','home')->delete();
|
if ($this->option('force')) PageContent::query()->where('page_key','home')->delete();
|
||||||
$definitions = $this->definitions();
|
$definitions = $this->definitions();
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ final class WelcomeThemeViewTest extends TestCase
|
|||||||
{
|
{
|
||||||
$this->get('/')
|
$this->get('/')
|
||||||
->assertOk()
|
->assertOk()
|
||||||
->assertViewIs('stylist-theme-saasland::home');
|
->assertViewIs('stylist-theme-saasland::home')
|
||||||
|
->assertSee('Transform Your Business With Our SaaS Solution');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,14 @@
|
|||||||
@if($hasComposition)
|
@if($hasComposition)
|
||||||
{!! $contentRenderer->renderRegion($pageKey, 'body') !!}
|
{!! $contentRenderer->renderRegion($pageKey, 'body') !!}
|
||||||
@else
|
@else
|
||||||
@include('stylist-theme-saasland::legacy-home-content')
|
@include('stylist-theme-saasland::legacy-home-content', [
|
||||||
|
'enabled' => fn (string $key, bool $default = true) => filter_var($themeSettings[$key] ?? $default, FILTER_VALIDATE_BOOL),
|
||||||
|
'heroTitle' => filled($themeSettings['hero_title'] ?? null)
|
||||||
|
? $themeSettings['hero_title']
|
||||||
|
: 'Transform Your Business With Our SaaS Solution',
|
||||||
|
'heroText' => filled($themeSettings['hero_description'] ?? null)
|
||||||
|
? $themeSettings['hero_description']
|
||||||
|
: 'Streamline operations, boost productivity, and improve customer satisfaction with one connected platform built for modern teams.',
|
||||||
|
])
|
||||||
@endif
|
@endif
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
*
|
||||||
|
!data/
|
||||||
|
!.gitignore
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
|
|||||||
Reference in New Issue
Block a user