From 81f35a600d0b6442fc0064af85588554e4db0146 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Fri, 26 Apr 2024 15:43:58 +0700 Subject: [PATCH] feat: Export counter --- resources/lang/en/data-synchronize.php | 7 +- resources/views/export.blade.php | 106 +++++++++++------- .../views/partials/empty-state.blade.php | 13 +++ routes/web.php | 2 +- src/Concerns/Exporter/HasEmptyState.php | 47 ++++++++ src/Exporter/ExportCounter.php | 39 +++++++ src/Exporter/Exporter.php | 26 ++++- src/Http/Controllers/ExportController.php | 2 +- src/Http/Controllers/ImportController.php | 2 +- .../DataSynchronizeServiceProvider.php | 2 +- 10 files changed, 194 insertions(+), 52 deletions(-) create mode 100644 resources/views/partials/empty-state.blade.php create mode 100644 src/Concerns/Exporter/HasEmptyState.php create mode 100644 src/Exporter/ExportCounter.php diff --git a/resources/lang/en/data-synchronize.php b/resources/lang/en/data-synchronize.php index 6f2a195..adce915 100644 --- a/resources/lang/en/data-synchronize.php +++ b/resources/lang/en/data-synchronize.php @@ -42,7 +42,6 @@ 'heading' => 'Export :label', 'form' => [ - 'total' => 'Total :total :name', 'all_columns_disabled' => 'Following columns will be exported: :columns.', 'columns' => 'Columns', 'format' => 'Format', @@ -51,5 +50,11 @@ 'success_message' => 'Exported successfully.', 'error_message' => 'Export failed.', + + 'empty_state' => [ + 'title' => 'No data to export', + 'description' => 'Looks like there is no data to export.', + 'back' => 'Back to :page', + ], ], ]; diff --git a/resources/views/export.blade.php b/resources/views/export.blade.php index e20cb55..8ecdda3 100644 --- a/resources/views/export.blade.php +++ b/resources/views/export.blade.php @@ -15,60 +15,82 @@ class="data-synchronize-export-form" {{ $exporter->getHeading() }} - - {{ trans('packages/data-synchronize::data-synchronize.export.form.total', ['total' => $exporter->getTotal(), 'name' => $exporter->getLabel()]) }} - @endif -
- @if($exporter->allColumnsIsDisabled()) - - {!! BaseHelper::clean(trans( - 'packages/data-synchronize::data-synchronize.export.form.all_columns_disabled', - ['columns' => Arr::join(array_map(fn ($column) => "{$column->getLabel()}", $exporter->getColumns()), ', ')] - )) !!} - - @else - - {{ trans('packages/data-synchronize::data-synchronize.export.form.columns') }} - Check all - + @if($exporter->hasDataToExport()) + @php + $countersCount = count($exporter->getCounters()); + @endphp -
count($exporter->getColumns()) > 6])> - @foreach ($exporter->getColumns() as $column) - - - - @endforeach + @if($countersCount) +
+
$countersCount > 1, 'row-cols-sm-3' => $countersCount > 2, 'row-cols-lg-4' => $countersCount > 3])> + @foreach($exporter->getCounters() as $counter) +
+
+

{{ $counter->getLabel() }}

