Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion resources/lang/en/data-synchronize.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand All @@ -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',
],
],
];
106 changes: 64 additions & 42 deletions resources/views/export.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,60 +15,82 @@ class="data-synchronize-export-form"
<x-core::card.title>
{{ $exporter->getHeading() }}
</x-core::card.title>
<x-core::card.subtitle class="ms-3">
{{ trans('packages/data-synchronize::data-synchronize.export.form.total', ['total' => $exporter->getTotal(), 'name' => $exporter->getLabel()]) }}
</x-core::card.subtitle>
</x-core::card.header>
@endif

<x-core::card.body>
<div>
@if($exporter->allColumnsIsDisabled())
<x-core::form.label>
{!! BaseHelper::clean(trans(
'packages/data-synchronize::data-synchronize.export.form.all_columns_disabled',
['columns' => Arr::join(array_map(fn ($column) => "<strong>{$column->getLabel()}</strong>", $exporter->getColumns()), ', ')]
)) !!}
</x-core::form.label>
@else
<x-core::form.label>
{{ trans('packages/data-synchronize::data-synchronize.export.form.columns') }}
<a href="javascript:void(0)" class="ms-2 text-primary" data-bb-toggle="check-all" data-bb-target=".export-column">Check all</a>
</x-core::form.label>
@if($exporter->hasDataToExport())
@php
$countersCount = count($exporter->getCounters());
@endphp

<div @class(['row row-cols-1', 'row-cols-sm-2 row-cols-lg-3' => count($exporter->getColumns()) > 6])>
@foreach ($exporter->getColumns() as $column)
<x-core::form-group>
<x-core::form.checkbox
class="export-column"
name="columns[]"
:value="$column->getName()"
:label="$column->getLabel()"
:disabled="$column->isDisabled()"
checked
/>
</x-core::form-group>
@endforeach
@if($countersCount)
<div class="mb-5">
<div @class(['row g-3', 'row-cols-2' => $countersCount > 1, 'row-cols-sm-3' => $countersCount > 2, 'row-cols-lg-4' => $countersCount > 3])>
@foreach($exporter->getCounters() as $counter)
<div class="col">
<div class="text-center bg-body-tertiary rounded p-3">
<h3 class="text-muted mb-2">{{ $counter->getLabel() }}</h3>
<div class="fs-1 fw-bold">{{ $counter->getValue() }}</div>
</div>
</div>
@endforeach
</div>
</div>
@endif
</div>

<x-core::form.radio-list
:label="trans('packages/data-synchronize::data-synchronize.export.form.format')"
name="format"
:options="[
<div>
@if($exporter->allColumnsIsDisabled())
<x-core::form.label>
{!! BaseHelper::clean(trans(
'packages/data-synchronize::data-synchronize.export.form.all_columns_disabled',
['columns' => Arr::join(array_map(fn ($column) => "<strong>{$column->getLabel()}</strong>", $exporter->getColumns()), ', ')]
)) !!}
</x-core::form.label>
@else
<x-core::form.label>
{{ trans('packages/data-synchronize::data-synchronize.export.form.columns') }}
<a href="javascript:void(0)" class="ms-2 text-primary" data-bb-toggle="check-all" data-bb-target=".export-column">Check all</a>
</x-core::form.label>

<div @class(['row row-cols-1', 'row-cols-sm-2 row-cols-lg-3' => count($exporter->getColumns()) > 6])>
@foreach ($exporter->getColumns() as $column)
<x-core::form-group>
<x-core::form.checkbox
class="export-column"
name="columns[]"
:value="$column->getName()"
:label="$column->getLabel()"
:disabled="$column->isDisabled()"
checked
/>
</x-core::form-group>
@endforeach
</div>
@endif
</div>

<x-core::form.radio-list
:label="trans('packages/data-synchronize::data-synchronize.export.form.format')"
name="format"
:options="[
'csv' => 'CSV',
'xlsx' => 'Excel',
]"
value="csv"
>
</x-core::form.radio-list>
value="csv"
>
</x-core::form.radio-list>
@else
{!! $exporter->getEmptyStateContent() !!}
@endif
</x-core::card.body>
<x-core::card.footer>
<x-core::button type="submit" color="primary" :disabled="$exporter->getTotal() === 0">
{{ trans('packages/data-synchronize::data-synchronize.export.form.export_button') }}
</x-core::button>
</x-core::card.footer>
@if($exporter->hasDataToExport())
<x-core::card.footer>
<x-core::button type="submit" color="primary">
{{ trans('packages/data-synchronize::data-synchronize.export.form.export_button') }}
</x-core::button>
</x-core::card.footer>
@endif
</x-core::card>
</x-core::form>
@stop
13 changes: 13 additions & 0 deletions resources/views/partials/empty-state.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<x-core::empty-state
:$title
:subtitle="$description"
:$icon
>
@if($actionLabel)
<x-slot:action>
<x-core::button tag="a" :href="$actionUrl" color="primary" icon="ti ti-arrow-left">
{{ $actionLabel }}
</x-core::button>
</x-slot:action>
@endif
</x-core::empty-state>
2 changes: 1 addition & 1 deletion routes/web.php
Original file line number Diff line number Diff line change
Expand Up @@ -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'])
Expand Down
47 changes: 47 additions & 0 deletions src/Concerns/Exporter/HasEmptyState.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace Botble\DataSynchronize\Concerns\Exporter;

use Illuminate\Contracts\View\View;

trait HasEmptyState
{
public function getEmptyStateTitle(): string
{
return trans('packages/data-synchronize::data-synchronize.export.empty_state.title');
}

public function getEmptyStateDescription(): ?string
{
return trans('packages/data-synchronize::data-synchronize.export.empty_state.description');
}

public function getEmptyStateIcon(): string
{
return 'ti ti-mood-empty';
}

public function getEmptyStateActionLabel(): ?string
{
return trans(
'packages/data-synchronize::data-synchronize.export.empty_state.back',
['page' => 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(),
]);
}
}
39 changes: 39 additions & 0 deletions src/Exporter/ExportCounter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

namespace Botble\DataSynchronize\Exporter;

class ExportCounter
{
protected string $value;

protected string $label;

public static function make(): static
{
return new static();
}

public function value(string $value): static
{
$this->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;
}
}
26 changes: 21 additions & 5 deletions src/Exporter/Exporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,6 +24,8 @@

abstract class Exporter implements FromCollection, ShouldAutoSize, WithColumnFormatting, WithEvents, WithHeadings, WithMapping
{
use HasEmptyState;

protected ?array $acceptedColumns = [];

protected string $format = Excel::XLSX;
Expand All @@ -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)
Expand All @@ -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(
Expand All @@ -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());
Expand Down
2 changes: 1 addition & 1 deletion src/Http/Controllers/ExportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion src/Http/Controllers/ImportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion src/Providers/DataSynchronizeServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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',
]);
});

Expand Down