From d941ef562ecd558e40442db16b807ecd5a9ccca9 Mon Sep 17 00:00:00 2001 From: Abdelrahman Saeed Elhassan Yousif Date: Fri, 9 Aug 2024 14:14:50 +0200 Subject: [PATCH 1/7] allow changing navigation group from plugin object --- src/EmailTemplatesPlugin.php | 13 +++++ src/Resources/EmailTemplateResource.php | 57 ++++++++++---------- src/Resources/EmailTemplateThemeResource.php | 3 +- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/EmailTemplatesPlugin.php b/src/EmailTemplatesPlugin.php index ac3f0de..b63f9a8 100644 --- a/src/EmailTemplatesPlugin.php +++ b/src/EmailTemplatesPlugin.php @@ -9,6 +9,8 @@ class EmailTemplatesPlugin implements Plugin { + public string $navigationGroup; + public static function make(): static { return app(static::class); @@ -24,6 +26,17 @@ public function getId(): string return 'filament-email-templates'; } + public function navigationGroup($navigationGroup): static + { + $this->navigationGroup = $navigationGroup; + return $this; + } + + public function getNavigationGroup(): string + { + return $this->navigationGroup ?? config('filament-email-templates.navigation.templates.group'); + } + public function register(Panel $panel): void { $panel->resources([ diff --git a/src/Resources/EmailTemplateResource.php b/src/Resources/EmailTemplateResource.php index 1f3709a..647949c 100644 --- a/src/Resources/EmailTemplateResource.php +++ b/src/Resources/EmailTemplateResource.php @@ -22,6 +22,7 @@ use Illuminate\View\View; use Visualbuilder\EmailTemplates\Contracts\CreateMailableInterface; use Visualbuilder\EmailTemplates\Contracts\FormHelperInterface; +use Visualbuilder\EmailTemplates\EmailTemplatesPlugin; use Visualbuilder\EmailTemplates\Models\EmailTemplate; use Visualbuilder\EmailTemplates\Resources\EmailTemplateResource\Pages; use Filament\Forms\Components\Radio; @@ -37,7 +38,7 @@ class EmailTemplateResource extends Resource public static function getNavigationGroup(): ?string { - return config('filament-email-templates.navigation.templates.group'); + return EmailTemplatesPlugin::get()->getNavigationGroup(); } public static function getNavigationSort(): ?int @@ -94,37 +95,37 @@ public static function form(Form $form): Form [ TextInput::make('key') ->afterStateUpdated( - fn (Set $set, ?string $state) => $set('key', Str::slug($state)) + fn(Set $set, ?string $state) => $set('key', Str::slug($state)) ) ->label(__('vb-email-templates::email-templates.form-fields-labels.key')) ->hint(__('vb-email-templates::email-templates.form-fields-labels.key-hint')) ->required() - ->unique(ignorable: fn ($record) => $record), + ->unique(ignorable: fn($record) => $record), Select::make('language') ->options($formHelper->getLanguageOptions()) ->default(config('filament-email-templates.default_locale')) ->searchable() ->allowHtml(), TextInput::make('from.email')->default(config('mail.from.address')) - ->label(__('vb-email-templates::email-templates.form-fields-labels.email-from')) - ->email(), + ->label(__('vb-email-templates::email-templates.form-fields-labels.email-from')) + ->email(), TextInput::make('from.name')->default(config('mail.from.name')) - ->label(__('vb-email-templates::email-templates.form-fields-labels.email-from-name')) - ->string(), + ->label(__('vb-email-templates::email-templates.form-fields-labels.email-from-name')) + ->string(), Select::make('view') - ->label(__('vb-email-templates::email-templates.form-fields-labels.template-view')) - ->options($templates) - ->default(current($templates)) - ->searchable() - ->required(), + ->label(__('vb-email-templates::email-templates.form-fields-labels.template-view')) + ->options($templates) + ->default(current($templates)) + ->searchable() + ->required(), Select::make(config('filament-email-templates.theme_table_name') . '_id') - ->label(__('vb-email-templates::email-templates.form-fields-labels.theme')) - ->relationship(name: 'theme', titleAttribute: 'name') - ->native(false) + ->label(__('vb-email-templates::email-templates.form-fields-labels.theme')) + ->relationship(name: 'theme', titleAttribute: 'name') + ->native(false) ] - ), + ), Grid::make(['default' => 1]) ->schema( @@ -141,7 +142,7 @@ public static function form(Form $form): Form ->hint(__('vb-email-templates::email-templates.form-fields-labels.title-hint')), TiptapEditor::make('content') - ->tools([]) + ->tools([]) ->label(__('vb-email-templates::email-templates.form-fields-labels.content')) ->profile('default') ->default("

Dear ##user.firstname##,

"), @@ -159,7 +160,7 @@ public static function form(Form $form): Form FileUpload::make('logo') ->label(__('vb-email-templates::email-templates.form-fields-labels.logo')) ->hint(__('vb-email-templates::email-templates.form-fields-labels.logo-hint')) - ->hidden(fn (Get $get) => $get('logo_type') !== 'browse_another') + ->hidden(fn(Get $get) => $get('logo_type') !== 'browse_another') ->directory(config('filament-email-templates.browsed_logo')) ->image(), @@ -167,7 +168,7 @@ public static function form(Form $form): Form ->label(__('vb-email-templates::email-templates.form-fields-labels.logo-url')) ->hint(__('vb-email-templates::email-templates.form-fields-labels.logo-url-hint')) ->placeholder('https://www.example.com/media/test.png') - ->hidden(fn (Get $get) => $get('logo_type') !== 'paste_url') + ->hidden(fn(Get $get) => $get('logo_type') !== 'paste_url') ->activeUrl() ->maxLength(191), ] @@ -205,7 +206,9 @@ public static function table(Table $table): Table Action::make('create-mail-class') ->label("Build Class") //Only show the button if the file does not exist - ->visible(function (EmailTemplate $record) {return ! $record->mailable_exists;}) + ->visible(function (EmailTemplate $record) { + return !$record->mailable_exists; + }) ->icon('heroicon-o-document-text') // ->action('createMailClass'), ->action(function (EmailTemplate $record) { @@ -216,16 +219,16 @@ public static function table(Table $table): Table ->iconColor($notify->icon_color) ->duration(10000) //Fix for bug where body hides the icon - ->body("".$notify->body."") + ->body("" . $notify->body . "") ->send(); }), Tables\Actions\ViewAction::make('Preview') ->icon('heroicon-o-magnifying-glass') - ->modalContent(fn (EmailTemplate $record): View => view( + ->modalContent(fn(EmailTemplate $record): View => view( 'vb-email-templates::forms.components.iframe', ['record' => $record], ))->form(null) - ->modalHeading(fn (EmailTemplate $record): string => 'Preview Email: '.$record->name) + ->modalHeading(fn(EmailTemplate $record): string => 'Preview Email: ' . $record->name) ->modalSubmitAction(false) ->modalCancelAction(false) ->slideOver(), @@ -269,7 +272,7 @@ public static function getEloquentQuery(): Builder public function handleLogo(array $data): array { - if($data['logo_type'] == "paste_url" && $data['logo_url']) { + if ($data['logo_type'] == "paste_url" && $data['logo_url']) { $data['logo'] = $data['logo_url']; } @@ -278,9 +281,9 @@ public function handleLogo(array $data): array public function handleLogoDelete($logo) { - if($logo && !Str::isUrl($logo)) { - $logoPath = storage_path('app/public/'.$logo); - if(File::exists($logoPath)) { + if ($logo && !Str::isUrl($logo)) { + $logoPath = storage_path('app/public/' . $logo); + if (File::exists($logoPath)) { File::delete($logoPath); } } diff --git a/src/Resources/EmailTemplateThemeResource.php b/src/Resources/EmailTemplateThemeResource.php index fb0068b..c63f93f 100644 --- a/src/Resources/EmailTemplateThemeResource.php +++ b/src/Resources/EmailTemplateThemeResource.php @@ -10,6 +10,7 @@ use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\SoftDeletingScope; +use Visualbuilder\EmailTemplates\EmailTemplatesPlugin; use Visualbuilder\EmailTemplates\Models\EmailTemplate; use Visualbuilder\EmailTemplates\Models\EmailTemplateTheme; use Visualbuilder\EmailTemplates\Resources\EmailTemplateThemeResource\Pages; @@ -22,7 +23,7 @@ class EmailTemplateThemeResource extends Resource public static function getNavigationGroup(): ?string { - return config('filament-email-templates.navigation.themes.group'); + return EmailTemplatesPlugin::get()->getNavigationGroup(); } public static function getNavigationSort(): ?int From b7a63e19e204648cf1daf4caa2eb280d69e4085b Mon Sep 17 00:00:00 2001 From: Abdelrahman Saeed Elhassan Yousif Date: Sat, 10 Aug 2024 02:17:50 +0200 Subject: [PATCH 2/7] changing email template key to selectable options --- config/filament-email-templates.php | 142 +++++++++++++----------- src/Resources/EmailTemplateResource.php | 3 +- 2 files changed, 78 insertions(+), 67 deletions(-) diff --git a/config/filament-email-templates.php b/config/filament-email-templates.php index f34366c..1add6e1 100644 --- a/config/filament-email-templates.php +++ b/config/filament-email-templates.php @@ -4,14 +4,14 @@ /** * If you wish to customise the table name change this before migration */ - 'table_name' => 'vb_email_templates', - 'theme_table_name' => 'vb_email_templates_themes', + 'table_name' => 'vb_email_templates', + 'theme_table_name' => 'vb_email_templates_themes', /** * Mail Classes will be generated into this directory */ - "mailable_directory" => 'Mail/Visualbuilder/EmailTemplates', + "mailable_directory" => 'Mail/Visualbuilder/EmailTemplates', /** * If you want to use your own token helper replace this class @@ -31,110 +31,120 @@ * } */ - 'tokenHelperClass' => \Visualbuilder\EmailTemplates\DefaultTokenHelper::class, + 'tokenHelperClass' => \Visualbuilder\EmailTemplates\DefaultTokenHelper::class, /** * Some tokens don't belong to a model. These $models->token will be checked */ - 'known_tokens' => [ - 'tokenUrl', - 'verificationUrl', - 'message' - ], + 'known_tokens' => [ + 'tokenUrl', + 'verificationUrl', + 'message' + ], /** * Admin panel navigation options */ - 'navigation' => [ - 'templates' => [ - 'sort' => 10, - 'label' => 'Email Templates', - 'icon' => 'heroicon-o-envelope', - 'group' => 'Content', - 'cluster' => false, - 'position' => \Filament\Pages\SubNavigationPosition::Top - ], - 'themes' => [ - 'sort' => 20, - 'label' => 'Email Template Themes', - 'icon' => 'heroicon-o-paint-brush', - 'group' => 'Content', - 'cluster' => false, - 'position' => \Filament\Pages\SubNavigationPosition::Top - ], + 'navigation' => [ + 'templates' => [ + 'sort' => 10, + 'label' => 'Email Templates', + 'icon' => 'heroicon-o-envelope', + 'group' => 'Content', + 'cluster' => false, + 'position' => \Filament\Pages\SubNavigationPosition::Top + ], + 'themes' => [ + 'sort' => 20, + 'label' => 'Email Template Themes', + 'icon' => 'heroicon-o-paint-brush', + 'group' => 'Content', + 'cluster' => false, + 'position' => \Filament\Pages\SubNavigationPosition::Top ], + ], //Email templates will be copied to resources/views/vendor/vb-email-templates/email //default.blade.php is base view that can be customised below - 'default_view' => 'default', + 'default_view' => 'default', - 'template_view_path' => 'vb-email-templates::email', + 'template_view_path' => 'vb-email-templates::email', + + 'template_keys' => [ + 'user-welcome'=>'User Welcome Email', + 'user-request-reset'=>'User Request Password Reset', + 'user-password-reset-success'=>'User Password Reset', + 'user-locked-out'=>'User Account Locked Out', + 'user-verify-email'=>'User Verify Email', + 'user-verified'=>'User Verified', + 'user-login'=>'User Logged In', + ], //Default Logo - 'logo' => 'media/email-templates/logo.png', + 'logo' => 'media/email-templates/logo.png', //Browsed Logo - 'browsed_logo' => 'media/email-templates/logos', + 'browsed_logo' => 'media/email-templates/logos', //Logo size in pixels -> 200 pixels high is plenty big enough. - 'logo_width' => '500', - 'logo_height' => '126', + 'logo_width' => '500', + 'logo_height' => '126', //Content Width in Pixels - 'content_width' => '600', + 'content_width' => '600', //Contact details included in default email templates - 'customer-services' => ['email' => 'support@yourcompany.com', - 'phone' => '+441273 455702'], + 'customer-services' => ['email' => 'support@yourcompany.com', + 'phone' => '+441273 455702'], //Footer Links - 'links' => [ - ['name' => 'Website', 'url' => 'https://yourwebsite.com', 'title' => 'Goto website'], - ['name' => 'Privacy Policy', 'url' => 'https://yourwebsite.com/privacy-policy', 'title' => 'View Privacy Policy'], - ], + 'links' => [ + ['name' => 'Website', 'url' => 'https://yourwebsite.com', 'title' => 'Goto website'], + ['name' => 'Privacy Policy', 'url' => 'https://yourwebsite.com/privacy-policy', 'title' => 'View Privacy Policy'], + ], //Options for alternative languages //Note that Laravel default locale is just 'en' you can use this but //we are being more specific to cater for English vs USA languages - 'default_locale' => 'en_GB', + 'default_locale' => 'en_GB', //These will be included in the language picker when editing an email template - 'languages' => [ - 'en_GB' => ['display' => 'British', 'flag-icon' => 'gb'], - 'en_US' => ['display' => 'USA', 'flag-icon' => 'us'], - 'es' => ['display' => 'Español', 'flag-icon' => 'es'], - 'fr' => ['display' => 'Français', 'flag-icon' => 'fr'], - 'pt' => ['display' => 'Brasileiro', 'flag-icon' => 'br'], - 'in' => ['display' => 'Hindi', 'flag-icon' => 'in'], - ], + 'languages' => [ + 'en_GB' => ['display' => 'British', 'flag-icon' => 'gb'], + 'en_US' => ['display' => 'USA', 'flag-icon' => 'us'], + 'es' => ['display' => 'Español', 'flag-icon' => 'es'], + 'fr' => ['display' => 'Français', 'flag-icon' => 'fr'], + 'pt' => ['display' => 'Brasileiro', 'flag-icon' => 'br'], + 'in' => ['display' => 'Hindi', 'flag-icon' => 'in'], + ], //Notifiable Models who can receive emails - 'recipients' => [ - App\Models\User::class, - ], + 'recipients' => [ + App\Models\User::class, + ], /** * Allowed config keys which can be inserted into email templates * eg use ##config.app.name## in the email template for automatic replacement. */ - 'config_keys' => [ - 'app.name', - 'app.url', - 'email-templates.customer-services' - // Add other safe config keys here. - // We don't want to allow all config keys they may contain secret keys or credentials - ], + 'config_keys' => [ + 'app.name', + 'app.url', + 'email-templates.customer-services' + // Add other safe config keys here. + // We don't want to allow all config keys they may contain secret keys or credentials + ], //Most built-in emails can be automatically sent with minimal setup, //except "request password reset" requires a function in the User's model. See readme.md for details - 'send_emails' => [ - 'new_user_registered' => true, - 'verification' => true, - 'user_verified' => true, - 'login' => true, - 'password_reset_success' => true, - 'locked_out' => true, - ], + 'send_emails' => [ + 'new_user_registered' => true, + 'verification' => true, + 'user_verified' => true, + 'login' => true, + 'password_reset_success' => true, + 'locked_out' => true, + ], ]; diff --git a/src/Resources/EmailTemplateResource.php b/src/Resources/EmailTemplateResource.php index 647949c..bb74a9f 100644 --- a/src/Resources/EmailTemplateResource.php +++ b/src/Resources/EmailTemplateResource.php @@ -93,10 +93,11 @@ public static function form(Form $form): Form Grid::make(['default' => 1, 'sm' => 1, 'md' => 2]) ->schema( [ - TextInput::make('key') + Select::make('key') ->afterStateUpdated( fn(Set $set, ?string $state) => $set('key', Str::slug($state)) ) + ->options(config('filament-email-templates.template_keys')) ->label(__('vb-email-templates::email-templates.form-fields-labels.key')) ->hint(__('vb-email-templates::email-templates.form-fields-labels.key-hint')) ->required() From 6282c9bf868bb1f9e9b74ae8dafcc8fcd1c74059 Mon Sep 17 00:00:00 2001 From: Abdelrahman Saeed Elhassan Yousif Date: Sat, 10 Aug 2024 02:25:42 +0200 Subject: [PATCH 3/7] let options to be translated --- src/Resources/EmailTemplateResource.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Resources/EmailTemplateResource.php b/src/Resources/EmailTemplateResource.php index bb74a9f..914b209 100644 --- a/src/Resources/EmailTemplateResource.php +++ b/src/Resources/EmailTemplateResource.php @@ -97,7 +97,13 @@ public static function form(Form $form): Form ->afterStateUpdated( fn(Set $set, ?string $state) => $set('key', Str::slug($state)) ) - ->options(config('filament-email-templates.template_keys')) + ->options(function () { + $option = []; + foreach (config('filament-email-templates.template_keys') as $key => $value) { + $option[$value] = __($value); + } + return $option; + }) ->label(__('vb-email-templates::email-templates.form-fields-labels.key')) ->hint(__('vb-email-templates::email-templates.form-fields-labels.key-hint')) ->required() From 8770b2ddceaeacfca6ab15f2c938413031988c1d Mon Sep 17 00:00:00 2001 From: Abdelrahman Saeed Elhassan Yousif Date: Sat, 10 Aug 2024 02:28:21 +0200 Subject: [PATCH 4/7] let options to be translated --- src/Resources/EmailTemplateResource.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Resources/EmailTemplateResource.php b/src/Resources/EmailTemplateResource.php index 914b209..ea07163 100644 --- a/src/Resources/EmailTemplateResource.php +++ b/src/Resources/EmailTemplateResource.php @@ -98,11 +98,11 @@ public static function form(Form $form): Form fn(Set $set, ?string $state) => $set('key', Str::slug($state)) ) ->options(function () { - $option = []; + $options = []; foreach (config('filament-email-templates.template_keys') as $key => $value) { - $option[$value] = __($value); + $options[$key] = __($value); } - return $option; + return $options; }) ->label(__('vb-email-templates::email-templates.form-fields-labels.key')) ->hint(__('vb-email-templates::email-templates.form-fields-labels.key-hint')) From 463546232a1e213f88970900592980f1dae5d95e Mon Sep 17 00:00:00 2001 From: Abdelrahman Saeed Elhassan Yousif Date: Sat, 10 Aug 2024 02:56:32 +0200 Subject: [PATCH 5/7] allow empty template field --- src/Models/EmailTemplate.php | 64 ++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/Models/EmailTemplate.php b/src/Models/EmailTemplate.php index 9fa757f..13f8069 100644 --- a/src/Models/EmailTemplate.php +++ b/src/Models/EmailTemplate.php @@ -41,16 +41,16 @@ class EmailTemplate extends Model * @var array */ protected $fillable = [ - 'from', - 'key', - 'name', - 'view', - 'subject', - 'title', - 'preheader', - 'content', - 'language', - 'logo', + 'from', + 'key', + 'name', + 'view', + 'subject', + 'title', + 'preheader', + 'content', + 'language', + 'logo', ]; @@ -58,10 +58,10 @@ class EmailTemplate extends Model * @var string[] */ protected $casts = [ - 'deleted_at' => 'datetime:Y-m-d H:i:s', - 'created_at' => 'datetime:Y-m-d H:i:s', - 'updated_at' => 'datetime:Y-m-d H:i:s', - 'from' => 'array', + 'deleted_at' => 'datetime:Y-m-d H:i:s', + 'created_at' => 'datetime:Y-m-d H:i:s', + 'updated_at' => 'datetime:Y-m-d H:i:s', + 'from' => 'array', ]; /** * @var string[] @@ -93,9 +93,9 @@ public static function findEmailByKey($key, $language = null) //For multi site domains this key will need to include the site_id return Cache::remember($cacheKey, now()->addMinutes(60), function () use ($key, $language) { return self::query() - ->language($language ?? config('filament-email-templates.default_locale')) - ->where("key", $key) - ->firstOrFail(); + ->language($language ?? config('filament-email-templates.default_locale')) + ->where("key", $key) + ->firstOrFail(); }); } @@ -162,13 +162,13 @@ public function getEmailPreviewData() $models = self::createEmailPreviewData(); return [ - 'user' => $models->user, - 'content' => TokenHelper::replace($this->content, $models), - 'subject' => TokenHelper::replace($this->subject, $models), - 'preHeaderText' => TokenHelper::replace($this->preheader, $models), - 'title' => TokenHelper::replace($this->title, $models), - 'theme' => $this->theme->colours, - 'logo' => $this->logo, + 'user' => $models->user, + 'content' => TokenHelper::replace($this->content ?? '', $models), + 'subject' => TokenHelper::replace($this->subject ?? '', $models), + 'preHeaderText' => TokenHelper::replace($this->preheader ?? '', $models), + 'title' => TokenHelper::replace($this->title ?? '', $models), + 'theme' => $this->theme->colours, + 'logo' => $this->logo, ]; } @@ -177,7 +177,7 @@ public function getEmailPreviewData() */ public static function createEmailPreviewData() { - $models = (object) []; + $models = (object)[]; $userModel = config('filament-email-templates.recipients')[0]; //Setup some data for previewing email template @@ -195,7 +195,7 @@ public static function createEmailPreviewData() /** * Efficient method to return requested template locale or default language template in one query * - * @param Builder $query + * @param Builder $query * @param $language * * @return Builder @@ -205,10 +205,10 @@ public function scopeLanguage(Builder $query, $language) $languages = [$language, config('filament-email-templates.default_locale')]; return $query->whereIn('language', $languages) - ->orderByRaw( - "(CASE WHEN language = ? THEN 1 ELSE 2 END)", - [$language] - ); + ->orderByRaw( + "(CASE WHEN language = ? THEN 1 ELSE 2 END)", + [$language] + ); } /** @@ -217,7 +217,7 @@ public function scopeLanguage(Builder $query, $language) public function viewPath(): Attribute { return new Attribute( - get: fn () => config('filament-email-templates.template_view_path').'.'.$this->view + get: fn() => config('filament-email-templates.template_view_path') . '.' . $this->view ); } @@ -227,7 +227,7 @@ public function viewPath(): Attribute public function getMailableExistsAttribute(): bool { $className = Str::studly($this->key); - $filePath = app_path(config('filament-email-templates.mailable_directory')."/{$className}.php"); + $filePath = app_path(config('filament-email-templates.mailable_directory') . "/{$className}.php"); return File::exists($filePath); } From 417784d66404930af43889b36b690623ccea5089 Mon Sep 17 00:00:00 2001 From: Abdelrahman Saeed Elhassan Yousif Date: Sat, 10 Aug 2024 03:17:04 +0200 Subject: [PATCH 6/7] allow reordering templates --- database/migrations/create_email_templates_table.php.stub | 1 + src/Models/EmailTemplate.php | 1 + src/Resources/EmailTemplateResource.php | 6 ++++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/database/migrations/create_email_templates_table.php.stub b/database/migrations/create_email_templates_table.php.stub index 540b00f..8e94869 100644 --- a/database/migrations/create_email_templates_table.php.stub +++ b/database/migrations/create_email_templates_table.php.stub @@ -29,6 +29,7 @@ return new class extends Migration $table->string('title', 50)->nullable()->comment('First line of email h1 string'); $table->text('content')->nullable(); $table->string('logo', 191)->nullable(); + $table->integer('ordering')->nullable(); $table->timestamps(); $table->softDeletes(); $table->unique(['key', 'language']); diff --git a/src/Models/EmailTemplate.php b/src/Models/EmailTemplate.php index 13f8069..bba20e6 100644 --- a/src/Models/EmailTemplate.php +++ b/src/Models/EmailTemplate.php @@ -51,6 +51,7 @@ class EmailTemplate extends Model 'content', 'language', 'logo', + 'ordering', ]; diff --git a/src/Resources/EmailTemplateResource.php b/src/Resources/EmailTemplateResource.php index ea07163..8a58053 100644 --- a/src/Resources/EmailTemplateResource.php +++ b/src/Resources/EmailTemplateResource.php @@ -190,7 +190,9 @@ public static function form(Form $form): Form public static function table(Table $table): Table { - return $table->columns( + return $table + ->query(EmailTemplate::query()->orderBy('ordering')) + ->columns( [ TextColumn::make('id'), TextColumn::make('name') @@ -255,7 +257,7 @@ public static function table(Table $table): Table Tables\Actions\ForceDeleteBulkAction::make(), Tables\Actions\RestoreBulkAction::make(), ] - ); + )->reorderable('ordering'); } public static function getPages(): array From 37cf7a159ca5cd6e56fa3228a928d3ffe05c5dd0 Mon Sep 17 00:00:00 2001 From: Abdelrahman Saeed Elhassan Yousif Date: Sat, 10 Aug 2024 03:22:24 +0200 Subject: [PATCH 7/7] adding back action --- .../EmailTemplateResource/Pages/EditEmailTemplate.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Resources/EmailTemplateResource/Pages/EditEmailTemplate.php b/src/Resources/EmailTemplateResource/Pages/EditEmailTemplate.php index d5c9f0b..54f14da 100644 --- a/src/Resources/EmailTemplateResource/Pages/EditEmailTemplate.php +++ b/src/Resources/EmailTemplateResource/Pages/EditEmailTemplate.php @@ -18,7 +18,10 @@ class EditEmailTemplate extends EditRecord protected function getActions(): array { return [ - Actions\ViewAction::make()->label('Preview')->modalContent(fn (EmailTemplate $record): View => view( + Actions\Action::make('back')->label(__('Back')) + ->url(EmailTemplateResource::getUrl()) + , + Actions\ViewAction::make()->label(__('Preview'))->modalContent(fn (EmailTemplate $record): View => view( 'vb-email-templates::forms.components.iframe', ['record' => $record], ))->form(null),