feat: Modalidades — novos campos de preview (tag, subtitle, comparação)
This commit is contained in:
@@ -24,6 +24,12 @@ class WeddingPackageForm
|
|||||||
->label('Número / tipo (ex.: 01 / COMPLETA)')
|
->label('Número / tipo (ex.: 01 / COMPLETA)')
|
||||||
->required()
|
->required()
|
||||||
->maxLength(255),
|
->maxLength(255),
|
||||||
|
TextInput::make('tag')
|
||||||
|
->label('Etiqueta curta (ex.: Assessoria completa)')
|
||||||
|
->maxLength(255),
|
||||||
|
TextInput::make('subtitle')
|
||||||
|
->label('Frase de apoio')
|
||||||
|
->maxLength(255),
|
||||||
Textarea::make('summary')
|
Textarea::make('summary')
|
||||||
->label('Resumo')
|
->label('Resumo')
|
||||||
->required()
|
->required()
|
||||||
@@ -44,6 +50,12 @@ class WeddingPackageForm
|
|||||||
->label('Texto do botão')
|
->label('Texto do botão')
|
||||||
->required()
|
->required()
|
||||||
->maxLength(255),
|
->maxLength(255),
|
||||||
|
TextInput::make('compare_heading')
|
||||||
|
->label('Comparação — título (leitura rápida)')
|
||||||
|
->maxLength(255),
|
||||||
|
TextInput::make('compare_summary')
|
||||||
|
->label('Comparação — resumo (leitura rápida)')
|
||||||
|
->maxLength(255),
|
||||||
TextInput::make('sort_order')
|
TextInput::make('sort_order')
|
||||||
->label('Ordem')
|
->label('Ordem')
|
||||||
->numeric()
|
->numeric()
|
||||||
|
|||||||
@@ -16,13 +16,17 @@ use Illuminate\Support\Carbon;
|
|||||||
/**
|
/**
|
||||||
* @property string $name
|
* @property string $name
|
||||||
* @property string $level
|
* @property string $level
|
||||||
|
* @property string|null $tag
|
||||||
|
* @property string|null $subtitle
|
||||||
* @property string $summary
|
* @property string $summary
|
||||||
* @property list<string> $scope_items
|
* @property list<string> $scope_items
|
||||||
* @property string $cta_label
|
* @property string $cta_label
|
||||||
|
* @property string|null $compare_heading
|
||||||
|
* @property string|null $compare_summary
|
||||||
* @property int $sort_order
|
* @property int $sort_order
|
||||||
* @property Carbon|null $published_at
|
* @property Carbon|null $published_at
|
||||||
*/
|
*/
|
||||||
#[Fillable(['name', 'level', 'summary', 'scope_items', 'cta_label', 'sort_order', 'published_at'])]
|
#[Fillable(['name', 'level', 'tag', 'subtitle', 'summary', 'scope_items', 'cta_label', 'compare_heading', 'compare_summary', 'sort_order', 'published_at'])]
|
||||||
#[UsePolicy(WeddingPackagePolicy::class)]
|
#[UsePolicy(WeddingPackagePolicy::class)]
|
||||||
class WeddingPackage extends Model
|
class WeddingPackage extends Model
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,9 +18,13 @@ class WeddingPackageFactory extends Factory
|
|||||||
return [
|
return [
|
||||||
'name' => fake()->unique()->words(2, true),
|
'name' => fake()->unique()->words(2, true),
|
||||||
'level' => 'Assessoria',
|
'level' => 'Assessoria',
|
||||||
|
'tag' => fake()->words(2, true),
|
||||||
|
'subtitle' => fake()->sentence(),
|
||||||
'summary' => fake()->sentence(),
|
'summary' => fake()->sentence(),
|
||||||
'scope_items' => [fake()->sentence()],
|
'scope_items' => [fake()->sentence()],
|
||||||
'cta_label' => 'Conversar sobre esta modalidade',
|
'cta_label' => 'Conversar sobre esta modalidade',
|
||||||
|
'compare_heading' => fake()->words(3, true),
|
||||||
|
'compare_summary' => fake()->sentence(),
|
||||||
'sort_order' => 0,
|
'sort_order' => 0,
|
||||||
'published_at' => null,
|
'published_at' => null,
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('wedding_packages', function (Blueprint $table): void {
|
||||||
|
$table->string('tag')->nullable();
|
||||||
|
$table->string('subtitle')->nullable();
|
||||||
|
$table->string('compare_heading')->nullable();
|
||||||
|
$table->string('compare_summary')->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('wedding_packages', function (Blueprint $table): void {
|
||||||
|
$table->dropColumn(['tag', 'subtitle', 'compare_heading', 'compare_summary']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -9,9 +9,9 @@ use Illuminate\Database\Seeder;
|
|||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wedding package modalities shown on the home page (03 — Amare Casamentos).
|
* Wedding package modalities shown on the home page (03 — Amare Casamentos)
|
||||||
* Copy is approved from the structural model preview (preview(1).html) and
|
* and the services page. Copy is approved from the structural model preview
|
||||||
* remains editable via the Filament resource.
|
* (preview(2).html) and remains editable via the Filament resource.
|
||||||
*/
|
*/
|
||||||
class WeddingPackagesSeeder extends Seeder
|
class WeddingPackagesSeeder extends Seeder
|
||||||
{
|
{
|
||||||
@@ -23,40 +23,55 @@ class WeddingPackagesSeeder extends Seeder
|
|||||||
[
|
[
|
||||||
'name' => 'Essenza',
|
'name' => 'Essenza',
|
||||||
'level' => '01 / COMPLETA',
|
'level' => '01 / COMPLETA',
|
||||||
'summary' => 'Para casais que desejam contar com a Amare desde o planejamento até a realização do casamento.',
|
'tag' => 'Assessoria completa',
|
||||||
|
'subtitle' => 'Do planejamento ao grande dia.',
|
||||||
|
'summary' => 'Para casais que desejam contar com a Amare desde o início ou ainda estão estruturando etapas importantes.',
|
||||||
'scope_items' => [
|
'scope_items' => [
|
||||||
'Planejamento e organização',
|
'Estruturação do planejamento',
|
||||||
'Gestão de etapas e prioridades',
|
'Cronogramas, prazos e prioridades',
|
||||||
'Acompanhamento de fornecedores',
|
'Orientação e gestão de fornecedores',
|
||||||
'Coordenação do grande dia',
|
'Alinhamento entre os envolvidos',
|
||||||
|
'Coordenação da execução',
|
||||||
],
|
],
|
||||||
'cta_label' => 'Quero conhecer a Essenza',
|
'cta_label' => 'Quero conhecer a Essenza',
|
||||||
|
'compare_heading' => 'Começar com a Amare',
|
||||||
|
'compare_summary' => 'Acompanhamento mais amplo ao longo do planejamento.',
|
||||||
'sort_order' => 1,
|
'sort_order' => 1,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'Conduzione',
|
'name' => 'Conduzione',
|
||||||
'level' => '02 / PARCIAL',
|
'level' => '02 / PARCIAL',
|
||||||
'summary' => 'Para quem já começou e deseja estruturar o que falta, organizar fornecedores e seguir com acompanhamento profissional.',
|
'tag' => 'Assessoria parcial',
|
||||||
|
'subtitle' => 'Para quem já começou e quer seguir acompanhado.',
|
||||||
|
'summary' => 'Para casais que já tomaram decisões e contrataram parte dos fornecedores, mas precisam estruturar o que falta.',
|
||||||
'scope_items' => [
|
'scope_items' => [
|
||||||
'Diagnóstico do planejamento',
|
'Diagnóstico do planejamento existente',
|
||||||
'Organização das pendências',
|
'Organização das pendências',
|
||||||
'Gestão dos próximos passos',
|
'Gestão dos fornecedores contratados',
|
||||||
'Coordenação do grande dia',
|
'Orientação para próximas decisões',
|
||||||
|
'Coordenação da execução',
|
||||||
],
|
],
|
||||||
'cta_label' => 'Quero conhecer a Conduzione',
|
'cta_label' => 'Quero conhecer a Conduzione',
|
||||||
|
'compare_heading' => 'Trazer a Amare para o caminho',
|
||||||
|
'compare_summary' => 'O planejamento existe, mas ainda há decisões e gestão pela frente.',
|
||||||
'sort_order' => 2,
|
'sort_order' => 2,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'name' => 'Grand Jour',
|
'name' => 'Grand Jour',
|
||||||
'level' => '03 / FINAL',
|
'level' => '03 / FINAL',
|
||||||
'summary' => 'Para casais que já planejaram o casamento e precisam de uma equipe para assumir alinhamentos e operação na reta final.',
|
'tag' => 'Assessoria final',
|
||||||
|
'subtitle' => 'O planejamento está pronto. Agora é hora de viver.',
|
||||||
|
'summary' => 'Para casais na reta final que precisam de uma equipe para assumir alinhamentos, cronograma e operação.',
|
||||||
'scope_items' => [
|
'scope_items' => [
|
||||||
'Imersão no planejamento existente',
|
'Imersão no planejamento existente',
|
||||||
'Alinhamento de fornecedores',
|
'Conferência das informações',
|
||||||
'Cronograma final',
|
'Alinhamento dos fornecedores',
|
||||||
|
'Organização do cronograma final',
|
||||||
'Gestão da operação do evento',
|
'Gestão da operação do evento',
|
||||||
],
|
],
|
||||||
'cta_label' => 'Quero conhecer a Grand Jour',
|
'cta_label' => 'Quero conhecer a Grand Jour',
|
||||||
|
'compare_heading' => 'Entregar a operação para a Amare',
|
||||||
|
'compare_summary' => 'O projeto está pronto e o foco passa a ser alinhamento e execução.',
|
||||||
'sort_order' => 3,
|
'sort_order' => 3,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user