+
{{ $counter->getValue() }}
+
+
+ @endforeach +
@endif -
- {$column->getLabel()}", $exporter->getColumns()), ', ')] + )) !!} + + @else + + {{ trans('packages/data-synchronize::data-synchronize.export.form.columns') }} + Check all + + +
count($exporter->getColumns()) > 6])> + @foreach ($exporter->getColumns() as $column) + + + + @endforeach +
+ @endif +
+ + - + value="csv" + > + + @else + {!! $exporter->getEmptyStateContent() !!} + @endif
- - - {{ trans('packages/data-synchronize::data-synchronize.export.form.export_button') }} - - + @if($exporter->hasDataToExport()) + + + {{ trans('packages/data-synchronize::data-synchronize.export.form.export_button') }} + + + @endif @stop diff --git a/resources/views/partials/empty-state.blade.php b/resources/views/partials/empty-state.blade.php new file mode 100644 index 0000000..dc8d6a2 --- /dev/null +++ b/resources/views/partials/empty-state.blade.php @@ -0,0 +1,13 @@ + + @if($actionLabel) + + + {{ $actionLabel }} + + + @endif + diff --git a/routes/web.php b/routes/web.php index 076c994..aca8bbb 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,7 +9,7 @@ AdminHelper::registerRoutes(function () { Route::group(['permission' => 'tools.data-synchronize'], function () { Route::get('tools/data-synchronize', [DataSynchronizeController::class, 'index']) - ->name('data-synchronize.tools.data-synchronize'); + ->name('tools.data-synchronize'); Route::prefix('data-synchronize')->name('data-synchronize.')->group(function () { Route::post('upload', [UploadController::class, '__invoke']) diff --git a/src/Concerns/Exporter/HasEmptyState.php b/src/Concerns/Exporter/HasEmptyState.php new file mode 100644 index 0000000..dbe4913 --- /dev/null +++ b/src/Concerns/Exporter/HasEmptyState.php @@ -0,0 +1,47 @@ + trans('packages/data-synchronize::data-synchronize.tools.export_import_data')] + ); + } + + public function getEmptyStateActionUrl(): string + { + return route('tools.data-synchronize'); + } + + public function getEmptyStateContent(): View|string + { + return view('packages/data-synchronize::partials.empty-state', [ + 'title' => $this->getEmptyStateTitle(), + 'description' => $this->getEmptyStateDescription(), + 'icon' => $this->getEmptyStateIcon(), + 'actionUrl' => $this->getEmptyStateActionUrl(), + 'actionLabel' => $this->getEmptyStateActionLabel(), + ]); + } +} diff --git a/src/Exporter/ExportCounter.php b/src/Exporter/ExportCounter.php new file mode 100644 index 0000000..9ae9d70 --- /dev/null +++ b/src/Exporter/ExportCounter.php @@ -0,0 +1,39 @@ +value = $value; + + return $this; + } + + public function label(string $label): static + { + $this->label = $label; + + return $this; + } + + public function getValue(): string + { + return $this->value; + } + + public function getLabel(): string + { + return $this->label; + } +} diff --git a/src/Exporter/Exporter.php b/src/Exporter/Exporter.php index a6b0461..40bd967 100644 --- a/src/Exporter/Exporter.php +++ b/src/Exporter/Exporter.php @@ -4,6 +4,7 @@ use Botble\Base\Facades\Assets; use Botble\Base\Facades\BaseHelper; +use Botble\DataSynchronize\Concerns\Exporter\HasEmptyState; use Botble\DataSynchronize\Enums\ExportColumnType; use Illuminate\Contracts\View\View; use Maatwebsite\Excel\Concerns\FromCollection; @@ -23,6 +24,8 @@ abstract class Exporter implements FromCollection, ShouldAutoSize, WithColumnFormatting, WithEvents, WithHeadings, WithMapping { + use HasEmptyState; + protected ?array $acceptedColumns = []; protected string $format = Excel::XLSX; @@ -34,6 +37,11 @@ abstract class Exporter implements FromCollection, ShouldAutoSize, WithColumnFor */ abstract public function columns(): array; + public function counters(): array + { + return []; + } + public function getLabel(): string { return str(static::class) @@ -44,11 +52,6 @@ public function getLabel(): string ->title(); } - public function getTotal(): int - { - return apply_filters('data_synchronize_exporter_total', $this->collection()->count(), $this); - } - public function getHeading(): string { return trans( @@ -57,6 +60,19 @@ public function getHeading(): string ); } + /** + * @return \Botble\DataSynchronize\Exporter\ExportCounter[] + */ + public function getCounters(): array + { + return apply_filters('data_synchronize_exporter_counters', $this->counters(), $this); + } + + public function hasDataToExport(): bool + { + return true; + } + public function headings(): array { return array_map(fn (ExportColumn $column) => $column->getLabel(), $this->getAcceptedColumns()); diff --git a/src/Http/Controllers/ExportController.php b/src/Http/Controllers/ExportController.php index b9d839e..c9f12b5 100644 --- a/src/Http/Controllers/ExportController.php +++ b/src/Http/Controllers/ExportController.php @@ -22,7 +22,7 @@ protected function breadcrumb(): Breadcrumb { return parent::breadcrumb() ->add(trans('core/base::layouts.tools')) - ->add(trans('packages/data-synchronize::data-synchronize.tools.export_import_data'), route('data-synchronize.tools.data-synchronize')); + ->add(trans('packages/data-synchronize::data-synchronize.tools.export_import_data'), route('tools.data-synchronize')); } public function index() diff --git a/src/Http/Controllers/ImportController.php b/src/Http/Controllers/ImportController.php index b1a17d0..332d235 100644 --- a/src/Http/Controllers/ImportController.php +++ b/src/Http/Controllers/ImportController.php @@ -19,7 +19,7 @@ protected function breadcrumb(): Breadcrumb { return parent::breadcrumb() ->add(trans('core/base::layouts.tools')) - ->add(trans('packages/data-synchronize::data-synchronize.tools.export_import_data'), route('data-synchronize.tools.data-synchronize')); + ->add(trans('packages/data-synchronize::data-synchronize.tools.export_import_data'), route('tools.data-synchronize')); } public function index() diff --git a/src/Providers/DataSynchronizeServiceProvider.php b/src/Providers/DataSynchronizeServiceProvider.php index 983d6b7..a34cbaf 100644 --- a/src/Providers/DataSynchronizeServiceProvider.php +++ b/src/Providers/DataSynchronizeServiceProvider.php @@ -70,7 +70,7 @@ protected function registerDashboardMenu(): self 'priority' => 9000, 'name' => 'packages/data-synchronize::data-synchronize.tools.export_import_data', 'icon' => 'ti ti-package-import', - 'route' => 'data-synchronize.tools.data-synchronize', + 'route' => 'tools.data-synchronize', ]); });