diff --git a/.gitattributes b/.gitattributes index 9e9519b..a6c1b34 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17,3 +17,14 @@ /UPGRADING.md export-ignore /phpstan.neon.dist export-ignore /phpstan-baseline.neon export-ignore +/images export-ignore +/package-lock.json export-ignore +/.idea export-ignore +/images export-ignore +/.prettierrc export-ignore +/.package-lock.json export-ignore +/package.json export-ignore +/postcss.config.js export-ignore +/tailwind.config.js export-ignore +/pint.json export-ignore +/phpunit.xml.dist export-ignore diff --git a/composer.json b/composer.json index 01c9e12..4bc4147 100644 --- a/composer.json +++ b/composer.json @@ -17,9 +17,8 @@ ], "require": { "php": "^8.0", - "filament/filament": "^2.0", - "spatie/laravel-package-tools": "^1.13.5", - "illuminate/contracts": "^9.0|^10.0" + "filament/filament": "^3.0", + "spatie/laravel-package-tools": "^1.13.5" }, "require-dev": { "laravel/pint": "^1.0", @@ -68,6 +67,6 @@ } } }, - "minimum-stability": "stable", + "minimum-stability": "dev", "prefer-stable": true } diff --git a/resources/dist/filament-table-repeater.css b/resources/dist/filament-table-repeater.css index ca1d42c..f07bc61 100644 --- a/resources/dist/filament-table-repeater.css +++ b/resources/dist/filament-table-repeater.css @@ -1 +1 @@ -.w-px{width:1px}.bg-gray-200\/50{background-color:rgba(229,231,235,.5)}.filament-table-repeater-component .choices input{min-width:100%!important}.filament-table-repeater-column.has-hidden-label label:not(.filament-forms-checkbox-list-component-option-label,.filament-forms-radio-component label,.filepond--drop-label label){position:static;width:auto;height:auto;padding:0;overflow:visible;clip:auto;white-space:normal;margin:0 0 .5rem;font-size:.875rem;line-height:1.25rem}@media (min-width:768px){.filament-table-repeater-column.has-hidden-label label:not(.filament-forms-checkbox-list-component-option-label,.filament-forms-radio-component label,.filepond--drop-label label){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}}@media (max-width:640px){.filament-table-repeater-component.break-point-sm table{display:block;width:100%}.filament-table-repeater-component.break-point-sm table thead,.filament-table-repeater-component.break-point-sm table thead th,.filament-table-repeater-component.break-point-sm table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-sm table tbody,.filament-table-repeater-component.break-point-sm table tbody td,.filament-table-repeater-component.break-point-sm table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-sm table tbody tr{padding:.5rem}}@media (max-width:768px){.filament-table-repeater-component.break-point-md table{display:block;width:100%}.filament-table-repeater-component.break-point-md table thead,.filament-table-repeater-component.break-point-md table thead th,.filament-table-repeater-component.break-point-md table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-md table tbody,.filament-table-repeater-component.break-point-md table tbody td,.filament-table-repeater-component.break-point-md table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-md table tbody tr{padding:.5rem}}@media (max-width:1024px){.filament-table-repeater-component.break-point-lg table{display:block;width:100%}.filament-table-repeater-component.break-point-lg table thead,.filament-table-repeater-component.break-point-lg table thead th,.filament-table-repeater-component.break-point-lg table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-lg table tbody,.filament-table-repeater-component.break-point-lg table tbody td,.filament-table-repeater-component.break-point-lg table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-lg table tbody tr{padding:.5rem}}@media (max-width:1280px){.filament-table-repeater-component.break-point-xl table{display:block;width:100%}.filament-table-repeater-component.break-point-xl table thead,.filament-table-repeater-component.break-point-xl table thead th,.filament-table-repeater-component.break-point-xl table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-xl table tbody,.filament-table-repeater-component.break-point-xl table tbody td,.filament-table-repeater-component.break-point-xl table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-xl table tbody tr{padding:.5rem}}@media (max-width:1536px){.filament-table-repeater-component.break-point-2xl table{display:block;width:100%}.filament-table-repeater-component.break-point-2xl table thead,.filament-table-repeater-component.break-point-2xl table thead th,.filament-table-repeater-component.break-point-2xl table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-2xl table tbody,.filament-table-repeater-component.break-point-2xl table tbody td,.filament-table-repeater-component.break-point-2xl table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-2xl table tbody tr{padding:.5rem}}[dir=ltr] .ltr\:rounded-tl-xl{border-top-left-radius:.75rem}[dir=ltr] .ltr\:rounded-tr-xl,[dir=rtl] .rtl\:rounded-tr-xl{border-top-right-radius:.75rem}[dir=rtl] .rtl\:rounded-tl-xl{border-top-left-radius:.75rem}.dark .dark\:bg-gray-900\/60{background-color:rgba(17,24,39,.6)}@media (min-width:640px){.sm\:border{border-width:1px}.sm\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:sm\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:768px){.md\:\!h-4{height:1rem!important}.md\:\!w-4{width:1rem!important}.md\:justify-center{justify-content:center}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(209 213 219/var(--tw-divide-opacity))}.md\:border{border-width:1px}.md\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}[dir=rtl] .md\:rtl\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.dark .dark\:md\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}.dark .dark\:md\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:1024px){.lg\:border{border-width:1px}.lg\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:lg\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:1280px){.xl\:border{border-width:1px}.xl\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:xl\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:1536px){.\32xl\:border{border-width:1px}.\32xl\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:2xl\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}} \ No newline at end of file +.w-px{width:1px}.bg-gray-200\/50{background-color:rgba(229,231,235,.5)}.filament-table-repeater-component .choices input{min-width:100%!important}.filament-table-repeater-column.has-hidden-label label:not(.filament-forms-checkbox-list-component-option-label,.filament-forms-radio-component label,.filepond--drop-label label){position:static;width:auto;height:auto;padding:0;overflow:visible;clip:auto;white-space:normal;margin:0 0 .5rem;font-size:.875rem;line-height:1.25rem}@media (min-width:768px){.filament-table-repeater-column.has-hidden-label label:not(.filament-forms-checkbox-list-component-option-label,.filament-forms-radio-component label,.filepond--drop-label label){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}}@media (max-width:640px){.filament-table-repeater-component.break-point-sm table{display:block;width:100%}.filament-table-repeater-component.break-point-sm table thead,.filament-table-repeater-component.break-point-sm table thead th,.filament-table-repeater-component.break-point-sm table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-sm table tbody,.filament-table-repeater-component.break-point-sm table tbody td,.filament-table-repeater-component.break-point-sm table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-sm table tbody tr{padding:.5rem}}@media (max-width:768px){.filament-table-repeater-component.break-point-md table{display:block;width:100%}.filament-table-repeater-component.break-point-md table thead,.filament-table-repeater-component.break-point-md table thead th,.filament-table-repeater-component.break-point-md table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-md table tbody,.filament-table-repeater-component.break-point-md table tbody td,.filament-table-repeater-component.break-point-md table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-md table tbody tr{padding:.5rem}}@media (max-width:1024px){.filament-table-repeater-component.break-point-lg table{display:block;width:100%}.filament-table-repeater-component.break-point-lg table thead,.filament-table-repeater-component.break-point-lg table thead th,.filament-table-repeater-component.break-point-lg table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-lg table tbody,.filament-table-repeater-component.break-point-lg table tbody td,.filament-table-repeater-component.break-point-lg table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-lg table tbody tr{padding:.5rem}}@media (max-width:1280px){.filament-table-repeater-component.break-point-xl table{display:block;width:100%}.filament-table-repeater-component.break-point-xl table thead,.filament-table-repeater-component.break-point-xl table thead th,.filament-table-repeater-component.break-point-xl table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-xl table tbody,.filament-table-repeater-component.break-point-xl table tbody td,.filament-table-repeater-component.break-point-xl table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-xl table tbody tr{padding:.5rem}}@media (max-width:1536px){.filament-table-repeater-component.break-point-2xl table{display:block;width:100%}.filament-table-repeater-component.break-point-2xl table thead,.filament-table-repeater-component.break-point-2xl table thead th,.filament-table-repeater-component.break-point-2xl table thead tr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;display:block;width:100%!important}.filament-table-repeater-component.break-point-2xl table tbody,.filament-table-repeater-component.break-point-2xl table tbody td,.filament-table-repeater-component.break-point-2xl table tbody tr{display:block;width:100%!important}.filament-table-repeater-component.break-point-2xl table tbody tr{padding:.5rem}}[dir=ltr] .ltr\:rounded-tl-xl{border-top-left-radius:.75rem}[dir=ltr] .ltr\:rounded-tr-xl,[dir=rtl] .rtl\:rounded-tr-xl{border-top-right-radius:.75rem}[dir=rtl] .rtl\:rounded-tl-xl{border-top-left-radius:.75rem}.dark .dark\:bg-gray-900\/60{background-color:rgba(17,24,39,.6)}@media (min-width:640px){.sm\:border{border-width:1px}.sm\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:sm\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:768px){.md\:justify-center{justify-content:center}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.md\:divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.md\:divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(209 213 219/var(--tw-divide-opacity))}.md\:border{border-width:1px}.md\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}[dir=rtl] .md\:rtl\:divide-x-reverse>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:1}.dark .dark\:md\:divide-gray-700>:not([hidden])~:not([hidden]),.dark .md\:dark\:divide-gray-700>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(55 65 81/var(--tw-divide-opacity))}.dark .dark\:md\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:1024px){.lg\:border{border-width:1px}.lg\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:lg\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:1280px){.xl\:border{border-width:1px}.xl\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:xl\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}}@media (min-width:1536px){.\32xl\:border{border-width:1px}.\32xl\:border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity))}.dark .dark\:2xl\:border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity))}} \ No newline at end of file diff --git a/resources/views/components/repeater-table.blade.php b/resources/views/components/repeater-table.blade.php index 9b8fbba..014d745 100644 --- a/resources/views/components/repeater-table.blade.php +++ b/resources/views/components/repeater-table.blade.php @@ -1,28 +1,25 @@ @php $containers = $getChildComponentContainers(); + $addAction = $getAction($getAddActionName()); + $cloneAction = $getAction($getCloneActionName()); + $deleteAction = $getAction($getDeleteActionName()); + $reorderAction = $getAction($getReorderActionName()); + $isCloneable = $isCloneable(); - $isItemCreationDisabled = $isItemCreationDisabled(); - $isItemDeletionDisabled = $isItemDeletionDisabled(); - $isItemMovementDisabled = $isItemMovementDisabled(); $headers = $getHeaders(); $columnWidths = $getColumnWidths(); $breakPoint = $getBreakPoint(); $hasContainers = count($containers) > 0; $hasHiddenHeader = $shouldHideHeader(); - $hasActions = (! $isItemMovementDisabled) || (! $isItemDeletionDisabled) || $isCloneable; + $hasActions = $reorderAction || $deleteAction || $cloneAction; + + $statePath = $getStatePath(); @endphp
merge($getExtraAttributes())->class([ @@ -45,7 +42,7 @@ 'xl:border xl:border-gray-300 dark:xl:border-gray-700' => ! $hasContainers && $breakPoint === 'xl', '2xl:border 2xl:border-gray-300 dark:2xl:border-gray-700' => ! $hasContainers && $breakPoint === '2xl', ])> - +
$hasHiddenHeader, 'filament-table-repeater-header rounded-t-xl overflow-hidden' => ! $hasHiddenHeader, @@ -69,15 +66,15 @@ @if ($hasActions) @if (count($containers)) @foreach ($containers as $uuid => $row) config('forms.dark_mode') - ]) + wire:key="{{ $this->id }}.{{ $row->getStatePath() }}.{{ $field::class }}.item" + x-sortable-item="{{ $uuid }}" + class="filament-table-repeater-row md:divide-x md:rtl:divide-x-reverse md:divide-gray-300 dark:md:divide-gray-700" > @foreach($row->getComponents() as $cell) @if(! $cell instanceof \Filament\Forms\Components\Hidden && ! $cell->isHidden()) @@ -125,62 +119,23 @@ class="filament-table-repeater-rows-wrapper divide-y divide-gray-300 dark:divide @if ($hasActions) @endif @@ -189,10 +144,7 @@ class="filament-table-repeater-rows-wrapper divide-y divide-gray-300 dark:divide @endforeach @else config('forms.dark_mode') - ]) + class="filament-table-repeater-row md:divide-x md:divide-y md:rtl:divide-x-reverse md:divide-gray-300 dark:md:divide-gray-700" >
- @unless ($isItemMovementDisabled) + @unless ($reorderAction)
@endunless - @if ($isCloneable) + @if ($cloneAction)
@endunless - @unless ($isItemDeletionDisabled) + @unless ($deleteAction)
@endunless @@ -90,19 +87,16 @@
- @unless ($isItemMovementDisabled) - - @endunless - - @if ($isCloneable) - - @endunless + @if ($reorderAction) +
+ {{ $reorderAction }} +
+ @endif - @unless ($isItemDeletionDisabled) - - @endunless + @if ($deleteAction) +
  • + {{ $deleteAction(['item' => $uuid]) }} +
  • + @endif
    {{ $getEmptyLabel() ?? __('filament-table-repeater::components.repeater.empty.label') }} @@ -203,16 +155,9 @@ class="filament-table-repeater-rows-wrapper divide-y divide-gray-300 dark:divide
    - @if (! $isItemCreationDisabled) + @if ($addAction)
    - - {{ $getCreateItemButtonLabel() }} - + {{ $addAction }}
    @endif diff --git a/src/FilamentTableRepeaterServiceProvider.php b/src/FilamentTableRepeaterServiceProvider.php index 5969bc1..5dbc5d2 100644 --- a/src/FilamentTableRepeaterServiceProvider.php +++ b/src/FilamentTableRepeaterServiceProvider.php @@ -2,17 +2,16 @@ namespace Awcodes\FilamentTableRepeater; -use Filament\PluginServiceProvider; +use Filament\Support\Assets\AssetManager; +use Filament\Support\Assets\Css; +use Filament\Support\Facades\FilamentAsset; use Spatie\LaravelPackageTools\Package; +use Spatie\LaravelPackageTools\PackageServiceProvider; -class FilamentTableRepeaterServiceProvider extends PluginServiceProvider +class FilamentTableRepeaterServiceProvider extends PackageServiceProvider { public static string $name = 'filament-table-repeater'; - protected array $styles = [ - 'filament-table-repeater' => __DIR__ . '/../resources/dist/filament-table-repeater.css', - ]; - public function configurePackage(Package $package): void { $package->name(static::$name) @@ -20,4 +19,13 @@ public function configurePackage(Package $package): void ->hasTranslations() ->hasViews(); } + + public function packageRegistered() + { + $this->app->resolving(AssetManager::class, function () { + FilamentAsset::register([ + Css::make('table-repeater', __DIR__ . '/../resources/dist/filament-table-repeater.css'), + ], 'awcodes/filament-table-repeater'); + }); + } }