Skip to content

Commit

Permalink
Followup for PR #407 (337 bug with multiple panels) (#408)
Browse files Browse the repository at this point in the history
* #337 Add TODO for deprecated interface

Illuminate\Contracts\Validation\Rule was deprecated in laravel/framework v10, should be replaced with ValidationRule once the minimum required version is 10.

Signed-off-by: Tobias Grasse <[email protected]>

* #337 Pass requestAttribute down to media handling functions

Both `addNewMedia` and `addExistingMedia` also call `HandlesExistingMediaTrait::fillMediaCustomPropertiesFromRequest` which requires `$requestAttribute` for nested forms since 079b866

Signed-off-by: Tobias Grasse <[email protected]>

* #337 Formatting, reorder imports, add @throws tag

Signed-off-by: Tobias Grasse <[email protected]>

---------

Signed-off-by: Tobias Grasse <[email protected]>
  • Loading branch information
tobias-grasse authored Aug 24, 2023
1 parent 6e9344b commit 6efa2cf
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 16 deletions.
12 changes: 6 additions & 6 deletions src/Fields/HandlesExistingMediaTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

namespace Ebess\AdvancedNovaMediaLibrary\Fields;

use Spatie\MediaLibrary\HasMedia;
use Illuminate\Support\Collection;
use Laravel\Nova\Http\Requests\NovaRequest;
use Spatie\MediaLibrary\Support\TemporaryDirectory;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\MediaCollections\Filesystem;
use Spatie\MediaLibrary\Support\TemporaryDirectory;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
Expand All @@ -19,16 +19,16 @@ public function enableExistingMedia(): self
return $this->withMeta(['existingMedia' => (bool) config('nova-media-library.enable-existing-media')]);
}

private function addExistingMedia(NovaRequest $request, $data, HasMedia $model, string $collection, Collection $medias): Collection
private function addExistingMedia(NovaRequest $request, $data, HasMedia $model, string $collection, Collection $medias, string $requestAttribute): Collection
{
$addedMediaIds = $medias->pluck('id')->toArray();

return collect($data)
->filter(function ($value) use ($addedMediaIds) {
// New files will come in as UploadedFile objects,
// New files will come in as UploadedFile objects,
// whereas Vapor-uploaded files will come in as arrays.
return (! ($value instanceof UploadedFile)) && (! (is_array($value))) && ! (in_array($value, $addedMediaIds));
})->map(function ($model_id, int $index) use ($request, $model, $collection) {
})->map(function ($model_id, int $index) use ($request, $model, $collection, $requestAttribute) {
$mediaClass = config('media-library.media_model');
$existingMedia = $mediaClass::find($model_id);

Expand All @@ -50,7 +50,7 @@ private function addExistingMedia(NovaRequest $request, $data, HasMedia $model,
$media = $media->toMediaCollection($collection);

// fill custom properties for recently created media
$this->fillMediaCustomPropertiesFromRequest($request, $media, $index, $collection);
$this->fillMediaCustomPropertiesFromRequest($request, $media, $index, $collection, $requestAttribute);

// Delete our temp collection
$temporaryDirectory->delete();
Expand Down
22 changes: 12 additions & 10 deletions src/Fields/Media.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Ebess\AdvancedNovaMediaLibrary\Fields;

// @TODO Rule contract is deprecated since laravel/framework v10.0, replace with ValidationRule once min version is 10.
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
Expand Down Expand Up @@ -191,18 +192,18 @@ protected function fillAttributeFromRequest(NovaRequest $request, $requestAttrib
->validate();

return function () use ($request, $data, $attribute, $model, $requestAttribute) {
$this->handleMedia($request, $model, $attribute, $data);
$this->handleMedia($request, $model, $attribute, $data, $requestAttribute);

// fill custom properties for existing media
$this->fillCustomPropertiesFromRequest($request, $requestAttribute, $model, $attribute);
};
}

protected function handleMedia(NovaRequest $request, $model, $attribute, $data)
protected function handleMedia(NovaRequest $request, $model, $attribute, $data, $requestAttribute)
{
$remainingIds = $this->removeDeletedMedia($data, $model->getMedia($attribute));
$newIds = $this->addNewMedia($request, $data, $model, $attribute);
$existingIds = $this->addExistingMedia($request, $data, $model, $attribute, $model->getMedia($attribute));
$newIds = $this->addNewMedia($request, $data, $model, $attribute, $requestAttribute);
$existingIds = $this->addExistingMedia($request, $data, $model, $attribute, $model->getMedia($attribute), $requestAttribute);
$this->setOrder($remainingIds->union($newIds)->union($existingIds)->sortKeys()->all());
}

Expand All @@ -212,15 +213,15 @@ private function setOrder($ids)
$mediaClass::setNewOrder($ids);
}

private function addNewMedia(NovaRequest $request, $data, HasMedia $model, string $collection): Collection
private function addNewMedia(NovaRequest $request, $data, HasMedia $model, string $collection, string $requestAttribute): Collection
{

return collect($data)
->filter(function ($value) {
// New files will come in as UploadedFile objects,
// whereas Vapor-uploaded files will come in as arrays.
return $value instanceof UploadedFile || is_array($value);
})->map(function ($file, int $index) use ($request, $model, $collection) {
})->map(function ($file, int $index) use ($request, $model, $collection, $requestAttribute) {
if ($file instanceof UploadedFile) {
$media = $model->addMedia($file)->withCustomProperties($this->customProperties);

Expand Down Expand Up @@ -257,7 +258,7 @@ private function addNewMedia(NovaRequest $request, $data, HasMedia $model, strin
$media = $media->toMediaCollection($collection);

// fill custom properties for recently created media
$this->fillMediaCustomPropertiesFromRequest($request, $media, $index, $collection);
$this->fillMediaCustomPropertiesFromRequest($request, $media, $index, $collection, $requestAttribute);

return $media->getKey();
});
Expand Down Expand Up @@ -325,9 +326,9 @@ protected function checkCollectionIsMultiple(HasMedia $resource, string $collect
{
$resource->registerMediaCollections();
$isSingle = collect($resource->mediaCollections)
->where('name', $collectionName)
->first()
->singleFile ?? false;
->where('name', $collectionName)
->first()
->singleFile ?? false;

$this->withMeta(['multiple' => ! $isSingle]);
}
Expand Down Expand Up @@ -381,6 +382,7 @@ public function conversionOnView(string $conversionOnDetailView): self
* The file is uploaded using a pre-signed S3 URL, via Vapor.store.
* This method will use addMediaFromUrl(), passing it the
* temporary location of the file.
* @throws \Spatie\MediaLibrary\MediaCollections\Exceptions\FileCannotBeAdded
*/
private function makeMediaFromVaporUpload(array $file, HasMedia $model): FileAdder
{
Expand Down

0 comments on commit 6efa2cf

Please sign in to comment.